<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>krek.no</title>
    <link href="https://krek.no/feed.xml" rel="self" />
    <link href="https://krek.no" />
    <id>https://krek.no/feed.xml</id>
    <author>
        <name></name>
        
        <email>js@krek.no</email>
        
    </author>
    <updated>2026-04-30T11:55:00Z</updated>
    <entry>
    <title>IDLJ: sandwichfortæring i taxi</title>
    <link href="https://krek.no/idlj/2026-04-30-sandwichfort%C3%A6ring.html" />
    <id>https://krek.no/idlj/2026-04-30-sandwichfort%C3%A6ring.html</id>
    <published>2026-04-30T11:55:00Z</published>
    <updated>2026-04-30T11:55:00Z</updated>
    <summary type="html"><![CDATA[<article class="mb-10">
    <section class="text-gray-600 text-sm mb-5">
        Publisert 30. april 2026
    </section>
    <section>
        <p>Du kjenner kanskje til <em>“The quick brown fox jumps over the lazy dog”</em>,
en setning som brukes for å vise frem alle bokstavene i det engelske alfabetet.</p>
<p>I dag lærte jeg (fra README-en til skrifttypen <a href="https://github.com/be5invis/Iosevka" target="_blank">Iosevka</a>)
at det finnes en norsk ekvivalent:</p>
<p><em>“Jeg begynte å fortære en sandwich mens jeg kjørte taxi på vei til quiz”</em>.</p>
<p>Vi må nok inrømme at setningen føles ganske konstruert og unaturlig sammenliknet med den engelske,
men det er ikke lett å bruke bokstavene x, y og z i samme setning.
Ikke bare det, den har jo et tre bokstaver lengere alfabet og jobbe med også.</p>
<p>Her er et par Python-utrykk som kan hjelpe deg med å bekrefte det selv:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="bu">set</span>(<span class="st">&quot;abcdefghijklmnopqrstuvwxyzåæø &quot;</span>) <span class="op">==</span> <span class="op">\</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a>  <span class="bu">set</span>(<span class="st">&quot;jeg begynte å fortære en sandwich mens jeg kjørte taxi på vei til quiz&quot;</span>)</span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a><span class="co"># &gt; True</span></span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a><span class="co">&#39;&#39;</span>.join(<span class="bu">sorted</span>(<span class="bu">set</span>(</span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a>    <span class="st">&quot;jeg begynte å fortære en sandwich mens jeg kjørte taxi på vei til quiz&quot;</span></span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a>)))</span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a><span class="co"># &gt; &#39; abcdefghijklmnopqrstuvwxyzåæø&#39;</span></span></code></pre></div>
<p>Jeg var også litt tvilende på om “sandwich” egentlig er et norsk ord,
men i følge <a href="https://ordbokene.no/nno/bm,nn/sandwich" target="_blank">ordbokene.no</a>
er det visst det.</p>
<p>Kravet (1a) “alle bokstavene skal brukes <strong>minst</strong> én gang” er jo egentlig litt spennende,
en strengere versjon ville vært (1b) “alle bokstavene skal brukes <strong>eksakt</strong> én gang”.
Det er også et implisitt krav (2) om at det skal være en setning som gir mening syntaktisk og semantisk.</p>
<p>Det kunne vært litt gøy å lage et program som søker etter setninger som tilfredsstiller kravene.</p>
<p>Vi har et trivielt induksjonsbevis for at det finnes uendelig mange setninger som tilfredsstiller (1a) alene.
Fordi du kan ta en vilkårlig setning som tilfredsstiller kravet, og legge på et tilfeldig ord til slutten,
hvilket gir deg en ny setning som fortsatt tilfredsstiller (1a).
Sandwichfortæringssetningen kan være basistilfelle.</p>
<p>Om krav (1b) kan tilfredsstilles er mer uklart for meg,
men om det kan har det definitivt et begrenset antall løsninger,
fordi setningen må være eksakt 29 bokstaver lang (alfabetets lengde),
og vi har begrenset antall bokstaver å velge fra (29).</p>
<p>Gitt at det ikke finnes et <em>ord</em> tilfredsstiller (1b) alene,
kan det ikke være tilfelle at det finnes eksakt én løsning til (1b),
da en omordning av ordene i en gyldig løsning vil generere en annen gyldig løsning.</p>
<p>Neste steg vil være å kombinere genererte setninger fra (1a) eller (1b), med kravet (2),
som er mye vanskeligere å automatisk validere.
Praktisk må (1a)-genereringen være klar over (2) på en sofistikert måte,
for den må kunne beskjære bort stier som aldri leder til setninger som tilfredsstiller (2)
fra (det uendelige) søketreet ellers generert av naiv (1a).</p>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>IDLJ: Glissen Matrise</title>
    <link href="https://krek.no/idlj/2026-04-22-glissen-matrise.html" />
    <id>https://krek.no/idlj/2026-04-22-glissen-matrise.html</id>
    <published>2026-04-22T13:45:00Z</published>
    <updated>2026-04-22T13:45:00Z</updated>
    <summary type="html"><![CDATA[<article class="mb-10">
    <section class="text-gray-600 text-sm mb-5">
        Publisert 22. april 2026
    </section>
    <section>
        <p>I dag lærte jeg at en “sparse matrix” kalles en
“<strong>glissen</strong> matrise” <a href="https://no.wikipedia.org/wiki/Matrise#Generelle_matriser" target="_blank">på norsk</a>.</p>
<p>Hysterisk <a href="https://naob.no/ordbok/glissen" target="_blank">ord</a>.
Tydeligvis brukes det ofte om tynn skog. God analogi.</p>
<p>Det var alt.</p>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>IDLJ: ControlMaster (SSH)</title>
    <link href="https://krek.no/idlj/2026-04-07-ssh-controlmaster.html" />
    <id>https://krek.no/idlj/2026-04-07-ssh-controlmaster.html</id>
    <published>2026-04-07T00:00:00Z</published>
    <updated>2026-04-07T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article class="mb-10">
    <section class="text-gray-600 text-sm mb-5">
        Publisert  7. april 2026
    </section>
    <section>
        <p>I dag lærte jeg om SSH-klientinstillingen <code>ControlMaster</code>.
Dette gjør at du kan åpne en SSH-tilkobling i bakgrunnen, så bruke den som du vil over et UNIX socket.</p>
<p>Instillingen er tydeligvis brukt i flere programmer som ønsker å gjøre oppgaver samtidig over samme tilkobling.</p>
<p>Jeg brukte den for å måle hvor feil klokka går på en BusyBox-basert enhet som dessverre ikke har NTP.
På denne måten kan jeg slippe unøyaktighet grunnet tiden det tar å etablere tilkobling:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="co">#!/usr/bin/env bash</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="bu">set</span> <span class="at">-euo</span> pipefail</span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a><span class="va">REMOTE</span><span class="op">=</span><span class="st">&quot;</span><span class="va">$1</span><span class="st">&quot;</span></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a><span class="bu">shift</span></span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a><span class="va">SSH_OPTS</span><span class="op">=</span><span class="va">(</span><span class="st">&quot;</span><span class="va">$@</span><span class="st">&quot;</span><span class="va">)</span></span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a><span class="va">CTRL_PATH</span><span class="op">=</span><span class="st">&quot;/tmp/ssh_clock&quot;</span></span>
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a><span class="co"># Koble til</span></span>
<span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a><span class="fu">ssh</span> <span class="at">-o</span> ControlMaster=yes <span class="at">-o</span> ControlPath=<span class="st">&quot;</span><span class="va">$CTRL_PATH</span><span class="st">&quot;</span> <span class="dt">\</span></span>
<span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a>    <span class="at">-o</span> ControlPersist=30 <span class="at">-o</span> ConnectTimeout=10 <span class="dt">\</span></span>
<span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a>    <span class="st">&quot;</span><span class="va">${SSH_OPTS</span><span class="op">[@]</span><span class="va">}</span><span class="st">&quot;</span> <span class="at">-fN</span> <span class="st">&quot;</span><span class="va">$REMOTE</span><span class="st">&quot;</span></span>
<span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a><span class="co"># Rydd opp når scriptet er ferdig</span></span>
<span id="cb1-16"><a href="#cb1-16" aria-hidden="true" tabindex="-1"></a><span class="bu">trap</span> <span class="st">&#39;ssh -o ControlPath=&quot;$CTRL_PATH&quot; -O exit &quot;$REMOTE&quot; 2&gt;/dev/null&#39;</span> EXIT</span>
<span id="cb1-17"><a href="#cb1-17" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-18"><a href="#cb1-18" aria-hidden="true" tabindex="-1"></a><span class="co"># Mål klokka lokalt, fjernt, og lokalt igjen</span></span>
<span id="cb1-19"><a href="#cb1-19" aria-hidden="true" tabindex="-1"></a><span class="va">T1</span><span class="op">=</span><span class="va">$(</span><span class="fu">date</span> +%s.%N<span class="va">)</span></span>
<span id="cb1-20"><a href="#cb1-20" aria-hidden="true" tabindex="-1"></a><span class="va">T_REMOTE</span><span class="op">=</span><span class="va">$(</span><span class="fu">ssh</span> <span class="at">-o</span> ControlPath=<span class="st">&quot;</span><span class="va">$CTRL_PATH</span><span class="st">&quot;</span> <span class="st">&quot;</span><span class="va">$REMOTE</span><span class="st">&quot;</span> <span class="dt">\</span></span>
<span id="cb1-21"><a href="#cb1-21" aria-hidden="true" tabindex="-1"></a>    <span class="st">&quot;/sbin/adjtimex | awk &#39;/tv_sec/{s=</span><span class="dt">\$</span><span class="st">2} /tv_usec/{printf </span><span class="dt">\&quot;</span><span class="st">%s.%06d\n</span><span class="dt">\&quot;</span><span class="st">, s, </span><span class="dt">\$</span><span class="st">2}&#39;&quot;</span><span class="va">)</span></span>
<span id="cb1-22"><a href="#cb1-22" aria-hidden="true" tabindex="-1"></a><span class="va">T4</span><span class="op">=</span><span class="va">$(</span><span class="fu">date</span> +%s.%N<span class="va">)</span></span>
<span id="cb1-23"><a href="#cb1-23" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-24"><a href="#cb1-24" aria-hidden="true" tabindex="-1"></a><span class="bu">printf</span> <span class="st">&#39;%s\t%s\t%s\n&#39;</span> <span class="st">&quot;</span><span class="va">$T1</span><span class="st">&quot;</span> <span class="st">&quot;</span><span class="va">$T_REMOTE</span><span class="st">&quot;</span> <span class="st">&quot;</span><span class="va">$T4</span><span class="st">&quot;</span></span></code></pre></div>
<p>Det er også mulig å bruke dette i dag-til-dag manuelle tilkoblinger.
Kanskje det er kjekt om du har en litt eksotisk autentiseringsmekanisme (YubiKeys mv.).</p>
<p><a href="https://news.ycombinator.com/item?id=2183699" target="_blank">Leif på Hacker News (2011)</a>
forklarer sitt oppsett her.</p>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>IDLJ: Geledd (norsk domenetap)</title>
    <link href="https://krek.no/idlj/2026-03-30-geledd.html" />
    <id>https://krek.no/idlj/2026-03-30-geledd.html</id>
    <published>2026-03-30T00:00:00Z</published>
    <updated>2026-03-30T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article class="mb-10">
    <section class="text-gray-600 text-sm mb-5">
        Publisert 30. mars 2026
    </section>
    <section>
        <p>For noen dager siden hadde jeg en diskusjon om
<a href="https://naob.no/ordbok/domenetap" target="_blank">domenetapet</a>
norsk opplever til fordel for engelsk innen informatikk.
Som vi alle vet har vi rett og slett ikke ordene, eller utrykk som er presise nok
for å beskrive en rekke konsepter.</p>
<p>Bedre blir det ikke av at IT har ganske mye stammespråk og sjargong
som har presis mening blant utøvere, men kan være meningsløs eller lett å blande sammen
for utenforstående.
Når jeg skriver denne bloggen gjør jeg ofte et bevisst poeng i å bruke utrykk på norsk,
fordi jeg synes det har en viss sjarm, og det ser noen ganger litt komisk ut.
Ofte er jeg i tvil på om valget av utrykk hadde blitt forstått av noen som ikke allerede
kjenner til den engelskspråklige sjargongen for samme konsept, da det føles litt påtvingt
å oversette til norsk.
Et eksempel på dette er bruk av utrykket “gaffel” eller “å gafle” i artikkelen om
<a href="/artikler/2026-03-30-frikode-cla-teppedragning.html">CLA-er</a>.</p>
<p>Som en del av diskusjonen ble det nevnt at når de underviser grunnleggende programmering
i Sverige bruker de ordet “geledd” for å beskrive det vi kaller “array”.
Min diskusjonspartner mente dette var bedre, fordi “studentene har allerede en intuisjon for
hva geledd betyr”.</p>
<p>Det kan godt være dette er et meg-problem, men jeg kan aldri huske å ha hørt ordet
<a href="https://snl.no/geledd" target="_blank">geledd</a> før.
Uformelle undersøkelser blant venner viser at det trolig ikke er et utspredt utrykk blant
oss som enda er unge.
Jeg har nå lært at det er et ord som tidligere ble brukt i milliær sammenheng for å
beskrive soldater som står etter hverandre, skulder mot skulder.</p>
<p>Dette er en god analogi for “array”, da det beskriver en rekke elementer som er pakket
sammen etter hverandre i minne (i motsetning til en lenket liste)
men om den presise intuisjonen kommer bedre av å bruke “geledd” vet jeg ikke.</p>
<p>(Selvfølgelig må du ikke forveksle bruken av “pakket” med pakking av strukturer, et annet konsept.)</p>
<p>I følge <a href="https://snl.no/geledd" target="_blank">SNL-artikkelen</a> jeg lenket til tidligere
bruker forsvaret i dag “linje” for å beskrive soldater som står skulder til skulder.
Jeg tror ikke vi kan stjele det utrykket, da det gir (i allefall fra mitt perspektiv)
nærmere allusjoner mot geometri.</p>
<p>I samme diskusjon ble det også nevnt at “stakk” høres litt ut som “stack”, men er på ingen måte
samme konsept, da en stakk (f.eks.: løvstakk) er en uorganisert haug av ting, men en “stack”
er elementer strengt stablet oppå hverandre.</p>
<p>De beste norske oversettelsene er nok “stabel” for “stack”, og “haug” for “heap”.
Disse ordene tror jeg er ganske vanlig i undervisning i Norge.</p>
<p>Konseptene jeg har nevnt i denne artikkelen har alle vært ganske basale,
og mer komplisert kommer det nok til å bli om vi forsøker å lage norskspråklige utrykk for det avanserte.
Diskusjoner kan nok has om hvorvidt det er verdt å prøve engang.</p>
<p><em>Utfordring til leser</em>: finn et godt norsk utrykk for “concurrent” og “concurrency”.</p>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>Fri programvare med CLA kan "teppedras"</title>
    <link href="https://krek.no/artikler/2026-03-30-frikode-cla-teppedragning.html" />
    <id>https://krek.no/artikler/2026-03-30-frikode-cla-teppedragning.html</id>
    <published>2026-03-30T00:00:00Z</published>
    <updated>2026-03-30T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article class="mb-10">
    <section class="text-gray-600 text-sm mb-5">
        Publisert 30. mars 2026
    </section>
    <section>
        <p>Hei! Jeg er bare en kode-apekatt, <strong>ikke en
<a href="https://www.nrk.no/video/advokatten-sjarmerer-juristen_fee5379c-a32e-400e-9c4d-f05656ed99e2" target="_blank">advokatt</a></strong>.
Ta det jeg sier med en pote salt.</p>
<p>Opprinnelig var denne artikkelen en “<a href="/idlj.html">IDLJ</a>”, om noe jeg lærte om for litt over en måned siden av
<a href="https://linderud.dev/about/" target="_blank">Morten Linderud</a> på <a href="https://norge.chat" target="_blank">Norge.Chat</a>,
men det ballet litt på seg og føles nå mer naturlig som en artikkel.</p>
<p>Jeg har lenge trodd at GPL-3.0 og andre såkalte ‘sterke copyleft’-lisenser betyr følgende:
“programvaren kan brukes til alle formål, så lenge du gjør egne modifikasjoner og utvidelser tilgjengelige under samme lisens”.
Dette er generelt sett korrekt, med litt variasjon mellom de ulike lisensene på hva som er å anse som en modifikasjon.</p>
<p>Feilaktig har jeg lenge antatt at kravet om å gjøre endringer tilgjengelige under samme lisens
også gjelder den som opprinnelig lagde programvaren.
I min verden betydde dette at så fort programvare var ‘sterk copyleft’,
kommer alltid fremtidige versjoner også til å være det.</p>
<p><strong>Dessverre er dette ikke sant.</strong>
Disse lisensene er noe opphavsrettholderen gir til andre, men er ikke bundet av selv.</p>
<p>I praksis vil større prosjekter med mange bidragsytere,
der bidragsyterene alle deler sin kode med hverandre under samme sterke copyleft-lisens,
og alle beholder det opphavsrettslige
eierskapet til sin egen kode, være ganske trygge.
Dette er fordi de må alle gå sammen i enighet om den skal omlisensieres.</p>
<p>Problemet kommer når et prosjekt du er avhengig av, og har festet tillit til fordi det er ‘sterk copyleft’,
enten (1) opphavsrettslig har bare én eier,
eller (2) har én entitet med mye sterkere rettigheter til kildekoden enn alle andre.
Da har du risiko, fordi en enkelt entitet kan bestemme seg for at fremtidige versjoner av programmet
ikke lenger skal være fritt.</p>
<p>For meg virker det som at de fleste prosjekter innen ‘sterk copyleft’-programvare
med en eier som ønsker å beholde rettighetene til å omlisensiere i fremtiden,
oppnår dette ved bruk av såkalte “CLA”-er (bidragsyters lisensavtale).
I disse avtalene beholder bidragsyteren fortsatt opphavsretten, men gir en svært omfattende og
ugjenkallelig lisens til prosjektets eier, <em>uten</em> den samme restriksjonen rundt modifikasjoner og utvidelser
som kommer med sterke copyleft-lisenser.</p>
<p>Selvfølgelig kan prosjektet “gafles”, og versjonen fra før lisensendringen skjedde vil fortsatt være fri,
men det er mange prosjekter (spesielt de som rettes mot utviklere) som markedsføres med at de er fri programvare,
men utvikles i all hovedsak av et enkelt selskap,
og det er vanskelig å bygge nok momentum til å vedlikeholde en gaffel. Dette utgjør en risiko.</p>
<p>Et eksempel på et slikt prosjekt er Overleaf,
en populær nettside i akademia for å samarbeide om LaTeX dokumenter.
For i overkant av et år siden <a href="/idlj/2024-07-30-overleaf-fri.html">priste jeg dem</a>
for å være AGPL-3.0-lisensiert fri programvare,
men i dag ser jeg at for å bidra til prosjektet må du signere en
<a href="https://docs.google.com/forms/d/e/1FAIpQLSef79XH3mb7yIiMzZw-yALEegS-wyFetvjTiNBfZvf_IHD2KA/viewform?usp=sf_link" target="_blank">CLA</a>
med eierene av Overleaf, som gir de rettighetene til å ta med din kode i en eventuell fremtidig
omlisensiert versjon av programvaren.</p>
<p>Eksempler relativt ferskt i mitt minne på prosjekter som har gjort “åpen-kildekode teppedragning”
inkluderer Redis og MinIO. Disse fungerte på litt ulike måter, og det er verdt å nevne at ingen av
de var ‘sterk copyleft’+CLA, slik jeg har beskrevet hittil i artikkelen, men MinIO blir ganske nærliggende.</p>
<p>Redis var opprinnelig (<a href="https://redis.io/legal/licenses/" target="_blank">frem til versjon 7.2</a>)
BSD-3-Clause-lisensiert, og hadde aldri en ‘sterk copyleft’-lisens.
De trengte dermed ikke en CLA, da BSD-3-Clause gir veldig brede rettigheter for hva programvaren kan brukes til,
og kommer ikke med noe krav om at endringer eller utvidelser skal gis ut under samme lisens.</p>
<p>Redis sin overgang til en såkalt ‘source-available’ lisens i 2024 fikk en rask respons i form av gaffelen
“<a href="https://valkey.io/" target="_blank">Valkey</a>”, som fortsatt er BSD-3-Clause lisensiert,
ser ut til å være godt vedlikeholdt, og eies av <a href="https://www.linuxfoundation.org/" target="_blank">Linux Foundation</a>.
Redis har siden gjort enda en lisensendring, men min følelse er at utviklere flest fortsatt heller velger å stole på Valkey.</p>
<p>MinIO var annerledes.
I <a href="https://github.com/minio/minio/commit/069432566fcfac1f1053677cc925ddafd750730a" target="_blank">april 2021</a>
byttet de fra Apache-2.0 til AGPL-3.0, men krevde fra
<a href="https://github.com/minio/minio/commit/6c59b33fb123f3418db67368f510c55c21ec5d3e" target="_blank">august 2021</a>
at eksterne bidag ble lisensiert under Apache-2.0.
(Hva som skjedde med eksterne bidrag i perioden april-august 2021 vet jeg ikke,
dette er kanskje materiale for en fremtidig undersøkelse.)
I slutten av 2025 var det klart at selskapet bak MinIO ikke lenger var intressert i å vedlikeholde den
åpne versjonen av programvaren, og pekte brukere heller på det proprietære produktet “MinIO AIStor”.
Dette kunne de gjøre, fordi eksterne bidragsytere hadde lisensiert sin kode til MinIO på et vis som gav de tillatelse til det.
Siden februar 2026 har repoet vært arkivert på GitHub.</p>
<p>Det har ikke på samme måte som Valkey for Redis dukket opp en klar arvtaker etter MinIO.
Gafler finnes selvfølgelig, men ingen av de aktivt vedlikeholdt såvidt jeg kan finne.</p>
<p>Andre alternativer som baserer seg på helt selvstendige kodebaser er
<a href="https://garagehq.deuxfleurs.fr/" target="_blank">Garage</a> (AGPL-3.0)
og <a href="https://github.com/seaweedfs/seaweedfs" target="_blank">SeaweedFS</a> (Apache-2.0),
begge uten CLA.
Sistnevnte virker som den mest avanserte løsningen, som prøver å være mye mer enn “bare” en S3-erstatning,
men er i all hovedsak laget av én enkelt utvikler, og trolig lite resistent mot likennde teppedragning.
Førstnevnte ser litt mer indie og minimalistisk ut, med tilsynelatende 3-4 aktive utviklere.</p>
<p>Et av de mer omtalte alternativene er kanskje <a href="https://rustfs.com/" target="_blank">RustFS</a>,
men det har Apache-2.0 og CLA, så det er ingen grunn til å tro at det samme som skjedde MinIO
ikke kan skje her også. Det gir meg også litt avsmak hvor mye de reklamerer for å være skrevet i Rust.</p>
<p>En annen faktor, som kan være grunn til at selskaper foretrekker ‘sterk copyleft’+CLA fremfor
‘permissive licensing’ er konkurransevern.
Om selskapet bak produktet ønsker å lage en proprietær versjon med ekstra funksjoner,
har de all rett til å gjøre det, men eventuelle konkurrenter må gjøre sine ekstra funksjoner
offentlig tilgjengelig under samme lisens.
Det kreves selvsagt ikke at eksterne signerer CLA med mindre de vil ha sin endring inn i
den “offisielle” versjonen.
Personlig har jeg egentlig ikke et stort problem med dette.</p>
<p>Fremover kommer det til å bli viktig for meg å ikke bare sjekke lisensen, men også hvorvidt det
kreves at bidragsytere underskriver en CLA, sammen med hvem som står bak og hvor godt vedlikeholdt det er
når jeg evaluerer om jeg skal bruke et program.
Gullstandarden vil nok være ‘sterk copyleft’ uten CLA, med aktive vedlikeholdere,
eller eierskap i en ideell organisasjon, som Linux, Valkey, eller (på den mer ekstreme siden) GNU-programvare.</p>
<p>Diskusjonen med Morten på Norge Chat var grunnet i at jeg sa jeg likte
<a href="https://netbird.io/" target="_blank">NetBird</a>, et europeisk-utviklet alternativ til Tailscale.
NetBird er AGPL-3.0-lisensiert, og markedsfører seg med at det er åpen kildekode,
selv om det også er et kommersielt produkt.
NetBird krever CLA, og det gjør meg nå usikker på at jeg fortsatt kan bruke i fremtiden,
og mer engstlig for å avhenge av det.</p>
<p>Rent filosofisk synes ikke jeg at vi kan gjøre krav på fremtidig innsats fra åpen-kode-bidragsytere
i å fortsette å vedlikeholde et prosjekt vi avhenger av.
Vi kan heller ikke forvente av et selskap at de skal vedlikeholde åpne prosjekter om det ville vært
mer inntektsbringende å gjøre de proprietære.
Vi bør likevel være klar over at selskaper kan spekulere i å markedsføre seg som åpent,
eller mer generelt å gjøre noe gratis tilgjengelig i begynnelsen,
for å bygge en brukerbase som avhenger av de som infrastruktur, for så å gjøre produktet proprietært.
Det er dette vi bør kjenne igjen som teppedragning.</p>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>`import std;` er litt knot</title>
    <link href="https://krek.no/artikler/2026-01-13-cpp-import-std.html" />
    <id>https://krek.no/artikler/2026-01-13-cpp-import-std.html</id>
    <published>2026-01-13T00:00:00Z</published>
    <updated>2026-01-13T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article class="mb-10">
    <section class="text-gray-600 text-sm mb-5">
        Publisert 13. januar 2026
    </section>
    <section>
        <p>Jeg har et nytt prosjekt på gang, som jeg ønsker å bruke som en plattform for
å lære de nyeste konseptene i C++.
Den nyeste <a href="https://www.iso.org/standard/83626.html" target="_blank">standarden</a>
er i skrivende stund C++23, publisert i oktober 2024.</p>
<p>I følge <a href="https://en.wikipedia.org/wiki/C%2B%2B23" target="_blank">Wikipedia</a>
er dette hvordan man nå skal skrive “Hello, world!” i C++23:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> std<span class="op">;</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a><span class="dt">int</span> main<span class="op">()</span> <span class="op">{</span></span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a>    <span class="bu">std::</span>println<span class="op">(</span><span class="st">&quot;Hello, world!&quot;</span><span class="op">);</span></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p>Her ser vi en av de best kjente endringene i C++23: de har lagt til en
<a href="https://en.cppreference.com/w/cpp/io/println.html" target="_blank"><code>println</code>-funksjon</a>
i standardbiblioteket! :<em>eksploderende hode-emoji</em>:
(Det finnes også <code>print</code>, som fungerer som du forventer.)</p>
<p>En annen stor greie her finnes på første linje, artikkelens emne: <code>import std;</code>.
Wikipedia-programmet bruker altså standardbiblioteket som en modul(!), ikke via header-filer.
Denne muligheten er en ny del av C++23-standarden.</p>
<p>(<a href="https://en.cppreference.com/w/cpp/language/modules.html" target="_blank">Moduler</a> har eksistert siden C++20,
og gir deg en litt mer moderne opplevelse rundt å splitte kode i mange filer enn header- og kildefiler gjør.
Det gir også store forbedringer i kompileringstid.)</p>
<p>Jeg ønsker å bruke C++23 for alt det er verdt i prosjektet mitt, så <code>import std;</code> må jeg selvsagt ha.
Utviklingsmiljøet på min bærebare PC har relativt oppdaterte versjoner av ganske industristandard-komponenter:</p>
<ul>
<li>macOS 26 (aarch64)</li>
<li>CLion 2025.3.1.1 (JetBrains sin C/C++-IDE)</li>
<li>CMake 4.2.1 (meta-byggesystem) (Homebrew)</li>
<li>Ninja 1.13.2 (byggesystem) (Homebrew)</li>
<li>LLVM 21.1.8 (inkl. clang/clang++, standardbibliotek, debugger, etc.) (Homebrew)</li>
</ul>
<p>Å få disse komponentene til å spille på lag slik at “Wikipedia-programmet” kan kjøres har
krevd overraskende mye magi.
Jeg oppsummerer her de nødvendige faktorene å ta hensyn til, mesteparten også relevant for Linux.</p>
<h2 id="overbevise-cmake-om-å-kunne-importere-standardbiblioteket">Overbevise CMake om å kunne importere standardbiblioteket</h2>
<p>Her er hva jeg tror er en nokså kryss-plattform CMake konfigurasjon,
i allefall så lenge vi bruker clang.
CMake støtter per i dag <code>import std;</code> som en eksperimentell egenskap.
Vi må derfor, avhengig av versjon, skru på <code>CMAKE_EXPERIMENTAL_CXX_IMPORT_STD</code>-variabelen
med en spesifikk UUID, som identifiserer den eksakte CMake-koden som skal kjøre for å skru på støtten.
Alt dokumentert <a href="https://gitlab.kitware.com/cmake/cmake/-/blob/v4.2.1/Help/dev/experimental.rst?ref_type=tags&amp;plain=1#L77-100" target="_blank">her</a>.</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode cmake"><code class="sourceCode cmake"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="kw">cmake_minimum_required</span>(<span class="ot">VERSION</span> <span class="dt">4.2</span>)</span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a><span class="kw">set</span>(<span class="dv">CMAKE_CXX_STANDARD</span> 23)</span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="kw">set</span>(<span class="dv">CMAKE_CXX_STANDARD_REQUIRED</span> True)</span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a><span class="kw">set</span>(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD <span class="st">&quot;d0edc3af-4c50-42ea-a356-e2862fe7a444&quot;</span>)</span>
<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a><span class="kw">set</span>(CMAKE_CXX_COMPILER_IMPORT_STD 1)</span>
<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a><span class="kw">set</span>(<span class="dv">CMAKE_CXX_FLAGS</span> <span class="st">&quot;</span><span class="dv">${CMAKE_CXX_FLAGS}</span><span class="st"> -stdlib=libc++&quot;</span>)</span>
<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a><span class="kw">set</span>(<span class="dv">CMAKE_EXE_LINKER_FLAGS</span> <span class="st">&quot;</span><span class="dv">${CMAKE_EXE_LINKER_FLAGS}</span><span class="st"> -stdlib=libc++ -lc++abi&quot;</span>)</span>
<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a><span class="kw">project</span>(dans <span class="ot">LANGUAGES</span> <span class="ot">CXX</span>)</span>
<span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a><span class="kw">add_executable</span>(<span class="bn">dans</span> main.cpp)</span>
<span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a><span class="kw">set_target_properties</span>(<span class="bn">dans</span> <span class="ot">PROPERTIES</span></span>
<span id="cb2-16"><a href="#cb2-16" aria-hidden="true" tabindex="-1"></a>    CXX_MODULE_STD 1</span>
<span id="cb2-17"><a href="#cb2-17" aria-hidden="true" tabindex="-1"></a>)</span></code></pre></div>
<p>Videre er det slik at for clang er det bare LLVM-implementeringen (<code>libc++</code>) av standardbiblioteket
som støttes som modul. (Man kan altså ikke bruke <code>libstdc++</code>, GNU-implementeringen.)
Dette settes som flagg til kompilator og linker i vist konfigurasjon.
Til slutt må vi spesifikt si at target (her <code>dans</code>) skal ha egenskapen <code>CXX_MODULE_STD</code> slått på.</p>
<p>Om man glemmer variabler her, eller setter de i feil rekkefølge i forhold til deklarasjonen av <code>project()</code>,
kan man få kryptiske eller lite nyttige feilmeldinger.
En spesielt smertefull situasjon kan oppstå om man (som jeg gjorde) går ut fra at det går bra å bare sette
<code>CMAKE_EXPERIMENTAL_CXX_IMPORT_STD</code> til <code>True</code>.
Da blir egenskapen ikke slått på, men gir heller ingen form for feilmelding.</p>
<p>Dette er fortsatt ikke helt nok konfigurasjon, fordi
<a href="https://gitlab.kitware.com/cmake/cmake/-/blob/v4.2.1/Modules/Compiler/Clang-CXX-CXXImportStd.cmake?ref_type=tags" target="_blank"><code>Clang-CXX-CXXImportStd.cmake</code></a>
altså CMake-koden som lastes når man skrur på den eksperimentelle støtten <strong>og</strong> bruker clang,
ikke klarer å detektere en viktig fil på egenhånd: <code>libc++.modules.json</code>, manifestet til
standardbibliotek-modulen.</p>
<p>Dette er et ganske bredt rapportert problem, og mange kilder foreslår <a href="https://gitlab.kitware.com/cmake/cmake/-/issues/25965#note_1523575" target="_blank">denne løsningen</a>,
altså å redigere CMake-koden for å gi den nok informasjon til å finne manifestfilen.
Mange av disse diskusjonene er gamle, og jeg føler ikke for å redigere kode distribuert av pakkebehandleren min.
En kjapp sjekk av <code>Clang-CXX-CXXImportStd.cmake</code> viser at det siden har kommet en ny variabel:
<code>CMAKE_CXX_STDLIB_MODULES_JSON</code>. Det er nok å sette denne til absolutt filbane for manifestet for å korrigere problemet.
<em>Denne løsningen har jeg ikke sett nevnt på noen form for nettsøk.</em></p>
<p>Til slutt (dette spesifikt fordi jeg bruker Homebrew, og ikke Apple sin innebygde distribusjon av LLVM)
må vi instruere CMake om hvor den skal finne operativsystemets headerfiler og biblioteker å linke mot.</p>
<p>Jeg kjører altså CMake med følgende ekstra (plattformspesifikke) argumenter:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="ex">-DCMAKE_OSX_SYSROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk</span></span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a><span class="ex">-DCMAKE_CXX_STDLIB_MODULES_JSON=/opt/homebrew/opt/llvm/lib/c++/libc++.modules.json</span></span></code></pre></div>
<p>Vi har nå en CMake-konfigurasjon som under verktøykassa fra Homebrew lar oss kjøre
og debugge Wikipedia-programmet i og utenfor CLion.</p>
<h2 id="la-clion-se-standardbiblioteket-som-en-modul">La CLion se standardbiblioteket som en modul</h2>
<p>Selv om vi nå har en byggbar CMake-konfigurasjon, får vi feilmeldinger relatert til standardbibliotek-import i CLion,
som er plagsomme og gjør at vi ikke får noen form for hjelp i IDE-en.
Dette har vært et <a href="https://youtrack.jetbrains.com/issue/CPP-39632/import-std-CLion-cant-resolve-module-std-in-case-of-clang#focus=Comments-27-10397326.0-0" target="_blank">kjent problem</a>
i CLion siden august 2024, tilsynelatende uten noen fiks annet enn nødløsningen foreslått i kommentaren.</p>
<p>Jeg har endt opp med å legge til følgende ekstra (funksjonelt unødvendige) CMake-mål kun for at
CLion skal plukke opp standardbibliotek-modulen i sin indeksering.</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode cmake"><code class="sourceCode cmake"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="co"># Hack to make CLion happy with `import std;`</span></span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a><span class="kw">add_library</span>(<span class="bn">unused_std_target</span> <span class="ot">STATIC</span>)</span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a><span class="kw">target_sources</span>(<span class="bn">unused_std_target</span></span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a>    <span class="ot">PRIVATE</span></span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a>    <span class="ot">FILE_SET</span> <span class="ot">CXX_MODULES</span></span>
<span id="cb4-6"><a href="#cb4-6" aria-hidden="true" tabindex="-1"></a>    <span class="ot">BASE_DIRS</span> /opt/homebrew/opt/llvm/share/libc++/v1</span>
<span id="cb4-7"><a href="#cb4-7" aria-hidden="true" tabindex="-1"></a>    <span class="ot">FILES</span> /opt/homebrew/opt/llvm/share/libc++/v1/std.cppm</span>
<span id="cb4-8"><a href="#cb4-8" aria-hidden="true" tabindex="-1"></a>        /opt/homebrew/opt/llvm/share/libc++/v1/std.compat.cppm</span>
<span id="cb4-9"><a href="#cb4-9" aria-hidden="true" tabindex="-1"></a>)</span></code></pre></div>
<p>(Her med spesifikke filbaner for min LLVM-installasjon.)</p>
<h2 id="i-konklusjon">I konklusjon</h2>
<p>Jeg har nå et greit utviklingsmiljø for å jobbe med C++23, men forstår absolutt hvorfor
prosjekter ofte er treige på å adoptere nye C++-standarder.
Gleder meg til å få dette til å funke på Linux (og gcc) også…</p>
<p>Mesteparten av problemene her kom ikke av at jeg bare ville bruke <code>import std;</code>,
men heller fordi jeg også ville ha alle de andre fine greiene rundt.
CLion støtter CMake absolutt best, og CMake er for alle sine feil utvilsomt standardverktøyet
for å bygge C++-prosjekter.
Dette er mye mer verktøy enn hva kan rettferdiggjøres for “Hello, world!”,
men vil forhåpentligvis lønne seg i lengden etterhvert som prosjektet legger til avhengigheter
og sine egne biblioteker og interne moduler.</p>
<p>Følg med for å se hva det blir til!</p>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>IDLJ: Let's Encrypt sjekker bare IPv6</title>
    <link href="https://krek.no/idlj/2025-12-11-letsencrypt-ipv6.html" />
    <id>https://krek.no/idlj/2025-12-11-letsencrypt-ipv6.html</id>
    <published>2025-12-11T00:00:00Z</published>
    <updated>2025-12-11T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article class="mb-10">
    <section class="text-gray-600 text-sm mb-5">
        Publisert 11. desember 2025
    </section>
    <section>
        <p>Jeg bruker nginx og <a href="https://certbot.eff.org/" target="_blank">certbot</a> for noen tjenester jeg verter.
Sistnevnte er et Python script som kan skaffe og automatisk fornye TLS-sertifikater, fortrinnsvis ved å bruke
Let’s Encrypt sin <a href="https://letsencrypt.org/docs/challenge-types/#http-01-challenge" target="_blank">HTTP-01 Challenge</a>.
Dette fungerer ved at den endrer nginx sin konfigurasjon til å levere en fil på en bestemt URL,
som skal bevise at du som forespør et sertifikat også har kontroll over nettsiden.</p>
<p>I morges opplevde jeg at et par av tjenestene hadde utløpte sertifikater.
Rettere sagt fikk jeg en tekstmelding fra en forvirret bruker.
Jeg gikk på server og prøvde å fornye sertifikatene manuelt med <code>sudo certbot renew</code>.
Jeg fikk en feilmelding som så omtrent slik ut:</p>
<pre><code>Certbot failed to authenticate some domains (authenticator: nginx). 
  The Certificate Authority reported these problems:
  Domain: &lt;DOMENENAVN&gt;
  Type:   unauthorized
  Detail: &lt;IPv6-adresse&gt;: Invalid response from 
    http://&lt;DOMENENAVN&gt;/.well-known/acme-challenge/&lt;CHALLENGE-ID&gt;: 404
 </code></pre>
<p>Da gir det mening at sertifikatene er utløpt, certbot ikke klarer å fornye dem.</p>
<p>En ting som slo meg var at den prøvde å gjøre det til serverens IPv6-adresse.
Jeg hadde nylig lagt inn en <code>AAAA</code> (altså IPv6) rad i DNS for de påvirkede tjenestene, uten noen videre testing på om det fungerte.
Dette var kilden til feilen. I nginx må du eksplistitt spesifisere at en virtual host skal gjelde begge adressefamilier.</p>
<p>Om du bruker certbot har du sannsynligvis denne typen blokker i nginx-konfigurasjonen din,
virtual hosts som lytter for HTTP-trafikk, og omdirigerer det til HTTPS:</p>
<pre class="nginx"><code>server {
    if ($host = &lt;DOMENENAVN&gt;) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;

    server_name &lt;DOMENENAVN&gt;;
    return 404; # managed by Certbot
}
 </code></pre>
<p>Denne spesifiserer <code>listen 80;</code>, hvilket betyr at den mottar trafikk til <strong>IPv4</strong> på port 80.
For at blokken også skal være gjeldene for IPv6-trafikk, må du også legge inn <code>listen [::]:80;</code>.
Dette løste problemet og gjorde det mulig for Let’s Encrypt å nå utfordringsfilen.</p>
<p>En ganske amatørmessig feil å gjøre, som kunne lett vært unngått med enten bedre testing av konfigurasjonsendringer,
eller kontinuerilg overvåkning av sertifikater som er i ferd med å utløpe.
Uansett var det ikke katastrofalt, og god lærdom.
Jeg skal sette opp bedre overvåkning snart, jeg lover.</p>
<h2 id="p.s.">P.S.</h2>
<p>En ting å legge merke til er at på den aktuelle serveren var <code>default</code> virtual hosten i nginx slått på.
Denne lytter eksplistitt på begge adressefamilier, så nginx-prosessen måtte også gjøre det.
Om den hadde vært slått av, kan det være nginx ikke hadde lyttet på IPv6 i det hele tatt, og Let’s Encrypt
hadde fått en TCP-rejection fra serveren.
Da kan det være Let’s Encrypt hadde falt tilbake til IPv4, og fornyelsen hadde gått gjennom.
Dette er spekulasjon, jeg har ikke testet.</p>
<p>Tips: legger du til en liten <code>-v</code> så det blir <code>sudo certbot renew -v</code>, forteller den deg også hva den gjør.
Slik var det klart for meg at den skrev om nginx sin konfigurasjon
på en måte som burde gjøre det mulig å aksessere HTTP-01 utfordringslenken i HTTP virtual hosten til nettsiden.</p>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>IDLJ: Overleaf er fri programvare</title>
    <link href="https://krek.no/idlj/2024-07-30-overleaf-fri.html" />
    <id>https://krek.no/idlj/2024-07-30-overleaf-fri.html</id>
    <published>2024-07-30T00:00:00Z</published>
    <updated>2024-07-30T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article class="mb-10">
    <section class="text-gray-600 text-sm mb-5">
        Publisert 30. juli 2024
    </section>
    <section>
        <p><em>Oppdatering 30. mars 2026: Jeg har siden publikasjon av denne artikkelen
<a href="/artikler/2026-03-30-frikode-cla-teppedragning.html">lært mer om</a>
nyanser i lisenser og opphavsrett i fri programvare,
og har ikke lenger en like positiv mening om denne artikkelens emne.</em></p>
<p><a href="https://www.overleaf.com" target="_blank">Overleaf</a>, altså nettsiden som lar deg samarbeide om LaTeX-dokumenter,
er fri programvare, lisensiert under AGPL-3.0!
Kildekoden er tilgjengelig på <a href="https://github.com/overleaf/overleaf" target="_blank">GitHub</a>,
og programmet kan angivelig selv-vertes.</p>
<p>README-en tar et forbehold om at dokumentkompilering ikke sandbokses i den offentlige versjonen,
så den bør ikke brukes om du ikke kan stole på brukerene.
Jeg tror heller ikke den har støtte for integrasjoner, for eksempel med Zotero.</p>
<p>Hvordan disse funksjonene kan være propreitære når de bygger på et AGPL-3.0 prosjekt er jeg ikke sikker på.
Det er kanskje mulig om de virker som eksterne moduler, ikke integrert i selve kodebasen.</p>
    </section>
</article>
]]></summary>
</entry>

</feed>
