<?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/"
	>

<channel>
	<title>Isotop &#187; Blogg</title>
	<atom:link href="http://www.isotop.se/category/blogg/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.isotop.se</link>
	<description>Isotop är en webbteknikbyrå som utvecklar moderna onlinetjänster. Bland våra uppdragsgivare finns 3, Aktiespararna, NCC, TV4 och Vasakronan.</description>
	<pubDate>Mon, 08 Mar 2010 08:24:39 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CMS 6 crashes using Page Type Builder</title>
		<link>http://www.isotop.se/2010/03/avoid-a-crash-in-admin-mode-when-using-pagetypebuilder-11-with-cms-6/</link>
		<comments>http://www.isotop.se/2010/03/avoid-a-crash-in-admin-mode-when-using-pagetypebuilder-11-with-cms-6/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 14:18:29 +0000</pubDate>
		<dc:creator>Erik Wenneborg</dc:creator>
		
		<category><![CDATA[Blogg]]></category>

		<category><![CDATA[Erik Wenneborg]]></category>

		<category><![CDATA[.NET]]></category>

		<category><![CDATA[CMS]]></category>

		<category><![CDATA[EPiServer]]></category>

		<category><![CDATA[EPiServer CMS 6]]></category>

		<category><![CDATA[Page Type Builder]]></category>

		<guid isPermaLink="false">http://www.isotop.se/?p=584</guid>
		<description><![CDATA[We used Page Type Builder, but the EPiServer CMS 6 UI crashed. This is how we solved it.]]></description>
			<content:encoded><![CDATA[<p><a title="PTB" href="http://pagetypebuilder.codeplex.com/" target="_blank">Page Type Builder</a> (PTB) is an open source project developed by <a title="Joel Abrahamsson" href="http://joelabrahamsson.com" target="_blank">Joel Abrahamsson</a> that changes the way of working with page templates in EPiServer quite a bit: &#8220;Page Type Builder allows developers to define EPiServer page types in code which eliminates the need to synchronize page types between different servers. As page types are declared in code it also enables inheritance between page types and strongly typed property access.&#8221;</p>
<p>Of course we wanted to use PTB and <a title="CMS 6" href="http://www.episerver.com/" target="_blank">CMS 6</a> for our new project. We went to work but soon discovered that something did not really work. When looking on our PageTypes in admin mode, some of them caused the UI to crash.</p>
<p>It turns out that the UI for CMS 6 (Admin/EditPageType.aspx) does not accept that the help text for any property is null which is the default value for it using PTB. A quick solution would be to change the EPiServer templates to take care and use an empty string when there is a null value. In practice this means:</p>
<p>Change line 81 in EditPageType.aspx from</p>
<p><code>&lt;%# EPiServer.Core.LanguageManager.Instance.TranslateFallback("/pagetypes/common/property[@name='" + DataBinder.Eval(Container.DataItem, "Name") + "']/help&#8221;,  DataBinder.Eval(Container.DataItem, &#8220;HelpText&#8221;).ToString())%&gt;</code></p>
<p>to</p>
<p><code>&lt;%# EPiServer.Core.LanguageManager.Instance.TranslateFallback("/pagetypes/common/property[@name='" + DataBinder.Eval(Container.DataItem, "Name") + "']/help&#8221;,  DataBinder.Eval(Container.DataItem, &#8220;HelpText&#8221;) == null ? &#8220;&#8221; : DataBinder.Eval(Container.DataItem, &#8220;HelpText&#8221;).ToString())%&gt;</code></p>
<p>but we do not know if CMS 6 will try to access help text anywhere else without checking for null. So we went on by changing PTB:</p>
<p>In the file</p>
<p><code>/Synchronization/PageTypePropertyUpdater.cs</code></p>
<p>in the method</p>
<p><code>CreateNewPageDefinition</code></p>
<p>we changed from</p>
<p><code>pageDefinition.HelpText = propertyDefinition.PageTypePropertyAttribute.HelpText;</code></p>
<p>to</p>
<p><code>pageDefinition.HelpText = propertyDefinition.PageTypePropertyAttribute.HelpText ?? "";</code></p>
<p>and in the method</p>
<p><code>UpdatePageDefinitionValues</code></p>
<p>we changed</p>
<p><code>pageDefinition.HelpText = propertyAttribute.HelpText;</code></p>
<p>to</p>
<p><code>pageDefinition.HelpText = propertyAttribute.HelpText ?? "";</code></p>
<p>Hopefully this will help someone. We will continue to post here if we run in to any other issue that could be of interest along the way.</p>
<p>So far we are very pleased with PTB and CMS 6 working together and we are looking forward to releasing some great sites using them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.isotop.se/2010/03/avoid-a-crash-in-admin-mode-when-using-pagetypebuilder-11-with-cms-6/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Unit testing med Roy Osherove</title>
		<link>http://www.isotop.se/2009/11/unit-testing-med-roy-osherove/</link>
		<comments>http://www.isotop.se/2009/11/unit-testing-med-roy-osherove/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 21:21:49 +0000</pubDate>
		<dc:creator>Nils W (Isotop)</dc:creator>
		
		<category><![CDATA[Blogg]]></category>

		<category><![CDATA[Nils]]></category>

		<category><![CDATA[TechEd Europe 2009]]></category>

		<category><![CDATA[Unit testing]]></category>

		<guid isPermaLink="false">http://www.isotop.se/?p=415</guid>
		<description><![CDATA[Teched-session med Roy Osherove, författaren till boken "The art of unit testing"]]></description>
			<content:encoded><![CDATA[<p>Hade nöjet att under TechEd Europe delta i en session med Roy Osherove, som till vardags arbetar som chefsarkitekt hos Typemock och även skrivit boken ”The art of unit testing”. Det initiala sessionsnamnet var ”Unit Testing - Best practices”, vilket han efter en kommentar i sista minuten reviderat till ”Unit testing – Good practices”.</p>
<h3>Vad är då ett unit test och vad definierar ett bra sådant?</h3>
<p>Ett unit test är en metod som testar vissa antaganden mot en annan klass eller metod. Ett exempel på ett enkelt unit test är följande.</p>
<div></div>
<p><code></p>
<div style="font-family: Courier New; color: black; background: white; line-height:normal;">
<p style="margin: 0px;">[<span style="color: #2b91af;">Test</span>]</p>
<p style="margin: 0px;"><span style="color: blue;">public</span> GetCityById_NegativeNumber_NameIsNull()</p>
<p style="margin: 0px;">{</p>
<p style="margin: 0px;">   <span style="color: #2b91af;">City</span> c = GetCityById(-1);</p>
<p style="margin: 0px;">   <span style="color: #2b91af;">Assert</span>.AreEqual(c.Name, <span style="color: blue;">null</span>);</p>
<p style="margin: 0px;">}</p>
</div>
<p></code></p>
<p>Vi testar alltså om vår GetCityById metod returnerar null då vi skickar in ett negativt nummer som parameter. För att kunna skriva ett bra unit test måste vi dock först definiera vad som är ett integrationstest och vad som är ett unit test. Osheroves definition av ett unit test är:</p>
<ul>
<li>Snabbt</li>
<li>I minnet</li>
<li>Inga externa beroenden (mot filsystem, databaser etc.)</li>
<li>Samma process</li>
<li>Automatiserat</li>
<li>Repeterbart</li>
<li>Konsekvent</li>
</ul>
<p>När vi nu vet vad ett unit test är, kan vi med fördel dela upp våra unit och integrationstester i olika namespaces eller projekt. Genom att göra en uppdelning av våra tester har vi sedan en klar bild över vilka av våra tester som har externa beroenden, och vilka som vi kan köra som unittests.</p>
<p>En viktig sak Roy nämner är vikten av att lita på sina tester. Litar man inte på dem och använder debuggern för att dubbelkolla förlorar testet sitt syfte. En av anledningarna till att man inte litar på sina tester kan vara att man inte delat upp sina tester och då har ett antal integrationstester som behöver viss konfiguration innan de passerar, men vanligast är att man helt enkelt känner att testerna inte riktigt går att lita på.</p>
<h3>Så, hur kan jag börja lita på mina tester?</h3>
<p>För att kunna lita på mina tester, måste jag lita på min egen förmåga att skriva bra test. För att göra detta gäller det att inte tumma på vare sig struktur eller läsbarhet. Roy har ett par bra tips när det gäller namngivning.</p>
<p>Ha en konsekvent namngivning på dina testmetoder. Gärna enligt [metodundertest]_[scenario]_[resultat], vilket bli extra tydligt om vi jämför metoderna <code>AddNumber_LessThanZero_ThrowException()</code> och <code>AddNumber().</code></p>
<p>Man måste också se till att döpa sina variabler korrekt och att undvika <em>Magic numbers</em>. Om vi jämför en assert av typen <code>Assert.AreEqual(-77,statuscode)</code> med att använda en konstant/variabel <code>MISSING_COUNTRY=-77</code>, märker vi hur mycket läsbarheten ökar då vi istället får <code>Assert.AreEqual(MISSING_COUNTRY,statuscode)</code>.</p>
<p>Med vackra ord, eller i det här fallet KONSTANTER och metodnamn, kommer man inte långt om testet i sig är inte känns stabilt. För att undvika problem i dina tester finns ett (stort) antal saker att hålla koll på, här är några av dem.</p>
<p>Endast ett test per metod, har du flera tester (asserts) i en metod bör du bryta ut dem till egna tester. Detta gäller dock inte om du skall testa flera properties i ett och samma objekt.<br />
Undvik logik i dina tester, har du ett antal if-satser som styr logik i ditt test kan du troligtvis refaktorera dem till egna tester.<br />
Repeterbarhet, undvik saker som gör att varje test blir unikt. Använd ett statiskt datum istället för DateTime.Now och håll dig långt borta från allt vad slumptal heter.</p>
<h3>Summering</h3>
<p>Detta var bara en liten del av det som togs upp under sessionen, vilken allt som allt var mycket lärorik, även om det traditionella gitarrspelandet uteblev (den var trasig). Kan även passa på att rekommendera boken ”The art of unit testing” där han går igenom ämnet unit testing mer ingående.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.isotop.se/2009/11/unit-testing-med-roy-osherove/feed/</wfw:commentRss>
		</item>
		<item>
		<title>TechEd Europe 2009 i Berlin</title>
		<link>http://www.isotop.se/2009/11/teched-europe-2009-i-berlin/</link>
		<comments>http://www.isotop.se/2009/11/teched-europe-2009-i-berlin/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 13:11:21 +0000</pubDate>
		<dc:creator>Rikard (Isotop)</dc:creator>
		
		<category><![CDATA[Blogg]]></category>

		<category><![CDATA[Rikard]]></category>

		<category><![CDATA[TechEd Europe 2009]]></category>

		<guid isPermaLink="false">http://www.isotop.se/?p=457</guid>
		<description><![CDATA[Rikard på Isotop sammanfattar intrycken från årets TechEd Europe.]]></description>
			<content:encoded><![CDATA[<p>Isotop har under veckan haft två representanter nere i Berlin på TechEd-mässan som hålls varje år i Europa. Totalt hade ca 7200 teknikintresserade personer, varav 325 svenskar hittat hit för att förkovra sig i Microsofts olika teknologier. Utöver teknikfokuset har det också firats en del då mässan sammanträffade med 20-årsjubileumet av berlinmurens fall.</p>
<p>Veckan har bjudit på flera höjdpunkter men även några besvikelser då fokus legat på IT-infrastruktur  och inte programmering och webbutveckling, vilket är Isotops huvudspår. Man hör ofta folk på TechEd säga att ”alla snackar om molnet”, men det är fel&#8230; sanningen är att alla snackar om Sharepoint 2010 och Exchange.</p>
<p>
<img src="http://www.isotop.se/wp-content/uploads/teched.jpg" alt="TechEd Berlin" style="margin-bottom:30px;" />
</p>
<p>Några reflektioner från veckan på TechEd där temat var ”The new efficiency”:</p>
<p>David Chappelle hade en dragning om <strong>Windows Azure</strong>-platformen ur ett IT-strategiskt perspektiv där han försökte besvara frågorna – När, hur och varför man ska använda molnet? Microsoft planerar att släppa Azure i nästa vecka (19:e November) och funderingarna kring detta är många. Ett vanligt orosmoln från intressenter är säkerheten, vågar vi skicka upp vår känsliga data in i molnet?  Microsoft har insett att plattformens pålitlighet är avgörande för att vinna kundernas förtroende. Det har i sin tur inneburit att de infört vissa begränsningar som förenklar systemet men ökar pålitligheten, t.ex. kommer databaser till en början ha en maxstorlek på 10 GB och lastbalanseringen sker via manuell konfigurering. Läs gärna mer om Windows Azure och molntekniken i Staffan Eketorps inlägg <a href="http://www.isotop.se/2009/10/moln-i-praktiken-del-1/">Moln i praktiken, del 1</a> och <a href="http://www.isotop.se/2009/10/moln-i-praktiken-del-2/">Moln i praktiken, del 2</a>.</p>
<p>För den intresserade utvecklaren har Microsoft utlyst en tävling där man ska bygga molntjänster. Läs mer på <a href="http://wadc.cloudapp.net/" target="_blank">http://wadc.cloudapp.net/</a></p>
<p>För oss vanliga dödliga finns det fortfarande ett alternativ till molnbaserad hosting. <strong>Windows Server 2008 R2</strong> och <strong>IIS 7.5</strong> kommer med några intressanta nya features, bl.a. Centralized Web Management som innebär att man kan styra en hostad IIS från en lokal klient. Microsoft har också tagit fram ett verktyg (IIS Web Deployment Tool) för att underlätta installationer direkt från IIS genom konfigurerade export/import-funktioner. Det mest intressanta måste ändå vara Web Platform som innebär färdiga paketinstallationer av bloggverktyg och CMS som Wordpress, Umbraco och DotNetNuke. Site Analysis Report är också en annan feature som gör att vi kan hämta ut rapporter om t.ex. sökbarheten/tillgänglighet på webbplatsen. Listan kan göras lång och det blir helt klart spännande att se hur EPiServer anammar denna miljö i kommande versioner av EPiServer CMS.</p>
<p><strong>Visual Studio 2010</strong> och <strong>.NET 4.0</strong> har nyligen släppts som beta 2. En av de mer intressanta nyheterna i .NET 4.0 för utvecklare är <strong>Parallel Extensions</strong> som förenklar parallellisering av många vanliga programoperationer, t.ex. loopar och (P)LINQ.</p>
<p><strong>IronPython</strong> och <strong>IronRuby</strong> är något som omnämns titt som tätt här på TechEd. Båda språken har fullt stöd i 4:ans DLR (Dynamic Language Runtime) och innebär helt klart intressanta möjligheter för den som inte känner sig hemma med C# eller övriga .NET-språk. Dynamiska språk öppnar en ny värld för utvecklare från andra miljöer, inlärningströskeln för t.ex. en Ruby-utvecklare blir minimal samtidigt som man exponeras för styrkorna i .NET Framework. IronPython och IronRuby kan säkert vara intressant i vissa specifika fall men i grund och botten så innebär det ännu inga prestandavinster jämfört med andra implementationer av språk , snarare så leder det generellt till sämre prestanda, vilket Harry Pierson påpekar under sessionen ”Pumping Iron”.</p>
<p>Veckan har bjudit på många inspirerande talare, sessioner och ämnen. Nu behöver dessa tankar landa innan vi lanserar vår första IronPython-applikation på molnet.</p>
<p>Läs gärna inlägget ”<a href="http://www.isotop.se/2009/11/tips-och-trix-for-att-snabba-upp-din-webbplats/">Tips för att snabba upp din webbplats</a>” och ”<a href="http://www.isotop.se/2009/11/unit-testing-med-roy-osherove/">Unit testing med Roy Osherove</a>”  som sammanfattar två enskilda föreläsningar från Microsoft  TechEd 2009 i Berlin.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.isotop.se/2009/11/teched-europe-2009-i-berlin/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tips för att snabba upp din webbplats</title>
		<link>http://www.isotop.se/2009/11/tips-och-trix-for-att-snabba-upp-din-webbplats/</link>
		<comments>http://www.isotop.se/2009/11/tips-och-trix-for-att-snabba-upp-din-webbplats/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 22:48:53 +0000</pubDate>
		<dc:creator>Rikard (Isotop)</dc:creator>
		
		<category><![CDATA[Blogg]]></category>

		<category><![CDATA[Rikard]]></category>

		<category><![CDATA[Optimering]]></category>

		<category><![CDATA[TechEd Europe 2009]]></category>

		<guid isPermaLink="false">http://www.isotop.se/?p=337</guid>
		<description><![CDATA[ Några tips på hur du optimerar gränssnittet på din webbplats från Microsoft TechEd 2009.]]></description>
			<content:encoded><![CDATA[<p>Denna post innehåller en sammanfattning av sessionen ”<strong>Tips and Tricks for Building High Performance Web Applications and Sites</strong>” från Microsoft Tech Ed 2009 i Berlin.</p>
<p>Giorgio Sardo höll i sessionen som handlade om hur vi kan göra våra webb-2.0-applikationer och webbplatser snabbare. Fokuset låg helt på klientsidan och handlade till stor del om optimering av Javascript och DOM-operationer som står för 33% av CPU-förbrukningen för den genomsnittliga webbplatsen (övrig CPU går till rendering av innehållet).</p>
<p>Sessionen och talaren Giorgio Sardo, som är ”Technical Evangelist” på Microsoft Corporation, kanske var lite smått färgad av just Microsoft men framhöll ändå några intressanta synpunkter och fallgropar man bör tänka på när man utvecklar gränssnitt – oavsett plattform (oroa er inte, jag hade mina GOOGLES på mig).</p>
<h3>Några vanliga fallgropar på klientsidan</h3>
<ul>
<li>CSS - Långa selektorer drar prestanda. Håll dem korta och koncisa.</li>
<li>CSS - Undvik CSS Expressions.</li>
<li>JS - Undvik globala variabler om det går.</li>
<li>JS - Undvik arv med prototyping. JS-motorn måste först leta igenom objektinstansens alla default-properties innan den kan söka vidare efter prototype-funktioner. Det drar prestanda.</li>
<li>JS - Cacha get/set anropen till DOM genom temporär lagring i lokala variabler.</li>
<li>JS - Precis som ovan så bör man även cacha återkommande funktionsanrop i lokala variabler.</li>
<li>JS - Vid användning av setTimeout() bör funktionsanropet göras direkt och inte via en sträng. Strängar som skickas till setTimeout måste exekveras med eval() vilket leder till prestandaförluster.
<p>
<br />
Exempel - vanligt förekommande:<br />
<code>setTimeout(”testFunc()”,100);<br />
function testFunc() {alert(’Hello world!’)}</code>
</p>
<p>Exempel - rekommenderad användning:<br />
<code>setTimeout(function(){testFunc()},100);<br />
function testFunc() {alert(’Hello world!’)}</code></li>
</ul>
<ul>
<li>JS - for-loopar blir snabbare om de utgår ifrån en lokal variabel med length-värdet istället för att gå direkt mot object.length.</li>
<li>JS - Iterationer över DOM-element bör göras med while-loopar där nextSibling() styr iterationen. På detta sätt undviker man onödiga uppslagningar mot DOM-objekten.</li>
<li>JS - IE 8 kommer med en native selector som (enligt Microsoft) går snabbare än jQuerys selector.</li>
<li>JS - Konkatenering av strängar bör göras genom att pusha strängar till arrayer som i slutändan sammanfogas med join() istället för att addera (var1 + var2) strängar med varandra.</li>
</ul>
<h3>Några intressanta verktyg som togs upp under sessionen</h3>
<p><strong>Doloto</strong></p>
<p>Doloto är ett verktyg för att optimera Javascript-filer, inte genom minifiering utan genom klustring av funktioner. Verktyget analyserar vilka funktioner som anropas i runtime och utifrån det resultatet så optimeras koden dels genom uteslutning av överflödig kod och dels genom lazy loading. Det huvudsakliga målet är att reducera väntetiden för en webbsida att laddas in.</p>
<p>Läs mer på <a href="http://msdn.microsoft.com/en-us/devlabs/ee423534.aspx" target="_blank">http://msdn.microsoft.com/en-us/devlabs/ee423534.aspx</a></p>
<p><strong>Expressions Web  3 + SuperPreview</strong></p>
<p>Verktyg för att felsöka grafiska skillnader mellan olika versioner av IE(IE6  + IE7 eller IE8) och Firefox. Via en och samma vy kan man göra snabba visuella analyser över vad som skiljer sig åt mellan de olika webbläsarna.</p>
<p>Läs mer på <a href="http://blogs.msdn.com/xweb/" target="_blank">http://blogs.msdn.com/xweb/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.isotop.se/2009/11/tips-och-trix-for-att-snabba-upp-din-webbplats/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Advanced sound programming in AS2</title>
		<link>http://www.isotop.se/2009/11/advanced-sound-programming-in-as2/</link>
		<comments>http://www.isotop.se/2009/11/advanced-sound-programming-in-as2/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 12:23:44 +0000</pubDate>
		<dc:creator>staeke</dc:creator>
		
		<category><![CDATA[Blogg]]></category>

		<category><![CDATA[Staffan]]></category>

		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.isotop.se/?p=159</guid>
		<description><![CDATA[Programming sounds in Flash? Read this on sound syncing and beatbox creation.]]></description>
			<content:encoded><![CDATA[<p><em>Is it possible to synchronize sounds with good precision in AS2 to create a beat box? You want those bass drum sounds pounding on 1, 3 while digging a nice groovy tight hi-hat. And sync problems: no thanks! Lots of people have experienced problems, but read on to get some code and 7 strategies to get there. Or&#8230;browse to the end and download some code.<br />
</em></p>
<p>Some time ago, we faced the problem of building a little audio/video sequencer in Flash. With this sequencer the user would produce his/her own music video that was published on YouTube. As for video, there wasn&#8217;t much problems, but synchronizing audio turned out to be a real beast. Following the debate on <a href="http://blog.andre-michelle.com/2007/198/" target="_blank">Andre Michelle&#8217;s blog</a> and <a href="http://www.make-some-noise.info/2008/04/01/response-to-a-bunch-of-questions-from-adobe/" target="_blank">http://www.make-some-noise.info/2008/04/01/response-to-a-bunch-of-questions-from-adobe/</a> Adobe hasn&#8217;t really been the Flash sound community&#8217;s dear friend recently. In short, they introduced severe bugs in Flash player 9.r115, but they changed the whole API for version Flash Player 10. With version 10 you can do really cool stuff writing directly to sound mixer buffers. In particular: see <a href="http://www.hobnox.com/index.1056.en.html" target="_blank">Hobnox&#8217;s Audiotool</a> which is probably the coolest Flash application I&#8217;ve ever seen (ReBirth anyone? :-)).</p>
<p>Anyhow, unfortunately our project couldn&#8217;t go for Flash Player 10 as the market penetration wasn&#8217;t large enough. Even AS 3 was not an option due to platform restrictions. So, back to thinking in terms of the old API:s and playing around. The idea was for the user to click in a grid and play different samples, just like a beat box or drum machine. Furthermore, each sample had a video so, in effect, the user made a little video beat box loop. Ok, cool&#8230;but could we accomplish this?</p>
<p>After trying just naive <code>Sound.play</code> calls together with matching timer values from <code>getTimer()</code> and noticing quite large rythmic glitches I was disappointed. Clearly, we needed better timing information. But reading the article <a href="http://www.actionscript.org/resources/articles/159/1/Advanced-Flash-MX-Sound-Timing/Page1.html" target="_blank">Advanced Flash MX Sound Timing</a> made it clear. There is one exact timing for sounds in Flash, namely the <code>Sound.position</code> property. In order to use this for common timing information, we needed to play a really long sound, and then we could check where we were in this reference sound. As we&#8217;d see, we&#8217;d get position increases in chunks of 46.4 ms. It turns out that this corresponds to the buffer size used by Flash (2048 samples 44.1 KHz) and sometimes (NOTE: not always) when the soundcard calls back to get more data to play, Flash updates <code>Sound</code> objects&#8217; <code>position</code> values. So I started a really long, totally quiet, sound to play in parallel for common timing, but it quickly struck me that a smart approach would be just to loop something like a 1 second sound. I&#8217;d found my first conclusion:</p>
<p>1. <strong>Use a silent reference sound and loop this sound</strong>. For each loop we can increase a counter and thus we can always reach the overall position. A reasonable length is probably 1 second. Make sure it&#8217;s mono by the way.</p>
<p>Ok great! Things were clearly better. Only - quite many sounds still came slightly wrong and misaligned musically. After thorough investigation, it turned out that when you say <code>Sound.play</code> to Flash, this doesn&#8217;t really happen immediately. Not even on the next sound card callback. But rather on the next sound card callback which Flash happens to like. (My guess: where some low prioritized task queue copy function for some other thread has completed).</p>
<p>2. So the solution is to use some silence in the beginning of the audio, and <strong>schedule the sound to play &#8220;in the future&#8221;</strong>. We thus introduce a little latency, but we really have the ability to sync sounds given a little latency of say 200 ms. If we schedule audio every 200 ms, we need at least a 200 ms silent part before each sound, and then we can just check the position of the reference sound and use <code>Sound.start(OFFSET)</code> to start a sound with a little offset that has been calculated from the position. This is actually much better explained at <a href="http://www.actionscript.org/resources/articles/159/1/Advanced-Flash-MX-Sound-Timing/Page1.html" target="_blank">Advanced Flash MX Sound Timing</a>. Great! But it turned out that there were still glitches.</p>
<p>3. <strong>Enter 1 short 1-sample silent mono sound that we don&#8217;t loop but re-trig all the time</strong>. Yes, just as it had been suggested by <a href="http://www.actionscript.org/resources/articles/159/1/Advanced-Flash-MX-Sound-Timing/Page1.html" target="_blank">Advanced Flash MX Sound Timing</a> and others. It turns out that callbacks at <code>onSoundComplete</code> are really good for starting new sounds, even though they don&#8217;t always come when the sound has actually finished (as pointed out by very disappointed people at <a href="http://www.make-some-noise.info" target="_blank">http://www.make-some-noise.info</a>). Anyhow&#8230;still great for our purposes! To be clear: the idea is basically to just start this one-sample sound and use its <code>onSoundComplete</code> handler. In that handler, we just trigger the little sound again. And so on. This way we get a callback on &#8220;good&#8221; times, instead of using <code>setInterval</code> or <code>onEnterFrame</code>. Super! So we now have a longer sync sound that we loop for position, and a shorter sync sound for good callback times. But&#8230;happiness didn&#8217;t last for long. Even though the situation had clearly improved there were still glitches every now and then. If you weren&#8217;t picky or perhaps playing some rather soft/smooth sounds, perhaps you didn&#8217;t care. But we had this smackin&#8217; snare and hand clap we wanted to make a groove of and glitches aren&#8217;t grooves&#8217; best friends.</p>
<p>4. It turned out some old fashioned<strong> pickyness, good system design and loads of asserts </strong>were bringing in some predictability. Starting a <code>Sound</code> in Flash isn&#8217;t just a few-instructions synchronous little thingie. It actually takes a couple of milliseconds. And by starting a lot of sounds, the master position could have changed, and then those recently started sounds were out of sync. Even on direct callbacks from the <code>onSoundComplete</code> handler previously mentioned the master clock sometime changed directly. Ok, so by just avoiding scheduling sounds at those positions seemed to do the trick quite well. But we now needed to increase the quite part in the sounds, since REALLY GOOD callback times occurred more seldom. Ok, still cool, but&#8230;.still glitches. Shit! But some more coffee revealed a more serious approach to solving this.</p>
<p>5. Enter <strong>error detection</strong>. Yep, we could always check the positions of <code>Sound</code> objects that we schedule to see if they match what we expect them to have compared to the master position. This meant that we had to rewrite the scheduling mechanism. Instead of just using play, we now added sounds to a queue and then removed them when they had been deemed &#8220;OK&#8221; by some error detection handler. But&#8230;now it turned out the sync was really good. But&#8230;there were drop-outs. Yep, some sound could never be synced back, but an even more common problem turned out to be that it was really hard to read a sound&#8217;s position. Say you used the same kick drum sample on each beat, but when you were to read the position of that sound object, it might return the old sound object&#8217;s position and vice versa. This really exposed a nasty detail of the Sound API: namely that the Sound object plays two roles: to wrap some audio file and to provide information about currently playing material. A more clean solution more in line with how things work would probably be for the play function to return a <code>PlayingSound</code> (or similar) object which had the position. Anyhow, as that wasn&#8217;t available, we decided to build&#8230;</p>
<p>6. &#8230;<strong>a <code>SoundPool</code> class</strong>. The idea is to load a bunch, say 30, similar <code>Sound</code> objects in a pool. Whenever a new playing sound is needed, we could ask the pool for a &#8220;fresh sound&#8221; and the pool would just circle round the sounds and return them in circular order. How many sounds you need depends on how many sounds you play simultaneously, and also how long your silent intro is. We decided that ~30 was probably a quite good number. Notice that the browser cache would normally take care of not issuing more requests than necessary, but it&#8217;s probably wise to make the server return an Expiration Data in the HTTP header or similar for the mp3 files in question.</p>
<p>Now we had quite some solutions to deal with this. There was just the problem that when you filled the sequencer grid with beats (I know, not the grooviest of beats, kind of repetitive) sounds vanished and there was nothing heard. Aarrghh&#8230;going crazy again! When investigating this it turned out to be because of the sound channel limitation in Flash (currently 32 channels). So what happens is actually that if you have 32 channels playing and play another sound, one of the first sounds just stop. Unlucky for us all sounds start with silence, so we were listening to 32 channels of groovy silence. Not cool.</p>
<p>7. Enter <strong>cancel mechanisms</strong> on scheduling when too many sounds are playing. Yes - we adapted our scheduling mechanism so that when a sound was OK in sync we moved it to a playing collection and continuously removed sounds from that queue when they finished. Thus we could keep track of how many sounds were playing and cancel any scheduling attempts. We just simply had to wait for some sounds to complete. Sure, this meant that we had fewer times to sync audio, but it still worked quite well.</p>
<p>Ok, but there were still occasional drop-outs</p>
<p>Yep, we decided to live with it. It really happened quite seldom, and we set a limit on 100 ms drift to regard a sound as playable even though not in sync.</p>
<p>Next thing: sync with video. We needed to provide some video along with the sounds as well. We just used an onEnterFrame callback and calculated the approximate position. When we had the latest callback we saved the position using a getTimer() call and then we could just diff a getTimer() to the last call to calculate a continuous position which we could then use for video. Our video actually started 85 ms before the audio se we showed the corresponding video on the first frame ~85 ms before the sounds was going to be heard.</p>
<p><strong><a href="http://www.isotop.se/wp-content/uploads/beatbox.zip">» Download Code</a></strong></p>
<p>So - how can you use this code? Just check out the <code>Main.run</code> function which demonstrates an example. Furthermore, check each classes header to see some documentation in comments.</p>
<p>If you really want, I could probably include a demo too =) Just contact me or leave a comment below.</p>
<p>Good luck!</p>
<p><a href="mailto:staffan@isotop.se">Staffan</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.isotop.se/2009/11/advanced-sound-programming-in-as2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Moln i praktiken, del 2</title>
		<link>http://www.isotop.se/2009/10/moln-i-praktiken-del-2/</link>
		<comments>http://www.isotop.se/2009/10/moln-i-praktiken-del-2/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 09:46:59 +0000</pubDate>
		<dc:creator>staeke</dc:creator>
		
		<category><![CDATA[Blogg]]></category>

		<category><![CDATA[Staffan]]></category>

		<category><![CDATA[azure]]></category>

		<category><![CDATA[cloud]]></category>

		<category><![CDATA[ec2]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[iaas]]></category>

		<category><![CDATA[moln]]></category>

		<category><![CDATA[paas]]></category>

		<category><![CDATA[s3]]></category>

		<category><![CDATA[saas]]></category>

		<guid isPermaLink="false">http://www.isotop.se/?p=279</guid>
		<description><![CDATA[Andra delen i blogginlägg om molnteknik. Vad innebär det i praktiken för framtiden?]]></description>
			<content:encoded><![CDATA[<p>I <a href="http://www.isotop.se/2009/10/moln-i-praktiken-del-1">förra inlägget</a> talade jag lite om vad molnteknik innebär och om <a href="http://en.wikipedia.org/wiki/Infrastructure_as_a_service">IaaS</a>, <a href="http://en.wikipedia.org/wiki/Platform_as_a_service">PaaS </a>och <a href="http://en.wikipedia.org/wiki/Software_as_a_service">SaaS</a>. Dessutom nämnde jag fyra huvudområden som särskilt intressanta:</p>
<p>1. Skalbar och billig hosting (IaaS)</p>
<p>2. Möjligheten att snabbt skapa ett lätt serverlager för RIA med befintliga PaaS-tjänster</p>
<p>3. Affärsmöjligheter med SaaS</p>
<p>4. Bygga bättre applikationer snabbare och billigare med bra PaaS-tjänster</p>
<p>Låt oss titta lite på vad jag menar i detalj:</p>
<h3>1. Skalbar och billig hosting</h3>
<p>Denna typ av nytta är tämligen uppenbar. Om IaaS på moln är billigare (det är det oftast idag) än att köpa &#8220;vanlig hosting&#8221;, varför göra något annat? Med en IaaS-lösning kan man ju dessutom skala upp med några musklick. Vad finns det egentligen för argument som talar emot en sådan lösning? Det som oftast brukar lyftas fram är säkerhetsrisker - vågar jag anförtro åt Microsoft/Google/Amazon att handha min data och kan jag leva med att det kommer vara åtkomligt över Internet? Vidare - är erbjudandena jämförbara? Om jag köper hosting från en &#8220;vanlig&#8221; hostingleverantör får jag ju felsökningsexpertis, övervakning och hårdvarusupport.</p>
<p>Nå, kalla mig naiv, cynisk eller luttrad - jag påstår att felsökning bäst görs av utvecklare, övervakning/statistik/loggning av en stor IaaS-leverantör och hårdvarusupport inte alls (virtualisering!). När det gäller säkerhet tror jag dessutom att riskerna med molnlösningar gärna överdrivs. Jag ser egentligen inte varför jag ska misstro Amazon mer än vilken hostingleverantör som helst och vi pratar knappast om att flytta de system vi behöver ha fysiskt frånkopplade från Internet till molnet. Tvärtom brukar akilleshälen säkerhetsmässigt vara mänskliga rutiner och handhavanden och skillnaden är knappast särskilt stor i det avseendet mellan alternativen ovan. Möjligen borde en IaaS-lösning lättare kunna stå emot DoS-attacker eftersom temporär storskalning är ett alternativ.</p>
<p>Kommer då verkligen Googles/Amazons/Microsofts paket att hota idag etablerade hostingpartners? Vi får väl se, men en annan faktor att ta med i beräkningarna är hur aktörer som Microsoft och Google säkerligen kommer utforma sina utvecklingsmiljöer så att de hänger ihop med hosting. Ett klick i Eclipse eller Visual Studio och så är man igång. För att inte tala om varför du ska använda tjänster genom Microsofts Live Services eller söka data genom Googles egna sökspråk. Lycka till att hitta en annan hostingleverantör som kan erbjuda det.</p>
<h3>2. Möjligheten att snabbt skapa ett lätt serverlager för RIA</h3>
<p>Nyligen hade vi en kund som skulle göra en grafiskt avancerad flashapplikation med spel och tilltalande interaktionsdesign. Men det fanns också ett behov att spara lite speldata och hämta listor över resultat från olika länder. Små snabba utsökningar helt enkelt. Med traditionell webbteknik hade man behövt</p>
<p>a) Definiera format för datautbyte (i XML/JSON)</p>
<p>b) Exponera webbservices eller REST-liknande tjänster</p>
<p>c) Bygga ett datalager som kan persistera objekten och göra utsökningar enligt kriterier</p>
<p>d) Hantera säkerhet och åtkomst till data och funktioner</p>
<p>e) Utreda lastkrav och kravspeca en hostingmiljö</p>
<p>f) Hitta en hostingleverantör som uppfyller kraven</p>
<p>g) Deploya applikationen</p>
<p>Utgår man däremot från en färdig skalbar PaaS-tjänst med datalagring, rättighetssystem och REST-sökningar är det bara en fråga om en spec till Flashleverantören. Visst förenklar jag en aning, men faktum är att kostnaden minskar dramatiskt för att ta fram lösningen. Med PaaS-tjänster som också utvecklas med nya kundprojekt kommer plattformarna bli mer och mer kompetenta och fler och fler projekt kommer kunna se det mesta löst i en redan utrullad applikation. Man kan redan idag återvinna kod och komponenter, men för att verkligen minska kostnaderna i a) - e) ovan behövs återvinning på en högre nivå.</p>
<h3>3. Affärsmöjligheter med SaaS</h3>
<p>Med lite tekniska begrepp på plats kan man fundera på övergripande trender i webb- och mobilvärlden. Med <a href="http://en.wikipedia.org/wiki/Service-oriented_architecture">SOA</a>, mobilt internet och den alltmer vanliga attityden att inte göra allt själv ser framtiden för SaaS ljus ut. Inte bara ljus - SaaS-tjänster som använder andra SaaS-tjänster som i exempelvis mashuptjänster blir vanligare och vanligare. För att vara konkret - jag kan hyfsat lätt göra en Salesforce-site som använder Google Maps och kopplar in en kommunikationskanal från Google Wave för att styra min Twitter som också syns på Facebook. Konsekvensen blir att Molnet (Internet) blir mer sammanvävt när tjänsterna använder varandra. Mer och mer sammanvävning kommer kräva och framtvinga enklare och snabbare integrationsmöjligheter. Och om integration blir lättare kommer tjänsteinriktad arkitektur kunna användas mer. Det blir lätt och affärsmässigt fördelaktigt att skapa små tjänster som bara gör en sak, men gör den bra - lite som en komponent i dagsläget. Vi kan ex. göra rena systemfunktioner som bildomskalning och -konvertering på molnet, eller bild- och videospelare i Flash som en mjukvarutjänst. Återanvändning kan fungera på en högre nivå än genom dagens komponenter.</p>
<p>Mashups och återanvändning på hög nivå kommer att bli mer vanligt, vilket betyder att det också blir viktigare att hålla koll på vilka tjänster som finns. Teknikbyråer måste inte bara  prioritera omvärldsbevakning än högre utan också komma till rätta med en helt ny typ av problem. Låt oss ta ett exempel: idag publicerar kanske en redaktör ett pressmeddelande via ett CMS på sitt företags hemsida, med bilder och filer inlänkade från funktioner i CMS:et. Möjligtvis exporteras detta pressmeddelande via RSS till en nyhetssajt och i bästa fall tittar redaktören efter någon timme hur pressmeddelandet ter sig på nyhetssajten. Men om vi tar de här SaaS-principerna på allvar och tillåter oss att blicka framåt en aning - varför ska redaktören nöja mig med funktioner för bilder och filer i CMS:et? Det finns ju utmärkta bildfunktioner hos Splashup och Flickr. Kan CMS:et erbjuda en förhandsvisning på nyhetssajten innan publicering? Hur är det med länkar och beroenden mellan tjänster? Förstör hon något om hon tar bort sidan? Här finns onekligen affärsmöjligheter att skapa bättre tjänster och tillägg för en webbteknikbyrå.</p>
<h3>4. Bygga bättre applikationer snabbare och billigare med bra PaaS-tjänster</h3>
<p>Det här inlägget har hitills handlat rätt mycket om teknisk återanvändning - den industriella princip som möjliggör mer kvalitet till mindre kostnader. Låt mig få ta en liten avstickare till bilbranschen som jag lånar från <a href="http://www.davidchappell.com/">David Chapell</a>: 1905 gick var och en till sin lokala bilhandlare och beställde sin bil. Det skulle vara specialutformade strålkastare, kromdetaljer på egenutvalda ställen och kundanpassade detaljer till höger och vänster. Sen kom en viss Ford (inte Harrison) och vände upp och ner på världen - &#8220;Välj vilken färg du vill bara den är svart&#8221;. Poängen var initialt att fler hade råd med bilen, men naturligtvis också att det gick att producera oändligt mycket bättre bilar i alla avseenden när det fanns ordentlig teknisk återanvändning (med specialiserade underkonsulter). En detalj som inte ska glömmas i industrialiseringsprocessen är också gemensamma standarder för alltfrån hjulupphängning till spänningsnivåer till bilstereon.</p>
<p>Nu tillbaka till mjukvaruvärlden. Parallellen är uppenbar: jag menar att vi befinner oss på 1905 års nivå. Vilket leder oss in till frågan varför vi i så fall inte kommit längre med teknisk återanvändning trots ca 40 års integrationsarbete med klasser, bibliotek, dll:er, komponenter, assemblyn och tjänster. Ett tappert försök är förstås att i Fords anda göra som Google Apps: &#8220;Gör vilken webbplats du vill bara den innehåller enkelt innehåll och ser ut som vår standardmall&#8221;, men fint eller flexibelt blir det i dagsläget inte. Låt oss titta på ett annat exempel:</p>
<p>Låt oss säga att jag vill ta fram en webbshop. Jag kan förstås utgå från en befintlig - kanske en open-source-variant. Eller så kan jag köpa en tjänst som hos <a href="http://www.starweb.se">starweb.se</a> och anpassa min webbutik så mycket som deras system möjliggör. Oavsett vilket vill jag kanske ha andra delar på min sajt med spännande funktioner, och så vill jag kanske använda ett bra CMS för att administrera övrigt innehåll. Mina produkter finns idag redan i en databas på egna servrar och som används av några butikssystem. Dessutom säljer jag kanske produkter som tjänar på en häftig 3D-visning i Flash och det vill jag ha på hemsidan. Sen vill jag att andra ska komma åt mina produkter via XML över REST för tredjepartstjänster. Men jag vill ju också ha modern HTML som är anpassad till moderna krav på tillgänglighet och SEO. Dessutom kanske det vore fint med en lite anpassad vy för iPhone/Android. Och jag vill inte låsa in mig i något konstigt teknikhörn! Borde inte det gå ganska lätt att göra - någon vecka eller två? Tyvärr vet alla som har implementerat webb att så  inte är fallet.</p>
<p>Problemet är helt enkelt att alla inte riktigt är överens om hur man bygger webb. Hur ska man kunna ha en rigorös policy för HTML om de komponenter man köper styr HTML-renderingen. Svaret blir att allt får anpassas och då går konsultklockan. Vi är fortfarande en ganska bra bit från helt separerad återanvändning, där olika delar gör sin specialiserade del och all arkitektur är standardiserad. Tills dess kommer konsulter sälja många timmar på att göra liknande saker om och om igen. Men PaaS är ett steg på vägen i rätt riktning. Vi ska inte heller glömma tekniker som CSS 3, REST, HTML 5, funktionella språk, javascriptramverk som jQuery m.m.. Men i slutändan handlar PaaS mycket om att vi utvecklare ska lämna tekniska beslut till Microsoft, Google m. fl. Vi kommer inte kunna styra över detaljer i hur loggning görs i webbservrar, hur databaser ska klustras, hur url-strategin ser ut för att REST-exponera vår datamodell - kanske i slutändan inte ens hur HTML renderas. Och det är något bra! PaaS via moln innebär lite lite mer enhetligt svart, men i förlängningen mycket bättre och billigare webb!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.isotop.se/2009/10/moln-i-praktiken-del-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Moln i praktiken, del 1</title>
		<link>http://www.isotop.se/2009/10/moln-i-praktiken-del-1/</link>
		<comments>http://www.isotop.se/2009/10/moln-i-praktiken-del-1/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 09:46:07 +0000</pubDate>
		<dc:creator>staeke</dc:creator>
		
		<category><![CDATA[Blogg]]></category>

		<category><![CDATA[Staffan]]></category>

		<category><![CDATA[azure]]></category>

		<category><![CDATA[cloud]]></category>

		<category><![CDATA[ec2]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[iaas]]></category>

		<category><![CDATA[moln]]></category>

		<category><![CDATA[paas]]></category>

		<category><![CDATA[s3]]></category>

		<category><![CDATA[saas]]></category>

		<guid isPermaLink="false">http://www.isotop.se/?p=276</guid>
		<description><![CDATA[Det här är det första av två blogginlägg som handlar om hur vi kan dra nytta av molnteknik. Först en liten teknisk överblick och beskrivning av nuläget och i nästa inlägg lite mer om möjligheter och vad jag tror om hur vi kommer att påverkas.]]></description>
			<content:encoded><![CDATA[<p>Det här är det första av två blogginlägg som handlar om hur vi kan dra nytta av molnteknik. Först en liten teknisk överblick och beskrivning av nuläget och i nästa inlägg lite mer om möjligheter och vad jag tror om hur vi kommer att påverkas.</p>
<p>Även om moln (cloud computing) har varit på tapeten ett tag nu så börjar det dra ihop sig för .NET-utvecklare världen över. Windows Azure ska lanseras lagom till <a href="http://microsoftpdc.com/">PDC</a> 2009 (17-20 november) och ett nytt operativsystem (nåja) möter världen. Men ok - Microsoft är, sin vana trogen, inte först ut med ny teknik. Det var en bokhandlare som visade vägen när molnet skulle tas ner på jorden - Amazon med sitt Elastic Cloud (idag <a href="http://aws.amazon.com/ec2/">EC2 </a>och datatjänsten <a href="http://aws.amazon.com/s3/">S3</a>). Såhär i efterhand känns det möjligen naturligt eftersom Amazon med webbplatsens besökarantal varit tvunget att uppfinna nya och åter nya lösningar för att kunna skala. Idag finns andra spelare på planen som <a href="http://www.salesforce.com/">SalesForce</a> och Google med <a href="http://code.google.com/intl/sv/appengine/">Google AppEngine</a>. Dessutom finns nya molnaktörer som <a href="http://www.engineyard.com/">Engineyard </a> och <a href="http://www.rightscale.com/">RightScale</a>, men de erbjuder lite olika saker. Vad skiljer dem åt och hur kan man dra nytta av tekniken? Och kommer webbprojekt förändras framöver på grund av detta? Läser man bloggar och artiklar så verkar molntjänster handla om allt från att köpa Sharepoint per månad till döden för hostingleverantörer. På grund av begreppsförvirring kanske vi ska prata lite mindre om moln och lite mer om <a href="http://en.wikipedia.org/wiki/Infrastructure_as_a_service">IaaS</a>, <a href="http://en.wikipedia.org/wiki/Platform_as_a_service">PaaS </a>och <a href="http://en.wikipedia.org/wiki/Software_as_a_service">SaaS</a>. Men vad betyder det då? Låt oss reda ut begreppen.</p>
<p>Med moln eller cloud computing menas egentligen &#8220;datorteknik som samverkar i stor skala för att leverera en tjänst&#8221;. Men naturligtvis brukar man vanligtvis vara mer konkret. Vanligtvis menar man att hyra vissa grundläggande nättjänster för att erbjuda nya nättjänster på högre nivå. Att allt kallas moln nuförtiden är förstås också en trend, men det är rimligt att reda ut vilka lager och begrepp som man brukar tala om i dessa sammanhang:</p>
<h3><a href="http://en.wikipedia.org/wiki/Infrastructure_as_a_service">IaaS </a>(Infrastructure as a Service)</h3>
<p>Precis som namnet antyder handlar det om att man köper datorkraft som en tjänst. Får jag låna lite processor och disk ett tag så får du lite pengar. Det här är alltså precis vad Amazon ägnar sig åt och en nyckel till framgång är effektiv virtualisering.</p>
<p>I praktiken är det också få leverantörer som storskaligt kan erbjuda den här tjänsten - det kostar att köpa stora mängder hårdvara. Ett litet exempel på behovet hos sökmotorföretag: <a href="http://blogs.msdn.com/jasonz/">Jason Zanders</a> berättade på TechEd Barcelona förra året att Yahoo, Google och Microsoft tillsammans står för mer än 50% av dagens serverinköp. I praktiken innebär köp av IaaS idag att du hyr virtualiserade maskiner i någon form, där de fysiska servrarna står placerade i ett av ganska få stora datacenter världen över. Rigorös bevakning fordras förstås på plats och kalla länder är heta eftersom kylningen är billig. Grönland och framförallt Island är utöver nämnda skäl också poppis på grund av närhet till dagens två mest IT-intensiva kontinenter, så en liten ljusglimt är det nog i finanskrisens mörkerland.</p>
<p>Men för att kontrastera ovanstående påstående lite grann: att köpa datorkraft som tjänst måste ju inte göras via datacenter. <a href="http://setiathome.ssl.berkeley.edu/">SETI@home</a> använder vanliga desktopdatorer och Skype och BitTorrent använder P2P-teknik. Kanske stundar en framtid där vissa molnleverantörer också betalar enskilda aktörer som tillhandahåller datorkraft och där &#8220;molnet&#8221; utgörs av ett mer spritt P2P-nätverk? Det borde kunna vara en naturlig utveckling för exempelvis Skype, lite i linje med hur Amazon blev molnleverantör.</p>
<h3><a href="http://en.wikipedia.org/wiki/Platform_as_a_service">PaaS </a>(Platform as a Service)</h3>
<p>Ni anar kanske vart vi är på väg? Visst - det är ett lager ovanpå IaaS (vad kan komma sen?). Här börjar det bli lite mer spännande och här börjar de etablerade leverantörernas erbjudanden spreta ordentligt. Ok - vad är då plattformstjänster? Jo, den typ av grundläggande tjänster som utvecklare drar nytta av när applikationer byggs. Det kan exempelvis röra sig om smidiga lösningar för datalagring, sökning, e-posthantering, single sign-on, statistik, API-exponering via datattjänster och testverktyg. Hårdvara är fortfarande hårdvara om än i mängder, men mjukvara kan variera i det oändliga.</p>
<p>Den kanske viktigaste, och vanligaste, plattformstjänsten är förmodligen datalagring. Både Microsoft (<a href="http://www.microsoft.com/windowsazure/sqlazure/">SQL Azure</a>), Google och Amazon (S3) erbjuder den om än med olika stöd. Amazon går hitills kortast och Microsoft längst i sina olika ambitioner. Förenklat kan man säga att Amazon erbjuder möjligheten att spara och söka efter godtyckliga objekt. Microsoft gjorde en kovändning från sin första ambition och erbjuder nu mer eller mindre än enklare version av SQL Server som körs i molnet. Det innebär alltså möjlighet att köra ganska avancerade frågor och  Google ligger någonstans mittemellan. Gemensamt för Amazon och Microsoft är fokus på <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer">REST</a>, d.v.s. möjligheten att hämta och skicka data så enkelt som möjligt, med vanlig HTTP som kan göras i vilken webbläsare som helst. Du ska helt enkelt på ett lätt sätt kunna hämta data från molnet med en enkel webbläsare i format som JSON och XML.</p>
<h3><a href="http://en.wikipedia.org/wiki/Software_as_a_service">SaaS </a>(Software as a Service)</h3>
<p>När vi närmar oss nästa lager närmar vi oss användaren än mer. Om vi hårddrar målgrupperna en aning är målgruppen för IaaS driftansvariga, PaaS utvecklare och för SaaS slutanvändare eller inköpare. Inom SaaS hittar man tydliga företagsriktade tjänster som t.ex. CRM-system att hyra, SAP-implementationer och Exchange. Men utöver detta kan man nämna exempelvis Google Maps och Google Apps. Ska man dra konceptet till sin spets är webben till sin natur SaaS-baserad. I SaaS kan man alltså mosa in mängder av Internettjänster. Poängen är snarare att de betalas via hyra och driftas av tredje part.</p>
<p>Men SaaS inkluderar också i viss mån tendensen att flytta ut applikationer från skrivbordet till Internet. Istället för att köra Office, kan jag använda Google Docs. Istället för bildbehandlingsprogram kan jag använda <a href="http://www.splashup.com/">Splashup</a>, Picasa och Flickr. Det här är en spännande marknad som Microsoft med Windows Azure satsar på genom <a href="http://dev.live.com/">Live Services</a>. En stor utmaning med en mer flytande gräns mellan webb och desktop är hur applikationer hanterar offline- och onlinelägen och hur man åstadkommer en mer integrerad användarupplevelse. Här finns mycket att göra och värt att hålla ögonen på är, utöver nämnda Live Services, tekniker som JavaFX, AIR/Flash och Silverlight. Även HTML 5 är spännande i och med vad det innebär för mer kompetenta och åtkomliga SaaS-tjänster.</p>
<p>Med begreppen på plats vill jag gärna utmåla några fokusområden som jag tror kan bli särskilt intressanta. Mer om det i <a title="nästa inlägg" href="http://www.isotop.se/2009/10/moln-i-praktiken-del-2/">nästa inlägg</a>, men följande punkter tror jag blir svåra att missa.</p>
<p>1. Skalbar och billig hosting (IaaS)</p>
<p>2. Möjligheten att snabbt skapa ett lätt serverlager för RIA med befintliga PaaS-tjänster</p>
<p>3. Affärsmöjligheter med SaaS</p>
<p>4. Bygga bättre applikationer snabbare och billigare med bra PaaS-tjänster</p>
<p>Men som sagt - mer detaljer om det i <a title="nästa inlägg" href="http://www.isotop.se/2009/10/moln-i-praktiken-del-2/">nästa inlägg</a>&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.isotop.se/2009/10/moln-i-praktiken-del-1/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ghost4Koin</title>
		<link>http://www.isotop.se/2009/05/ghost4koin/</link>
		<comments>http://www.isotop.se/2009/05/ghost4koin/#comments</comments>
		<pubDate>Wed, 06 May 2009 10:49:22 +0000</pubDate>
		<dc:creator>Tommy (Isotop)</dc:creator>
		
		<category><![CDATA[Blogg]]></category>

		<category><![CDATA[Kunder]]></category>

		<category><![CDATA[Tommy]]></category>

		<category><![CDATA[Flash]]></category>

		<category><![CDATA[Spel]]></category>

		<guid isPermaLink="false">http://platon/wordpress/?p=568</guid>
		<description><![CDATA[Isotop tävlade om vem som kan bygga det bästa spelet i Flash på mindre än 4 KB.]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal"><span lang="SV">I dagens läge, när de flesta har tillgång till bredband, är inte storleken på filerna någonting man behöver bry sig särskillt mycket om. Det känns som att var och varannan site streamar video i HD-kvalitet nu för tiden. </span></p>
<p class="MsoNormal"><span lang="SV">Men det var inte så länge sedan som utvecklare var tvungna att att tänka på modem och långsamma uppkopplingar. När bilder komprimerades till bristningsgränsen och skillnaden mellan en swf på 30KB och 130KB var enorm.</span></p>
<p class="MsoNormal"><span lang="SV">I början av mars avgjordes en tävling som gick ut på att koda ett spel i flash som väger mindre än 4 kilobytes. Isotop var en av deltagarna i tävlingen, där tre personer bestämde sig för att ta reda på vad man kan åstakomma med denna minst sagt knepiga begränsning.</span></p>
<p class="MsoNormal">
<p class="MsoNormal"><strong><span lang="SV">Resultatet: Ghost4Koin</span></strong></p>
<p class="MsoNormal"><span lang="SV"><img class="alignnone size-full wp-image-572" title="ghost4koin" src="/wp-content/uploads/ghost4koin.png" alt="ghost4koin" width="645" height="361" /><br />
</span></p>
<p class="MsoNormal"><span lang="SV"><a href="http://www.gamepoetry.com/blog/4k-flash-ghost4koin/"></a><a class="sitelink" href="http://www.gamepoetry.com/blog/4k-flash-ghost4koin/"><span lang="SV">http://www.gamepoetry.com/blog/4k-flash-ghost4koin/</span></a></span></p>
<p class="MsoNormal"><span lang="SV"><span lang="SV"><br />
</span></span></p>
<p class="MsoNormal">
<p class="MsoNormal"><strong><span lang="SV">Hur mycket är 4K?</span></strong></p>
<p class="MsoNormal">
<p class="MsoNormal"><span lang="SV">4 kilobyte är verkligen inte mycket utrymme.</span></p>
<p class="MsoNormal"><span lang="SV">Loggan på google.com väger till exempel 7,4 KB. Det är nästan dubbelt så mycket.</span></p>
<p class="MsoNormal"><span lang="SV">För att sätta detta i någon slags relation så provade vi att embedda en minimal bitmap (den här: <img class="alignnone size-full wp-image-573" title="verysmallbitmap" src="/wp-content/uploads/bmp100.jpg" alt="verysmallbitmap" width="23" height="6" /> ) i flashdevelop och kompilera. Enbart den bilden gjorde att swf:en vägde 4kb.</span></p>
<p class="MsoNormal"><span lang="SV"><br />
</span></p>
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal"><strong><span lang="SV">Planen</span></strong></p>
<p class="MsoNormal"><span lang="SV">Planen från början var att få till någonting som var så tekniskt imponerande som möjligt, och hur gör man det? Man tänker ut hur man på enklaste vis skulle lösa uppgiften och gör tvärtom =)</span></p>
<p class="MsoNormal"><span lang="SV"><em>Grafik:</em> Enklaste vägen skulle vara att använda flash inbyggda drawing-api (rita linjer, fyll dem med färg), därför valde vi att jobba med bitmapgrafik. Detta ger en tydligare oldschool-känsla, och var en stor utmaning med tanke på föregående test.</span></p>
<p class="MsoNormal"><span lang="SV"><em>Ljud:</em> Att stoppa in ljud i en swf på 4KB är inte att rekommendera. Det tar alldeles för mycket utrymme. Givetvis måste vi ha ljud med.</span></p>
<p class="MsoNormal"><span lang="SV"><em>Banor: </em>När man har så begränsat med minne vore det enklaste att göra en så enkel bana som möjligt, helst utan scrolling. Därför var ett av de viktigaste målen att generara så stora världar som möjligt.</span></p>
<p class="MsoNormal"><strong>Resultatet<span style="font-weight: normal;"> </span></strong></p>
<p class="MsoNormal"><span lang="SV">Samtliga delar i planen genomfördes. Detta innebar bland annat att vi var tvungna att konstruera ett eget bildformat och generera allt ljud dynamiskt.</span></p>
<p class="MsoNormal"><span lang="SV">Spelet slutade på en 4:e plats i gamepoetrys tävling (2:a i Audience Choice).</span></p>
<p class="MsoNormal"><span lang="SV">Jag tror personligen att det beror på att inget utav målen med spelet hade något att göra med gameplay. Sanningen är att det oftast är de enklare spelen som är roligast att spela.</span></p>
<p class="MsoNormal"><span lang="SV">Här finns en lista med samtliga bidrag spelbara – och domarnas kommentarer (se särskillt <em>4k Pillars</em>, <em>Falling with style</em> samt det svenska vinnarbidraget <em>A-Steroids</em>).</span></p>
<p class="MsoNormal"><a class="sitelink" href="http://www.gamepoetry.com/blog/4k_flash_march_09/"><span lang="SV">http://www.gamepoetry.com/blog/4k_flash_march_09/</span></a></p>
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal"><strong>Summering</strong></p>
<p class="MsoNormal"><span lang="SV">Att delta I tävlingen innebar en intressant och rolig utmaning där vi tvingades lösa problem vi inte varit med om tidigare.</span></p>
<p class="MsoNormal"><span lang="SV">Vi hade kanske hamnat lite bättre om vi fokuserat på gameplay, men för oss låg utmaningen i det tekniska.</span></p>
<p class="MsoNormal"><span lang="SV">Vi hade kunnat lägga till ganska mycket mer funktionalitet om vi hade struntat i exempelvis ljudet, men det kändes väldigt stämningssättande med de underbara retro-tonerna. Men i slutänden handlar det ändå om att ha roligt, och kanske lära sig något på köpet.</span></p>
<p class="MsoNormal"><span lang="SV">Man kan inte undgå att tänka på hur imponerande spelskaparna var i slutet på 70-talet när en spelmaskin inte hade mer minne än så här.</span></p>
<p class="MsoNormal"><a class="sitelink" href="http://sv.wikipedia.org/wiki/Atari_2600"><span lang="SV">http://sv.wikipedia.org/wiki/Atari_2600</span></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.isotop.se/2009/05/ghost4koin/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Kravhantering med mockups</title>
		<link>http://www.isotop.se/2009/03/kravhantering-med-mockups/</link>
		<comments>http://www.isotop.se/2009/03/kravhantering-med-mockups/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 12:16:47 +0000</pubDate>
		<dc:creator>Christer (Isotop)</dc:creator>
		
		<category><![CDATA[Blogg]]></category>

		<category><![CDATA[Verktyg]]></category>

		<guid isPermaLink="false">http://platon/wordpress/?p=292</guid>
		<description><![CDATA[Balsamiq erbjuder ett grymt verktyg som gör det enkelt att skapa prototyper.]]></description>
			<content:encoded><![CDATA[<p>Ibland är det svårt att samla in och dokumentera kraven i ett projekt. Ofta beror svårigheterna på att många inblandade ska enas om en gemensam bild. En bild som man individuellt har i sitt huvud. Webbsajter, applikationer och system blir allt mer komplexa vilket ställer stora krav på allas förmåga att tänka abstrakt. Att kunna visualisera hur resultatet kommer att bli är inte alltid så lätt. I de fall man tror sig ha en gemensam bild visar det sig ofta under resans gång att bilden inte var så gemensam som man kanske trodde.</p>
<p>Ett bra sätt att förbättra kravarbetet och precisionen i projekten är därför att jobba med skisser och prototyper, så kallade mockups.</p>
<p>Jag har hittat ett verktyg för detta som vi på Isotop gillar skarpt: <a class="sitelink" href="http://www.balsamiq.com/products/mockups" target="_blank">Balsamiq Mockups</a> från <a class="sitelink" href="http://www.balsamiq.com/" target="_blank">Balsamiq Studios</a></p>
<p><img class="alignnone size-medium wp-image-332" title="balsamiq-example1" src="/wp-content/uploads/2009/03/balsamiq-example1-300x264.jpg" alt="balsamiq-example1" width="300" height="264" /></p>
<p>Med detta verktyg går det snabbt att göra prototyper över gränssnitt och funktionalitet för såväl webbsajter som applikationer. Verktyget är gjort i Flash och kan köras antingen frisåtående som en AdobeAIR-applikation, men finns också som plugin till <a class="sitelink" href="http://atlassian.com/confluence" target="_blank">Confluence</a> och <a class="sitelink" href="http://atlassian.com/jira" target="_blank">Jira</a> (två andra verktyg som vi på Isotop använder dagligen).</p>
<p>Kolla in denna demonstrationsvideo om du vill se mer av vad man kan göra med Balsamiq:</p>
<p><object width="400" height="225" data="http://vimeo.com/moogaloop.swf?clip_id=2552431&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=2552431&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /></object><br />
<a class="sitelink" href="http://vimeo.com/2552431">Balsamiq Mockups for Desktop</a> from <a class="sitelink" href="http://vimeo.com/balsamiq">Balsamiq Studios</a> on <a class="sitelink" href="http://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.isotop.se/2009/03/kravhantering-med-mockups/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
