]> pere.pagekite.me Git - homepage.git/blob - blog/index.html
Generated.
[homepage.git] / blog / index.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
4 <head>
5 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
6 <title>Petter Reinholdtsen</title>
7 <link rel="stylesheet" type="text/css" media="screen" href="https://people.skolelinux.org/pere/blog/style.css" />
8 <link rel="stylesheet" type="text/css" media="screen" href="https://people.skolelinux.org/pere/blog/vim.css" />
9 <link rel="alternate" title="RSS Feed" href="https://people.skolelinux.org/pere/blog/index.rss" type="application/rss+xml" />
10 </head>
11 <body>
12 <div class="title">
13 <h1>
14 <a href="https://people.skolelinux.org/pere/blog/">Petter Reinholdtsen</a>
15
16 </h1>
17
18 </div>
19
20
21
22 <div class="entry">
23 <div class="title"><a href="https://people.skolelinux.org/pere/blog/Is_the_desktop_recommending_your_program_for_opening_its_files_.html">Is the desktop recommending your program for opening its files?</a></div>
24 <div class="date">29th January 2023</div>
25 <div class="body"><p>Linux desktop systems
26 <a href="https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html">have
27 standardized</a> how programs present themselves to the desktop
28 system. If a package include a .desktop file in
29 /usr/share/application, Gnome, KDE, LXDE, Xfce and the other desktop
30 environments will pick up the file and use its content to generate the
31 menu of available programs in the system. A lesser known fact is that
32 a package can also explain to the desktop system how to recognize the
33 files created by the program in question, and use it to open these
34 files on request, for example via a GUI file browser.</p>
35
36 <p>A while back I ran into a package that did not tell the desktop
37 system how to recognize its files and was not used to open its files
38 in the file browser and fixed it. In the process I wrote a simple
39 debian/tests/ script to ensure the setup keep working. It might be
40 useful for other packages too, to ensure any future version of the
41 package keep handling its own files.</p>
42
43 <p>For this to work the file format need a useful MIME type that can
44 be used to identify the format. If the file format do not yet have a
45 MIME type, it should define one and preferably also
46 <a href="https://www.iana.org/assignments/media-types/media-types.xhtml">register
47 it with IANA</a> to ensure the MIME type string is reserved.</p>
48
49 <p>The script uses the <tt>xdg-mime</tt> program from xdg-utils to
50 query the database of standardized package information and ensure it
51 return sensible values. It also need the location of an example file
52 for xdg-mime to guess the format of.</p>
53
54 <pre>
55 #!/bin/sh
56 #
57 # Author: Petter Reinholdtsen
58 # License: GPL v2 or later at your choice.
59 #
60 # Validate the MIME setup, making sure motor types have
61 # application/vnd.openmotor+yaml associated with them and is connected
62 # to the openmotor desktop file.
63
64 retval=0
65
66 mimetype="application/vnd.openmotor+yaml"
67 testfile="test/data/real/o3100/motor.ric"
68 mydesktopfile="openmotor.desktop"
69
70 filemime="$(xdg-mime query filetype "$testfile")"
71
72 if [ "$mimetype" != "$filemime" ] ; then
73 retval=1
74 echo "error: xdg-mime claim motor file MIME type is $filemine, not $mimetype"
75 else
76 echo "success: xdg-mime report correct mime type $mimetype for motor file"
77 fi
78
79 desktop=$(xdg-mime query default "$mimetype")
80
81 if [ "$mydesktopfile" != "$desktop" ]; then
82 retval=1
83 echo "error: xdg-mime claim motor file should be handled by $desktop, not $mydesktopfile"
84 else
85 echo "success: xdg-mime agree motor file should be handled by $mydesktopfile"
86 fi
87
88 exit $retval
89 </pre>
90
91 <p>It is a simple way to ensure your users are not very surprised when
92 they try to open one of your file formats in their file browser.</p>
93
94 <p>As usual, if you use Bitcoin and want to show your support of my
95 activities, please send Bitcoin donations to my address
96 <b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
97 </div>
98 <div class="tags">
99
100
101 Tags: <a href="https://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="https://people.skolelinux.org/pere/blog/tags/english">english</a>.
102
103
104 </div>
105 </div>
106 <div class="padding"></div>
107
108 <div class="entry">
109 <div class="title"><a href="https://people.skolelinux.org/pere/blog/Opensnitch__the_application_level_interactive_firewall__heading_into_the_Debian_archive.html">Opensnitch, the application level interactive firewall, heading into the Debian archive</a></div>
110 <div class="date">22nd January 2023</div>
111 <div class="body"><p>While reading a
112 <a href="https://sneak.berlin/20230115/macos-scans-your-local-files-now/">blog
113 post claiming MacOS X recently started scanning local files and
114 reporting information about them to Apple</a>, even on a machine where
115 all such callback features had been disabled, I came across a
116 description of the Little Snitch application for MacOS X. It seemed
117 like a very nice tool to have in the tool box, and I decided to see if
118 something similar was available for Linux.</p>
119
120 <p>It did not take long to find
121 <a href="https://github.com/evilsocket/opensnitch">the OpenSnitch
122 package</a>, which has been in development since 2017, and now is in
123 version 1.5.0. It has had a
124 <a href="https://bugs.debian.org/909567">request for Debian
125 packaging</a> since 2018, but no-one completed the job so far. Just
126 for fun, I decided to see if I could help, and I was very happy to
127 discover that
128 <a href="https://github.com/evilsocket/opensnitch/issues/304">upstream
129 want a Debian package too</a>.</p>
130
131 <p>After struggling a bit with getting the program to run, figuring
132 out building Go programs (and a little failed detour to look at eBPF
133 builds too - help needed), I am very happy to report that I am
134 sponsoring upstream to maintain the package in Debian, and it has
135 since this morning been waiting in NEW for the ftpmasters to have a
136 look. Perhaps it can get into the archive in time for the Bookworm
137 release?</p>
138
139 <p>As usual, if you use Bitcoin and want to show your support of my
140 activities, please send Bitcoin donations to my address
141 <b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
142 </div>
143 <div class="tags">
144
145
146 Tags: <a href="https://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="https://people.skolelinux.org/pere/blog/tags/english">english</a>.
147
148
149 </div>
150 </div>
151 <div class="padding"></div>
152
153 <div class="entry">
154 <div class="title"><a href="https://people.skolelinux.org/pere/blog/LinuxCNC_MQTT_publisher_component.html">LinuxCNC MQTT publisher component</a></div>
155 <div class="date"> 8th January 2023</div>
156 <div class="body"><p>I watched <a href="https://yewtu.be/watch?v=jmKUV3aNLjk">a 2015
157 video from Andreas Schiffler</a> the other day, where he set up
158 <a href="https://linuxcnc.org/">LinuxCNC</a> to send status
159 information to the MQTT broker IBM Bluemix. As I also use MQTT for
160 graphing, it occured to me that a generic MQTT LinuxCNC component
161 would be useful and I set out to implement it. Today I got the first
162 draft limping along and submitted as
163 <a href="https://github.com/LinuxCNC/linuxcnc/pull/2253">a patch to the
164 LinuxCNC project</a>.</p>
165
166 <p>The simple part was setting up the MQTT publishing code in Python.
167 I already have set up other parts submitting data to my Mosquito MQTT
168 broker, so I could reuse that code. Writing a LinuxCNC component in
169 Python as new to me, but using existing examples in the code
170 repository and the extensive documentation, this was fairly straight
171 forward. The hardest part was creating a automated test for the
172 component to ensure it was working. Testing it in a simulated
173 LinuxCNC machine proved very useful, as I discovered features I needed
174 that I had not thought of yet, and adjusted the code quite a bit to
175 make it easier to test without a operational MQTT broker
176 available.</p>
177
178 <p>The draft is ready and working, but I am unsure which LinuxCNC HAL
179 pins I should collect and publish by default (in other words, the
180 default set of information pieces published), and how to get the
181 machine name from the LinuxCNC INI file. The latter is a minor
182 detail, but I expect it would be useful in a setup with several
183 machines available. I am hoping for feedback from the experienced
184 LinuxCNC developers and users, to make the component even better
185 before it can go into the mainland LinuxCNC code base.</p>
186
187 <p>Since I started on the MQTT component, I came across
188 <a href="https://yewtu.be/watch?v=Bqa2grG0XtA">another video from Kent
189 VanderVelden</a> where he combine LinuxCNC with a set of screen glasses
190 controlled by a Raspberry Pi, and it occured to me that it would
191 be useful for such use cases if LinuxCNC also provided a REST API for
192 querying its status. I hope to start on such component once the MQTT
193 component is working well.</p>
194
195 <p>As usual, if you use Bitcoin and want to show your support of my
196 activities, please send Bitcoin donations to my address
197 <b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
198 </div>
199 <div class="tags">
200
201
202 Tags: <a href="https://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="https://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="https://people.skolelinux.org/pere/blog/tags/linuxcnc">linuxcnc</a>, <a href="https://people.skolelinux.org/pere/blog/tags/robot">robot</a>.
203
204
205 </div>
206 </div>
207 <div class="padding"></div>
208
209 <div class="entry">
210 <div class="title"><a href="https://people.skolelinux.org/pere/blog/ONVIF_IP_camera_management_tool_finally_in_Debian.html">ONVIF IP camera management tool finally in Debian</a></div>
211 <div class="date">24th December 2022</div>
212 <div class="body"><p>Merry Christmas to you all. Here is a small gift to all those with
213 IP cameras following the <a href="https://www.onvif.org/">ONVIF
214 specification</a>. There is finally a nice command line and GUI tool
215 in Debian to manage ONVIF IP cameras. After working with upstream for
216 a few months and sponsoring the upload, I am very happy to report that
217 the <a href="https://tracker.debian.org/libonvif">libonvif package</a>
218 entered Debian Sid last night.</p>
219
220 <p>The package provide a C library to communicate with such cameras, a
221 command line tool to locate and update settings of (like password) the
222 cameras and a GUI tool to configure and control the units as well as
223 preview the video from the camera. Libonvif is available on Both
224 Linux and Windows and the GUI tool uses the Qt library. The main
225 competitors are non-free software, while libonvif is GNU GPL licensed.
226 I am very glad Debian users in the future can control their cameras
227 using a free software system provided by Debian. But the ONVIF world
228 is full of slightly broken firmware, where the cameras pretend to
229 follow the ONVIF specification but fail to set some configuration
230 values or refuse to provide video to more than one recipient at the
231 time, and the onvif project is quite young and might take a while
232 before it completely work with your camera. Upstream seem eager to
233 improve the library, so handling any broken camera might be just <a
234 href="https://github.com/sr99622/libonvif/">a bug report away</a>.</p>
235
236 <p>The package just cleared NEW, and need a new source only upload
237 before it can enter testing. This will happen in the next few
238 days.</p>
239
240 <p>As usual, if you use Bitcoin and want to show your support of my
241 activities, please send Bitcoin donations to my address
242 <b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
243 </div>
244 <div class="tags">
245
246
247 Tags: <a href="https://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="https://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="https://people.skolelinux.org/pere/blog/tags/multimedia">multimedia</a>, <a href="https://people.skolelinux.org/pere/blog/tags/standard">standard</a>, <a href="https://people.skolelinux.org/pere/blog/tags/surveillance">surveillance</a>.
248
249
250 </div>
251 </div>
252 <div class="padding"></div>
253
254 <div class="entry">
255 <div class="title"><a href="https://people.skolelinux.org/pere/blog/Managing_and_using_ONVIF_IP_cameras_with_Linux.html">Managing and using ONVIF IP cameras with Linux</a></div>
256 <div class="date">19th October 2022</div>
257 <div class="body"><p>Recently I have been looking at how to control and collect data
258 from a handful IP cameras using Linux. I both wanted to change their
259 settings and to make their imagery available via a free software
260 service under my control. Here is a summary of the tools I found.</p>
261
262 <p>First I had to identify the cameras and their protocols. As far as
263 I could tell, they were using some SOAP looking protocol and their
264 internal web server seem to only work with Microsoft Internet Explorer
265 with some proprietary binary plugin, which in these days of course is
266 a security disaster and also made it impossible for me to use the
267 camera web interface. Luckily I discovered that the SOAP looking
268 protocol is actually following <a href="https://www.onvif.org/">the
269 ONVIF specification</a>, which seem to be supported by a lot of IP
270 cameras these days.</p>
271
272 <p>Once the protocol was identified, I was able to find what appear to
273 be the most popular way to configure ONVIF cameras, the free software
274 Windows tool named
275 <a href="https://sourceforge.net/projects/onvifdm/">ONVIF Device
276 Manager</a>. Lacking any other options at the time, I tried
277 unsuccessfully to get it running using Wine, but was missing a dotnet
278 40 library and I found no way around it to run it on Linux.</p>
279
280 <p>The next tool I found to configure the cameras were a non-free Linux Qt
281 client <a href="https://www.lingodigit.com/onvif_nvcdemo.html">ONVIF
282 Device Tool</a>. I did not like its terms of use, so did not spend
283 much time on it.</p>
284
285 <p>To collect the video and make it available in a web interface, I
286 found the Zoneminder tool in Debian. A recent version was able to
287 automatically detect and configure ONVIF devices, so I could use it to
288 set up motion detection in and collection of the camera output. I had
289 initial problems getting the ONVIF autodetection to work, as both
290 Firefox and Chromium <a href="https://bugs.debian.org/1001188">refused
291 the inter-tab communication</a> being used by the Zoneminder web
292 pages, but managed to get konqueror to work. Apparently the "Enhanced
293 Tracking Protection" in Firefox cause the problem. I ended up
294 upgrading to the Bookworm edition of Zoneminder in the process to try
295 to fix the issue, and believe the problem might be solved now.</p>
296
297 <p>In the process I came across the nice Linux GUI tool
298 <a href="https://gitlab.com/caspermeijn/onvifviewer/">ONVIF Viewer</a>
299 allowing me to preview the camera output and validate the login
300 passwords required. Sadly its author has grown tired of maintaining
301 the software, so it might not see any future updates. Which is sad,
302 as the viewer is sightly unstable and the picture tend to lock up.
303 Note, this lockup might be due to limitations in the cameras and not
304 the viewer implementation. I suspect the camera is only able to
305 provide pictures to one client at the time, and the Zoneminder feed
306 might interfere with the GUI viewer. I have
307 <a href="https://bugs.debian.org/1000820">asked for the tool to be
308 included in Debian</a>.</p>
309
310 <p>Finally, I found what appear to be very nice Linux free software
311 replacement for the Windows tool, named
312 <a href="https://github.com/sr99622/libonvif/">libonvif</a>. It
313 provide a C library to talk to ONVIF devices as well as a command line
314 and GUI tool using the library. Using the GUI tool I was able to change
315 the admin passwords and update other settings of the cameras. I have
316 <a href="https://bugs.debian.org/1021980">asked for the package to be
317 included in Debian</a>.</p>
318
319 <p>As usual, if you use Bitcoin and want to show your support of my
320 activities, please send Bitcoin donations to my address
321 <b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
322
323 <p><strong>Update 2022-10-20</strong>: Since my initial publication of
324 this text, I got several suggestions for more free software Linux
325 tools. There is <a href="https://github.com/quatanium/python-onvif">a
326 ONVIF python library</a> (already
327 <a href="https://bugs.debian.org/824240">requested into Debian</a>) and
328 <a href="https://github.com/FalkTannhaeuser/python-onvif-zeep">a python 3
329 fork</a> using a different SOAP dependency. There is also
330 <a href="https://www.home-assistant.io/integrations/onvif/">support for
331 ONVIF in Home Assistant</a>, and there is an alternative to Zoneminder
332 called <a href="https://www.shinobi.video/">Shinobi</a>. The latter
333 two are not included in Debian either. I have not tested any of these
334 so far.</p>
335 </div>
336 <div class="tags">
337
338
339 Tags: <a href="https://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="https://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="https://people.skolelinux.org/pere/blog/tags/multimedia">multimedia</a>, <a href="https://people.skolelinux.org/pere/blog/tags/standard">standard</a>, <a href="https://people.skolelinux.org/pere/blog/tags/surveillance">surveillance</a>.
340
341
342 </div>
343 </div>
344 <div class="padding"></div>
345
346 <div class="entry">
347 <div class="title"><a href="https://people.skolelinux.org/pere/blog/Time_to_translate_the_Bullseye_edition_of_the_Debian_Administrator_s_Handbook.html">Time to translate the Bullseye edition of the Debian Administrator's Handbook</a></div>
348 <div class="date">12th September 2022</div>
349 <div class="body"><p align="center"><img align="center" src="http://people.skolelinux.org/pere/blog/images/2020-10-20-debian-handbook-nb-testprint.jpeg" width="60%"/></p>
350
351 <p>(The picture is of the previous edition.)</p>
352
353 <p>Almost two years after the previous Norwegian Bokmål translation of
354 the "<a href="https://debian-handbook.info/">The Debian Administrator's
355 Handbook</a>" was published, a new edition is finally being prepared. The
356 english text is updated, and it is time to start working on the
357 translations. Around 37 percent of the strings have been updated, one
358 way or another, and the translations starting from a complete Debian Buster
359 edition now need to bring their translation up from 63% to 100%. The
360 complete book is licensed using a Creative Commons license, and has
361 been published in several languages over the years. The translations
362 are done by volunteers to bring Linux in their native tongue. The
363 last time I checked, it complete text was available in English,
364 Norwegian Bokmål, German, Indonesian, Brazil Portuguese and Spanish.
365 In addition, work has been started for Arabic (Morocco), Catalan,
366 Chinese (Simplified), Chinese (Traditional), Croatian, Czech, Danish,
367 Dutch, French, Greek, Italian, Japanese, Korean, Persian, Polish,
368 Romanian, Russian, Swedish, Turkish and Vietnamese.</p>
369
370 <p>The translation is conducted on
371 <a href="https://hosted.weblate.org/projects/debian-handbook/">the
372 hosted weblate project page</a>. Prospective translators are
373 recommeded to subscribe to
374 <a href="http://lists.alioth.debian.org/mailman/listinfo/debian-handbook-translators">the
375 translators mailing list</a> and should also check out
376 <a href="https://debian-handbook.info/contribute/">the instructions for
377 contributors</a>.</p>
378
379 <p>I am one of the Norwegian Bokmål translators of this book, and we
380 have just started. Your contribution is most welcome.</p>
381
382 <p>As usual, if you use Bitcoin and want to show your support of my
383 activities, please send Bitcoin donations to my address
384 <b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
385 </div>
386 <div class="tags">
387
388
389 Tags: <a href="https://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="https://people.skolelinux.org/pere/blog/tags/debian-handbook">debian-handbook</a>, <a href="https://people.skolelinux.org/pere/blog/tags/english">english</a>.
390
391
392 </div>
393 </div>
394 <div class="padding"></div>
395
396 <div class="entry">
397 <div class="title"><a href="https://people.skolelinux.org/pere/blog/Automatic_LinuxCNC_servo_PID_tuning_.html">Automatic LinuxCNC servo PID tuning?</a></div>
398 <div class="date">16th July 2022</div>
399 <div class="body"><p>While working on a CNC with servo motors controlled by the
400 <a href="https://en.wikipedia.org/wiki/LinuxCNC">LinuxCNC</a>
401 <a href="https://en.wikipedia.org/wiki/PID_controller">PID
402 controller</a>, I recently had to learn how to tune the collection of values
403 that control such mathematical machinery that a PID controller is. It
404 proved to be a lot harder than I hoped, and I still have not succeeded
405 in getting the Z PID controller to successfully defy gravity, nor X
406 and Y to move accurately and reliably. But while climbing up this
407 rather steep learning curve, I discovered that some motor control
408 systems are able to tune their PID controllers. I got the impression
409 from the documentation that LinuxCNC were not. This proved to be not
410 true.</p>
411
412 <p>The LinuxCNC
413 <a href="http://linuxcnc.org/docs/html/man/man9/pid.9.html">pid
414 component</a> is the recommended PID controller to use. It uses eight
415 constants <tt>Pgain</tt>, <tt>Igain</tt>, <tt>Dgain</tt>,
416 <tt>bias</tt>, <tt>FF0</tt>, <tt>FF1</tt>, <tt>FF2</tt> and
417 <tt>FF3</tt> to calculate the output value based on current and wanted
418 state, and all of these need to have a sensible value for the
419 controller to behave properly. Note, there are even more values
420 involved, theser are just the most important ones. In my case I need
421 the X, Y and Z axes to follow the requested path with little error.
422 This has proved quite a challenge for someone who have never tuned a
423 PID controller before, but there is at least some help to be found.
424
425 <p>I discovered that included in LinuxCNC was this old PID component
426 at_pid claiming to have auto tuning capabilities. Sadly it had been
427 neglected since 2011, and could not be used as a plug in replacement
428 for the default pid component. One would have to rewriting the
429 LinuxCNC HAL setup to test at_pid. This was rather sad, when I wanted
430 to quickly test auto tuning to see if it did a better job than me at
431 figuring out good P, I and D values to use.</p>
432
433 <p>I decided to have a look if the situation could be improved. This
434 involved trying to understand the code and history of the pid and
435 at_pid components. Apparently they had a common ancestor, as code
436 structure, comments and variable names were quite close to each other.
437 Sadly this was not reflected in the git history, making it hard to
438 figure out what really happened. My guess is that the author of
439 <a href="https://github.com/LinuxCNC/linuxcnc/blob/master/src/hal/components/at_pid.c">at_pid.c</a>
440 took a version of
441 <a href="https://github.com/LinuxCNC/linuxcnc/blob/master/src/hal/components/pid.c">pid.c</a>,
442 rewrote it to follow the structure he wished pid.c to have, then added
443 support for auto tuning and finally got it included into the LinuxCNC
444 repository. The restructuring and lack of early history made it
445 harder to figure out which part of the code were relevant to the auto
446 tuning, and which part of the code needed to be updated to work the
447 same way as the current pid.c implementation. I started by trying to
448 isolate relevant changes in pid.c, and applying them to at_pid.c. My
449 aim was to make sure the at_pid component could replace the pid
450 component with a simple change in the HAL setup loadrt line, without
451 having to "rewire" the rest of the HAL configuration. After a few
452 hours following this approach, I had learned quite a lot about the
453 code structure of both components, while concluding I was heading down
454 the wrong rabbit hole, and should get back to the surface and find a
455 different path.</p>
456
457 <p>For the second attempt, I decided to throw away all the PID control
458 related part of the original at_pid.c, and instead isolate and lift
459 the auto tuning part of the code and inject it into a copy of pid.c.
460 This ensured compatibility with the current pid component, while
461 adding auto tuning as a run time option. To make it easier to identify
462 the relevant parts in the future, I wrapped all the auto tuning code
463 with '#ifdef AUTO_TUNER'. The end result behave just like the current
464 pid component by default, as that part of the code is identical. The
465 <a href="https://github.com/LinuxCNC/linuxcnc/pull/1820">end result
466 entered the LinuxCNC master branch</a> a few days ago.</p>
467
468 <p>To enable auto tuning, one need to set a few HAL pins in the PID
469 component. The most important ones are <tt>tune-effort</tt>,
470 <tt>tune-mode</tt> and <tt>tune-start</tt>. But lets take a step
471 back, and see what the auto tuning code will do. I do not know the
472 mathematical foundation of the at_pid algorithm, but from observation
473 I can tell that the algorithm will, when enabled, produce a square
474 wave pattern centered around the <tt>bias</tt> value on the output pin
475 of the PID controller. This can be seen using the HAL Scope provided
476 by LinuxCNC. In my case, this is translated into voltage (+-10V) sent
477 to the motor controller, which in turn is translated into motor speed.
478 So at_pid will ask the motor to move the axis back and forth. The
479 number of cycles in the pattern is controlled by the
480 <tt>tune-cycles</tt> pin, and the extremes of the wave pattern is
481 controlled by the <tt>tune-effort</tt> pin. Of course, trying to
482 change the direction of a physical object instantly (as in going
483 directly from a positive voltage to the equivalent negative voltage)
484 do not change velocity instantly, and it take some time for the object
485 to slow down and move in the opposite direction. This result in a
486 more smooth movement wave form, as the axis in question were vibrating
487 back and forth. When the axis reached the target speed in the
488 opposing direction, the auto tuner change direction again. After
489 several of these changes, the average time delay between the 'peaks'
490 and 'valleys' of this movement graph is then used to calculate
491 proposed values for Pgain, Igain and Dgain, and insert them into the
492 HAL model to use by the pid controller. The auto tuned settings are
493 not great, but htye work a lot better than the values I had been able
494 to cook up on my own, at least for the horizontal X and Y axis. But I
495 had to use very small <tt>tune-effort<tt> values, as my motor
496 controllers error out if the voltage change too quickly. I've been
497 less lucky with the Z axis, which is moving a heavy object up and
498 down, and seem to confuse the algorithm. The Z axis movement became a
499 lot better when I introduced a <tt>bias</tt> value to counter the
500 gravitational drag, but I will have to work a lot more on the Z axis
501 PID values.</p>
502
503 <p>Armed with this knowledge, it is time to look at how to do the
504 tuning. Lets say the HAL configuration in question load the PID
505 component for X, Y and Z like this:</p>
506
507 <blockquote><pre>
508 loadrt pid names=pid.x,pid.y,pid.z
509 </pre></blockquote>
510
511 <p>Armed with the new and improved at_pid component, the new line will
512 look like this:</p>
513
514 <blockquote><pre>
515 loadrt at_pid names=pid.x,pid.y,pid.z
516 </pre></blockquote>
517
518 <p>The rest of the HAL setup can stay the same. This work because the
519 components are referenced by name. If the component had used count=3
520 instead, all use of pid.# had to be changed to at_pid.#.</p>
521
522 <p>To start tuning the X axis, move the axis to the middle of its
523 range, to make sure it do not hit anything when it start moving back
524 and forth. Next, set the <tt>tune-effort</tt> to a low number in the
525 output range. I used 0.1 as my initial value. Next, assign 1 to the
526 <tt>tune-mode</tt> value. Note, this will disable the pid controlling
527 part and feed 0 to the output pin, which in my case initially caused a
528 lot of drift. In my case it proved to be a good idea with X and Y to
529 tune the motor driver to make sure 0 voltage stopped the motor
530 rotation. On the other hand, for the Z axis this proved to be a bad
531 idea, so it will depend on your setup. It might help to set the
532 <tt>bias</tt> value to a output value that reduce or eliminate the
533 axis drift. Finally, after setting <tt>tune-mode</tt>, set
534 <tt>tune-start</tt> to 1 to activate the auto tuning. If all go well,
535 your axis will vibrate for a few seconds and when it is done, new
536 values for Pgain, Igain and Dgain will be active. To test them,
537 change <tt>tune-mode</tt> back to 0. Note that this might cause the
538 machine to suddenly jerk as it bring the axis back to its commanded
539 position, which it might have drifted away from during tuning. To
540 summarize with some halcmd lines:</p>
541
542 <blockquote><pre>
543 setp pid.x.tune-effort 0.1
544 setp pid.x.tune-mode 1
545 setp pid.x.tune-start 1
546 # wait for the tuning to complete
547 setp pid.x.tune-mode 0
548 </pre></blockquote>
549
550 <p>After doing this task quite a few times while trying to figure out
551 how to properly tune the PID controllers on the machine in, I decided
552 to figure out if this process could be automated, and wrote a script
553 to do the entire tuning process from power on. The end result will
554 ensure the machine is powered on and ready to run, home all axis if it
555 is not already done, check that the extra tuning pins are available,
556 move the axis to its mid point, run the auto tuning and re-enable the
557 pid controller when it is done. It can be run several times. Check
558 out the
559 <a href="https://github.com/SebKuzminsky/MazakVQC1540/blob/bon-dev/scripts/run-auto-pid-tuner">run-auto-pid-tuner</a>
560 script on github if you want to learn how it is done.</p>
561
562 <p>My hope is that this little adventure can inspire someone who know
563 more about motor PID controller tuning can implement even better
564 algorithms for automatic PID tuning in LinuxCNC, making life easier
565 for both me and all the others that want to use LinuxCNC but lack the
566 in depth knowledge needed to tune PID controllers well.</p>
567
568 <p>As usual, if you use Bitcoin and want to show your support of my
569 activities, please send Bitcoin donations to my address
570 <b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
571 </div>
572 <div class="tags">
573
574
575 Tags: <a href="https://people.skolelinux.org/pere/blog/tags/3d-printer">3d-printer</a>, <a href="https://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="https://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="https://people.skolelinux.org/pere/blog/tags/linuxcnc">linuxcnc</a>, <a href="https://people.skolelinux.org/pere/blog/tags/robot">robot</a>.
576
577
578 </div>
579 </div>
580 <div class="padding"></div>
581
582 <div class="entry">
583 <div class="title"><a href="https://people.skolelinux.org/pere/blog/My_free_software_activity_of_late__2022_.html">My free software activity of late (2022)</a></div>
584 <div class="date">20th June 2022</div>
585 <div class="body"><p>I guess it is time to bring some light on the various free software
586 and open culture activities and projects I have worked on or been
587 involved in the last year and a half.</p>
588
589 <p>First, lets mention the book
590 <a href="http://www.hungry.com/~pere/publisher/">releases I managed to
591 publish</a>. The Cory Doctorow book "Hvordan knuse
592 overvåkningskapitalismen" argue that it is not the magic machine
593 learning of the big technology companies that causes the surveillance
594 capitalism to thrive, it is the lack of trust busting to enforce
595 existing anti-monopoly laws. I also published a family of
596 dictionaries for machinists, one sorted on the English words, one
597 sorted on the Norwegian and the last sorted on the North Sámi words.
598 A bit on the back burner but not forgotten is the Debian
599 Administrators Handbook, where a new edition is being worked on. I
600 have not spent as much time as I want to help bring it to completion,
601 but hope I will get more spare time to look at it before the end of
602 the year.</p>
603
604 <p>With my Debian had I have spent time on several projects, both
605 updating existing packages, helping to bring in new packages and
606 working with upstream projects to try to get them ready to go into
607 Debian. The list is rather long, and I will only mention my own
608 isenkram, openmotor, vlc bittorrent plugin, xprintidle, norwegian
609 letter style for latex, bs1770gain, and recordmydesktop. In addition
610 to these I have sponsored several packages into Debian, like audmes.</p>
611
612 <p>The last year I have looked at several infrastructure projects for
613 collecting meter data and video surveillance recordings. This include
614 several ONVIF related tools like onvifviewer and zoneminder as well as
615 rtl-433, wmbusmeters and rtl-wmbus.</p>
616
617 <p>In parallel with this I have looked at fabrication related free
618 software solutions like pycam and LinuxCNC. The latter recently
619 gained improved translation support using po4a and weblate, which was
620 a harder nut to crack that I had anticipated when I started.</p>
621
622 <p>Several hours have been spent translating free software to
623 Norwegian Bokmål on the Weblate hosted service. Do not have a
624 complete list, but you will find my contributions in at least gnucash,
625 minetest and po4a.</p>
626
627 <p>I also spent quite some time on the Norwegian archiving specification
628 Noark 5, and its companion project Nikita implementing the API
629 specification for Noark 5.</p>
630
631 <p>Recently I have been looking into free software tools to do company
632 accounting here in Norway., which present an interesting mix between
633 law, rules, regulations, format specifications and API interfaces.</p>
634
635 <p>I guess I should also mention the Norwegian community driven
636 government interfacing projects Mimes Brønn and Fiksgatami, which have
637 ended up in a kind of limbo while the future of the projects is being
638 worked out.</p>
639
640 <p>These are just a few of the projects I have been involved it, and
641 would like to give more visibility. I'll stop here to avoid delaying
642 this post.</p>
643
644 <p>As usual, if you use Bitcoin and want to show your support of my
645 activities, please send Bitcoin donations to my address
646 <b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
647 </div>
648 <div class="tags">
649
650
651 Tags: <a href="https://people.skolelinux.org/pere/blog/tags/english">english</a>.
652
653
654 </div>
655 </div>
656 <div class="padding"></div>
657
658 <div class="entry">
659 <div class="title"><a href="https://people.skolelinux.org/pere/blog/LinuxCNC_translators_life_just_got_a_bit_easier.html">LinuxCNC translators life just got a bit easier</a></div>
660 <div class="date"> 3rd June 2022</div>
661 <div class="body"><p>Back in oktober last year, when I started looking at the
662 <a href="https://en.wikipedia.org/wiki/LinuxCNC">LinuxCNC</a> system, I
663 proposed to change the documentation build system make life easier for
664 translators. The original system consisted of independently written
665 documentation files for each language, with no automated way to track
666 changes done in other translations and no help for the translators to
667 know how much was left to translated. By using
668 <a href="https://po4a.org/">the po4a system</a> to generate POT and PO
669 files from the English documentation, this can be improved. A small
670 team of LinuxCNC contributors got together and today our labour
671 finally payed off. Since a few hours ago, it is now possible to
672 translate <a href="https://hosted.weblate.org/projects/linuxcnc/">the
673 LinuxCNC documentation on Weblate</a>, alongside the program itself.</p>
674
675 <p>The effort to migrate the documentation to use po4a has been both
676 slow and frustrating. I am very happy we finally made it.</p>
677
678 <p>As usual, if you use Bitcoin and want to show your support of my
679 activities, please send Bitcoin donations to my address
680 <b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
681 </div>
682 <div class="tags">
683
684
685 Tags: <a href="https://people.skolelinux.org/pere/blog/tags/3d-printer">3d-printer</a>, <a href="https://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="https://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="https://people.skolelinux.org/pere/blog/tags/linuxcnc">linuxcnc</a>, <a href="https://people.skolelinux.org/pere/blog/tags/robot">robot</a>.
686
687
688 </div>
689 </div>
690 <div class="padding"></div>
691
692 <div class="entry">
693 <div class="title"><a href="https://people.skolelinux.org/pere/blog/geteltorito_make_CD_firmware_upgrades_a_breeze.html">geteltorito make CD firmware upgrades a breeze</a></div>
694 <div class="date">20th April 2022</div>
695 <div class="body"><p>Recently I wanted to upgrade the firmware of my thinkpad, and
696 located the firmware download page from Lenovo (which annoyingly do
697 not allow access via Tor, forcing me to hand them more personal
698 information that I would like). The
699 <a href="https://support.lenovo.com/no/en/search?query=thinkpad firmware bios upgrade iso&SearchType=Customer search&searchLocation=Masthead">download
700 from Lenovo</a> is a bootable ISO image, which is a bit of a problem
701 when all I got available is a USB memory stick. I tried booting the
702 ISO as a USB stick, but this did not work. But genisoimage came to
703 the rescue.</p>
704
705 <P>The geteltorito program in
706 <a href="http://tracker.debian.org/cdrkit">the genisoimage binary
707 package</a> is able to convert the bootable ISO image to a bootable
708 USB stick using a simple command line recipe, which I then can write
709 to the most recently inserted USB stick:</p>
710
711 <blockquote><pre>
712 geteltorito -o usbstick.img lenovo-firmware.iso
713 sudo dd bs=10M if=usbstick.img of=$(ls -tr /dev/sd?|tail -1)
714 </pre></blockquote>
715
716 <p>This USB stick booted the firmware upgrader just fine, and in a few
717 minutes my machine had the latest and greatest BIOS firmware in place.</p>
718 </div>
719 <div class="tags">
720
721
722 Tags: <a href="https://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="https://people.skolelinux.org/pere/blog/tags/english">english</a>.
723
724
725 </div>
726 </div>
727 <div class="padding"></div>
728
729 <p style="text-align: right;"><a href="index.rss"><img src="https://people.skolelinux.org/pere/blog/xml.gif" alt="RSS feed" width="36" height="14" /></a></p>
730 <div id="sidebar">
731
732
733
734 <h2>Archive</h2>
735 <ul>
736
737 <li>2023
738 <ul>
739
740 <li><a href="https://people.skolelinux.org/pere/blog/archive/2023/01/">January (3)</a></li>
741
742 </ul></li>
743
744 <li>2022
745 <ul>
746
747 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/02/">February (1)</a></li>
748
749 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/03/">March (3)</a></li>
750
751 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/04/">April (2)</a></li>
752
753 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/06/">June (2)</a></li>
754
755 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/07/">July (1)</a></li>
756
757 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/09/">September (1)</a></li>
758
759 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/10/">October (1)</a></li>
760
761 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/12/">December (1)</a></li>
762
763 </ul></li>
764
765 <li>2021
766 <ul>
767
768 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/01/">January (2)</a></li>
769
770 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/02/">February (1)</a></li>
771
772 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/05/">May (1)</a></li>
773
774 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/06/">June (1)</a></li>
775
776 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/07/">July (3)</a></li>
777
778 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/08/">August (1)</a></li>
779
780 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/09/">September (1)</a></li>
781
782 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/10/">October (1)</a></li>
783
784 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/12/">December (1)</a></li>
785
786 </ul></li>
787
788 <li>2020
789 <ul>
790
791 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/02/">February (2)</a></li>
792
793 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/03/">March (2)</a></li>
794
795 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/04/">April (2)</a></li>
796
797 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/05/">May (3)</a></li>
798
799 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/06/">June (2)</a></li>
800
801 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/07/">July (1)</a></li>
802
803 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/09/">September (1)</a></li>
804
805 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/10/">October (1)</a></li>
806
807 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/11/">November (1)</a></li>
808
809 </ul></li>
810
811 <li>2019
812 <ul>
813
814 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/01/">January (4)</a></li>
815
816 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/02/">February (3)</a></li>
817
818 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/03/">March (3)</a></li>
819
820 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/05/">May (2)</a></li>
821
822 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/06/">June (5)</a></li>
823
824 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/07/">July (2)</a></li>
825
826 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/08/">August (1)</a></li>
827
828 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/09/">September (1)</a></li>
829
830 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/11/">November (1)</a></li>
831
832 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/12/">December (4)</a></li>
833
834 </ul></li>
835
836 <li>2018
837 <ul>
838
839 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/01/">January (1)</a></li>
840
841 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/02/">February (5)</a></li>
842
843 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/03/">March (5)</a></li>
844
845 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/04/">April (3)</a></li>
846
847 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/06/">June (2)</a></li>
848
849 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/07/">July (5)</a></li>
850
851 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/08/">August (3)</a></li>
852
853 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/09/">September (3)</a></li>
854
855 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/10/">October (5)</a></li>
856
857 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/11/">November (2)</a></li>
858
859 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/12/">December (4)</a></li>
860
861 </ul></li>
862
863 <li>2017
864 <ul>
865
866 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/01/">January (4)</a></li>
867
868 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/02/">February (3)</a></li>
869
870 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/03/">March (5)</a></li>
871
872 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/04/">April (2)</a></li>
873
874 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/06/">June (5)</a></li>
875
876 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/07/">July (1)</a></li>
877
878 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/08/">August (1)</a></li>
879
880 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/09/">September (3)</a></li>
881
882 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/10/">October (5)</a></li>
883
884 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/11/">November (3)</a></li>
885
886 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/12/">December (4)</a></li>
887
888 </ul></li>
889
890 <li>2016
891 <ul>
892
893 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/01/">January (3)</a></li>
894
895 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/02/">February (2)</a></li>
896
897 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/03/">March (3)</a></li>
898
899 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/04/">April (8)</a></li>
900
901 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/05/">May (8)</a></li>
902
903 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/06/">June (2)</a></li>
904
905 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/07/">July (2)</a></li>
906
907 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/08/">August (5)</a></li>
908
909 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/09/">September (2)</a></li>
910
911 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/10/">October (3)</a></li>
912
913 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/11/">November (8)</a></li>
914
915 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/12/">December (5)</a></li>
916
917 </ul></li>
918
919 <li>2015
920 <ul>
921
922 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/01/">January (7)</a></li>
923
924 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/02/">February (6)</a></li>
925
926 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/03/">March (1)</a></li>
927
928 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/04/">April (4)</a></li>
929
930 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/05/">May (3)</a></li>
931
932 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/06/">June (4)</a></li>
933
934 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/07/">July (6)</a></li>
935
936 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/08/">August (2)</a></li>
937
938 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/09/">September (2)</a></li>
939
940 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/10/">October (9)</a></li>
941
942 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/11/">November (6)</a></li>
943
944 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/12/">December (3)</a></li>
945
946 </ul></li>
947
948 <li>2014
949 <ul>
950
951 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/01/">January (2)</a></li>
952
953 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/02/">February (3)</a></li>
954
955 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/03/">March (8)</a></li>
956
957 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/04/">April (7)</a></li>
958
959 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/05/">May (1)</a></li>
960
961 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/06/">June (2)</a></li>
962
963 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/07/">July (2)</a></li>
964
965 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/08/">August (2)</a></li>
966
967 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/09/">September (5)</a></li>
968
969 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/10/">October (6)</a></li>
970
971 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/11/">November (3)</a></li>
972
973 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/12/">December (5)</a></li>
974
975 </ul></li>
976
977 <li>2013
978 <ul>
979
980 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/01/">January (11)</a></li>
981
982 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/02/">February (9)</a></li>
983
984 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/03/">March (9)</a></li>
985
986 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/04/">April (6)</a></li>
987
988 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/05/">May (9)</a></li>
989
990 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/06/">June (10)</a></li>
991
992 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/07/">July (7)</a></li>
993
994 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/08/">August (3)</a></li>
995
996 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/09/">September (5)</a></li>
997
998 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/10/">October (7)</a></li>
999
1000 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/11/">November (9)</a></li>
1001
1002 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/12/">December (3)</a></li>
1003
1004 </ul></li>
1005
1006 <li>2012
1007 <ul>
1008
1009 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/01/">January (7)</a></li>
1010
1011 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/02/">February (10)</a></li>
1012
1013 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/03/">March (17)</a></li>
1014
1015 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/04/">April (12)</a></li>
1016
1017 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/05/">May (12)</a></li>
1018
1019 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/06/">June (20)</a></li>
1020
1021 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/07/">July (17)</a></li>
1022
1023 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/08/">August (6)</a></li>
1024
1025 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/09/">September (9)</a></li>
1026
1027 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/10/">October (17)</a></li>
1028
1029 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/11/">November (10)</a></li>
1030
1031 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/12/">December (7)</a></li>
1032
1033 </ul></li>
1034
1035 <li>2011
1036 <ul>
1037
1038 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/01/">January (16)</a></li>
1039
1040 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/02/">February (6)</a></li>
1041
1042 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/03/">March (6)</a></li>
1043
1044 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/04/">April (7)</a></li>
1045
1046 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/05/">May (3)</a></li>
1047
1048 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/06/">June (2)</a></li>
1049
1050 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/07/">July (7)</a></li>
1051
1052 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/08/">August (6)</a></li>
1053
1054 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/09/">September (4)</a></li>
1055
1056 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/10/">October (2)</a></li>
1057
1058 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/11/">November (3)</a></li>
1059
1060 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/12/">December (1)</a></li>
1061
1062 </ul></li>
1063
1064 <li>2010
1065 <ul>
1066
1067 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/01/">January (2)</a></li>
1068
1069 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/02/">February (1)</a></li>
1070
1071 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/03/">March (3)</a></li>
1072
1073 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/04/">April (3)</a></li>
1074
1075 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/05/">May (9)</a></li>
1076
1077 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/06/">June (14)</a></li>
1078
1079 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/07/">July (12)</a></li>
1080
1081 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/08/">August (13)</a></li>
1082
1083 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/09/">September (7)</a></li>
1084
1085 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/10/">October (9)</a></li>
1086
1087 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/11/">November (13)</a></li>
1088
1089 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/12/">December (12)</a></li>
1090
1091 </ul></li>
1092
1093 <li>2009
1094 <ul>
1095
1096 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/01/">January (8)</a></li>
1097
1098 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/02/">February (8)</a></li>
1099
1100 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/03/">March (12)</a></li>
1101
1102 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/04/">April (10)</a></li>
1103
1104 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/05/">May (9)</a></li>
1105
1106 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/06/">June (3)</a></li>
1107
1108 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/07/">July (4)</a></li>
1109
1110 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/08/">August (3)</a></li>
1111
1112 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/09/">September (1)</a></li>
1113
1114 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/10/">October (2)</a></li>
1115
1116 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/11/">November (3)</a></li>
1117
1118 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/12/">December (3)</a></li>
1119
1120 </ul></li>
1121
1122 <li>2008
1123 <ul>
1124
1125 <li><a href="https://people.skolelinux.org/pere/blog/archive/2008/11/">November (5)</a></li>
1126
1127 <li><a href="https://people.skolelinux.org/pere/blog/archive/2008/12/">December (7)</a></li>
1128
1129 </ul></li>
1130
1131 </ul>
1132
1133
1134
1135 <h2>Tags</h2>
1136 <ul>
1137
1138 <li><a href="https://people.skolelinux.org/pere/blog/tags/3d-printer">3d-printer (19)</a></li>
1139
1140 <li><a href="https://people.skolelinux.org/pere/blog/tags/amiga">amiga (1)</a></li>
1141
1142 <li><a href="https://people.skolelinux.org/pere/blog/tags/aros">aros (1)</a></li>
1143
1144 <li><a href="https://people.skolelinux.org/pere/blog/tags/bankid">bankid (4)</a></li>
1145
1146 <li><a href="https://people.skolelinux.org/pere/blog/tags/betalkontant">betalkontant (9)</a></li>
1147
1148 <li><a href="https://people.skolelinux.org/pere/blog/tags/bitcoin">bitcoin (12)</a></li>
1149
1150 <li><a href="https://people.skolelinux.org/pere/blog/tags/bootsystem">bootsystem (17)</a></li>
1151
1152 <li><a href="https://people.skolelinux.org/pere/blog/tags/bsa">bsa (2)</a></li>
1153
1154 <li><a href="https://people.skolelinux.org/pere/blog/tags/chrpath">chrpath (2)</a></li>
1155
1156 <li><a href="https://people.skolelinux.org/pere/blog/tags/debian">debian (187)</a></li>
1157
1158 <li><a href="https://people.skolelinux.org/pere/blog/tags/debian edu">debian edu (159)</a></li>
1159
1160 <li><a href="https://people.skolelinux.org/pere/blog/tags/debian-handbook">debian-handbook (9)</a></li>
1161
1162 <li><a href="https://people.skolelinux.org/pere/blog/tags/digistan">digistan (11)</a></li>
1163
1164 <li><a href="https://people.skolelinux.org/pere/blog/tags/dld">dld (18)</a></li>
1165
1166 <li><a href="https://people.skolelinux.org/pere/blog/tags/docbook">docbook (30)</a></li>
1167
1168 <li><a href="https://people.skolelinux.org/pere/blog/tags/drivstoffpriser">drivstoffpriser (4)</a></li>
1169
1170 <li><a href="https://people.skolelinux.org/pere/blog/tags/english">english (443)</a></li>
1171
1172 <li><a href="https://people.skolelinux.org/pere/blog/tags/fiksgatami">fiksgatami (23)</a></li>
1173
1174 <li><a href="https://people.skolelinux.org/pere/blog/tags/fildeling">fildeling (14)</a></li>
1175
1176 <li><a href="https://people.skolelinux.org/pere/blog/tags/freeculture">freeculture (34)</a></li>
1177
1178 <li><a href="https://people.skolelinux.org/pere/blog/tags/freedombox">freedombox (9)</a></li>
1179
1180 <li><a href="https://people.skolelinux.org/pere/blog/tags/frikanalen">frikanalen (20)</a></li>
1181
1182 <li><a href="https://people.skolelinux.org/pere/blog/tags/h264">h264 (20)</a></li>
1183
1184 <li><a href="https://people.skolelinux.org/pere/blog/tags/intervju">intervju (43)</a></li>
1185
1186 <li><a href="https://people.skolelinux.org/pere/blog/tags/isenkram">isenkram (16)</a></li>
1187
1188 <li><a href="https://people.skolelinux.org/pere/blog/tags/kart">kart (23)</a></li>
1189
1190 <li><a href="https://people.skolelinux.org/pere/blog/tags/kodi">kodi (4)</a></li>
1191
1192 <li><a href="https://people.skolelinux.org/pere/blog/tags/ldap">ldap (9)</a></li>
1193
1194 <li><a href="https://people.skolelinux.org/pere/blog/tags/lego">lego (5)</a></li>
1195
1196 <li><a href="https://people.skolelinux.org/pere/blog/tags/lenker">lenker (8)</a></li>
1197
1198 <li><a href="https://people.skolelinux.org/pere/blog/tags/linuxcnc">linuxcnc (4)</a></li>
1199
1200 <li><a href="https://people.skolelinux.org/pere/blog/tags/lsdvd">lsdvd (2)</a></li>
1201
1202 <li><a href="https://people.skolelinux.org/pere/blog/tags/ltsp">ltsp (1)</a></li>
1203
1204 <li><a href="https://people.skolelinux.org/pere/blog/tags/madewithcc">madewithcc (3)</a></li>
1205
1206 <li><a href="https://people.skolelinux.org/pere/blog/tags/mesh network">mesh network (8)</a></li>
1207
1208 <li><a href="https://people.skolelinux.org/pere/blog/tags/multimedia">multimedia (44)</a></li>
1209
1210 <li><a href="https://people.skolelinux.org/pere/blog/tags/nice free software">nice free software (13)</a></li>
1211
1212 <li><a href="https://people.skolelinux.org/pere/blog/tags/noark5">noark5 (23)</a></li>
1213
1214 <li><a href="https://people.skolelinux.org/pere/blog/tags/norsk">norsk (320)</a></li>
1215
1216 <li><a href="https://people.skolelinux.org/pere/blog/tags/nuug">nuug (198)</a></li>
1217
1218 <li><a href="https://people.skolelinux.org/pere/blog/tags/offentlig innsyn">offentlig innsyn (40)</a></li>
1219
1220 <li><a href="https://people.skolelinux.org/pere/blog/tags/open311">open311 (2)</a></li>
1221
1222 <li><a href="https://people.skolelinux.org/pere/blog/tags/opphavsrett">opphavsrett (75)</a></li>
1223
1224 <li><a href="https://people.skolelinux.org/pere/blog/tags/personvern">personvern (114)</a></li>
1225
1226 <li><a href="https://people.skolelinux.org/pere/blog/tags/raid">raid (2)</a></li>
1227
1228 <li><a href="https://people.skolelinux.org/pere/blog/tags/reactos">reactos (1)</a></li>
1229
1230 <li><a href="https://people.skolelinux.org/pere/blog/tags/reprap">reprap (11)</a></li>
1231
1232 <li><a href="https://people.skolelinux.org/pere/blog/tags/rfid">rfid (3)</a></li>
1233
1234 <li><a href="https://people.skolelinux.org/pere/blog/tags/robot">robot (17)</a></li>
1235
1236 <li><a href="https://people.skolelinux.org/pere/blog/tags/rss">rss (1)</a></li>
1237
1238 <li><a href="https://people.skolelinux.org/pere/blog/tags/ruter">ruter (7)</a></li>
1239
1240 <li><a href="https://people.skolelinux.org/pere/blog/tags/scraperwiki">scraperwiki (2)</a></li>
1241
1242 <li><a href="https://people.skolelinux.org/pere/blog/tags/sikkerhet">sikkerhet (59)</a></li>
1243
1244 <li><a href="https://people.skolelinux.org/pere/blog/tags/sitesummary">sitesummary (4)</a></li>
1245
1246 <li><a href="https://people.skolelinux.org/pere/blog/tags/skepsis">skepsis (5)</a></li>
1247
1248 <li><a href="https://people.skolelinux.org/pere/blog/tags/standard">standard (74)</a></li>
1249
1250 <li><a href="https://people.skolelinux.org/pere/blog/tags/stavekontroll">stavekontroll (7)</a></li>
1251
1252 <li><a href="https://people.skolelinux.org/pere/blog/tags/stortinget">stortinget (14)</a></li>
1253
1254 <li><a href="https://people.skolelinux.org/pere/blog/tags/surveillance">surveillance (64)</a></li>
1255
1256 <li><a href="https://people.skolelinux.org/pere/blog/tags/sysadmin">sysadmin (5)</a></li>
1257
1258 <li><a href="https://people.skolelinux.org/pere/blog/tags/usenix">usenix (2)</a></li>
1259
1260 <li><a href="https://people.skolelinux.org/pere/blog/tags/valg">valg (9)</a></li>
1261
1262 <li><a href="https://people.skolelinux.org/pere/blog/tags/verkidetfri">verkidetfri (20)</a></li>
1263
1264 <li><a href="https://people.skolelinux.org/pere/blog/tags/video">video (77)</a></li>
1265
1266 <li><a href="https://people.skolelinux.org/pere/blog/tags/vitenskap">vitenskap (4)</a></li>
1267
1268 <li><a href="https://people.skolelinux.org/pere/blog/tags/web">web (42)</a></li>
1269
1270 </ul>
1271
1272
1273 </div>
1274 <p style="text-align: right">
1275 Created by <a href="http://steve.org.uk/Software/chronicle">Chronicle v4.6</a>
1276 </p>
1277
1278 </body>
1279 </html>