<?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; Java</title>
	<atom:link href="http://hovenko.no/blog/tag/java/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>Bigdata RDF-server erfaringer</title>
		<link>https://hovenko.no/blog/2014/06/23/bigdata-rdf-server-erfaringer/</link>
		<comments>https://hovenko.no/blog/2014/06/23/bigdata-rdf-server-erfaringer/#comments</comments>
		<pubDate>Mon, 23 Jun 2014 09:13:25 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Infrastruktur]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[Bigdata]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RDF]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=813</guid>
		<description><![CDATA[I jobbsammenheng jobber jeg mye med modellering av data i RDF. Vi har lenge lagret RDF-grafer som filer på disk, men har den siste tida undersøkt flere RDF-databaser. Felles for de fleste grafdatabaser er at de trives best i RAM. Store installasjoner som skryter av å lagre milliarder av tripler består enten av servere med [...]]]></description>
			<content:encoded><![CDATA[<p>I jobbsammenheng jobber jeg mye med modellering av data i <a href="http://www.w3.org/RDF/">RDF</a>.</p>
<p>Vi har lenge lagret RDF-grafer som filer på disk, men har den siste tida undersøkt flere RDF-databaser.</p>
<p>Felles for de fleste grafdatabaser er at de trives best i RAM.<br />
<a href="http://www.w3.org/wiki/LargeTripleStores">Store installasjoner som skryter av å lagre milliarder av tripler</a> består enten av servere med masse minne, eller av mange maskiner i et kluster som tilsammen innehar mye minne &#8211; da snakker vi størrelsesorden hundrevis av GB RAM.</p>
<h2>Tidligere tester av RDF-databaser</h2>
<p>Vi har tidligere testet <a href="http://jena.apache.org/documentation/serving_data/index.html">Jena Fuseki</a> og <a href="http://virtuoso.openlinksw.com/">OpenLink Virtuoso</a>, men begge har sine irriterende problemer.</p>
<h3>Jena Fuseki TDB</h3>
<p>Jena Fuseki med TDB blir fort ubrukelig når databasen blir større enn Java heap-size, og den feiler ofte med OutOfMemoryError.<br />
Testet med 4 GB Java-heap.</p>
<h3>OpenLink Virtuoso</h3>
<p>OpenLink Virtuoso har vi testet i versjon 6 og versjon 7.<br />
Versjon 6, som følger med i pakkesystemet til Ubuntu, støttet ikke SPARQL UPDATE.<br />
Versjon 7 feiler når vi prøver å laste inn grafer som inneholder mange blank nodes, selv om vi klarte å hacke oss til en løsning ved å splitte opp insertene i mindre deler.<br />
Generelt sett har Virtuoso flere irriterende problemer, blant annet at den ikke forstår &#8220;INSERT DATA&#8221; fra SPARQL UPDATE &#8211; her måtte vi bruke &#8220;INSERT INTO&#8221;.</p>
<h2>Bigdata</h2>
<p>Jeg har i noen dager testet <a href="http://www.bigdata.com/">Bigdata</a>, en server for lagring og spørring over RDF-data.</p>
<p>Bigdata-serveren er en Java-applikasjon som kjører i en standard Servlet applikasjons-container.</p>
<h2>Innlasting av data</h2>
<p>Datagrunnlaget er oppdelt i 525K (<strong>525.000</strong>) grafer &#8211; dokumenter i RDF/TURTLE-format.</p>
<p>Grafene inneholder mange blank nodes, ressurser som ikke er navngitte og globalt identifisérbare med IRI.<br />
Grunnen til at vi bruker blank nodes er fordi vi konstruerer ressurser sammensatt av data fra kildesystemer som ikke tilordner ID-er til disse konseptene.<br />
Dersom vi skulle konstruert ID-er for disse ressursene må vi bruke mye energi og mange kodelinjer for å holde de ID-ene stabile, for å tilordne de samme ID-ene ved neste eksport fra kildesystemet &#8211; da er det mye enklere å konstruerer blank nodes.</p>
<p>Innlasting av data ble gjort graf for graf i form av <a href="http://www.w3.org/TR/sparql11-update/">SPARQL UPDATE</a>-meldinger over HTTP, hver delt i to seksjoner &#8211; først sletting av eksisterende tripler i grafen, for så innsetting av nye tripler i samme graf.</p>
<p>Sletting av grafer er en viktig funksjon i vårt tilfelle, da vi ønsker å bytte ut alle tripler fra en eventuell gammel versjon av grafen med tripler fra en ny versjon.<br />
Utskiftingen av hele grafer ønsker vi å gjøre som en atomisk operasjon for å unngå at en graf fremstår som tom før nye data lastes inn.</p>
<h3>Serveroppsett</h3>
<p>Jeg startet med å kjøre Bigdata i en Jetty-container på en server med 4 GB RAM og 100 GB disk &#8211; <strong>dbdev01</strong>.<br />
Med unntak av lokasjonen til journal-fila (databasen til Bigdata), kjørte jeg med standardinnstillinger og 2 GB Java-heap.</p>
<h3>Datamengder</h3>
<p>Mot denne lastet jeg inn ca 450K (<strong>450.000</strong>) grafer.<br />
Dette utgjorde i overkant av 84M (<strong>84.000.000</strong>) tripler.</p>
<p>Journal-fila vokste til 14 GB.</p>
<h3>Ytelse ved innlasting av data</h3>
<p>I starten klarte jeg å laste inn ca 10 grafer per sekund.<br />
Det er ikke spesielt imponerende hastighet, men siden dette var en test så lot jeg prosessen fortsette.<br />
Etter ett døgn var hastigheten nede i 2-3 grafer per sekund.<br />
Etter to døgn var hastigheten nede i 1-2 grafer per sekund.</p>
<p>Å gjøre SPARQL-spørringer mot databasen samtidig som importen pågikk var bortimot ubrukelig, selv enkle spørringer som å hente ut navn på 60 ressurser.<br />
Samtidig sakt importhastigheten ned til ca 1 graf per 10 sekunder.</p>
<p>Da var 450.000 grafer importert, 85% av datasettet vårt, som for tiden øker med ca 100.000 grafer per år.<br />
Dette skalerer ikke.<br />
Bestemte meg for å avbryte importen.</p>
<h3>Ny server med mer minne</h3>
<p>Jeg fikk en ny server til rådighet, med 32 GB RAM og 100 GB disk &#8211; <strong>dbdev02</strong>.<br />
Serveren kjørte allerede noen tjenester, så jeg hadde ca 28 GB RAM ledig.<br />
Ellers var det lite last på serveren.</p>
<p>Jeg kopierte journal-fila på 14GB fra dbdev01 til dbdev02, og starta opp Bigdata på begge servere, samme konfigurasjon, og med 1 GB Java heap.</p>
<h2>Ytelsestester spørringer</h2>
<p>Gjorde samme tester mot begge serverne.</p>
<h3>Test #1</h3>
<p>Første spørringen mot serveren er en SPARQL-spørring med datofiltrering og dybde på 5 (Vedlegg 1).<br />
Resultatet fra spørringen er ca 80K (<strong>80.000</strong>) løsninger, i SPARQL RESULTS XML-format på 75 MB.</p>
<p>Ved kald, nyoppstartet Bigdata var dbdev02 (24s) vesentlig raskere enn dbdev01 (2m31s).</p>
<p>Ved gjentatte utføringer av samme spørring var begge servere nokså like raske, også etter kjøring av andre relativt enklere spørringer i mellomtiden.</p>
<h3>Test #2</h3>
<p>En annen spørring som ga store utslag var med dybde på 4, uten filtrering og med LIMIT 100.000 (Vedlegg 2).<br />
Resultatet fra spørringen er ca 53K (<strong>53.000</strong>) løsninger, i SPARQL RESULTS XML-format på 22 MB.<br />
Resultatet var altså mindre enn den angitte begrensningen på 100K.</p>
<p>dbdev02 (1m19s) var mye raskere enn dbdev01 (12m23s).<br />
Dette var med varm database.</p>
<h3>Innlasting av data mot 32 GB minne</h3>
<p>En ny test av import av data, som inkluderer overskriving av gamle grafer, denne gang gjort mot dbdev02 med 32 GB minne, viser en importhastighet på ca 5 grafer i sekundet.</p>
<h2>Analyse av testresultatene</h2>
<p>Den største forskjellen er rett etter Bigdata nettopp har starta opp.<br />
Mange av spørringene som ga store utslag etter kald oppstart returnerte omtrent like raskt etter gjentagende spørringer.<br />
Dataene i resultatet blir muligens cachet et sted.</p>
<h3>Minne</h3>
<p>dbdev01 har etter noen spørringer lite ledig RAM, mens dbdev02 har mye ledig RAM.<br />
Det kan tyde mot at Bigdata har det bedre når mye av datafila ligger i minnet.</p>
<h3>Diskytelse</h3>
<p>Hjelper nok også om disken er rask.<br />
Virker som at disken er raskere på dbdev02 enn dbdev01.<br />
En test lokalt på hver server viser at kopiering av fil på 1 GB tok 14.5s på dbdev01 og 6.2s på dbdev02.<br />
Ingen prosesser på noen av boksene som bruker nevneverdig mye disk-IO når Bigdata idler.</p>
<h3>Swapping</h3>
<p>Kanskje swapping på dbdev01 kan være årsak, selv om swap-aktiviteten for tiden er lav.</p>
<p>Munin-graf over minne for dbdev02 viser en økning på 16GB i cache (fil-cache) etter oppstart av Bigdata.<br />
Null swapping.</p>
<p>Munin-graf over minne for dbdev01 er fullstendig mongo, går opp og ned som en jojo i den perioden Bigdata har kjørt (2 dager).<br />
Viser også mye swapping, spesielt under inserts.</p>
<h2>Konklusjon</h2>
<p>Bigdata trives veldig godt med mye RAM og bruker operativsystemets filcache for å få rask aksess til dataene.</p>
<p>Bigdata feiler ikke like dramatisk som Jena Fuseki TDB når minnet går fullt.<br />
Selv om vi endte opp med å teste Bigdata med mer minne enn vi testet med Jena Fuseki TDB, så taklet Bigdata med 4 GB minne mye større datasett enn Jena Fuseki TDB klarte med det samme.</p>
<p>Det er ikke så viktig med stor Java heap under innlasting av data.<br />
Heap-størrelsen øker når det gjøres spørringer, så større heap har kanskje en positiv effekt ved mange og tunge spørringer.</p>
<p>Den nye innlastingstesten viser at Bigdata er mye raskere på innlasting av data dersom den har nok minne til databasen.</p>
<h2>Vedlegg</h2>
<h3>Vedlegg 1: SPARQL Test #1</h3>
<p>SPARQL-spørring som lister ut avspilt musikk i en tidsperiode på én måned:</p>
<p><code>
<pre>
PREFIX dct: &lt;http://purl.org/dc/terms/&gt;
PREFIX ebuccdm: &lt;http://www.ebu.ch/metadata/ontologies/ebuccdm#&gt;
PREFIX digas: &lt;http://id.nrk.no/2013/digas/class/&gt;
PREFIX xsd: &lt;http://www.w3.org/2001/XMLSchema#&gt;

SELECT * WHERE {
  GRAPH ?g {
    ?part a digas:Music .
    ?timeline ebuccdm:hasTimelineTrackPart ?part .
    ?prog ebuccdm:hasTimelineTrack ?timeline .
    ?trans ebuccdm:playsOut ?prog .

    ?part dct:title ?partTitle .
    ?prog dct:title ?progTitle .
    ?trans ebuccdm:publicationStartDateTime ?startTime .
    FILTER ( ?startTime &gt;= &quot;2014-01-01T00:00:00+01:00&quot;^^xsd:dateTime ) .
    FILTER ( ?startTime &lt; &quot;2014-02-01T00:00:00+01:00&quot;^^xsd:dateTime ) .
  }
}
ORDER BY ?startTime
</pre>
<p></code></p>
<h3>Vedlegg 2: SPARQL Test #2</h3>
<p>SPARQL-spørring som lister ut medvirkende på programmer med en begrensning på 100.000 resultater:</p>
<p><code>
<pre>
PREFIX nrk: &lt;http://gluon.nrk.no/dataordbok.xml#&gt;
PREFIX dct: &lt;http://purl.org/dc/terms/&gt;
PREFIX ebuccdm: &lt;http://www.ebu.ch/metadata/ontologies/ebuccdm#&gt;

SELECT ?obj ?title ?contactName ?roleName
WHERE {
    ?obj a nrk:programme .
    ?obj dct:title ?title .
    ?obj ebuccdm:hasContributor ?contributor .
    ?contributor ebuccdm:contactName ?contactName .
    ?contributor ebuccdm:hasRole ?role .
    ?role ebuccdm:roleName ?roleName .
} LIMIT 100000
</pre>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2014/06/23/bigdata-rdf-server-erfaringer/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>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>Howto bypass Weblogic security model</title>
		<link>https://hovenko.no/blog/2008/10/28/howto-bypass-weblogic-security-model/</link>
		<comments>https://hovenko.no/blog/2008/10/28/howto-bypass-weblogic-security-model/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 22:08:08 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[English-posts]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[sikkerhet]]></category>
		<category><![CDATA[Weblogic]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=180</guid>
		<description><![CDATA[Oracle Weblogic (former BEA Weblogic) enforces a security model by default that is unhealthy for developers writing REST web services or other kinds of web applications using HTTP Authentication for security. By default, when sending an HTTP Authentication header, Weblogic will check its own security realms for users matching the username and password. If there [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle Weblogic (former BEA Weblogic) enforces a security model by default that is unhealthy for developers writing REST web services or other kinds of web applications using HTTP Authentication for security.</p>
<p>By default, when sending an HTTP Authentication header, Weblogic will check its own security realms for users matching the username and password. If there is no match, a 401 UNAUTHORIZED response is sent directly back to the client, without ever hitting your web application code. That takes care of the security, i guess&#8230;</p>
<p>This might sound like a good idea, except for those cases when your application is able to handle its own authentication. How can your application handle security when the request never hits your code?</p>
<p>Another problem, as i see it, is that Weblogic enforces this security model even for web application that are configured with no security at all. You can use your web application as much as you like, as long as you don&#8217;t send any HTTP Authentication headers. But when you decide to send an HTTP Authentication header like that, just for fun or when navigating from another website after being authenticated, Weblogic decides on your applications behalf that you are no longer worthy enough to use your application. That sucks&#8230;</p>
<p><strong>The solution</strong><br />
The solution? Yes, you can bypass the security model of Weblogic, at least for those applications that does not rely on the web containers security. It took me many weeks of frustration before I found a solution to my problem, but I got there&#8230;</p>
<p>Shutdown your admin server and open the config/config.xml file for editing. Add the following XML code into the &lt;security -configuration&gt; node:</p>
<blockquote><p>
&lt;enforce-valid-basic-auth-credentials&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;false<br />
&lt;/enforce-valid-basic-auth-credentials&gt;
</p></blockquote>
<p>Start the admin server again. Then you need to restart all the application servers to make the change take effect. Restart them one by one to avoid downtime&#8230; you are of course running a cluster right? <img src='https://hovenko.no/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2008/10/28/howto-bypass-weblogic-security-model/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
