<?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>Staffan Malmgrens blogg &#187; programming</title>
	<atom:link href="http://blog.tomtebo.org/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tomtebo.org</link>
	<description>Programmering, juridik, punkrock och andra trivialiteter</description>
	<lastBuildDate>Sun, 01 Jan 2012 14:51:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>GPL, CC och skillnadens betydelse för Remix</title>
		<link>http://blog.tomtebo.org/2010/07/30/gpl-cc-och-skillnadens-betydelse-for-remix/</link>
		<comments>http://blog.tomtebo.org/2010/07/30/gpl-cc-och-skillnadens-betydelse-for-remix/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 20:02:24 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[creative commons]]></category>
		<category><![CDATA[fri programvara]]></category>
		<category><![CDATA[gpl]]></category>
		<category><![CDATA[lessig]]></category>
		<category><![CDATA[remix]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/?p=878</guid>
		<description><![CDATA[Som jag nämnde tidigare idag har jag konverterat en bok till epub-format. Det krävde några kvällars arbete, och gav stoff till åtminstone tre blogginlägg. Jag slår ihop dem till ett genom att fuska mig igenom de första två i förbigående. &#8230; <a href="http://blog.tomtebo.org/2010/07/30/gpl-cc-och-skillnadens-betydelse-for-remix/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Som jag <a href="http://blog.tomtebo.org/2010/07/30/lawrence-lessigs-remix-in-epub-format/">nämnde tidigare idag</a> har jag konverterat en bok till epub-format. Det krävde några kvällars arbete, och gav stoff till åtminstone tre blogginlägg. Jag slår ihop dem till ett genom att fuska mig igenom de första två i förbigående.</p>
<p><strong>1: Epub är inget bra format för eböcker.</strong> Jag skaffade nyligen en Sony PRS-300, vilken jag är riktigt nöjd med (åtminstone nöjdare än <a href="http://www.flickr.com/photos/jocke66/4486419580/">Jocke</a>). Den läser, i likhet med en <a href="http://www.apple.com/ipad/features/ibooks.html">lite mer hajpad läsplatta</a>, <a href="http://en.wikipedia.org/wiki/EPUB">epub-formatet</a>. Som flera andra moderna format är det i princip en zippad hög med XHTML-filer, samt övriga resurser (bilder, stylesheets osv). Det är en bra början att bygga på standardiserade format som dessutom kan undersökas med enkla verktyg (vilket kan jämföras med betydelsen av &#8221;view source&#8221;-konceptet för webben), men det finns ett par problem:</p>
<ul>
<li>I böcker används fotnoter. Det finns inget bra och etablerat sätt att med XHTML/CSS2.1, och därmed i ePub, representera fotnoter (det <a href="http://www.w3.org/TR/2007/WD-css3-gcpm-20070205/#footnotes">finns i CSS3</a>, men det stöds inte av epub-standarden).</li>
<li>I böcker används sidnummer. Det finns inget standardiserat <em>och</em> väletablerat system för att koppla sidnummer till textavsnitt (det finns däremot ett <a href="http://www.epubbooks.com/blog/20081209/marking-up-page-numbers-in-the-epub-ncx/">standardiserat</a>, och ett <a href="http://www.adobe.com/devnet/digitalpublishing/epubs/EPUBBestPractices-1_0_3.epub">helt annat, väletablerat</a>, system). Vilket är trist för den som vill hänvisa till ett visst ställe i en epub-bok.</li>
<li>Epub-formatet har inte annammat &#8221;<a href="http://softwareengineering.vazexqi.com/files/pattern.html">convention over configuration</a>&#8221;-principen, vilket leder till en rad filer vars innehåll är statiskt eller upprepningar av information som redan finns någon annanstans. Varje enskild del av en bok hänvisas två gånger i content.opf, och ytterligare en gång i toc.ncx.</li>
</ul>
<p>Kanske hade det varit bättre att bygga på <a href="http://www.oasis-open.org/docbook/">DocBook</a> eller <a href="http://www.tei-c.org/index.xml">TEI</a>?</p>
<p><strong>2: Att konvertera PDF till epub på ett bra sätt är icketrivialt.</strong> Epub är, genom att det bygger på XHTML, ett format som låter oss uttrycka semantiken i en text (eller åtminstone textens yttre form). Vi kan tala om att en rubrik är just det, och inte bara en textsnutt som råkar ha ett visst typsnitt, i en viss storlek, placerad på ett visst ställe på en sida (vilket är allt PDF låter oss göra). I Remix används <a href="http://en.wikipedia.org/wiki/Chapter_(books)">kapitel</a> (samt ett antal andra typer av textsektioner), fyra rubriknivåer, <a href="http://en.wikipedia.org/wiki/Block_quotation">blockcitat</a>, <a href="http://en.wikipedia.org/wiki/Footnote">fotnoter</a>, slutnoter, <a href="http://en.wikipedia.org/wiki/Smallcaps">kapitäler</a>, <a href="http://en.wikipedia.org/wiki/Initial#Types_of_initials">anfanger</a>, index, sidhuvuden, sidfötter samt på ett ställe dialog.</p>
<p>All information om att en viss textsnutt representerar någon av dessa konstruktioner är borttagna i en PDF. Allt som återstår är information om var på en sida varje enskild textsnutt ska placeras, och med vilket typsnitt det ska visas. Om man i löpande text  exempelvis <strong>fetstilar</strong> något representeras detta som en separat textsträng. Att avgöra vilka textsträngar som tillsammans utgör ett stycke är ganska svårt.</p>
<p>Man får en bild av hur svårt det är om man tar en PDF-fil och använder Adobe Readers inbyggda &#8221;Save as text&#8221;-funktion. Det var så jag började konvertera hela texten. Genom lite sök-och-ersätt samt dess kusin-på-stereoider, <a href="http://www.emacswiki.org/emacs/KeyboardMacros">tangentbordsmakron i emacs</a>, kunde jag steg för steg återskapa den semantik som ursprungligen fanns i Lessigs text, innan den konverterades till PDF. Det var detta arbete som tog några kvällar.</p>
<p><strong>3: Allt remixarbete förutsätter tillgång till råformat.</strong> Den remixare som inte har råformat måste först ägna tid åt att konvertera vad han/hon nu har tillgång till, till ett format som duger för att bygga vidare på.</p>
<p>Råformatet är det format man använder för att skapa eller vidareutveckla ett verk. Det är sällan det slutformat som man faktiskt vill använda för att uppleva verket. Råformatet kan vara ett gäng wav-filer (ett för varje inspelat instrument), och slutformatet en mp3-fil. Råformatet kan vara en <a href="http://www.latex-project.org/">LaTeX</a>-fil, några EPS-filer samt en <a href="http://www.bibtex.org/">Bibtex</a>-databas, och slutformatet en PDF. Råformatet kan vara en filstruktur fylld med källkod och slutformatet en exekverbar binär. Ni fattar.</p>
<p>Lessig har tillgängliggjort verket som PDF-fil under en CC-licens,  vilket förstås är generöst (även om <a href="http://blog.tomtebo.org/2009/01/25/om-remixande-och-lessigs-remix/">det tog tid</a>), men jag som  remixare  av innehållet hade hellre velat ha tillgång till de ursprungliga  .doc/.odt-filerna. Istället fick jag ägna mycket tid åt att rekonstruera  ett råformat genom att ta den textfil som Adobe Reader konstruerat och  sedan manuellt märka upp de semantiska element som gått förlorade i  PDF-konverteringen.</p>
<p>Det här är relativt vanligt bland Creative Commons-licensierat material, att man enbart slutformatet, inte råformatet, tillgängliggörs. I öppen källkod-världen skulle ingen drömma om att släppa en kompilerad binär utan att samtidigt den källkod som använts för att bygga densamma (och de som prövar blir <a href="http://getsatisfaction.com/voddler/topics/gpl_and_voddlerplayer_exe">förstås utskällda</a>).</p>
<p>På <a href="http://www.lulu.com/items/volume_67/7897000/7897083/1/print/book.pdf">FSCONS 2008</a> höll Mike Linksvayer från Creative Commons ett föredrag om skillnaden mellan &#8221;Free Software&#8221;-rörelsen (dvs öppen källkod) och &#8221;Free Culture&#8221;-rörelsen (dvs Creative commons), eller kanske snarare hur långt efter den senare ligger efter den förra (Det finns sammanfattat i hans text i <a href="http://www.lulu.com/items/volume_67/7897000/7897083/1/print/book.pdf">boken som gjordes från den konferensen</a>). Bland annat berördes att skillnaden mellan råformat och slutformat för programkod är knivskarp, medans den är betydligt suddigare för exempelvis en bok eller en musikinspelning.</p>
<p>Kanske är det anledniningen till att favoritlicensen inom öppen källkod-rörelsen (<a href="http://www.gnu.org/licenses/gpl.html">GPL</a>) redan i sin andra klausul sätter en viktig definition:</p>
<blockquote><p>The “source code” for a work means the preferred form of the work for making modifications to it.</p></blockquote>
<p>Creative commons-licenserna <a href="http://creativecommons.org/licenses/by-sa/3.0/legalcode">innehåller inget liknande</a>.</p>
<p>En kompilerad binär är relativt hopplös att bygga vidare på, även om man har juridisk tillåtelse. En färdigställd PDF kan man faktiskt bygga något från, även om det tar tid. Kanske är det anledningen till att Lessig nöjer sig med att släppa sina verk enbart i slutformat. Men om man stannar där tror jag att man missar något viktigt. Nämligen:</p>
<p><strong>4: Ju enklare det är att skapa ett nytt slutformat, ju enklare är det att göra en remix.</strong> Om det första man måste göra är att <a href="http://books.google.se/books?id=vPvhzDqZlaAC&amp;lpg=PA17&amp;ots=ck6aQ9RdSc&amp;dq=%22rory%20blyth%22%20%22excel%20as%20a%20database%22&amp;pg=PA20#v=onepage&amp;q&amp;f=false">konvertera en excelfil med ett inbäddat epostmeddelande med en digitalkamerabild av en utskrift av en skärmdump av en accessdatabas</a> så kommer färre personer att göra något kul med informationen. Och om man har skapat det ursprungliga verket med verktyg som gör det svårt eller dyrt att bygga en slutversion så får det samma effekt. När Lawrence Lessig skrev &#8221;Remix&#8221; gissar jag att han använde Microsoft Word eller OpenOffice Writer, för att skapa en eller flera .doc eller .odt-filer, som sedan en typograf laddade in i InDesign och skapade en <a href="http://www.fileinfo.com/extension/indd">.indd-fil</a> utav. Efter en hel del typografiskt finlir skapades slutligen en tryckfärdig PDF. Slutformatet blev mycket grafiskt tilltalande, men krävde säkerligen en hel del manuellt arbete. Om författaren, efter att ha lämnat textmaterialet till typografen, velat göra en omstrukturering, krävs förmodligen att detta manuella arbete till stor del görs om. Nu är jag ingen expert på InDesign, men jag gissar att det är svårt till omöjligt att bara med ett knapptryck (eller hellre en kommandorad) gå från råformat till slutformat. Om inte annat så krävs det tillgång till Adobe InDesign, en proprietär programvara som <a href="http://www.dustin.se/pd_5010430658.aspx">definitivt är utanför min budget</a>.</p>
<p>I &#8221;<a href="http://www.free-culture.cc/freecontent/">Free Culture</a>&#8221; skriver Lessig i sitt förord:</p>
<blockquote><p>I realize that all of the theoretical insights I develop here are insights Stallman described decades ago. One could thus well argue that this work is “merely” derivative.</p>
<p>I  accept that criticism, if indeed it is a criticism. The work of a lawyer is always derivative, and I mean to do nothing more in this book than to remind a culture about a tradition that has always been its own.</p></blockquote>
<p>Jag menar att det finns mer att lära av <a href="http://en.wikipedia.org/wiki/Richard_Stallman">Richard Stallman</a>. Exempelvis kan man uppmärksamma att en av de första program han skrev för sitt helt fria operativsystem var en <a href="http://www.gnu.org/software/make/">implementation av make</a>, ett <em>fritt</em> system för att helt automatiskt från råformat (källkod) skapa ett slutformat (körbart program). Hade Lessig använt det (tillsammans med exempelvis <a href="http://www.latex-project.org/">LaTeX</a>) för att skriva Remix hade han säkert fått se flera remixer av det.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2010/07/30/gpl-cc-och-skillnadens-betydelse-for-remix/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>En arkitektur för webutveckling med semantic web-koncept</title>
		<link>http://blog.tomtebo.org/2009/06/30/en-arkitektur-for-webutveckling-med-semantic-web-koncept/</link>
		<comments>http://blog.tomtebo.org/2009/06/30/en-arkitektur-for-webutveckling-med-semantic-web-koncept/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 22:47:46 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[lagen.nu]]></category>
		<category><![CDATA[metadata]]></category>
		<category><![CDATA[RDF]]></category>
		<category><![CDATA[semantic web]]></category>
		<category><![CDATA[sparql]]></category>
		<category><![CDATA[webutveckling]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/?p=681</guid>
		<description><![CDATA[Idag checkade jag in en ganska stor ändring i kodbasen för lagen.nu. Det är lite vanskligt att göra stora ändringar nu såhär en vecka innan lagkommenteringsprojektet drar igång på allvar, men just den här ändringen bör kunna göra det enklare &#8230; <a href="http://blog.tomtebo.org/2009/06/30/en-arkitektur-for-webutveckling-med-semantic-web-koncept/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Idag checkade jag in <a href="http://trac.lagen.nu/changeset/285">en ganska stor ändring</a> i<br />
kodbasen för lagen.nu. Det är lite vanskligt att göra stora ändringar<br />
nu såhär en vecka innan <a href="http://wiki.lagen.nu/">lagkommenteringsprojektet</a> drar igång<br />
på allvar, men just den här ändringen bör kunna göra det enklare att<br />
pussla ihop ny funktionalitet jämfört med hur det ser ut idag.</p>
<p>Vad ändringen handlar om är att använda RDF på en djupare nivå än<br />
vad som gjorts hittils, och med verktyg som är bättre lämpade. Det jag<br />
har nu börjar kännas nära en arkitektur för att bygga<br />
webbtillämpningar på semantic web-koncept istället för den traditionella kombon <a href="http://foldoc.org/rdbms">RDBMS</a> + SQL + dynamiskt språk<br />
(eller den något mindre traditionella dynamiskt språk + MVC-ramverk + <a href="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx">O/R-mappning</a>). </p>
<p>För att man ska förstå poängen börjar jag med att beskriva hur det har<br />
sett ut tidigare.</p>
<p>Innehållet på lagen.nu <a href="http://trac.lagen.nu/wiki/KodArkitektur">skapas i huvudsak i fyra<br />
steg</a>: Download, Parse, Relate och Generate. De två första stegen handlar<br />
om att hämta innehåll (lagtexter och rättsfall) från andra ställen,<br />
respektive att semantiskt strukturera upp detta (från de text- och<br />
wordfiler som laddats ner). Dessa berörs inte alls av ändringen.</p>
<p>Relate-steget är ganska enkelt: Det går igenom de strukturerade<br />
XHTML2/<a href="http://www.w3.org/TR/xhtml-rdfa-primer/">RDFa</a>-filer som<br />
skapats och plockar ut alla RDF-triples. Dvs från filer som innehåller<br />
både data (lagtext, domslutstext) och metadata (SFS-nummer, titlar,<br />
lagrumshänvisningar&#8230;) så plockas metadatat fram. Detta lagras sedan<br />
separat på lämpligt sätt.</p>
<p>Generate-steget tar sedan en strukturerad XHTML2-fil, exempelvis en<br />
lagtext och transformerar den till XHTML 1.0, färdigt att visas i en<br />
webbläsare. Denna transformering lägger till en massa information,<br />
exempelvis sidhuvud och sidfot, innehållsförteckning, och listor av<br />
relevanta rättsfall under varje paragraf.</p>
<p>För att göra det sista måste transformeringssteget på något vis ha<br />
tillgång till en lista över de relevanta rättsfallen. Tidigare har<br />
detta skett genom att Relate-steget konstruerat en (1) gigantisk<br />
RDF/XML-fil med information om samtliga 10 000+ rättsfall som finns i<br />
systemet, och XSLT-transformationen sedan laddat in denna med ett <a href="http://www.xml.com/pub/a/2002/03/06/xslt.html"><code>document()</code>-anrop</a>. Det<br />
funkar, men är både långsamt och oflexibelt.</p>
<p>Att skapa kopplingar mellan dokument genom systemets samlade metadata<br />
skulle kunna användas på rätt många olika sätt, men idag görs det bara<br />
på två sätt &#8212; dels för listorna på relevanta rättsfall under<br />
lagtextparagraferna, dels för att se till att bara de rättsfall som<br />
faktiskt finns i systemet är länkade i den lista över föregående<br />
rättsfall som finns bredvid varje rättsfall.  Det beror dels på att<br />
det är bökigt att implementera nya kopplingar, dels på att det just nu<br />
inte finns så mycket mer information i systemet än just lagtext och<br />
(svenska) rättsfall.</p>
<p>Men med lagkommenteringsprojektet börjar det senare<br />
ändras. Kommentaren för varje enskild paragraf lagras som ett<br />
RDF-påstående, på formen:</p>
<pre>&lt;http://rinfo.lagrummet.se/publ/sfs/1998:204#P13&gt; dct:description
"Huvudregeln för känsliga uppgifter är ..."</pre>
<p>Och även andra informationskällor ska in. Jag har fyra moduler i<br />
varierande stadier av halvfärdighet (för <a href="http://trac.lagen.nu/browser/trunk/RegPubl.py">propositioner och<br />
utredningsbetänkanden</a>, <a href="http://trac.lagen.nu/browser/trunk/ARN.py">Allmäna<br />
reklamationsnämnens praxis</a>, <a href="http://trac.lagen.nu/browser/trunk/JO.py">JO-beslut</a> och <a href="http://trac.lagen.nu/browser/trunk/Curia.py">EG-domstolens<br />
domslut</a>) och en på planeringensstadiet (EG-lagstiftning).</p>
<p>Med flera informationskällor växer möjligheten för användbara<br />
kopplingar exponentiellt. Under varje paragraf skulle man kunna lista<br />
namnen på den proposition som föranlett lagändringar i denna, eller<br />
namn på EG-direktiv som föranlett propositionerna. För varje sökord<br />
som rättsfall använder kan man skapa en sida som listar andra<br />
rättsfall med samma sökord. Och sen plocka in information från <a href="http://www.rikstermbanken.se/">rikstermbanken</a>, <a href="http://sv.wikipedia.org/">svenska Wikipedia</a> och förstås <a href="http://wiki.lagen.nu/">vår egen wiki</a>.</p>
<p>Om man kan skapa en koppling mellan EG-direktiv och svensk lag (på<br />
paragraf/artikelnivå) skulle man tillochmed skapa en koppling mellan<br />
svenska lagparagrafer och förhandsavgöranden från EG-domstolen för<br />
andra länder. Om ni bara kunde se in i huvudet på mig skulle ni<br />
förstå hur vackert allt kommer att bli.</p>
<p>Men systemet med att spara ner allt i gigantiska XML-blobbar och gräva<br />
igenom dessa med XSLT-funktionen <code>document()</code> skalar inte.</p>
<p>Så, vad dagens ändring gör är att byta ut metadatalagringen &#8211; från<br />
stora statiska filer till en <a href="http://www.openrdf.org/">RDF-databas</a>. Jag vet att det <a href="http://blog.tomtebo.org/2005/08/31/allt-du-lart-dig-om-webutveckling-ar-fel/">strider<br />
mot mina tidigare principer</a>, men med strax över en miljon poster<br />
(triples) har jag <a href="http://blog.tomtebo.org/2009/01/26/mediawiki-som-datalager/">insett</a><br />
att det faktiskt behövs.</p>
<p>Enligt den nya ordningen så stoppar Relate-steget in all metadata i<br />
Sesame-databasen istället för att stoppa in det i en gigantisk fil. I<br />
Generate-steget körs sedan ett antal <a href="http://www.w3.org/2009/sparql/wiki/Main_Page">SPARQL-frågor</a> mot denna databas,<br />
och sparar ner steget i en temporär XML-fil, som bara innehåller den<br />
information som är relevant för just det dokument som ska skapas. Den<br />
läses sen in med <code>document()</code> precis som tidigare. Skillnaden är att<br />
denna temporärfil är liten och därmed snabbprocessad, samt att<br />
utvecklingen för att stoppa ner nya datamängder i den är liten &#8211; dels<br />
en SPARQL-fråga, dels lite klisterkod för att mappa svaret till en<br />
XML-ig trädstruktur. Vad det gäller det senare hoppas jag kunna<br />
använda <a href="http://code.google.com/p/oort/wiki/SparqlTree">SPARQLTree</a><br />
för att kunna generalisera det helt.</p>
<p>Vad det gäller det förra så är det dock inte hel-enkelt att skriva bra<br />
SPARQL-frågor. Den enda hjälpen som är något att ha är själva specen,<br />
och den innehåller liksom inte så mycket tips av &#8221;for<br />
dummies&#8221;-karaktär. Det leder till att mina frågor är ganska yxiga än<br />
så länge. Förhoppningsvis inser jag hur de kan förenklas allt eftersom<br />
jag lär mig krypa på det här området.</p>
<p>Som ett exempel på svårigheterna kan nämnas hur man ska formulera en<br />
fråga som hämtar information alla rättsfall som hänvisar till en viss<br />
lag. Informationen om ett visst rättsfall lagras enligt följande mall<br />
(<a href="http://www.w3.org/DesignIssues/Notation3">N3-notation</a>):</p>
<pre>
@prefix dct: &lt;http://purl.org/dc/terms/&gt; .
@prefix rinfo: &lt;http://rinfo.lagrummet.se/taxo/2007/09/rinfo/pub#&gt; .

&lt;http://rinfo.lagrummet.se/publ/rattsfall/rh/2003:65&gt; a rinfo:Rattsfallsreferat ;
     dct:creator &lt;http://lagen.nu/org/2008/hovratten-for-nedre-norrland&gt; ;
     dct:description "En kvinna med en insulinberoende diabetes, åtalad för misshandel[...]"@sv ;
     dct:identifier "RH 2003:65"@sv ;
     dct:relation ""@sv ;
     dct:subject "Uppsåt"@sv ;
     rinfo:avgorandedatum "2003-11-21"@sv ;
     <b>rinfo:lagrum &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700#K1P2S2&gt; </b>
     rinfo:malnummer "B24-03"@sv .
</pre>
<p>Det intressanta här är <code>rinfo:lagrum</code>-triplen (i fetstil). Det är fråga<br />
om ett rättsfall som hänvisar till brottsbalken, närmare bestämt 1<br />
kap. 2 § 2 st. Brottsbalken har i det här systemet URI:n<br />
<code>&lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt;</code>.</p>
<p>En inititial SPARQL-fråga för att hämta information om alla rättsfall som hänvisar<br />
till brottsbalken kan se ut såhär:</p>
<pre>
PREFIX dct:&lt;http://purl.org/dc/terms/&gt;
PREFIX rinfo:&lt;http://rinfo.lagrummet.se/taxo/2007/09/rinfo/pub#&gt;

SELECT ?uri ?id ?desc
WHERE {
    ?uri rinfo:lagrum &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt; .
    ?uri dct:identifier ?id .
    ?uri dct:description ?desc
}
</pre>
<p>(Not: om du inte redan kan grundläggande SPARQL rekommenderar jag att<br />
exempelvis läsa <a href="http://en.wikipedia.org/wiki/SPARQL">wikipediasidans<br />
introduktion</a>).</p>
<p>Problemet är att den frågan enbart kommer att hitta rättsfall som<br />
hänvisar till brottsbalken i sin helhet, inte rättsfall som hänvisar<br />
till någon enskild paragraf. Detta eftersom URI:er i RDF är<br />
ogenomskinliga &#8212; det finns inget inherent samband mellan<br />
<code>&lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt;</code> och<br />
<code>&lt;http://rinfo.lagrummet.se/publ/sfs/1962:700#K1P2S2&gt;</code> (som<br />
är URI:n för 1 kap. 2 § 2 st. Brottsbalken).</p>
<p>Det vi vill göra är att ställa en fråga som matchar alla rättsfall som<br />
hänvisar till en viss lag eller något som är en del av samma lag<br />
(enskilda kapitel, paragrafer eller stycken). Ett enkelt, fult,<br />
långsamt och fel sätt är att göra det med ett filter:</p>
<pre>
PREFIX dct:&lt;http://purl.org/dc/terms/&gt;
PREFIX rinfo:&lt;http://rinfo.lagrummet.se/taxo/2007/09/rinfo/pub#&gt;

SELECT ?uri ?id ?desc ?lagrum
WHERE {
    ?uri dct:identifier ?id .
    ?uri dct:description ?desc .
    ?uri rinfo:lagrum ?lagrum .
    FILTER regex(str(?lagrum), "http://rinfo.lagrummet.se/publ/sfs/1962:700")
}
</pre>
<p>Ganska enkelt, men i praktiken väldigt långsamt, gissningsvis för att<br />
SPARQL-motorn är tvungen att konvertera varenda URI (en datatyp) till<br />
en sträng (en helt annan datatyp), för att sen se om den möjligtvis<br />
börjar på ett visst sätt. Det är också fel, eftersom frågan gör ett<br />
antagande om att<br />
<code>&lt;http://rinfo.lagrummet.se/publ/sfs/1962:700#K1P2S2&gt;</code><br />
är en resurs som är en del av resursen<br />
<code>&lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt;</code>, utan<br />
någon täckning för det antagandet.</p>
<p>Det korrekta sättet är att modellera just detta<br />
&#8221;är-del-av&#8221;-förhållande. I RDF-databasen finns en mängd triples av<br />
följande typ:</p>
<pre>
&lt;http://rinfo.lagrummet.se/publ/sfs/1962:700#K1P2S2&gt; a rinfo:Stycke;
     dct:isPartOf &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700#K1P2&gt;.

&lt;http://rinfo.lagrummet.se/publ/sfs/1962:700#K1P2&gt; a rinfo:Paragraf;
     dct:isPartOf &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700#K1&gt;.

&lt;http://rinfo.lagrummet.se/publ/sfs/1962:700#K1&gt; a rinfo:Kapitel;
     dct:isPartOf &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt;.
</pre>
<p>Med det kan vi formulera en fråga som ger oss information om alla<br />
rättsfall för en viss lagtext. Vi vill ha alla rättsfall som antingen<br />
har en <code>rinfo:lagrum</code>-relation med lagtextens URI<br />
<i>eller</i> en <code>rinfo:lagrum</code>-relation med en URI som har<br />
en <code>dct:isPartOf</code>-relation med lagtextens URI <i>eller</i><br />
en <code>rinfo:lagrum</code>-relation med en URI som har en<br />
<code>dct:isPartOf</code>-relation med en URI som har en<br />
<code>dct:isPartOf</code>-relation med lagtextens URI<br />
<i>eller&#8230;</i></p>
<p>Ok, det blir inte så vackert det här heller, men det blir rätt och<br />
snabbt. Den SPARQL-fråga jag har just nu blir såhär:</p>
<pre>
PREFIX dct:&lt;http://purl.org/dc/terms/&gt;
PREFIX rinfo:&lt;http://rinfo.lagrummet.se/taxo/2007/09/rinfo/pub#&gt;

SELECT ?uri ?id ?desc ?lagrum
WHERE {
   { ?uri rinfo:lagrum &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt; .
     ?uri dct:identifier ?id .
     ?uri dct:description ?desc }
   UNION { ?uri rinfo:lagrum ?lagrum .
           ?lagrum dct:isPartOf &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt; .
           ?uri dct:identifier ?id .
           ?uri dct:description ?desc }
   UNION { ?uri rinfo:lagrum ?lagrum .
           ?lagrum dct:isPartOf ?b .
           ?b dct:isPartOf &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt; .
           ?uri dct:identifier ?id .
           ?uri dct:description ?desc }
   UNION { ?uri rinfo:lagrum ?lagrum .
           ?lagrum dct:isPartOf ?b .
           ?b dct:isPartOf ?c .
           ?c dct:isPartOf &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt; .
           ?uri dct:identifier ?id .
           ?uri dct:description ?desc }
   UNION { ?uri rinfo:lagrum ?lagrum .
           ?lagrum dct:isPartOf ?b .
           ?b dct:isPartOf ?c .
           ?c dct:isPartOf ?d .
           ?d dct:isPartOf &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt; .
           ?uri dct:identifier ?id .
           ?uri dct:description ?desc }
   UNION { ?uri rinfo:lagrum ?lagrum .
           ?lagrum dct:isPartOf ?b .
           ?b dct:isPartOf ?c .
           ?c dct:isPartOf ?d .
           ?d dct:isPartOf ?e .
           ?e dct:isPartOf &lt;http://rinfo.lagrummet.se/publ/sfs/1962:700&gt; .
           ?uri dct:identifier ?id .
           ?uri dct:description ?desc }
}
</pre>
<p>Förslag på hur man kan förenkla det hela mottages tacksamt&#8230;</p>
<p>Det framgår kanske att det här inte är en arkitektur för alla<br />
problem. Men om man har data som kan modelleras med RDF (och när man<br />
jobbat med RDF ett tag så tycker man att i stort sett allt gör det) så<br />
tror jag att åtminstone kombinationen triplestore + SPARQL kan vara<br />
ett intressant alternativ till RDBMS + SQL.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2009/06/30/en-arkitektur-for-webutveckling-med-semantic-web-koncept/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tre antipatterns i webinteraktionsdesign</title>
		<link>http://blog.tomtebo.org/2009/03/22/tre-antipatterns-i-webinteraktionsdesign/</link>
		<comments>http://blog.tomtebo.org/2009/03/22/tre-antipatterns-i-webinteraktionsdesign/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 15:54:01 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[för allmän kännedom]]></category>
		<category><![CDATA[webutveckling]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/?p=643</guid>
		<description><![CDATA[Ett antipattern är ett sätt att göra något på, som vid första anblicken verkar vara en vettig approach, men som egentligen gör saker värre. Inom webbutvecklingsvärlden finns det en rik flora av dessa. Här är några exempel: Pagers som visar &#8230; <a href="http://blog.tomtebo.org/2009/03/22/tre-antipatterns-i-webinteraktionsdesign/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ett <a href="http://c2.com/cgi/wiki?AntiPattern">antipattern</a> är ett sätt att göra något på, som vid första anblicken verkar vara en vettig approach, men som egentligen gör saker värre. Inom webbutvecklingsvärlden finns det en rik flora av dessa. Här är några exempel:</p>
<dl>
<dt>Pagers som visar ett löjligt litet antal saker åt gången</dt>
<dd>En pager är alltså den gränssnittskonstruktion som visar ett visst antal saker åt gången &#8211; exempelvis sökträffar eller  bloggkommentarer. Eftersom det är mycket bökigare att konstruera ett pagingsystem än att helt enkelt visa alla saker på en gång vill folk förstås använda det, och sätter därför gränsen för antal saker som ska visas alldeles för lågt. Bredband är billigt, och moderna webbläsare klarar numera sidor över 15 kb. Minst 100 saker åt gången, tack.</dd>
<dt>För korta sessionstimeouts</dt>
<dd>Alla moderna webbprogrammeringsramverk har någon typ av sessionshanteringssystem, så att programeraren ska kunna spara ner en massa information om vad en viss användare gör i steg 1, så att man kan läsa upp det igen i steg 2. Att spara denna information tar förstås lite minne i webbserverprocessen, och har man många användare vill man förstås se till att rensa bort sådant som aldrig kommer användas, eftersom användaren lämnat webbplatsen och inte kommer göra något steg 2-request. Så alla webbprogrammeringsramverk har en sessionstimeout &#8211; om inte användaren begär en ny sida på x minuter rensas den data som associerats med användaren. Och eftersom minne var dyrt under förra årtusendet är denna timeout vanligtvis löjligt lågt satt. Vilket får till effekt att den som skickar in ett långt och genomarbetat webbforuminlägg upptäcker att sessionen timat ut, och att de senaste 21 minuternas arbete gått upp i rök. Minne är billigt, men användares tid är det inte. Sätt upp sessionstimeouten till minst 24 timmar, tack.</dd>
<dt>Reset-knappar på formulär</dt>
<dd>HTML-standardens avsnitt om hur man gör formulär innehåller ett antal olika typer av formulärelement &#8211; textfält, radioknappar, selectmenyer, submit-knappar samt, av någon outgrundlig anledning, en knapp som tar bort allt man mödosamt skrivit in i formuläret, och återställer det till sitt ursprungstillstånd. Risken för att råka klicka på denna knapp är visserligen inte stor, men det lär ändå inträffa mångdubbelt fler gånger än att någon faktiskt har nytta av det. Det <a href="http://www.w3.org/TR/html401/interact/forms.html#h-17.1">första exemplet i standarden</a> använder denna vansinniga funktion, vilket får till effekt att folk som inte tänker efter tror att det är en bra idé att ge användaren tillgång till något som bara kan användas till att skjuta sig i foten. Sluta med det, tack.</dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2009/03/22/tre-antipatterns-i-webinteraktionsdesign/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mediawiki som datalager</title>
		<link>http://blog.tomtebo.org/2009/01/26/mediawiki-som-datalager/</link>
		<comments>http://blog.tomtebo.org/2009/01/26/mediawiki-som-datalager/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 15:46:01 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[databaser]]></category>
		<category><![CDATA[lagen.nu]]></category>
		<category><![CDATA[systemdesign]]></category>
		<category><![CDATA[wiki]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/?p=513</guid>
		<description><![CDATA[På lagen.nu använder jag ingen relationsdatabas. Alla dokument ligger i varsin statisk fil, och den samling av metadata som behövs för att jag ska kunna exempelvis skapa index över alla dokument ligger i en gigantisk .n3-fil som jag går igenom &#8230; <a href="http://blog.tomtebo.org/2009/01/26/mediawiki-som-datalager/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>På <a href="https://lagen.nu/">lagen.nu</a> använder jag ingen<br />
relationsdatabas. Alla dokument ligger i varsin statisk fil, och den<br />
samling av metadata som behövs för att jag ska kunna exempelvis skapa<br />
index över alla dokument ligger i en gigantisk .n3-fil som jag går<br />
igenom med <a href="http://rdflib.net/">RDFLib</a>. Anledningen är<br />
förstås min <a href="http://blog.tomtebo.org/2005/08/31/allt-du-lart-dig-om-webutveckling-ar-fel/">djupt<br />
kända misstro</a> mot konceptet databasserver i allmänhet och<br />
relationsdatabaser i synnerhet. Jag tycker filsystemet är underskattat<br />
som databas. Det finns alltid där, är snabbt, går att debugga och<br />
manipulera med välbekanta verktyg (<tt>ls</tt>, <tt>find</tt>,<br />
<tt>grep</tt>, <tt>xargs</tt>, <tt>tar</tt>, <tt>rsync</tt>), har ett<br />
begripligt rättighetssystem integrerat med operativsystemet, osv.</p>
<p>Till nästa stora iteration av lagen.nu-koden kommer jag ändå att<br />
börja använda någon sorts server för datalagring. Men det blir<br />
förmodligen inte en traditionell relationsdatabas med<br />
SQL-gränssnitt. Min datamodell är inte särskilt relationell. Med tanke<br />
på hur djupt jag integrerat RDF i systemet blir det förmodligen en<br />
kombination av en triplestore tillsammans med någon form av <a href="http://en.wikipedia.org/wiki/Document-oriented_database">dokumentdatabas</a>.<br />
För det tidigare blir det förmodligen <a href="http://www.openrdf.org/">Sesame</a>, för det senare har jag<br />
tittat nyfiket på <a href="http://couchdb.apache.org/">CouchDB</a>.</p>
<p>Men i kommentarerna till ett <a href="http://blog.tomtebo.org/2009/01/23/projektide-bot-for-att-hitta-otillborliga-efterhandsredigeringar/">tidigare<br />
inlägg</a> om en mediaövervakningsbot föreslog <a href="http://www.peterkrantz.com/">Peter Krantz</a> att använda <a href="http://www.mediawiki.org/wiki/MediaWiki">Mediawiki</a> som<br />
datalagring. Jag började kolla på hur man kan automatisera hämtning<br />
och lagring av data från en Mediawikiserver, och det visar sig att det<br />
finns en mycket kompetent pythonmodul, <a href="http://sourceforge.net/projects/mwclient">mwclient</a>, för<br />
ändamålet (det finns även ett annat ramverk, <a href="http://meta.wikimedia.org/wiki/Using_the_python_wikipediabot">pywikipedia</a>,<br />
men det gav inte alls ett lika bra första intryck). Så här enkelt är<br />
det att skapa och ändra en sida:</p>
<pre>
    import mwclient

    site = mwclient.Site('www.example.org','/path/to/mediawiki/')
    site.login('myuser','secret')
    page = site.Pages['Testpage']
    page.save("Hello world", summary="initial version")
    page.save("Goodbye world", summary="updated version")
    print "Page has %d revisions" % len(page.revisions())
</pre>
<p>Allt det som mediawiki ger &#8212; revisionshantering med diffar,<br />
användarhantering, admin- och slutanvändargränssnitt, spamkontroller,<br />
roll- och rättighetssystem, och <a href="http://www.mediawiki.org/wiki/Category:Extensions">utökningsmöjligheter</a><br />
&#8211; får man på köpet. Det är kanske inget man vill använda för att<br />
hantera jättemånga updateringar i sekunden, men om man kan se till att<br />
exv cachea de anrop som bara hämtar data kan man nog få det snabbt<br />
nog.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2009/01/26/mediawiki-som-datalager/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Lagen 1.5 rycker närmare</title>
		<link>http://blog.tomtebo.org/2008/09/04/lagen-15-rycker-narmare/</link>
		<comments>http://blog.tomtebo.org/2008/09/04/lagen-15-rycker-narmare/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 08:07:54 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[lagen.nu]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/?p=427</guid>
		<description><![CDATA[I natt pushade jag ut en ny uppdatering av lagen.nu 1.5-betan &#8212; ta gärna en titt och säg vad ni tycker! Det är inga radikala förändringar sen sist, men lite grafisk puts med bland annat en snyggare vinjett och ett &#8230; <a href="http://blog.tomtebo.org/2008/09/04/lagen-15-rycker-narmare/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I natt pushade jag ut en ny uppdatering av <a href="http://ferenda.lagen.nu/">lagen.nu 1.5-betan</a> &#8212; ta gärna en titt och säg vad ni tycker! Det är inga radikala förändringar <a href="http://blog.tomtebo.org/2008/08/25/destroy-erase-improve/">sen sist</a>, men lite grafisk puts med bland annat en <a href="http://flickr.com/photos/48745248@N00/225249268/">snyggare vinjett</a> och ett konsekvent <a href="http://en.wikipedia.org/wiki/Sepia_tone">sepiatema</a>. För att uppmuntra feedback har även alla sidor ett formulär för felanmälan, som postar tickets rakt in i den <a href="http://trac.lagen.nu/">utvecklings-trac</a> jag använder.</p>
<p>Nästa steg är att skapa en epostlista för de som är intresserade av att följa, påverka och kanske delta i lagen.nu-utvecklingen. Har du varit i kontakt med mig tidigare angånde tjänsten kommer du säkert få ett mail när den är igång, hör av dig annars!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2008/09/04/lagen-15-rycker-narmare/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Destroy, erase, improve</title>
		<link>http://blog.tomtebo.org/2008/08/25/destroy-erase-improve/</link>
		<comments>http://blog.tomtebo.org/2008/08/25/destroy-erase-improve/#comments</comments>
		<pubDate>Mon, 25 Aug 2008 07:40:33 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[lagen.nu]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programmering]]></category>
		<category><![CDATA[yrkesstolthet]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/?p=424</guid>
		<description><![CDATA[Nu har det varit tyst här ett tag igen. Jag har ägnat sommaren åt extrajobb, studier inför tentan i C4, samt jobb på nästa version av lagen.nu, som nu börjar närma sig &#8221;färdig&#8221;-stadiet. På ferenda.lagen.nu finns en betaversion av siten, &#8230; <a href="http://blog.tomtebo.org/2008/08/25/destroy-erase-improve/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nu har det varit tyst här ett tag igen. Jag har ägnat sommaren åt<br />
extrajobb, studier inför tentan i C4, samt jobb på nästa version av<br />
lagen.nu, som nu börjar närma sig &#8221;färdig&#8221;-stadiet. På <a href="http://ferenda.lagen.nu">ferenda.lagen.nu</a> finns en betaversion av<br />
siten, och de utåt sett viktigaste <a href="http://ferenda.lagen.nu/om/nytt.html">nyheterna</a> är att<br />
formgivningen är fräshare, samt att rättsfallsreferaten nu finns med i<br />
fulltext.</p>
<p>Men den stora nyheten bakom kulisserna är att kodbasen till 90% är<br />
helt omskriven, och att den nu är <a href="http://svn.lagen.nu/svnroot/">öppen källkod under<br />
BSD-licensen</a>. Det har tagit lång tid &#8211; betydligt längre än det tog<br />
att utveckla den ursprungliga versionen &#8211; och frågan som inställer sig<br />
är om det verkligen var en sån lysande idé? Det finns två<br />
förhållningssätt till att slänga gammal kod och skriva om den från<br />
scratch &#8212; Joel säger att det är en av sakerna <a href="http://www.joelonsoftware.com/articles/fog0000000069.html">you<br />
never should do</a>, medans Fred menar att man ska <a href="http://www.robelle.com/smugbook/manmonth.html">plan to throw one<br />
away; you will, anyhow</a>.</p>
<p>De flesta utvecklares första impuls när de sitter med en kodbas som<br />
vuxit till en ogenomtränglig röra är att slänga skiten och starta<br />
om. Det är för det mesta en dålig idé, inte minst för att det inte<br />
finns någon garanti för att man inte hamnar i samma sits tre år<br />
senare, när man är klar. Men eftersom det är mycket roligare att bygga<br />
nytt än att reparera gammalt skrivs ofta system om från scratch, trots<br />
att det skulle varit mycket billigare att steg för steg rensa i det<br />
gamla röriga systemet.</p>
<p>Så varför skrev jag då om koden? På grund av glädje och skam. Glädje,<br />
eftersom lagen.nu inte har någon affärsplan, några inkomster ellern<br />
några krav på företagekonomiskt rationell styrning. Det är ett<br />
hobbyprojekt som jag sysslar med för att det är kul, och det har varit<br />
mycket roligare att skriva nytt än att rota runt i den gamla<br />
koden. Skam, för att det hela tiden har varit meningen att släppa<br />
koden fri, och den gamla koden var helt enkelt för dålig för att visa<br />
för folk. En kompis har teorin att det här är anledningen till att<br />
inte mer kod är öppen &#8212; det är helt enkelt för pinsamt. </p>
<p>Beslutet att släppa koden fri, tillsammans med en viss <a href="http://en.wikipedia.org/wiki/Second-system_effect">andra<br />
systemet-effekt</a>, har gjort att jag i varje steg i utvecklingen har<br />
funderat kring det bästa sättet att göra en viss sak. För att slippa<br />
skämmas måste man helt enkelt skriva så bra kod som man någonsin<br />
kan. När jag skrev det första systemet var jag ganska grön på python,<br />
och försökte mest komma på något sätt att göra samma sak. Det tar<br />
mycket mer tid att göra rätt än att göra snabbt &#8212; särskilt i början<br />
&#8211; men känslan av yrkesstolthet gör att det är värt det.</p>
<p>Det betyder inte att det inte finns en massa fulheter i koden. Jag är<br />
inte superstrukturerad, och inte min kod heller. När jag kommit på ett<br />
visst mönster för att göra saker överanvänder jag det gärna, fram till<br />
att jag kommer på nästa mönster. Och namngivning samt övrig<br />
kodstandard ska vi inte prata om. Men grunden är stabil. Arkitekturen<br />
är ganska enkel att förklara, även om det är många (drygt 9000) rader<br />
kod. Jag tror att en ny programmerare kan sätta sig in i det hela<br />
ganska snabbt, och att det kan vara ett ganska kul system att vara med<br />
och bygga på.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2008/08/25/destroy-erase-improve/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dagens patch</title>
		<link>http://blog.tomtebo.org/2008/06/14/dagens-patch/</link>
		<comments>http://blog.tomtebo.org/2008/06/14/dagens-patch/#comments</comments>
		<pubDate>Sat, 14 Jun 2008 20:30:43 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[programmering]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[RDF]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/?p=414</guid>
		<description><![CDATA[Det blir mycket RDF i lagen.nu 1.5. Och det blir mycket användande av RDFLib. Efter att ha hittat finfina instruktioner om hur man får biblioteket &#8211; inklusive SPARQL-parser &#8211; att snurra under windows har jag gett mig på min pet &#8230; <a href="http://blog.tomtebo.org/2008/06/14/dagens-patch/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Det blir mycket <a href="http://www.w3.org/TR/REC-rdf-syntax/">RDF</a> i lagen.nu 1.5. Och det blir mycket användande av <a href="http://rdflib.net/">RDFLib</a>. Efter att ha hittat <a href="http://code.google.com/p/rdflib/wiki/SetupOnWindows">finfina instruktioner</a> om hur man får biblioteket &#8211; inklusive SPARQL-parser &#8211; att snurra under windows har jag gett mig på min pet peeve i n3-serialiseringskoden, nämligen dess ovana att definera egna anonyma namespaceprefix. Normalt serialiserar den nämligen <a href="http://www.w3.org/DesignIssues/Notation3">n3-formatet</a> något i stil med såhär:</p>
<pre>
@prefix _8: http://lagen.nu/.
@prefix _9: http://lagen.nu/1962:700#.
@prefix dct: http://dublincore.org/documents/dcmi-terms/.
@prefix rinfo: http://rinfo.lagrummet.se/taxo/2007/09/rinfo/pub#.

_8:NJA_2005_s_878 dct:identifier "NJA 2005 s. 878 (NJA 2005:95)";
rinfo:lagrum _9:K29P7;
rinfo:rattsfallshanvisning _8:NJA_1996_s_63,
_8:NJA_2000_s_421;
</pre>
<p>Men nu blir det det oändligt mycket mer läsbara:</p>
<pre>
@prefix dct: http://dublincore.org/documents/dcmi-terms/.
@prefix rinfo: http://rinfo.lagrummet.se/taxo/2007/09/rinfo/pub#.

 &lt;http://lagen.nu/NJA_2005_s_878&gt; dct:identifier "NJA 2005 s. 878 (NJA 2005:95)";
     rinfo:lagrum &lt;http://lagen.nu/1962:700#K29P7&gt;;
     rinfo:rattsfallshanvisning &lt;http://lagen.nu/NJA_1996_s_63&gt;,
         &lt;http://lagen.nu/NJA_2000_s_421&gt;;
</pre>
<p>Här är patchen:</p>
<pre>
C:\Users\staffan\tmp\rdflib-2.4.0\rdflib&gt;diff -u syntax\NamespaceManager.py~ syntax\NamespaceManager.py
--- syntax\NamespaceManager.py~ 2007-04-04 22:05:32.000000000 +0200
+++ syntax\NamespaceManager.py  2008-06-14 21:36:32.606307200 +0200
@@ -59,8 +59,7 @@
namespace = URIRef(namespace)
prefix = self.store.prefix(namespace)
if prefix is None:
-                prefix = "_%s" % len(list(self.store.namespaces()))
-                self.bind(prefix, namespace)
+                raise Exception("Prefix for %s not bound" % namespace)
self.__cache[uri] = (prefix, namespace, name)
return self.__cache[uri]
</pre>
<p>Den som förstår RDFLib bättre kan säkert få till samma effekt utan att patcha källkoden genom att subklassa NamespaceManager och trycka in den i kedjan någonstans, men mina försök till det misslyckades.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2008/06/14/dagens-patch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dagens bugg</title>
		<link>http://blog.tomtebo.org/2008/01/14/dagens-bugg/</link>
		<comments>http://blog.tomtebo.org/2008/01/14/dagens-bugg/#comments</comments>
		<pubDate>Mon, 14 Jan 2008 15:33:02 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[lagen.nu]]></category>
		<category><![CDATA[unicode]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/2008/01/14/dagens-bugg/</guid>
		<description><![CDATA[Följande kod, djupt nere i innanmätet på lagen.nu 1.0-koden, har en bugg, som stått orättad i över tre år (det den ska göra är att stoppa in ett &#8216;&#124;&#8217;-tecken innan ändelser i stil med &#8216;lagen&#8217;, &#8216;balken&#8217;, osv &#8212; dvs &#8216;upphovsrättslagen&#8217; &#8230; <a href="http://blog.tomtebo.org/2008/01/14/dagens-bugg/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>
Följande kod, djupt nere i innanmätet på lagen.nu 1.0-koden, har en<br />
bugg, som stått orättad i över tre år (det den ska göra är att stoppa in ett &#8216;|&#8217;-tecken innan ändelser i<br />
stil med &#8216;lagen&#8217;, &#8216;balken&#8217;, osv &#8212; dvs &#8216;upphovsrättslagen&#8217; ska bli<br />
&#8216;upphovsrätts|lagen&#8217; &#8212; <a href="http://blog.tomtebo.org/2004/12/18/lagennu_tech_5/">detta av<br />
EBNF-tekniska skäl</a>.
</p>
<pre>fixedindata = re.sub(r'\B(lagens?|balkens?|förordningens?)\b',
                     r'|\1', self.indata)
</pre>
<p>Hittar ni felet? Ledtråd &#8212; det uppträder bara för en av de tio<br />
balkarna, samt för ett mycket litet fåtal lagar och förordningar.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2008/01/14/dagens-bugg/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>XHTML2, CSS3 och PDF</title>
		<link>http://blog.tomtebo.org/2007/12/21/xhtml2-css3-och-pdf/</link>
		<comments>http://blog.tomtebo.org/2007/12/21/xhtml2-css3-och-pdf/#comments</comments>
		<pubDate>Thu, 20 Dec 2007 23:16:37 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[lagen.nu]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[rättsinformation]]></category>
		<category><![CDATA[xhtml2]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/2007/12/21/xhtml2-css3-och-pdf/</guid>
		<description><![CDATA[Tidigare frågade jag runt vilket som var det bästa sättet att skapa PDF från nån typ av strukturerad XML-data. De svar jag fick från olika håll pekade på att köra det gen om en CSS3-kapabel layoutmotor vore lämpligt. Så jag &#8230; <a href="http://blog.tomtebo.org/2007/12/21/xhtml2-css3-och-pdf/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Tidigare <a href="http://blog.tomtebo.org/2007/12/07/tablet-pcs-studieteknologi-och-pdf-byggande/">frågade<br />
jag runt</a> vilket som var det bästa sättet att skapa PDF från nån<br />
typ av strukturerad XML-data. De svar jag fick från olika håll pekade<br />
på att köra det gen om en <a href="http://www.princexml.com/">CSS3-kapabel layoutmotor</a> vore<br />
lämpligt. Så jag har ägnat lite tid åt att trimma in ett stylesheet<br />
anpassat för lagtext uttryckt XHTML2 tillsammans med metadata från<br />
<a href="http://rinfo.lagrummet.se/wp-content/uploads/modell-rattsinformation-010.pdf">ESFR-vokabulären</a>.</p>
<p>Som testobjekt använde jag <a href="http://www.juridicum.su.se/jurweb/utbildning/grundkurser/forvratt/litteratur.asp">den<br />
lagtext som utgör kursfordran</a> för förvaltningsrätt, dvs den kurs<br />
jag läser för närvarande. Tidigare har ett förlag tryckt upp en <a href="http://www.nj.se/njab/nj/home.nsf/lfurl?ReadForm&#038;http://www.nj.se/NJAB/Produkt.nsf/Web/C7CD215CEF5DB2C9C1256B92004A30C2?Open">särskild<br />
författningssamling</a> för detta ämne, men på<br />
introduktionsföreläsningen nämndes att detta inte skulle göras i år,<br />
då kostnaden för att ta fram uppdaterade tryckorginal för varje kursstart var för stor<br />
(kursen går två gånger om året).</p>
<p>Nu har jag ett automatiserat publiceringsflöde, som utgående från<br />
en <a href="/wp-content/uploads/2007/12/master.xht2">huvudfil</a>,<br />
uttryckt i XHTML2, och en samling lagtexter, också uttryckt i XHTML2,<br />
genererar en <a href="/wp-content/uploads/2007/12/out.xht2">sammmanslagen<br />
fil</a>. Denna innehåller alla författningar (eller delar därav) som<br />
huvudfilen hänvisar till genom <a href="http://www.w3.org/TR/xinclude/">XInclude</a>/<a href="http://www.w3.org/TR/xptr-framework/">XPointer</a>. Från den<br />
sammanslagna filen och ett CSS3-stylesheet skapas sen en PDF. Första<br />
steget görs med <tt><a href="http://xmlsoft.org/xmllint.html">xmllint</a> --xinclude</tt>,<br />
andra med Prince. Kostnad för att ta fram uppdaterade tryckoriginal: i princip<br />
noll.</p>
<p>Resultat:<br />
 <a href="/wp-content/uploads/2007/12/forvaltningsratt-forfattningar.pdf">enkelspaltig</a><br />
(<a href="/wp-content/uploads/2007/12/print.css">css</a>),<br />
 <a href="/wp-content/uploads/2007/12/forvaltningsratt-forfattningar-tvaspalt.pdf">dubbelspaltig</a><br />
(<a href="/wp-content/uploads/2007/12/print-2col.css">css</a>).
</p>
<p>Några saker att lägga märke till: </p>
<ul>
<li>Innehållsförteckningen har korrekta sidnummerhänvisningar</li>
<li>Sidhuvudet visar var och i vilken lag man befinner sig på (och<br />
växlar utseende beroende på om det är en kapitelindelad lag eller inte)</li>
<li>Huvudfilen anger vilka förkortningar som ska användas för aktuell<br />
lag i sidhuvudet</li>
<li>Höger- och vänstersidor ser olika ut (precis som i riktiga böcker!)</li>
<li>Avstavning sker automatiskt efter svenska regler</li>
<li>PDF-bokmärkena ger en hierarkisk översikt över hela filen</li>
<li>Det går att inkludera bara enstaka kapitel (eller andra avsnitt) från en<br />
lag</li>
</ul>
<p>Det finns förstås mycket kvar att fixa (kolla exv SekrL 16 kap -<br />
inte många rätt i formatteringen där), och även mer att skriva om hur<br />
man kan använda CSS3 och Prince XML, men det<br />
får bli efter julen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2007/12/21/xhtml2-css3-och-pdf/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tablet PC:s, studieteknologi och PDF-byggande</title>
		<link>http://blog.tomtebo.org/2007/12/07/tablet-pcs-studieteknologi-och-pdf-byggande/</link>
		<comments>http://blog.tomtebo.org/2007/12/07/tablet-pcs-studieteknologi-och-pdf-byggande/#comments</comments>
		<pubDate>Fri, 07 Dec 2007 00:08:19 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[rättsinformation]]></category>
		<category><![CDATA[tabletpc]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/2007/12/07/tablet-pcs-studieteknologi-och-pdf-byggande/</guid>
		<description><![CDATA[Sedan någon månad tillbaka använder jag min Tablet PC som studiehjälpmedel i kursen förvaltningsrätt. Mitt huvudsakliga verktyg för antecknande är Evernote, som håller reda på en samling anteckningar i både och maskin- och handskrivet format, och organiserar dem med taggar &#8230; <a href="http://blog.tomtebo.org/2007/12/07/tablet-pcs-studieteknologi-och-pdf-byggande/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Sedan någon månad tillbaka använder jag <a href="http://blog.tomtebo.org/2007/10/13/diverse/">min Tablet PC</a> som studiehjälpmedel i kursen <a href="http://www.juridicum.su.se/jurweb/utbildning/grundkurser/forvratt/index.asp">förvaltningsrätt</a>. Mitt huvudsakliga verktyg för antecknande är <a href="http://evernote.com/">Evernote</a>, som håller reda på en samling anteckningar i både och maskin- och handskrivet format, och organiserar dem med taggar (tyvärr dock ingen svensk handstilsigenkänning). På föreläsningar där jag är en student bland hundra använder jag datorn som en vanlig laptop och skriver på tangentbordet, men på mindre seminarier och lektioner där interaktivitet och diskussion förekommer använder jag den i tabletläge och skriver på skärmen, för att inte gömma mig bakom en uppfälld skärm.</p>
<p>Istället för en lagbok använder jag en <a href='http://blog.tomtebo.org/wp-content/uploads/2007/12/forvaltningsratt-konsoliderade-sfs-orig.pdf'>PDF-fil</a> som jag skapat med betalversionen av Adobe Acrobat, som vi har på jobbet. Den antecknar jag sedan i med <a href="http://www.ograhl.com/en/pdfannotator/">PDF Annotator</a>, både i tablet- och laptopläge, och har numera en <a href='http://blog.tomtebo.org/wp-content/uploads/2007/12/forvaltningsratt-konsoliderade-sfs.pdf'>någorlunda genomklottrad fil</a>. Tyvärr får jag inte ta med mig datorn på tentan, så dagarna innan har jag tänkt överföra de understrykningar (men <a href="http://www.juridicum.su.se/jurweb/utbildning/Examinationsregler_07.pdf">inga anteckningar</a>)  </p>
<p>Jag tycker det här sättet att jobba på funkar riktigt bra. Om kurslitteraturen fanns att köpa elektroniskt skulle datorn vara det enda jag behövde släpa på till och från skolan. Men det finns några problem utöver att jag måste övergå till amishteknik inför tentan, varav det största är att lagtext-PDF:en är undermålig. Det vore ju mycket bättre om lagen.nu hade nån sorts &#8221;generera författningssamling i PDF-form&#8221;-funktion. Jag ser fyra sätt att bygga en sådan, givet källmaterial är i <a href="http://www.w3.org/TR/xhtml2/">XHTML2</a> och <a href="http://www.w3.org/TR/xhtml-rdfa-primer/">RDFa</a> och följande krav:</p>
<ul>
<li>Automatisk avstavning som följer svenska regler</li>
<li>Kontroll över sidfötter och huvuden som automatiskt reflekterar vilken lag och vilka paragrafer som finns på varje sida (tänk<br />
  sidhuvuden i typisk telefonkatalog eller lexikon)</li>
<li>Automatisk generering av innehållsförteckning och index</li>
<li>Fungerande interna och externa hyperlänkar i resultatet</li>
<li>Kontroll över generering av PDF-bookmarks</li>
<li>Andra saker som blir uppenbara när en lösning som saknar dem står färdig.</li>
</ul>
<p>Jag kan se fyra sätt:</p>
<ol>
<li>Old school: Transformera XHTML2-koden till <a href="http://www.latex-project.org/">(La)TeX</a> och låt <a href="http://www.tug.org/applications/pdftex/">pdftex</a> bygga en snygg PDF<br />
   + Snygg typografi, riktigt bra svensk avstavning<br />
   &#8211; Jag och (La)TeX har, trots upprepade försök, inte bondat riktigt</li>
<li>New school: Transformera XML-koden till <a href="http://www.w3.org/TR/xsl11/">XSL-FO</a> och låt <a href="http://xmlgraphics.apache.org/fop/">fop</a> eller<br />
   någon annan processor göra PDF av det hela<br />
   + Standardiserat och fint<br />
   &#8211; Jag kan inte XSL-FO. Finns det nån gratis XSL-FO -> PDF-processor<br />
     som är bra?</li>
<li>Bleeding edge: Skriv ett superavancerat CSS3-stylesheet, koppla<br />
   direkt mot XHTML2-datat och koppla in en <a href="http://www.princexml.com/">CSS3-kapabel<br />
   PDF-genererare</a><br />
   + Ingen mellantransformering<br />
   &#8211; Jag kan inte CSS3 (och är djupt misstänksam mot tidigare<br />
     CSS-varianter). Prince XML är svindyrt.</li>
<li>NIH-syndromet: Använd <a href="http://www.lowagie.com/iText/">iText</a> eller annat lib för att generera PDF<br />
   direkt.<br />
   + Jag slipper bli expert på ett sidbeskrivningsspråk<br />
   &#8211; Jag måste bli expert på ett API</li>
</ol>
<p>Dear lazyweb: vad skulle ni välja (givet att ni inte är experter på LaTeX, XSL-FO eller CSS3)?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2007/12/07/tablet-pcs-studieteknologi-och-pdf-byggande/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

