]> pere.pagekite.me Git - homepage.git/blob - blog/index.rss
Generated.
[homepage.git] / blog / index.rss
1 <?xml version="1.0" encoding="utf-8"?>
2 <rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:atom="http://www.w3.org/2005/Atom">
3 <channel>
4 <title>Petter Reinholdtsen</title>
5 <description></description>
6 <link>https://people.skolelinux.org/pere/blog/</link>
7 <atom:link href="https://people.skolelinux.org/pere/blog/index.rss" rel="self" type="application/rss+xml" />
8
9 <item>
10 <title>Plain text accounting file from your bitcoin transactions</title>
11 <link>https://people.skolelinux.org/pere/blog/Plain_text_accounting_file_from_your_bitcoin_transactions.html</link>
12 <guid isPermaLink="true">https://people.skolelinux.org/pere/blog/Plain_text_accounting_file_from_your_bitcoin_transactions.html</guid>
13 <pubDate>Thu, 7 Mar 2024 18:00:00 +0100</pubDate>
14 <description>&lt;p&gt;A while back I wrote a small script to extract the Bitcoin
15 transactions in a wallet in the
16 &lt;ahref=&quot;https://plaintextaccounting.org/&quot;&gt;ledger plain text accounting
17 format&lt;/a&gt;. The last few days I spent some time to get it working
18 better with more special cases. In case it can be useful for others,
19 here is a copy:&lt;/p&gt;
20
21 &lt;p&gt;&lt;blockquote&gt;&lt;pre&gt;
22 #!/usr/bin/python3
23 # -*- coding: utf-8 -*-
24 # Copyright (c) 2023-2024 Petter Reinholdtsen
25
26 from decimal import Decimal
27 import json
28 import subprocess
29 import time
30
31 import numpy
32
33 def format_float(num):
34 return numpy.format_float_positional(num, trim=&#39;-&#39;)
35
36 accounts = {
37 u&#39;amount&#39; : &#39;Assets:BTC:main&#39;,
38 }
39
40 addresses = {
41 &#39;&lt;some address&gt;&#39; : &#39;Assets:bankkonto&#39;,
42 &#39;&lt;some address&gt;&#39; : &#39;Assets:bankkonto&#39;,
43 }
44
45 def exec_json(cmd):
46 proc = subprocess.Popen(cmd,stdout=subprocess.PIPE)
47 j = json.loads(proc.communicate()[0], parse_float=Decimal)
48 return j
49
50 def list_txs():
51 # get all transactions for all accounts / addresses
52 c = 0
53 txs = []
54 txidfee = {}
55 limit=100000
56 cmd = [&#39;bitcoin-cli&#39;, &#39;listtransactions&#39;, &#39;*&#39;, str(limit)]
57 if True:
58 txs.extend(exec_json(cmd))
59 else:
60 # Useful for debugging
61 with open(&#39;transactions.json&#39;) as f:
62 txs.extend(json.load(f, parse_float=Decimal))
63 #print txs
64 for tx in sorted(txs, key=lambda a: a[&#39;time&#39;]):
65 # print tx[&#39;category&#39;]
66 if &#39;abandoned&#39; in tx and tx[&#39;abandoned&#39;]:
67 continue
68 if &#39;confirmations&#39; in tx and 0 &gt;= tx[&#39;confirmations&#39;]:
69 continue
70 when = time.strftime(&#39;%Y-%m-%d %H:%M&#39;, time.localtime(tx[&#39;time&#39;]))
71 if &#39;message&#39; in tx:
72 desc = tx[&#39;message&#39;]
73 elif &#39;comment&#39; in tx:
74 desc = tx[&#39;comment&#39;]
75 elif &#39;label&#39; in tx:
76 desc = tx[&#39;label&#39;]
77 else:
78 desc = &#39;n/a&#39;
79 print(&quot;%s %s&quot; % (when, desc))
80 if &#39;address&#39; in tx:
81 print(&quot; ; to bitcoin address %s&quot; % tx[&#39;address&#39;])
82 else:
83 print(&quot; ; missing address in transaction, txid=%s&quot; % tx[&#39;txid&#39;])
84 print(f&quot; ; amount={tx[&#39;amount&#39;]}&quot;)
85 if &#39;fee&#39;in tx:
86 print(f&quot; ; fee={tx[&#39;fee&#39;]}&quot;)
87 for f in accounts.keys():
88 if f in tx and Decimal(0) != tx[f]:
89 amount = tx[f]
90 print(&quot; %-20s %s BTC&quot; % (accounts[f], format_float(amount)))
91 if &#39;fee&#39; in tx and Decimal(0) != tx[&#39;fee&#39;]:
92 # Make sure to list fee used in several transactions only once.
93 if &#39;fee&#39; in tx and tx[&#39;txid&#39;] in txidfee \
94 and tx[&#39;fee&#39;] == txidfee[tx[&#39;txid&#39;]]:
95 True
96 else:
97 fee = tx[&#39;fee&#39;]
98 print(&quot; %-20s %s BTC&quot; % (accounts[&#39;amount&#39;], format_float(fee)))
99 print(&quot; %-20s %s BTC&quot; % (&#39;Expences:BTC-fee&#39;, format_float(-fee)))
100 txidfee[tx[&#39;txid&#39;]] = tx[&#39;fee&#39;]
101
102 if &#39;address&#39; in tx and tx[&#39;address&#39;] in addresses:
103 print(&quot; %s&quot; % addresses[tx[&#39;address&#39;]])
104 else:
105 if &#39;generate&#39; == tx[&#39;category&#39;]:
106 print(&quot; Income:BTC-mining&quot;)
107 else:
108 if amount &lt; Decimal(0):
109 print(f&quot; Assets:unknown:sent:update-script-addr-{tx[&#39;address&#39;]}&quot;)
110 else:
111 print(f&quot; Assets:unknown:received:update-script-addr-{tx[&#39;address&#39;]}&quot;)
112
113 print()
114 c = c + 1
115 print(&quot;# Found %d transactions&quot; % c)
116 if limit == c:
117 print(f&quot;# Warning: Limit {limit} reached, consider increasing limit.&quot;)
118
119 def main():
120 list_txs()
121
122 main()
123 &lt;/pre&gt;&lt;/blockquote&gt;&lt;/p&gt;
124
125 &lt;p&gt;It is more of a proof of concept, and I do not expect it to handle
126 all edge cases, but it worked for me, and perhaps you can find it
127 useful too.&lt;/p&gt;
128
129 &lt;p&gt;To get a more interesting result, it is useful to map accounts sent
130 to or received from to accounting accounts, using the
131 &lt;tt&gt;addresses&lt;/tt&gt; hash. As these will be very context dependent, I
132 leave out my list to allow each user to fill out their own list of
133 accounts. Out of the box, &#39;ledger reg BTC:main&#39; should be able to
134 show the amount of BTCs present in the wallet at any given time in the
135 past. For other and more valuable analysis, a account plan need to be
136 set up in the &lt;tt&gt;addresses&lt;/tt&gt; hash. Here is an example
137 transaction:&lt;/p&gt;
138
139 &lt;p&gt;&lt;blockquote&gt;&lt;pre&gt;
140 2024-03-07 17:00 Donated to good cause
141 Assets:BTC:main -0.1 BTC
142 Assets:BTC:main -0.00001 BTC
143 Expences:BTC-fee 0.00001 BTC
144 Expences:donations 0.1 BTC
145 &lt;/pre&gt;&lt;/blockquote&gt;&lt;/p&gt;
146
147 &lt;p&gt;It need a running Bitcoin Core daemon running, as it connect to it
148 using &lt;tt&gt;bitcoin-cli listtransactions * 100000&lt;/tt&gt; to extract the
149 transactions listed in the Wallet.&lt;/p&gt;
150
151 &lt;p&gt;As usual, if you use Bitcoin and want to show your support of my
152 activities, please send Bitcoin donations to my address
153 &lt;b&gt;&lt;a href=&quot;bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&quot;&gt;15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;
154 </description>
155 </item>
156
157 <item>
158 <title>RAID status from LSI Megaraid controllers using free software</title>
159 <link>https://people.skolelinux.org/pere/blog/RAID_status_from_LSI_Megaraid_controllers_using_free_software.html</link>
160 <guid isPermaLink="true">https://people.skolelinux.org/pere/blog/RAID_status_from_LSI_Megaraid_controllers_using_free_software.html</guid>
161 <pubDate>Sun, 3 Mar 2024 22:40:00 +0100</pubDate>
162 <description>&lt;p&gt;The last few days I have revisited RAID setup using the LSI
163 Megaraid controller. These are a family of controllers called PERC by
164 Dell, and is present in several old PowerEdge servers, and I recently
165 got my hands on one of these. I had forgotten how to handle this RAID
166 controller in Debian, so I had to take a peek in the
167 &lt;a href=&quot;https://wiki.debian.org/LinuxRaidForAdmins&quot;&gt;Debian wiki page
168 &quot;Linux and Hardware RAID: an administrator&#39;s summary&quot;&lt;/a&gt; to remember
169 what kind of software is available to configure and monitor the disks
170 and controller. I prefer Free Software alternatives to proprietary
171 tools, as the later tend to fall into disarray once the manufacturer
172 loose interest, and often do not work with newer Linux Distributions.
173 Sadly there is no free software tool to configure the RAID setup, only
174 to monitor it. RAID can provide improved reliability and resilience in
175 a storage solution, but only if it is being regularly checked and any
176 broken disks are being replaced in time. I thus want to ensure some
177 automatic monitoring is available.&lt;/p&gt;
178
179 &lt;p&gt;In the discovery process, I came across a old free software tool to
180 monitor PERC2, PERC3, PERC4 and PERC5 controllers, which to my
181 surprise is not present in debian. To help change that I created a
182 &lt;a href=&quot;https://bugs.debian.org/1065322&quot;&gt;request for packaging of the
183 megactl package&lt;/a&gt;, and tried to track down a usable version.
184 &lt;a href=&quot;https://sourceforge.net/p/megactl/&quot;&gt;The original project
185 site&lt;/a&gt; is on Sourceforge, but as far as I can tell that project has
186 been dead for more than 15 years. I managed to find a
187 &lt;a href=&quot;https://github.com/hmage/megactl&quot;&gt;more recent fork on
188 github&lt;/a&gt; from user hmage, but it is unclear to me if this is still
189 being maintained. It has not seen much improvements since 2016. A
190 &lt;a href=&quot;https://github.com/namiltd/megactl&quot;&gt;more up to date
191 edition&lt;/a&gt; is a git fork from the original github fork by user
192 namiltd, and this newer fork seem a lot more promising. The owner of
193 this github repository has replied to change proposals within hours,
194 and had already added some improvements and support for more hardware.
195 Sadly he is reluctant to commit to maintaining the tool and stated in
196 &lt;a href=&quot;https://github.com/namiltd/megactl/pull/1&quot;&gt;my first pull
197 request&lt;/A&gt; that he think a new release should be made based on the
198 git repository owned by hmage. I perfectly understand this
199 reluctance, as I feel the same about maintaining yet another package
200 in Debian when I barely have time to take care of the ones I already
201 maintain, but do not really have high hopes that hmage will have time
202 to spend on it and hope namiltd will change his mind.&lt;/p&gt;
203
204 &lt;p&gt;In any case, I created
205 &lt;a href=&quot;https://salsa.debian.org/debian/megactl&quot;&gt;a draft package&lt;/a&gt;
206 based on the namiltd edition and put it under the debian group on
207 salsa.debian.org. If you own a Dell PowerEdge server with one of the
208 PERC controllers, or any other RAID controller using the megaraid or
209 megaraid_sas Linux kernel modules, you might want to check it out. If
210 enough people are interested, perhaps the package will make it into
211 the Debian archive.&lt;/p&gt;
212
213 &lt;p&gt;There are two tools provided, megactl for the megaraid Linux kernel
214 module, and megasasctl for the megaraid_sas Linux kernel module. The
215 simple output from the command on one of my machines look like this
216 (yes, I know some of the disks have problems. :).&lt;/p&gt;
217
218 &lt;pre&gt;
219 # megasasctl
220 a0 PERC H730 Mini encl:1 ldrv:2 batt:good
221 a0d0 558GiB RAID 1 1x2 optimal
222 a0d1 3067GiB RAID 0 1x11 optimal
223 a0e32s0 558GiB a0d0 online errs: media:0 other:19
224 a0e32s1 279GiB a0d1 online
225 a0e32s2 279GiB a0d1 online
226 a0e32s3 279GiB a0d1 online
227 a0e32s4 279GiB a0d1 online
228 a0e32s5 279GiB a0d1 online
229 a0e32s6 279GiB a0d1 online
230 a0e32s8 558GiB a0d0 online errs: media:0 other:17
231 a0e32s9 279GiB a0d1 online
232 a0e32s10 279GiB a0d1 online
233 a0e32s11 279GiB a0d1 online
234 a0e32s12 279GiB a0d1 online
235 a0e32s13 279GiB a0d1 online
236
237 #
238 &lt;/pre&gt;
239
240 &lt;p&gt;In addition to displaying a simple status report, it can also test
241 individual drives and print the various event logs. Perhaps you too
242 find it useful?&lt;/p&gt;
243
244 &lt;p&gt;In the packaging process I provided some patches upstream to
245 improve installation and ensure
246 &lt;ahref=&quot;https://github.com/namiltd/megactl/pull/2&quot;&gt;a Appstream
247 metainfo file is provided&lt;/a&gt; to list all supported HW, to allow
248 &lt;a href=&quot;https://tracker.debian.org/isenkram&quot;&gt;isenkram&lt;/a&gt; to propose
249 the package on all servers with a relevant PCI card.&lt;/p&gt;
250
251 &lt;p&gt;As usual, if you use Bitcoin and want to show your support of my
252 activities, please send Bitcoin donations to my address
253 &lt;b&gt;&lt;a href=&quot;bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&quot;&gt;15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;
254
255 </description>
256 </item>
257
258 <item>
259 <title>Frokostseminar om Noark 5 i Oslo tirsdag 2024-03-12</title>
260 <link>https://people.skolelinux.org/pere/blog/Frokostseminar_om_Noark_5_i_Oslo_tirsdag_2024_03_12.html</link>
261 <guid isPermaLink="true">https://people.skolelinux.org/pere/blog/Frokostseminar_om_Noark_5_i_Oslo_tirsdag_2024_03_12.html</guid>
262 <pubDate>Tue, 27 Feb 2024 15:15:00 +0100</pubDate>
263 <description>&lt;p&gt;Nikita-prosjektet, der jeg er involvert, inviterer i samarbeid med
264 Oslo Byarkiv, forskningsgruppen METAINFO og foreningen NUUG, til et
265 frokostseminar om Noark 5 og Noark 5 Tjenestegrensesnitt tirsdag
266 2024-03-12. Seminaret finner sted ved Oslo byarkiv. Vi håper å få
267 til videostrømming via Internett av presentasjoner og paneldiskusjon.
268 Oppdatert program og lenker til påmeldingsskjema er
269 &lt;a href=&quot;https://noark.codeberg.page/noark5-seminars/2023-03-12-noark-workshop.html&quot;&gt;tilgjengelig
270 fra Nikita-prosjektet&lt;/a&gt;. Arrangementet er gratis.
271
272 &lt;p&gt;Som vanlig, hvis du bruker Bitcoin og ønsker å vise din støtte til
273 det jeg driver med, setter jeg pris på om du sender Bitcoin-donasjoner
274 til min adresse
275 &lt;b&gt;&lt;a href=&quot;bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&quot;&gt;15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&lt;/a&gt;&lt;/b&gt;. Merk,
276 betaling med bitcoin er ikke anonymt. :)&lt;/p&gt;
277 </description>
278 </item>
279
280 <item>
281 <title>Welcome out of prison, Mickey, hope you find some freedom!</title>
282 <link>https://people.skolelinux.org/pere/blog/Welcome_out_of_prison__Mickey__hope_you_find_some_freedom_.html</link>
283 <guid isPermaLink="true">https://people.skolelinux.org/pere/blog/Welcome_out_of_prison__Mickey__hope_you_find_some_freedom_.html</guid>
284 <pubDate>Mon, 1 Jan 2024 21:00:00 +0100</pubDate>
285 <description>&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;https://people.skolelinux.org/pere/blog/images/2024-01-01-mikke-verk-i-det-fri.jpeg&quot;/&gt;&lt;/p&gt;
286
287 &lt;p&gt;Today, the animation figure Mickey Mouse finally was released from
288 the corporate copyright prison, as the 1928 movie
289 &lt;a href=&quot;https://en.wikipedia.org/wiki/Steamboat_Willie&quot;&gt;Steamboat
290 Willie&lt;/a&gt; entered the public domain in USA. This movie was the first
291 public appearance of Mickey Mouse. Sadly the figure is still on
292 probation, thanks to trademark laws and a the Disney corporations
293 powerful pack of lawyers, as described in the 2017 article
294 in &lt;a href=&quot;https://priceonomics.com/how-mickey-mouse-evades-the-public-domain/&quot;&gt;&quot;How
295 Mickey Mouse Evades the Public Domain&quot;&lt;/a&gt; from Priceonomics. On the
296 positive side, the primary driver for repeated extentions of the
297 duration of copyright has been Disney thanks to Mickey Mouse and the
298 2028 movie, and as it now in the public domain I hope it will cause
299 less urge to extend the already unreasonable long copyright
300 duration.&lt;/p&gt;
301
302 &lt;p&gt;The first book I published, the 2004 book &lt;a
303 href=&quot;https://free-culture.cc/&quot;&gt;&quot;Free Culture&quot; by Lawrence Lessig&lt;/a&gt;,
304 published 2015 in
305 &lt;a href=&quot;https://people.skolelinux.org/pere/publisher/#frikultur&quot;&gt;English,
306 French and Norwegian Bokmål&lt;/a&gt;, touch on the story of Disney pushed
307 for extending the copyright duration in USA. It is a great book
308 explaining problems with the current copyright regime and why we need
309 Creative Commons movement, and I strongly recommend everyone to read
310 it.&lt;/p&gt;
311
312 &lt;p&gt;This movie (with
313 &lt;a href=&quot;https://www.imdb.com/title/tt0019422/&quot;&gt;IMDB ID tt0019422&lt;/a&gt;)
314 is now available from the Internet Archive. Two copies have been
315 uploaded so far, one uploaded
316 &lt;a href=&quot;https://archive.org/details/SteamboatWillie&quot;&gt;2015-11-04&lt;/a&gt;
317 (&lt;a href=&quot;https://archive.org/download/SteamboatWillie/SteamboatWillie_archive.torrent&quot;&gt;torrent&lt;/a&gt;)
318 and the other
319 &lt;a href=&quot;https://archive.org/details/steamboat-willie-mickey&quot;&gt;2023-01-01&lt;/a&gt;
320 (&lt;a href=&quot;https://archive.org/download/steamboat-willie-mickey/steamboat-willie-mickey_archive.torrent&quot;&gt;torrent&lt;/a&gt;) - see
321 &lt;a href=&quot;https://people.skolelinux.org/pere/blog/VLC_bittorrent_plugin_still_going_strong__new_upload_2_14_4.html&quot;&gt;VLC
322 bittorrent plugin&lt;/a&gt; for streaming the video using the torrent link.
323 I am very happy to see
324 &lt;a href=&quot;https://people.skolelinux.org/pere/blog/Legal_to_share_more_than_16_000_movies_listed_on_IMDB_.html&quot;&gt;the
325 number of public domain movies&lt;/a&gt; increasing. I look forward to
326 when those are the majority. Perhaps it will reduce the urge of the
327 copyright industry to control its customers.&lt;/p&gt;
328
329 &lt;p&gt;A more
330 &lt;a href=&quot;https://publicdomainreview.org/features/entering-the-public-domain/2024/&quot;&gt;comprehensive
331 list of works entering the public domain in 2024&lt;/a&gt; is available from
332 the Public Domain Review.&lt;/p&gt;
333
334 &lt;p&gt;As usual, if you use Bitcoin and want to show your support of my
335 activities, please send Bitcoin donations to my address
336 &lt;b&gt;&lt;a href=&quot;bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&quot;&gt;15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;
337 </description>
338 </item>
339
340 <item>
341 <title>VLC bittorrent plugin still going strong, new upload 2.14-4</title>
342 <link>https://people.skolelinux.org/pere/blog/VLC_bittorrent_plugin_still_going_strong__new_upload_2_14_4.html</link>
343 <guid isPermaLink="true">https://people.skolelinux.org/pere/blog/VLC_bittorrent_plugin_still_going_strong__new_upload_2_14_4.html</guid>
344 <pubDate>Sun, 31 Dec 2023 10:45:00 +0100</pubDate>
345 <description>&lt;p&gt;The other day I uploaded a new version of
346 &lt;a href=&quot;https://tracker.debian.org/pkg/vlc-plugin-bittorrent&quot;&gt;the VLC
347 bittorrent plugin&lt;/a&gt; to Debian, version 2.14-4, to fix a few
348 packaging issues. This plugin extend VLC allowing it to stream videos
349 directly from a bittorrent source using both torrent files and magnet
350 links, as easy as using a HTTP or local file source. I believe such
351 protocol support is a vital feature in VLC, allowing efficient
352 streaming from sources such at the 11 million movies in
353 &lt;a href=&quot;https://archive.org/&quot;&gt;the Internet Archive&lt;/a&gt;. Bittorrent is
354 one of the most efficient content distribution protocols on the
355 Internet, without centralised control, and should be used more.&lt;/p&gt;
356
357 &lt;p&gt;The new version is now both in Debian Unstable and Testing, as well
358 as Ubuntu. While looking after the package, I decided to ask the VLC
359 upstream community if there was any hope to get Bittorrent support
360 into the official VLC program, and was very happy to learn that
361 someone is already working on it. I hope we can see some fruits of
362 that labour next year, but do not hold my breath. In the mean time we
363 can use the plugin, which is already
364 &lt;a href=&quot;https://qa.debian.org/popcon.php?package=vlc-plugin-bittorrent&quot;&gt;installed
365 by 0.23 percent of the Debian population&lt;/a&gt; according to
366 popularity-contest. It could use a new upstream release, and I hope
367 the upstream developer soon find time to polish it even more.&lt;/p&gt;
368
369 &lt;p&gt;It is worth noting that the plugin store the downloaded files in
370 &lt;tt&gt;~/Downloads/vlc-bittorrent/&lt;/tt&gt;, which can quickly fill up the
371 user home directory during use. Users of the plugin should keep an
372 eye with disk usage when streaming a bittorrent source.&lt;/p&gt;
373
374 &lt;p&gt;As usual, if you use Bitcoin and want to show your support of my
375 activities, please send Bitcoin donations to my address
376 &lt;b&gt;&lt;a href=&quot;bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&quot;&gt;15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;
377 </description>
378 </item>
379
380 <item>
381 <title>«Når «på» blir «pÃ¥»: Et reservoar av tegn sett fra depotet» i tidsskriftet Aksess</title>
382 <link>https://people.skolelinux.org/pere/blog/_N_r__p___blir__p_____Et_reservoar_av_tegn_sett_fra_depotet__i_tidsskriftet_Aksess.html</link>
383 <guid isPermaLink="true">https://people.skolelinux.org/pere/blog/_N_r__p___blir__p_____Et_reservoar_av_tegn_sett_fra_depotet__i_tidsskriftet_Aksess.html</guid>
384 <pubDate>Wed, 15 Nov 2023 09:20:00 +0100</pubDate>
385 <description>&lt;p&gt;For noen uker siden skrev en kamerat og meg
386 &lt;a href=&quot;https://www.aksess-tidsskrift.no/fordypning/175530&quot;&gt;en
387 artikkel om tegnsett&lt;/a&gt; i
388 &lt;a href=&quot;https://www.aksess-tidsskrift.no/&quot;&gt;arkivtidsskriftet
389 Aksess&lt;/a&gt; både på web og i papirutgave nr. 3 2023. Her er det som
390 nettopp ble publisert.&lt;/p&gt;
391
392 &lt;blockquote&gt;
393
394 &lt;p&gt;&lt;strong&gt;Når «på» blir «pÃ¥»: Et reservoar av tegn sett fra
395 depotet&lt;/strong&gt;&lt;/p&gt;
396
397 &lt;p&gt;av Thomas Sødring og Petter Reinholdtsen&lt;/p&gt;
398
399 &lt;p&gt;De færreste av oss tenker over hva som skjer dypere i datamaskinen
400 mens vi sitter der og skriver noe på tastaturet. Når du trykker på
401 tasten «Å», så vises bokstaven Å. Men noen ganger blir det
402 feil. Hvorfor det – og hva er viktig å være klar over i
403 arkivsammenheng?&lt;/p&gt;
404
405 &lt;p&gt;Dersom bokstaver tolkes forskjellig mellom systemer, blir det fort
406 rot, dette kalles mojibake blant kjennere, etter det japanske
407 uttrykket for tegnomforming. Det er en lang historie her som tidvis
408 har vært preget av rot. Noen husker kanskje tilbake til en tid der
409 bokstavene æ, ø og å ofte var ødelagt i e-poster – et klassisk
410 eksempel på tegnsettproblemstilling.&lt;/p&gt;
411
412 &lt;p id=&quot;tegnsett_access_nå_og_før&quot;&gt;&lt;strong&gt;«Nå» og «før»&lt;/strong&gt;&lt;/p&gt;
413
414 &lt;p&gt;Tid er et skjult problem for depot fordi vi danner dokumentasjon i
415 en kontekst som er preget av å være «nå». Vår forståelse av verden og
416 bruken av teknologi er utgangspunktet for denne konteksten. Tenk selv
417 hvordan verden har utviklet seg de siste 20 årene, hva samfunnet er
418 opptatt av, og hvordan vi bruker teknologi i hverdagen. Tid er et
419 skjult problem fordi når vi trekker dokumentasjon ut av systemer og
420 deponerer for langtidsbevaring, er konteksten til materialet «nå», men
421 verden går videre. Ettersom teknologien og måten vi bruker den på,
422 utvikler seg, blir «nå» til «før», og dokumentasjonen befinner seg
423 snart i en «før»-kontekst.&lt;/p&gt;
424
425 &lt;p&gt;Dette med «før» og «nå» i forhold til dokumentasjonens kontekst er
426 noe vi er veldig lite bevisste på, men det er en problemstilling
427 depotarkivene eier og forvalter. En av disse utfordringene er hvorfor
428 «Ø» ikke nødvendigvis er det samme som «Ø», og hvorfor det i det hele
429 tatt gir mening å si noe sånt. Vi snakker her om noe som heter
430 tegnsett, som er en avtalt måte å representere bokstaver, tall og
431 andre symboler på slik at vi på en feilfri måte kan utveksle tekst
432 mellom datasystemer.&lt;/p&gt;
433
434 &lt;p&gt;Tegnsettproblemstillingen er satt sammen av fire fasetter;
435 repertoar, representasjon, koding og uttegning.&lt;/p&gt;
436
437 &lt;p id=&quot;tegnsett_access_repertoarer&quot;&gt;&lt;strong&gt;Repertoarer&lt;/strong&gt;&lt;/p&gt;
438
439 &lt;p&gt;Repertoar er en samling med tegn og symboler som kan
440 representeres. Tenk norsk alfabet eller japanske piktogrammer, men
441 også matematiske og elektroniske symboler. Bokstaven «stor a» kan være
442 en oppføring i et slikt repertoar. For å kunne brukes i en datamaskin
443 trenger hver oppføring i et slikt repertoar en representasjon, hvilket
444 i datamaskinsammenheng betyr at det tilordnes et tall. Tallet kan
445 lagres på ulike vis i en eller flere kodingsformater. For eksempel kan
446 en skrive tallet ti som både 10, X og A, i henholdsvis
447 titallssystemet, romertallssystemet og sekstentallssystemet.&lt;/p&gt;
448
449 &lt;p&gt;Hvis en skal kunne lese inn filer og vite hvilket tall og hvilken
450 representasjon og instans i et repertoar det er snakk om, så må en
451 vite hvordan tallet er kodet. Sist, men ikke minst, for å kunne bruke
452 symbolet til noe må det kunne være kjent hvordan det skal se ut eller
453 tegnes på ark. Det finnes utallige skrifttyper med norske bokstaver,
454 alle litt forskjellige, og skal en kunne tegne en stor A på skjermen,
455 så må datamaskinen vite hva den skal tegne. Skrifttyper inneholder
456 informasjon om hvordan ulike tall skal tegnes. De inneholder ikke
457 alltid alle symbolene som er brukt i en tekst, hvilket gjør at ikke
458 alle forståtte tegn vil kunne vises på skjerm eller ark.&lt;/p&gt;
459
460 &lt;p&gt;Hver av disse fasettene må være avklart for å kunne ta vare på og vise
461 frem tekst med en datamaskin. Kombinasjon av repertoar, representasjon
462 og koding er det en kaller et tegnsett. Kombinasjonen av
463 representasjon og uttegning kalles en skrifttype. De fleste
464 skrifttyper har også informasjon om repertoar, men det finnes
465 skrifttyper som kun kobler mellom tallkode og uttegning, uten å
466 fortelle noe om hvordan tallkodene egentlig skal tolkes.&lt;/p&gt;
467
468 &lt;p id=&quot;tegnsett_access_fra_ascii_til_iso_8859&quot;&gt;&lt;strong&gt;Fra ASCII til ISO-8859&lt;/strong&gt;&lt;/p&gt;
469
470 &lt;p&gt;Vi begynner historien med ASCII (American Standard Code for
471 Information Interchange) som har en historie som spores tilbake til
472 1963. Utgangspunktet til ASCII var at det kunne kode opp til 128
473 forskjellige symboler i vanlig bruk i USA. De visuelle symbolene i
474 ASCII er de små og store bokstavene (a til z og A til Z), tall (0 til
475 9) og tegnsettingssymboler (for eksempel semikolon, komma og
476 punktum). ASCII har også noen usynlige symboler som ble brukt for
477 bl.a. kommunikasjon. Før ASCII var det for eksempel teleks-tegnsett
478 med plass til bare 32 tegn og EBCDIC med plass til 256 tegn, alle med
479 en helt annen rekkefølge på symbolene enn ASCII, men de har vært lite
480 brukt de siste femti årene. Et eksempel på noen utvalgte symboler i
481 repertoaret til ASCII vises i tabell 1.&lt;/p&gt;
482
483 &lt;table align=&quot;center&quot; width=&quot;50%&quot;&gt;
484
485 &lt;caption&gt;Tabell 1. Eksempel på utvalgte symboler hentet fra
486 ASCII-tegnsettet. Kolonnen «Binær» viser symbolets verdi i
487 totallssystemet (1 og 0 tall), mens kolonnen «Desimal» viser symbolets
488 verdi i titallssystemet.&lt;/caption&gt;
489
490 &lt;tbody&gt;
491 &lt;tr&gt;
492 &lt;th&gt;Grafisk&lt;/th&gt;
493 &lt;th&gt;Binær&lt;/th&gt;
494 &lt;th&gt;Desimal&lt;/th&gt;
495 &lt;/tr&gt;
496 &lt;tr&gt;
497 &lt;td&gt;A&lt;/td&gt;
498 &lt;td&gt;1000001&lt;/td&gt;
499 &lt;td align=&quot;right&quot;&gt;65&lt;/td&gt;
500 &lt;/tr&gt;
501 &lt;tr&gt;
502 &lt;td&gt;M&lt;/td&gt;
503 &lt;td&gt;1001101&lt;/td&gt;
504 &lt;td align=&quot;right&quot;&gt;77&lt;/td&gt;
505 &lt;/tr&gt;
506 &lt;tr&gt;
507 &lt;td&gt;Z&lt;/td&gt;
508 &lt;td&gt;1011010&lt;/td&gt;
509 &lt;td align=&quot;right&quot;&gt;90&lt;/td&gt;
510 &lt;/tr&gt;
511 &lt;tr&gt;
512 &lt;td&gt;a&lt;/td&gt;
513 &lt;td&gt;1100001&lt;/td&gt;
514 &lt;td align=&quot;right&quot;&gt;97&lt;/td&gt;
515 &lt;/tr&gt;
516 &lt;tr&gt;
517 &lt;td&gt;m&lt;/td&gt;
518 &lt;td&gt;1101101&lt;/td&gt;
519 &lt;td align=&quot;right&quot;&gt;109&lt;/td&gt;
520 &lt;/tr&gt;
521 &lt;tr&gt;
522 &lt;td&gt;z&lt;/td&gt;
523 &lt;td&gt;1111010&lt;/td&gt;
524 &lt;td align=&quot;right&quot;&gt;122&lt;/td&gt;
525 &lt;/tr&gt;
526 &lt;tr&gt;
527 &lt;td&gt;0&lt;/td&gt;
528 &lt;td&gt;0110000&lt;/td&gt;
529 &lt;td align=&quot;right&quot;&gt;48&lt;/td&gt;
530 &lt;/tr&gt;
531 &lt;tr&gt;
532 &lt;td&gt;9&lt;/td&gt;
533 &lt;td&gt;0111001&lt;/td&gt;
534 &lt;td align=&quot;right&quot;&gt;58&lt;/td&gt;
535 &lt;/tr&gt;
536 &lt;tr&gt;
537 &lt;td&gt;;&lt;/td&gt;
538 &lt;td&gt;0111011&lt;/td&gt;
539 &lt;td align=&quot;right&quot;&gt;59&lt;/td&gt;
540 &lt;/tr&gt;
541 &lt;/tbody&gt;
542 &lt;/table&gt;
543
544 &lt;p&gt;Det opprinnelige ASCII-tegnsettet ble også omtalt som ASCII-7 og
545 brukte 7 bits (0 og 1) for å representere symboler. Datamaskiner er
546 ofte konfigurert til å jobbe med enheter der bits er gruppert som 4
547 eller 8 bits . Det lå en mulighet i å ta i bruk bit åtte. En slik
548 endring ville gjøre det mulig for datamaskiner å øke antall symboler
549 de kunne representere, noe som ga en økning fra 128 forskjellige
550 symboler til 256 forskjellige symboler. Det ble åpnet for å innlemme
551 de nordiske bokstavene sammen med ASCII, og dette ble etter hvert
552 standardisert som ISO-8859-1. Tabell 2 viser deler av ISO-8859-1 som
553 støtter de norske bokstavene.&lt;/p&gt;
554
555 &lt;p&gt;Det sier seg selv at muligheten til å representere inntil 256 symboler
556 ikke holder når vi snakker om en global verden, og det ble gjort et
557 standardiseringsløp som tok utgangspunkt i ASCII-7 med en utvidelse
558 til å bruke den åttende biten for ulike språkgrupper. Denne standarden
559 heter ISO-8859 og er inndelt i opptil 16 varianter, altså fra
560 ISO-8859-1 til ISO-8859-16.&lt;/p&gt;
561
562 &lt;table align=&quot;center&quot; width=&quot;50%&quot;&gt;
563
564 &lt;caption&gt;Tabell 2. Koding av de norske symbolene slik de er definert i
565 ISO-8859-1 tegnsettet.&lt;/caption&gt;
566
567 &lt;tbody&gt;
568 &lt;tr&gt;
569 &lt;th&gt;Grafisk&lt;/th&gt;
570 &lt;th&gt;Binær&lt;/th&gt;
571 &lt;th&gt;Desimal&lt;/th&gt;
572 &lt;/tr&gt;
573 &lt;tr&gt;
574 &lt;td&gt;Æ&lt;/td&gt;
575 &lt;td&gt;11000110&lt;/td&gt;
576 &lt;td align=&quot;right&quot;&gt;198&lt;/td&gt;
577 &lt;/tr&gt;
578 &lt;tr&gt;
579 &lt;td&gt;Ø&lt;/td&gt;
580 &lt;td&gt;11011000&lt;/td&gt;
581 &lt;td align=&quot;right&quot;&gt;216&lt;/td&gt;
582 &lt;/tr&gt;
583 &lt;tr&gt;
584 &lt;td&gt;Å&lt;/td&gt;
585 &lt;td&gt;11000101&lt;/td&gt;
586 &lt;td align=&quot;right&quot;&gt;197&lt;/td&gt;
587 &lt;/tr&gt;
588 &lt;tr&gt;
589 &lt;td&gt;æ&lt;/td&gt;
590 &lt;td&gt;11100110&lt;/td&gt;
591 &lt;td align=&quot;right&quot;&gt;230&lt;/td&gt;
592 &lt;/tr&gt;
593 &lt;tr&gt;
594 &lt;td&gt;ø&lt;/td&gt;
595 &lt;td&gt;11111000&lt;/td&gt;
596 &lt;td align=&quot;right&quot;&gt;248&lt;/td&gt;
597 &lt;/tr&gt;
598 &lt;tr&gt;
599 &lt;td&gt;å&lt;/td&gt;
600 &lt;td&gt;11100101&lt;/td&gt;
601 &lt;td align=&quot;right&quot;&gt;229&lt;/td&gt;
602 &lt;/tr&gt;
603 &lt;/tbody&gt;
604 &lt;/table&gt;
605
606 &lt;p&gt;Norske tegn er definert i ISO-8859-1, som også omtales som Latin 1, de
607 fleste samiske tegn er definert i ISO-8859-4 (Latin 4) mens tilgang
608 til €-symbolet kom med ISO-8859-15 (Latin 9). ISO-8859-15 er en
609 revisjon av ISO-8859-1 som fjerner noen lite brukte symboler og
610 erstatter bokstaver som er mer brukt, og introduserer €-symbolet. Det
611 er viktig å merke at alle ISO-8859-variantene har overlapp med
612 ASCII-7, noe som ga samvirke med de engelskspråklige landene som ikke
613 trengte å gjøre noe. Det innebærer også at de første 128 verdiene i
614 ISO-8859-variantene representerer de samme symbolene. Det er først når
615 du kommer til tolkningen av de resterende 128 verdiene med nummer 128
616 til 255, at det oppsto tolkningsutfordringer mellom
617 ISO-8859-variantene.&lt;/p&gt;
618
619 &lt;p&gt;ISO-8859-verdenen fungerte godt så lenge tegnsettet som ble brukt når
620 innhold ble skapt, også ble brukt når innhold ble gjengitt og du ikke
621 trengte å kombinere innhold fra forskjellige tegnsett i samme
622 dokument. Utfordringen med bruken av ISO-8859-variantene ble raskt
623 tydelig i en mer globalisert verden med utveksling av tekst på tvers
624 av landegrenser der tekstlig innhold i dokumenter, e-poster og
625 websider kunne bli skrevet med ett tegnsett og gjengitt med et annet
626 tegnsett.&lt;/p&gt;
627
628 &lt;table align=&quot;center&quot; width=&quot;60%&quot;&gt;
629
630 &lt;caption&gt;Tabell 3. Viser tolkning av verdiene som er tilegnet de
631 norske symbolene i ISO-8859-1 i de andre ISO 8859-variatene. Merk
632 ISO-8859-12 ikke finnes da arbeidet ble avsluttet.&lt;sup&gt;[&lt;a id=&quot;tegnsett_access_footnoteref_1&quot; href=&quot;#tegnsett_access_footnotedef_1&quot; title=&quot;View footnote.&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;&lt;/caption&gt;
633
634 &lt;tbody&gt;
635 &lt;tr&gt;
636 &lt;th&gt;Binærverdi&lt;/th&gt;
637 &lt;th&gt;1&lt;/th&gt;
638 &lt;th&gt;2&lt;/th&gt;
639 &lt;th&gt;3&lt;/th&gt;
640 &lt;th&gt;4&lt;/th&gt;
641 &lt;th&gt;5&lt;/th&gt;
642 &lt;th&gt;6&lt;/th&gt;
643 &lt;th&gt;7&lt;/th&gt;
644 &lt;th&gt;8&lt;/th&gt;
645 &lt;th&gt;9&lt;/th&gt;
646 &lt;th&gt;10&lt;/th&gt;
647 &lt;th&gt;11&lt;/th&gt;
648 &lt;th&gt;13&lt;/th&gt;
649 &lt;th&gt;14&lt;/th&gt;
650 &lt;th&gt;15&lt;/th&gt;
651 &lt;th&gt;16&lt;/th&gt;
652 &lt;/tr&gt;
653 &lt;tr&gt;
654 &lt;td&gt;11000110&lt;/td&gt;
655 &lt;td&gt;Æ&lt;/td&gt;
656 &lt;td&gt;Ć&lt;/td&gt;
657 &lt;td&gt;Ĉ&lt;/td&gt;
658 &lt;td&gt;Æ&lt;/td&gt;
659 &lt;td&gt;Ц&lt;/td&gt;
660 &lt;td&gt;ئ&lt;/td&gt;
661 &lt;td&gt;Ζ&lt;/td&gt;
662 &lt;td&gt;&lt;/td&gt;
663 &lt;td&gt;Æ&lt;/td&gt;
664 &lt;td&gt;Æ&lt;/td&gt;
665 &lt;td&gt;&lt;/td&gt;
666 &lt;td&gt;Ę&lt;/td&gt;
667 &lt;td&gt;Æ&lt;/td&gt;
668 &lt;td&gt;Æ&lt;/td&gt;
669 &lt;td&gt;Æ&lt;/td&gt;
670 &lt;/tr&gt;
671 &lt;tr&gt;
672 &lt;td&gt;11011000&lt;/td&gt;
673 &lt;td&gt;Ø&lt;/td&gt;
674 &lt;td&gt;Ř&lt;/td&gt;
675 &lt;td&gt;Ĝ&lt;/td&gt;
676 &lt;td&gt;Ø&lt;/td&gt;
677 &lt;td&gt;и&lt;/td&gt;
678 &lt;td&gt;ظ&lt;/td&gt;
679 &lt;td&gt;Ψ&lt;/td&gt;
680 &lt;td&gt;&lt;/td&gt;
681 &lt;td&gt;Ø&lt;/td&gt;
682 &lt;td&gt;Ø&lt;/td&gt;
683 &lt;td&gt;&lt;/td&gt;
684 &lt;td&gt;Ų&lt;/td&gt;
685 &lt;td&gt;Ø&lt;/td&gt;
686 &lt;td&gt;Ø&lt;/td&gt;
687 &lt;td&gt;Ű&lt;/td&gt;
688 &lt;/tr&gt;
689 &lt;tr&gt;
690 &lt;td&gt;11000101&lt;/td&gt;
691 &lt;td&gt;Å&lt;/td&gt;
692 &lt;td&gt;Ĺ&lt;/td&gt;
693 &lt;td&gt;Ċ&lt;/td&gt;
694 &lt;td&gt;Å&lt;/td&gt;
695 &lt;td&gt;Х&lt;/td&gt;
696 &lt;td&gt;إ&lt;/td&gt;
697 &lt;td&gt;Ε&lt;/td&gt;
698 &lt;td&gt;&lt;/td&gt;
699 &lt;td&gt;Å&lt;/td&gt;
700 &lt;td&gt;Å&lt;/td&gt;
701 &lt;td&gt;&lt;/td&gt;
702 &lt;td&gt;Å&lt;/td&gt;
703 &lt;td&gt;Å&lt;/td&gt;
704 &lt;td&gt;Å&lt;/td&gt;
705 &lt;td&gt;Ć&lt;/td&gt;
706 &lt;/tr&gt;
707 &lt;tr&gt;
708 &lt;td&gt;11100110&lt;/td&gt;
709 &lt;td&gt;æ&lt;/td&gt;
710 &lt;td&gt;ć&lt;/td&gt;
711 &lt;td&gt;ĉ&lt;/td&gt;
712 &lt;td&gt;æ&lt;/td&gt;
713 &lt;td&gt;ц&lt;/td&gt;
714 &lt;td&gt;ن&lt;/td&gt;
715 &lt;td&gt;ζ&lt;/td&gt;
716 &lt;td&gt;ז&lt;/td&gt;
717 &lt;td&gt;æ&lt;/td&gt;
718 &lt;td&gt;æ&lt;/td&gt;
719 &lt;td&gt;&lt;/td&gt;
720 &lt;td&gt;ę&lt;/td&gt;
721 &lt;td&gt;æ&lt;/td&gt;
722 &lt;td&gt;æ&lt;/td&gt;
723 &lt;td&gt;v&lt;/td&gt;
724 &lt;/tr&gt;
725 &lt;tr&gt;
726 &lt;td&gt;11111000&lt;/td&gt;
727 &lt;td&gt;ø&lt;/td&gt;
728 &lt;td&gt;ř&lt;/td&gt;
729 &lt;td&gt;ĝ&lt;/td&gt;
730 &lt;td&gt;ø&lt;/td&gt;
731 &lt;td&gt;ј&lt;/td&gt;
732 &lt;td&gt;&lt;/td&gt;
733 &lt;td&gt;ψ&lt;/td&gt;
734 &lt;td&gt;ר&lt;/td&gt;
735 &lt;td&gt;ø&lt;/td&gt;
736 &lt;td&gt;ø&lt;/td&gt;
737 &lt;td&gt;&lt;/td&gt;
738 &lt;td&gt;ų&lt;/td&gt;
739 &lt;td&gt;ø&lt;/td&gt;
740 &lt;td&gt;ø&lt;/td&gt;
741 &lt;td&gt;ű&lt;/td&gt;
742 &lt;/tr&gt;
743 &lt;tr&gt;
744 &lt;td&gt;11100101&lt;/td&gt;
745 &lt;td&gt;å&lt;/td&gt;
746 &lt;td&gt;ĺ&lt;/td&gt;
747 &lt;td&gt;ċ&lt;/td&gt;
748 &lt;td&gt;å&lt;/td&gt;
749 &lt;td&gt;х&lt;/td&gt;
750 &lt;td&gt;م&lt;/td&gt;
751 &lt;td&gt;ε&lt;/td&gt;
752 &lt;td&gt;ו&lt;/td&gt;
753 &lt;td&gt;å&lt;/td&gt;
754 &lt;td&gt;å&lt;/td&gt;
755 &lt;td&gt;&lt;/td&gt;
756 &lt;td&gt;å&lt;/td&gt;
757 &lt;td&gt;å&lt;/td&gt;
758 &lt;td&gt;å&lt;/td&gt;
759 &lt;td&gt;ć&lt;/td&gt;
760 &lt;/tr&gt;
761 &lt;/tbody&gt;
762 &lt;/table&gt;
763
764 &lt;p&gt;Denne problemstillingen er illustrert i tabell 3, der vi ser verdiene
765 tilegnet de norske symbolene i ISO-8859-1 i kolonne «1». I de øvrige
766 kolonnene ser vi hvilket symbol verdien får i de andre
767 ISO-8859-variantene. Tar vi utgangspunkt i tabell 3, kan vi se at
768 ordet lærlingspørsmål gjengitt med ISO-8859-2 (kolonne 2) blir
769 lćrlingspřrsmĺl, mens det blir lζrlingspψrsmεl med ISO- 8859-7
770 (kolonne 7). Med ISO-8859-2 blir «æ» til «ć», «ø» til «ř» og «å» til
771 «ĺ». I ISO-8859-7 blir «æ» til «ζ», «ø» til «ψ», mens «å» blir «ε».&lt;/p&gt;
772
773 &lt;p&gt;Det er egentlig ingen utfordring med dette så lenge du vet hvilket
774 tegnsett innholdet ditt er representert med, og det ikke har skjedd
775 omforminger som du ikke er klar over. Det er det siste som er
776 problematisk, spesielt de datasystemene som har vært i bruk de siste
777 20 årene, som ikke har noe innebygd funksjonalitet for å forvalte
778 tegnsettproblematikken. Et godt eksempel på dette er
779 Microsoft-tegnsettet Windows-1252, som ble forvekslet som 100 %
780 kompatibel med ISO-8859-1, men hadde byttet ut plassene fra 127 til
781 159. Historisk vil det finnes en del variasjon i hvilket tegnsett som
782 har vært i bruk, og hvor vellykket konvertering mellom tegnsett har
783 vært.&lt;/p&gt;
784
785 &lt;p id=&quot;tegnsett_access_unicode_som_løsning&quot;&gt;&lt;strong&gt;Unicode som løsning&lt;/strong&gt;&lt;/p&gt;
786
787 &lt;p&gt;Tegnsettforvirring ble etter hvert et irritasjonsmoment og
788 samvirkeproblem. Ofte fikk man en e-post der æøå var erstattet av rare
789 symboler fordi e-posten hadde vært innom et eller annet datasystem som
790 ikke brukte samme tegnsett.&lt;/p&gt;
791
792 &lt;p&gt;For å løse dette samvirkeproblemet for tegnsett ble det startet et
793 arbeid og en ny standard så dagens lys etter hvert. Denne standarden
794 fikk navnet Unicode (ISO/ IEC 10646) og skulle resultere i et tegnsett
795 som alle skulle være enige om. Unicode er et repertoar og en
796 representasjon, dvs. navngivning og tilordning av tallverdi til alle
797 symboler i bruk i verden i dag. Oppføringer i Unicode skrives gjerne
798 U+XXXX der XXXX er tallkoden i sekstentallssystemet som oppføringen
799 har i Unicode-katalogen. Her finner vi tegn brukt av både levende og
800 døde språk, konstruerte språk, tekniske symboler, morsomme tegninger
801 (såkalte emojier) og tegn ingen vet hva betyr eller skal brukes
802 til. Et morsomt eksempel er i nettartikkelen: U+237C ⍼ RIGHT ANGLE
803 WITH DOWNWARDS ZIGZAG ARROW, av Jonathan Chan.&lt;sup&gt;[&lt;a id=&quot;tegnsett_access_footnoteref_2&quot; href=&quot;#tegnsett_access_footnotedef_2&quot; title=&quot;View footnote.&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
804
805 &lt;p&gt;Sammen med Unicode kom det tre måter å kode disse tallene på; UTF-8,
806 UTF-16 og UTF-32. Av datatekniske årsaker er UTF-8 mye brukt, spesielt
807 når det gjelder utveksling av tekst over Internett, mens UTF-16 er
808 brukt en del til tekstfiler lagret på Windows. En utfordring med
809 Unicode og UTF-variantene er at disse gir flere måter å kode samme
810 symbol på med en kombinasjonsmekanisme. Dette kan gi utfordringer ved
811 søk, hvis en skal søke etter et ord som har ett eller flere symboler
812 som kan skrives på ulikt vis, så er det ikke sikkert at søkesystemet
813 vil finne alle forekomster. For eksempel kan bokstaven U+00F8 «Latin
814 Small Letter O with Stroke» kodes som den tradisjonelle norske tegnet
815 ø, men også som o kombinert med skråstrek U+0338. Begge deler er
816 gyldig bruk av Unicode, selv om det er tradisjon for å foretrekke å
817 «normalisere» kombinasjoner som enkelttegn der det er mulig, nettopp
818 for å forenkle søk.&lt;/p&gt;
819
820 &lt;p id=&quot;tegnsett_access_bare_unicode_fremover&quot;&gt;&lt;strong&gt;Bare Unicode fremover&lt;/strong&gt;&lt;/p&gt;
821
822 &lt;p&gt;Forvaltningens bruk av tegnsett er regulert i Forskrift om
823 IT-standarder i offentlig forvaltning&lt;sup&gt;[&lt;a id=&quot;tegnsett_access_footnoteref_3&quot; href=&quot;#tegnsett_access_footnotedef_3&quot; title=&quot;View footnote.&quot;&gt;3&lt;/a&gt;]&lt;/sup&gt;. Her står det: «Ved all
824 utveksling av informasjon mellom forvaltningsorganer og fra
825 forvaltningsorgan til innbyggere og næringsliv skal tegnsettstandarden
826 ISO/IEC 10646 representert ved UTF8 benyttes.» Det er forskjellige
827 bruksområder til UTF-8, UTF-16 og UTF-32, men UTF-8 er kodingen vi
828 kjenner mest til. Det er flere grunner at UTF-8 «vant» konkurransen
829 til å bli den utvalgte. Den kanskje viktigste er at UTF-8 er fullt
830 samvirkende med ASCII-7, slik at den engelskspråklige delen av verden
831 kunne rulle ut UTF-8 uten å merke noe forskjell. En tekstfil med kun
832 ASCII-tekst vil være identisk på disken hvis den lagres som UTF-8 og
833 ASCII. UTF-16 og UTF-32 byr på noen optimaliseringer som gjør dem
834 relevant for spesifikke problemområder, men for det meste vil vi aldri
835 oppleve disse standardene på nært hold i hverdagen. Det er uansett kun
836 bruken av UTF-8 som er lovregulert i Norge.&lt;/p&gt;
837
838 &lt;p&gt;Det er ikke slik at hele verden bruker ISO/IEC 10646 og UTF-8. Kina
839 har egne standarder for tegnsett, mye brukt er GB 18030, som er
840 Unicode med en annen koding enn UTF-8, mens Taiwan og andre asiatiske
841 land gjerne bruker Big5 eller andre tegnsett.&lt;/p&gt;
842
843 &lt;p&gt;UTF-8 er dominerende i Norge, men det er tidsperioder der forskjellige
844 datasystemer utvekslet data i henhold til ISO-8859-1, ISO-8859-15,
845 Windows-1252, Codepage 865 og ISO-646-60 / Codepage 1016 mens
846 overgangen til UTF-8 pågikk. Det er ikke slik at et datasystem enkelt
847 kan tvinges til å bruke et tegnsett, da det er flere lag i et
848 datasystem som må settes opp til å bruke riktig tegnsett, og
849 tegnsettproblemet fort oppstår når det er et eller annet i
850 datasystemet som bruker feil tegnsett.&lt;/p&gt;
851
852 &lt;p&gt;Et klassisk eksempel på problemet er en utveksling av tekst mellom to
853 systemer der teksten i utgangspunktet er kodet i UTF-8, men går
854 gjennom noe som er ISO-8859-1 underveis. Dette kan vises med at ordet
855 «på» i et slik scenario ender opp som «pÃ¥». Det er mulig å spore
856 dette tilbake til verdiene symbolene er tilordnet i tegnsettene. «på»
857 blir til «pÃ¥» fordi «å» i UTF-8 er representert med U+C3AF, og dersom
858 vi ser på hva disse verdiene representerer, ser vi at
859 sekstentallssystemverdien C3 er 1100 0011 i totallssystemet og
860 symbolet med dette tallet i ISO-8859-1 er Ã.&lt;/p&gt;
861
862 &lt;p&gt;Vi ser det samme med sekstentallssystemverdien A5, som er 1010 0101 i
863 totallssystemet, og tilsvarende symbol i ISO-8859-1 er ¥. Slik
864 mojibake kan lett skje hvis «på» i utgangspunktet var representert med
865 UTF-8, men ble behandlet med et system som bruker ISO-8859-1. Det er
866 ingen automatikk i å fange opp slike ødeleggelser mens tekstlig
867 innhold utveksles mellom datasystemer.&lt;/p&gt;
868
869 &lt;p&gt;En utfordring for depotarkivene er at bruken av tegnsett ikke alltid
870 har vært regulert, og at det kan finnes flere dokumentasjonssamlinger
871 som er opprettet med varierende tegnsett før gjeldende forskrift
872 inntraff – uten at det er mulig å avlede fra filene hvilket tegnsett
873 som ble brukt. Et eksempel på dette er €-symbolet, som kom først etter
874 at ISO-8859-1 var tatt i bruk. Det kan bli en utfordring for et
875 depotarkiv, men så lenge det er kjent hvilket tegnsett var i bruk, så
876 bør det gå bra. Riksarkivarens
877 forskrift&lt;sup&gt;[&lt;a id=&quot;tegnsett_access_footnoteref_4&quot; href=&quot;#tegnsett_access_footnotedef_4&quot; title=&quot;View footnote.&quot;&gt;4&lt;/a&gt;]&lt;/sup&gt;
878 formaliserer dette ved å kreve følgende:&lt;/p&gt;
879
880 &lt;blockquote&gt;
881 &lt;p&gt;§ 5-11. Tegnsett i arkivuttrekk&lt;/p&gt;
882
883 &lt;ol&gt;
884 &lt;li&gt;Arkivuttrekk og medfølgende struktur- og innholdsbeskrivelser skal
885 overføres som ren tekst i ukryptert form, og benytte godkjent
886 tegnsett.&lt;/li&gt;
887
888 &lt;li&gt;Godkjente tegnsett er:
889 &lt;ol&gt;
890 &lt;li&gt;Unicode UTF-8&lt;br&gt;
891 (ISO/IEC 10646-1:2000 Annex D)&lt;/li&gt;
892 &lt;li&gt;ISO 8859-1:1998, Latin 1&lt;/li&gt;
893 &lt;li&gt;ISO 8859-4:1998, Latin 4 for samiske tegn.&lt;/li&gt;
894 &lt;/ol&gt;&lt;/li&gt;
895
896 &lt;li&gt;Andre tegnsett aksepteres bare etter avtale med Arkivverket.&lt;/li&gt;
897 &lt;/ol&gt;
898 &lt;/blockquote&gt;
899
900 &lt;p id=&quot;tegnsett_access_ditt_ansvar&quot;&gt;&lt;strong&gt;Ditt ansvar&lt;/strong&gt;&lt;/p&gt;
901
902 &lt;p&gt;På mange måter burde ikke tegnsett være et problem i 2023, men sånn er
903 det nok ikke. Land som har oppgradert til UTF-8 som primærtegnsett for
904 utveksling av tekstlig innhold, begrenser problematikken betraktelig,
905 men globalt sett så er tegnsettutfordringen ikke løst fordi ikke alle
906 er enige om å bruke samme tegnsett. Det kan være geopolitiske eller
907 kulturelle hensyn som ligger til grunn for dette.&lt;/p&gt;
908
909 &lt;p&gt;Det er uansett verdt å merke at selv om bruken av UTF-8 skulle bli
910 100% utbredt, så er det et historisk perspektiv (ASCII-7,
911 ISO-8859-variantene, UTF-8) her som gjør tegnsett til et problemområde
912 arkivarene må forstå og håndtere. Som danningsarkivar har du et
913 ansvar for å vite hvilket tegnsett systemene og databasene dere
914 forvalter, er i samsvar med. Det er noe IT-avdelingen din eller
915 programvareleverandørene enkelt skal kunne svare på, og svaret skal
916 være UTF-8 for alle nye systemer.&lt;/p&gt;
917
918 &lt;hr&gt;
919
920 &lt;p id=&quot;tegnsett_access_footnotedef_1&quot;&gt;&lt;a href=&quot;#tegnsett_access_footnoteref_1&quot;&gt;1&lt;/a&gt;. Tegnsettkilde &lt;a href=&quot;https://en.wikipedia.org/wiki/ISO/IEC_8859&quot;&gt;https://en.wikipedia.org/wiki/ISO/IEC_8859&lt;/a&gt;&lt;/p&gt;
921
922 &lt;p id=&quot;tegnsett_access_footnotedef_2&quot;&gt;&lt;a href=&quot;#tegnsett_access_footnoteref_2&quot;&gt;2&lt;/a&gt;. &lt;a href=&quot;https://ionathan.ch/2022/04/09/angzarr.html&quot;&gt;https://ionathan.ch/2022/04/09/angzarr.html&lt;/a&gt;&lt;/p&gt;
923
924 &lt;p id=&quot;tegnsett_access_footnotedef_3&quot;&gt;&lt;a href=&quot;#tegnsett_access_footnoteref_3&quot;&gt;3&lt;/a&gt;. &lt;a href=&quot;https://lovdata.no/dokument/SF/forskrift/2013-04-05-959/%C2%A78#%C2%A78&quot;&gt;https://lovdata.no/dokument/SF/forskrift/2013-04-05-959/%C2%A78#%C2%A78&lt;/a&gt;&lt;/p&gt;
925
926 &lt;p id=&quot;tegnsett_access_footnotedef_4&quot;&gt;&lt;a href=&quot;#tegnsett_access_footnoteref_4&quot;&gt;4&lt;/a&gt;. &lt;a href=&quot;https://lovdata.no/forskrift/2017-12-19-22865-11&quot;&gt;https://lovdata.no/forskrift/2017-12-19-22865-11&lt;/a&gt;&lt;/p&gt;
927
928 &lt;/blockquote&gt;
929
930 &lt;p&gt;For øvrig burde varsleren Edward Snowden få politisk asyl i Norge.&lt;/p&gt;
931
932 &lt;p&gt;Som vanlig, hvis du bruker Bitcoin og ønsker å vise din støtte til
933 det jeg driver med, setter jeg pris på om du sender Bitcoin-donasjoner
934 til min adresse
935 &lt;b&gt;&lt;a href=&quot;bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&quot;&gt;15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&lt;/a&gt;&lt;/b&gt;. Merk,
936 betaling med bitcoin er ikke anonymt. :)&lt;/p&gt;
937 </description>
938 </item>
939
940 <item>
941 <title>New and improved sqlcipher in Debian for accessing Signal database</title>
942 <link>https://people.skolelinux.org/pere/blog/New_and_improved_sqlcipher_in_Debian_for_accessing_Signal_database.html</link>
943 <guid isPermaLink="true">https://people.skolelinux.org/pere/blog/New_and_improved_sqlcipher_in_Debian_for_accessing_Signal_database.html</guid>
944 <pubDate>Sun, 12 Nov 2023 12:00:00 +0100</pubDate>
945 <description>&lt;p&gt;For a while now I wanted to have direct access to the
946 &lt;a href=&quot;https://signal.org/&quot;&gt;Signal&lt;/a&gt; database of messages and
947 channels of my Desktop edition of Signal. I prefer the enforced end
948 to end encryption of Signal these days for my communication with
949 friends and family, to increase the level of safety and privacy as
950 well as raising the cost of the mass surveillance government and
951 non-government entities practice these days. In August I came across
952 a nice
953 &lt;a href=&quot;https://www.yoranbrondsema.com/post/the-guide-to-extracting-statistics-from-your-signal-conversations/&quot;&gt;recipe
954 on how to use sqlcipher to extract statistics from the Signal
955 database&lt;/a&gt; explaining how to do this. Unfortunately this did not
956 work with the version of sqlcipher in Debian. The
957 &lt;a href=&quot;http://tracker.debian.org/sqlcipher/&quot;&gt;sqlcipher&lt;/a&gt;
958 package is a &quot;fork&quot; of the sqlite package with added support for
959 encrypted databases. Sadly the current Debian maintainer
960 &lt;a href=&quot;https://bugs.debian.org/961598&quot;&gt;announced more than three
961 years ago that he did not have time to maintain sqlcipher&lt;/a&gt;, so it
962 seemed unlikely to be upgraded by the maintainer. I was reluctant to
963 take on the job myself, as I have very limited experience maintaining
964 shared libraries in Debian. After waiting and hoping for a few
965 months, I gave up the last week, and set out to update the package. In
966 the process I orphaned it to make it more obvious for the next person
967 looking at it that the package need proper maintenance.&lt;/p&gt;
968
969 &lt;p&gt;The version in Debian was around five years old, and quite a lot of
970 changes had taken place upstream into the Debian maintenance git
971 repository. After spending a few days importing the new upstream
972 versions, realising that upstream did not care much for SONAME
973 versioning as I saw library symbols being both added and removed with
974 minor version number changes to the project, I concluded that I had to
975 do a SONAME bump of the library package to avoid surprising the
976 reverse dependencies. I even added a simple
977 autopkgtest script to ensure the package work as intended. Dug deep
978 into the hole of learning shared library maintenance, I set out a few
979 days ago to upload the new version to Debian experimental to see what
980 the quality assurance framework in Debian had to say about the result.
981 The feedback told me the pacakge was not too shabby, and yesterday I
982 uploaded the latest version to Debian unstable. It should enter
983 testing today or tomorrow, perhaps delayed by
984 &lt;a href=&quot;https://bugs.debian.org/1055812&quot;&gt;a small library
985 transition&lt;/a&gt;.&lt;/p&gt;
986
987 &lt;p&gt;Armed with a new version of sqlcipher, I can now have a look at the
988 SQL database in ~/.config/Signal/sql/db.sqlite. First, one need to
989 fetch the encryption key from the Signal configuration using this
990 simple JSON extraction command:&lt;/p&gt;
991
992 &lt;pre&gt;/usr/bin/jq -r &#39;.&quot;key&quot;&#39; ~/.config/Signal/config.json&lt;/pre&gt;
993
994 &lt;p&gt;Assuming the result from that command is &#39;secretkey&#39;, which is a
995 hexadecimal number representing the key used to encrypt the database.
996 Next, one can now connect to the database and inject the encryption
997 key for access via SQL to fetch information from the database. Here
998 is an example dumping the database structure:&lt;/p&gt;
999
1000 &lt;pre&gt;
1001 % sqlcipher ~/.config/Signal/sql/db.sqlite
1002 sqlite&gt; PRAGMA key = &quot;x&#39;secretkey&#39;&quot;;
1003 sqlite&gt; .schema
1004 CREATE TABLE sqlite_stat1(tbl,idx,stat);
1005 CREATE TABLE conversations(
1006 id STRING PRIMARY KEY ASC,
1007 json TEXT,
1008
1009 active_at INTEGER,
1010 type STRING,
1011 members TEXT,
1012 name TEXT,
1013 profileName TEXT
1014 , profileFamilyName TEXT, profileFullName TEXT, e164 TEXT, serviceId TEXT, groupId TEXT, profileLastFetchedAt INTEGER);
1015 CREATE TABLE identityKeys(
1016 id STRING PRIMARY KEY ASC,
1017 json TEXT
1018 );
1019 CREATE TABLE items(
1020 id STRING PRIMARY KEY ASC,
1021 json TEXT
1022 );
1023 CREATE TABLE sessions(
1024 id TEXT PRIMARY KEY,
1025 conversationId TEXT,
1026 json TEXT
1027 , ourServiceId STRING, serviceId STRING);
1028 CREATE TABLE attachment_downloads(
1029 id STRING primary key,
1030 timestamp INTEGER,
1031 pending INTEGER,
1032 json TEXT
1033 );
1034 CREATE TABLE sticker_packs(
1035 id TEXT PRIMARY KEY,
1036 key TEXT NOT NULL,
1037
1038 author STRING,
1039 coverStickerId INTEGER,
1040 createdAt INTEGER,
1041 downloadAttempts INTEGER,
1042 installedAt INTEGER,
1043 lastUsed INTEGER,
1044 status STRING,
1045 stickerCount INTEGER,
1046 title STRING
1047 , attemptedStatus STRING, position INTEGER DEFAULT 0 NOT NULL, storageID STRING, storageVersion INTEGER, storageUnknownFields BLOB, storageNeedsSync
1048 INTEGER DEFAULT 0 NOT NULL);
1049 CREATE TABLE stickers(
1050 id INTEGER NOT NULL,
1051 packId TEXT NOT NULL,
1052
1053 emoji STRING,
1054 height INTEGER,
1055 isCoverOnly INTEGER,
1056 lastUsed INTEGER,
1057 path STRING,
1058 width INTEGER,
1059
1060 PRIMARY KEY (id, packId),
1061 CONSTRAINT stickers_fk
1062 FOREIGN KEY (packId)
1063 REFERENCES sticker_packs(id)
1064 ON DELETE CASCADE
1065 );
1066 CREATE TABLE sticker_references(
1067 messageId STRING,
1068 packId TEXT,
1069 CONSTRAINT sticker_references_fk
1070 FOREIGN KEY(packId)
1071 REFERENCES sticker_packs(id)
1072 ON DELETE CASCADE
1073 );
1074 CREATE TABLE emojis(
1075 shortName TEXT PRIMARY KEY,
1076 lastUsage INTEGER
1077 );
1078 CREATE TABLE messages(
1079 rowid INTEGER PRIMARY KEY ASC,
1080 id STRING UNIQUE,
1081 json TEXT,
1082 readStatus INTEGER,
1083 expires_at INTEGER,
1084 sent_at INTEGER,
1085 schemaVersion INTEGER,
1086 conversationId STRING,
1087 received_at INTEGER,
1088 source STRING,
1089 hasAttachments INTEGER,
1090 hasFileAttachments INTEGER,
1091 hasVisualMediaAttachments INTEGER,
1092 expireTimer INTEGER,
1093 expirationStartTimestamp INTEGER,
1094 type STRING,
1095 body TEXT,
1096 messageTimer INTEGER,
1097 messageTimerStart INTEGER,
1098 messageTimerExpiresAt INTEGER,
1099 isErased INTEGER,
1100 isViewOnce INTEGER,
1101 sourceServiceId TEXT, serverGuid STRING NULL, sourceDevice INTEGER, storyId STRING, isStory INTEGER
1102 GENERATED ALWAYS AS (type IS &#39;story&#39;), isChangeCreatedByUs INTEGER NOT NULL DEFAULT 0, isTimerChangeFromSync INTEGER
1103 GENERATED ALWAYS AS (
1104 json_extract(json, &#39;$.expirationTimerUpdate.fromSync&#39;) IS 1
1105 ), seenStatus NUMBER default 0, storyDistributionListId STRING, expiresAt INT
1106 GENERATED ALWAYS
1107 AS (ifnull(
1108 expirationStartTimestamp + (expireTimer * 1000),
1109 9007199254740991
1110 )), shouldAffectActivity INTEGER
1111 GENERATED ALWAYS AS (
1112 type IS NULL
1113 OR
1114 type NOT IN (
1115 &#39;change-number-notification&#39;,
1116 &#39;contact-removed-notification&#39;,
1117 &#39;conversation-merge&#39;,
1118 &#39;group-v1-migration&#39;,
1119 &#39;keychange&#39;,
1120 &#39;message-history-unsynced&#39;,
1121 &#39;profile-change&#39;,
1122 &#39;story&#39;,
1123 &#39;universal-timer-notification&#39;,
1124 &#39;verified-change&#39;
1125 )
1126 ), shouldAffectPreview INTEGER
1127 GENERATED ALWAYS AS (
1128 type IS NULL
1129 OR
1130 type NOT IN (
1131 &#39;change-number-notification&#39;,
1132 &#39;contact-removed-notification&#39;,
1133 &#39;conversation-merge&#39;,
1134 &#39;group-v1-migration&#39;,
1135 &#39;keychange&#39;,
1136 &#39;message-history-unsynced&#39;,
1137 &#39;profile-change&#39;,
1138 &#39;story&#39;,
1139 &#39;universal-timer-notification&#39;,
1140 &#39;verified-change&#39;
1141 )
1142 ), isUserInitiatedMessage INTEGER
1143 GENERATED ALWAYS AS (
1144 type IS NULL
1145 OR
1146 type NOT IN (
1147 &#39;change-number-notification&#39;,
1148 &#39;contact-removed-notification&#39;,
1149 &#39;conversation-merge&#39;,
1150 &#39;group-v1-migration&#39;,
1151 &#39;group-v2-change&#39;,
1152 &#39;keychange&#39;,
1153 &#39;message-history-unsynced&#39;,
1154 &#39;profile-change&#39;,
1155 &#39;story&#39;,
1156 &#39;universal-timer-notification&#39;,
1157 &#39;verified-change&#39;
1158 )
1159 ), mentionsMe INTEGER NOT NULL DEFAULT 0, isGroupLeaveEvent INTEGER
1160 GENERATED ALWAYS AS (
1161 type IS &#39;group-v2-change&#39; AND
1162 json_array_length(json_extract(json, &#39;$.groupV2Change.details&#39;)) IS 1 AND
1163 json_extract(json, &#39;$.groupV2Change.details[0].type&#39;) IS &#39;member-remove&#39; AND
1164 json_extract(json, &#39;$.groupV2Change.from&#39;) IS NOT NULL AND
1165 json_extract(json, &#39;$.groupV2Change.from&#39;) IS json_extract(json, &#39;$.groupV2Change.details[0].aci&#39;)
1166 ), isGroupLeaveEventFromOther INTEGER
1167 GENERATED ALWAYS AS (
1168 isGroupLeaveEvent IS 1
1169 AND
1170 isChangeCreatedByUs IS 0
1171 ), callId TEXT
1172 GENERATED ALWAYS AS (
1173 json_extract(json, &#39;$.callId&#39;)
1174 ));
1175 CREATE TABLE sqlite_stat4(tbl,idx,neq,nlt,ndlt,sample);
1176 CREATE TABLE jobs(
1177 id TEXT PRIMARY KEY,
1178 queueType TEXT STRING NOT NULL,
1179 timestamp INTEGER NOT NULL,
1180 data STRING TEXT
1181 );
1182 CREATE TABLE reactions(
1183 conversationId STRING,
1184 emoji STRING,
1185 fromId STRING,
1186 messageReceivedAt INTEGER,
1187 targetAuthorAci STRING,
1188 targetTimestamp INTEGER,
1189 unread INTEGER
1190 , messageId STRING);
1191 CREATE TABLE senderKeys(
1192 id TEXT PRIMARY KEY NOT NULL,
1193 senderId TEXT NOT NULL,
1194 distributionId TEXT NOT NULL,
1195 data BLOB NOT NULL,
1196 lastUpdatedDate NUMBER NOT NULL
1197 );
1198 CREATE TABLE unprocessed(
1199 id STRING PRIMARY KEY ASC,
1200 timestamp INTEGER,
1201 version INTEGER,
1202 attempts INTEGER,
1203 envelope TEXT,
1204 decrypted TEXT,
1205 source TEXT,
1206 serverTimestamp INTEGER,
1207 sourceServiceId STRING
1208 , serverGuid STRING NULL, sourceDevice INTEGER, receivedAtCounter INTEGER, urgent INTEGER, story INTEGER);
1209 CREATE TABLE sendLogPayloads(
1210 id INTEGER PRIMARY KEY ASC,
1211
1212 timestamp INTEGER NOT NULL,
1213 contentHint INTEGER NOT NULL,
1214 proto BLOB NOT NULL
1215 , urgent INTEGER, hasPniSignatureMessage INTEGER DEFAULT 0 NOT NULL);
1216 CREATE TABLE sendLogRecipients(
1217 payloadId INTEGER NOT NULL,
1218
1219 recipientServiceId STRING NOT NULL,
1220 deviceId INTEGER NOT NULL,
1221
1222 PRIMARY KEY (payloadId, recipientServiceId, deviceId),
1223
1224 CONSTRAINT sendLogRecipientsForeignKey
1225 FOREIGN KEY (payloadId)
1226 REFERENCES sendLogPayloads(id)
1227 ON DELETE CASCADE
1228 );
1229 CREATE TABLE sendLogMessageIds(
1230 payloadId INTEGER NOT NULL,
1231
1232 messageId STRING NOT NULL,
1233
1234 PRIMARY KEY (payloadId, messageId),
1235
1236 CONSTRAINT sendLogMessageIdsForeignKey
1237 FOREIGN KEY (payloadId)
1238 REFERENCES sendLogPayloads(id)
1239 ON DELETE CASCADE
1240 );
1241 CREATE TABLE preKeys(
1242 id STRING PRIMARY KEY ASC,
1243 json TEXT
1244 , ourServiceId NUMBER
1245 GENERATED ALWAYS AS (json_extract(json, &#39;$.ourServiceId&#39;)));
1246 CREATE TABLE signedPreKeys(
1247 id STRING PRIMARY KEY ASC,
1248 json TEXT
1249 , ourServiceId NUMBER
1250 GENERATED ALWAYS AS (json_extract(json, &#39;$.ourServiceId&#39;)));
1251 CREATE TABLE badges(
1252 id TEXT PRIMARY KEY,
1253 category TEXT NOT NULL,
1254 name TEXT NOT NULL,
1255 descriptionTemplate TEXT NOT NULL
1256 );
1257 CREATE TABLE badgeImageFiles(
1258 badgeId TEXT REFERENCES badges(id)
1259 ON DELETE CASCADE
1260 ON UPDATE CASCADE,
1261 &#39;order&#39; INTEGER NOT NULL,
1262 url TEXT NOT NULL,
1263 localPath TEXT,
1264 theme TEXT NOT NULL
1265 );
1266 CREATE TABLE storyReads (
1267 authorId STRING NOT NULL,
1268 conversationId STRING NOT NULL,
1269 storyId STRING NOT NULL,
1270 storyReadDate NUMBER NOT NULL,
1271
1272 PRIMARY KEY (authorId, storyId)
1273 );
1274 CREATE TABLE storyDistributions(
1275 id STRING PRIMARY KEY NOT NULL,
1276 name TEXT,
1277
1278 senderKeyInfoJson STRING
1279 , deletedAtTimestamp INTEGER, allowsReplies INTEGER, isBlockList INTEGER, storageID STRING, storageVersion INTEGER, storageUnknownFields BLOB, storageNeedsSync INTEGER);
1280 CREATE TABLE storyDistributionMembers(
1281 listId STRING NOT NULL REFERENCES storyDistributions(id)
1282 ON DELETE CASCADE
1283 ON UPDATE CASCADE,
1284 serviceId STRING NOT NULL,
1285
1286 PRIMARY KEY (listId, serviceId)
1287 );
1288 CREATE TABLE uninstalled_sticker_packs (
1289 id STRING NOT NULL PRIMARY KEY,
1290 uninstalledAt NUMBER NOT NULL,
1291 storageID STRING,
1292 storageVersion NUMBER,
1293 storageUnknownFields BLOB,
1294 storageNeedsSync INTEGER NOT NULL
1295 );
1296 CREATE TABLE groupCallRingCancellations(
1297 ringId INTEGER PRIMARY KEY,
1298 createdAt INTEGER NOT NULL
1299 );
1300 CREATE TABLE IF NOT EXISTS &#39;messages_fts_data&#39;(id INTEGER PRIMARY KEY, block BLOB);
1301 CREATE TABLE IF NOT EXISTS &#39;messages_fts_idx&#39;(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
1302 CREATE TABLE IF NOT EXISTS &#39;messages_fts_content&#39;(id INTEGER PRIMARY KEY, c0);
1303 CREATE TABLE IF NOT EXISTS &#39;messages_fts_docsize&#39;(id INTEGER PRIMARY KEY, sz BLOB);
1304 CREATE TABLE IF NOT EXISTS &#39;messages_fts_config&#39;(k PRIMARY KEY, v) WITHOUT ROWID;
1305 CREATE TABLE edited_messages(
1306 messageId STRING REFERENCES messages(id)
1307 ON DELETE CASCADE,
1308 sentAt INTEGER,
1309 readStatus INTEGER
1310 , conversationId STRING);
1311 CREATE TABLE mentions (
1312 messageId REFERENCES messages(id) ON DELETE CASCADE,
1313 mentionAci STRING,
1314 start INTEGER,
1315 length INTEGER
1316 );
1317 CREATE TABLE kyberPreKeys(
1318 id STRING PRIMARY KEY NOT NULL,
1319 json TEXT NOT NULL, ourServiceId NUMBER
1320 GENERATED ALWAYS AS (json_extract(json, &#39;$.ourServiceId&#39;)));
1321 CREATE TABLE callsHistory (
1322 callId TEXT PRIMARY KEY,
1323 peerId TEXT NOT NULL, -- conversation id (legacy) | uuid | groupId | roomId
1324 ringerId TEXT DEFAULT NULL, -- ringer uuid
1325 mode TEXT NOT NULL, -- enum &quot;Direct&quot; | &quot;Group&quot;
1326 type TEXT NOT NULL, -- enum &quot;Audio&quot; | &quot;Video&quot; | &quot;Group&quot;
1327 direction TEXT NOT NULL, -- enum &quot;Incoming&quot; | &quot;Outgoing
1328 -- Direct: enum &quot;Pending&quot; | &quot;Missed&quot; | &quot;Accepted&quot; | &quot;Deleted&quot;
1329 -- Group: enum &quot;GenericGroupCall&quot; | &quot;OutgoingRing&quot; | &quot;Ringing&quot; | &quot;Joined&quot; | &quot;Missed&quot; | &quot;Declined&quot; | &quot;Accepted&quot; | &quot;Deleted&quot;
1330 status TEXT NOT NULL,
1331 timestamp INTEGER NOT NULL,
1332 UNIQUE (callId, peerId) ON CONFLICT FAIL
1333 );
1334 [ dropped all indexes to save space in this blog post ]
1335 CREATE TRIGGER messages_on_view_once_update AFTER UPDATE ON messages
1336 WHEN
1337 new.body IS NOT NULL AND new.isViewOnce = 1
1338 BEGIN
1339 DELETE FROM messages_fts WHERE rowid = old.rowid;
1340 END;
1341 CREATE TRIGGER messages_on_insert AFTER INSERT ON messages
1342 WHEN new.isViewOnce IS NOT 1 AND new.storyId IS NULL
1343 BEGIN
1344 INSERT INTO messages_fts
1345 (rowid, body)
1346 VALUES
1347 (new.rowid, new.body);
1348 END;
1349 CREATE TRIGGER messages_on_delete AFTER DELETE ON messages BEGIN
1350 DELETE FROM messages_fts WHERE rowid = old.rowid;
1351 DELETE FROM sendLogPayloads WHERE id IN (
1352 SELECT payloadId FROM sendLogMessageIds
1353 WHERE messageId = old.id
1354 );
1355 DELETE FROM reactions WHERE rowid IN (
1356 SELECT rowid FROM reactions
1357 WHERE messageId = old.id
1358 );
1359 DELETE FROM storyReads WHERE storyId = old.storyId;
1360 END;
1361 CREATE VIRTUAL TABLE messages_fts USING fts5(
1362 body,
1363 tokenize = &#39;signal_tokenizer&#39;
1364 );
1365 CREATE TRIGGER messages_on_update AFTER UPDATE ON messages
1366 WHEN
1367 (new.body IS NULL OR old.body IS NOT new.body) AND
1368 new.isViewOnce IS NOT 1 AND new.storyId IS NULL
1369 BEGIN
1370 DELETE FROM messages_fts WHERE rowid = old.rowid;
1371 INSERT INTO messages_fts
1372 (rowid, body)
1373 VALUES
1374 (new.rowid, new.body);
1375 END;
1376 CREATE TRIGGER messages_on_insert_insert_mentions AFTER INSERT ON messages
1377 BEGIN
1378 INSERT INTO mentions (messageId, mentionAci, start, length)
1379
1380 SELECT messages.id, bodyRanges.value -&gt;&gt; &#39;mentionAci&#39; as mentionAci,
1381 bodyRanges.value -&gt;&gt; &#39;start&#39; as start,
1382 bodyRanges.value -&gt;&gt; &#39;length&#39; as length
1383 FROM messages, json_each(messages.json -&gt;&gt; &#39;bodyRanges&#39;) as bodyRanges
1384 WHERE bodyRanges.value -&gt;&gt; &#39;mentionAci&#39; IS NOT NULL
1385
1386 AND messages.id = new.id;
1387 END;
1388 CREATE TRIGGER messages_on_update_update_mentions AFTER UPDATE ON messages
1389 BEGIN
1390 DELETE FROM mentions WHERE messageId = new.id;
1391 INSERT INTO mentions (messageId, mentionAci, start, length)
1392
1393 SELECT messages.id, bodyRanges.value -&gt;&gt; &#39;mentionAci&#39; as mentionAci,
1394 bodyRanges.value -&gt;&gt; &#39;start&#39; as start,
1395 bodyRanges.value -&gt;&gt; &#39;length&#39; as length
1396 FROM messages, json_each(messages.json -&gt;&gt; &#39;bodyRanges&#39;) as bodyRanges
1397 WHERE bodyRanges.value -&gt;&gt; &#39;mentionAci&#39; IS NOT NULL
1398
1399 AND messages.id = new.id;
1400 END;
1401 sqlite&gt;
1402 &lt;/pre&gt;
1403
1404 &lt;p&gt;Finally I have the tool needed to inspect and process Signal
1405 messages that I need, without using the vendor provided client. Now
1406 on to transforming it to a more useful format.&lt;/p&gt;
1407
1408 &lt;p&gt;As usual, if you use Bitcoin and want to show your support of my
1409 activities, please send Bitcoin donations to my address
1410 &lt;b&gt;&lt;a href=&quot;bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&quot;&gt;15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;
1411 </description>
1412 </item>
1413
1414 <item>
1415 <title>New chrpath release 0.17</title>
1416 <link>https://people.skolelinux.org/pere/blog/New_chrpath_release_0_17.html</link>
1417 <guid isPermaLink="true">https://people.skolelinux.org/pere/blog/New_chrpath_release_0_17.html</guid>
1418 <pubDate>Fri, 10 Nov 2023 07:30:00 +0100</pubDate>
1419 <description>&lt;p&gt;The chrpath package provide a simple command line tool to remove or
1420 modify the rpath or runpath of compiled ELF program. It is almost 10
1421 years since I updated the code base, but I stumbled over the tool
1422 today, and decided it was time to move the code base from Subversion
1423 to git and find a new home for it, as the previous one (Debian Alioth)
1424 has been shut down. I decided to go with
1425 &lt;a href=&quot;https://codeberg.org/&quot;&gt;Codeberg&lt;/a&gt; this time, as it is my git
1426 service of choice these days, did a quick and dirty migration to git
1427 and updated the code with a few patches I found in the Debian bug
1428 tracker. These are the release notes:&lt;/p&gt;
1429
1430 &lt;p&gt;New in 0.17 released 2023-11-10:&lt;/p&gt;
1431
1432 &lt;ul&gt;
1433 &lt;li&gt;Moved project to Codeberg, as Alioth is shut down.&lt;/li&gt;
1434 &lt;li&gt;Add Solaris support (use &amp;lt;sys/byteorder.h&gt; instead of &amp;lt;byteswap.h&gt;).
1435 Patch from Rainer Orth.&lt;/li&gt;
1436 &lt;li&gt;Added missing newline from printf() line. Patch from Frank Dana.&lt;/li&gt;
1437 &lt;li&gt;Corrected handling of multiple ELF sections. Patch from Frank Dana.&lt;/li&gt;
1438 &lt;li&gt;Updated build rules for .deb. Partly based on patch from djcj.&lt;/li&gt;
1439 &lt;/ul&gt;
1440
1441 &lt;p&gt;The latest edition is tagged and available from
1442 &lt;a href=&quot;https://codeberg.org/pere/chrpath&quot;&gt;https://codeberg.org/pere/chrpath&lt;/a&gt;.
1443
1444 &lt;p&gt;As usual, if you use Bitcoin and want to show your support of my
1445 activities, please send Bitcoin donations to my address
1446 &lt;b&gt;&lt;a href=&quot;bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&quot;&gt;15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;
1447 </description>
1448 </item>
1449
1450 <item>
1451 <title>Test framework for DocBook processors / formatters</title>
1452 <link>https://people.skolelinux.org/pere/blog/Test_framework_for_DocBook_processors___formatters.html</link>
1453 <guid isPermaLink="true">https://people.skolelinux.org/pere/blog/Test_framework_for_DocBook_processors___formatters.html</guid>
1454 <pubDate>Sun, 5 Nov 2023 13:00:00 +0100</pubDate>
1455 <description>&lt;p&gt;All the books I have published so far has been using
1456 &lt;a href=&quot;https://docbook.org/&quot;&gt;DocBook&lt;/a&gt; somewhere in the process.
1457 For the first book, the source format was DocBook, while for every
1458 later book it was an intermediate format used as the stepping stone to
1459 be able to present the same manuscript in several formats, on paper,
1460 as ebook in ePub format, as a HTML page and as a PDF file either for
1461 paper production or for Internet consumption. This is made possible
1462 with a wide variety of free software tools with DocBook support in
1463 Debian. The source format of later books have been docx via rst,
1464 Markdown, Filemaker and Asciidoc, and for all of these I was able to
1465 generate a suitable DocBook file for further processing using
1466 &lt;a href=&quot;https://tracker.debian.org/pkg/pandoc&quot;&gt;pandoc&lt;/a&gt;,
1467 &lt;a href=&quot;https://tracker.debian.org/pkg/asciidoc&quot;&gt;a2x&lt;/a&gt; and
1468 &lt;a href=&quot;https://tracker.debian.org/pkg/asciidoctor&quot;&gt;asciidoctor&lt;/a&gt;,
1469 as well as rendering using
1470 &lt;a href=&quot;https://tracker.debian.org/pkg/xmlto&quot;&gt;xmlto&lt;/a&gt;,
1471 &lt;a href=&quot;https://tracker.debian.org/pkg/dbtoepub&quot;&gt;dbtoepub&lt;/a&gt;,
1472 &lt;a href=&quot;https://tracker.debian.org/pkg/dblatex&quot;&gt;dblatex&lt;/a&gt;,
1473 &lt;a href=&quot;https://tracker.debian.org/pkg/docbook-xsl&quot;&gt;docbook-xsl&lt;/a&gt; and
1474 &lt;a href=&quot;https://tracker.debian.org/pkg/fop&quot;&gt;fop&lt;/a&gt;.&lt;/p&gt;
1475
1476 &lt;p&gt;Most of the &lt;a href=&quot;http://www.hungry.com/~pere/publisher/&quot;&gt;books I
1477 have published&lt;/a&gt; are translated books, with English as the source
1478 language. The use of
1479 &lt;a href=&quot;https://tracker.debian.org/pkg/po4a&quot;&gt;po4a&lt;/a&gt; to
1480 handle translations using the gettext PO format has been a blessing,
1481 but publishing translated books had triggered the need to ensure the
1482 DocBook tools handle relevant languages correctly. For every new
1483 language I have published, I had to submit patches dblatex, dbtoepub
1484 and docbook-xsl fixing incorrect language and country specific issues
1485 in the framework themselves. Typically this has been missing keywords
1486 like &#39;figure&#39; or sort ordering of index entries. After a while it
1487 became tiresome to only discover issues like this by accident, and I
1488 decided to write a DocBook &quot;test framework&quot; exercising various
1489 features of DocBook and allowing me to see all features exercised for
1490 a given language. It consist of a set of DocBook files, a version 4
1491 book, a version 5 book, a v4 book set, a v4 selection of problematic
1492 tables, one v4 testing sidefloat and finally one v4 testing a book of
1493 articles. The DocBook files are accompanied with a set of build rules
1494 for building PDF using dblatex and docbook-xsl/fop, HTML using xmlto
1495 or docbook-xsl and epub using dbtoepub. The result is a set of files
1496 visualizing footnotes, indexes, table of content list, figures,
1497 formulas and other DocBook features, allowing for a quick review on
1498 the completeness of the given locale settings. To build with a
1499 different language setting, all one need to do is edit the lang= value
1500 in the .xml file to pick a different ISO 639 code value and run
1501 &#39;make&#39;.&lt;/p&gt;
1502
1503 &lt;p&gt;The &lt;a href=&quot;https://codeberg.org/pere/docbook-example/&quot;&gt;test framework
1504 source code&lt;/a&gt; is available from Codeberg, and a generated set of
1505 presentations of the various examples is available as Codeberg static
1506 web pages at
1507 &lt;a href=&quot;https://pere.codeberg.page/docbook-example/&quot;&gt;https://pere.codeberg.page/docbook-example/&lt;/a&gt;.
1508 Using this test framework I have been able to discover and report
1509 several bugs and missing features in various tools, and got a lot of
1510 them fixed. For example I got Northern Sami keywords added to both
1511 docbook-xsl and dblatex, fixed several typos in Norwegian bokmål and
1512 Norwegian Nynorsk, support for non-ascii title IDs added to pandoc,
1513 Norwegian index sorting support fixed in xindy and initial Norwegian
1514 Bokmål support added to dblatex. Some issues still remains, though.
1515 Default index sorting rules are still broken in several tools, so the
1516 Norwegian letters æ, ø and å are more often than not sorted properly
1517 in the book index.&lt;/p&gt;
1518
1519 &lt;p&gt;The test framework recently received some more polish, as part of
1520 publishing my latest book. This book contained a lot of fairly
1521 complex tables, which exposed bugs in some of the tools. This made me
1522 add a new test file with various tables, as well as spend some time to
1523 brush up the build rules. My goal is for the test framework to
1524 exercise all DocBook features to make it easier to see which features
1525 work with different processors, and hopefully get them all to support
1526 the full set of DocBook features. Feel free to send patches to extend
1527 the test set, and test it with your favorite DocBook processor.
1528 Please visit these two URLs to learn more:&lt;/p&gt;
1529
1530 &lt;ul&gt;
1531 &lt;li&gt;&lt;a href=&quot;https://codeberg.org/pere/docbook-example/&quot;&gt;https://codeberg.org/pere/docbook-example/&lt;/a&gt;&lt;/li&gt;
1532 &lt;li&gt;&lt;a href=&quot;https://pere.codeberg.page/docbook-example/&quot;&gt;https://pere.codeberg.page/docbook-example/&lt;/a&gt;&lt;/li&gt;
1533 &lt;/ul&gt;
1534
1535 &lt;p&gt;If you want to learn more on Docbook and translations, I recommend
1536 having a look at the &lt;a href=&quot;https://docbook.org/&quot;&gt;the DocBook
1537 web site&lt;/a&gt;,
1538 &lt;a href=&quot;https://doccookbook.sourceforge.net/html/en/&quot;&gt;the DoCookBook
1539 site&lt;a/&gt; and my earlier blog post on
1540 &lt;a href=&quot;https://people.skolelinux.org/pere/blog/From_English_wiki_to_translated_PDF_and_epub_via_Docbook.html&quot;&gt;how
1541 the Skolelinux project process and translate documentation&lt;/a&gt;, a talk I gave earlier this year on
1542 &lt;a href=&quot;https://www.nuug.no/aktiviteter/20230314-oversetting-og-publisering-av-b%c3%b8ker-med-fri-programvare/&quot;&gt;how
1543 to translate and publish books using free software&lt;/a&gt; (Norwegian
1544 only).&lt;/p&gt;
1545
1546 &lt;!--
1547
1548 https://github.com/docbook/xslt10-stylesheets/issues/205 (docbook-xsl: sme support)
1549 https://bugs.debian.org/968437 (xindy: index sorting rules for nb/nn)
1550 https://bugs.debian.org/856123 (pandoc: markdown to docbook with non-english titles)
1551 https://bugs.debian.org/864813 (dblatex: missing nb words)
1552 https://bugs.debian.org/756386 (dblatex: index sorting rules for nb/nn)
1553 https://bugs.debian.org/796871 (dbtoepub: index sorting rules for nb/nn)
1554 https://bugs.debian.org/792616 (dblatex: PDF metadata)
1555 https://bugs.debian.org/686908 (docbook-xsl: index sorting rules for nb/nn)
1556 https://sourceforge.net/tracker/?func=detail&amp;atid=373747&amp;aid=3556630&amp;group_id=21935 (docbook-xsl: nb/nn support)
1557 https://bugs.debian.org/684391 (dblatex: initial nb support)
1558
1559 --&gt;
1560
1561 &lt;p&gt;As usual, if you use Bitcoin and want to show your support of my
1562 activities, please send Bitcoin donations to my address
1563 &lt;b&gt;&lt;a href=&quot;bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&quot;&gt;15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;
1564 </description>
1565 </item>
1566
1567 <item>
1568 <title>«Virkninger av angrefristloven», hovedfagsoppgaven som fikk endret en lov</title>
1569 <link>https://people.skolelinux.org/pere/blog/_Virkninger_av_angrefristloven___hovedfagsoppgaven_som_fikk_endret_en_lov.html</link>
1570 <guid isPermaLink="true">https://people.skolelinux.org/pere/blog/_Virkninger_av_angrefristloven___hovedfagsoppgaven_som_fikk_endret_en_lov.html</guid>
1571 <pubDate>Sun, 29 Oct 2023 22:00:00 +0100</pubDate>
1572 <description>&lt;img src=&quot;https://people.skolelinux.org/pere/blog/images/2023-10-29-bok-angrefrist.svg&quot; width=&quot;20%&quot; align=&quot;center&quot;&gt;&lt;/a&gt;
1573
1574 &lt;p&gt;I 1979 leverte Ole-Erik Yrvin en hovedfagsoppgave for Cand. Scient.
1575 ved Institutt for sosiologi på Universitetet i Oslo på oppdrag fra
1576 Forbruker- og administrasjonsdepartementet. Oppgaven evaluerte
1577 Angrefristloven fra 1972, og det han oppdaget førte til at loven ble
1578 endret fire år senere.&lt;/p&gt;
1579
1580 &lt;p&gt;Jeg har kjent Ole-Erik en stund, og synes det var trist at hans
1581 oppgave ikke lenger er tilgjengelig, hverken fra oppdragsgiver
1582 eller fra universitetet. Hans forsøk på å få den avbildet og lagt
1583 ut på Internett har vist seg fånyttes, så derfor tilbød jeg meg for
1584 en stund tilbake å publisere den og gjøre den tilgjengelig med
1585 fribruksvilkår på Internett. Det er nå klart, og hovedfagsoppgaven
1586 er tilgjengelig blant annet via &lt;a
1587 href=&quot;http://www.hungry.com/~pere/publisher/&quot;&gt;min liste over
1588 publiserte bøker&lt;/a&gt;, både som nettside,
1589 &lt;a href=&quot;https://www.lulu.com/search?contributor=Ole-Erik+Yrvin&quot;&gt;digital
1590 bok i ePub-format og på papir fra lulu.com&lt;/a&gt;. Jeg regner med at
1591 den også vil dukke opp på nettbokhandlere i løpet av en måned eller
1592 to.&lt;/p&gt;
1593
1594 &lt;p&gt;Alle tabeller og figurer er gjenskapt for bedre lesbarhet, noen
1595 skrivefeil rettet opp og mange referanser har fått flere detaljer
1596 som ISBN-nummer og DOI-referanse. Selv om jeg ikke regner med at
1597 dette blir en kioskvelter, så håper jeg denne nye utgaven kan komme
1598 fremtiden til glede.&lt;/p&gt;
1599
1600 &lt;p&gt;Som vanlig, hvis du bruker Bitcoin og ønsker å vise din støtte til
1601 det jeg driver med, setter jeg pris på om du sender Bitcoin-donasjoner
1602 til min adresse
1603 &lt;b&gt;&lt;a href=&quot;bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&quot;&gt;15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&lt;/a&gt;&lt;/b&gt;. Merk,
1604 betaling med bitcoin er ikke anonymt. :)&lt;/p&gt;
1605 </description>
1606 </item>
1607
1608 </channel>
1609 </rss>