<?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>Crisp&#039;s Blog &#187; Olle Hallin</title>
	<atom:link href="http://blog.crisp.se/author/ollehallin/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.crisp.se</link>
	<description>from the Crisp Consultants</description>
	<lastBuildDate>Thu, 16 May 2013 15:05:14 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Äventyr i molnet &#8211; del 4</title>
		<link>http://blog.crisp.se/2011/02/17/ollehallin/1297981673041?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=1297981673041</link>
		<comments>http://blog.crisp.se/2011/02/17/ollehallin/1297981673041#comments</comments>
		<pubDate>Thu, 17 Feb 2011 11:27:53 +0000</pubDate>
		<dc:creator>Olle Hallin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[janrain]]></category>
		<category><![CDATA[openid]]></category>
		<category><![CDATA[saas]]></category>
		<category><![CDATA[social]]></category>
		<category><![CDATA[software-as-a-service]]></category>

		<guid isPermaLink="false">http://blog.crisp.se/2011/02/17/1297981673041</guid>
		<description><![CDATA[<p>Jag ber om ursäkt för det långa uppehållet sedan förra delen. Förklaringen stavas <a href="http://goo.gl/BnM45" target="_new">Valle</a>. Valle är en hund, närmare bestämt en Lagotto Romagnolo. Valle är nu snart ett år gammal, så nu har jag "fritid" igen. Wohoo!</p>
<p>Denna gång skall det handla om något som så gott som alla webappar behöver, nämligen användarhantering och autenticering.</p>
<p>Handen på hjärtat, visst vore det skönt att kunna plugga in en färdig användarhantering, och kunna låta folk logga in med sina redan existerande Facebook/Google/Windows Live/Twitter/<em>whatever</em>-konton?</p>
<p>Om svaret är ja, läs vidare!</p>]]></description>
			<content:encoded><![CDATA[<p>Jag ber om ursäkt för det långa uppehållet sedan förra delen. Förklaringen stavas <a href="http://goo.gl/BnM45" target="_new">Valle</a>. Valle är en hund, närmare bestämt en Lagotto Romagnolo. Valle är nu snart ett år gammal, så nu har jag &#8220;fritid&#8221; igen. Wohoo!</p>
<p>Denna gång skall det handla om något som så gott som alla webappar behöver, nämligen användarhantering och autenticering.</p>
<p>Handen på hjärtat, visst vore det skönt att kunna plugga in en färdig användarhantering, och kunna låta folk logga in med sina redan existerande Facebook/Google/Windows Live/Twitter/<em>whatever</em>-konton?</p>
<p>Om svaret är ja, läs vidare!</p>
<h1>OpenID</h1>
<p>Det finns en standard för tredjepartsautenticering som heter <a href="http://openid.net">OpenID</a>, som så gott som alla stora sociala nätverk stödjer.</p>
<p>Problemet med OpenID är att det är ganska pilligt att få på plats, och det är inte helt uppebart för en användare hur han skall logga in med sitt OpenID.</p>
<p>Ett annat problem är att alla sociala nätverk har olika API:er för att hämta användardatat, efter att själva autenticeringen är klar.</p>
<p>Du måste dessutom bygga själva logindialogen själv. Detta är inte speciellt svårt, men ändock ett jobb.</p>
<p>Här kommer <a href="http://janrain.com">Janrain</a> till din räddning!</p>
<h1>Janrain</h1>
<p>Janrain är en mäklare för tredjepartsautenticering.</p>
<p>De säger själva att de erbjuder användarhantering som en <em>Software-as-a-Service</em> (SaaS).</p>
<p>Janrain erbjuder ett uniformt API för att accessa de olika sociala nätverk som de stödjer. Det är dock vissa skillnader på vilka data om en användare som de olika nätverken lämnar ut. Till exempel så lämnar LinkedIn inte ut epostadresser, vilket åtminstone Google, Facebook och Windows Live gör.</p>
<p>Med Janrain är det lätt att lägga till användarhantering. Det går i princip till så här:</p>
<ol>
<li>Registrera din app på janrain.com. Du kan logga in med vilket som helst av dina sociala konton (Janrain äter sin egen hundmat!)</li>
<li>Ange vilka sociala nätverk du vill använda för autenticering.</li>
<li>Kör en wizard på Janrain som genererar en snutt Javascript som du kopierar in till din webbsida, omedelbart före <escape></body></escape>.</li>
<li>Wizarden genererar också en kodsnutt för HTML-länken <b>Logga in&#8230;</b></li>
<li>Implementera en callbackrutin som anropas av Janrain när en användare har autenticerat sig. URL:en till denna callbackrutin bestämmer du själv, och du anger den i wizarden i steg 3.</li>
<li>Callbackrutinen anropas av Janrain med en HTTP POST som har en enda parameter, <code>token</code>. Denna token använder du tillsammans med den applikationsidentitet som du fick i steg 1 för att anropa ett Janrain API för att hämta användarinfon. API:et är en vanlig HTTP POST, som returnerar användardatat antingen i XML- eller JSON-format.</li>
</ol>
<p>Klart!</p>
<p>Nu har du en komplett användarhantering, och dina användare kan direkt logga in och börja använda din sajt.</p>
<p>Klick på loginlänken öppnar en dialogbox som automatgenereras av Janrain-scriptet. I denna dialog kan användaren välja vilket nätverk han vill logga in på din sajt med.</p>
<p>I användardatat du får tillbaka från Janrain ingår en globalt unik OpenID-identitet. Denna kan du använda som nyckel för de applikationsspecifika användardata du vill spara i din egen databas. Du behöver <em>inte</em> lagra själva användardatat (namn, epostadress och så), för det får du ju serverat på nytt varje gång någon loggar in till din sajt.</p>
<p>Vill du stödja ett nätverk till? Logga in på janrain.com och ändra i kontrollpanelen för din app. (I många fall måste du dessutom registrera din Janrain-app hos nätverket i fråga.)</p>
<p>På janrain.com har din app en egen kontrollpanel där du kan se statistik på inloggningarna. Troligen inte det första du skulle bygga om du byggde användarhanteringen själv.</p>
<p>Funktioner för registering, glömt lösenord med mera finns ju redan på de olika sociala nätverken, så det slipper du också bygga.</p>
<p>Så sammantaget får du en komplett användarhantering på några timmar!</p>
<h1>Så vad kostar det?</h1>
<p>Det här låter för bra för att vara sant, det måste finnas en hake. Det kostar säkert skjortan?</p>
<p>Janrain kör med principen <em>första silen gratis</em>, dvs det är kostnadsfritt upp till 2500 unika användare och 6 st sociala nätverk.</p>
<p>För 100 USD/år kan du ha 5000 unika användare, och 12 sociala nätverk. Då får du dessutom tillgång till mer användardata än i gratisvarianten.</p>
<p>Räcker inte detta finns ytterligare en variant, men prislappen på denna är inte publicerad.</p>
<p>(Om det går så bra så att du får fler än 5000 unika användare är det bara att gratulera! Du har säkert råd med nästa nivå&#8230;)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.crisp.se/2011/02/17/ollehallin/1297981673041/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Mönster för flertrådade enhetstester</title>
		<link>http://blog.crisp.se/2011/02/17/ollehallin/1297970083926?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=1297970083926</link>
		<comments>http://blog.crisp.se/2011/02/17/ollehallin/1297970083926#comments</comments>
		<pubDate>Thu, 17 Feb 2011 08:14:43 +0000</pubDate>
		<dc:creator>Olle Hallin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[concurrent]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://blog.crisp.se/2011/02/17/1297970083926</guid>
		<description><![CDATA[<p>Detta är ett designmönster för hur man skriver ett enhetstest som utför samma test samtidigt i flera trådar.
</p>
<p>
Genom att utnyttja <code>java.util.concurrent</code> på ett smart sätt säkerställer man maximal samtidighet, vilken <em>kan</em> avslöja trådbuggar.
</p>
<p>
Kom ihåg: det går inte att bevisa att ett program är fritt från trådbuggar. Det handlar om att göra det <em>sannolikt</em> att det fungerar i en flertrådad miljö.
</p>
<p>
Nyfiken? Läs på...
</p>]]></description>
			<content:encoded><![CDATA[<p>Detta är ett designmönster för hur man skriver ett enhetstest som utför samma test samtidigt i flera trådar.
</p>
<p>
Genom att utnyttja <code>java.util.concurrent</code> på ett smart sätt säkerställer man maximal samtidighet, vilken <em>kan</em> avslöja trådbuggar.
</p>
<p>
Kom ihåg: det går inte att bevisa att ett program är fritt från trådbuggar. Det handlar om att göra det <em>sannolikt</em> att det fungerar i en flertrådad miljö.
</p>
<h1>Kodmall</h1>
<p><code>
<pre><escape>

    @Test
    public void testSomething() {
        assertTrue(true);
    }

    @Test
    public void testConcurrentAuthInfoResponse() throws InterruptedException {
        final int threads = 100;

        final CountDownLatch readyToStart = new CountDownLatch(threads);
        final CountDownLatch startingGun = new CountDownLatch(1);
        final CountDownLatch finishLine = new CountDownLatch(threads);
        final AtomicInteger failCount = new AtomicInteger();

        for (int i=0; i<threads; i++) {
            new Thread(new Runnable() {

                @Override
                public void run() {
                    try {
                        // Notify the starter that I'm ready...
                        readyToStart.countDown();

                        // Wait for the starter to fire the starting gun...
                        startingGun.await();

                        // Do the test
                        testSomething();
                    } catch (InterruptedException ignore) {
                    } catch (Exception e) {
                        // The test failed, notify the main thread
                        failCount.incrementAndGet();
                    } finally {
                        // I'm done!
                        finishLine.countDown();
                    }
                }
                
            }).start();
        }

        // Wait for all threads to become ready...
        readyToStart.await();

        // Fire the starting gun...
        startingGun.countDown();

        // Wait until all threads are done...
        finishLine.await();

        // Assert that none has failed...
        assertEquals(0, failCount.intValue());
    }

</escape></pre>
<p></code></p>
<p>Visserligen en hel del boilerplate, men det kan man faktorera ut till en Template á là Springs JdbcTemplate.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.crisp.se/2011/02/17/ollehallin/1297970083926/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Äventyr i molnet &#8211; del 3</title>
		<link>http://blog.crisp.se/2009/12/05/ollehallin/1260047566112?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=1260047566112</link>
		<comments>http://blog.crisp.se/2009/12/05/ollehallin/1260047566112#comments</comments>
		<pubDate>Sat, 05 Dec 2009 10:12:46 +0000</pubDate>
		<dc:creator>Olle Hallin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[JDO]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[Tapestry]]></category>

		<guid isPermaLink="false">http://blog.crisp.se/2009/12/05/1260047566112</guid>
		<description><![CDATA[Nu n&#228;r det finns en f&#246;rsta &#34;Hello, World&#34;-version av Eats-o-matic i drift, &#228;r det dags att fundera p&#229; allvar p&#229; den vidare utvecklingen.<br />
<br />
F&#246;r att det skall bli n&#229;got s&#229; beh&#246;vs det bland annat m&#246;jlighet att lagra data, samt ett ramverk f&#246;r att skapa sj&#228;lva webbapplikationen med.<br />
<br />
Jag har kollat igenom ett antal av de alternativ som finns f&#246;r GAE och kommit fram till ett val som jag tror passar mig som utvecklare och Eats-o-matic som applikation.<br />
<p>&#160;</p>]]></description>
			<content:encoded><![CDATA[<p><strong>Inledning</p>
<p></strong>Nu n&auml;r det finns en f&ouml;rsta &quot;Hello, World&quot;-version av Eats-o-matic i drift, &auml;r det dags att fundera p&aring; allvar p&aring; den vidare utvecklingen.</p>
<p>F&ouml;r att det skall bli n&aring;got s&aring; beh&ouml;vs det bland annat m&ouml;jlighet att lagra data, samt ett ramverk f&ouml;r att skapa sj&auml;lva webbapplikationen med.</p>
<p>Jag har kollat igenom ett antal av de alternativ som finns f&ouml;r GAE och kommit fram till ett val som jag tror passar mig som utvecklare och Eats-o-matic som applikation.</p>
<p><strong>Persistens<br />
</strong><br />
Vi tar det enkla beslutet f&ouml;rst, val av persistensmekanism.</p>
<p>GAE erbjuder tv&aring; programmeringsgr&auml;nssnitt f&ouml;r att lagra data: Java Data Objects (JDO ) och Java Persistence Architecture (JPA). (Egentligen finns det ett tredje, l&aring;gniv&aring;gr&auml;nssnittet mot Googles egna Big Tables. Men detta t&auml;nker jag inte ens beakta, f&ouml;r d&aring; har man l&aring;st sig h&aring;rt mot GAE:s driftsmilj&ouml;, vilket b&auml;r mig emot.)</p>
<p>JDO &auml;r en ganska gammal och bepr&ouml;vad standard, medan JPA &auml;r t&auml;mligen f&auml;rskt. Varf&ouml;r JDO inte har f&aring;tt st&ouml;rre spridning f&ouml;rst&aring;r jag faktiskt inte. Det passar utm&auml;rkt f&ouml;r en stor m&auml;ngd av till&auml;mpningar. Det &auml;r heller ingen brist p&aring; effektiva, billiga och stabila implementationer.</p>
<p>(Vissa elaka tungor i blogosf&auml;ren s&auml;ger att Sun tog fram JPA efter starka p&aring;tryckningar fr&aring;n de ledande RDBMS-leverant&ouml;rerna, vars produkter inte fungerar s&aring; bra med JDO.)</p>
<p>JDO togs ursprungligen fram som ett standard-API f&ouml;r att lagra data i stort sett vilket medium som helst, medan JPA mer eller mindre f&ouml;ruts&auml;tter att datat skall lagras i en relationsdatabas.</p>
<p>I GAE s&aring; hamnar datat i b&auml;gge fallen i BigTable, som varken &auml;r en objektdatabas eller en relationsdatabas.</p>
<p>I GAE s&aring; anv&auml;nds i b&auml;gge fallen DataNucleus som verktyg f&ouml;r att vid byggtillf&auml;llet modifiera dina persistenta klasser s&aring; att de g&aring;r att lagra. S&aring; valet mellan JDO och JPA avg&ouml;rs av vilket API som passar applikationen b&auml;st.</p>
<p>Jag har jobbat en del med JPA och Hibernate och MySQL, vilket inte var helt friktionsfritt. Det m&auml;rks att objekt inte &auml;r rader i en tabell, utom i det mest triviala fallet. (Jag har lusl&auml;st Hibernatedokumentationen flera g&aring;nger, och &auml;r fortfarande inte s&auml;ker p&aring; att jag f&ouml;rst&aring;r allt som st&aring;r d&auml;r&#8230;)</p>
<p>Jag har &auml;ven jobbat med db4o, vilket var betydligt mer r&auml;ttframt. db4o och JDO har v&auml;ldigt lika programmeringsmodeller.</p>
<p><em>S&aring; jag satsar mina pengar p&aring; JDO.</em></p>
<p>Kombon JDO + DataNucleus &auml;r speciellt tilltalande, eftersom DataNucleus kan anv&auml;nda i stort sett vad som helst f&ouml;r att persistera JDO-objekt; db4o, SQL-databaser, XML-filer, Excel-filer och s&aring; vidare.</p>
<p>Detta betyder att jag kommer att kunna enhetstesta min persistenskod mot en lokal db4o-fil, utan att beh&ouml;va dra ig&aring;ng vare sig en separat db4o-server eller GAE:s integrationtestmilj&ouml;. <em>Detta betyder tidsbesparingar!</p>
<p></em>Som sagt, persistensen &ouml;verl&aring;ter jag med varm hand &aring;t JDO.</p>
<p><strong>Webbramverk</strong></p>
<p>H&auml;r &auml;r valet betydligt sv&aring;rare.</p>
<p>Jag &auml;r en gammal anh&auml;ngare av Tapestry, som &auml;r ett komponentorienterat ramverk i samma skola som t.ex. Wicket och JSF. Jag har jobbat med Tapestry mer eller mindre kontinuerligt sedan 2003 fram till den dag som idag &auml;r.</p>
<p>Tyv&auml;rr fungerar inte senaste versionen av Tapestry (5.1) i GAE p&aring; grund av Tapestry anv&auml;nder en XML-parser som inte finns med p&aring; GAE:s <em>white list</em>. </p>
<p>Wicket l&auml;r ocks&aring; ha en del problem i GAE. Jag har bara h&ouml;rt det ryktesv&auml;gen och vet inte exakt vad de best&aring;r i och om de o&ouml;verstigliga. Men eftersom jag inte kan Wicket s&aring; vill jag inte b&aring;de l&auml;ra mig Wicket och ta strulet med att f&aring; det att funka i GAE.</p>
<p>JSF har jag st&ouml;tt p&aring; i ett projekt, och l&auml;rt mig att avsky. Maken till kr&aring;ngligt ramverk f&aring;r man leta efter. (JSF 2 l&auml;r vara b&auml;ttre, men det har jag inte provat. Jag &auml;r inte heller lockad att prova.)</p>
<p>Sedan finns det c:a 100 stycken MVC-ramverk; Spring MVC, Struts, Struts 2 osv. Men har man en g&aring;ng jobbat med ett komponentramverk s&aring; vill man inte tillbaka. Det k&auml;nns helt enkelt inte bra.</p>
<p>S&aring; mitt val &auml;r egentligen ett blindval: jag v&auml;ljer ett ramverk som garanterat fungerar i GAE och som &auml;r komponentorienterat, men som jag aldrig har jobbat med: Google Web Toolkit (GWT).</p>
<p>Att GWT fungerar i GAE tar jag f&ouml;r givet, eftersom b&auml;gge &auml;r skapade av Google.</p>
<p>Jag har kollegor p&aring; Crisp som brukar hylla GWT, och jag litar p&aring; dem. Dessutom har jag d&auml;rmed support p&aring; n&auml;ra h&aring;ll!</p>
<p>Jag tror &auml;ven att GWT kommer att passa bra eftersom jag vill att Eats-o-matic skall f&aring; ett anv&auml;ndargr&auml;nssnitt mer likt en traditionell applikation &auml;n en webbapplikation. Ni vet, <em>drag-and-drop</em>,&nbsp; <em>tab completion<strong> </strong></em>och liknande. Kort sagt, en <em>Rich Internet Application&#8230;</em></p>
<p>Och eftersom jag inte &auml;r n&aring;gon Javascript-guru men kan Java r&auml;tt s&aring; bra, s&aring; hoppas jag p&aring; att GWT:s javascriptabstraktion inte l&auml;cker allt f&ouml;r mycket, utan h&aring;ller vad den lovar.</p>
<p><strong>Sammanfattningsvis<br />
</strong>Persistens: JDO <br />
Webbramverk: GWT</p>
<p><em></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.crisp.se/2009/12/05/ollehallin/1260047566112/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Äventyr i molnet &#8211; del 2</title>
		<link>http://blog.crisp.se/2009/12/01/ollehallin/1259694861434?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=1259694861434</link>
		<comments>http://blog.crisp.se/2009/12/01/ollehallin/1259694861434#comments</comments>
		<pubDate>Tue, 01 Dec 2009 08:14:21 +0000</pubDate>
		<dc:creator>Olle Hallin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.crisp.se/2009/12/01/1259694861434</guid>
		<description><![CDATA[Google har en Eclipse-plugin som automatiserar bygge, integrationstest &#38; drifts&#228;ttning av applikationer f&#246;r Google App Engine.
<p> Men hur g&#246;r man om man liksom jag tycker att det skall g&#229; att bygga och drifts&#228;tta fr&#229;n kommandoraden? </p>
<p> Mitt svar &#228;r Maven. Tyv&#228;rr finns det inte (&#228;nnu) n&#229;gon Mavenplugin, s&#229; det blir lite meckigt att f&#229; det att fungera.</p>
<p><br />
</p>]]></description>
			<content:encoded><![CDATA[<p><strong>Inledning</strong></p>
<p>Google har en Eclipse-plugin som automatiserar bygge, integrationstest &amp; drifts&auml;ttning av applikationer f&ouml;r Google App Engine.</p>
<p> Men hur g&ouml;r man om man liksom jag tycker att det skall g&aring; att bygga och drifts&auml;tta fr&aring;n kommandoraden? Eller om man inte anv&auml;nder Eclipse? </p>
<p> Mitt svar &auml;r Maven. Tyv&auml;rr finns det inte (&auml;nnu) n&aring;gon Mavenplugin, s&aring; det blir lite meckigt att f&aring; det att fungera.</p>
<p><strong>Varf&ouml;r &auml;r detta viktigt?</strong></p>
<p>Missf&ouml;rst&aring; mig inte, jag tycker att det &auml;r suver&auml;nt att kunna bygga och testa inifr&aring;n Eclipse.</p>
<p> Men det &auml;r samtidigt v&auml;ldigt bra att ha ett byggskript som g&aring;r att k&ouml;ra obemannat fr&aring;n kommandoraden av f&ouml;ljande anledningar: </p>
<ul>
<li>Continuous Integration &#8211; bygg automatiskt fr&aring;n t.ex. Hudson efter varje incheckning</li>
<li>Dokumentation &#8211; ditt byggskript dokumenterar p&aring; ett k&ouml;rbart och f&ouml;rhoppningsvis portabelt s&auml;tt vad som beh&ouml;vs f&ouml;r att kunna bygga och leverera din produkt.</li>
<li>St&ouml;d f&ouml;r andra IDE:er &auml;n Eclipse. IntelliJ till exempel har mycket bra st&ouml;d f&ouml;r Maven.</li>
</ul>
<p><strong>Varf&ouml;r inte Ant?<br />
</strong><br />
Google levererar Ant-st&ouml;d f&ouml;r GAE. Jag gillar dock Maven b&auml;ttre, eftersom det &auml;r deklarativt. Beskriv vad du vill uppn&aring; s&aring; tar Maven hand om resten. <em>Convention over configuration.<strong> </strong></em>Med Ant m&aring;ste du skriva XML f&ouml;r varenda litet steg i bygget. Ingenting sker automatiskt.</p>
<p><strong>S&aring; vad beh&ouml;vs d&aring; f&ouml;r att bygga och integrationstesta med Maven?</p>
<p></strong>F&ouml;ljande f&ouml;ruts&auml;ttningar m&aring;ste vara uppfyllda f&ouml;r att det skall g&aring; att 1) bygga, 2) integrationstesta och 3) drifts&auml;tta till GAE med hj&auml;lp av Maven:</p>
<ol>
<li>GAEs jar-filer m&aring;ste vara nedladdningsbara fr&aring;n n&aring;got Maven-lager (<em>eng. repository</em>).</li>
<li>GAEs integrationstestmilj&ouml; m&aring;ste finnas tillg&auml;nglig f&ouml;r Mavens integrationstestfas.
    </li>
<li>Maven m&aring;ste instrueras hur man laddar upp den f&auml;rdiga war-filen till GAE f&ouml;r drifts&auml;ttning.
    </li>
</ol>
<p>Tyv&auml;rr &auml;r det ingen av dessa punkter som uppfylls p&aring; ett bra s&auml;tt i dagsl&auml;get!</p>
<p>Det finns dock s&auml;tt att l&ouml;sa det:</p>
<ol>
<li>GAE-jarerna kan installeras i ditt lokala Maven-repo med &#8216;mvn install-file &#8230;&#8217; eller (om ditt f&ouml;retag har ett eget Maven-lager) &#8216;mvn deploy-file &#8230;&#8217;</li>
<li>Maven kan delegera till Googles Antskript.</li>
</ol>
<p>Steg 1 &auml;r trivialt, och beh&ouml;ver bara g&ouml;ras en g&aring;ng per maskin och GAE-version. Steg 2 &auml;r det meckiga. En hel del XML blir det&#8230;</p>
<p><strong>Hav tr&ouml;st!</strong></p>
<p>Google brukar publicera sina artefakter p&aring; det centrala Maven-repot. GAE-jarerna kommer att finnas d&auml;r ocks&aring;. Dock oklart n&auml;r.</p>
<p>Google App Engine-killarna jobbar ihop med &quot;Mr Maven&quot; &#8211; Jason van Zyl p&aring; Sonatype &#8211; med att ta fram en riktigt Maven-plugin som t&auml;cker hela utvecklingskedjan.</p>
<p>S&aring; d&auml;rf&ouml;r har jag best&auml;mt mig f&ouml;r att strunta i integrationstest &amp; deploy fr&aring;n Maven s&aring; l&auml;nge. Jag n&ouml;jer mig med att kunna g&ouml;ra det inifr&aring;n Eclipse. Projektet &auml;r trots allt ett hobbyprojekt, och d&auml;rmed kan man l&auml;gga byggribban l&auml;gre.</p>
<p><em>H&auml;rn&auml;st: val av webbramverk och persistens-API</p>
<p></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.crisp.se/2009/12/01/ollehallin/1259694861434/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Äventyr i molnet &#8211; del 1</title>
		<link>http://blog.crisp.se/2009/11/22/ollehallin/1258921560000?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=1258921560000</link>
		<comments>http://blog.crisp.se/2009/11/22/ollehallin/1258921560000#comments</comments>
		<pubDate>Sun, 22 Nov 2009 09:26:00 +0000</pubDate>
		<dc:creator>Olle Hallin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[google-app-engine]]></category>
		<category><![CDATA[paas]]></category>
		<category><![CDATA[platform-as-a-service]]></category>

		<guid isPermaLink="false">http://blog.crisp.se/2009/11/22/1258921560000</guid>
		<description><![CDATA[Det &#228;r mycket prat om Cloud Computing nuf&#246;rtiden. Amazon EC2, Google App Engine, SpringSource CloudFoundry, och nu snart Windows Azure.<br />
<br />
Detta &#228;r f&#246;rsta delen i en serie som beskriver utvecklingen av Eats-o-matic, som kommer att k&#246;ras p&#229; Google App Engine (GAE).<br />
<br />
<em>H&#228;ng med!</em>]]></description>
			<content:encoded><![CDATA[<p><strong>Inledning</strong></p>
<p>Det är mycket prat om Cloud Computing nuförtiden. Amazon EC2, Google App Engine, SpringSource CloudFoundry, och nu snart Windows Azure.</p>
<p>Detta är första delen i en serie som beskriver utvecklingen av Eats-o-matic, som kommer att köras på Google App Engine (GAE).</p>
<p><em>Häng med!</em></p>
<p><strong>Gör det mest riskfyllda först<br />
</strong><br />
En bra princip inom agil systemutveckling är ju att göra det mest riskfyllda först, och i fallet GAE är det naturligtvis att driftsätta sin applikation.<em></em></p>
<p>Det här med applikationer i molnet, funkar det verkligen?<em>Har jag brutit mot någon av programmeringsreglerna? Hur hanterar jag applikationen när den väl är i drift? Finns det driftstatistik? Hur kommer man åt loggarna?</em></p>
<p>Så många frågor, snabbaste sättet att få svar är att testa!</p>
<p>Så jag registrerade ett GAE-konto och skapade applikations-ID:t &#8220;eats-o-matic&#8221;.</p>
<p>Sedan skrev jag en webbapplikation (<em>host, host)</em>, som jag deployade inifrån Eclipse.</p>
<p>Deployförfarandet var löjligt enkelt. Jag klickade på det blåa planet på knappraden, Eclipse frågade efter min GMail-address, lösenord samt GAE-identitet på applikationen.</p>
<p>Så snart applikationen var uppladdad fanns den tillgänglig på <a href="https://eats-o-matic.appspot.com">https://eats-o-matic.appspot.com</a>.</p>
<p>Så, då var det &#8220;svåraste&#8221; avklarat!</p>
<p><strong>Om Eats-o-matic</strong></p>
<p>Jag vill inte avslöja för mycket om applikationen i förväg, för då kommer du bara att sno min idé! Men jag kan säga så mycket som att det har med mat att göra.<em></em></p>
<p>Å nej, inte ännu en receptsajt!</p>
<p>Lugn, bara lugn. Du kommer att få se! (Se där, ännu en anledning att följa denna blogg&#8230;)</p>
<p><strong>Versionshantering i Google App Engine</strong></p>
<p>GAE gör det möjligt att ha flera versioner av samma applikation i drift samtidigt. Man väljer i GAE-konsolen vilken som skall vara default. Detta gör det möjligt att förhandstesta en ny version innan den går live.</p>
<p>Du kan testa detta själv på följande länkar:</p>
<ol>
<li><a href="https://1.latest.eats-o-matic.appspot.com">https://4.latest.eats-o-matic.appspot.com/</a> (OBS: webbläsaren kommer kanske att varna för felaktigt SSL-certifikat!)</li>
<li><a href="https://2.latest.eats-o-matic.appspot.com">https://5.latest.eats-o-matic.appspot.com/</a> (OBS: webbläsaren kommer kanske att varna för felaktigt SSL-certifikat!)</li>
</ol>
<p>Går du till <a href="eats-o-matic.appspot.com">https://eats-o-matic.appspot.com/</a> får du den som jag har satt till default.</p>
<p><strong>Alias</strong></p>
<p>Det är ju trevligt om ens applikation har ett namn inom ens egen domän. Detta är väldigt lätt ordnat.<br />
Lägg till ett CNAME som pekar på ghs.google.com i din DNS och lägg till detta alias i Google Apps-konsolen. Så man kommer även åt min app via <a href="http://eats-o-matic.hit.se">http://eats-o-matic.hit.se</a>, eftersom min privata Google Appsdomän heter hit.se.</p>
<p><strong>Google Apps och Google App Engine, vad är skillnaden?<br />
</strong><br />
Google Apps är en samling molnbaserade tjänster (Software as a Service, SaaS) som Google erbjuder företag och organisationer:</p>
<ul>
<li>Email (GMail)</li>
<li>Calendar</li>
<li>Chat (Google Talk)</li>
<li>Docs (ordbehandling, kalkyl och presentation)</li>
<li>Sites (wiki på steroider)</li>
<li>Apps (Google App Engine-applikationer)</li>
</ul>
<p>Så man kan säga att GAE är en delmängd av Google Apps.<br />
<strong>Härnäst<br />
</strong><br />
Jag kommer att skriva ett nytt blogginlägg varje gång som jag driftsätter en ny version, och skriva något om de erfarenheter som jag har gjort under den &#8220;sprinten&#8221;. Jag lovar inte någon speciell utgivningstakt, eftersom detta är ett hobbyprojekt. Hoppas ni har förstående för det.</p>
<p><em>Stay tuned&#8230;</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.crisp.se/2009/11/22/ollehallin/1258921560000/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Why Are Installers So Slow?</title>
		<link>http://blog.crisp.se/2008/09/09/ollehallin/1220951409836?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=1220951409836</link>
		<comments>http://blog.crisp.se/2008/09/09/ollehallin/1220951409836#comments</comments>
		<pubDate>Tue, 09 Sep 2008 11:10:09 +0000</pubDate>
		<dc:creator>Olle Hallin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.crisp.se/2008/09/09/1220951409836</guid>
		<description><![CDATA[<p>When I started with Windows programming back in 1990-something, Install Shield was de-facto standard. It wasn't too bad; installations were reasonably easy to create and quick to execute.
</p><p>
Then Windows Installer entered the arena. All the CPU power that Moore's Law gave us was consumed by Windows Installer.
</p><p>
Even the simplest program takes ages to install. But in most cases, the flow is straight-forward; accept Express installation, accept Terms &#038; Conditions and <em>GO!</em></p>]]></description>
			<content:encoded><![CDATA[<p>
When I started with Windows programming back in 1990-something, Install Shield was de-facto standard. It wasn&#8217;t too bad; installations were reasonably easy to create and quick to execute.
</p>
<p>
Then Windows Installer entered the arena. All the CPU power that Moore&#8217;s Law gave us was consumed by Windows Installer.
</p>
<p>
Even the simplest program takes ages to install. But in most cases, the flow is straight-forward; accept Express installation, accept Terms &#038; Conditions and <em>GO</em>!
</p>
<p>
Then Adobe entered the arena. Now installers aren&#8217;t installers anymore, they are self-extracting CD images!
</p>
<p>
(Probably created by some <em>InstallEverywhere/InstallAnywhere/InstallNowhere</em> animal that treats internet as some kind of removable CD drive!)
</p>
<p>
When you double-click the Acrobat Reader installer, it first takes 30-something seconds <em>preparing itself</em> and then launches Windows Installer which adds another 45-something seconds <em>collecting information</em> before finally asking where to install the stuff. <em>Preparing for what and collecting what information? It&#8217;s just a PDF viewer for gods sake!</em>
</p>
<p>
Compare this with Eclipse.
</p>
<p>
<em>Eclipse doesn&#8217;t even have an installer!</em>
</p>
<p>
Eclipse is distributed as a zip file. Unzip it to any location, send eclipse.exe as a short-cut to the desktop. Done helluvalot faster than the Acrobat Reader installer <em>prepares itself</em> and Windows Installer <em>collects information</em>.
</p>
<p>
Uninstall is even simpler: just nuke the Eclipse folder. Done.
</p>
<p>
Installation of multiple Eclipse versions side-by-side: Just unzip them to different folders. Done. No shared stuff that could collide. No dependency to C:WindowsSystem32. <em>Self-contained, reliable.</em>
</p>
<p>
It&#8217;s refreshing to see that installers can be that simple.
</p>
<p>
<em>Side bar: While I wrote this, I tried the Acrobat Reader installation. It discovered that I had upgraded online, and refused to start. Q: What reasons prevent two different versions of Acrobat Reader in the same machine? A: accidental complexity.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.crisp.se/2008/09/09/ollehallin/1220951409836/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
