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