<?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>Erlend Klakegg Bergheim &#187; programmering</title>
	<atom:link href="http://klakegg.net/category/programmering/feed/" rel="self" type="application/rss+xml" />
	<link>http://klakegg.net</link>
	<description></description>
	<lastBuildDate>Thu, 25 Nov 2010 09:43:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Destruction-driven development</title>
		<link>http://klakegg.net/2010/03/destruction-driven-development/</link>
		<comments>http://klakegg.net/2010/03/destruction-driven-development/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 10:27:46 +0000</pubDate>
		<dc:creator>Erlend</dc:creator>
				<category><![CDATA[programmering]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.averlend.com/?p=217</guid>
		<description><![CDATA[Jeg har kodet en del før jeg begynte på informatikk, men før stuiene var mønster (patterns) et ukjent begrep for meg. Siden PHP i lang tid var det foretrukne språket ble det gjerne gjort nyvinninger nettopp i dette språket (IRC-bot kan nevnes). For en tid tilbake nevnte jeg en av mine &#8220;gode&#8221; idéer fra den [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg har kodet en del før jeg begynte på informatikk, men før stuiene var mønster (patterns) et ukjent begrep for meg. Siden <a href="http://php.net/">PHP</a> i lang tid var det foretrukne språket ble det gjerne gjort nyvinninger nettopp i dette språket (IRC-bot kan nevnes).</p>
<p>For en tid tilbake nevnte jeg en av mine &#8220;gode&#8221; idéer fra den gang for noen med-studenter, og øyeblikkelig kom navnet &#8220;destruction-driven development&#8221; opp. Konseptet er i og for seg ikke noe jeg har sett igjen i løpet av årene på Gløshaugen, samt at gjennomføringen er bundet mot utvikling på nett, fortrinnsvis i skripingspråk.</p>
<p>Av og til er det greit å hente inn noen standard-filer som blir til over tid (av litt for mange asiater på <a href="http://vark.com/">Aardvark</a> kalt &#8220;custom framework&#8221;) for å lage til en demo, simpel to-siders løsning eller lignende, og i den forbindelse fant jeg at jeg ofte glemte å kjøre metoden som skulle vise resultatet til en bruker (mye &#8220;feilretting&#8221;). Med dette knyttet opp mot <a href="http://www.smarty.net/">Smarty</a> endte jeg opp med å ønske å lage sider slik:</p>
<pre class="brush: php;">&lt;?php

require_once(&quot;autoload.php&quot;);
Template::setTemplate(&quot;page.tpl&quot;);

$t = Template::getInstance();
$t-&gt;assign(&quot;title&quot;, &quot;Forside&quot;);
$t-&gt;assign(&quot;text&quot;, &quot;Lorem ipsum...&quot;);

?&gt;</pre>
<p>Konseptet er å la presentasjon foregår på et punkt hvor man er sikker på at all logikk er kjørt, og hvilket bedre punkt enn ved kjøring av  <a href="http://php.net/manual/en/features.gc.php">Garbage Collector (GC)</a> finnes? Ved å la destruction-metoden til template-objektet, som er en subklasse av Smarty, til å kjøre <a href="http://www.smarty.net/manual/en/api.display.php">display()</a>-metoden trenger ikke kodesnutten over å gjøre det, samt at jeg slipper å duplisere kode for å vise vise innhold. Se gjerne det vedlagte <a href="http://klakegg.net/wp-content/uploads/2010/02/destruct.zip">eksempelprosjekt</a> som benytter Smarty.</p>
<p>Jeg ser i utgangspunktet to problemer med overstående kode, hvilket er grunnen til at jeg ikke vil bruke dette konseptet i prosjekter:</p>
<ol>
<li>Det vil gjøre prosjektet vanskeligere å feilrette.</li>
<li>Implementasjonen av GC kan endre seg, og ved å oppdatere PHP kan man oppleve at alle sider er blanke. (Les: flere ting som potensielt kan gå galt)</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://klakegg.net/2010/03/destruction-driven-development/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bussorakel feirer 100</title>
		<link>http://klakegg.net/2010/02/bussorakel-feirer-100/</link>
		<comments>http://klakegg.net/2010/02/bussorakel-feirer-100/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 17:16:41 +0000</pubDate>
		<dc:creator>Erlend</dc:creator>
				<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[programmering]]></category>
		<category><![CDATA[bussorakel]]></category>

		<guid isPermaLink="false">http://blog.averlend.com/?p=195</guid>
		<description><![CDATA[I begynnelsen av november i fjor la jeg ut applikasjonen Bussorakel på Android Market, og etter flere versjoner med mange endringer og justeringer, ble nedlasting nummer 100 gjennomført. Allerede den første versjonen ble vurdert av IME, og jeg skulle likt å vite hva de tenker om dagens versjon. Jeg er fornøyd med det antallet, spesielt [...]]]></description>
			<content:encoded><![CDATA[<p>I begynnelsen av november i fjor la jeg ut applikasjonen Bussorakel på Android Market, og etter flere versjoner med mange endringer og justeringer, ble nedlasting nummer 100 gjennomført. Allerede den første versjonen ble <a href="http://www.ime.ntnu.no/blog/beta/?p=100">vurdert av IME</a>, og jeg skulle likt å vite hva de tenker om dagens versjon. Jeg er fornøyd med det antallet, spesielt siden målgruppen må sies å være noe snever:</p>
<blockquote><p>Personer med Android og som benytter busstilbudet i Trondheim.</p></blockquote>
<p>Selv om det er noe snevert har jeg merket at jeg har vært fokusert på å gi et godt tilbud til de som benytter den, og føler ansvar for å levere et bedre produkt og opplevelse i hver nye versjon. I helgen kunne jeg se at Android Market kunne rapportere følgende status for applikasjonen (i grensesnittet for utviklere):</p>
<p style="text-align: center;"><img class="size-full wp-image-198  aligncenter" title="Bussorakel på Android Market" src="http://klakegg.net/wp-content/uploads/2010/02/android-market-bussorakel.png" alt="Bussorakel på Android Market" width="630" height="47" /></p>
<p>Applikasjonen er det første programmet jeg har laget for Android, noe som har satt tydelige spor i kildekoden. Grensesnittet har også vært gjennom en del endringer, dagens utseende prøver å være tro mot platformen den kjører på, men i begynnelsen var jeg opptatt av å lage egen look&amp;feel, noe som kostet mer i koden enn jeg likte inntil jeg fant ut hvordan det egentlig skal gjøres.</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-208" title="Bussorakel, skjermskyt 1" src="http://klakegg.net/wp-content/uploads/2010/02/bussorakel-screenshot-1.png" alt="Bussorakel, skjermskyt 1" width="320" height="480" /> <img class="alignnone size-full wp-image-209" title="Bussorakel, skjermskyt 2" src="http://klakegg.net/wp-content/uploads/2010/02/bussorakel-screenshot-2.png" alt="Bussorakel, skjermskyt 2" width="320" height="480" /></p>
<p>Ikke bare det grafiske har endret seg, men også hvordan jeg henter svar på spørsmålene som kommer inn. I begynnelsen ble <a href="http://pipes.yahoo.com/">Yahoo Pipes</a> benyttet ved hjelp av en <a href="http://pipes.yahoo.com/klakegg/bussorakel">Bussorakel-pipe</a>, men tilbakemeldinger tilsa at den var treg, mellomlagret litt for lenge, og var offline litt for ofte. Fra og med siste utgave benytter jeg i stedet en kodesnutt som kjører på min hosting, og denne faller tilbake på <a href="http://www.idi.ntnu.no/~tagore/busstuc/">NTNU sin versjon</a> om <a href="http://team-trafikk.no/Bussorakel.asp">Team Trafikk sin</a> skulle bruke for lang tid på å svare eller er offline.</p>
<p>Etter at jeg gikk fra hvit bakgrunn til mørk bakgrunn har jeg sett at applikasjonen er avinstallert av flere (før lå jeg på ca. 85% aktive installasjoner), noe som minner meg på at det ikke er lett å få tilbakemeldinger fra brukere. Jeg skulle gjerne sett at Google la mer til rette for dette, for i grensesnittet for utviklere er det kun stjernene som vises, dog ikke hvor mange man har fått av hver, og alle kommentarer er utilgjengelig. Skal man øke kvaliteten på applikasjonene tror jeg dette må ordnes i lengden.</p>
<p><img class="alignright size-medium wp-image-203" title="QR-code for Bussorakel" src="http://klakegg.net/wp-content/uploads/2010/02/bussorakel-qrcode.png" alt="QR-code for Bussorakel" width="140" height="140" />Noe jeg ikke har sett i andre applikasjoner er at man kan trykke frem menyen, og derfra kunne dele programmet med andre gjennom en QR-code som andre kan scanne ved hjelp av en strekkodeleser på sin telefon. Dette lar seg også gjøre fra nettsider, og ved å scanne denne kan du få programmet på din telefon.</p>
<p>Per i dag er det også hele 4 ulike applikasjoner på Android Market som bringer tjenesten til Android, hvor min og <a href="http://sites.google.com/site/a2bsoft/projects/busstider">Busstider</a> av <a href="http://stuffandtech.blogspot.com/">Martin Mikkelborg Syvertsen</a> ser ut til å være de raskeste applikasjonene (bruker samme kilde).</p>
<p>Jeg  må også takke for alle tilbakemeldinger jeg har fått fra Martin og <a href="http://runemartin.com/">Rune Martin Andersen</a>, samt flere av mine med-studenter. Uten tilbakemeldinger kommer jeg ikke noen vei, og jeg håper flere benytter anledningen i fremtiden.</p>
]]></content:encoded>
			<wfw:commentRss>http://klakegg.net/2010/02/bussorakel-feirer-100/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NRK som filsystem</title>
		<link>http://klakegg.net/2009/05/nrk-som-filsystem/</link>
		<comments>http://klakegg.net/2009/05/nrk-som-filsystem/#comments</comments>
		<pubDate>Sat, 23 May 2009 07:22:45 +0000</pubDate>
		<dc:creator>Erlend</dc:creator>
				<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[Valgfrihet]]></category>
		<category><![CDATA[programmering]]></category>
		<category><![CDATA[nrk]]></category>
		<category><![CDATA[nrkfs]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.averlend.com/?p=148</guid>
		<description><![CDATA[Oppdatering: Koden er kopiert over til eget prosjekt på GitHub, benytt informasjon på GitHub for å komme i gang. Denne postingen er utdatert. Så var det laget; tilgang på NRK sin nett-TV som om tilgangen til innholdet skulle ligge lokal. I mitt forsøk på å gjøre om NRK Nett-TV til et virtuelt filsystem har jeg [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Oppdatering:</strong> Koden er kopiert over til <a href="http://wiki.github.com/klakegg/nrkfs">eget prosjekt</a> på GitHub, benytt informasjon på GitHub for å komme i gang. Denne postingen er utdatert.</p>
<p>Så var det laget; tilgang på NRK sin nett-TV som om tilgangen til innholdet skulle ligge lokal. I mitt forsøk på å gjøre om <a href="http://www1.nrk.no/nett-tv/">NRK Nett-TV</a> til et virtuelt filsystem har jeg valgt å bedrive &#8220;<a href="http://en.wikipedia.org/wiki/Screen_scraping">screen scraping</a>&#8221; av nettsidene, og ender opp med én spilleliste for hvert program som er lagt ut.</p>
<p>Jeg har valgt å benytte Python, sammen med modulene <a href="http://pypi.python.org/pypi/fuse-python">Fuse-Python</a> og <a href="http://www.crummy.com/software/BeautifulSoup/">BeautifulSoup</a>, så dette kan man sette opp på sin egen maskin som kjører Linux eller MacOS.</p>
<p>Filene er lagt ut <s>i kildekodekontrollen</s> <a href="http://github.com/klakegg/nrkfs">på GitHub</a>, og er delt opp i to filer:</p>
<ul>
<li>nrk.py &#8211; Bibliotek for å aksessere NRK Nett-TV</li>
<li>nrkfs.py &#8211; Koden som oppretter og fórer det virtuelle filsystemet</li>
</ul>
<p>For å montere filsystemet kjører man enkelt og greit:</p>
<p><code>./nrkfs.py nrk</code></p>
<p>Filen må være kjørbar, og &#8220;nrk&#8221; vil i dette tilfellet bli mappen som skal være monteringspunktet, denne mappen må allerede være opprettet. Gevinsten er ikke vanskelig å forestille seg:</p>
<p style="text-align: center;"><img class="size-full wp-image-152 aligncenter" title="NrkFS" src="http://klakegg.net/wp-content/uploads/2009/05/nrkfs.png" alt="NrkFS" width="554" height="422" /></p>
<p><s>Det er bevisst ikke opprettet noen debian-pakke eller egg-pakke av dette lille prosjektet enda, det får komme etter litt mer testing om det skulle være noen interesse for det.</s></p>
<p><strong>Oppdatering:</strong> Debian-pakke er tilgjengelig for <a href="http://github.com/klakegg/nrkfs/downloads">nedlasting fra GitHub</a> sammen med <a href="http://wiki.github.com/klakegg/nrkfs/installasjon">instruksjoner for installasjon</a>.</p>
<p>Håper noen har ønske om å teste dette ut og kan komme med tilbakemeldinger, er svært interessert i det som ikke måtte fungere.</p>
]]></content:encoded>
			<wfw:commentRss>http://klakegg.net/2009/05/nrk-som-filsystem/feed/</wfw:commentRss>
		<slash:comments>43</slash:comments>
		</item>
		<item>
		<title>Ordnett i terminalen</title>
		<link>http://klakegg.net/2009/02/ordnett-i-terminalen/</link>
		<comments>http://klakegg.net/2009/02/ordnett-i-terminalen/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 21:43:10 +0000</pubDate>
		<dc:creator>Erlend</dc:creator>
				<category><![CDATA[programmering]]></category>
		<category><![CDATA[ordnett]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.averlend.com/?p=119</guid>
		<description><![CDATA[Oppslagsverkene som er tilgjengelig på Ordnett er mye brukt i forbindelse med studiene, men jeg har etterhvert funnet det noe tungvint å skulle benytte nettsidene, dessverre. I et forsøk på å gjøre Ordnett lettere tilgjengelig for meg selv kodet jeg i høst en liten kodebit som lar meg gjøre oppslag direkte fra terminalen, som jo [...]]]></description>
			<content:encoded><![CDATA[<p>Oppslagsverkene som er tilgjengelig på <a href="http://ordnett.no/">Ordnett</a> er mye brukt i forbindelse med studiene, men jeg har etterhvert funnet det noe tungvint å skulle benytte nettsidene, dessverre.</p>
<p>I et forsøk på å gjøre Ordnett lettere tilgjengelig for meg selv kodet jeg i høst en liten kodebit som lar meg gjøre oppslag direkte fra terminalen, som jo alltid er oppe.</p>
<div id="attachment_121" class="wp-caption aligncenter" style="width: 515px"><img class="size-full wp-image-121" title="ordnett-terminal" src="http://klakegg.net/wp-content/uploads/2009/02/ordnett-terminal.png" alt="Bruk av ordnett fra terminalen." width="505" height="255" /><p class="wp-caption-text">Bruk av ordnett fra terminalen.</p></div>
<p>Jeg har nå lagt ut denne kodebiten <s>i kildekodekontrollen</s> <a href="http://github.com/klakegg/ordnett">på GitHub</a>, og de som måtte ønske å benytte den kan laste den ned. Det er fortsatt noen feil og mangler, men programmet i seg selv gjør jobben. Jeg skal få ordnet med noe versjonering og debian-pakker etterhvert for de som foretrekker det.</p>
<p>For de som måtte håpe at dette er et magisk program som gir ekstra tilganger, så beklager jeg. De som er koblet opp i <a href="http://www.ntnu.no/">NTNU</a> sitt nettverk vil få opp alle alternativene som er i koden, mens andre må forvente at tilganger koster penger med mindre nettleverandøren har en avtale.</p>
<p>Bruken av programmet er veldig enkel, for eksempel kan oppslag i norsk-engelsk-ordbøker, oppslag i bokmålsordboka og i alle tilgjengelige se slik ut:</p>
<p><code>ordnett -ne fritid<br />
ordnett -bok fritid<br />
ordnett fritid</code></p>
<p>Om noen skulle ta en titt på koden, så vet jeg at ikke alt er like bra, jeg skrev mesteparten kort tid etter at jeg begynte å programmere i Python, men får håpe det blir bedre etterhvert.</p>
<p>Ting som jeg vet mangler:</p>
<ul>
<li>Mulighet for å legge inn innlogging</li>
<li>Det er fortsatt en del tegn som kommer opp feil</li>
<li>Underveis i formateringen hender det at mellomrom fra nettsidene forsvinner</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://klakegg.net/2009/02/ordnett-i-terminalen/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Koding uten kildekodekontroll</title>
		<link>http://klakegg.net/2009/02/koding-uten-kildekodekontroll/</link>
		<comments>http://klakegg.net/2009/02/koding-uten-kildekodekontroll/#comments</comments>
		<pubDate>Mon, 02 Feb 2009 20:49:33 +0000</pubDate>
		<dc:creator>Erlend</dc:creator>
				<category><![CDATA[programmering]]></category>

		<guid isPermaLink="false">http://blog.averlend.com/?p=77</guid>
		<description><![CDATA[For første gang på lenge skulle jeg bare programmere litt uten å ha koden i kildekodekontroll. Det var for å se om jeg kunne få det til, og etter litt for kort tid fungerte det nøyaktig som det skulle. Siden koden gjorde jobben sin var det tid for å gjøre litt refactoring. Det var klokka [...]]]></description>
			<content:encoded><![CDATA[<p>For første gang på lenge skulle jeg bare programmere litt uten å ha koden i kildekodekontroll. Det var for å se om jeg kunne få det til, og etter litt for kort tid fungerte det nøyaktig som det skulle. Siden koden gjorde jobben sin var det tid for å gjøre litt refactoring. Det var klokka 10, og koden fungerer ikke igjen enda&#8230;</p>
<p>Så, for å plukke relevante tips fra boka <a href="http://pragprog.com/titles/tpp/the-pragmatic-programmer"><em>The Pragmatic Programmer</em></a> av Andrew Hunt og David Thomas:</p>
<blockquote><p><strong>(23) Always Use Source Code Control</strong><br />
Source code control is a time machine for your work &#8211; you <em>can</em> go back.</p></blockquote>
<blockquote><p><strong>(47) Refactor Early, Refactor Often</strong><br />
Just as you might weed and rearrange a garden, rewrite, rework, and re-architect code when it needs it. Fix the root of the problem.</p></blockquote>
<p>Jeg lover; <strong>aldri</strong> igjen uten kildekodekontroll.</p>
]]></content:encoded>
			<wfw:commentRss>http://klakegg.net/2009/02/koding-uten-kildekodekontroll/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>En titt på Google App Engine</title>
		<link>http://klakegg.net/2008/11/en-titt-pa-google-app-engine/</link>
		<comments>http://klakegg.net/2008/11/en-titt-pa-google-app-engine/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 21:03:15 +0000</pubDate>
		<dc:creator>Erlend</dc:creator>
				<category><![CDATA[programmering]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[gae]]></category>

		<guid isPermaLink="false">http://blog.averlend.com/?p=42</guid>
		<description><![CDATA[Google kom tidligere i år med noe de kaller Google App Engine (GAE), en tjeneste som lar utviklere lage applikasjoner i Python som kan hostes hos Google. I motsetning til vanlige webhotell er det en del begrensninger som man ikke er vant til fra tidligere hva angår biblioteker. GAE tilbyr ikke en vanlig relasjonsdatabase (som [...]]]></description>
			<content:encoded><![CDATA[<p>Google kom tidligere i år med noe de kaller <a href="http://code.google.com/appengine/">Google App Engine</a> (GAE), en tjeneste som lar utviklere lage applikasjoner i Python som kan hostes hos Google. I motsetning til vanlige webhotell er det en del begrensninger som man ikke er vant til fra tidligere hva angår biblioteker.</p>
<div id="attachment_61" class="wp-caption alignright" style="width: 152px"><img class="size-full wp-image-61" title="Google App Engine" src="http://klakegg.net/wp-content/uploads/2008/11/appengine.gif" alt="Google App Engine" width="142" height="109" /><p class="wp-caption-text">Google App Engine</p></div>
<p>GAE tilbyr ikke en vanlig relasjonsdatabase (som MySQL, MS SQL osv) men noe som kalles Datastore, denne er i tillegg begrenset til å ikke hente ut mer enn maks 1000 poster fra en &#8220;tabell&#8221;. Biblioteket som Google stiller med støtter heller ikke sesjoner (sessions), men man kan bygge dette ut ved å legge ved egne biblioteker. En annen artig begresning er at koden ikke kan lese eller skrive til disk. Når dette er sagt stiller man med Memcache, noe som kan sammenlignes med delt minne tilgjengelig fra alle instansene som kjører (for Google kan finne på å kjøre opp applikasjonen på mange for å skallere).</p>
<p>Jeg oppdaget GAE gjennom en artikkel i <a href="http://www.pythonmagazine.com/">Python Magazine</a>, og fant det utrolig interessant, men av mangel på applikasjoner å utvikle ble det lagt litt på hylla helt til for noen dager siden når jeg kom over en <a href="http://www.youtube.com/watch?v=bfgO-LXGpTM">video på YouTube</a> som viste ting i praksis, og da måtte det bare testes.</p>
<p>For å vise litt av mulighetene i GAE skal jeg utvikle en liten applikasjon som viser et tilfeldig sitat fra datastore, og som lar Google sine brukere logge på for å legge inn nye sitater. Det skal også være en link til hvert sitat.</p>
<p><span id="more-42"></span></p>
<p>For å utvikle kan man laste ned App Engine SDK, og da Google støtter kun Python i skrivende stund blir dette utviklingsspråket som må benyttes.</p>
<p>Til å begynne med lager jeg en modell, en representasjon av &#8220;tabellen&#8221; jeg skal benytte.</p>
<pre class="brush: python;">
class Quote(db.Model):
id = db.IntegerProperty()
user = db.UserProperty(required=True)
name = db.StringProperty()
text = db.StringProperty(multiline=True, required=True)
timestamp = db.DateTimeProperty(auto_now_add=True)
</pre>
<p>Det er lite spennende her, men det er verdt å merke seg at UserProperty lar deg lage en representasjon av Google sine brukere. Så snart modellen er laget kan jeg begynne å legge inn data i den ved hjelp av kode. For å lage siden må jeg definere en klasse for dette.</p>
<pre class="brush: python;">
class Add(Base):
def get(self):
self.render(&quot;add.html&quot;)

def post(self):
q = Quote(
text = self.request.get(&quot;text&quot;),
name = self.request.get(&quot;name&quot;),
user = users.get_current_user()
).put()
self.redirect(&quot;/view/&quot; + str(q.id()))
</pre>
<p>Ved GET-etterspørsler vil get-metoden benyttes, og den returnerer en nettside. Ved POST-etterspørsel vil det bli opprettet et nytt objekt med informasjon, og ved hjelp av put() blir objektet lagret i datastore, for så å sende brukeren til en side som viser det nye objektet.</p>
<p>Det er viktig å merke seg at det ikke finnes noen mulighet for auto increment som man kjenner fra andre databaser, så id-feltet som ser ut til å ligge lagret i modellen inneholder None (null). For å simulere auto increment er det laget to metoder som tar var på den siste id-verdien i memcache.</p>
<pre class="brush: python;">
def getLast():
last = memcache.get(&quot;last&quot;)
if last:
return last
return setLast()

def setLast():
id = Quote.all().order(&quot;-id&quot;).get().id
memcache.set(&quot;last&quot;, id, 3600*24)
return id
</pre>
<p>Ved hjelp av setLast blir den siste verdien hentet ut og lagt inn i memcache, som kan beskrives som delt minne mellom instansene av applikasjonen (Google starter ikke bare én). getLast har som formål å returnere verdien fra memcache, men ser til at den blir satt opp den ikke er satt. For å fylle opp id på Quote-objektet må jeg i tillegg bytte ut put-metoden til modellen.</p>
<pre class="brush: python;">
def put(self):
self.id = memcache.incr(&quot;last&quot;)
if not self.id:
setLast()
self.id = memcache.incr(&quot;last&quot;)
return self.put()
</pre>
<p>Selv om jeg setter en id-verdi på objektet har objektet allerede en annen id som er tilgjengelig gjennom objekt.key().id(), og det er objektet fra objekt.key() som returneres ved put(). Den genererte id-en fra Google trenger følge på hverandre slik man gjerne opplever når man utvikler lokalt.</p>
<p>For å vise et gitt sitat er det ønskelig å benytte id-verdien som objektet automatisk har fått, og for å hente sitater ut gjør denne verdien det enkelt.</p>
<pre class="brush: python;">
class View(Base):
def get(self, id):
quote = Quote.get_by_id(int(id))
if not quote:
raise Exception(&quot;Requested quote doesn't exists&quot;)
self.render(&quot;view.html&quot;, dict(quote=quote))
</pre>
<p>Quote.get_by_id() er en metode som gjør det veldig greit å hente et gitt objekt uten å måtte skrive en hel spørring. Dersom objektet som etterspørres ikke eksisterer er det ønskelig å lage et avvik, dette blir tatt hånd om av en metode i Base-klassen som er laget for å slippe å skrive mye kode:</p>
<pre class="brush: python;">
class Base(webapp.RequestHandler):

def render(self, tpl, values = {}):
values[&quot;user&quot;] = users.get_current_user()
values[&quot;url_login&quot;] = users.create_login_url(self.request.url)
values[&quot;url_logout&quot;] = users.create_logout_url(&quot;/&quot;)

self.response.out.write(
template.render(&quot;template/&quot; + tpl, values)) # Lispy!

def handle_exception(self, exception, debug_mode):
self.response.out.write(
template.render(&quot;template/error.html&quot;, dict(error=exception)))
</pre>
<p>Denne klassen er laget kun for å slippe å skrive kode mange ganger (DRY). handle_excception tar imot avvik og lar meg håndtere disse på en fornuftig måte. render-metoden er en metode for å gjøre koden enklere, men også for å sikre at det blir sendt med noen ekstra variabler som link til innlogging og brukerinformasjon.</p>
<p>En av begrensningene til Datastore er at det mangler mulighet for å sortere i en tilfeldig rekkefølge (&#8220;SELECT &#8230; ORDER BY rand()&#8221;). Det er flere som har prøvd å løse denne mangelen, men siden jeg har laget meg en tilnærming til auto increment på tabellen må jeg klare å lage en tilfeldig verdi mellom den laveste og den høyeste mulige verdien.</p>
<pre class="brush: python;">
class Front(Base):
def get(self):
rnd = random.randint(getFirst(), getLast())
quote = Quote.all().filter(&quot;id &gt;= &quot;, rnd).order(&quot;id&quot;).get()
if not quote:
quote = Quote.all().filter(&quot;id &lt; &quot;, rnd).order(&quot;id&quot;).get()
self.render(&quot;front.html&quot;, dict(quote=quote))
</pre>
<p>Den er muligens noe omfattende, men det er en tilnærming for å sikre at man alltid finner minst et sitat (så lenge det er noen i tabellen).</p>
<p>For å fortelle hvilke klasser som skal benyttes ved kall mot serveren må applikasjonen vite om disse, dette gjøres ved å legge inn informasjon om dette i filen;</p>
<pre class="brush: python;">
application = webapp.WSGIApplication([
(&quot;/&quot;, Front),
(&quot;/add&quot;, Add),
(&quot;/view/(\d*)&quot;, View),
(&quot;.*&quot;, Error),
], debug=True)

def main():
run_wsgi_app(application)

if __name__ == &quot;__main__&quot;:
main()
</pre>
<p>I tillegg må det være med en app.yaml som forteller enda litt til om applikasjonen:</p>
<pre class="brush: python;">
application: rndquote
version: 1
runtime: python
api_version: 1

handlers:
- url: /style
static_dir: style

- url: /add
script: quote.py
login: required

- url: /admin.*
script: $PYTHON_LIB/google/appengine/ext/admin
login: admin

- url: /.*
script: quote.py
</pre>
<p>Det er verdt å merke seg at &#8220;login: required&#8221; gjør det at man må være innlogget for å få opp siden, hvilket er grunnen til at det ikke er noen kode for brukerhåndtering og annet i koden.</p>
<p>I tillegg til noen metoder og et par andre småting er applikasjonen ferdig, og den kan testes på <a href="http://rndquote.appspot.com/">rndquote.appspot.com</a>. All nødvendig <a href="http://blog.averlend.com/wp-content/uploads/2008/11/rndquote.zip">kildekode for å kjøre programmet</a> kan lastes ned (må ha SDK i tillegg).</p>
<p>GAE er ikke kommet i endelig utgave enda, og det er satt en del begrensninger (maks 650 000 kall mot datastore og 2 500 000 sidekall per døgn), i tillegg er det enkelte ting som ikke er der som man normalt forventer å ha tilgjengelig når man utvikler for veven.</p>
<p>Til tross for begrensninger er det ingen tvil om at dette er gøy å leke med, og det er ikke vanskelig å se for seg en del ting som egner seg å lage for GAE.</p>
]]></content:encoded>
			<wfw:commentRss>http://klakegg.net/2008/11/en-titt-pa-google-app-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beta av NTNU Timeplan</title>
		<link>http://klakegg.net/2008/09/beta-av-ntnu-timeplan/</link>
		<comments>http://klakegg.net/2008/09/beta-av-ntnu-timeplan/#comments</comments>
		<pubDate>Sun, 21 Sep 2008 16:59:25 +0000</pubDate>
		<dc:creator>Erlend</dc:creator>
				<category><![CDATA[programmering]]></category>

		<guid isPermaLink="false">http://blog.averlend.com/index.php/2008/09/21/beta-av-ntnu-timeplan/</guid>
		<description><![CDATA[For kort tid siden la jeg ut en beta-versjon av NTNU Timeplan. Det er lite nytt, men i stedet for å være et proof-of-concept, er det denne gangen lagt til rette for å bygge ut med ny funksjonalitet, noe som allerede blir testet i utviklingsversjonen. Om kort tid regner jeg med at hovedutgaven blir byttet [...]]]></description>
			<content:encoded><![CDATA[<p>For kort tid siden la jeg ut en <a href="http://beta.ntnutimeplan.no/">beta-versjon</a> av NTNU Timeplan. Det er lite nytt, men i stedet for å være et proof-of-concept, er det denne gangen lagt til rette for å bygge ut med ny funksjonalitet, noe som allerede blir testet i utviklingsversjonen. Om kort tid regner jeg med at <a href="http://www.ntnutimeplan.no">hovedutgaven</a> blir byttet ut også.</p>
<p>Av ting som er nytt, kan man finne:</p>
<ul>
<li>Mulighet for å legge inn eksamener i fag som ikke har undervisning</li>
<li>Mulighet for å legge inn fag for flere semester, i denne omgang også neste semester</li>
<li>Jeg har tatt i bruk <a href="http://prototypejs.org/">Prototype</a> for å skrive mindre JavaScript</li>
</ul>
<p>I stedet for å utvikle i PHP, har jeg denne gangen valgt å benytte Python og rammeverket <a href="http://pylonshq.com/">Pylons</a>. Pylons har valgt en MVC-tilnærming, og kan i likhet med mange andre rammeverk minne om <a href="http://www.rubyonrails.org/">Ruby On Rails</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://klakegg.net/2008/09/beta-av-ntnu-timeplan/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>NTNU Timeplan er oppdatert</title>
		<link>http://klakegg.net/2008/07/ntnu-timeplan-er-oppdatert/</link>
		<comments>http://klakegg.net/2008/07/ntnu-timeplan-er-oppdatert/#comments</comments>
		<pubDate>Wed, 16 Jul 2008 14:12:02 +0000</pubDate>
		<dc:creator>Erlend</dc:creator>
				<category><![CDATA[programmering]]></category>

		<guid isPermaLink="false">http://blog.averlend.com/index.php/2008/07/16/ntnu-timeplan-er-oppdatert/</guid>
		<description><![CDATA[Etter noen påminnelser fra min kjære har jeg endelig tatt meg tid til å gjøre NTNU Timeplan klar for et nytt semester. Jeg har siden jul sett på en del ting som skulle vært gjort annerledes eller lagt til på løsningen, men har dessverre ikke kommet i mål. Jeg håper at jeg skal finne tid [...]]]></description>
			<content:encoded><![CDATA[<p>Etter noen påminnelser fra min kjære har jeg endelig tatt meg tid til å gjøre <a href="http://www.ntnutimeplan.no/">NTNU Timeplan</a> klar for et nytt semester. Jeg har siden jul sett på en del ting som skulle vært gjort annerledes eller lagt til på løsningen, men har dessverre ikke kommet i mål. Jeg håper at jeg skal finne tid til å gjennomføre en ordentlig oppdatering før semesteret eller i løpet av begynnelsen av semesteret.</p>
<p>For de som ikke går på NTNU men som likevell har lyst til å teste den kan man finne oversikt over fag og timeplaner på den offisielle siden for <a href="http://www.ntnu.no/studieinformasjon/timeplan/">timeplaner ved NTNU</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://klakegg.net/2008/07/ntnu-timeplan-er-oppdatert/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Test av namespace i PHP</title>
		<link>http://klakegg.net/2008/03/test-av-namespace-i-php/</link>
		<comments>http://klakegg.net/2008/03/test-av-namespace-i-php/#comments</comments>
		<pubDate>Mon, 03 Mar 2008 12:38:10 +0000</pubDate>
		<dc:creator>Erlend</dc:creator>
				<category><![CDATA[programmering]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.averlend.com/2008/03/03/test-av-namespace-i-php/</guid>
		<description><![CDATA[PHP 5.3 skal komme med støtte for namespace, og under lesing om namespace i PHP 5.3 oppdaget jeg fålgende setning: Same namespace name can be used in multiple files. For å teste dette hentet jeg ned snapshot av PHP 6.0 og kompilerte den direkte på ene maskinen (ups&#8230;). Deretter laget jeg noen filer. index.php: &#60;?php [...]]]></description>
			<content:encoded><![CDATA[<p>PHP 5.3 skal komme med støtte for namespace, og under lesing om <a href="http://www.php.net/namespaces">namespace</a> i PHP 5.3 oppdaget jeg fålgende setning:</p>
<blockquote><p>Same namespace name can be used in multiple files.</p></blockquote>
<p>For å teste dette hentet jeg ned snapshot av PHP 6.0 og kompilerte den direkte på ene maskinen (ups&#8230;). Deretter laget jeg noen filer.</p>
<p>index.php:</p>
<pre class="brush: php;">&lt;?php
function __autoload($class) {
require_once(&quot;bar.php&quot;);
}

require_once(&quot;foo.php&quot;);

test::foo::test();
test::bar::test();
?&gt;</pre>
<p>foo.php:</p>
<pre class="brush: php;">&lt;?php
namespace test;

class foo {
public static function test() {
echo &quot;foo&quot;;
}
}
?&gt;</pre>
<p>bar.php:</p>
<pre class="brush: php;">&lt;?php
namespace test;

class bar {
public static function test() {
echo &quot;bar&quot;;
}
}
?&gt;</pre>
<p>Resultatet av kjøringen ble &#8220;foobar&#8221;, så da kan man altså &#8220;fylle opp&#8221; et namespace ved behov.</p>
<p>Nå gjenstår det bare å få tak i PHP 5.3 som ferdige pakker til Ubuntu.</p>
]]></content:encoded>
			<wfw:commentRss>http://klakegg.net/2008/03/test-av-namespace-i-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

