<?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>Alt om ingenting og litt i mellom &#187; Programmering</title>
	<atom:link href="http://hovenko.no/blog/category/teknologi/programmering/feed/" rel="self" type="application/rss+xml" />
	<link>https://hovenko.no/blog</link>
	<description>En blogg av Knut-Olav</description>
	<lastBuildDate>Mon, 10 Mar 2025 19:25:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Java RMI connectivity debugging</title>
		<link>https://hovenko.no/blog/2015/02/19/java-rmi-connectivity-debugging/</link>
		<comments>https://hovenko.no/blog/2015/02/19/java-rmi-connectivity-debugging/#comments</comments>
		<pubDate>Thu, 19 Feb 2015 12:41:37 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[English-posts]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[feilsøking]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=878</guid>
		<description><![CDATA[When RMI connection fails with java.net.ConnectException: Connection refused it might be hard to figure out which hostname and port it tried to connect with, especially in third party libraries. To enable debug logging in RMI connectivity, which logs hostname and port number, set this system property: sun.rmi.transport.proxy.logLevel=BRIEF Can also be set runtime with System.setProperty before [...]]]></description>
			<content:encoded><![CDATA[<p>When RMI connection fails with <code>java.net.ConnectException: Connection refused</code> it might be hard to figure out which hostname and port it tried to connect with, especially in third party libraries.</p>
<p>To enable debug logging in RMI connectivity, which logs hostname and port number, set this system property:<br />
<code>sun.rmi.transport.proxy.logLevel=BRIEF</code></p>
<p>Can also be set runtime with System.setProperty before RMI connections are made.</p>
<p>Log output are printed to console, such as:<br />
<code>
<pre>
Feb 19, 2015 1:03:28 PM sun.rmi.transport.proxy.RMIMasterSocketFactory createSocket
FINE: main: host: localhost, port: 1098
Feb 19, 2015 1:03:28 PM sun.rmi.transport.proxy.RMIMasterSocketFactory createSocket
FINE: main: host: localhost, port: 4444
</pre>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2015/02/19/java-rmi-connectivity-debugging/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MIME Multipart, boundary og linjeskift</title>
		<link>https://hovenko.no/blog/2012/08/03/mime-multipart-boundary-og-linjeskift/</link>
		<comments>https://hovenko.no/blog/2012/08/03/mime-multipart-boundary-og-linjeskift/#comments</comments>
		<pubDate>Fri, 03 Aug 2012 12:50:42 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Internett]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[MIME]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=758</guid>
		<description><![CDATA[MIME Multipart-meldinger er kresne og er vanskelige å håndkode. Det er allikevel mulig å håndkode dem hvis man har god nok teksteditor (som kan vise kontrolltegn som linjeskift) og god tålmodighet og tunga rett i munnen. MIME-meldinger krever CRLF-endinger på linjene før og etter boundary-kodene og etter hver MIME-header. I eksempelet nedenfor representeres hvert linjeskift [...]]]></description>
			<content:encoded><![CDATA[<p><em>MIME Multipart</em>-meldinger er kresne og er vanskelige å håndkode.<br />
Det er allikevel mulig å håndkode dem hvis man har god nok teksteditor (som kan vise kontrolltegn som linjeskift) og god tålmodighet og tunga rett i munnen.</p>
<p>MIME-meldinger krever <strong>CRLF</strong>-endinger på linjene før og etter boundary-kodene og etter hver MIME-header.<br />
I eksempelet nedenfor representeres hvert linjeskift som <strong>LF</strong>.</p>
<h3>MIME-meldingseksempel</h3>
<p>De steder hvor det står <tt>^M</tt> brukes <strong>CR</strong>, som oftest rett før linjeskiftet.</p>
<pre><code>
--part-boundary-1^M
Content-Type: text/plain; charset=utf-8; name=litt-tekst.txt^M
Content-ID:
<litt -tekst.txt>^M
Content-Disposition: attachment; name="litt-tekst.txt"; filename="litt-tekst.txt"^M
^M
Dette er noe tekst i en fil som heter some-text.txt
Denne fila bruker UNIX-linjeendinger, altså LF og ikke CRLF,
og det er helt i orden, siden innholdet av denne tekstfila er utenfor kontekst av MIME.

Dette er siste linje i fila^M
--part-boundary-1^M
Content-Type: image/png; name=lite-bilde.png^M
content-transfer-encoding: base64^M
^M
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAAXNSR0IArs4c6QAAAAlwSFlzAAAL
EwAACxMBAJqcGAAAAAd0SU1FB9wIAwwLKSOxKhgAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRo
IEdJTVBXgQ4XAAAAMklEQVQoz2P8z4AD/Mcuw8RAIhjGGv7/J0UDbtUMDAws+KQZGUnxAzbVuDXg
UD1SYxoAH7UJHx3uIsQAAAAASUVORK5CYII=
^M
--part-boundary-1--^M
</litt></code></pre>
<p>Store og små bokstaver i navn på MIME-headere har ingen betydning.</p>
<h3>Blokk og separatorkoder (boundary)</h3>
<p>I denne meldingen bruker vi separatorkoden (boundary) <tt>part-boundary-1</tt>.<br />
Separatorene i fila prefikses med <tt>--</tt>, som viser til start på en <em>MIME Part</em>-blokk.<br />
En slik blokk varer fram til neste separator av samme kode.<br />
Siste separator appendes med <tt>--</tt> i tillegg til prefiksen, som betyr at det ikke er flere blokker.</p>
<p>En blokk i en multipart kan også være en multipart, men blokker under denne separeres med egen separatorkode.</p>
<h3>Teste meldingen mot en server</h3>
<p>For å teste opplasting med HTTP til en web servlet kan man bruke curl.<br />
Vi lagrer multipart-meldingen på fil <em>melding.multipart</em>.<br />
For at serveren skal kunne forstå multipart-meldingen må <strong>Content-Type</strong>-headeren spesifiseres som <tt>multipart/related</tt> og <strong>boundary</strong> satt til <tt>part-boundary-1</tt>.</p>
<p>Eksempel på kommando:</p>
<pre><code>
$ curl -X POST \
    -H "Content-Type: multipart/related; boundary=\"part-boundary-1\"" \
    --data-binary @melding.multipart \
    "http://localhost:8080/multipartServlet"
</code></pre>
<h3>Forskjellige biblioteker og krav til CRLF</h3>
<p>Det er noe forskjeller i hvordan forskjellige kodebiblioteker tolker multipart-meldinger.<br />
Noen tillater linjeendinger med bare LF (uten CR), mens andre er strengere og krever CRLF.</p>
<p>Servlet 3 sin multipart-parser er streng og krever CRLF.<br />
Samme er tilfellet med CXF sin SOAP-Attachment-parser.</p>
<p>Telia MMS MMSC-parser er derimot mer tilgivende.</p>
<h3>Ansvarsfraskrivelse&#8230;</h3>
<p>Det er ikke sikkert jeg har forstått dette 100% ennå.<br />
Det kan være at mitt håndkoda eksempel over inneholder noen skrivefeil.<br />
Jeg hadde Java i tankene da jeg skrev dette, og det er Java jeg har arbeidet med for behandling av MIME-meldinger da jeg forsket på feilscenariene jeg har hatt med linjeendinger.</p>
<h3>Mer om MIME-meldinger</h3>
<p><a href="http://tools.ietf.org/html/rfc1341" title="http://tools.ietf.org/html/rfc1341">RFC 1341</a> og spesielt seksjonen 7.2 om multipart gir mer informasjon om strukturen til MIME multiparts.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2012/08/03/mime-multipart-boundary-og-linjeskift/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Strukturell utviklingsarkitektur</title>
		<link>https://hovenko.no/blog/2011/04/05/strukturell-utviklingsarkitektur/</link>
		<comments>https://hovenko.no/blog/2011/04/05/strukturell-utviklingsarkitektur/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 18:47:43 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Arkitektur]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[arkitektur]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[prosjektstruktur]]></category>
		<category><![CDATA[prosjektstyring]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=649</guid>
		<description><![CDATA[Programkode har ikke alltid samme struktur som kjørende kode. Det kan være dynamisk kode som blir generert, malverksfiler som kompileres, konfigurasjon som hentes inn fra flere kilder som kan overstyres under kjøring. CSS og Javascript er også programmeringsspråk og bør behandles således. Kode kjører i forskjellige miljøer, enten det er på en web-server, i en [...]]]></description>
			<content:encoded><![CDATA[<p>Programkode har ikke alltid samme struktur som kjørende kode. Det kan være dynamisk kode som blir generert, malverksfiler som kompileres, konfigurasjon som hentes inn fra flere kilder som kan overstyres under kjøring.</p>
<blockquote class="left"><p>CSS og Javascript er også programmeringsspråk og bør behandles således.</p></blockquote>
<p>Kode kjører i forskjellige miljøer, enten det er på en web-server, i en virtuell maskin, en applikasjonsserver, i nettleseren eller instruksjoner som dynamisk bygges opp og sendes til eksekveringsmotorer som gjør en jobb og sender ferdig prosessert data tilbake. Det kan være preprosessorer som ved kompilering skriver om deler av programkoden.</p>
<p>Dette er noe å tenke på når man strukturerer opp prosjektet i kataloger og filer.</p>
<h3>Forskjellige programmeringsspråk krever forskjellige strategier</h3>
<p>Noe man kanskje ikke tenker så mye på mens man forsøker å konfigurere opp prosjektet til å kjøre Java-testene eller kompilere C-fila, er at en løsning ofte består av flere enn ett programmeringspråk. Om man utvikler web-løsninger er CSS og Javascript blitt en selvfølge. CSS og Javascript er programmeringsspråk og bør behandles således.</p>
<p>Javascript er et nesten like gammelt språk som Java, men det er først de siste årene at tradisjelle utviklere har fått øynene opp for hva som er mulig med Javascript. Desto mer man gjør i Javascript desto større er behovet for å teste funksjonaliteten. Det er fullt mulig å kjøre automatiserte enhetstester mot Javascript-kode, og det finnes verktøy for å detektere typiske feil og påpeke klassiske fallgruver. Det finnes også verktøy for å minifisere Javascript slik at filene blir mindre og legger mindre beslag på båndbredden til brukerne av systemet, og ikke minst like viktig er at det kan spare kostnader ved å senke krav til båndbredde fra systemet. Tilsvarende finnes det verktøy for CSS som minifiserer filene og som kan analysere filene og detektere ineffektive regler og duplikate regler som aldri inntreffer.</p>
<h3>Retningslinjer</h3>
<p>Mange programmeringsspråk har anbefalinger til hvordan programkode skal struktureres. Om systemet som skal lages hovedsaklig skal skrives i ett programmeringsspråk kan man følge dette språkets retningslinjer. I retningslinjene defineres gjerne hva en typisk fil skal inneholde, navngiving, indentering, kontrollkode, feilhåndtering, hvordan filene plasseres i en katalogstruktur og mye annet. Perl-prosjekter struktureres ofte etter <a href="http://search.cpan.org/perldoc?perlnewmod">CPAN sine retningslinjer</a>, PHP-prosjekter struktureres ofte etter <a href="http://pear.php.net/manual/en/standards.php">PEAR sine retningslinjer</a> og <a href="http://java.sun.com/blueprints/code/projectconventions.html">Java har sine retningslinjer</a>.</p>
<div class="wp-caption alignnone"><a href="http://www.flickr.com/photos/sciencemuseum/3322440276/"><img alt="" src="http://farm4.static.flickr.com/3149/3322440276_9be5a6d9c2.jpg" title="Construction of the East Block, Science Museum, London, 28 April 1916. Foto: Flickr/Science Museum London (CC)" width="500" height="357" /></a><p class="wp-caption-text">En by bygger seg ikke selv. Foto: Flickr/Science Museum London (CC)</p></div>
<p>Det har de siste årene blitt populært å bruke Maven som kontrollsystem for prosjekter, spesielt for Java-prosjekter, men kan også brukes til andre programmeringsspråk som PHP og Javascript. Man bruker gjerne Maven som en innpakking av prosjektet, til bygging av systemet, kjøre tester, pakketere og rulle ut nye versjoner. Det legger ingen føringer for hvordan man strukturerer innholdet av filer i prosjektet.</p>
<p>Det er ingen fasit når det kommer til struktur av prosjekter, men dersom man er flere som arbeider på samme prosjekt kan det være smart å bli enige om hvilke retningslinjer man skal følge.</p>
<h3>Ikke all kode er programkode</h3>
<blockquote class="right"><p>Tester skal støtte oppunder løsningen og gi en god og stabil leveranse.</p></blockquote>
<p>Den viktigste delen av løsningen er det kjørbare systemet, og det er dette som skal gi merverdi til bedriften. Dokumentasjon, tester, byggerammeverk og utviklingsmiljø er biprodukter; støttefunksjoner som skal bidra til å gi et godt og kjørende system.</p>
<p>Maven brukes, som nevnt ovenfor, gjerne til bygging av løsningen og til å kjøre opp web-server under utvikling, men Maven er ikke en del av det kjørbare systemet i leveransen.</p>
<p>Tester, som enhetstester og funksjonstester, er ikke programkode og trenger ikke behandles som det. Tester skal støtte oppunder løsningen og gi en god og stabil leveranse. Tester bør holdes utenfor katalogstrukturen til programkoden. Det kan være løsere retningslinjer til testene, for eksempel friere navngiving av tester, ingen maksimal linjelengde eller flatere katalogstruktur.</p>
<h3>Testene dine er viktige fordet!</h3>
<p>En god test er en verifikator om at en funksjon fungerer. En god test er presis på hva den tester og er lett å lese og forstå.</p>
<p>En god praksis er å navngi testene etter hva de tester. Et eksempel kan være en test som skal teste at en kunde som heter &#8220;Ola&#8221; har adresse &#8220;Drammensveien&#8221;, og denne testen kan da hete <code>test_kunden_ola_har_adresse_drammensveien</code>, selv om dette ikke stemmer overens med for eksempel Java&#8217;s camelcase.</p>
<p>En testfunksjon skal teste en ting, og kun én ting. Du trenger ikke å teste at du har korrekt brukernavn og passord i konfigurasjonen for hver eneste test du skriver. Hvis navnet på testen indikerer at en brukers adresse skal kontrolleres så skal testen gjøre det, og lite annet. Samme testen kan gjerne teste forskjellig input dersom det virker hensiktsmessig. For eksempel kan en e-postadresse-validator kontrollere flere godkjente e-postadresser, men kanskje bør det være en egen testfunksjon for verdier som skal feile valideringen.</p>
<h3>Samhandling med andre arkitekturprinsipper</h3>
<p>Det er mulig å kombinere struktur på utviklingsmiljøet med andre arkitekturvalg. For enkle web-løsninger er trelagsarkitekturen MVC (model-view-controller) populær, hvor man skiller applikasjonslogikk fra datamodell og presentasjon, og man kan plasserer filer i en katalog navngitt etter laget hvor de hører hjemme.</p>
<p>Hvis prosjektet setter domenedrevet design høyt så kan det være smart å segmentere ut filene som utgjør domenemodellene i egne kataloger, for å holde domenet samlet uten for mye støy fra annen kode.</p>
<h3>En felles hverdag</h3>
<p>Det er smart å ha orden i prosjektet sitt. Kildekoden til prosjektet kan sees på som skrivebordet ditt; hvis det er vanskelig å finne det du leter etter så er ikke arbeidsmiljøet optimalt. I et prosjekt med mange utviklere betyr dette at alle deler &#8220;felles skrivebord&#8221;. Å sette retningslinjer som alle i prosjektgruppen enes om å følge kan bidra til en ryddigere hverdag for alle, men retningslinjene bør ikke blir detaljerende og vanskelige å følge. Alle skal føle seg komfortable med disse.</p>
<p>Det er en felles hverdag. En god struktur bidrar til raskere utvikling, enklere feilsøking, og etterhvert til bedre kode med færre feil.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2011/04/05/strukturell-utviklingsarkitektur/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How to build PHP extension tidy as shared object</title>
		<link>https://hovenko.no/blog/2010/10/26/how-to-build-php-extension-tidy-as-shared-object/</link>
		<comments>https://hovenko.no/blog/2010/10/26/how-to-build-php-extension-tidy-as-shared-object/#comments</comments>
		<pubDate>Tue, 26 Oct 2010 11:31:26 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[English-posts]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=487</guid>
		<description><![CDATA[If you already got a PHP installation setup, you may need another extension/module from the PHP source tree. You can build and install that single module from the source while keeping the rest of the PHP installation intact, but the documentation of building shared PHP modules is poor. In my case I needed the tidy [...]]]></description>
			<content:encoded><![CDATA[<p>If you already got a PHP installation setup, you may need another extension/module from the PHP source tree.</p>
<p>You can build and install that single module from the source while keeping the rest of the PHP installation intact, but the documentation of building shared PHP modules is poor.</p>
<p>In my case I needed the <em>tidy</em> extension, and here&#8217;s how to do it</p>
<pre><code>
 $ # extract the PHP source code and enter the directory
 $ ./configure --with-tidy=shared
 $ find . -name tidy.so
</code></pre>
<p>Then copy the tidy.so file to the modules directory of the PHP installation.</p>
<p>The important part here is the <em>shared</em> keyword, which is poorly documented. I had to inspect a RPM spec file to figure it out.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2010/10/26/how-to-build-php-extension-tidy-as-shared-object/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL, PHP, MDB2 og NULL-problemer</title>
		<link>https://hovenko.no/blog/2010/10/02/mysql-php-mdb2-og-null-problemer/</link>
		<comments>https://hovenko.no/blog/2010/10/02/mysql-php-mdb2-og-null-problemer/#comments</comments>
		<pubDate>Sat, 02 Oct 2010 14:27:48 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[kompatibilitet]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=478</guid>
		<description><![CDATA[MDB2 har en fin kompatibilitetsliste for å kompansere for problemer i Oracle SQL, men disse er også aktivert for andre databaser. Med andre ord så blir tomme strenger (&#8220;&#8221;) behandlet som NULL. Dermed rapporterer MySQL med en feilmelding dersom du forsøker å sette en tom streng i et &#8220;NOT NULL&#8221;-felt. Hurra! Heldigvis går det an [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://pear.php.net/MDB2/">MDB2</a> har en fin kompatibilitetsliste for å kompansere for problemer i Oracle SQL, men disse er også aktivert for andre databaser.</p>
<p>Med andre ord så blir tomme strenger (&#8220;&#8221;) behandlet som NULL. Dermed rapporterer MySQL med en feilmelding dersom du forsøker å sette en tom streng i et &#8220;NOT NULL&#8221;-felt. Hurra!</p>
<p>Heldigvis går det an å <a href="http://stackoverflow.com/questions/266431/empty-string-in-not-null-column-in-mysql/266545#266545">skru av kompatibilitetslagene i MDB2</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2010/10/02/mysql-php-mdb2-og-null-problemer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaZone jz10 dag 2</title>
		<link>https://hovenko.no/blog/2010/09/19/javazone-jz10-dag-2/</link>
		<comments>https://hovenko.no/blog/2010/09/19/javazone-jz10-dag-2/#comments</comments>
		<pubDate>Sun, 19 Sep 2010 00:01:55 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Jobb]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaZone]]></category>
		<category><![CDATA[teknologi]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=473</guid>
		<description><![CDATA[Nå er det riktignok gått halvannen uke siden JavaZone var over, men en kort oppsummering av dag to kan allikevel tillates. På den andre dagen, 9. september, lærte jeg litt om &#8220;Matching Engines&#8221;, om høye krav til ytelse og nøyaktighet og fikk virkelig innblikk i at tid koster penger, spesielt på nedetid. Videre lærte jeg [...]]]></description>
			<content:encoded><![CDATA[<p>Nå er det riktignok gått halvannen uke siden JavaZone var over, men en kort oppsummering av dag to kan allikevel tillates.</p>
<p>På den andre dagen, 9. september, lærte jeg litt om &#8220;Matching Engines&#8221;, om høye krav til ytelse og nøyaktighet og fikk virkelig innblikk i at tid koster penger, spesielt på nedetid.</p>
<p>Videre lærte jeg ikke så mye nytt om offentlige data. Synd at hele panelet utelukkende bestod av folk som ønsker fri tilgang til offentlige data, men ingen med myndighet til å kunne gjøre noe med det.</p>
<p>Så skulle jeg lære om hva jeg gjør feil med domenedrevet design (DDD), men foredragsholderen var forsinket, så jeg sneik meg inn på en sesjon om planlegging og å ta valg i utviklingsteam. Spesielt én ting fant jeg svært interessant, å premiere feiling for å oppmuntre til å ta sjanser og utfordre seg selv.</p>
<p>Videre lærte jeg hvordan man kan implementere Dungeon and Dragons i RESTful web services basert på prinsippene rundt <a href="http://en.wikipedia.org/wiki/HATEOAS">HATEOAS</a>, å bruke HTTP som motoren til å drive tilstand i applikasjoner.</p>
<p>Så lærte jeg at man må kjøpe Coherence for å bekjempe ytelsesproblemer i systemer. Et foredrag med stort preg av å selge inn Oracle-produktet, dessverre.</p>
<p>Så forvillet jeg meg inn på et foredrag om vedlikehold og utvikling av legacy-systemer.</p>
<p>Til slutt så fikk jeg med meg foredraget om domenedrevet design som ble satt opp. Greit å bli oppdatert på de mer vanskelige aspektene rundt denne teknikken, og selv om foredraget var kort så passet det egentlig bra som avslutning på JavaZone.</p>
<p>Nå er video av foredragene lagt ut på <a href="http://streaming.java.no/tcs/">java.no</a>. Har allerede sett noen lyntaler og lengre foredrag, og kan anbefale lyntalene om &#8220;97 things every programmer should know&#8221; og &#8220;Hjemmelaget er bedre enn takeout&#8221;, hvor begge lufter tanker om å kaste idéer og kode som blir for vanskelige å integrere eller som kommer i veien.</p>
<p>Selv så er jeg dårlig på å kaste kode, men jeg har i det siste kastet kode et par ganger, og selv om det gjør vondt der og da, så savner jeg ikke koden jeg skrev. Det er faktisk deilig å ikke ha uinnsjekket kode liggende over lengre tid.</p>
<p>Det jeg skal ta med videre fra JavaZone 2010 er idéene rundt HATEOAS og event drevet arkitektur. Sistnevnte har jeg allerede utforsket mye på fra før, og dette er motoren for å dytte data rundt i prosjektet jeg for tiden jobber på.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2010/09/19/javazone-jz10-dag-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaZone jz10 dag 1</title>
		<link>https://hovenko.no/blog/2010/09/09/javazone-jz10-dag-1/</link>
		<comments>https://hovenko.no/blog/2010/09/09/javazone-jz10-dag-1/#comments</comments>
		<pubDate>Wed, 08 Sep 2010 22:41:43 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Jobb]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaZone]]></category>
		<category><![CDATA[teknologi]]></category>

		<guid isPermaLink="false">https://hovenko.no/blog/2010/09/09/javazone-jz10-dag-1/</guid>
		<description><![CDATA[Dag 1 er over for JavaZone 2010. Det har vært mange temaer og tankene svever nå litt rundt i skyen foreløpig. Jeg lærte i dag at hvis man plasserer en Map/Reduce-jobb hos Amazon, så tar det ca 30 ganger lenger tid å kjøre enn på en laptop. Jeg lærte at hvis webappen din sliter under [...]]]></description>
			<content:encoded><![CDATA[<p>Dag 1 er over for <a href="http://jz10.java.no/">JavaZone 2010</a>. Det har vært mange temaer og tankene svever nå litt rundt i skyen foreløpig.</p>
<p>Jeg lærte i dag at hvis man plasserer en Map/Reduce-jobb hos Amazon, så tar det ca 30 ganger lenger tid å kjøre enn på en laptop.</p>
<p>Jeg lærte at hvis webappen din sliter under høy last mot eksterne ressurser, så legg inn sleep(1).</p>
<p>Jeg lærte at Collaborative Filtering kan være et spennende tiltak for å gi noe ekstra tilbake til brukerne.</p>
<p>Jeg lærte at det finnes mange tilnærminger til eventdrevet design.</p>
<p>Jeg lærte at Datalagringsdirektivet har forkjempere og motstandere som ikke alltid klarer å finne ut hvordan livets, trygghetens og frihetens vektskål skal balanseres.</p>
<p>Jeg lærte at RESTful ikke handler om XML og pene URL-er, men om å håndtere state mellom klient og tjener og at resten er bare hjelpemidler for å komme seg dit.</p>
<p>Jeg lærte at det finnes alltid et sikkerhetstiltak som man ikke har tenkt på eller ikke har forstått konsekvensene av.</p>
<p>Jeg lærte at Java har en tung vei å gå for å skape typeorienterte vaner.</p>
<p>Jeg lærte at man bør ha fulladet telefon før man drar på JavaZone.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2010/09/09/javazone-jz10-dag-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debugging Google Maps in Android applications &#8211; uses-library</title>
		<link>https://hovenko.no/blog/2010/07/20/debugging-google-maps-in-android-applications-uses-library/</link>
		<comments>https://hovenko.no/blog/2010/07/20/debugging-google-maps-in-android-applications-uses-library/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 21:17:11 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[English-posts]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[debugging]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=445</guid>
		<description><![CDATA[If your application is failing with a ClassNotFoundException of the class com.google.android.maps.MapView, then the uses-library tag might be misplaced or missing from the application manifest XML. When adding Google Maps to your Android application, make sure that the &#60;uses -library&#62;-tag is inside the &#60;application&#62;-tag of the manifest XML. This might be obvious, but I got [...]]]></description>
			<content:encoded><![CDATA[<p>If your application is failing with a ClassNotFoundException of the class <strong>com.google.android.maps.MapView</strong>, then the uses-library tag might be misplaced or missing from the application manifest XML.</p>
<p>When adding Google Maps to your Android application, make sure that the &lt;uses -library&gt;-tag is inside the &lt;application&gt;-tag of the manifest XML. This might be obvious, but I got this wrong and it took me a long time to figure out the real reason for the error.</p>
<p><code><br />
&lt;uses -library android:name="com.google.android.maps" /&gt;<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2010/07/20/debugging-google-maps-in-android-applications-uses-library/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debugging your Android application</title>
		<link>https://hovenko.no/blog/2010/01/09/debugging-your-android-application/</link>
		<comments>https://hovenko.no/blog/2010/01/09/debugging-your-android-application/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 16:43:12 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[English-posts]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[debugging]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=396</guid>
		<description><![CDATA[I am novice on Android application development, slowly starting to understand the architecture. I particularly like that communication between applications and data storage are resource centric. But anyway&#8230; If you have been developing mobile applications for Android you have most likely seen some exceptions in the Eclipse debugger that you don&#8217;t understand, maybe not the [...]]]></description>
			<content:encoded><![CDATA[<p>I am novice on <a href="http://developer.android.com/">Android application development</a>, slowly starting to understand the architecture. I particularly like that communication between applications and data storage are resource centric. But anyway&#8230;</p>
<p>If you have been developing mobile applications for Android you have most likely seen some exceptions in the Eclipse debugger that you don&#8217;t understand, maybe not the tiniest bit. This mostly has to do with lack of experience with the API combined with the strict way that Android sets up views and restricts which threads that are allowed to draw and control the views, along with other concurrency issues.</p>
<p>Starting up your application in the emulated Android environment is not the fastest thing to do, so how can you debug your applications in a little more snappier way? &#8211; In short, I really don&#8217;t know.</p>
<p>What I want is a sane error message with a stack trace of my application code, but since I can&#8217;t get that, I have to debug my application in other ways.</p>
<p><strong>Break points</strong><br />
By setting a breakpoint in your code on places where you think the bug might exist, you can step through your source code until the application fails.</p>
<p>The cons of this are that it is time consuming to do all the manual step by step operations, it&#8217;s a boring way of debugging and the exception message you get might not be understandable to you.</p>
<p><strong>Logging</strong><br />
The Android API provides a <a href="http://developer.android.com/reference/android/util/Log.html">Log class</a> that can be used to log messages and exceptions. It took me some time to figure out how to read the log messages, but the Android Eclipse plugin provides a LogCat view.</p>
<p>To show the LogCat view in Eclipse, you go to &#8220;Window&#8221;, &#8220;Show View&#8221;, &#8220;Other &#8230;&#8221;, expand the &#8220;Android&#8221; category and then open the &#8220;LogCat&#8221; view.</p>
<p>Example output from the LogCat view.<br />
<code>
<pre>
01-09 16:56:52.069: ERROR/Listings(1064): Failed to get trip listings
01-09 16:56:52.069: ERROR/Listings(1064): java.lang.RuntimeException: Example of exception logging
01-09 16:56:52.069: ERROR/Listings(1064):     at no.ut.trip.Listings$ProgressThread.run(Listings.java:112)
</pre>
<p></code></p>
<p>The example above shows an error message on the first line, the exception class and message on the second line, with the stack trace on the following lines. Might be helpful.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2010/01/09/debugging-your-android-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Don&#8217;t sort on tokenized strings in Solr</title>
		<link>https://hovenko.no/blog/2009/12/15/dont-sort-on-tokenized-strings-in-solr/</link>
		<comments>https://hovenko.no/blog/2009/12/15/dont-sort-on-tokenized-strings-in-solr/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 07:46:28 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[English-posts]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[Solr]]></category>
		<category><![CDATA[sort]]></category>
		<category><![CDATA[tokenizer]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=392</guid>
		<description><![CDATA[Apache Solr is a very powerful index and search engine. Unfortunately it does have some flaws, at least I think this issue is somehow not &#8220;by design&#8221;. If you are going to use a field to sort on, make sure you use one of the native data types in Solr, and don&#8217;t enable any tokenizer [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://lucene.apache.org/solr/">Apache Solr</a> is a very powerful index and search engine. Unfortunately it does have some flaws, at least I think this issue is somehow not &#8220;by design&#8221;.</p>
<p>If you are going to use a field to sort on, make sure you use one of the native data types in Solr, and don&#8217;t enable any tokenizer on that data type. If you do, you might end up with HTTP 500 Internal Server Error and error log messages like this:</p>
<blockquote><p>
SEVERE: java.lang.RuntimeException: there are more terms than documents in field &#8220;title&#8221;, but it&#8217;s impossible to sort on tokenized fields
</p></blockquote>
<p>I found out that I had been using a data type with some filters and a tokenizer on a couple of fields, quite unnecessary since I don&#8217;t do any search on them. I have another field that I do search on. I only use these fields for display and sort.</p>
<p>Keep it simple. Use &#8220;string&#8221; for strings you don&#8217;t have to search on. If you have to do both search and sort on a field, make two fields. For example, name one of them like &#8220;title.sort&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2009/12/15/dont-sort-on-tokenized-strings-in-solr/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
