<?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; Prestanda</title>
	<atom:link href="http://blogg.athega.se/tagg/prestanda/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>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>Lär dig leva utan ancestorView</title>
		<link>http://blogg.athega.se/2009/07/02/lar-dig-leva-utan-ancestorview/</link>
		<comments>http://blogg.athega.se/2009/07/02/lar-dig-leva-utan-ancestorview/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 12:04:38 +0000</pubDate>
		<dc:creator>Christian Lizell</dc:creator>
				<category><![CDATA[CMS]]></category>
		<category><![CDATA[Escenic]]></category>
		<category><![CDATA[Kod]]></category>
		<category><![CDATA[Prestanda]]></category>
		<category><![CDATA[Webbutveckling]]></category>
		<category><![CDATA[ancestorView]]></category>

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

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

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

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

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

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

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

		<guid isPermaLink="false">http://blogg.athega.se/?p=195</guid>
		<description><![CDATA[Keynote: Chris Wanstrath Presentationen: https://gist.github.com/0a2655aed6a26fa15a02 Rails Metal, Rack, and Sinatra Adam Wiggins (Heroku) berättade om hur Rails Metal går att kombinera med Sinatra. What Makes Ruby Go: An Implementation Primer Charles Nutter (Sun Microsystems) och Evan Phoenix (Engine Yard) gick igenom olika delar av Ruby som man behöver tänka på för att inte stöta på [...]]]></description>
			<content:encoded><![CDATA[<h2 id="keynote_chris_wanstrath">Keynote: Chris Wanstrath</h2>
<p>Presentationen: <a href="https://gist.github.com/0a2655aed6a26fa15a02">https://gist.github.com/0a2655aed6a26fa15a02</a></p>
<h2 id="rails_metal_rack_and_sinatra">Rails Metal, Rack, and Sinatra</h2>
<p>Adam Wiggins (<a href="http://heroku.com">Heroku</a>) berättade om hur Rails Metal går att kombinera med Sinatra.</p>
<h2 id="what_makes_ruby_go_an_implementation_primer">What Makes Ruby Go: An Implementation Primer</h2>
<p>Charles Nutter (<a href="http://sun.com">Sun Microsystems</a>) och Evan Phoenix (<a href="http://engineyard.com/">Engine Yard</a>) gick igenom olika delar av Ruby som man behöver tänka på för att inte stöta på prestandaproblem.</p>
<h3 id="metodanrop">Metodanrop</h3>
<p>Att cache:a metodanrop ger generellt sett den största prestandavinsten.</p>
<p>Object#extend är dock ett stort problem för att kunna cache:a metodanropen.</p>
<p>Det är viktigt att förstå hur extend fungerar så att man inte tömmer<br />
metodanropscachen i onödan.</p>
<h3 id="konstanter">Konstanter</h3>
<p>För att hålla prestandan upp ska man hålla konstanter konstanta, inte helt oväntat.</p>
<h3 id="options_argument">Options Argument</h3>
<p>En option hash strider mot DRY.<br />
Det är mycket snabbare att använda diskreta argument.</p>
<h3 id="objrun_rescue_nil">obj.run rescue nil</h3>
<p>Det är otroligt ovanligt att man vill fånga alla StandardError, vilket är 101 underklasser; IOError, SecurityError, TypeError, Etc.</p>
<h3 id="objrun_rescue_exception">obj.run rescue Exception</h3>
<p>I stort sett samma sak som rescue nil, fast värre, nu kan man inte ens  ctrl-C&#8217;a ut ur koden.</p>
<h3 id="autoload">Autoload</h3>
<p>Helt tråd-osäkert, fördröjer laddning av koden.<br />
Använder inte Kernel#require, alltså går det inte att köra autoload från gems.</p>
<h3 id="super">Super</h3>
<p>Man måste ta bort blocket om man inte vill att det ska skickas uppåt:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">super</span><span style="color:#006600; font-weight:bold;">&#40;</span>a, <span style="color:#006600; font-weight:bold;">&amp;</span>nil<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Super ser bara senaste versionen av argumenten:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> foo<span style="color:#006600; font-weight:bold;">&#40;</span>a, b<span style="color:#006600; font-weight:bold;">&#41;</span>
  a = <span style="color:#006666;">1</span>
  b = <span style="color:#996600;">'bar'</span>
  <span style="color:#9966CC; font-weight:bold;">super</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<h3 id="slutsats">Slutsats</h3>
<ul>
<li>Enkel kod > Komplex kod</li>
<li>Det finns inga gratis luncher</li>
<li>Tänk igenom två gånger, skriv koden en gång</li>
<li>YAGNI</li>
</ul>
<h2 id="call_into_your_ruby_code_writing_voice_enabled_apps_in_ruby_with_adhearsion">Call into your Ruby code! Writing voice-enabled apps in Ruby with Adhearsion</h2>
<p>Jay Phillips (<a href="http://jicksta.com/">Codemecca LLC</a>) visade hur man kan programmera Ruby för att styra <a href="http://www.asterisk.org/">Asterisk</a> genom att använda sig av <a href="http://adhearsion.com/">Adhearsion</a>.</p>
<p>Tyvärr fungerade det inte att använda Ahearsions Sandbox på konferensens wlan,<br />
så jag får ta och testa det lite senare.</p>
<p>Verkar intressant att kunna styra sin applikation genom att ringa till den <img src='http://blogg.athega.se/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/05/07/railsconf-onsdag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Låt inte Tomcat jobba i onödan</title>
		<link>http://blogg.athega.se/2009/04/24/lat-inte-tomcat-jobba-i-onodan/</link>
		<comments>http://blogg.athega.se/2009/04/24/lat-inte-tomcat-jobba-i-onodan/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 12:31:07 +0000</pubDate>
		<dc:creator>Christian Lizell</dc:creator>
				<category><![CDATA[Kod]]></category>
		<category><![CDATA[Prestanda]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Servlets]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=150</guid>
		<description><![CDATA[Ett vanligt upplägg för en lastad sajt med någorlunda statiskt innehåll ser ut enligt nedan: I korthet innebär det att den största delen av trafiken hanteras av enkla webbcachear som leverar sidor till slutanvändarna. Med ett visst intervall efterfrågar cachearna frontarna efter nytt innehåll. Frontarna kan exempelvis köra en eller flera Tomcat-instanser som genererar innehållet. [...]]]></description>
			<content:encoded><![CDATA[<p>Ett vanligt upplägg för en lastad sajt med någorlunda statiskt innehåll ser ut enligt nedan:</p>
<div id="attachment_151" class="wp-caption aligncenter" style="width: 650px"><img class="size-full wp-image-151" title="Internet-Cache-Front" src="http://blogg.athega.se/wp-content/uploads/2009/04/img_8759.jpg" alt="Upplägg, lastad sajt" width="640" height="440" /><p class="wp-caption-text">Upplägg, lastad sajt</p></div>
<p>I korthet innebär det att den största delen av trafiken hanteras av enkla webbcachear som leverar sidor till slutanvändarna. Med ett visst intervall efterfrågar cachearna frontarna efter nytt innehåll. Frontarna kan exempelvis köra en eller flera Tomcat-instanser som genererar innehållet. På detta sätt kan även riktigt stora siter klara sig på ett tiotal maskiner.</p>
<p>För alla JSP-sidor som Tomcat-frontarna genererar åt cachearna skapas nu en session, precis som <a title="JSR 154" href="http://jcp.org/en/jsr/detail?id=154">Servlet-standarden</a> föreskriver. Det är helt i sin ordning, fast helt onödigt i det här fallet. Det genererade innehållet levereras inte direkt till slutanvändaren, utan till cachen. Kan man få servlet-motorn att inte skapa sessioner i onödan och på så sätt spara sina dyra resurser?</p>
<p>Ja, ett sätt är att överst i sin JSP-sida helt enkelt utbrista:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;">&lt;%@page <span style="color: #000066;">session</span>=<span style="color: #ff0000;">&quot;false&quot;</span>%<span style="color: #000000; font-weight: bold;">&gt;</span></span></pre></div></div>

<p>Dock är det kanske inte att föredra i ett litet större projekt med hundratals JSP-sidor. Det man letar efter är ett sätt att slå av det centralt för alla JSP-sidor. Min första instikt var att konfiguerar Jasper, som kompilerar JSP-sidorna att inte skapa sessioner om man inte explicit bad om det. Någon sådan parameter hittade jag tyvärr inte. Personer som har liknande frågor på nätet får istället frågan; &#8221;Varför vill du slå av sessioner? De är ju en del av standarden!&#8221;</p>
<p>Mitt nästa spår var att automatiskt försöka inkludera ovanstående direktiv för varje genererad sida. Från och med JSP 2.0 (som inte direkt kom ut igår) går det att få till ganska enkelt med något som kallas för implicit includes.</p>
<p>Börja med att lägga till ett jsp-config-direktiv i din web.xml:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- Disable the use of sessions --&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;jsp-config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;jsp-property-group<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>*.jsp<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;include-prelude<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/WEB-INF/jspf/disableSession.jspf<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/include-prelude<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/jsp-property-group<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/jsp-config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Detta matchar alla JSP-filer (med filändelsen .jsp) och inkluderar innehållet av filen disableSession.jspf precis som om du skulle ha skrivit</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;">&lt;%@include <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;/WEB-INF/jspf/disableSession.jspf&quot;</span>%<span style="color: #000000; font-weight: bold;">&gt;</span></span></pre></div></div>

<p>högst upp i varenda JSP-fil.</p>
<p>Notera att filen som inkluderas är av typen .jspf, ett JSP-fragment. Detta är nödvändigt och säkerställer bland annat att du inte råkar in i några oändliga inkluderingsloopar. Att filen ligger i mappen /WEB-INF/jspf är rekommenderat och förhindrar även direkt access för en slutanvändare.</p>
<p>Testa! Tomcat kommer att kasta fel i loggarna så fort du försöker skapa en session, men om du har det som jag är det precis så du vill ha det!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/04/24/lat-inte-tomcat-jobba-i-onodan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

