<?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</title>
	<atom:link href="http://klakegg.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://klakegg.net</link>
	<description></description>
	<lastBuildDate>Mon, 01 Mar 2010 10:27:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Destruction-driven development</title>
		<link>http://klakegg.net/2010/03/01/destruction-driven-development/</link>
		<comments>http://klakegg.net/2010/03/01/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 gang [...]]]></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://blog.averlend.com/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/01/destruction-driven-development/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bussorakel feirer 100</title>
		<link>http://klakegg.net/2010/02/22/bussorakel-feirer-100/</link>
		<comments>http://klakegg.net/2010/02/22/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://blog.averlend.com/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://blog.averlend.com/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://blog.averlend.com/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://blog.averlend.com/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/22/bussorakel-feirer-100/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NRK som filsystem</title>
		<link>http://klakegg.net/2009/05/23/nrk-som-filsystem/</link>
		<comments>http://klakegg.net/2009/05/23/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, inntil videre fungerer fortsatt alt som beskrevet i postingen og i første kommentar.
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 valgt [...]]]></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, inntil videre fungerer fortsatt alt som beskrevet i postingen og i første kommentar.</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 <a href="http://svn.averlend.com/public/nrkfs/trunk/">lagt ut i kildekodekontrollen</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://blog.averlend.com/wp-content/uploads/2009/05/nrkfs.png" alt="NrkFS" width="554" height="422" /></p>
<p>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.</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/23/nrk-som-filsystem/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Playing for change &#8211; hvor?</title>
		<link>http://klakegg.net/2009/05/01/playing-for-change-hvor/</link>
		<comments>http://klakegg.net/2009/05/01/playing-for-change-hvor/#comments</comments>
		<pubDate>Fri, 01 May 2009 22:51:05 +0000</pubDate>
		<dc:creator>Erlend</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[musikk]]></category>

		<guid isPermaLink="false">http://blog.averlend.com/?p=134</guid>
		<description><![CDATA[Jeg gir opp. De siste dagene har jeg fått en følelse av at &#8220;Stand By Me&#8221; forfølger meg, og da er det naturligvis fremføringen av &#8220;Playing for change&#8221; jeg tenker på. Flott sang, flott sammensatt, og spesielt fasinert er jeg av Grandpa Elliott fra Louisiana. Det er virkelig verdt å få med seg:

Det blir litt [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg gir opp. De siste dagene har jeg fått en følelse av at &#8220;Stand By Me&#8221; forfølger meg, og da er det naturligvis fremføringen av &#8220;Playing for change&#8221; jeg tenker på. Flott sang, flott sammensatt, og spesielt fasinert er jeg av Grandpa Elliott fra Louisiana. Det er virkelig verdt å få med seg:</p>
<p><div style="text-align: center;"><!-- Smart Youtube --><span class="youtube"><object width="480" height="360"><param name="movie" value="http://www.youtube.com/v/Us-TVg40ExM&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D18" /><param name="allowFullScreen" value="true" /><embed wmode="transparent" src="http://www.youtube.com/v/Us-TVg40ExM&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D18" type="application/x-shockwave-flash" allowfullscreen="true" width="480" height="360" ></embed><param name="wmode" value="transparent" /></object></span></div></p>
<p>Det blir litt som <a href="http://denukentlige.com/2009/04/24/samspill-the-internet-sympony/">&#8220;The Internet Symphony&#8221;</a> som jeg har store vansker med å høre kun én gang, og når jeg inne på <a href="http://www.youtube.com/user/PlayingForChange">profilen</a> til &#8220;Playing for change&#8221; vurderer jeg å kjøpe plata siden jeg finner en tekst som sier:</p>
<blockquote><p>CD/DVD now available at Amazon.com, Starbucks, and everywhere music sold</p></blockquote>
<p>Noe senere blir jeg derfor ganske paff når <a href="http://eirikso.com/">Eirik Solheim</a> <a href="http://twitter.com/eirikso/status/1671956059">tvitrer</a> en link til en skjermskyt som minner om snarere det motsatte av &#8220;everywhere&#8221;:</p>
<div id="attachment_137" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.flickr.com/photos/eirikso/3491433379/"><img class="size-medium wp-image-137" title="Playing for change på iTUnes" src="http://blog.averlend.com/wp-content/uploads/2009/05/3491433379_006008250c_o-300x209.jpg" alt="Some rights reserved, Eirik Solheim" width="300" height="209" /></a><p class="wp-caption-text">Some rights reserved, Eirik Solheim</p></div>
<p>Umiddelbart går turen til CDON og Platekompaniet for å se hvordan status er, og her viser det seg at skiven kommer ut i Norge et stykke ut i mai, til tross for at den allerede er sluppet på iTunes den 28. april (i USA).</p>
<p>Jeg må innrømme at jeg ikke lenger er sikker på om jeg ønsker å støtte opp om slik forskjellsbehandling gjennom å kjøpe plata, og det er spesielt et sitat av en smart kar som kommer til meg; <a href="http://snever.net/pirater-er-drittunger">&#8220;Ikke klag over piratkopiering.&#8221;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://klakegg.net/2009/05/01/playing-for-change-hvor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ordnett i terminalen</title>
		<link>http://klakegg.net/2009/02/08/ordnett-i-terminalen/</link>
		<comments>http://klakegg.net/2009/02/08/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 alltid [...]]]></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://blog.averlend.com/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 i <a href="http://svn.averlend.com/public/ordnett/trunk/">kildekodekontrollen</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/08/ordnett-i-terminalen/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>SSH uten passord</title>
		<link>http://klakegg.net/2009/02/04/ssh-uten-passord/</link>
		<comments>http://klakegg.net/2009/02/04/ssh-uten-passord/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 19:27:26 +0000</pubDate>
		<dc:creator>Erlend</dc:creator>
				<category><![CDATA[Note to self]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[internett]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://blog.averlend.com/?p=100</guid>
		<description><![CDATA[SSH er en protokoll for sikker kommunikasjon mellom datamaskiner, fortrinnsvis maskiner med BSD, Linux og Mac OS, men kan også brukes fra Windows-maskiner ved å benytte Putty. Jeg ønsker her å vise hvordan man kan gjøre dette på maskiner med BSD, Linux og Mac OS, for Windows; se Putty sin dokumentasjon.
Dersom man ønsker å benytte [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-medium wp-image-104" title="nettverk" src="http://blog.averlend.com/wp-content/uploads/2009/02/nettverk.jpg" alt="nettverk" width="170" height="255" /><a href="http://no.wikipedia.org/wiki/Secure_Shell">SSH</a> er en protokoll for sikker kommunikasjon mellom datamaskiner, fortrinnsvis maskiner med BSD, Linux og Mac OS, men kan også brukes fra Windows-maskiner ved å benytte <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">Putty</a>. Jeg ønsker her å vise hvordan man kan gjøre dette på maskiner med BSD, Linux og Mac OS, for Windows; se Putty sin dokumentasjon.</p>
<p>Dersom man ønsker å benytte seg av innlogging over SSH uten passord er det viktig å husket at dersom noen får tak i din private nøkkel vil man også andre kunne logge seg inn som deg.</p>
<p>For å komme i gang må man lage nøklene som er nødvendig, og da åpner man en terminal og skriver følgende kommando:</p>
<p><code>ssh-keygen -t rsa</code></p>
<p>Det vil komme opp noe tilsvarende dette, og man trenger ikke lenge inn nye verdier med mindre man ønsker å ha passord på nøklene:</p>
<blockquote><p>Enter file in which to save the key (/home/brukernavn/.ssh/id_rsa):<br />
Enter passphrase (empty for no passphrase):<br />
Enter same passphrase again:<br />
Your identification has been saved in /home/brukernavn/.ssh/id_rsa.<br />
Your public key has been saved in /home/brukernavn/.ssh/id_rsa.pub.</p></blockquote>
<p>I hjemmemappen er det nå laget to nye filer:</p>
<ul>
<li><em>.ssh/id_rsa</em> &#8211; Den hemmelige nøkkelen som ikke må gies til noen andre</li>
<li><em>.ssh/id_rsa.pub</em> &#8211; Den offentlige nøkkelen som sendes til den andre databaskinen</li>
</ul>
<p>Nå som nøklene er opprettet er det tid for å kopiere over den offentlige nøkkel til maskinen man ønsker å koble seg til. Skriv inn passordet ditt når du får spørsmål om dette.</p>
<p><code>ssh-copy-id -i ~/.ssh/id_rsa.pub <em>brukernavn@ssh.domene.net</em></code></p>
<p>Nøkkelen din er nå lagt inn i filen <em>.ssh/authorized_keys</em> på den eksterne maskinen. Nå kan du logge deg på uten passord, bare prøv:</p>
<p><code>ssh <em>brukernavn@ssh.domene.net</em></code></p>
<p>Dersom det ikke fungerer, så kan det være at muligheten for innlogging uten passord er slått av den eksterne maskinen.</p>
<p><strong>Husk å ikke strø rundt deg med private nøkler!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://klakegg.net/2009/02/04/ssh-uten-passord/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Koding uten kildekodekontroll</title>
		<link>http://klakegg.net/2009/02/02/koding-uten-kildekodekontroll/</link>
		<comments>http://klakegg.net/2009/02/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/02/koding-uten-kildekodekontroll/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hemmelig epost?</title>
		<link>http://klakegg.net/2008/12/08/hemmelig-epost/</link>
		<comments>http://klakegg.net/2008/12/08/hemmelig-epost/#comments</comments>
		<pubDate>Mon, 08 Dec 2008 21:40:06 +0000</pubDate>
		<dc:creator>Erlend</dc:creator>
				<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[epost]]></category>
		<category><![CDATA[internett]]></category>

		<guid isPermaLink="false">http://blog.averlend.com/?p=50</guid>
		<description><![CDATA[
NRK kunne i dag slå opp at Sverige fra og med 1. januar 2009 kan følge med på hva nordmenn gjør på Internett når nettverkstrafikken går innom Sverige. Dette har vært oppe også tidligere i år, men det ser ut til å utebli løsninger som kan være med på å løse dette nye problemet.

Gisle Hannemyr [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-64" title="Sikkerhet" src="http://blog.averlend.com/wp-content/uploads/2008/12/secure.png" alt="Sikkerhet" width="100" height="100" /></p>
<p>NRK kunne i dag slå opp at Sverige fra og med 1. januar 2009 kan <a href="http://digi.no/php/art.php?id=797193">følge med på hva nordmenn gjør på Internett</a> når nettverkstrafikken går innom Sverige. Dette har vært oppe også tidligere i år, men det ser ut til å utebli løsninger som kan være med på å løse dette nye problemet.</p>
<p><span id="more-50"></span></p>
<p><a href="http://www1.nrk.no/nett-tv/indeks/153104">Gisle Hannemyr kunne fortelle på Dagsrevyen</a> at krimminelle allerede benytter kryptering, men sannheten er at mange andre gjør det også, og det er egentlig så enkelt at også vanlige brukere burde klare å sende sikker epost. <a href="http://en.wikipedia.org/wiki/Pretty_Good_Privacy">PGP</a> har eksistert siden 1991, og går rett og slett ut på at man genererer en privat og en offentlig nøkkel til seg selv. PGP kan brukes til to ting; signere eposten for å sikre at den kommer fra deg, eller å kryptere innholdet i eposten (ikke emne) slik at kun mottaker kan åpne det. Det er da viktig å dele sin offentlige nøkkel med verden slik at andre kan se at det er du som har sendt eposten, eller for at de skal kunne sende krypterte epost til deg.</p>
<p>Når man skal signere at en epost kommer fra deg kan du bruke din private nøkkel til å lage en signatur for eposten, og når eposten blir åpnet kan man se at den faktisk stammer fra deg ved å kontrollere signaturen som ble generert mot din offentlige nøkkel.</p>
<p>Dersom du ønsker å sende kryptert epost til meg, altså at kun jeg kan åpne den, må du få tak i min offentlige nøkkel, og denne kan da brukes til å kryptere epostens innhold, og når jeg mottar den må jeg bruke min private (og meget hemmelige) nøkkel for å kunne se innholdet.</p>
<p>Dette høres kanskje ut som mye arbeid, men det er det absolutt ikke. For de som bruker <a href="http://www.mozilla-europe.org/no/products/thunderbird/">Thunderbird</a> kan man bruke <a href="http://enigmail.mozdev.org/home/index.php">Enigmail</a>, et tillegg som tar deg igjennom prosessen med å lage nøkler, dele nøkler og fikse alt av signering, kryptering og dekryptering for deg. For å komme i gang er det laget <a href="http://enigmail.mozdev.org/documentation/quickstart.php">en liten manual</a>, og det tar ikke mange minuttene. (De som bruker Ubuntu skriver bare &#8220;sudo aptitude install enigmail enigmail-locale-nb&#8221; i terminalen og restarter Thunderbird.)</p>
<p>Noen andre som skal begynne å signere sine eposter? Til tross for dystre utsagn i media i dag er det ingen grunn til å avskrive demokrati og ytringsfrihet, det er bare snakk om å være litt mer våken.</p>
<p>Det finnes også noen flere tiltak enn å kryptere epost:</p>
<p><strong>Sikker i vevleseren:</strong> Vi har i lenger tid brukt sikker tilkobling når vi kobler oss opp mot nettbanken vår, og det er vel ingen som tør å oppgi kredittkortopplysninger uten å se etter den kjente hengelåsen i vevleseren vår. Det er også mange andre sider med innlogging som tilbyr dette, men selv om for eksempel Google ikke gir sikker tilkobling når du bruker GMail, så er det kun snakk om å endre &#8220;http://mail.google.com/mail/&#8221; til &#8220;http<strong>s</strong>://mail.google.com/mail/&#8221;. Flere av Google sine tjenester tilbyr dette. Merk at på langt nær alle vevsider tilbyr dette&#8230;</p>
<p><strong>Sikker på MSN:</strong> De som sitter på MSN kan benytte <a href="http://www.secway.fr/us/products/simplite_msn/home.php">Simp Lite</a> til å kryptere samtaler med andre som har installert programmet.</p>
]]></content:encoded>
			<wfw:commentRss>http://klakegg.net/2008/12/08/hemmelig-epost/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bachelor i realfag</title>
		<link>http://klakegg.net/2008/12/08/bachelor-i-realfag/</link>
		<comments>http://klakegg.net/2008/12/08/bachelor-i-realfag/#comments</comments>
		<pubDate>Mon, 08 Dec 2008 13:25:28 +0000</pubDate>
		<dc:creator>Erlend</dc:creator>
				<category><![CDATA[Skole]]></category>
		<category><![CDATA[ntnu]]></category>
		<category><![CDATA[studier]]></category>

		<guid isPermaLink="false">http://blog.averlend.com/?p=46</guid>
		<description><![CDATA[I dag kom beviset på min gjennomføring av bachelor ved NTNU. Ble litt paff da det var rekommandert sending til meg på postkontoret, og forstod absolutt ingenting før jeg så NTNU sin logo på brevet.
Da er det vel bare til å stå på for å komme seg igjennom også master, får begynne med de to [...]]]></description>
			<content:encoded><![CDATA[<p>I dag kom beviset på min gjennomføring av bachelor ved NTNU. Ble litt paff da det var rekommandert sending til meg på postkontoret, og forstod absolutt ingenting før jeg så NTNU sin logo på brevet.</p>
<p>Da er det vel bare til å stå på for å komme seg igjennom også master, får begynne med de to eksamenene som gjenstår før jul&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://klakegg.net/2008/12/08/bachelor-i-realfag/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>En titt på Google App Engine</title>
		<link>http://klakegg.net/2008/11/21/en-titt-pa-google-app-engine/</link>
		<comments>http://klakegg.net/2008/11/21/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 MySQL, [...]]]></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://blog.averlend.com/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/21/en-titt-pa-google-app-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
