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">
4 <title>Petter Reinholdtsen
</title>
5 <description></description>
6 <link>http://people.skolelinux.org/pere/blog/
</link>
7 <atom:link href=
"http://people.skolelinux.org/pere/blog/index.rss" rel=
"self" type=
"application/rss+xml" />
10 <title>Release
0.2 of free software archive system Nikita announced
</title>
11 <link>http://people.skolelinux.org/pere/blog/Release_0_2_of_free_software_archive_system_Nikita_announced.html
</link>
12 <guid isPermaLink=
"true">http://people.skolelinux.org/pere/blog/Release_0_2_of_free_software_archive_system_Nikita_announced.html
</guid>
13 <pubDate>Thu,
18 Oct
2018 14:
40:
00 +
0200</pubDate>
14 <description><p
>This morning, the new release of the
15 <a href=
"https://gitlab.com/OsloMet-ABI/nikita-noark5-core/
">Nikita
16 Noark
5 core project
</a
> was
17 <a href=
"https://lists.nuug.no/pipermail/nikita-noark/
2018-October/
000406.html
">announced
18 on the project mailing list
</a
>. The free software solution is an
19 implementation of the Norwegian archive standard Noark
5 used by
20 government offices in Norway. These were the changes in version
0.2
21 since version
0.1.1 (from NEWS.md):
24 <li
>Fix typos in REL names
</li
>
25 <li
>Tidy up error message reporting
</li
>
26 <li
>Fix issue where we used Integer.valueOf(), not Integer.getInteger()
</li
>
27 <li
>Change some String handling to StringBuffer
</li
>
28 <li
>Fix error reporting
</li
>
29 <li
>Code tidy-up
</li
>
30 <li
>Fix issue using static non-synchronized SimpleDateFormat to avoid
31 race conditions
</li
>
32 <li
>Fix problem where deserialisers were treating integers as strings
</li
>
33 <li
>Update methods to make them null-safe
</li
>
34 <li
>Fix many issues reported by coverity
</li
>
35 <li
>Improve equals(), compareTo() and hash() in domain model
</li
>
36 <li
>Improvements to the domain model for metadata classes
</li
>
37 <li
>Fix CORS issues when downloading document
</li
>
38 <li
>Implementation of case-handling with registryEntry and document upload
</li
>
39 <li
>Better support in Javascript for OPTIONS
</li
>
40 <li
>Adding concept description of mail integration
</li
>
41 <li
>Improve setting of default values for GET on ny-journalpost
</li
>
42 <li
>Better handling of required values during deserialisation
</li
>
43 <li
>Changed tilknyttetDato (M620) from date to dateTime
</li
>
44 <li
>Corrected some opprettetDato (M600) (de)serialisation errors.
</li
>
45 <li
>Improve parse error reporting.
</li
>
46 <li
>Started on OData search and filtering.
</li
>
47 <li
>Added Contributor Covenant Code of Conduct to project.
</li
>
48 <li
>Moved repository and project from Github to Gitlab.
</li
>
49 <li
>Restructured repository, moved code into src/ and web/.
</li
>
50 <li
>Updated code to use Spring Boot version
2.
</li
>
51 <li
>Added support for OAuth2 authentication.
</li
>
52 <li
>Fixed several bugs discovered by Coverity.
</li
>
53 <li
>Corrected handling of date/datetime fields.
</li
>
54 <li
>Improved error reporting when rejecting during deserializatoin.
</li
>
55 <li
>Adjusted default values provided for ny-arkivdel, ny-mappe,
56 ny-saksmappe, ny-journalpost and ny-dokumentbeskrivelse.
</li
>
57 <li
>Several fixes for korrespondansepart*.
</li
>
58 <li
>Updated web GUI:
60 <li
>Now handle both file upload and download.
</li
>
61 <li
>Uses new OAuth2 authentication for login.
</li
>
62 <li
>Forms now fetches default values from API using GET.
</li
>
63 <li
>Added RFC
822 (email), TIFF and JPEG to list of possible file formats.
</li
>
64 </ul
></li
>
67 <p
>The changes and improvements are extensive. Running diffstat on
68 the changes between git tab
0.1.1 and
0.2 show
1098 files changed,
69 108666 insertions(+),
54066 deletions(-).
</p
>
71 <p
>If free and open standardized archiving API sound interesting to
72 you, please contact us on IRC
73 (
<a href=
"irc://irc.freenode.net/%
23nikita
">#nikita on
74 irc.freenode.net
</a
>) or email
75 (
<a href=
"https://lists.nuug.no/mailman/listinfo/nikita-noark
">nikita-noark
76 mailing list
</a
>).
</p
>
78 <p
>As usual, if you use Bitcoin and want to show your support of my
79 activities, please send Bitcoin donations to my address
80 <b
><a href=
"bitcoin:
15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a
></b
>.
</p
>
85 <title>Fetching trusted timestamps using the rfc3161ng python module
</title>
86 <link>http://people.skolelinux.org/pere/blog/Fetching_trusted_timestamps_using_the_rfc3161ng_python_module.html
</link>
87 <guid isPermaLink=
"true">http://people.skolelinux.org/pere/blog/Fetching_trusted_timestamps_using_the_rfc3161ng_python_module.html
</guid>
88 <pubDate>Mon,
8 Oct
2018 12:
30:
00 +
0200</pubDate>
89 <description><p
>I have earlier covered the basics of trusted timestamping using the
90 'openssl ts
' client. See blog post for
91 <a href=
"http://people.skolelinux.org/pere/blog/Public_Trusted_Timestamping_services_for_everyone.html
">2014</a
>,
92 <a href=
"http://people.skolelinux.org/pere/blog/syslog_trusted_timestamp___chain_of_trusted_timestamps_for_your_syslog.html
">2016</a
>
94 <a href=
"http://people.skolelinux.org/pere/blog/Idea_for_storing_trusted_timestamps_in_a_Noark_5_archive.html
">2017</a
>
95 for those stories. But some times I want to integrate the timestamping
96 in other code, and recently I needed to integrate it into Python.
97 After searching a bit, I found
98 <a href=
"https://dev.entrouvert.org/projects/python-rfc3161
">the
99 rfc3161 library
</a
> which seemed like a good fit, but I soon
100 discovered it only worked for python version
2, and I needed something
101 that work with python version
3. Luckily I next came across
102 <a href=
"https://github.com/trbs/rfc3161ng/
">the rfc3161ng library
</a
>,
103 a fork of the original rfc3161 library. Not only is it working with
104 python
3, it have fixed a few of the bugs in the original library, and
105 it has an active maintainer. I decided to wrap it up and make it
106 <a href=
"https://tracker.debian.org/pkg/python-rfc3161ng
">available in
107 Debian
</a
>, and a few days ago it entered Debian unstable and testing.
</p
>
109 <p
>Using the library is fairly straight forward. The only slightly
110 problematic step is to fetch the required certificates to verify the
111 timestamp. For some services it is straight forward, while for others
112 I have not yet figured out how to do it. Here is a small standalone
113 code example based on of the integration tests in the library code:
</p
>
120 Python
3 script demonstrating how to use the rfc3161ng module to
121 get trusted timestamps.
123 The license of this code is the same as the license of the rfc3161ng
129 import pyasn1.codec.der
133 import urllib.request
140 def fetch(url, f=None):
141 response = urllib.request.urlopen(url)
142 data = response.read()
148 with tempfile.NamedTemporaryFile() as cert_f,\
149 tempfile.NamedTemporaryFile() as ca_f,\
150 tempfile.NamedTemporaryFile() as msg_f,\
151 tempfile.NamedTemporaryFile() as tsr_f:
153 # First fetch certificates used by service
154 certificate_data = fetch(
'https://freetsa.org/files/tsa.crt
', cert_f)
155 ca_data_data = fetch(
'https://freetsa.org/files/cacert.pem
', ca_f)
157 # Then timestamp the message
159 rfc3161ng.RemoteTimestamper(
'http://freetsa.org/tsr
',
160 certificate=certificate_data)
161 data = b
"Python forever!\n
"
162 tsr = timestamper(data=data, return_tsr=True)
164 # Finally, convert message and response to something
'openssl ts
' can verify
166 store(tsr_f, pyasn1.codec.der.encoder.encode(tsr))
167 args = [
"openssl
",
"ts
",
"-verify
",
168 "-data
", msg_f.name,
169 "-in
", tsr_f.name,
170 "-CAfile
", ca_f.name,
171 "-untrusted
", cert_f.name]
172 subprocess.check_call(args)
174 if
'__main__
' == __name__:
178 <p
>The code fetches the required certificates, store them as temporary
179 files, timestamp a simple message, store the message and timestamp to
180 disk and ask
'openssl ts
' to verify the timestamp. A timestamp is
181 around
1.5 kiB in size, and should be fairly easy to store for future
184 <p
>As usual, if you use Bitcoin and want to show your support of my
185 activities, please send Bitcoin donations to my address
186 <b
><a href=
"bitcoin:
15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a
></b
>.
</p
>
191 <title>Automatic Google Drive sync using grive in Debian
</title>
192 <link>http://people.skolelinux.org/pere/blog/Automatic_Google_Drive_sync_using_grive_in_Debian.html
</link>
193 <guid isPermaLink=
"true">http://people.skolelinux.org/pere/blog/Automatic_Google_Drive_sync_using_grive_in_Debian.html
</guid>
194 <pubDate>Thu,
4 Oct
2018 15:
20:
00 +
0200</pubDate>
195 <description><p
>A few days, I rescued a Windows victim over to Debian. To try to
196 rescue the remains, I helped set up automatic sync with Google Drive.
197 I did not find any sensible Debian package handling this
198 automatically, so I rebuild the grive2 source from
199 <a href=
"http://www.webupd8.org/
">the Ubuntu UPD8 PPA
</a
> to do the
200 task and added a autostart desktop entry and a small shell script to
201 run in the background while the user is logged in to do the sync.
202 Here is a sketch of the setup for future reference.
</p
>
204 <p
>I first created
<tt
>~/googledrive
</tt
>, entered the directory and
205 ran
'<tt
>grive -a
</tt
>' to authenticate the machine/user. Next, I
206 created a autostart hook in
<tt
>~/.config/autostart/grive.desktop
</tt
>
207 to start the sync when the user log in:
</p
>
209 <p
><blockquote
><pre
>
211 Name=Google drive autosync
213 Exec=/home/user/bin/grive-sync
214 </pre
></blockquote
></p
>
216 <p
>Finally, I wrote the
<tt
>~/bin/grive-sync
</tt
> script to sync
217 ~/googledrive/ with the files in Google Drive.
</p
>
219 <p
><blockquote
><pre
>
224 if [
"$syncpid
" ] ; then
228 trap cleanup EXIT INT QUIT
229 /usr/lib/grive/grive-sync.sh listen googledrive
2>&1 | sed
"s%^%$
0:%
" &
232 if ! xhost
>/dev/null
2>&1 ; then
233 echo
"no DISPLAY, exiting as the user probably logged out
"
236 if [ ! -e /run/user/
1000/grive-sync.sh_googledrive ] ; then
237 /usr/lib/grive/grive-sync.sh sync googledrive
240 done
2>&1 | sed
"s%^%$
0:%
"
241 </pre
></blockquote
></p
>
243 <p
>Feel free to use the setup if you want. It can be assumed to be
244 GNU GPL v2 licensed (or any later version, at your leisure), but I
245 doubt this code is possible to claim copyright on.
</p
>
247 <p
>As usual, if you use Bitcoin and want to show your support of my
248 activities, please send Bitcoin donations to my address
249 <b
><a href=
"bitcoin:
15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a
></b
>.
</p
>
254 <title>Valutakrambod - A python and bitcoin love story
</title>
255 <link>http://people.skolelinux.org/pere/blog/Valutakrambod___A_python_and_bitcoin_love_story.html
</link>
256 <guid isPermaLink=
"true">http://people.skolelinux.org/pere/blog/Valutakrambod___A_python_and_bitcoin_love_story.html
</guid>
257 <pubDate>Sat,
29 Sep
2018 22:
20:
00 +
0200</pubDate>
258 <description><p
>It would come as no surprise to anyone that I am interested in
259 bitcoins and virtual currencies. I
've been keeping an eye on virtual
260 currencies for many years, and it is part of the reason a few months
261 ago, I started writing a python library for collecting currency
262 exchange rates and trade on virtual currency exchanges. I decided to
263 name the end result valutakrambod, which perhaps can be translated to
264 small currency shop.
</p
>
266 <p
>The library uses the tornado python library to handle HTTP and
267 websocket connections, and provide a asynchronous system for
268 connecting to and tracking several services. The code is available
270 <a href=
"http://github.com/petterreinholdtsen/valutakrambod
">github
</a
>.
</p
>
272 </p
>There are two example clients of the library. One is very simple and
273 list every updated buy/sell price received from the various services.
274 This code is started by running bin/btc-rates and call the client code
275 in valutakrambod/client.py. The simple client look like this:
</p
>
277 <p
><blockquote
><pre
>
279 import tornado.ioloop
281 class SimpleClient(object):
286 def newdata(self, service, pair, changed):
287 print(
"%-
15s %s-%s: %
8.3f %
8.3f
" % (
288 service.servicename(),
291 service.rates[pair][
'ask
'],
292 service.rates[pair][
'bid
'])
294 async def refresh(self, service):
295 await service.fetchRates(service.wantedpairs)
297 self.ioloop = tornado.ioloop.IOLoop.current()
298 self.services = valutakrambod.service.knownServices()
299 for e in self.services:
301 service.subscribe(self.newdata)
302 stream = service.websocket()
304 self.streams.append(stream)
306 # Fetch information from non-streaming services immediately
307 self.ioloop.call_later(len(self.services),
308 functools.partial(self.refresh, service))
309 # as well as regularly
310 service.periodicUpdate(
60)
311 for stream in self.streams:
315 except KeyboardInterrupt:
316 print(
"Interrupted by keyboard, closing all connections.
")
318 for stream in self.streams:
320 </pre
></blockquote
></p
>
322 <p
>The library client loops over all known
"public
" services,
323 initialises it, subscribes to any updates from the service, checks and
324 activates websocket streaming if the service provide it, and if no
325 streaming is supported, fetches information from the service and sets
326 up a periodic update every
60 seconds. The output from this client
327 can look like this:
</p
>
329 <p
><blockquote
><pre
>
330 Bl3p BTC-EUR:
5687.110 5653.690
331 Bl3p BTC-EUR:
5687.110 5653.690
332 Bl3p BTC-EUR:
5687.110 5653.690
333 Hitbtc BTC-USD:
6594.560 6593.690
334 Hitbtc BTC-USD:
6594.560 6593.690
335 Bl3p BTC-EUR:
5687.110 5653.690
336 Hitbtc BTC-USD:
6594.570 6593.690
337 Bitstamp EUR-USD:
1.159 1.154
338 Hitbtc BTC-USD:
6594.570 6593.690
339 Hitbtc BTC-USD:
6594.580 6593.690
340 Hitbtc BTC-USD:
6594.580 6593.690
341 Hitbtc BTC-USD:
6594.580 6593.690
342 Bl3p BTC-EUR:
5687.110 5653.690
343 Paymium BTC-EUR:
5680.000 5620.240
344 </pre
></blockquote
></p
>
346 <p
>The exchange order book is tracked in addition to the best buy/sell
347 price, for those that need to know the details.
</p
>
349 <p
>The other example client is focusing on providing a curses view
350 with updated buy/sell prices as soon as they are received from the
351 services. This code is located in bin/btc-rates-curses and activated
352 by using the
'-c
' argument. Without the argument the
"curses
" output
353 is printed without using curses, which is useful for debugging. The
354 curses view look like this:
</p
>
356 <p
><blockquote
><pre
>
357 Name Pair Bid Ask Spr Ftcd Age
358 BitcoinsNorway BTCEUR
5591.8400 5711.0800 2.1%
16 nan
60
359 Bitfinex BTCEUR
5671.0000 5671.2000 0.0%
16 22 59
360 Bitmynt BTCEUR
5580.8000 5807.5200 3.9%
16 41 60
361 Bitpay BTCEUR
5663.2700 nan nan%
15 nan
60
362 Bitstamp BTCEUR
5664.8400 5676.5300 0.2%
0 1 1
363 Bl3p BTCEUR
5653.6900 5684.9400 0.5%
0 nan
19
364 Coinbase BTCEUR
5600.8200 5714.9000 2.0%
15 nan nan
365 Kraken BTCEUR
5670.1000 5670.2000 0.0%
14 17 60
366 Paymium BTCEUR
5620.0600 5680.0000 1.1%
1 7515 nan
367 BitcoinsNorway BTCNOK
52898.9700 54034.6100 2.1%
16 nan
60
368 Bitmynt BTCNOK
52960.3200 54031.1900 2.0%
16 41 60
369 Bitpay BTCNOK
53477.7833 nan nan%
16 nan
60
370 Coinbase BTCNOK
52990.3500 54063.0600 2.0%
15 nan nan
371 MiraiEx BTCNOK
52856.5300 54100.6000 2.3%
16 nan nan
372 BitcoinsNorway BTCUSD
6495.5300 6631.5400 2.1%
16 nan
60
373 Bitfinex BTCUSD
6590.6000 6590.7000 0.0%
16 23 57
374 Bitpay BTCUSD
6564.1300 nan nan%
15 nan
60
375 Bitstamp BTCUSD
6561.1400 6565.6200 0.1%
0 2 1
376 Coinbase BTCUSD
6504.0600 6635.9700 2.0%
14 nan
117
377 Gemini BTCUSD
6567.1300 6573.0700 0.1%
16 89 nan
378 Hitbtc+BTCUSD
6592.6200 6594.2100 0.0%
0 0 0
379 Kraken BTCUSD
6565.2000 6570.9000 0.1%
15 17 58
380 Exchangerates EURNOK
9.4665 9.4665 0.0%
16 107789 nan
381 Norgesbank EURNOK
9.4665 9.4665 0.0%
16 107789 nan
382 Bitstamp EURUSD
1.1537 1.1593 0.5%
4 5 1
383 Exchangerates EURUSD
1.1576 1.1576 0.0%
16 107789 nan
384 BitcoinsNorway LTCEUR
1.0000 49.0000 98.0%
16 nan nan
385 BitcoinsNorway LTCNOK
492.4800 503.7500 2.2%
16 nan
60
386 BitcoinsNorway LTCUSD
1.0221 49.0000 97.9%
15 nan nan
387 Norgesbank USDNOK
8.1777 8.1777 0.0%
16 107789 nan
388 </pre
></blockquote
></p
>
390 <p
>The code for this client is too complex for a simple blog post, so
391 you will have to check out the git repository to figure out how it
392 work. What I can tell is how the three last numbers on each line
393 should be interpreted. The first is how many seconds ago information
394 was received from the service. The second is how long ago, according
395 to the service, the provided information was updated. The last is an
396 estimate on how often the buy/sell values change.
</p
>
398 <p
>If you find this library useful, or would like to improve it, I
399 would love to hear from you. Note that for some of the services I
've
400 implemented a trading API. It might be the topic of a future blog
403 <p
>As usual, if you use Bitcoin and want to show your support of my
404 activities, please send Bitcoin donations to my address
405 <b
><a href=
"bitcoin:
15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a
></b
>.
</p
>
410 <title>VLC in Debian now can do bittorrent streaming
</title>
411 <link>http://people.skolelinux.org/pere/blog/VLC_in_Debian_now_can_do_bittorrent_streaming.html
</link>
412 <guid isPermaLink=
"true">http://people.skolelinux.org/pere/blog/VLC_in_Debian_now_can_do_bittorrent_streaming.html
</guid>
413 <pubDate>Mon,
24 Sep
2018 21:
20:
00 +
0200</pubDate>
414 <description><p
>Back in February, I got curious to see
415 <a href=
"http://people.skolelinux.org/pere/blog/Using_VLC_to_stream_bittorrent_sources.html
">if
416 VLC now supported Bittorrent streaming
</a
>. It did not, despite the
417 fact that the idea and code to handle such streaming had been floating
418 around for years. I did however find
419 <a href=
"https://github.com/johang/vlc-bittorrent
">a standalone plugin
420 for VLC
</a
> to do it, and half a year later I decided to wrap up the
421 plugin and get it into Debian. I uploaded it to NEW a few days ago,
422 and am very happy to report that it
423 <a href=
"https://tracker.debian.org/pkg/vlc-plugin-bittorrent
">entered
424 Debian
</a
> a few hours ago, and should be available in Debian/Unstable
425 tomorrow, and Debian/Testing in a few days.
</p
>
427 <p
>With the vlc-plugin-bittorrent package installed you should be able
428 to stream videos using a simple call to
</p
>
430 <p
><blockquote
><pre
>
431 vlc https://archive.org/download/TheGoat/TheGoat_archive.torrent
432 </pre
></blockquote
></p
>
434 </p
>It can handle magnet links too. Now if only native vlc had
435 bittorrent support. Then a lot more would be helping each other to
436 share public domain and creative commons movies. The plugin need some
437 stability work with seeking and picking the right file in a torrent
438 with many files, but is already usable. Please note that the plugin
439 is not removing downloaded files when vlc is stopped, so it can fill
440 up your disk if you are not careful. Have fun. :)
</p
>
442 <p
>I would love to get help maintaining this package. Get in touch if
443 you are interested.
</p
>
445 <p
>As usual, if you use Bitcoin and want to show your support of my
446 activities, please send Bitcoin donations to my address
447 <b
><a href=
"bitcoin:
15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a
></b
>.
</p
>
452 <title>Using the Kodi API to play Youtube videos
</title>
453 <link>http://people.skolelinux.org/pere/blog/Using_the_Kodi_API_to_play_Youtube_videos.html
</link>
454 <guid isPermaLink=
"true">http://people.skolelinux.org/pere/blog/Using_the_Kodi_API_to_play_Youtube_videos.html
</guid>
455 <pubDate>Sun,
2 Sep
2018 23:
40:
00 +
0200</pubDate>
456 <description><p
>I continue to explore my Kodi installation, and today I wanted to
457 tell it to play a youtube URL I received in a chat, without having to
458 insert search terms using the on-screen keyboard. After searching the
459 web for API access to the Youtube plugin and testing a bit, I managed
460 to find a recipe that worked. If you got a kodi instance with its API
461 available from http://kodihost/jsonrpc, you can try the following to
462 have check out a nice cover band.
</p
>
464 <p
><blockquote
><pre
>curl --silent --header
'Content-Type: application/json
' \
465 --data-binary
'{
"id
":
1,
"jsonrpc
":
"2.0",
"method
":
"Player.Open
",
466 "params
": {
"item
": {
"file
":
467 "plugin://plugin.video.youtube/play/?video_id=LuRGVM9O0qg
" } } }
' \
468 http://projector.local/jsonrpc
</pre
></blockquote
></p
>
470 <p
>I
've extended kodi-stream program to take a video source as its
471 first argument. It can now handle direct video links, youtube links
472 and
'desktop
' to stream my desktop to Kodi. It is almost like a
473 Chromecast. :)
</p
>
475 <p
>As usual, if you use Bitcoin and want to show your support of my
476 activities, please send Bitcoin donations to my address
477 <b
><a href=
"bitcoin:
15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a
></b
>.
</p
>
482 <title>Software created using taxpayers’ money should be Free Software
</title>
483 <link>http://people.skolelinux.org/pere/blog/Software_created_using_taxpayers__money_should_be_Free_Software.html
</link>
484 <guid isPermaLink=
"true">http://people.skolelinux.org/pere/blog/Software_created_using_taxpayers__money_should_be_Free_Software.html
</guid>
485 <pubDate>Thu,
30 Aug
2018 13:
50:
00 +
0200</pubDate>
486 <description><p
>It might seem obvious that software created using tax money should
487 be available for everyone to use and improve. Free Software
488 Foundation Europe recentlystarted a campaign to help get more people
489 to understand this, and I just signed the petition on
490 <a href=
"https://publiccode.eu/
">Public Money, Public Code
</a
> to help
491 them. I hope you too will do the same.
</p
>
496 <title>A bit more on privacy respecting health monitor / fitness tracker
</title>
497 <link>http://people.skolelinux.org/pere/blog/A_bit_more_on_privacy_respecting_health_monitor___fitness_tracker.html
</link>
498 <guid isPermaLink=
"true">http://people.skolelinux.org/pere/blog/A_bit_more_on_privacy_respecting_health_monitor___fitness_tracker.html
</guid>
499 <pubDate>Mon,
13 Aug
2018 09:
00:
00 +
0200</pubDate>
500 <description><p
>A few days ago, I wondered if there are any privacy respecting
501 health monitors and/or fitness trackers available for sale these days.
502 I would like to buy one, but do not want to share my personal data
503 with strangers, nor be forced to have a mobile phone to get data out
504 of the unit. I
've received some ideas, and would like to share them
507 One interesting data point was a pointer to a Free Software app for
509 <a href=
"https://github.com/Freeyourgadget/Gadgetbridge/
">Gadgetbridge
</a
>.
510 It provide cloudless collection and storing of data from a variety of
512 <a href=
"https://github.com/Freeyourgadget/Gadgetbridge/#supported-devices
">list
513 of supported devices
</a
> is a good indicator for units where the
514 protocol is fairly open, as it is obviously being handled by Free
515 Software. Other units are reportedly encrypting the collected
516 information with their own public key, making sure only the vendor
517 cloud service is able to extract data from the unit. The people
518 contacting me about Gadgetbirde said they were using
519 <a href=
"https://us.amazfit.com/shop/bip?variant=
336750">Amazfit
521 <a href=
"http://www.xiaomimi6phone.com/xiaomi-mi-band-
3-features-release-date-rumors/
">Xiaomi
522 Band
3</a
>.
</p
>
524 <p
>I also got a suggestion to look at some of the units from Garmin.
525 I was told their GPS watches can be connected via USB and show up as a
526 USB storage device with
527 <a href=
"https://www.gpsbabel.org/htmldoc-development/fmt_garmin_fit.html
">Garmin
528 FIT files
</a
> containing the collected measurements. While
529 proprietary, FIT files apparently can be read at least by
530 <a href=
"https://www.gpsbabel.org
">GPSBabel
</a
> and the
531 <a href=
"https://apps.nextcloud.com/apps/gpxpod
">GpxPod
</a
> Nextcloud
532 app. It is unclear to me if they can read step count and heart rate
533 data. The person I talked to was using a
534 <a href=
"https://buy.garmin.com/en-US/US/p/
564291">Garmin Forerunner
535 935</a
>, which is a fairly expensive unit. I doubt it is worth it for
536 a unit where the vendor clearly is trying its best to move from open
537 to closed systems. I still remember when Garmin dropped NMEA support
538 in its GPSes.
</p
>
540 <p
>A final idea was to build ones own unit, perhaps by basing it on a
541 wearable hardware platforms like
542 <a href=
"https://learn.adafruit.com/flora-geo-watch
">the Flora Geo
543 Watch
</a
>. Sound like fun, but I had more money than time to spend on
544 the topic, so I suspect it will have to wait for another time.
</p
>
546 <p
>While I was working on tracking down links, I came across an
547 inspiring TED talk by Dave Debronkart about
548 <a href=
"https://archive.org/details/DavedeBronkart_2010X
">being a
549 e-patient
</a
>, and discovered the web site
550 <a href=
"https://participatorymedicine.org/epatients/
">Participatory
551 Medicine
</a
>. If you too want to track your own health and fitness
552 without having information about your private life floating around on
553 computers owned by others, I recommend checking it out.
</p
>
555 <p
>As usual, if you use Bitcoin and want to show your support of my
556 activities, please send Bitcoin donations to my address
557 <b
><a href=
"bitcoin:
15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a
></b
>.
</p
>
562 <title>Privacy respecting health monitor / fitness tracker?
</title>
563 <link>http://people.skolelinux.org/pere/blog/Privacy_respecting_health_monitor___fitness_tracker_.html
</link>
564 <guid isPermaLink=
"true">http://people.skolelinux.org/pere/blog/Privacy_respecting_health_monitor___fitness_tracker_.html
</guid>
565 <pubDate>Tue,
7 Aug
2018 16:
00:
00 +
0200</pubDate>
566 <description><p
>Dear lazyweb,
</p
>
568 <p
>I wonder, is there a fitness tracker / health monitor available for
569 sale today that respect the users privacy? With this I mean a
570 watch/bracelet capable of measuring pulse rate and other
571 fitness/health related values (and by all means, also the correct time
572 and location if possible), which is
<strong
>only
</strong
> provided for
573 me to extract/read from the unit with computer without a radio beacon
574 and Internet connection. In other words, it do not depend on a cell
575 phone app, and do make the measurements available via other peoples
576 computer (aka
"the cloud
"). The collected data should be available
577 using only free software. I
'm not interested in depending on some
578 non-free software that will leave me high and dry some time in the
579 future. I
've been unable to find any such unit. I would like to buy
580 it. The ones I have seen for sale here in Norway are proud to report
581 that they share my health data with strangers (aka
"cloud enabled
").
582 Is there an alternative? I
'm not interested in giving money to people
583 requiring me to accept
"privacy terms
" to allow myself to measure my
584 own health.
</p
>
586 <p
>As usual, if you use Bitcoin and want to show your support of my
587 activities, please send Bitcoin donations to my address
588 <b
><a href=
"bitcoin:
15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a
></b
>.
</p
>
593 <title>Sharing images with friends and family using RSS and EXIF/XMP metadata
</title>
594 <link>http://people.skolelinux.org/pere/blog/Sharing_images_with_friends_and_family_using_RSS_and_EXIF_XMP_metadata.html
</link>
595 <guid isPermaLink=
"true">http://people.skolelinux.org/pere/blog/Sharing_images_with_friends_and_family_using_RSS_and_EXIF_XMP_metadata.html
</guid>
596 <pubDate>Tue,
31 Jul
2018 23:
30:
00 +
0200</pubDate>
597 <description><p
>For a while now, I have looked for a sensible way to share images
598 with my family using a self hosted solution, as it is unacceptable to
599 place images from my personal life under the control of strangers
600 working for data hoarders like Google or Dropbox. The last few days I
601 have drafted an approach that might work out, and I would like to
602 share it with you. I would like to publish images on a server under
603 my control, and point some Internet connected display units using some
604 free and open standard to the images I published. As my primary
605 language is not limited to ASCII, I need to store metadata using
606 UTF-
8. Many years ago, I hoped to find a digital photo frame capable
607 of reading a RSS feed with image references (aka using the
608 &lt;enclosure
&gt; RSS tag), but was unable to find a current supplier
609 of such frames. In the end I gave up that approach.
</p
>
611 <p
>Some months ago, I discovered that
612 <a href=
"https://www.jwz.org/xscreensaver/
">XScreensaver
</a
> is able to
613 read images from a RSS feed, and used it to set up a screen saver on
614 my home info screen, showing images from the Daily images feed from
615 NASA. This proved to work well. More recently I discovered that
616 <a href=
"https://kodi.tv
">Kodi
</a
> (both using
617 <a href=
"https://www.openelec.tv/
">OpenELEC
</a
> and
618 <a href=
"https://libreelec.tv
">LibreELEC
</a
>) provide the
619 <a href=
"https://github.com/grinsted/script.screensaver.feedreader
">Feedreader
</a
>
620 screen saver capable of reading a RSS feed with images and news. For
621 fun, I used it this summer to test Kodi on my parents TV by hooking up
622 a Raspberry PI unit with LibreELEC, and wanted to provide them with a
623 screen saver showing selected pictures from my selection.
</p
>
625 <p
>Armed with motivation and a test photo frame, I set out to generate
626 a RSS feed for the Kodi instance. I adjusted my
<a
627 href=
"https://freedombox.org/
">Freedombox
</a
> instance, created
628 /var/www/html/privatepictures/, wrote a small Perl script to extract
629 title and description metadata from the photo files and generate the
630 RSS file. I ended up using Perl instead of python, as the
631 libimage-exiftool-perl Debian package seemed to handle the EXIF/XMP
632 tags I ended up using, while python3-exif did not. The relevant EXIF
633 tags only support ASCII, so I had to find better alternatives. XMP
634 seem to have the support I need.
</p
>
636 <p
>I am a bit unsure which EXIF/XMP tags to use, as I would like to
637 use tags that can be easily added/updated using normal free software
638 photo managing software. I ended up using the tags set using this
639 exiftool command, as these tags can also be set using digiKam:
</p
>
641 <blockquote
><pre
>
642 exiftool -headline=
'The RSS image title
' \
643 -description=
'The RSS image description.
' \
644 -subject+=for-family photo.jpeg
645 </pre
></blockquote
>
647 <p
>I initially tried the
"-title
" and
"keyword
" tags, but they were
648 invisible in digiKam, so I changed to
"-headline
" and
"-subject
". I
649 use the keyword/subject
'for-family
' to flag that the photo should be
650 shared with my family. Images with this keyword set are located and
651 copied into my Freedombox for the RSS generating script to find.
</p
>
653 <p
>Are there better ways to do this? Get in touch if you have better
654 suggestions.
</p
>
656 <p
>As usual, if you use Bitcoin and want to show your support of my
657 activities, please send Bitcoin donations to my address
658 <b
><a href=
"bitcoin:
15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a
></b
>.
</p
>