1 <!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Strict//EN"
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns=
"http://www.w3.org/1999/xhtml" dir=
"ltr">
5 <meta http-equiv=
"Content-Type" content=
"text/html;charset=utf-8" />
6 <title>Petter Reinholdtsen
</title>
7 <link rel=
"stylesheet" type=
"text/css" media=
"screen" href=
"https://people.skolelinux.org/pere/blog/style.css" />
8 <link rel=
"stylesheet" type=
"text/css" media=
"screen" href=
"https://people.skolelinux.org/pere/blog/vim.css" />
9 <link rel=
"alternate" title=
"RSS Feed" href=
"https://people.skolelinux.org/pere/blog/index.rss" type=
"application/rss+xml" />
14 <a href=
"https://people.skolelinux.org/pere/blog/">Petter Reinholdtsen
</a>
23 <div class=
"title"><a href=
"https://people.skolelinux.org/pere/blog/45_orphaned_Debian_packages_moved_to_git__391_to_go.html">45 orphaned Debian packages moved to git,
391 to go
</a></div>
24 <div class=
"date">25th April
2024</div>
25 <div class=
"body"><p>Nine days ago, I started migrating orphaned Debian packages with no
26 version control system listed in debian/control of the source to git.
27 At the time there were
438 such packages. Now there are
391,
28 according to the UDD. In reality it is slightly less, as there is a
29 delay between uploads and UDD updates. In the nine days since, I have
30 thus been able to work my way through ten percent of the packages. I
31 am starting to run out of steam, and hope someone else will also help
32 brushing some dust of these packages. Here is a recipe how to do it.
34 I start by picking a random package by querying the UDD for a list of
35 10 random packages from the set of remaining packages:
38 PGPASSWORD="udd-mirror" psql --port=
5432 --host=udd-mirror.debian.net \
39 --username=udd-mirror udd -c "select source from sources \
40 where release = 'sid' and (vcs_url ilike '%anonscm.debian.org%' \
41 OR vcs_browser ilike '%anonscm.debian.org%' or vcs_url IS NULL \
42 OR vcs_browser IS NULL) AND maintainer ilike '%packages@qa.debian.org%' \
43 order by random() limit
10;"
46 <p>Next, I visit http://salsa.debian.org/debian and search for the
47 package name, to ensure no git repository already exist. If it does,
48 I clone it and try to get it to an uploadable state, and add the Vcs-*
49 entries in d/control to make the repository more widely known. These
50 packages are a minority, so I will not cover that use case here.
</p>
52 <p>For packages without an existing git repository, I run the
53 following script
<tt>debian-snap-to-salsa
</tt> to prepare a git
54 repository with the existing packaging.
</p>
59 # See also https://bugs.debian.org/
804722#
31
63 # Move to this Standards-Version.
68 if [ -z "$PKG" ]; then
69 echo "usage: $
0 <pkgname>"
73 if [ -e "${PKG}-salsa
" ]; then
74 echo "error: ${PKG}-salsa already exist, aborting.
"
78 if [ -z "ALLOWFAILURE
" ] ; then
82 # Fetch every snapshotted source package. Manually loop until all
83 # transfers succeed, as 'gbp import-dscs --debsnap' do not fail on
85 until debsnap --force -v $PKG || $ALLOWFAILURE ; do sleep 1; done
86 mkdir ${PKG}-salsa; cd ${PKG}-salsa
89 # Specify branches to override any debian/gbp.conf file present in the
91 gbp import-dscs --debian-branch=master --upstream-branch=upstream \
92 --pristine-tar ../source-$PKG/*.dsc
94 # Add Vcs pointing to Salsa Debian project (must be manually created
96 if ! grep -q ^Vcs- debian/control ; then
97 awk "BEGIN { s=
1 } /^\$/ { if (s==
1) { print \
"Vcs-Browser: https://salsa.debian.org/debian/$PKG\"; print \
"Vcs-Git: https://salsa.debian.org/debian/$PKG.git\" }; s=
0 } { print }
" < debian/control > debian/control.new && mv debian/control.new debian/control
98 git commit -m "Updated vcs in d/control to Salsa." debian/control
101 # Tell gbp to enforce the use of pristine-tar.
102 inifile +inifile debian/gbp.conf +create +section DEFAULT +key pristine-tar +value True
103 git add debian/gbp.conf
104 git commit -m "Added d/gbp.conf to enforce the use of pristine-tar." debian/gbp.conf
106 # Update to latest Standards-Version.
107 SV="$(grep ^Standards-Version: debian/control|awk '{print $
2}')"
108 if [ $SV_LATEST != $SV ]; then
109 sed -i "s/\(Standards-Version: \)\(.*\)/\
1$SV_LATEST/" debian/control
110 git commit -m "Updated Standards-Version from $SV to $SV_LATEST." debian/control
113 if grep -q pkg-config debian/control; then
114 sed -i s/pkg-config/pkgconf/ debian/control
115 git commit -m "Replaced obsolete pkg-config build dependency with pkgconf." debian/control
118 if grep -q libncurses5-dev debian/control; then
119 sed -i s/libncurses5-dev/libncurses-dev/ debian/control
120 git commit -m "Replaced obsolete libncurses5-dev build dependency with libncurses-dev." debian/control
124 Some times the debsnap script fail to download some of the versions.
125 In those cases I investigate, and if I decide the failing versions
126 will not be missed, I call it using ALLOWFAILURE=true to ignore the
127 problem and create the git repository anyway.
</p>
129 <p>With the git repository in place, I do a test build (gbp
130 buildpackage) to ensure the build is actually working. If it does not
131 I pick a different package, or if the build failure is trivial to fix,
132 I fix it before continuing. At this stage I revisit
133 http://salsa.debian.org/debian and create the project under this group
134 for the package. I then follow the instructions to publish the local
135 git repository. Here is from a recent example:
</p>
138 git remote add origin git@salsa.debian.org:debian/perl-byacc.git
139 git push --set-upstream origin master upstream pristine-tar
143 <p>With a working build, I have a look at the build rules if I want to
144 remove some more dust. I normally try to move to debhelper compat
145 level
13, which involves removing debian/compat and modifying
146 debian/control to build depend on debhelper-compat (=
13). I also test
147 with 'Rules-Requires-Root: no' in debian/control and verify in
148 debian/rules that hardening is enabled, and include all of these if
149 the package still build. If it fail to build with level
13, I try
150 with
12,
11,
10 and so on until I find a level where it build, as I do
151 not want to spend a lot of time fixing build issues.
</p>
153 <p>Some times, when I feel inspired, I make sure debian/copyright is
154 converted to the machine readable format, often by starting with
155 'debhelper -cc' and then cleaning up the autogenerated content until
156 it matches realities. If I feel like it, I might also clean up
157 non-dh-based debian/rules files to use the short style dh build
160 <p>Once I have removed all the dust I care to process for the package,
161 I run 'gbp dch' to generate a debian/changelog entry based on the
162 commits done so far, run 'dch -r' to switch from 'UNRELEASED' to
163 'unstable' and get an editor to make sure the 'QA upload' marker is in
164 place and that all long commit descriptions are wrapped into sensible
165 lengths, run 'debcommit --release -a' to commit and tag the new
166 debian/changelog entry, run 'debuild -S' to build a source only
167 package, and 'dput ../perl-byacc_2.0-
10_source.changes' to do the
168 upload. During the entire process, and many times per step, I run
169 'debuild' to verify the changes done still work. I also some times
170 verify the set of built files using 'find debian' to see if I can spot
171 any problems (like no file in usr/bin any more or empty package). I
172 also try to fix all lintian issues reported at the end of each
175 <p>If I find Debian specific patches, I try to ensure their metadata
176 is fairly up to date and some times I even try to reach out to
177 upstream, to make the upstream project aware of the patches. Most of
178 my emails bounce, so the success rate is low. For projects with no
179 Homepage entry in debian/control I try to track down one, and for
180 packages with no debian/watch file I try to create one. But at least
181 for some of the packages I have been unable to find a functioning
182 upstream, and must skip both of these.
</p>
184 <p>If I could handle ten percent in nine days, twenty people could
185 complete the rest in less then five days. I use approximately twenty
186 minutes per package, when I have twenty minutes spare time to spend.
187 Perhaps you got twenty minutes to spare too?
</p>
189 <p>As usual, if you use Bitcoin and want to show your support of my
190 activities, please send Bitcoin donations to my address
191 <b><a href=
"bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a></b>.
</p>
196 Tags:
<a href=
"https://people.skolelinux.org/pere/blog/tags/debian">debian
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/english">english
</a>.
201 <div class=
"padding"></div>
204 <div class=
"title"><a href=
"https://people.skolelinux.org/pere/blog/RAID_status_from_LSI_Megaraid_controllers_in_Debian.html">RAID status from LSI Megaraid controllers in Debian
</a></div>
205 <div class=
"date">17th April
2024</div>
206 <div class=
"body"><p>I am happy to report that
207 <a href=
"https://github.com/namiltd/megactl">the megactl package
</a>,
208 useful to fetch RAID status when using the LSI Megaraid controller,
209 now is available in Debian. It passed NEW a few days ago, and is now
210 <a href=
"https://tracker.debian.org/pkg/megactl">available in
211 unstable
</a>, and probably showing up in testing in a weeks time. The
212 new version should provide Appstream hardware mapping and should
213 integrate nicely with isenkram.
</p>
215 <p>As usual, if you use Bitcoin and want to show your support of my
216 activities, please send Bitcoin donations to my address
217 <b><a href=
"bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a></b>.
</p>
223 Tags:
<a href=
"https://people.skolelinux.org/pere/blog/tags/english">english
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/isenkram">isenkram
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/raid">raid
</a>.
228 <div class=
"padding"></div>
231 <div class=
"title"><a href=
"https://people.skolelinux.org/pere/blog/Time_to_move_orphaned_Debian_packages_to_git.html">Time to move orphaned Debian packages to git
</a></div>
232 <div class=
"date">14th April
2024</div>
233 <div class=
"body"><p>There are several packages in Debian without a associated git
234 repository with the packaging history. This is unfortunate and it
235 would be nice if more of these would do so. Quote a lot of these are
236 without a maintainer, ie listed as maintained by the
237 '
<a href=
"https://qa.debian.org/developer.php?email=packages%40qa.debian.org">Debian
238 QA Group
</a>' place holder. In fact,
438 packages have this property
239 according to UDD (
<tt>SELECT source FROM sources WHERE release = 'sid'
240 AND (vcs_url ilike '%anonscm.debian.org%' OR vcs_browser ilike
241 '%anonscm.debian.org%' or vcs_url IS NULL OR vcs_browser IS NULL) AND
242 maintainer ilike '%packages@qa.debian.org%';
</tt>). Such packages can
243 be updated without much coordination by any Debian developer, as they
244 are considered orphaned.
</p>
246 <p>To try to improve the situation and reduce the number of packages
247 without associated git repository, I started a few days ago to search
248 out candiates and provide them with a git repository under the
249 'debian' collaborative Salsa project. I started with the packages
250 pointing to obsolete Alioth git repositories, and am now working my
251 way across the ones completely without git references. In addition to
252 updating the Vcs-* debian/control fields, I try to update
253 Standards-Version, debhelper compat level, simplify d/rules, switch to
254 Rules-Requires-Root: no and fix lintian issues reported. I only
255 implement those that are trivial to fix, to avoid spending too much
256 time on each orphaned package. So far my experience is that it take
257 aproximately
20 minutes to convert a package without any git
258 references, and a lot more for packages with existing git repositories
259 incompatible with git-buildpackages.
</p>
261 <p>So far I have converted
10 packages, and I will keep going until I
262 run out of steam. As should be clear from the numbers, there is
263 enough packages remaining for more people to do the same without
264 stepping on each others toes. I find it useful to start by searching
265 for a git repo already on salsa, as I find that some times a git repo
266 has already been created, but no new version is uploaded to Debian
267 yet. In those cases I start with the existing git repository. I
268 convert to the git-buildpackage+pristine-tar workflow, and ensure a
269 debian/gbp.conf file with "pristine-tar=True" is added early, to avoid
270 uploading a orig.tar.gz with the wrong checksum by mistake. Did that
271 three times in the begin before I remembered my mistake.
</p>
273 <p>So, if you are a Debian Developer and got some spare time, perhaps
274 considering migrating some orphaned packages to git?
</p>
276 <p>As usual, if you use Bitcoin and want to show your support of my
277 activities, please send Bitcoin donations to my address
278 <b><a href=
"bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a></b>.
</p>
283 Tags:
<a href=
"https://people.skolelinux.org/pere/blog/tags/debian">debian
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/english">english
</a>.
288 <div class=
"padding"></div>
291 <div class=
"title"><a href=
"https://people.skolelinux.org/pere/blog/Plain_text_accounting_file_from_your_bitcoin_transactions.html">Plain text accounting file from your bitcoin transactions
</a></div>
292 <div class=
"date"> 7th March
2024</div>
293 <div class=
"body"><p>A while back I wrote a small script to extract the Bitcoin
294 transactions in a wallet in the
295 <ahref=
"https://plaintextaccounting.org/">ledger plain text accounting
296 format
</a>. The last few days I spent some time to get it working
297 better with more special cases. In case it can be useful for others,
302 # -*- coding: utf-
8 -*-
303 # Copyright (c)
2023-
2024 Petter Reinholdtsen
305 from decimal import Decimal
312 def format_float(num):
313 return numpy.format_float_positional(num, trim='-')
316 u'amount' : 'Assets:BTC:main',
320 '
<some address
>' : 'Assets:bankkonto',
321 '
<some address
>' : 'Assets:bankkonto',
325 proc = subprocess.Popen(cmd,stdout=subprocess.PIPE)
326 j = json.loads(proc.communicate()[
0], parse_float=Decimal)
330 # get all transactions for all accounts / addresses
335 cmd = ['bitcoin-cli', 'listtransactions', '*', str(limit)]
337 txs.extend(exec_json(cmd))
339 # Useful for debugging
340 with open('transactions.json') as f:
341 txs.extend(json.load(f, parse_float=Decimal))
343 for tx in sorted(txs, key=lambda a: a['time']):
344 # print tx['category']
345 if 'abandoned' in tx and tx['abandoned']:
347 if 'confirmations' in tx and
0 >= tx['confirmations']:
349 when = time.strftime('%Y-%m-%d %H:%M', time.localtime(tx['time']))
352 elif 'comment' in tx:
358 print("%s %s" % (when, desc))
360 print(" ; to bitcoin address %s" % tx['address'])
362 print(" ; missing address in transaction, txid=%s" % tx['txid'])
363 print(f" ; amount={tx['amount']}")
365 print(f" ; fee={tx['fee']}")
366 for f in accounts.keys():
367 if f in tx and Decimal(
0) != tx[f]:
369 print(" %-
20s %s BTC" % (accounts[f], format_float(amount)))
370 if 'fee' in tx and Decimal(
0) != tx['fee']:
371 # Make sure to list fee used in several transactions only once.
372 if 'fee' in tx and tx['txid'] in txidfee \
373 and tx['fee'] == txidfee[tx['txid']]:
377 print(" %-
20s %s BTC" % (accounts['amount'], format_float(fee)))
378 print(" %-
20s %s BTC" % ('Expences:BTC-fee', format_float(-fee)))
379 txidfee[tx['txid']] = tx['fee']
381 if 'address' in tx and tx['address'] in addresses:
382 print(" %s" % addresses[tx['address']])
384 if 'generate' == tx['category']:
385 print(" Income:BTC-mining")
387 if amount < Decimal(
0):
388 print(f" Assets:unknown:sent:update-script-addr-{tx['address']}")
390 print(f" Assets:unknown:received:update-script-addr-{tx['address']}")
394 print("# Found %d transactions" % c)
396 print(f"# Warning: Limit {limit} reached, consider increasing limit.")
402 </pre></blockquote></p>
404 <p>It is more of a proof of concept, and I do not expect it to handle
405 all edge cases, but it worked for me, and perhaps you can find it
408 <p>To get a more interesting result, it is useful to map accounts sent
409 to or received from to accounting accounts, using the
410 <tt>addresses
</tt> hash. As these will be very context dependent, I
411 leave out my list to allow each user to fill out their own list of
412 accounts. Out of the box, 'ledger reg BTC:main' should be able to
413 show the amount of BTCs present in the wallet at any given time in the
414 past. For other and more valuable analysis, a account plan need to be
415 set up in the
<tt>addresses
</tt> hash. Here is an example
419 2024-
03-
07 17:
00 Donated to good cause
420 Assets:BTC:main -
0.1 BTC
421 Assets:BTC:main -
0.00001 BTC
422 Expences:BTC-fee
0.00001 BTC
423 Expences:donations
0.1 BTC
424 </pre></blockquote></p>
426 <p>It need a running Bitcoin Core daemon running, as it connect to it
427 using
<tt>bitcoin-cli listtransactions *
100000</tt> to extract the
428 transactions listed in the Wallet.
</p>
430 <p>As usual, if you use Bitcoin and want to show your support of my
431 activities, please send Bitcoin donations to my address
432 <b><a href=
"bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a></b>.
</p>
437 Tags:
<a href=
"https://people.skolelinux.org/pere/blog/tags/bitcoin">bitcoin
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/english">english
</a>.
442 <div class=
"padding"></div>
445 <div class=
"title"><a href=
"https://people.skolelinux.org/pere/blog/RAID_status_from_LSI_Megaraid_controllers_using_free_software.html">RAID status from LSI Megaraid controllers using free software
</a></div>
446 <div class=
"date"> 3rd March
2024</div>
447 <div class=
"body"><p>The last few days I have revisited RAID setup using the LSI
448 Megaraid controller. These are a family of controllers called PERC by
449 Dell, and is present in several old PowerEdge servers, and I recently
450 got my hands on one of these. I had forgotten how to handle this RAID
451 controller in Debian, so I had to take a peek in the
452 <a href=
"https://wiki.debian.org/LinuxRaidForAdmins">Debian wiki page
453 "Linux and Hardware RAID: an administrator's summary"
</a> to remember
454 what kind of software is available to configure and monitor the disks
455 and controller. I prefer Free Software alternatives to proprietary
456 tools, as the later tend to fall into disarray once the manufacturer
457 loose interest, and often do not work with newer Linux Distributions.
458 Sadly there is no free software tool to configure the RAID setup, only
459 to monitor it. RAID can provide improved reliability and resilience in
460 a storage solution, but only if it is being regularly checked and any
461 broken disks are being replaced in time. I thus want to ensure some
462 automatic monitoring is available.
</p>
464 <p>In the discovery process, I came across a old free software tool to
465 monitor PERC2, PERC3, PERC4 and PERC5 controllers, which to my
466 surprise is not present in debian. To help change that I created a
467 <a href=
"https://bugs.debian.org/1065322">request for packaging of the
468 megactl package
</a>, and tried to track down a usable version.
469 <a href=
"https://sourceforge.net/p/megactl/">The original project
470 site
</a> is on Sourceforge, but as far as I can tell that project has
471 been dead for more than
15 years. I managed to find a
472 <a href=
"https://github.com/hmage/megactl">more recent fork on
473 github
</a> from user hmage, but it is unclear to me if this is still
474 being maintained. It has not seen much improvements since
2016. A
475 <a href=
"https://github.com/namiltd/megactl">more up to date
476 edition
</a> is a git fork from the original github fork by user
477 namiltd, and this newer fork seem a lot more promising. The owner of
478 this github repository has replied to change proposals within hours,
479 and had already added some improvements and support for more hardware.
480 Sadly he is reluctant to commit to maintaining the tool and stated in
481 <a href=
"https://github.com/namiltd/megactl/pull/1">my first pull
482 request
</A> that he think a new release should be made based on the
483 git repository owned by hmage. I perfectly understand this
484 reluctance, as I feel the same about maintaining yet another package
485 in Debian when I barely have time to take care of the ones I already
486 maintain, but do not really have high hopes that hmage will have time
487 to spend on it and hope namiltd will change his mind.
</p>
489 <p>In any case, I created
490 <a href=
"https://salsa.debian.org/debian/megactl">a draft package
</a>
491 based on the namiltd edition and put it under the debian group on
492 salsa.debian.org. If you own a Dell PowerEdge server with one of the
493 PERC controllers, or any other RAID controller using the megaraid or
494 megaraid_sas Linux kernel modules, you might want to check it out. If
495 enough people are interested, perhaps the package will make it into
496 the Debian archive.
</p>
498 <p>There are two tools provided, megactl for the megaraid Linux kernel
499 module, and megasasctl for the megaraid_sas Linux kernel module. The
500 simple output from the command on one of my machines look like this
501 (yes, I know some of the disks have problems. :).
</p>
505 a0 PERC H730 Mini encl:
1 ldrv:
2 batt:good
506 a0d0
558GiB RAID
1 1x2 optimal
507 a0d1
3067GiB RAID
0 1x11 optimal
508 a0e32s0
558GiB a0d0 online errs: media:
0 other:
19
509 a0e32s1
279GiB a0d1 online
510 a0e32s2
279GiB a0d1 online
511 a0e32s3
279GiB a0d1 online
512 a0e32s4
279GiB a0d1 online
513 a0e32s5
279GiB a0d1 online
514 a0e32s6
279GiB a0d1 online
515 a0e32s8
558GiB a0d0 online errs: media:
0 other:
17
516 a0e32s9
279GiB a0d1 online
517 a0e32s10
279GiB a0d1 online
518 a0e32s11
279GiB a0d1 online
519 a0e32s12
279GiB a0d1 online
520 a0e32s13
279GiB a0d1 online
525 <p>In addition to displaying a simple status report, it can also test
526 individual drives and print the various event logs. Perhaps you too
529 <p>In the packaging process I provided some patches upstream to
530 improve installation and ensure
531 <ahref=
"https://github.com/namiltd/megactl/pull/2">a Appstream
532 metainfo file is provided
</a> to list all supported HW, to allow
533 <a href=
"https://tracker.debian.org/isenkram">isenkram
</a> to propose
534 the package on all servers with a relevant PCI card.
</p>
536 <p>As usual, if you use Bitcoin and want to show your support of my
537 activities, please send Bitcoin donations to my address
538 <b><a href=
"bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a></b>.
</p>
544 Tags:
<a href=
"https://people.skolelinux.org/pere/blog/tags/english">english
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/isenkram">isenkram
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/raid">raid
</a>.
549 <div class=
"padding"></div>
552 <div class=
"title"><a href=
"https://people.skolelinux.org/pere/blog/Frokostseminar_om_Noark_5_i_Oslo_tirsdag_2024_03_12.html">Frokostseminar om Noark
5 i Oslo tirsdag
2024-
03-
12</a></div>
553 <div class=
"date">27th February
2024</div>
554 <div class=
"body"><p>Nikita-prosjektet, der jeg er involvert, inviterer i samarbeid med
555 Oslo Byarkiv, forskningsgruppen METAINFO og foreningen NUUG, til et
556 frokostseminar om Noark
5 og Noark
5 Tjenestegrensesnitt tirsdag
557 2024-
03-
12. Seminaret finner sted ved Oslo byarkiv. Vi håper å få
558 til videostrømming via Internett av presentasjoner og paneldiskusjon.
559 Oppdatert program og lenker til påmeldingsskjema er
560 <a href=
"https://noark.codeberg.page/noark5-seminars/2023-03-12-noark-workshop.html">tilgjengelig
561 fra Nikita-prosjektet
</a>. Arrangementet er gratis.
563 <p>Som vanlig, hvis du bruker Bitcoin og ønsker å vise din støtte til
564 det jeg driver med, setter jeg pris på om du sender Bitcoin-donasjoner
566 <b><a href=
"bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a></b>. Merk,
567 betaling med bitcoin er ikke anonymt. :)
</p>
572 Tags:
<a href=
"https://people.skolelinux.org/pere/blog/tags/noark5">noark5
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/norsk">norsk
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/nuug">nuug
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/offentlig innsyn">offentlig innsyn
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/standard">standard
</a>.
577 <div class=
"padding"></div>
580 <div class=
"title"><a href=
"https://people.skolelinux.org/pere/blog/Welcome_out_of_prison__Mickey__hope_you_find_some_freedom_.html">Welcome out of prison, Mickey, hope you find some freedom!
</a></div>
581 <div class=
"date"> 1st January
2024</div>
582 <div class=
"body"><p align=
"center"><img src=
"https://people.skolelinux.org/pere/blog/images/2024-01-01-mikke-verk-i-det-fri.jpeg"/></p>
584 <p>Today, the animation figure Mickey Mouse finally was released from
585 the corporate copyright prison, as the
1928 movie
586 <a href=
"https://en.wikipedia.org/wiki/Steamboat_Willie">Steamboat
587 Willie
</a> entered the public domain in USA. This movie was the first
588 public appearance of Mickey Mouse. Sadly the figure is still on
589 probation, thanks to trademark laws and a the Disney corporations
590 powerful pack of lawyers, as described in the
2017 article
591 in
<a href=
"https://priceonomics.com/how-mickey-mouse-evades-the-public-domain/">"How
592 Mickey Mouse Evades the Public Domain"</a> from Priceonomics. On the
593 positive side, the primary driver for repeated extentions of the
594 duration of copyright has been Disney thanks to Mickey Mouse and the
595 2028 movie, and as it now in the public domain I hope it will cause
596 less urge to extend the already unreasonable long copyright
599 <p>The first book I published, the
2004 book
<a
600 href=
"https://free-culture.cc/">"Free Culture" by Lawrence Lessig
</a>,
602 <a href=
"https://people.skolelinux.org/pere/publisher/#frikultur">English,
603 French and Norwegian Bokmål
</a>, touch on the story of Disney pushed
604 for extending the copyright duration in USA. It is a great book
605 explaining problems with the current copyright regime and why we need
606 Creative Commons movement, and I strongly recommend everyone to read
610 <a href=
"https://www.imdb.com/title/tt0019422/">IMDB ID tt0019422
</a>)
611 is now available from the Internet Archive. Two copies have been
612 uploaded so far, one uploaded
613 <a href=
"https://archive.org/details/SteamboatWillie">2015-
11-
04</a>
614 (
<a href=
"https://archive.org/download/SteamboatWillie/SteamboatWillie_archive.torrent">torrent
</a>)
616 <a href=
"https://archive.org/details/steamboat-willie-mickey">2023-
01-
01</a>
617 (
<a href=
"https://archive.org/download/steamboat-willie-mickey/steamboat-willie-mickey_archive.torrent">torrent
</a>) - see
618 <a href=
"https://people.skolelinux.org/pere/blog/VLC_bittorrent_plugin_still_going_strong__new_upload_2_14_4.html">VLC
619 bittorrent plugin
</a> for streaming the video using the torrent link.
620 I am very happy to see
621 <a href=
"https://people.skolelinux.org/pere/blog/Legal_to_share_more_than_16_000_movies_listed_on_IMDB_.html">the
622 number of public domain movies
</a> increasing. I look forward to
623 when those are the majority. Perhaps it will reduce the urge of the
624 copyright industry to control its customers.
</p>
627 <a href=
"https://publicdomainreview.org/features/entering-the-public-domain/2024/">comprehensive
628 list of works entering the public domain in
2024</a> is available from
629 the Public Domain Review.
</p>
631 <p>As usual, if you use Bitcoin and want to show your support of my
632 activities, please send Bitcoin donations to my address
633 <b><a href=
"bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a></b>.
</p>
638 Tags:
<a href=
"https://people.skolelinux.org/pere/blog/tags/english">english
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/opphavsrett">opphavsrett
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/verkidetfri">verkidetfri
</a>.
643 <div class=
"padding"></div>
646 <div class=
"title"><a href=
"https://people.skolelinux.org/pere/blog/VLC_bittorrent_plugin_still_going_strong__new_upload_2_14_4.html">VLC bittorrent plugin still going strong, new upload
2.14-
4</a></div>
647 <div class=
"date">31st December
2023</div>
648 <div class=
"body"><p>The other day I uploaded a new version of
649 <a href=
"https://tracker.debian.org/pkg/vlc-plugin-bittorrent">the VLC
650 bittorrent plugin
</a> to Debian, version
2.14-
4, to fix a few
651 packaging issues. This plugin extend VLC allowing it to stream videos
652 directly from a bittorrent source using both torrent files and magnet
653 links, as easy as using a HTTP or local file source. I believe such
654 protocol support is a vital feature in VLC, allowing efficient
655 streaming from sources such at the
11 million movies in
656 <a href=
"https://archive.org/">the Internet Archive
</a>. Bittorrent is
657 one of the most efficient content distribution protocols on the
658 Internet, without centralised control, and should be used more.
</p>
660 <p>The new version is now both in Debian Unstable and Testing, as well
661 as Ubuntu. While looking after the package, I decided to ask the VLC
662 upstream community if there was any hope to get Bittorrent support
663 into the official VLC program, and was very happy to learn that
664 someone is already working on it. I hope we can see some fruits of
665 that labour next year, but do not hold my breath. In the mean time we
666 can use the plugin, which is already
667 <a href=
"https://qa.debian.org/popcon.php?package=vlc-plugin-bittorrent">installed
668 by
0.23 percent of the Debian population
</a> according to
669 popularity-contest. It could use a new upstream release, and I hope
670 the upstream developer soon find time to polish it even more.
</p>
672 <p>It is worth noting that the plugin store the downloaded files in
673 <tt>~/Downloads/vlc-bittorrent/
</tt>, which can quickly fill up the
674 user home directory during use. Users of the plugin should keep an
675 eye with disk usage when streaming a bittorrent source.
</p>
677 <p>As usual, if you use Bitcoin and want to show your support of my
678 activities, please send Bitcoin donations to my address
679 <b><a href=
"bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a></b>.
</p>
684 Tags:
<a href=
"https://people.skolelinux.org/pere/blog/tags/english">english
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/verkidetfri">verkidetfri
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/video">video
</a>.
689 <div class=
"padding"></div>
692 <div class=
"title"><a href=
"https://people.skolelinux.org/pere/blog/_N_r__p___blir__p_____Et_reservoar_av_tegn_sett_fra_depotet__i_tidsskriftet_Aksess.html">«Når «på» blir «pÃ¥»: Et reservoar av tegn sett fra depotet» i tidsskriftet Aksess
</a></div>
693 <div class=
"date">15th November
2023</div>
694 <div class=
"body"><p>For noen uker siden skrev en kamerat og meg
695 <a href=
"https://www.aksess-tidsskrift.no/fordypning/175530">en
696 artikkel om tegnsett
</a> i
697 <a href=
"https://www.aksess-tidsskrift.no/">arkivtidsskriftet
698 Aksess
</a> både på web og i papirutgave nr.
3 2023. Her er det som
699 nettopp ble publisert.
</p>
703 <p><strong>Når «på» blir «pÃ¥»: Et reservoar av tegn sett fra
706 <p>av Thomas Sødring og Petter Reinholdtsen
</p>
708 <p>De færreste av oss tenker over hva som skjer dypere i datamaskinen
709 mens vi sitter der og skriver noe på tastaturet. Når du trykker på
710 tasten «Å», så vises bokstaven Å. Men noen ganger blir det
711 feil. Hvorfor det – og hva er viktig å være klar over i
714 <p>Dersom bokstaver tolkes forskjellig mellom systemer, blir det fort
715 rot, dette kalles mojibake blant kjennere, etter det japanske
716 uttrykket for tegnomforming. Det er en lang historie her som tidvis
717 har vært preget av rot. Noen husker kanskje tilbake til en tid der
718 bokstavene æ, ø og å ofte var ødelagt i e-poster – et klassisk
719 eksempel på tegnsettproblemstilling.
</p>
721 <p id=
"tegnsett_access_nå_og_før"><strong>«Nå» og «før»
</strong></p>
723 <p>Tid er et skjult problem for depot fordi vi danner dokumentasjon i
724 en kontekst som er preget av å være «nå». Vår forståelse av verden og
725 bruken av teknologi er utgangspunktet for denne konteksten. Tenk selv
726 hvordan verden har utviklet seg de siste
20 årene, hva samfunnet er
727 opptatt av, og hvordan vi bruker teknologi i hverdagen. Tid er et
728 skjult problem fordi når vi trekker dokumentasjon ut av systemer og
729 deponerer for langtidsbevaring, er konteksten til materialet «nå», men
730 verden går videre. Ettersom teknologien og måten vi bruker den på,
731 utvikler seg, blir «nå» til «før», og dokumentasjonen befinner seg
732 snart i en «før»-kontekst.
</p>
734 <p>Dette med «før» og «nå» i forhold til dokumentasjonens kontekst er
735 noe vi er veldig lite bevisste på, men det er en problemstilling
736 depotarkivene eier og forvalter. En av disse utfordringene er hvorfor
737 «Ø» ikke nødvendigvis er det samme som «Ø», og hvorfor det i det hele
738 tatt gir mening å si noe sånt. Vi snakker her om noe som heter
739 tegnsett, som er en avtalt måte å representere bokstaver, tall og
740 andre symboler på slik at vi på en feilfri måte kan utveksle tekst
741 mellom datasystemer.
</p>
743 <p>Tegnsettproblemstillingen er satt sammen av fire fasetter;
744 repertoar, representasjon, koding og uttegning.
</p>
746 <p id=
"tegnsett_access_repertoarer"><strong>Repertoarer
</strong></p>
748 <p>Repertoar er en samling med tegn og symboler som kan
749 representeres. Tenk norsk alfabet eller japanske piktogrammer, men
750 også matematiske og elektroniske symboler. Bokstaven «stor a» kan være
751 en oppføring i et slikt repertoar. For å kunne brukes i en datamaskin
752 trenger hver oppføring i et slikt repertoar en representasjon, hvilket
753 i datamaskinsammenheng betyr at det tilordnes et tall. Tallet kan
754 lagres på ulike vis i en eller flere kodingsformater. For eksempel kan
755 en skrive tallet ti som både
10, X og A, i henholdsvis
756 titallssystemet, romertallssystemet og sekstentallssystemet.
</p>
758 <p>Hvis en skal kunne lese inn filer og vite hvilket tall og hvilken
759 representasjon og instans i et repertoar det er snakk om, så må en
760 vite hvordan tallet er kodet. Sist, men ikke minst, for å kunne bruke
761 symbolet til noe må det kunne være kjent hvordan det skal se ut eller
762 tegnes på ark. Det finnes utallige skrifttyper med norske bokstaver,
763 alle litt forskjellige, og skal en kunne tegne en stor A på skjermen,
764 så må datamaskinen vite hva den skal tegne. Skrifttyper inneholder
765 informasjon om hvordan ulike tall skal tegnes. De inneholder ikke
766 alltid alle symbolene som er brukt i en tekst, hvilket gjør at ikke
767 alle forståtte tegn vil kunne vises på skjerm eller ark.
</p>
769 <p>Hver av disse fasettene må være avklart for å kunne ta vare på og vise
770 frem tekst med en datamaskin. Kombinasjon av repertoar, representasjon
771 og koding er det en kaller et tegnsett. Kombinasjonen av
772 representasjon og uttegning kalles en skrifttype. De fleste
773 skrifttyper har også informasjon om repertoar, men det finnes
774 skrifttyper som kun kobler mellom tallkode og uttegning, uten å
775 fortelle noe om hvordan tallkodene egentlig skal tolkes.
</p>
777 <p id=
"tegnsett_access_fra_ascii_til_iso_8859"><strong>Fra ASCII til ISO-
8859</strong></p>
779 <p>Vi begynner historien med ASCII (American Standard Code for
780 Information Interchange) som har en historie som spores tilbake til
781 1963. Utgangspunktet til ASCII var at det kunne kode opp til
128
782 forskjellige symboler i vanlig bruk i USA. De visuelle symbolene i
783 ASCII er de små og store bokstavene (a til z og A til Z), tall (
0 til
784 9) og tegnsettingssymboler (for eksempel semikolon, komma og
785 punktum). ASCII har også noen usynlige symboler som ble brukt for
786 bl.a. kommunikasjon. Før ASCII var det for eksempel teleks-tegnsett
787 med plass til bare
32 tegn og EBCDIC med plass til
256 tegn, alle med
788 en helt annen rekkefølge på symbolene enn ASCII, men de har vært lite
789 brukt de siste femti årene. Et eksempel på noen utvalgte symboler i
790 repertoaret til ASCII vises i tabell
1.
</p>
792 <table align=
"center" width=
"50%">
794 <caption>Tabell
1. Eksempel på utvalgte symboler hentet fra
795 ASCII-tegnsettet. Kolonnen «Binær» viser symbolets verdi i
796 totallssystemet (
1 og
0 tall), mens kolonnen «Desimal» viser symbolets
797 verdi i titallssystemet.
</caption>
808 <td align=
"right">65</td>
813 <td align=
"right">77</td>
818 <td align=
"right">90</td>
823 <td align=
"right">97</td>
828 <td align=
"right">109</td>
833 <td align=
"right">122</td>
838 <td align=
"right">48</td>
843 <td align=
"right">58</td>
848 <td align=
"right">59</td>
853 <p>Det opprinnelige ASCII-tegnsettet ble også omtalt som ASCII-
7 og
854 brukte
7 bits (
0 og
1) for å representere symboler. Datamaskiner er
855 ofte konfigurert til å jobbe med enheter der bits er gruppert som
4
856 eller
8 bits . Det lå en mulighet i å ta i bruk bit åtte. En slik
857 endring ville gjøre det mulig for datamaskiner å øke antall symboler
858 de kunne representere, noe som ga en økning fra
128 forskjellige
859 symboler til
256 forskjellige symboler. Det ble åpnet for å innlemme
860 de nordiske bokstavene sammen med ASCII, og dette ble etter hvert
861 standardisert som ISO-
8859-
1. Tabell
2 viser deler av ISO-
8859-
1 som
862 støtter de norske bokstavene.
</p>
864 <p>Det sier seg selv at muligheten til å representere inntil
256 symboler
865 ikke holder når vi snakker om en global verden, og det ble gjort et
866 standardiseringsløp som tok utgangspunkt i ASCII-
7 med en utvidelse
867 til å bruke den åttende biten for ulike språkgrupper. Denne standarden
868 heter ISO-
8859 og er inndelt i opptil
16 varianter, altså fra
869 ISO-
8859-
1 til ISO-
8859-
16.
</p>
871 <table align=
"center" width=
"50%">
873 <caption>Tabell
2. Koding av de norske symbolene slik de er definert i
874 ISO-
8859-
1 tegnsettet.
</caption>
885 <td align=
"right">198</td>
890 <td align=
"right">216</td>
895 <td align=
"right">197</td>
900 <td align=
"right">230</td>
905 <td align=
"right">248</td>
910 <td align=
"right">229</td>
915 <p>Norske tegn er definert i ISO-
8859-
1, som også omtales som Latin
1, de
916 fleste samiske tegn er definert i ISO-
8859-
4 (Latin
4) mens tilgang
917 til €-symbolet kom med ISO-
8859-
15 (Latin
9). ISO-
8859-
15 er en
918 revisjon av ISO-
8859-
1 som fjerner noen lite brukte symboler og
919 erstatter bokstaver som er mer brukt, og introduserer €-symbolet. Det
920 er viktig å merke at alle ISO-
8859-variantene har overlapp med
921 ASCII-
7, noe som ga samvirke med de engelskspråklige landene som ikke
922 trengte å gjøre noe. Det innebærer også at de første
128 verdiene i
923 ISO-
8859-variantene representerer de samme symbolene. Det er først når
924 du kommer til tolkningen av de resterende
128 verdiene med nummer
128
925 til
255, at det oppsto tolkningsutfordringer mellom
926 ISO-
8859-variantene.
</p>
928 <p>ISO-
8859-verdenen fungerte godt så lenge tegnsettet som ble brukt når
929 innhold ble skapt, også ble brukt når innhold ble gjengitt og du ikke
930 trengte å kombinere innhold fra forskjellige tegnsett i samme
931 dokument. Utfordringen med bruken av ISO-
8859-variantene ble raskt
932 tydelig i en mer globalisert verden med utveksling av tekst på tvers
933 av landegrenser der tekstlig innhold i dokumenter, e-poster og
934 websider kunne bli skrevet med ett tegnsett og gjengitt med et annet
937 <table align=
"center" width=
"60%">
939 <caption>Tabell
3. Viser tolkning av verdiene som er tilegnet de
940 norske symbolene i ISO-
8859-
1 i de andre ISO
8859-variatene. Merk
941 ISO-
8859-
12 ikke finnes da arbeidet ble avsluttet.
<sup>[
<a id=
"tegnsett_access_footnoteref_1" href=
"#tegnsett_access_footnotedef_1" title=
"View footnote.">1</a>]
</sup></caption>
1073 <p>Denne problemstillingen er illustrert i tabell
3, der vi ser verdiene
1074 tilegnet de norske symbolene i ISO-
8859-
1 i kolonne «
1». I de øvrige
1075 kolonnene ser vi hvilket symbol verdien får i de andre
1076 ISO-
8859-variantene. Tar vi utgangspunkt i tabell
3, kan vi se at
1077 ordet lærlingspørsmål gjengitt med ISO-
8859-
2 (kolonne
2) blir
1078 lćrlingspřrsmĺl, mens det blir lζrlingspψrsmεl med ISO-
8859-
7
1079 (kolonne
7). Med ISO-
8859-
2 blir «æ» til «ć», «ø» til «ř» og «å» til
1080 «ĺ». I ISO-
8859-
7 blir «æ» til «ζ», «ø» til «ψ», mens «å» blir «ε».
</p>
1082 <p>Det er egentlig ingen utfordring med dette så lenge du vet hvilket
1083 tegnsett innholdet ditt er representert med, og det ikke har skjedd
1084 omforminger som du ikke er klar over. Det er det siste som er
1085 problematisk, spesielt de datasystemene som har vært i bruk de siste
1086 20 årene, som ikke har noe innebygd funksjonalitet for å forvalte
1087 tegnsettproblematikken. Et godt eksempel på dette er
1088 Microsoft-tegnsettet Windows-
1252, som ble forvekslet som
100 %
1089 kompatibel med ISO-
8859-
1, men hadde byttet ut plassene fra
127 til
1090 159. Historisk vil det finnes en del variasjon i hvilket tegnsett som
1091 har vært i bruk, og hvor vellykket konvertering mellom tegnsett har
1094 <p id=
"tegnsett_access_unicode_som_løsning"><strong>Unicode som løsning
</strong></p>
1096 <p>Tegnsettforvirring ble etter hvert et irritasjonsmoment og
1097 samvirkeproblem. Ofte fikk man en e-post der æøå var erstattet av rare
1098 symboler fordi e-posten hadde vært innom et eller annet datasystem som
1099 ikke brukte samme tegnsett.
</p>
1101 <p>For å løse dette samvirkeproblemet for tegnsett ble det startet et
1102 arbeid og en ny standard så dagens lys etter hvert. Denne standarden
1103 fikk navnet Unicode (ISO/ IEC
10646) og skulle resultere i et tegnsett
1104 som alle skulle være enige om. Unicode er et repertoar og en
1105 representasjon, dvs. navngivning og tilordning av tallverdi til alle
1106 symboler i bruk i verden i dag. Oppføringer i Unicode skrives gjerne
1107 U+XXXX der XXXX er tallkoden i sekstentallssystemet som oppføringen
1108 har i Unicode-katalogen. Her finner vi tegn brukt av både levende og
1109 døde språk, konstruerte språk, tekniske symboler, morsomme tegninger
1110 (såkalte emojier) og tegn ingen vet hva betyr eller skal brukes
1111 til. Et morsomt eksempel er i nettartikkelen: U+
237C ⍼ RIGHT ANGLE
1112 WITH DOWNWARDS ZIGZAG ARROW, av Jonathan Chan.
<sup>[
<a id=
"tegnsett_access_footnoteref_2" href=
"#tegnsett_access_footnotedef_2" title=
"View footnote.">2</a>]
</sup></p>
1114 <p>Sammen med Unicode kom det tre måter å kode disse tallene på; UTF-
8,
1115 UTF-
16 og UTF-
32. Av datatekniske årsaker er UTF-
8 mye brukt, spesielt
1116 når det gjelder utveksling av tekst over Internett, mens UTF-
16 er
1117 brukt en del til tekstfiler lagret på Windows. En utfordring med
1118 Unicode og UTF-variantene er at disse gir flere måter å kode samme
1119 symbol på med en kombinasjonsmekanisme. Dette kan gi utfordringer ved
1120 søk, hvis en skal søke etter et ord som har ett eller flere symboler
1121 som kan skrives på ulikt vis, så er det ikke sikkert at søkesystemet
1122 vil finne alle forekomster. For eksempel kan bokstaven U+
00F8 «Latin
1123 Small Letter O with Stroke» kodes som den tradisjonelle norske tegnet
1124 ø, men også som o kombinert med skråstrek U+
0338. Begge deler er
1125 gyldig bruk av Unicode, selv om det er tradisjon for å foretrekke å
1126 «normalisere» kombinasjoner som enkelttegn der det er mulig, nettopp
1127 for å forenkle søk.
</p>
1129 <p id=
"tegnsett_access_bare_unicode_fremover"><strong>Bare Unicode fremover
</strong></p>
1131 <p>Forvaltningens bruk av tegnsett er regulert i Forskrift om
1132 IT-standarder i offentlig forvaltning
<sup>[
<a id=
"tegnsett_access_footnoteref_3" href=
"#tegnsett_access_footnotedef_3" title=
"View footnote.">3</a>]
</sup>. Her står det: «Ved all
1133 utveksling av informasjon mellom forvaltningsorganer og fra
1134 forvaltningsorgan til innbyggere og næringsliv skal tegnsettstandarden
1135 ISO/IEC
10646 representert ved UTF8 benyttes.» Det er forskjellige
1136 bruksområder til UTF-
8, UTF-
16 og UTF-
32, men UTF-
8 er kodingen vi
1137 kjenner mest til. Det er flere grunner at UTF-
8 «vant» konkurransen
1138 til å bli den utvalgte. Den kanskje viktigste er at UTF-
8 er fullt
1139 samvirkende med ASCII-
7, slik at den engelskspråklige delen av verden
1140 kunne rulle ut UTF-
8 uten å merke noe forskjell. En tekstfil med kun
1141 ASCII-tekst vil være identisk på disken hvis den lagres som UTF-
8 og
1142 ASCII. UTF-
16 og UTF-
32 byr på noen optimaliseringer som gjør dem
1143 relevant for spesifikke problemområder, men for det meste vil vi aldri
1144 oppleve disse standardene på nært hold i hverdagen. Det er uansett kun
1145 bruken av UTF-
8 som er lovregulert i Norge.
</p>
1147 <p>Det er ikke slik at hele verden bruker ISO/IEC
10646 og UTF-
8. Kina
1148 har egne standarder for tegnsett, mye brukt er GB
18030, som er
1149 Unicode med en annen koding enn UTF-
8, mens Taiwan og andre asiatiske
1150 land gjerne bruker Big5 eller andre tegnsett.
</p>
1152 <p>UTF-
8 er dominerende i Norge, men det er tidsperioder der forskjellige
1153 datasystemer utvekslet data i henhold til ISO-
8859-
1, ISO-
8859-
15,
1154 Windows-
1252, Codepage
865 og ISO-
646-
60 / Codepage
1016 mens
1155 overgangen til UTF-
8 pågikk. Det er ikke slik at et datasystem enkelt
1156 kan tvinges til å bruke et tegnsett, da det er flere lag i et
1157 datasystem som må settes opp til å bruke riktig tegnsett, og
1158 tegnsettproblemet fort oppstår når det er et eller annet i
1159 datasystemet som bruker feil tegnsett.
</p>
1161 <p>Et klassisk eksempel på problemet er en utveksling av tekst mellom to
1162 systemer der teksten i utgangspunktet er kodet i UTF-
8, men går
1163 gjennom noe som er ISO-
8859-
1 underveis. Dette kan vises med at ordet
1164 «på» i et slik scenario ender opp som «pÃ¥». Det er mulig å spore
1165 dette tilbake til verdiene symbolene er tilordnet i tegnsettene. «på»
1166 blir til «pÃ¥» fordi «å» i UTF-
8 er representert med U+C3AF, og dersom
1167 vi ser på hva disse verdiene representerer, ser vi at
1168 sekstentallssystemverdien C3 er
1100 0011 i totallssystemet og
1169 symbolet med dette tallet i ISO-
8859-
1 er Ã.
</p>
1171 <p>Vi ser det samme med sekstentallssystemverdien A5, som er
1010 0101 i
1172 totallssystemet, og tilsvarende symbol i ISO-
8859-
1 er ¥. Slik
1173 mojibake kan lett skje hvis «på» i utgangspunktet var representert med
1174 UTF-
8, men ble behandlet med et system som bruker ISO-
8859-
1. Det er
1175 ingen automatikk i å fange opp slike ødeleggelser mens tekstlig
1176 innhold utveksles mellom datasystemer.
</p>
1178 <p>En utfordring for depotarkivene er at bruken av tegnsett ikke alltid
1179 har vært regulert, og at det kan finnes flere dokumentasjonssamlinger
1180 som er opprettet med varierende tegnsett før gjeldende forskrift
1181 inntraff – uten at det er mulig å avlede fra filene hvilket tegnsett
1182 som ble brukt. Et eksempel på dette er €-symbolet, som kom først etter
1183 at ISO-
8859-
1 var tatt i bruk. Det kan bli en utfordring for et
1184 depotarkiv, men så lenge det er kjent hvilket tegnsett var i bruk, så
1185 bør det gå bra. Riksarkivarens
1186 forskrift
<sup>[
<a id=
"tegnsett_access_footnoteref_4" href=
"#tegnsett_access_footnotedef_4" title=
"View footnote.">4</a>]
</sup>
1187 formaliserer dette ved å kreve følgende:
</p>
1190 <p>§
5-
11. Tegnsett i arkivuttrekk
</p>
1193 <li>Arkivuttrekk og medfølgende struktur- og innholdsbeskrivelser skal
1194 overføres som ren tekst i ukryptert form, og benytte godkjent
1197 <li>Godkjente tegnsett er:
1199 <li>Unicode UTF-
8<br>
1200 (ISO/IEC
10646-
1:
2000 Annex D)
</li>
1201 <li>ISO
8859-
1:
1998, Latin
1</li>
1202 <li>ISO
8859-
4:
1998, Latin
4 for samiske tegn.
</li>
1205 <li>Andre tegnsett aksepteres bare etter avtale med Arkivverket.
</li>
1209 <p id=
"tegnsett_access_ditt_ansvar"><strong>Ditt ansvar
</strong></p>
1211 <p>På mange måter burde ikke tegnsett være et problem i
2023, men sånn er
1212 det nok ikke. Land som har oppgradert til UTF-
8 som primærtegnsett for
1213 utveksling av tekstlig innhold, begrenser problematikken betraktelig,
1214 men globalt sett så er tegnsettutfordringen ikke løst fordi ikke alle
1215 er enige om å bruke samme tegnsett. Det kan være geopolitiske eller
1216 kulturelle hensyn som ligger til grunn for dette.
</p>
1218 <p>Det er uansett verdt å merke at selv om bruken av UTF-
8 skulle bli
1219 100% utbredt, så er det et historisk perspektiv (ASCII-
7,
1220 ISO-
8859-variantene, UTF-
8) her som gjør tegnsett til et problemområde
1221 arkivarene må forstå og håndtere. Som danningsarkivar har du et
1222 ansvar for å vite hvilket tegnsett systemene og databasene dere
1223 forvalter, er i samsvar med. Det er noe IT-avdelingen din eller
1224 programvareleverandørene enkelt skal kunne svare på, og svaret skal
1225 være UTF-
8 for alle nye systemer.
</p>
1229 <p id=
"tegnsett_access_footnotedef_1"><a href=
"#tegnsett_access_footnoteref_1">1</a>. Tegnsettkilde
<a href=
"https://en.wikipedia.org/wiki/ISO/IEC_8859">https://en.wikipedia.org/wiki/ISO/IEC_8859
</a></p>
1231 <p id=
"tegnsett_access_footnotedef_2"><a href=
"#tegnsett_access_footnoteref_2">2</a>.
<a href=
"https://ionathan.ch/2022/04/09/angzarr.html">https://ionathan.ch/
2022/
04/
09/angzarr.html
</a></p>
1233 <p id=
"tegnsett_access_footnotedef_3"><a href=
"#tegnsett_access_footnoteref_3">3</a>.
<a href=
"https://lovdata.no/dokument/SF/forskrift/2013-04-05-959/%C2%A78#%C2%A78">https://lovdata.no/dokument/SF/forskrift/
2013-
04-
05-
959/%C2%A78#%C2%A78
</a></p>
1235 <p id=
"tegnsett_access_footnotedef_4"><a href=
"#tegnsett_access_footnoteref_4">4</a>.
<a href=
"https://lovdata.no/forskrift/2017-12-19-2286/§5-11">https://lovdata.no/forskrift/
2017-
12-
19-
2286/§
5-
11</a></p>
1239 <p>For øvrig burde varsleren Edward Snowden få politisk asyl i Norge.
</p>
1241 <p>Som vanlig, hvis du bruker Bitcoin og ønsker å vise din støtte til
1242 det jeg driver med, setter jeg pris på om du sender Bitcoin-donasjoner
1244 <b><a href=
"bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a></b>. Merk,
1245 betaling med bitcoin er ikke anonymt. :)
</p>
1250 Tags:
<a href=
"https://people.skolelinux.org/pere/blog/tags/noark5">noark5
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/norsk">norsk
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/standard">standard
</a>.
1255 <div class=
"padding"></div>
1258 <div class=
"title"><a href=
"https://people.skolelinux.org/pere/blog/New_and_improved_sqlcipher_in_Debian_for_accessing_Signal_database.html">New and improved sqlcipher in Debian for accessing Signal database
</a></div>
1259 <div class=
"date">12th November
2023</div>
1260 <div class=
"body"><p>For a while now I wanted to have direct access to the
1261 <a href=
"https://signal.org/">Signal
</a> database of messages and
1262 channels of my Desktop edition of Signal. I prefer the enforced end
1263 to end encryption of Signal these days for my communication with
1264 friends and family, to increase the level of safety and privacy as
1265 well as raising the cost of the mass surveillance government and
1266 non-government entities practice these days. In August I came across
1268 <a href=
"https://www.yoranbrondsema.com/post/the-guide-to-extracting-statistics-from-your-signal-conversations/">recipe
1269 on how to use sqlcipher to extract statistics from the Signal
1270 database
</a> explaining how to do this. Unfortunately this did not
1271 work with the version of sqlcipher in Debian. The
1272 <a href=
"http://tracker.debian.org/sqlcipher/">sqlcipher
</a>
1273 package is a "fork" of the sqlite package with added support for
1274 encrypted databases. Sadly the current Debian maintainer
1275 <a href=
"https://bugs.debian.org/961598">announced more than three
1276 years ago that he did not have time to maintain sqlcipher
</a>, so it
1277 seemed unlikely to be upgraded by the maintainer. I was reluctant to
1278 take on the job myself, as I have very limited experience maintaining
1279 shared libraries in Debian. After waiting and hoping for a few
1280 months, I gave up the last week, and set out to update the package. In
1281 the process I orphaned it to make it more obvious for the next person
1282 looking at it that the package need proper maintenance.
</p>
1284 <p>The version in Debian was around five years old, and quite a lot of
1285 changes had taken place upstream into the Debian maintenance git
1286 repository. After spending a few days importing the new upstream
1287 versions, realising that upstream did not care much for SONAME
1288 versioning as I saw library symbols being both added and removed with
1289 minor version number changes to the project, I concluded that I had to
1290 do a SONAME bump of the library package to avoid surprising the
1291 reverse dependencies. I even added a simple
1292 autopkgtest script to ensure the package work as intended. Dug deep
1293 into the hole of learning shared library maintenance, I set out a few
1294 days ago to upload the new version to Debian experimental to see what
1295 the quality assurance framework in Debian had to say about the result.
1296 The feedback told me the pacakge was not too shabby, and yesterday I
1297 uploaded the latest version to Debian unstable. It should enter
1298 testing today or tomorrow, perhaps delayed by
1299 <a href=
"https://bugs.debian.org/1055812">a small library
1302 <p>Armed with a new version of sqlcipher, I can now have a look at the
1303 SQL database in ~/.config/Signal/sql/db.sqlite. First, one need to
1304 fetch the encryption key from the Signal configuration using this
1305 simple JSON extraction command:
</p>
1307 <pre>/usr/bin/jq -r '."key"' ~/.config/Signal/config.json
</pre>
1309 <p>Assuming the result from that command is 'secretkey', which is a
1310 hexadecimal number representing the key used to encrypt the database.
1311 Next, one can now connect to the database and inject the encryption
1312 key for access via SQL to fetch information from the database. Here
1313 is an example dumping the database structure:
</p>
1316 % sqlcipher ~/.config/Signal/sql/db.sqlite
1317 sqlite
> PRAGMA key = "x'secretkey'";
1319 CREATE TABLE sqlite_stat1(tbl,idx,stat);
1320 CREATE TABLE conversations(
1321 id STRING PRIMARY KEY ASC,
1329 , profileFamilyName TEXT, profileFullName TEXT, e164 TEXT, serviceId TEXT, groupId TEXT, profileLastFetchedAt INTEGER);
1330 CREATE TABLE identityKeys(
1331 id STRING PRIMARY KEY ASC,
1335 id STRING PRIMARY KEY ASC,
1338 CREATE TABLE sessions(
1339 id TEXT PRIMARY KEY,
1340 conversationId TEXT,
1342 , ourServiceId STRING, serviceId STRING);
1343 CREATE TABLE attachment_downloads(
1344 id STRING primary key,
1349 CREATE TABLE sticker_packs(
1350 id TEXT PRIMARY KEY,
1354 coverStickerId INTEGER,
1356 downloadAttempts INTEGER,
1357 installedAt INTEGER,
1360 stickerCount INTEGER,
1362 , attemptedStatus STRING, position INTEGER DEFAULT
0 NOT NULL, storageID STRING, storageVersion INTEGER, storageUnknownFields BLOB, storageNeedsSync
1363 INTEGER DEFAULT
0 NOT NULL);
1364 CREATE TABLE stickers(
1365 id INTEGER NOT NULL,
1366 packId TEXT NOT NULL,
1370 isCoverOnly INTEGER,
1375 PRIMARY KEY (id, packId),
1376 CONSTRAINT stickers_fk
1377 FOREIGN KEY (packId)
1378 REFERENCES sticker_packs(id)
1381 CREATE TABLE sticker_references(
1384 CONSTRAINT sticker_references_fk
1386 REFERENCES sticker_packs(id)
1389 CREATE TABLE emojis(
1390 shortName TEXT PRIMARY KEY,
1393 CREATE TABLE messages(
1394 rowid INTEGER PRIMARY KEY ASC,
1400 schemaVersion INTEGER,
1401 conversationId STRING,
1402 received_at INTEGER,
1404 hasAttachments INTEGER,
1405 hasFileAttachments INTEGER,
1406 hasVisualMediaAttachments INTEGER,
1407 expireTimer INTEGER,
1408 expirationStartTimestamp INTEGER,
1411 messageTimer INTEGER,
1412 messageTimerStart INTEGER,
1413 messageTimerExpiresAt INTEGER,
1416 sourceServiceId TEXT, serverGuid STRING NULL, sourceDevice INTEGER, storyId STRING, isStory INTEGER
1417 GENERATED ALWAYS AS (type IS 'story'), isChangeCreatedByUs INTEGER NOT NULL DEFAULT
0, isTimerChangeFromSync INTEGER
1418 GENERATED ALWAYS AS (
1419 json_extract(json, '$.expirationTimerUpdate.fromSync') IS
1
1420 ), seenStatus NUMBER default
0, storyDistributionListId STRING, expiresAt INT
1423 expirationStartTimestamp + (expireTimer *
1000),
1425 )), shouldAffectActivity INTEGER
1426 GENERATED ALWAYS AS (
1430 'change-number-notification',
1431 'contact-removed-notification',
1432 'conversation-merge',
1433 'group-v1-migration',
1435 'message-history-unsynced',
1438 'universal-timer-notification',
1441 ), shouldAffectPreview INTEGER
1442 GENERATED ALWAYS AS (
1446 'change-number-notification',
1447 'contact-removed-notification',
1448 'conversation-merge',
1449 'group-v1-migration',
1451 'message-history-unsynced',
1454 'universal-timer-notification',
1457 ), isUserInitiatedMessage INTEGER
1458 GENERATED ALWAYS AS (
1462 'change-number-notification',
1463 'contact-removed-notification',
1464 'conversation-merge',
1465 'group-v1-migration',
1468 'message-history-unsynced',
1471 'universal-timer-notification',
1474 ), mentionsMe INTEGER NOT NULL DEFAULT
0, isGroupLeaveEvent INTEGER
1475 GENERATED ALWAYS AS (
1476 type IS 'group-v2-change' AND
1477 json_array_length(json_extract(json, '$.groupV2Change.details')) IS
1 AND
1478 json_extract(json, '$.groupV2Change.details[
0].type') IS 'member-remove' AND
1479 json_extract(json, '$.groupV2Change.from') IS NOT NULL AND
1480 json_extract(json, '$.groupV2Change.from') IS json_extract(json, '$.groupV2Change.details[
0].aci')
1481 ), isGroupLeaveEventFromOther INTEGER
1482 GENERATED ALWAYS AS (
1483 isGroupLeaveEvent IS
1
1485 isChangeCreatedByUs IS
0
1487 GENERATED ALWAYS AS (
1488 json_extract(json, '$.callId')
1490 CREATE TABLE sqlite_stat4(tbl,idx,neq,nlt,ndlt,sample);
1492 id TEXT PRIMARY KEY,
1493 queueType TEXT STRING NOT NULL,
1494 timestamp INTEGER NOT NULL,
1497 CREATE TABLE reactions(
1498 conversationId STRING,
1501 messageReceivedAt INTEGER,
1502 targetAuthorAci STRING,
1503 targetTimestamp INTEGER,
1505 , messageId STRING);
1506 CREATE TABLE senderKeys(
1507 id TEXT PRIMARY KEY NOT NULL,
1508 senderId TEXT NOT NULL,
1509 distributionId TEXT NOT NULL,
1511 lastUpdatedDate NUMBER NOT NULL
1513 CREATE TABLE unprocessed(
1514 id STRING PRIMARY KEY ASC,
1521 serverTimestamp INTEGER,
1522 sourceServiceId STRING
1523 , serverGuid STRING NULL, sourceDevice INTEGER, receivedAtCounter INTEGER, urgent INTEGER, story INTEGER);
1524 CREATE TABLE sendLogPayloads(
1525 id INTEGER PRIMARY KEY ASC,
1527 timestamp INTEGER NOT NULL,
1528 contentHint INTEGER NOT NULL,
1530 , urgent INTEGER, hasPniSignatureMessage INTEGER DEFAULT
0 NOT NULL);
1531 CREATE TABLE sendLogRecipients(
1532 payloadId INTEGER NOT NULL,
1534 recipientServiceId STRING NOT NULL,
1535 deviceId INTEGER NOT NULL,
1537 PRIMARY KEY (payloadId, recipientServiceId, deviceId),
1539 CONSTRAINT sendLogRecipientsForeignKey
1540 FOREIGN KEY (payloadId)
1541 REFERENCES sendLogPayloads(id)
1544 CREATE TABLE sendLogMessageIds(
1545 payloadId INTEGER NOT NULL,
1547 messageId STRING NOT NULL,
1549 PRIMARY KEY (payloadId, messageId),
1551 CONSTRAINT sendLogMessageIdsForeignKey
1552 FOREIGN KEY (payloadId)
1553 REFERENCES sendLogPayloads(id)
1556 CREATE TABLE preKeys(
1557 id STRING PRIMARY KEY ASC,
1559 , ourServiceId NUMBER
1560 GENERATED ALWAYS AS (json_extract(json, '$.ourServiceId')));
1561 CREATE TABLE signedPreKeys(
1562 id STRING PRIMARY KEY ASC,
1564 , ourServiceId NUMBER
1565 GENERATED ALWAYS AS (json_extract(json, '$.ourServiceId')));
1566 CREATE TABLE badges(
1567 id TEXT PRIMARY KEY,
1568 category TEXT NOT NULL,
1570 descriptionTemplate TEXT NOT NULL
1572 CREATE TABLE badgeImageFiles(
1573 badgeId TEXT REFERENCES badges(id)
1576 'order' INTEGER NOT NULL,
1581 CREATE TABLE storyReads (
1582 authorId STRING NOT NULL,
1583 conversationId STRING NOT NULL,
1584 storyId STRING NOT NULL,
1585 storyReadDate NUMBER NOT NULL,
1587 PRIMARY KEY (authorId, storyId)
1589 CREATE TABLE storyDistributions(
1590 id STRING PRIMARY KEY NOT NULL,
1593 senderKeyInfoJson STRING
1594 , deletedAtTimestamp INTEGER, allowsReplies INTEGER, isBlockList INTEGER, storageID STRING, storageVersion INTEGER, storageUnknownFields BLOB, storageNeedsSync INTEGER);
1595 CREATE TABLE storyDistributionMembers(
1596 listId STRING NOT NULL REFERENCES storyDistributions(id)
1599 serviceId STRING NOT NULL,
1601 PRIMARY KEY (listId, serviceId)
1603 CREATE TABLE uninstalled_sticker_packs (
1604 id STRING NOT NULL PRIMARY KEY,
1605 uninstalledAt NUMBER NOT NULL,
1607 storageVersion NUMBER,
1608 storageUnknownFields BLOB,
1609 storageNeedsSync INTEGER NOT NULL
1611 CREATE TABLE groupCallRingCancellations(
1612 ringId INTEGER PRIMARY KEY,
1613 createdAt INTEGER NOT NULL
1615 CREATE TABLE IF NOT EXISTS 'messages_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
1616 CREATE TABLE IF NOT EXISTS 'messages_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
1617 CREATE TABLE IF NOT EXISTS 'messages_fts_content'(id INTEGER PRIMARY KEY, c0);
1618 CREATE TABLE IF NOT EXISTS 'messages_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
1619 CREATE TABLE IF NOT EXISTS 'messages_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
1620 CREATE TABLE edited_messages(
1621 messageId STRING REFERENCES messages(id)
1625 , conversationId STRING);
1626 CREATE TABLE mentions (
1627 messageId REFERENCES messages(id) ON DELETE CASCADE,
1632 CREATE TABLE kyberPreKeys(
1633 id STRING PRIMARY KEY NOT NULL,
1634 json TEXT NOT NULL, ourServiceId NUMBER
1635 GENERATED ALWAYS AS (json_extract(json, '$.ourServiceId')));
1636 CREATE TABLE callsHistory (
1637 callId TEXT PRIMARY KEY,
1638 peerId TEXT NOT NULL, -- conversation id (legacy) | uuid | groupId | roomId
1639 ringerId TEXT DEFAULT NULL, -- ringer uuid
1640 mode TEXT NOT NULL, -- enum "Direct" | "Group"
1641 type TEXT NOT NULL, -- enum "Audio" | "Video" | "Group"
1642 direction TEXT NOT NULL, -- enum "Incoming" | "Outgoing
1643 -- Direct: enum "Pending" | "Missed" | "Accepted" | "Deleted"
1644 -- Group: enum "GenericGroupCall" | "OutgoingRing" | "Ringing" | "Joined" | "Missed" | "Declined" | "Accepted" | "Deleted"
1645 status TEXT NOT NULL,
1646 timestamp INTEGER NOT NULL,
1647 UNIQUE (callId, peerId) ON CONFLICT FAIL
1649 [ dropped all indexes to save space in this blog post ]
1650 CREATE TRIGGER messages_on_view_once_update AFTER UPDATE ON messages
1652 new.body IS NOT NULL AND new.isViewOnce =
1
1654 DELETE FROM messages_fts WHERE rowid = old.rowid;
1656 CREATE TRIGGER messages_on_insert AFTER INSERT ON messages
1657 WHEN new.isViewOnce IS NOT
1 AND new.storyId IS NULL
1659 INSERT INTO messages_fts
1662 (new.rowid, new.body);
1664 CREATE TRIGGER messages_on_delete AFTER DELETE ON messages BEGIN
1665 DELETE FROM messages_fts WHERE rowid = old.rowid;
1666 DELETE FROM sendLogPayloads WHERE id IN (
1667 SELECT payloadId FROM sendLogMessageIds
1668 WHERE messageId = old.id
1670 DELETE FROM reactions WHERE rowid IN (
1671 SELECT rowid FROM reactions
1672 WHERE messageId = old.id
1674 DELETE FROM storyReads WHERE storyId = old.storyId;
1676 CREATE VIRTUAL TABLE messages_fts USING fts5(
1678 tokenize = 'signal_tokenizer'
1680 CREATE TRIGGER messages_on_update AFTER UPDATE ON messages
1682 (new.body IS NULL OR old.body IS NOT new.body) AND
1683 new.isViewOnce IS NOT
1 AND new.storyId IS NULL
1685 DELETE FROM messages_fts WHERE rowid = old.rowid;
1686 INSERT INTO messages_fts
1689 (new.rowid, new.body);
1691 CREATE TRIGGER messages_on_insert_insert_mentions AFTER INSERT ON messages
1693 INSERT INTO mentions (messageId, mentionAci, start, length)
1695 SELECT messages.id, bodyRanges.value -
>> 'mentionAci' as mentionAci,
1696 bodyRanges.value -
>> 'start' as start,
1697 bodyRanges.value -
>> 'length' as length
1698 FROM messages, json_each(messages.json -
>> 'bodyRanges') as bodyRanges
1699 WHERE bodyRanges.value -
>> 'mentionAci' IS NOT NULL
1701 AND messages.id = new.id;
1703 CREATE TRIGGER messages_on_update_update_mentions AFTER UPDATE ON messages
1705 DELETE FROM mentions WHERE messageId = new.id;
1706 INSERT INTO mentions (messageId, mentionAci, start, length)
1708 SELECT messages.id, bodyRanges.value -
>> 'mentionAci' as mentionAci,
1709 bodyRanges.value -
>> 'start' as start,
1710 bodyRanges.value -
>> 'length' as length
1711 FROM messages, json_each(messages.json -
>> 'bodyRanges') as bodyRanges
1712 WHERE bodyRanges.value -
>> 'mentionAci' IS NOT NULL
1714 AND messages.id = new.id;
1719 <p>Finally I have the tool needed to inspect and process Signal
1720 messages that I need, without using the vendor provided client. Now
1721 on to transforming it to a more useful format.
</p>
1723 <p>As usual, if you use Bitcoin and want to show your support of my
1724 activities, please send Bitcoin donations to my address
1725 <b><a href=
"bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a></b>.
</p>
1730 Tags:
<a href=
"https://people.skolelinux.org/pere/blog/tags/debian">debian
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/english">english
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/sikkerhet">sikkerhet
</a>,
<a href=
"https://people.skolelinux.org/pere/blog/tags/surveillance">surveillance
</a>.
1735 <div class=
"padding"></div>
1737 <p style=
"text-align: right;"><a href=
"index.rss"><img src=
"https://people.skolelinux.org/pere/blog/xml.gif" alt=
"RSS feed" width=
"36" height=
"14" /></a></p>
1748 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2024/01/">January (
1)
</a></li>
1750 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2024/02/">February (
1)
</a></li>
1752 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2024/03/">March (
2)
</a></li>
1754 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2024/04/">April (
3)
</a></li>
1761 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2023/01/">January (
3)
</a></li>
1763 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2023/02/">February (
1)
</a></li>
1765 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2023/04/">April (
2)
</a></li>
1767 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2023/05/">May (
3)
</a></li>
1769 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2023/06/">June (
1)
</a></li>
1771 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2023/08/">August (
1)
</a></li>
1773 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2023/09/">September (
1)
</a></li>
1775 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2023/10/">October (
1)
</a></li>
1777 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2023/11/">November (
4)
</a></li>
1779 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2023/12/">December (
1)
</a></li>
1786 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2022/02/">February (
1)
</a></li>
1788 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2022/03/">March (
3)
</a></li>
1790 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2022/04/">April (
2)
</a></li>
1792 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2022/06/">June (
2)
</a></li>
1794 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2022/07/">July (
1)
</a></li>
1796 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2022/09/">September (
1)
</a></li>
1798 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2022/10/">October (
1)
</a></li>
1800 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2022/12/">December (
1)
</a></li>
1807 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2021/01/">January (
2)
</a></li>
1809 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2021/02/">February (
1)
</a></li>
1811 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2021/05/">May (
1)
</a></li>
1813 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2021/06/">June (
1)
</a></li>
1815 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2021/07/">July (
3)
</a></li>
1817 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2021/08/">August (
1)
</a></li>
1819 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2021/09/">September (
1)
</a></li>
1821 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2021/10/">October (
1)
</a></li>
1823 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2021/12/">December (
1)
</a></li>
1830 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2020/02/">February (
2)
</a></li>
1832 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2020/03/">March (
2)
</a></li>
1834 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2020/04/">April (
2)
</a></li>
1836 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2020/05/">May (
3)
</a></li>
1838 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2020/06/">June (
2)
</a></li>
1840 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2020/07/">July (
1)
</a></li>
1842 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2020/09/">September (
1)
</a></li>
1844 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2020/10/">October (
1)
</a></li>
1846 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2020/11/">November (
1)
</a></li>
1853 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2019/01/">January (
4)
</a></li>
1855 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2019/02/">February (
3)
</a></li>
1857 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2019/03/">March (
3)
</a></li>
1859 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2019/05/">May (
2)
</a></li>
1861 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2019/06/">June (
5)
</a></li>
1863 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2019/07/">July (
2)
</a></li>
1865 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2019/08/">August (
1)
</a></li>
1867 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2019/09/">September (
1)
</a></li>
1869 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2019/11/">November (
1)
</a></li>
1871 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2019/12/">December (
4)
</a></li>
1878 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2018/01/">January (
1)
</a></li>
1880 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2018/02/">February (
5)
</a></li>
1882 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2018/03/">March (
5)
</a></li>
1884 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2018/04/">April (
3)
</a></li>
1886 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2018/06/">June (
2)
</a></li>
1888 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2018/07/">July (
5)
</a></li>
1890 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2018/08/">August (
3)
</a></li>
1892 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2018/09/">September (
3)
</a></li>
1894 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2018/10/">October (
5)
</a></li>
1896 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2018/11/">November (
2)
</a></li>
1898 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2018/12/">December (
4)
</a></li>
1905 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2017/01/">January (
4)
</a></li>
1907 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2017/02/">February (
3)
</a></li>
1909 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2017/03/">March (
5)
</a></li>
1911 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2017/04/">April (
2)
</a></li>
1913 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2017/06/">June (
5)
</a></li>
1915 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2017/07/">July (
1)
</a></li>
1917 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2017/08/">August (
1)
</a></li>
1919 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2017/09/">September (
3)
</a></li>
1921 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2017/10/">October (
5)
</a></li>
1923 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2017/11/">November (
3)
</a></li>
1925 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2017/12/">December (
4)
</a></li>
1932 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2016/01/">January (
3)
</a></li>
1934 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2016/02/">February (
2)
</a></li>
1936 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2016/03/">March (
3)
</a></li>
1938 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2016/04/">April (
8)
</a></li>
1940 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2016/05/">May (
8)
</a></li>
1942 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2016/06/">June (
2)
</a></li>
1944 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2016/07/">July (
2)
</a></li>
1946 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2016/08/">August (
5)
</a></li>
1948 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2016/09/">September (
2)
</a></li>
1950 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2016/10/">October (
3)
</a></li>
1952 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2016/11/">November (
8)
</a></li>
1954 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2016/12/">December (
5)
</a></li>
1961 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2015/01/">January (
7)
</a></li>
1963 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2015/02/">February (
6)
</a></li>
1965 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2015/03/">March (
1)
</a></li>
1967 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2015/04/">April (
4)
</a></li>
1969 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2015/05/">May (
3)
</a></li>
1971 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2015/06/">June (
4)
</a></li>
1973 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2015/07/">July (
6)
</a></li>
1975 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2015/08/">August (
2)
</a></li>
1977 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2015/09/">September (
2)
</a></li>
1979 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2015/10/">October (
9)
</a></li>
1981 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2015/11/">November (
6)
</a></li>
1983 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2015/12/">December (
3)
</a></li>
1990 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2014/01/">January (
2)
</a></li>
1992 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2014/02/">February (
3)
</a></li>
1994 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2014/03/">March (
8)
</a></li>
1996 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2014/04/">April (
7)
</a></li>
1998 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2014/05/">May (
1)
</a></li>
2000 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2014/06/">June (
2)
</a></li>
2002 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2014/07/">July (
2)
</a></li>
2004 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2014/08/">August (
2)
</a></li>
2006 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2014/09/">September (
5)
</a></li>
2008 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2014/10/">October (
6)
</a></li>
2010 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2014/11/">November (
3)
</a></li>
2012 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2014/12/">December (
5)
</a></li>
2019 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2013/01/">January (
11)
</a></li>
2021 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2013/02/">February (
9)
</a></li>
2023 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2013/03/">March (
9)
</a></li>
2025 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2013/04/">April (
6)
</a></li>
2027 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2013/05/">May (
9)
</a></li>
2029 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2013/06/">June (
10)
</a></li>
2031 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2013/07/">July (
7)
</a></li>
2033 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2013/08/">August (
3)
</a></li>
2035 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2013/09/">September (
5)
</a></li>
2037 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2013/10/">October (
7)
</a></li>
2039 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2013/11/">November (
9)
</a></li>
2041 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2013/12/">December (
3)
</a></li>
2048 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2012/01/">January (
7)
</a></li>
2050 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2012/02/">February (
10)
</a></li>
2052 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2012/03/">March (
17)
</a></li>
2054 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2012/04/">April (
12)
</a></li>
2056 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2012/05/">May (
12)
</a></li>
2058 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2012/06/">June (
20)
</a></li>
2060 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2012/07/">July (
17)
</a></li>
2062 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2012/08/">August (
6)
</a></li>
2064 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2012/09/">September (
9)
</a></li>
2066 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2012/10/">October (
17)
</a></li>
2068 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2012/11/">November (
10)
</a></li>
2070 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2012/12/">December (
7)
</a></li>
2077 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2011/01/">January (
16)
</a></li>
2079 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2011/02/">February (
6)
</a></li>
2081 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2011/03/">March (
6)
</a></li>
2083 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2011/04/">April (
7)
</a></li>
2085 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2011/05/">May (
3)
</a></li>
2087 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2011/06/">June (
2)
</a></li>
2089 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2011/07/">July (
7)
</a></li>
2091 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2011/08/">August (
6)
</a></li>
2093 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2011/09/">September (
4)
</a></li>
2095 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2011/10/">October (
2)
</a></li>
2097 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2011/11/">November (
3)
</a></li>
2099 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2011/12/">December (
1)
</a></li>
2106 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2010/01/">January (
2)
</a></li>
2108 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2010/02/">February (
1)
</a></li>
2110 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2010/03/">March (
3)
</a></li>
2112 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2010/04/">April (
3)
</a></li>
2114 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2010/05/">May (
9)
</a></li>
2116 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2010/06/">June (
14)
</a></li>
2118 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2010/07/">July (
12)
</a></li>
2120 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2010/08/">August (
13)
</a></li>
2122 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2010/09/">September (
7)
</a></li>
2124 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2010/10/">October (
9)
</a></li>
2126 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2010/11/">November (
13)
</a></li>
2128 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2010/12/">December (
12)
</a></li>
2135 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2009/01/">January (
8)
</a></li>
2137 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2009/02/">February (
8)
</a></li>
2139 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2009/03/">March (
12)
</a></li>
2141 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2009/04/">April (
10)
</a></li>
2143 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2009/05/">May (
9)
</a></li>
2145 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2009/06/">June (
3)
</a></li>
2147 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2009/07/">July (
4)
</a></li>
2149 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2009/08/">August (
3)
</a></li>
2151 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2009/09/">September (
1)
</a></li>
2153 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2009/10/">October (
2)
</a></li>
2155 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2009/11/">November (
3)
</a></li>
2157 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2009/12/">December (
3)
</a></li>
2164 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2008/11/">November (
5)
</a></li>
2166 <li><a href=
"https://people.skolelinux.org/pere/blog/archive/2008/12/">December (
7)
</a></li>
2177 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/3d-printer">3d-printer (
19)
</a></li>
2179 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/amiga">amiga (
1)
</a></li>
2181 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/aros">aros (
1)
</a></li>
2183 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/bankid">bankid (
4)
</a></li>
2185 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/betalkontant">betalkontant (
9)
</a></li>
2187 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/bitcoin">bitcoin (
13)
</a></li>
2189 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/bootsystem">bootsystem (
17)
</a></li>
2191 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/bsa">bsa (
2)
</a></li>
2193 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/chrpath">chrpath (
3)
</a></li>
2195 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/debian">debian (
199)
</a></li>
2197 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/debian edu">debian edu (
159)
</a></li>
2199 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/debian-handbook">debian-handbook (
9)
</a></li>
2201 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/digistan">digistan (
11)
</a></li>
2203 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/dld">dld (
18)
</a></li>
2205 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/docbook">docbook (
32)
</a></li>
2207 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/drivstoffpriser">drivstoffpriser (
4)
</a></li>
2209 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/english">english (
461)
</a></li>
2211 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/fiksgatami">fiksgatami (
23)
</a></li>
2213 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/fildeling">fildeling (
14)
</a></li>
2215 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/freeculture">freeculture (
34)
</a></li>
2217 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/freedombox">freedombox (
9)
</a></li>
2219 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/frikanalen">frikanalen (
20)
</a></li>
2221 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/h264">h264 (
20)
</a></li>
2223 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/intervju">intervju (
43)
</a></li>
2225 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/isenkram">isenkram (
18)
</a></li>
2227 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/kart">kart (
23)
</a></li>
2229 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/kodi">kodi (
6)
</a></li>
2231 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/ldap">ldap (
9)
</a></li>
2233 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/lego">lego (
5)
</a></li>
2235 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/lenker">lenker (
8)
</a></li>
2237 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/linuxcnc">linuxcnc (
5)
</a></li>
2239 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/lsdvd">lsdvd (
2)
</a></li>
2241 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/ltsp">ltsp (
1)
</a></li>
2243 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/madewithcc">madewithcc (
3)
</a></li>
2245 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/mesh network">mesh network (
8)
</a></li>
2247 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/multimedia">multimedia (
46)
</a></li>
2249 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/nice free software">nice free software (
15)
</a></li>
2251 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/noark5">noark5 (
25)
</a></li>
2253 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/norsk">norsk (
324)
</a></li>
2255 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/nuug">nuug (
199)
</a></li>
2257 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/offentlig innsyn">offentlig innsyn (
41)
</a></li>
2259 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/open311">open311 (
2)
</a></li>
2261 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/opensnitch">opensnitch (
4)
</a></li>
2263 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/opphavsrett">opphavsrett (
76)
</a></li>
2265 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/personvern">personvern (
114)
</a></li>
2267 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/raid">raid (
4)
</a></li>
2269 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/reactos">reactos (
1)
</a></li>
2271 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/reprap">reprap (
11)
</a></li>
2273 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/rfid">rfid (
3)
</a></li>
2275 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/robot">robot (
17)
</a></li>
2277 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/rss">rss (
1)
</a></li>
2279 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/ruter">ruter (
7)
</a></li>
2281 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/scraperwiki">scraperwiki (
2)
</a></li>
2283 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/sikkerhet">sikkerhet (
60)
</a></li>
2285 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/sitesummary">sitesummary (
4)
</a></li>
2287 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/skepsis">skepsis (
5)
</a></li>
2289 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/standard">standard (
76)
</a></li>
2291 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/stavekontroll">stavekontroll (
7)
</a></li>
2293 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/stortinget">stortinget (
14)
</a></li>
2295 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/surveillance">surveillance (
65)
</a></li>
2297 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/sysadmin">sysadmin (
5)
</a></li>
2299 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/usenix">usenix (
2)
</a></li>
2301 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/valg">valg (
9)
</a></li>
2303 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/verkidetfri">verkidetfri (
22)
</a></li>
2305 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/video">video (
80)
</a></li>
2307 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/vitenskap">vitenskap (
4)
</a></li>
2309 <li><a href=
"https://people.skolelinux.org/pere/blog/tags/web">web (
42)
</a></li>
2315 <p style=
"text-align: right">
2316 Created by
<a href=
"http://steve.org.uk/Software/chronicle">Chronicle v4.6
</a>