<?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; Christian Lizell</title>
	<atom:link href="http://blogg.athega.se/author/chrille/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>jQuery är snyggt</title>
		<link>http://blogg.athega.se/2010/04/09/jquery-ar-snyggt/</link>
		<comments>http://blogg.athega.se/2010/04/09/jquery-ar-snyggt/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 14:36:09 +0000</pubDate>
		<dc:creator>Christian Lizell</dc:creator>
				<category><![CDATA[Guider]]></category>
		<category><![CDATA[Programmeringsspråk]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=606</guid>
		<description><![CDATA[En labb som visar hur jQuery underlättar tillvaron för att visa ett lajvflöde av bilder och twitterinlägg.]]></description>
			<content:encoded><![CDATA[<p>Större delen av gårdagen ägnades åt en workshop (tack <a href="http://twitter.com/stpe">@stpe</a>) kring frontendutveckling. Fokus var på <a href="http://developer.yahoo.com/yui/">YUI</a>, men eftersom jag jobbat en del med det redan, men däremot inte hunnit dyka ner i <a href="http://jquery.org/">jQuery</a> på riktigt, valde jag det senare.</p>
<p>Min idé var att göra ett lajvflöde av <a href="http://www.flickr.com/">Flickr</a>-bilder och <a href="http://www.twitter.com/">Twitter</a>-postningar baserat på ett givet sökord eller tag.</p>
<p><a href="http://blogg.athega.se/wp-content/uploads/2010/04/athaga.png"><img class="aligncenter size-full wp-image-624" title="athaga" src="http://blogg.athega.se/wp-content/uploads/2010/04/athaga.png" alt="" width="532" height="279" /></a></p>
<h2>JSONP</h2>
<p>Både Flickr och Twitter har rika APIer i <a href="http://www.json.org/">JSON</a>-format som gör det lätt att åstadkomma det jag vill. Då dessa av naturliga skäl inte ligger på samma domän som min labb, kan jag inte göra ett vanligt <a href="http://en.wikipedia.org/wiki/XMLHttpRequest">XHR</a>-anrop eftersom webbläsaren av säkerhetsskäl kastar ett same domain-policy-fel. Räddningen stavas <a href="http://en.wikipedia.org/wiki/JSON#JSONP">JSONP</a>, som helt enkelt wrappar hela JSON-svaret i ett metodanrop. Detta går vi inte in närmare på denna gång, utan konstaterar istället glatt att jQuery har stöd för detta och löser detta under ytan.</p>
<h2>jQuerys effektköer</h2>
<p>Planen är alltså att långsamt smyga in en bild, visa den ett tag, sedan dimma ner den och till sist ta bort den helt.</p>
<p>Sedan jQuery 1.4 finns det en toppenmetod för att hantera pauser i den allmänna effektkön, fx. Metoden heter <a href="http://api.jquery.com/delay/">delay()</a> och låter mig åstadkomma önskat beteende på ett oerhört kompakt och tydligt vis.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span>img<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">fadeIn</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'slow'</span><span style="color: #009900;">&#41;</span>.
    <span style="color: #660066;">delay</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span>.
    <span style="color: #660066;">fadeTo</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'slow'</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0.3</span><span style="color: #009900;">&#41;</span>.
    <span style="color: #660066;">delay</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2000</span><span style="color: #009900;">&#41;</span>.
    <span style="color: #660066;">fadeOut</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'fast'</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: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">remove</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>Det är ju nästan som att prata svenska (engelska)! Vi repeterar:</p>
<ul>
<li>Smyg långsamt in bilden</li>
<li>Vänta en sekund</li>
<li>Dimma ner den litet</li>
<li>Vänta två sekunder</li>
<li>Smyg snabbt bort bilden och ta bort den</li>
</ul>
<h2>Koden</h2>
<p>Vill du se hur det ser ut, kan du titta <a href="http://www.athega.se/files/lab/athaga/">här</a> eller <a href="http://www.athega.se/files/lab/athaga/athaga.zip">ladda ner</a> hela koden och labba vidare själv.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2010/04/09/jquery-ar-snyggt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Den produktive programmeraren</title>
		<link>http://blogg.athega.se/2009/11/10/den-produktive-programmeraren/</link>
		<comments>http://blogg.athega.se/2009/11/10/den-produktive-programmeraren/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 22:14:26 +0000</pubDate>
		<dc:creator>Christian Lizell</dc:creator>
				<category><![CDATA[Guider]]></category>
		<category><![CDATA[Konferens]]></category>
		<category><![CDATA[Produktivitet]]></category>
		<category><![CDATA[clcl]]></category>
		<category><![CDATA[Doodim]]></category>
		<category><![CDATA[Google Desktop]]></category>
		<category><![CDATA[Jedi Concentrate]]></category>
		<category><![CDATA[Jumpcut]]></category>
		<category><![CDATA[Locus of Attention]]></category>
		<category><![CDATA[Neal Ford]]></category>
		<category><![CDATA[QuickSilver]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[Textexpander]]></category>
		<category><![CDATA[The Productive Programmer]]></category>
		<category><![CDATA[Øredev]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=504</guid>
		<description><![CDATA[Ett sammandrag av Neal Ford's dragning "The Productive Programmer" på Øredev 2009. Detta är en rad tips, som alla syftar till att hjälpa dig bli en mer produktiv programmerare, oavsett om du använder emacs, notepad eller Eclipse.]]></description>
			<content:encoded><![CDATA[<p><a href="http://oreilly.com/catalog/9780596519544/"><img class="alignright" title="The Productive Programmer" src="http://covers.oreilly.com/images/9780596519544/lrg.jpg" alt="" width="108" height="142" /></a>En av de bättre dragningarna på årets <a href="http://www.oredev.org/">Øredev</a> var <a href="http://www.nealford.com/">Neal Ford</a>&#8216;s ”The Productive Programmer: Mechanics”. Neal har skrivit en <a href="http://oreilly.com/catalog/9780596519780/">bok</a> med samma namn, som jag hört litet blandad kritik om. Därför hade jag inga större förväntningar när jag klev in i rummet. Efter orden <em>”Graphical tools are med for novices”</em> visste jag att detta var något för mig!</p>
<p>Nedan följer en rad tips, som alla syftar till att hjälpa dig bli en mer produktiv programmerare, oavsett om du använder <a href="http://www.gnu.org/software/emacs/">emacs</a>, <a href="http://en.wikipedia.org/wiki/Notepad_%28Windows%29">notepad</a> eller <a href="http://www.eclipse.org/">Eclipse</a>.</p>
<h2>Urklippshanteraren (eller clipboard)</h2>
<p>Varför, varför finns det bara plats för ett urklipp i taget i dagens moderna operativsystem (*nix-dialekter undantagna)?</p>
<p>Det är ju helt tokigt att inte kunna gå tillbaka och ta fram något man kopierade eller klippte ut för bara några minuter sedan, bara för att man råkat svara på ett mail, mitt i ett enhetstest eller liknande. Lösningen finns i form av några hjälpprogram:</p>
<ul>
<li><a href="http://jumpcut.sourceforge.net/">Jumpcut</a> (Mac)</li>
<li><a href="http://www.nakka.com/soft/clcl/index_eng.html">clcl</a> (Windows)</li>
</ul>
<h2>Lär dig kortkommandon</h2>
<p>Tiden det tar att lära sig även det mest obskyra kortkommando är väl investerad tid. Varje gång dina fingrar måste lämna tangentbord slösar du med tid. Hitta en bra partner att parprogrammera med och be honom/henne raljera över hur långsam du är varje gång du använder musen.</p>
<h2>Scripta dina vanligast kommandon/texter</h2>
<p>Om du märker att du ofta skriver samma sak, skriver samma fel eller skriver samma sekvens av kommandon i en terminal, finns det hjälp. <a href="http://www.smileonmymac.com/TextExpander/">Textexpander</a> är ett litet makroverktyg som verkligen sparar tid. Du kan använda det till allt från epostsignaturer till kod-&#8221;snippets&#8221;.</p>
<p>Tyvärr kostar det pengar och finns det bara för Mac, men jag är övertygad om att det finns ett Windowsalternativ.</p>
<h2>”Locus of Attention”</h2>
<p>Att kunna fokusera och komma in i flytet (”the Flow” eller ”<a href="http://blogg.athega.se/2009/08/12/in-i-zonen-som-systemutvecklare/">the Zone</a>”) är lika viktigt som verktygen du använder. Om du programmerar vill du att <em>platsen för din uppmärksamhet</em> (fritt översatt) ska vara din IDE. Inte din klienter för IM, Twitter eller email, etc. Med den mängd information vi utsätts för varje minut är detta svårare och svårare.</p>
<ul>
<li>Stäng av dina klienter för epost, twitter och IM och uppdatera dig då och då när du tar en paus från programmerandet</li>
<li>Använd hörlurar för att visa att du inte vill bli störd</li>
<li>Inför tysta timmar på kontoret, exempelvis mellan 14 och 16 varje dag då du verkligen kan fokusera</li>
</ul>
<p>Neal menar exempelvis att Windows är som en treåring som konstant stör dig med påpekanden som ”<em>Du har oanvända ikoner på ditt skrivbord</em>&#8221;, ”<em>Ditt virtuella minne håller på att ta slut</em>” eller ”<em>Det finns säkerhetsuppdateringar till din dator</em>”. För att ytterligare hjälpa dig att minska störande moment finns det verktyg, skärm-dimmers, som sakta släcker ner allt förutom ditt akiva fönster:</p>
<ul>
<li><a href="http://www.lachoseinteractive.net/en/products/doodim/">Doodim</a> (Mac)</li>
<li><a href="http://www.anappaday.com/downloads/2006/09/day-10-jedi-concentrate.html">Jedi Concentrate</a> (Windows)</li>
</ul>
<h2>Sök</h2>
<p>En sökning slår alltid navigation med mus eller till och med tangentbord. Se till att du har en bra lokal sökmotor för din dator, som <a href="http://desktop.google.com/mac/">Google Desktop</a> (Mac/Windows) eller <a href="http://docs.blacktree.com/quicksilver/what_is_quicksilver">QuickSilver</a> (Mac). Neal menar att navigera i en trädstruktur i utforskaren eller i din IDE är som att berätta för datorn att du vet hur du använder musen. Om du vet vad filen heter &#8211; sök!</p>
<h2>Automatisera</h2>
<p>Ett spiffigt användningsområde för <a href="http://seleniumhq.org/">Selenium</a> är faktiskt att automatisera ditt iterativa testande. Du kanske felsöker en funktion som kräver att du klickar dig igenom en sekvens, fyller i litet testdata och till slut når fram till funktionen du felsöker. Denna process kan bli ganska trist att upprepa om och om igen. Med <a href="http://seleniumhq.org/projects/ide/">Seleniums IDE</a>, som du installerar som ett plugin till Firefox, kan du enkelt spela in sekvensen en gång och sedan spela upp den varje gång du vill testa. Eller som Neal uttrycker det; ”<em>You should never manually interact with the thing you are building unless you want to</em>”.</p>
<p>Han avslutar med tänkvärda ”<em>Solving problems by hand, makes you dumber</em>”. Word!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/11/10/den-produktive-programmeraren/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Så får du Google Sync att fungera med din iPhone</title>
		<link>http://blogg.athega.se/2009/10/01/sa-far-du-google-sync-att-fungera-med-din-iphone/</link>
		<comments>http://blogg.athega.se/2009/10/01/sa-far-du-google-sync-att-fungera-med-din-iphone/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 21:18:48 +0000</pubDate>
		<dc:creator>Christian Lizell</dc:creator>
				<category><![CDATA[Guider]]></category>
		<category><![CDATA[Teknik och prylar]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Apps]]></category>
		<category><![CDATA[Google Sync]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=460</guid>
		<description><![CDATA[En guide som visar hur du synkroniserar din iPhone med Google Apps epost, kalendrar och kontakter med hjälp av Google Sync.]]></description>
			<content:encoded><![CDATA[<p>För några månader sedan flyttade vi över epost, kalendrar, kontakter och en hel del annat till Google Apps. Det kan jag verkligen rekommendera, men det är inte det vi ska prata om idag. För några dagar sedan fick Athega äntligen leveransen av alla iPhone 3GS-telefoner. Detta aktualiserade hur vi skulle få just epost, kalendrar och kontakter att synkroniseras mellan mobil, dator och Google.</p>
<p>Visst, man kan hävda att Googles iPhone-anpassade Safari-applikationer är bra nog och ibland bättre, men den här guiden visar hur du får epost, kalendrar och kontakter till de nativa motsvarigheterna i din iPhone.</p>
<p><strong>Viktigt att tänka på innan du börjar är att Google endast tillåter ett konto av detta slag (jag har exempelvis lagt till min privata gmail via vanlig IMAP).</strong></p>
<h3>Aktivera Google Sync för Google Apps</h3>
<p>För att synkroniseringen ska fungera fullt ut behöver du eller din Google Apps-administratör aktivera Google Sync. Detta görs genom att kryssa för &#8221;Aktivera Google Sync&#8221; under &#8221;Inställningar för mobilen&#8221; när du befinner dig på Tjänstinställningar för Google Apps som administratör.<br />
<img class="aligncenter size-full wp-image-465" title="Inställningar för mobilen" src="http://blogg.athega.se/wp-content/uploads/2009/10/Inställningar-för-mobilen.jpg" alt="Inställningar för mobilen" width="161" height="190" /></p>
<h3>Välj kalendrar</h3>
<p>Om du inte aktivt väljer vilka kalendrar du vill synkronisera, kommer du bara få din standardkalender. Detta kanske räcker för en del, men jag har flera olika kalendrar som jag vill få synkroniserade. Att få detta att fungera var inte helt problemfritt. Google kommer säkert förbättra detta, men när detta skrivs behöver du göra enligt nedan.</p>
<div id="attachment_466" class="wp-caption alignleft" style="width: 210px"><img class="size-medium wp-image-466" title="Svenska stöds inte" src="http://blogg.athega.se/wp-content/uploads/2009/10/IMG_0384-200x300.PNG" alt="Svenska stöds inte" width="200" height="300" /><p class="wp-caption-text">Svenska stöds inte</p></div>
<div id="attachment_467" class="wp-caption alignleft" style="width: 210px"><img class="size-medium wp-image-467" title="Nu visas Sync-ikonen" src="http://blogg.athega.se/wp-content/uploads/2009/10/IMG_0385-200x300.PNG" alt="Nu visas Sync-ikonen" width="200" height="300" /><p class="wp-caption-text">Nu visas Sync-ikonen</p></div>
<div id="attachment_468" class="wp-caption alignleft" style="width: 210px"><img class="size-medium wp-image-468  " title="Din iPhone" src="http://blogg.athega.se/wp-content/uploads/2009/10/IMG_0386-200x300.PNG" alt="Din iPhone" width="200" height="300" /><p class="wp-caption-text">Din iPhone</p></div>
<p style="clear:both;">Se till att du är inloggad med ditt Google Apps-konto och att m.google.com är <a title="Google Apps instructions" href="http://google.com/support/mobile/bin/answer.py?hl=en&amp;answer=139206">konfigurerad till din domän</a>. Tyvärr såg jag ingen Sync-ikon, efter detta. Det visade sig att jag var tvungen att ändra språk långst ner på sidan. Efter jag ändrat till &#8221;English (US)&#8221; och även land till &#8221;USA&#8221;, visades ikonen som den skulle.</p>
<p>Nästa steg är att välja din iPhone och sedan vilka kalendrar du vill synkronisera.</p>
<div id="attachment_470" class="wp-caption aligncenter" style="width: 210px"><img class="size-medium wp-image-470" title="Välj kalendrar" src="http://blogg.athega.se/wp-content/uploads/2009/10/IMG_0387-200x300.jpg" alt="Välj kalendrar" width="200" height="300" /><p class="wp-caption-text">Välj kalendrar</p></div>
<h3>Sätt upp ett Exchange-konto</h3>
<p>Detta gör du genom att välja Inställningar -&gt; E-post, kontakter, kalendrar -&gt; Lägg till konto&#8230; De inställningar du behöver hittar du <a title="Set Up Your iPhone" href="http://google.com/support/mobile/bin/answer.py?hl=en&amp;answer=138740">här</a>.</p>
<p><img class="aligncenter size-medium wp-image-461" title="Sätt upp ett Exchange-konto" src="http://blogg.athega.se/wp-content/uploads/2009/10/exchange-200x300.jpg" alt="Sätt upp ett Exchange-konto" width="200" height="300" /></p>
<p>Om du har befintliga kalendrar får du välja om du vill ersätta dem. I mitt fall ville jag det eftersom de kalendrar som redan fanns i min iPhone var samma Google-kalendrar, synkroniserade via iTunes.</p>
<div id="attachment_471" class="wp-caption aligncenter" style="width: 210px"><img class="size-medium wp-image-471" title="Radera eller spara befintliga kalendrar?" src="http://blogg.athega.se/wp-content/uploads/2009/10/IMG_0388-200x300.PNG" alt="Radera eller spara befintliga kalendrar?" width="200" height="300" /><p class="wp-caption-text">Radera eller spara befintliga kalendrar?</p></div>
<p>Så var det klart, alltid samma data i din iPhone som på Google Apps och med Push!</p>
<h3>Fördjupning</h3>
<p>Mer information hittar du hos Google:</p>
<ul>
<li><a href="http://google.com/support/mobile/bin/answer.py?hl=en&#038;answer=139635">Om begränsningar</a></li>
<li><a href="http://google.com/support/mobile/bin/topic.py?hl=en&#038;topic=14252">Översikt</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/10/01/sa-far-du-google-sync-att-fungera-med-din-iphone/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sociala medier för företaget</title>
		<link>http://blogg.athega.se/2009/08/28/sociala-medier-for-foretaget/</link>
		<comments>http://blogg.athega.se/2009/08/28/sociala-medier-for-foretaget/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 10:12:34 +0000</pubDate>
		<dc:creator>Christian Lizell</dc:creator>
				<category><![CDATA[Sociala nätverk]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=417</guid>
		<description><![CDATA[En presentation om hur företag kan använda sociala medier för att komma närmre befintliga och framtida kunder, hantera medgångar och motgångar eller kanske attrahera rätt människor]]></description>
			<content:encoded><![CDATA[<p>Igår höll jag en dragning/workshop om hur företag kan använda sociala medier för att komma närmre befintliga och framtida kunder, hantera medgångar och motgångar eller kanske attrahera rätt människor.</p>
<h2>Dell Hell</h2>
<p>Det låter litet klyschigt, men vi lever i en fantastisk tid. Jag inspirerades av ett blogginlägg från en bloggare med ett namn man inte glömmer, <a href="http://www.penn-olson.com/author/admin/">Willis Wee</a>, som skriver mycket bra och tänkvärt om bl a sociala medier ur ett företagsperspektiv. I <a title="Dell out of hell" href="http://www.penn-olson.com/2009/08/07/dell-out-of-hell-now-a-social-media-winner/">blogginlägget</a> beskriver han hur <a href="http://www.dell.se">Dell</a> gått från förlorare till vinnare de senaste åren. Dells första reaktion var att stänga användarforum och inte bemöta den <a title="Dell Hell" href="http://www.buzzmachine.com/archives/cat_dell.html">kritik</a> som östes över dem i sociala medier. Idag satsar Dell stora resurser på bloggande, twittrande och kundmedverkan. Dell har exempelvis gjort ca 25 miljoner i vinst enbart via <a title="Delloutlet på Twitter" href="http://www.twitter.com/Delloutlet">@Delloutlet</a>. Det fantastiska med vår tid är vad sociala medier kan göra för oss, inte bara privat, utan även för företaget.</p>
<p>Företag som fortfarande tror att närvaro på nätet handlar om envägskommunikation, kommer få svårt att konkurrera med öppna, transparenta och medvetna företag som tar sina kunder på allvar.</p>
<h2>Presentationen</h2>
<p><iframe src="http://docs.google.com/a/athega.se/present/embed?id=dd2m6j26_9dg5t26hp&#038;size=m" frameborder="0" width="555" height="451"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/08/28/sociala-medier-for-foretaget/feed/</wfw:commentRss>
		<slash:comments>2</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>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>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>

