]> pere.pagekite.me Git - homepage.git/blob - blog/index.html
Updated migration script.
[homepage.git] / blog / index.html
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">
4 <head>
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" />
10 </head>
11 <body>
12 <div class="title">
13 <h1>
14 <a href="https://people.skolelinux.org/pere/blog/">Petter Reinholdtsen</a>
15
16 </h1>
17
18 </div>
19
20
21
22 <div class="entry">
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.
33
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:
36
37 <blockquote><pre>
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;"
44 </pre></blockquote>
45
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>
51
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>
55
56 <blockquote><pre>
57 #!/bin/sh
58 #
59 # See also https://bugs.debian.org/804722#31
60
61 set -e
62
63 # Move to this Standards-Version.
64 SV_LATEST=4.7.0
65
66 PKG="$1"
67
68 if [ -z "$PKG" ]; then
69 echo "usage: $0 <pkgname>"
70 exit 1
71 fi
72
73 if [ -e "${PKG}-salsa" ]; then
74 echo "error: ${PKG}-salsa already exist, aborting."
75 exit 1
76 fi
77
78 if [ -z "ALLOWFAILURE" ] ; then
79 ALLOWFAILURE=false
80 fi
81
82 # Fetch every snapshotted source package. Manually loop until all
83 # transfers succeed, as 'gbp import-dscs --debsnap' do not fail on
84 # download failures.
85 until debsnap --force -v $PKG || $ALLOWFAILURE ; do sleep 1; done
86 mkdir ${PKG}-salsa; cd ${PKG}-salsa
87 git init
88
89 # Specify branches to override any debian/gbp.conf file present in the
90 # source package.
91 gbp import-dscs --debian-branch=master --upstream-branch=upstream \
92 --pristine-tar ../source-$PKG/*.dsc
93
94 # Add Vcs pointing to Salsa Debian project (must be manually created
95 # and pushed to).
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
99 fi
100
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
105
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
111 fi
112
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
116 fi
117
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
121 fi
122 </pre></blockquote>
123
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>
128
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>
136
137 <blockquote><pre>
138 git remote add origin git@salsa.debian.org:debian/perl-byacc.git
139 git push --set-upstream origin master upstream pristine-tar
140 git push --tags
141 </pre></blockquote>
142
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>
152
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
158 rules.</p>
159
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
173 'debuild' run.</p>
174
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>
183
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>
188
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>
192 </div>
193 <div class="tags">
194
195
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>.
197
198
199 </div>
200 </div>
201 <div class="padding"></div>
202
203 <div class="entry">
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>
214
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>
218
219 </div>
220 <div class="tags">
221
222
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>.
224
225
226 </div>
227 </div>
228 <div class="padding"></div>
229
230 <div class="entry">
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>
245
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>
260
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>
272
273 <p>So, if you are a Debian Developer and got some spare time, perhaps
274 considering migrating some orphaned packages to git?</p>
275
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>
279 </div>
280 <div class="tags">
281
282
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>.
284
285
286 </div>
287 </div>
288 <div class="padding"></div>
289
290 <div class="entry">
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,
298 here is a copy:</p>
299
300 <p><blockquote><pre>
301 #!/usr/bin/python3
302 # -*- coding: utf-8 -*-
303 # Copyright (c) 2023-2024 Petter Reinholdtsen
304
305 from decimal import Decimal
306 import json
307 import subprocess
308 import time
309
310 import numpy
311
312 def format_float(num):
313 return numpy.format_float_positional(num, trim='-')
314
315 accounts = {
316 u'amount' : 'Assets:BTC:main',
317 }
318
319 addresses = {
320 '<some address>' : 'Assets:bankkonto',
321 '<some address>' : 'Assets:bankkonto',
322 }
323
324 def exec_json(cmd):
325 proc = subprocess.Popen(cmd,stdout=subprocess.PIPE)
326 j = json.loads(proc.communicate()[0], parse_float=Decimal)
327 return j
328
329 def list_txs():
330 # get all transactions for all accounts / addresses
331 c = 0
332 txs = []
333 txidfee = {}
334 limit=100000
335 cmd = ['bitcoin-cli', 'listtransactions', '*', str(limit)]
336 if True:
337 txs.extend(exec_json(cmd))
338 else:
339 # Useful for debugging
340 with open('transactions.json') as f:
341 txs.extend(json.load(f, parse_float=Decimal))
342 #print txs
343 for tx in sorted(txs, key=lambda a: a['time']):
344 # print tx['category']
345 if 'abandoned' in tx and tx['abandoned']:
346 continue
347 if 'confirmations' in tx and 0 >= tx['confirmations']:
348 continue
349 when = time.strftime('%Y-%m-%d %H:%M', time.localtime(tx['time']))
350 if 'message' in tx:
351 desc = tx['message']
352 elif 'comment' in tx:
353 desc = tx['comment']
354 elif 'label' in tx:
355 desc = tx['label']
356 else:
357 desc = 'n/a'
358 print("%s %s" % (when, desc))
359 if 'address' in tx:
360 print(" ; to bitcoin address %s" % tx['address'])
361 else:
362 print(" ; missing address in transaction, txid=%s" % tx['txid'])
363 print(f" ; amount={tx['amount']}")
364 if 'fee'in tx:
365 print(f" ; fee={tx['fee']}")
366 for f in accounts.keys():
367 if f in tx and Decimal(0) != tx[f]:
368 amount = 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']]:
374 True
375 else:
376 fee = tx['fee']
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']
380
381 if 'address' in tx and tx['address'] in addresses:
382 print(" %s" % addresses[tx['address']])
383 else:
384 if 'generate' == tx['category']:
385 print(" Income:BTC-mining")
386 else:
387 if amount < Decimal(0):
388 print(f" Assets:unknown:sent:update-script-addr-{tx['address']}")
389 else:
390 print(f" Assets:unknown:received:update-script-addr-{tx['address']}")
391
392 print()
393 c = c + 1
394 print("# Found %d transactions" % c)
395 if limit == c:
396 print(f"# Warning: Limit {limit} reached, consider increasing limit.")
397
398 def main():
399 list_txs()
400
401 main()
402 </pre></blockquote></p>
403
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
406 useful too.</p>
407
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
416 transaction:</p>
417
418 <p><blockquote><pre>
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>
425
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>
429
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>
433 </div>
434 <div class="tags">
435
436
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>.
438
439
440 </div>
441 </div>
442 <div class="padding"></div>
443
444 <div class="entry">
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>
463
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>
488
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>
497
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>
502
503 <pre>
504 # megasasctl
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
521
522 #
523 </pre>
524
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
527 find it useful?</p>
528
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>
535
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>
539
540 </div>
541 <div class="tags">
542
543
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>.
545
546
547 </div>
548 </div>
549 <div class="padding"></div>
550
551 <div class="entry">
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.
562
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
565 til min adresse
566 <b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>. Merk,
567 betaling med bitcoin er ikke anonymt. :)</p>
568 </div>
569 <div class="tags">
570
571
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>.
573
574
575 </div>
576 </div>
577 <div class="padding"></div>
578
579 <div class="entry">
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>
583
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
597 duration.</p>
598
599 <p>The first book I published, the 2004 book <a
600 href="https://free-culture.cc/">"Free Culture" by Lawrence Lessig</a>,
601 published 2015 in
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
607 it.</p>
608
609 <p>This movie (with
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>)
615 and the other
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>
625
626 <p>A more
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>
630
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>
634 </div>
635 <div class="tags">
636
637
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>.
639
640
641 </div>
642 </div>
643 <div class="padding"></div>
644
645 <div class="entry">
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>
659
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>
671
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>
676
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>
680 </div>
681 <div class="tags">
682
683
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>.
685
686
687 </div>
688 </div>
689 <div class="padding"></div>
690
691 <div class="entry">
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>
700
701 <blockquote>
702
703 <p><strong>Når «på» blir «pÃ¥»: Et reservoar av tegn sett fra
704 depotet</strong></p>
705
706 <p>av Thomas Sødring og Petter Reinholdtsen</p>
707
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
712 arkivsammenheng?</p>
713
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>
720
721 <p id="tegnsett_access_nå_og_før"><strong>«Nå» og «før»</strong></p>
722
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>
733
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>
742
743 <p>Tegnsettproblemstillingen er satt sammen av fire fasetter;
744 repertoar, representasjon, koding og uttegning.</p>
745
746 <p id="tegnsett_access_repertoarer"><strong>Repertoarer</strong></p>
747
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>
757
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>
768
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>
776
777 <p id="tegnsett_access_fra_ascii_til_iso_8859"><strong>Fra ASCII til ISO-8859</strong></p>
778
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>
791
792 <table align="center" width="50%">
793
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>
798
799 <tbody>
800 <tr>
801 <th>Grafisk</th>
802 <th>Binær</th>
803 <th>Desimal</th>
804 </tr>
805 <tr>
806 <td>A</td>
807 <td>1000001</td>
808 <td align="right">65</td>
809 </tr>
810 <tr>
811 <td>M</td>
812 <td>1001101</td>
813 <td align="right">77</td>
814 </tr>
815 <tr>
816 <td>Z</td>
817 <td>1011010</td>
818 <td align="right">90</td>
819 </tr>
820 <tr>
821 <td>a</td>
822 <td>1100001</td>
823 <td align="right">97</td>
824 </tr>
825 <tr>
826 <td>m</td>
827 <td>1101101</td>
828 <td align="right">109</td>
829 </tr>
830 <tr>
831 <td>z</td>
832 <td>1111010</td>
833 <td align="right">122</td>
834 </tr>
835 <tr>
836 <td>0</td>
837 <td>0110000</td>
838 <td align="right">48</td>
839 </tr>
840 <tr>
841 <td>9</td>
842 <td>0111001</td>
843 <td align="right">58</td>
844 </tr>
845 <tr>
846 <td>;</td>
847 <td>0111011</td>
848 <td align="right">59</td>
849 </tr>
850 </tbody>
851 </table>
852
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>
863
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>
870
871 <table align="center" width="50%">
872
873 <caption>Tabell 2. Koding av de norske symbolene slik de er definert i
874 ISO-8859-1 tegnsettet.</caption>
875
876 <tbody>
877 <tr>
878 <th>Grafisk</th>
879 <th>Binær</th>
880 <th>Desimal</th>
881 </tr>
882 <tr>
883 <td>Æ</td>
884 <td>11000110</td>
885 <td align="right">198</td>
886 </tr>
887 <tr>
888 <td>Ø</td>
889 <td>11011000</td>
890 <td align="right">216</td>
891 </tr>
892 <tr>
893 <td>Å</td>
894 <td>11000101</td>
895 <td align="right">197</td>
896 </tr>
897 <tr>
898 <td>æ</td>
899 <td>11100110</td>
900 <td align="right">230</td>
901 </tr>
902 <tr>
903 <td>ø</td>
904 <td>11111000</td>
905 <td align="right">248</td>
906 </tr>
907 <tr>
908 <td>å</td>
909 <td>11100101</td>
910 <td align="right">229</td>
911 </tr>
912 </tbody>
913 </table>
914
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>
927
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
935 tegnsett.</p>
936
937 <table align="center" width="60%">
938
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>
942
943 <tbody>
944 <tr>
945 <th>Binærverdi</th>
946 <th>1</th>
947 <th>2</th>
948 <th>3</th>
949 <th>4</th>
950 <th>5</th>
951 <th>6</th>
952 <th>7</th>
953 <th>8</th>
954 <th>9</th>
955 <th>10</th>
956 <th>11</th>
957 <th>13</th>
958 <th>14</th>
959 <th>15</th>
960 <th>16</th>
961 </tr>
962 <tr>
963 <td>11000110</td>
964 <td>Æ</td>
965 <td>Ć</td>
966 <td>Ĉ</td>
967 <td>Æ</td>
968 <td>Ц</td>
969 <td>ئ</td>
970 <td>Ζ</td>
971 <td></td>
972 <td>Æ</td>
973 <td>Æ</td>
974 <td></td>
975 <td>Ę</td>
976 <td>Æ</td>
977 <td>Æ</td>
978 <td>Æ</td>
979 </tr>
980 <tr>
981 <td>11011000</td>
982 <td>Ø</td>
983 <td>Ř</td>
984 <td>Ĝ</td>
985 <td>Ø</td>
986 <td>и</td>
987 <td>ظ</td>
988 <td>Ψ</td>
989 <td></td>
990 <td>Ø</td>
991 <td>Ø</td>
992 <td></td>
993 <td>Ų</td>
994 <td>Ø</td>
995 <td>Ø</td>
996 <td>Ű</td>
997 </tr>
998 <tr>
999 <td>11000101</td>
1000 <td>Å</td>
1001 <td>Ĺ</td>
1002 <td>Ċ</td>
1003 <td>Å</td>
1004 <td>Х</td>
1005 <td>إ</td>
1006 <td>Ε</td>
1007 <td></td>
1008 <td>Å</td>
1009 <td>Å</td>
1010 <td></td>
1011 <td>Å</td>
1012 <td>Å</td>
1013 <td>Å</td>
1014 <td>Ć</td>
1015 </tr>
1016 <tr>
1017 <td>11100110</td>
1018 <td>æ</td>
1019 <td>ć</td>
1020 <td>ĉ</td>
1021 <td>æ</td>
1022 <td>ц</td>
1023 <td>ن</td>
1024 <td>ζ</td>
1025 <td>ז</td>
1026 <td>æ</td>
1027 <td>æ</td>
1028 <td></td>
1029 <td>ę</td>
1030 <td>æ</td>
1031 <td>æ</td>
1032 <td>v</td>
1033 </tr>
1034 <tr>
1035 <td>11111000</td>
1036 <td>ø</td>
1037 <td>ř</td>
1038 <td>ĝ</td>
1039 <td>ø</td>
1040 <td>ј</td>
1041 <td></td>
1042 <td>ψ</td>
1043 <td>ר</td>
1044 <td>ø</td>
1045 <td>ø</td>
1046 <td></td>
1047 <td>ų</td>
1048 <td>ø</td>
1049 <td>ø</td>
1050 <td>ű</td>
1051 </tr>
1052 <tr>
1053 <td>11100101</td>
1054 <td>å</td>
1055 <td>ĺ</td>
1056 <td>ċ</td>
1057 <td>å</td>
1058 <td>х</td>
1059 <td>م</td>
1060 <td>ε</td>
1061 <td>ו</td>
1062 <td>å</td>
1063 <td>å</td>
1064 <td></td>
1065 <td>å</td>
1066 <td>å</td>
1067 <td>å</td>
1068 <td>ć</td>
1069 </tr>
1070 </tbody>
1071 </table>
1072
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>
1081
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
1092 vært.</p>
1093
1094 <p id="tegnsett_access_unicode_som_løsning"><strong>Unicode som løsning</strong></p>
1095
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>
1100
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>
1113
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>
1128
1129 <p id="tegnsett_access_bare_unicode_fremover"><strong>Bare Unicode fremover</strong></p>
1130
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>
1146
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>
1151
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>
1160
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>
1170
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>
1177
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>
1188
1189 <blockquote>
1190 <p>§ 5-11. Tegnsett i arkivuttrekk</p>
1191
1192 <ol>
1193 <li>Arkivuttrekk og medfølgende struktur- og innholdsbeskrivelser skal
1194 overføres som ren tekst i ukryptert form, og benytte godkjent
1195 tegnsett.</li>
1196
1197 <li>Godkjente tegnsett er:
1198 <ol>
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>
1203 </ol></li>
1204
1205 <li>Andre tegnsett aksepteres bare etter avtale med Arkivverket.</li>
1206 </ol>
1207 </blockquote>
1208
1209 <p id="tegnsett_access_ditt_ansvar"><strong>Ditt ansvar</strong></p>
1210
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>
1217
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>
1226
1227 <hr>
1228
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>
1230
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>
1232
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>
1234
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-22865-11</a></p>
1236
1237 </blockquote>
1238
1239 <p>For øvrig burde varsleren Edward Snowden få politisk asyl i Norge.</p>
1240
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
1243 til min adresse
1244 <b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>. Merk,
1245 betaling med bitcoin er ikke anonymt. :)</p>
1246 </div>
1247 <div class="tags">
1248
1249
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>.
1251
1252
1253 </div>
1254 </div>
1255 <div class="padding"></div>
1256
1257 <div class="entry">
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
1267 a nice
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>
1283
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
1300 transition</a>.</p>
1301
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>
1306
1307 <pre>/usr/bin/jq -r '."key"' ~/.config/Signal/config.json</pre>
1308
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>
1314
1315 <pre>
1316 % sqlcipher ~/.config/Signal/sql/db.sqlite
1317 sqlite> PRAGMA key = "x'secretkey'";
1318 sqlite> .schema
1319 CREATE TABLE sqlite_stat1(tbl,idx,stat);
1320 CREATE TABLE conversations(
1321 id STRING PRIMARY KEY ASC,
1322 json TEXT,
1323
1324 active_at INTEGER,
1325 type STRING,
1326 members TEXT,
1327 name TEXT,
1328 profileName TEXT
1329 , profileFamilyName TEXT, profileFullName TEXT, e164 TEXT, serviceId TEXT, groupId TEXT, profileLastFetchedAt INTEGER);
1330 CREATE TABLE identityKeys(
1331 id STRING PRIMARY KEY ASC,
1332 json TEXT
1333 );
1334 CREATE TABLE items(
1335 id STRING PRIMARY KEY ASC,
1336 json TEXT
1337 );
1338 CREATE TABLE sessions(
1339 id TEXT PRIMARY KEY,
1340 conversationId TEXT,
1341 json TEXT
1342 , ourServiceId STRING, serviceId STRING);
1343 CREATE TABLE attachment_downloads(
1344 id STRING primary key,
1345 timestamp INTEGER,
1346 pending INTEGER,
1347 json TEXT
1348 );
1349 CREATE TABLE sticker_packs(
1350 id TEXT PRIMARY KEY,
1351 key TEXT NOT NULL,
1352
1353 author STRING,
1354 coverStickerId INTEGER,
1355 createdAt INTEGER,
1356 downloadAttempts INTEGER,
1357 installedAt INTEGER,
1358 lastUsed INTEGER,
1359 status STRING,
1360 stickerCount INTEGER,
1361 title STRING
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,
1367
1368 emoji STRING,
1369 height INTEGER,
1370 isCoverOnly INTEGER,
1371 lastUsed INTEGER,
1372 path STRING,
1373 width INTEGER,
1374
1375 PRIMARY KEY (id, packId),
1376 CONSTRAINT stickers_fk
1377 FOREIGN KEY (packId)
1378 REFERENCES sticker_packs(id)
1379 ON DELETE CASCADE
1380 );
1381 CREATE TABLE sticker_references(
1382 messageId STRING,
1383 packId TEXT,
1384 CONSTRAINT sticker_references_fk
1385 FOREIGN KEY(packId)
1386 REFERENCES sticker_packs(id)
1387 ON DELETE CASCADE
1388 );
1389 CREATE TABLE emojis(
1390 shortName TEXT PRIMARY KEY,
1391 lastUsage INTEGER
1392 );
1393 CREATE TABLE messages(
1394 rowid INTEGER PRIMARY KEY ASC,
1395 id STRING UNIQUE,
1396 json TEXT,
1397 readStatus INTEGER,
1398 expires_at INTEGER,
1399 sent_at INTEGER,
1400 schemaVersion INTEGER,
1401 conversationId STRING,
1402 received_at INTEGER,
1403 source STRING,
1404 hasAttachments INTEGER,
1405 hasFileAttachments INTEGER,
1406 hasVisualMediaAttachments INTEGER,
1407 expireTimer INTEGER,
1408 expirationStartTimestamp INTEGER,
1409 type STRING,
1410 body TEXT,
1411 messageTimer INTEGER,
1412 messageTimerStart INTEGER,
1413 messageTimerExpiresAt INTEGER,
1414 isErased INTEGER,
1415 isViewOnce 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
1421 GENERATED ALWAYS
1422 AS (ifnull(
1423 expirationStartTimestamp + (expireTimer * 1000),
1424 9007199254740991
1425 )), shouldAffectActivity INTEGER
1426 GENERATED ALWAYS AS (
1427 type IS NULL
1428 OR
1429 type NOT IN (
1430 'change-number-notification',
1431 'contact-removed-notification',
1432 'conversation-merge',
1433 'group-v1-migration',
1434 'keychange',
1435 'message-history-unsynced',
1436 'profile-change',
1437 'story',
1438 'universal-timer-notification',
1439 'verified-change'
1440 )
1441 ), shouldAffectPreview INTEGER
1442 GENERATED ALWAYS AS (
1443 type IS NULL
1444 OR
1445 type NOT IN (
1446 'change-number-notification',
1447 'contact-removed-notification',
1448 'conversation-merge',
1449 'group-v1-migration',
1450 'keychange',
1451 'message-history-unsynced',
1452 'profile-change',
1453 'story',
1454 'universal-timer-notification',
1455 'verified-change'
1456 )
1457 ), isUserInitiatedMessage INTEGER
1458 GENERATED ALWAYS AS (
1459 type IS NULL
1460 OR
1461 type NOT IN (
1462 'change-number-notification',
1463 'contact-removed-notification',
1464 'conversation-merge',
1465 'group-v1-migration',
1466 'group-v2-change',
1467 'keychange',
1468 'message-history-unsynced',
1469 'profile-change',
1470 'story',
1471 'universal-timer-notification',
1472 'verified-change'
1473 )
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
1484 AND
1485 isChangeCreatedByUs IS 0
1486 ), callId TEXT
1487 GENERATED ALWAYS AS (
1488 json_extract(json, '$.callId')
1489 ));
1490 CREATE TABLE sqlite_stat4(tbl,idx,neq,nlt,ndlt,sample);
1491 CREATE TABLE jobs(
1492 id TEXT PRIMARY KEY,
1493 queueType TEXT STRING NOT NULL,
1494 timestamp INTEGER NOT NULL,
1495 data STRING TEXT
1496 );
1497 CREATE TABLE reactions(
1498 conversationId STRING,
1499 emoji STRING,
1500 fromId STRING,
1501 messageReceivedAt INTEGER,
1502 targetAuthorAci STRING,
1503 targetTimestamp INTEGER,
1504 unread 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,
1510 data BLOB NOT NULL,
1511 lastUpdatedDate NUMBER NOT NULL
1512 );
1513 CREATE TABLE unprocessed(
1514 id STRING PRIMARY KEY ASC,
1515 timestamp INTEGER,
1516 version INTEGER,
1517 attempts INTEGER,
1518 envelope TEXT,
1519 decrypted TEXT,
1520 source TEXT,
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,
1526
1527 timestamp INTEGER NOT NULL,
1528 contentHint INTEGER NOT NULL,
1529 proto BLOB NOT NULL
1530 , urgent INTEGER, hasPniSignatureMessage INTEGER DEFAULT 0 NOT NULL);
1531 CREATE TABLE sendLogRecipients(
1532 payloadId INTEGER NOT NULL,
1533
1534 recipientServiceId STRING NOT NULL,
1535 deviceId INTEGER NOT NULL,
1536
1537 PRIMARY KEY (payloadId, recipientServiceId, deviceId),
1538
1539 CONSTRAINT sendLogRecipientsForeignKey
1540 FOREIGN KEY (payloadId)
1541 REFERENCES sendLogPayloads(id)
1542 ON DELETE CASCADE
1543 );
1544 CREATE TABLE sendLogMessageIds(
1545 payloadId INTEGER NOT NULL,
1546
1547 messageId STRING NOT NULL,
1548
1549 PRIMARY KEY (payloadId, messageId),
1550
1551 CONSTRAINT sendLogMessageIdsForeignKey
1552 FOREIGN KEY (payloadId)
1553 REFERENCES sendLogPayloads(id)
1554 ON DELETE CASCADE
1555 );
1556 CREATE TABLE preKeys(
1557 id STRING PRIMARY KEY ASC,
1558 json TEXT
1559 , ourServiceId NUMBER
1560 GENERATED ALWAYS AS (json_extract(json, '$.ourServiceId')));
1561 CREATE TABLE signedPreKeys(
1562 id STRING PRIMARY KEY ASC,
1563 json TEXT
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,
1569 name TEXT NOT NULL,
1570 descriptionTemplate TEXT NOT NULL
1571 );
1572 CREATE TABLE badgeImageFiles(
1573 badgeId TEXT REFERENCES badges(id)
1574 ON DELETE CASCADE
1575 ON UPDATE CASCADE,
1576 'order' INTEGER NOT NULL,
1577 url TEXT NOT NULL,
1578 localPath TEXT,
1579 theme TEXT NOT NULL
1580 );
1581 CREATE TABLE storyReads (
1582 authorId STRING NOT NULL,
1583 conversationId STRING NOT NULL,
1584 storyId STRING NOT NULL,
1585 storyReadDate NUMBER NOT NULL,
1586
1587 PRIMARY KEY (authorId, storyId)
1588 );
1589 CREATE TABLE storyDistributions(
1590 id STRING PRIMARY KEY NOT NULL,
1591 name TEXT,
1592
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)
1597 ON DELETE CASCADE
1598 ON UPDATE CASCADE,
1599 serviceId STRING NOT NULL,
1600
1601 PRIMARY KEY (listId, serviceId)
1602 );
1603 CREATE TABLE uninstalled_sticker_packs (
1604 id STRING NOT NULL PRIMARY KEY,
1605 uninstalledAt NUMBER NOT NULL,
1606 storageID STRING,
1607 storageVersion NUMBER,
1608 storageUnknownFields BLOB,
1609 storageNeedsSync INTEGER NOT NULL
1610 );
1611 CREATE TABLE groupCallRingCancellations(
1612 ringId INTEGER PRIMARY KEY,
1613 createdAt INTEGER NOT NULL
1614 );
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)
1622 ON DELETE CASCADE,
1623 sentAt INTEGER,
1624 readStatus INTEGER
1625 , conversationId STRING);
1626 CREATE TABLE mentions (
1627 messageId REFERENCES messages(id) ON DELETE CASCADE,
1628 mentionAci STRING,
1629 start INTEGER,
1630 length INTEGER
1631 );
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
1648 );
1649 [ dropped all indexes to save space in this blog post ]
1650 CREATE TRIGGER messages_on_view_once_update AFTER UPDATE ON messages
1651 WHEN
1652 new.body IS NOT NULL AND new.isViewOnce = 1
1653 BEGIN
1654 DELETE FROM messages_fts WHERE rowid = old.rowid;
1655 END;
1656 CREATE TRIGGER messages_on_insert AFTER INSERT ON messages
1657 WHEN new.isViewOnce IS NOT 1 AND new.storyId IS NULL
1658 BEGIN
1659 INSERT INTO messages_fts
1660 (rowid, body)
1661 VALUES
1662 (new.rowid, new.body);
1663 END;
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
1669 );
1670 DELETE FROM reactions WHERE rowid IN (
1671 SELECT rowid FROM reactions
1672 WHERE messageId = old.id
1673 );
1674 DELETE FROM storyReads WHERE storyId = old.storyId;
1675 END;
1676 CREATE VIRTUAL TABLE messages_fts USING fts5(
1677 body,
1678 tokenize = 'signal_tokenizer'
1679 );
1680 CREATE TRIGGER messages_on_update AFTER UPDATE ON messages
1681 WHEN
1682 (new.body IS NULL OR old.body IS NOT new.body) AND
1683 new.isViewOnce IS NOT 1 AND new.storyId IS NULL
1684 BEGIN
1685 DELETE FROM messages_fts WHERE rowid = old.rowid;
1686 INSERT INTO messages_fts
1687 (rowid, body)
1688 VALUES
1689 (new.rowid, new.body);
1690 END;
1691 CREATE TRIGGER messages_on_insert_insert_mentions AFTER INSERT ON messages
1692 BEGIN
1693 INSERT INTO mentions (messageId, mentionAci, start, length)
1694
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
1700
1701 AND messages.id = new.id;
1702 END;
1703 CREATE TRIGGER messages_on_update_update_mentions AFTER UPDATE ON messages
1704 BEGIN
1705 DELETE FROM mentions WHERE messageId = new.id;
1706 INSERT INTO mentions (messageId, mentionAci, start, length)
1707
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
1713
1714 AND messages.id = new.id;
1715 END;
1716 sqlite>
1717 </pre>
1718
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>
1722
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>
1726 </div>
1727 <div class="tags">
1728
1729
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>.
1731
1732
1733 </div>
1734 </div>
1735 <div class="padding"></div>
1736
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>
1738 <div id="sidebar">
1739
1740
1741
1742 <h2>Archive</h2>
1743 <ul>
1744
1745 <li>2024
1746 <ul>
1747
1748 <li><a href="https://people.skolelinux.org/pere/blog/archive/2024/01/">January (1)</a></li>
1749
1750 <li><a href="https://people.skolelinux.org/pere/blog/archive/2024/02/">February (1)</a></li>
1751
1752 <li><a href="https://people.skolelinux.org/pere/blog/archive/2024/03/">March (2)</a></li>
1753
1754 <li><a href="https://people.skolelinux.org/pere/blog/archive/2024/04/">April (3)</a></li>
1755
1756 </ul></li>
1757
1758 <li>2023
1759 <ul>
1760
1761 <li><a href="https://people.skolelinux.org/pere/blog/archive/2023/01/">January (3)</a></li>
1762
1763 <li><a href="https://people.skolelinux.org/pere/blog/archive/2023/02/">February (1)</a></li>
1764
1765 <li><a href="https://people.skolelinux.org/pere/blog/archive/2023/04/">April (2)</a></li>
1766
1767 <li><a href="https://people.skolelinux.org/pere/blog/archive/2023/05/">May (3)</a></li>
1768
1769 <li><a href="https://people.skolelinux.org/pere/blog/archive/2023/06/">June (1)</a></li>
1770
1771 <li><a href="https://people.skolelinux.org/pere/blog/archive/2023/08/">August (1)</a></li>
1772
1773 <li><a href="https://people.skolelinux.org/pere/blog/archive/2023/09/">September (1)</a></li>
1774
1775 <li><a href="https://people.skolelinux.org/pere/blog/archive/2023/10/">October (1)</a></li>
1776
1777 <li><a href="https://people.skolelinux.org/pere/blog/archive/2023/11/">November (4)</a></li>
1778
1779 <li><a href="https://people.skolelinux.org/pere/blog/archive/2023/12/">December (1)</a></li>
1780
1781 </ul></li>
1782
1783 <li>2022
1784 <ul>
1785
1786 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/02/">February (1)</a></li>
1787
1788 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/03/">March (3)</a></li>
1789
1790 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/04/">April (2)</a></li>
1791
1792 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/06/">June (2)</a></li>
1793
1794 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/07/">July (1)</a></li>
1795
1796 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/09/">September (1)</a></li>
1797
1798 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/10/">October (1)</a></li>
1799
1800 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/12/">December (1)</a></li>
1801
1802 </ul></li>
1803
1804 <li>2021
1805 <ul>
1806
1807 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/01/">January (2)</a></li>
1808
1809 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/02/">February (1)</a></li>
1810
1811 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/05/">May (1)</a></li>
1812
1813 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/06/">June (1)</a></li>
1814
1815 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/07/">July (3)</a></li>
1816
1817 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/08/">August (1)</a></li>
1818
1819 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/09/">September (1)</a></li>
1820
1821 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/10/">October (1)</a></li>
1822
1823 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/12/">December (1)</a></li>
1824
1825 </ul></li>
1826
1827 <li>2020
1828 <ul>
1829
1830 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/02/">February (2)</a></li>
1831
1832 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/03/">March (2)</a></li>
1833
1834 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/04/">April (2)</a></li>
1835
1836 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/05/">May (3)</a></li>
1837
1838 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/06/">June (2)</a></li>
1839
1840 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/07/">July (1)</a></li>
1841
1842 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/09/">September (1)</a></li>
1843
1844 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/10/">October (1)</a></li>
1845
1846 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/11/">November (1)</a></li>
1847
1848 </ul></li>
1849
1850 <li>2019
1851 <ul>
1852
1853 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/01/">January (4)</a></li>
1854
1855 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/02/">February (3)</a></li>
1856
1857 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/03/">March (3)</a></li>
1858
1859 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/05/">May (2)</a></li>
1860
1861 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/06/">June (5)</a></li>
1862
1863 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/07/">July (2)</a></li>
1864
1865 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/08/">August (1)</a></li>
1866
1867 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/09/">September (1)</a></li>
1868
1869 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/11/">November (1)</a></li>
1870
1871 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/12/">December (4)</a></li>
1872
1873 </ul></li>
1874
1875 <li>2018
1876 <ul>
1877
1878 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/01/">January (1)</a></li>
1879
1880 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/02/">February (5)</a></li>
1881
1882 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/03/">March (5)</a></li>
1883
1884 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/04/">April (3)</a></li>
1885
1886 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/06/">June (2)</a></li>
1887
1888 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/07/">July (5)</a></li>
1889
1890 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/08/">August (3)</a></li>
1891
1892 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/09/">September (3)</a></li>
1893
1894 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/10/">October (5)</a></li>
1895
1896 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/11/">November (2)</a></li>
1897
1898 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/12/">December (4)</a></li>
1899
1900 </ul></li>
1901
1902 <li>2017
1903 <ul>
1904
1905 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/01/">January (4)</a></li>
1906
1907 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/02/">February (3)</a></li>
1908
1909 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/03/">March (5)</a></li>
1910
1911 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/04/">April (2)</a></li>
1912
1913 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/06/">June (5)</a></li>
1914
1915 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/07/">July (1)</a></li>
1916
1917 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/08/">August (1)</a></li>
1918
1919 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/09/">September (3)</a></li>
1920
1921 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/10/">October (5)</a></li>
1922
1923 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/11/">November (3)</a></li>
1924
1925 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/12/">December (4)</a></li>
1926
1927 </ul></li>
1928
1929 <li>2016
1930 <ul>
1931
1932 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/01/">January (3)</a></li>
1933
1934 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/02/">February (2)</a></li>
1935
1936 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/03/">March (3)</a></li>
1937
1938 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/04/">April (8)</a></li>
1939
1940 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/05/">May (8)</a></li>
1941
1942 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/06/">June (2)</a></li>
1943
1944 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/07/">July (2)</a></li>
1945
1946 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/08/">August (5)</a></li>
1947
1948 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/09/">September (2)</a></li>
1949
1950 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/10/">October (3)</a></li>
1951
1952 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/11/">November (8)</a></li>
1953
1954 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/12/">December (5)</a></li>
1955
1956 </ul></li>
1957
1958 <li>2015
1959 <ul>
1960
1961 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/01/">January (7)</a></li>
1962
1963 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/02/">February (6)</a></li>
1964
1965 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/03/">March (1)</a></li>
1966
1967 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/04/">April (4)</a></li>
1968
1969 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/05/">May (3)</a></li>
1970
1971 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/06/">June (4)</a></li>
1972
1973 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/07/">July (6)</a></li>
1974
1975 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/08/">August (2)</a></li>
1976
1977 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/09/">September (2)</a></li>
1978
1979 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/10/">October (9)</a></li>
1980
1981 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/11/">November (6)</a></li>
1982
1983 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/12/">December (3)</a></li>
1984
1985 </ul></li>
1986
1987 <li>2014
1988 <ul>
1989
1990 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/01/">January (2)</a></li>
1991
1992 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/02/">February (3)</a></li>
1993
1994 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/03/">March (8)</a></li>
1995
1996 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/04/">April (7)</a></li>
1997
1998 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/05/">May (1)</a></li>
1999
2000 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/06/">June (2)</a></li>
2001
2002 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/07/">July (2)</a></li>
2003
2004 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/08/">August (2)</a></li>
2005
2006 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/09/">September (5)</a></li>
2007
2008 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/10/">October (6)</a></li>
2009
2010 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/11/">November (3)</a></li>
2011
2012 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/12/">December (5)</a></li>
2013
2014 </ul></li>
2015
2016 <li>2013
2017 <ul>
2018
2019 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/01/">January (11)</a></li>
2020
2021 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/02/">February (9)</a></li>
2022
2023 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/03/">March (9)</a></li>
2024
2025 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/04/">April (6)</a></li>
2026
2027 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/05/">May (9)</a></li>
2028
2029 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/06/">June (10)</a></li>
2030
2031 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/07/">July (7)</a></li>
2032
2033 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/08/">August (3)</a></li>
2034
2035 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/09/">September (5)</a></li>
2036
2037 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/10/">October (7)</a></li>
2038
2039 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/11/">November (9)</a></li>
2040
2041 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/12/">December (3)</a></li>
2042
2043 </ul></li>
2044
2045 <li>2012
2046 <ul>
2047
2048 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/01/">January (7)</a></li>
2049
2050 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/02/">February (10)</a></li>
2051
2052 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/03/">March (17)</a></li>
2053
2054 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/04/">April (12)</a></li>
2055
2056 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/05/">May (12)</a></li>
2057
2058 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/06/">June (20)</a></li>
2059
2060 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/07/">July (17)</a></li>
2061
2062 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/08/">August (6)</a></li>
2063
2064 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/09/">September (9)</a></li>
2065
2066 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/10/">October (17)</a></li>
2067
2068 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/11/">November (10)</a></li>
2069
2070 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/12/">December (7)</a></li>
2071
2072 </ul></li>
2073
2074 <li>2011
2075 <ul>
2076
2077 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/01/">January (16)</a></li>
2078
2079 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/02/">February (6)</a></li>
2080
2081 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/03/">March (6)</a></li>
2082
2083 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/04/">April (7)</a></li>
2084
2085 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/05/">May (3)</a></li>
2086
2087 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/06/">June (2)</a></li>
2088
2089 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/07/">July (7)</a></li>
2090
2091 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/08/">August (6)</a></li>
2092
2093 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/09/">September (4)</a></li>
2094
2095 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/10/">October (2)</a></li>
2096
2097 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/11/">November (3)</a></li>
2098
2099 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/12/">December (1)</a></li>
2100
2101 </ul></li>
2102
2103 <li>2010
2104 <ul>
2105
2106 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/01/">January (2)</a></li>
2107
2108 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/02/">February (1)</a></li>
2109
2110 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/03/">March (3)</a></li>
2111
2112 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/04/">April (3)</a></li>
2113
2114 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/05/">May (9)</a></li>
2115
2116 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/06/">June (14)</a></li>
2117
2118 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/07/">July (12)</a></li>
2119
2120 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/08/">August (13)</a></li>
2121
2122 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/09/">September (7)</a></li>
2123
2124 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/10/">October (9)</a></li>
2125
2126 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/11/">November (13)</a></li>
2127
2128 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/12/">December (12)</a></li>
2129
2130 </ul></li>
2131
2132 <li>2009
2133 <ul>
2134
2135 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/01/">January (8)</a></li>
2136
2137 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/02/">February (8)</a></li>
2138
2139 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/03/">March (12)</a></li>
2140
2141 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/04/">April (10)</a></li>
2142
2143 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/05/">May (9)</a></li>
2144
2145 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/06/">June (3)</a></li>
2146
2147 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/07/">July (4)</a></li>
2148
2149 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/08/">August (3)</a></li>
2150
2151 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/09/">September (1)</a></li>
2152
2153 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/10/">October (2)</a></li>
2154
2155 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/11/">November (3)</a></li>
2156
2157 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/12/">December (3)</a></li>
2158
2159 </ul></li>
2160
2161 <li>2008
2162 <ul>
2163
2164 <li><a href="https://people.skolelinux.org/pere/blog/archive/2008/11/">November (5)</a></li>
2165
2166 <li><a href="https://people.skolelinux.org/pere/blog/archive/2008/12/">December (7)</a></li>
2167
2168 </ul></li>
2169
2170 </ul>
2171
2172
2173
2174 <h2>Tags</h2>
2175 <ul>
2176
2177 <li><a href="https://people.skolelinux.org/pere/blog/tags/3d-printer">3d-printer (19)</a></li>
2178
2179 <li><a href="https://people.skolelinux.org/pere/blog/tags/amiga">amiga (1)</a></li>
2180
2181 <li><a href="https://people.skolelinux.org/pere/blog/tags/aros">aros (1)</a></li>
2182
2183 <li><a href="https://people.skolelinux.org/pere/blog/tags/bankid">bankid (4)</a></li>
2184
2185 <li><a href="https://people.skolelinux.org/pere/blog/tags/betalkontant">betalkontant (9)</a></li>
2186
2187 <li><a href="https://people.skolelinux.org/pere/blog/tags/bitcoin">bitcoin (13)</a></li>
2188
2189 <li><a href="https://people.skolelinux.org/pere/blog/tags/bootsystem">bootsystem (17)</a></li>
2190
2191 <li><a href="https://people.skolelinux.org/pere/blog/tags/bsa">bsa (2)</a></li>
2192
2193 <li><a href="https://people.skolelinux.org/pere/blog/tags/chrpath">chrpath (3)</a></li>
2194
2195 <li><a href="https://people.skolelinux.org/pere/blog/tags/debian">debian (199)</a></li>
2196
2197 <li><a href="https://people.skolelinux.org/pere/blog/tags/debian edu">debian edu (159)</a></li>
2198
2199 <li><a href="https://people.skolelinux.org/pere/blog/tags/debian-handbook">debian-handbook (9)</a></li>
2200
2201 <li><a href="https://people.skolelinux.org/pere/blog/tags/digistan">digistan (11)</a></li>
2202
2203 <li><a href="https://people.skolelinux.org/pere/blog/tags/dld">dld (18)</a></li>
2204
2205 <li><a href="https://people.skolelinux.org/pere/blog/tags/docbook">docbook (32)</a></li>
2206
2207 <li><a href="https://people.skolelinux.org/pere/blog/tags/drivstoffpriser">drivstoffpriser (4)</a></li>
2208
2209 <li><a href="https://people.skolelinux.org/pere/blog/tags/english">english (461)</a></li>
2210
2211 <li><a href="https://people.skolelinux.org/pere/blog/tags/fiksgatami">fiksgatami (23)</a></li>
2212
2213 <li><a href="https://people.skolelinux.org/pere/blog/tags/fildeling">fildeling (14)</a></li>
2214
2215 <li><a href="https://people.skolelinux.org/pere/blog/tags/freeculture">freeculture (34)</a></li>
2216
2217 <li><a href="https://people.skolelinux.org/pere/blog/tags/freedombox">freedombox (9)</a></li>
2218
2219 <li><a href="https://people.skolelinux.org/pere/blog/tags/frikanalen">frikanalen (20)</a></li>
2220
2221 <li><a href="https://people.skolelinux.org/pere/blog/tags/h264">h264 (20)</a></li>
2222
2223 <li><a href="https://people.skolelinux.org/pere/blog/tags/intervju">intervju (43)</a></li>
2224
2225 <li><a href="https://people.skolelinux.org/pere/blog/tags/isenkram">isenkram (18)</a></li>
2226
2227 <li><a href="https://people.skolelinux.org/pere/blog/tags/kart">kart (23)</a></li>
2228
2229 <li><a href="https://people.skolelinux.org/pere/blog/tags/kodi">kodi (6)</a></li>
2230
2231 <li><a href="https://people.skolelinux.org/pere/blog/tags/ldap">ldap (9)</a></li>
2232
2233 <li><a href="https://people.skolelinux.org/pere/blog/tags/lego">lego (5)</a></li>
2234
2235 <li><a href="https://people.skolelinux.org/pere/blog/tags/lenker">lenker (8)</a></li>
2236
2237 <li><a href="https://people.skolelinux.org/pere/blog/tags/linuxcnc">linuxcnc (5)</a></li>
2238
2239 <li><a href="https://people.skolelinux.org/pere/blog/tags/lsdvd">lsdvd (2)</a></li>
2240
2241 <li><a href="https://people.skolelinux.org/pere/blog/tags/ltsp">ltsp (1)</a></li>
2242
2243 <li><a href="https://people.skolelinux.org/pere/blog/tags/madewithcc">madewithcc (3)</a></li>
2244
2245 <li><a href="https://people.skolelinux.org/pere/blog/tags/mesh network">mesh network (8)</a></li>
2246
2247 <li><a href="https://people.skolelinux.org/pere/blog/tags/multimedia">multimedia (46)</a></li>
2248
2249 <li><a href="https://people.skolelinux.org/pere/blog/tags/nice free software">nice free software (15)</a></li>
2250
2251 <li><a href="https://people.skolelinux.org/pere/blog/tags/noark5">noark5 (25)</a></li>
2252
2253 <li><a href="https://people.skolelinux.org/pere/blog/tags/norsk">norsk (324)</a></li>
2254
2255 <li><a href="https://people.skolelinux.org/pere/blog/tags/nuug">nuug (199)</a></li>
2256
2257 <li><a href="https://people.skolelinux.org/pere/blog/tags/offentlig innsyn">offentlig innsyn (41)</a></li>
2258
2259 <li><a href="https://people.skolelinux.org/pere/blog/tags/open311">open311 (2)</a></li>
2260
2261 <li><a href="https://people.skolelinux.org/pere/blog/tags/opensnitch">opensnitch (4)</a></li>
2262
2263 <li><a href="https://people.skolelinux.org/pere/blog/tags/opphavsrett">opphavsrett (76)</a></li>
2264
2265 <li><a href="https://people.skolelinux.org/pere/blog/tags/personvern">personvern (114)</a></li>
2266
2267 <li><a href="https://people.skolelinux.org/pere/blog/tags/raid">raid (4)</a></li>
2268
2269 <li><a href="https://people.skolelinux.org/pere/blog/tags/reactos">reactos (1)</a></li>
2270
2271 <li><a href="https://people.skolelinux.org/pere/blog/tags/reprap">reprap (11)</a></li>
2272
2273 <li><a href="https://people.skolelinux.org/pere/blog/tags/rfid">rfid (3)</a></li>
2274
2275 <li><a href="https://people.skolelinux.org/pere/blog/tags/robot">robot (17)</a></li>
2276
2277 <li><a href="https://people.skolelinux.org/pere/blog/tags/rss">rss (1)</a></li>
2278
2279 <li><a href="https://people.skolelinux.org/pere/blog/tags/ruter">ruter (7)</a></li>
2280
2281 <li><a href="https://people.skolelinux.org/pere/blog/tags/scraperwiki">scraperwiki (2)</a></li>
2282
2283 <li><a href="https://people.skolelinux.org/pere/blog/tags/sikkerhet">sikkerhet (60)</a></li>
2284
2285 <li><a href="https://people.skolelinux.org/pere/blog/tags/sitesummary">sitesummary (4)</a></li>
2286
2287 <li><a href="https://people.skolelinux.org/pere/blog/tags/skepsis">skepsis (5)</a></li>
2288
2289 <li><a href="https://people.skolelinux.org/pere/blog/tags/standard">standard (76)</a></li>
2290
2291 <li><a href="https://people.skolelinux.org/pere/blog/tags/stavekontroll">stavekontroll (7)</a></li>
2292
2293 <li><a href="https://people.skolelinux.org/pere/blog/tags/stortinget">stortinget (14)</a></li>
2294
2295 <li><a href="https://people.skolelinux.org/pere/blog/tags/surveillance">surveillance (65)</a></li>
2296
2297 <li><a href="https://people.skolelinux.org/pere/blog/tags/sysadmin">sysadmin (5)</a></li>
2298
2299 <li><a href="https://people.skolelinux.org/pere/blog/tags/usenix">usenix (2)</a></li>
2300
2301 <li><a href="https://people.skolelinux.org/pere/blog/tags/valg">valg (9)</a></li>
2302
2303 <li><a href="https://people.skolelinux.org/pere/blog/tags/verkidetfri">verkidetfri (22)</a></li>
2304
2305 <li><a href="https://people.skolelinux.org/pere/blog/tags/video">video (80)</a></li>
2306
2307 <li><a href="https://people.skolelinux.org/pere/blog/tags/vitenskap">vitenskap (4)</a></li>
2308
2309 <li><a href="https://people.skolelinux.org/pere/blog/tags/web">web (42)</a></li>
2310
2311 </ul>
2312
2313
2314 </div>
2315 <p style="text-align: right">
2316 Created by <a href="http://steve.org.uk/Software/chronicle">Chronicle v4.6</a>
2317 </p>
2318
2319 </body>
2320 </html>