Monday, August 30, 2021

AWS EC2: price of maxed out burstable instance in unlimited mode

The T instance families, namely T2, T3, T3a, and T4g are burstable. They are designed for low to moderate CPU utilization with intermittent heavy spikes. At times of low CPU utilization below a AWS-defined baseline, your instance collects credits that later can be spent on times of high CU utilization.

A credit gives you one minute of 100% CPU. The credits earned per hour are specified here: T2, T3 and T3a, T4g.

A burstable instance has a setting called "Credit specification" with the two options "standard" and "unlimited". This setting decides what happens if your instance runs out of credits: in standard mode, the CPU is gradually throttled to the baseline; in unlimited mode, the missing credits cost you surplus charges. See also the description of the standard mode and unlimited mode and the EC2 pricing page.

The surplus charge is 0.05 $ per hour and vCPU. So, a maxed out instance costs you (vCPUs - (credits earned per hour / 60)) * 0.05 per hour.

At the time of writing (2021-08-30), this gives for Linux (L) and Windows (W):

TypeBase $/hr (L)Base $/hr (W)Max $/hr (L)Max $/hr (W)

As you can see, especially small instances cost you multiple times the base price if maxed out, while bigger instances get a little more expensive than their C5a counterparts. However, C5a instances give you 3.3 GHz per CPU, while T3a for example gives you only 2.2 GHz.

TL;DR: If you need a lot of CPU continuously, don't use burstable instances. Use one of the C families instead!

Saturday, February 27, 2021

Replace battery of Samsung CLX 6220 FX printer

The Samsung CLX 6220 FX printer needs a CR2032 to keep settings like date and time. To replace it, remove the plastic cover at the back (2 screws at the top, 1 screw at the bottom). Result:
Remove the metal cover (2 screws at the top). Result:

Thursday, July 11, 2019

Exceptions with ... not available
in the stacktrace may be caused by overriding the system property java.ext.dirs. Setting java.ext.dirs has been a popular but dangerous way for adding all jars within a directory to the classpath. Java 9 finally removed the feature ( Versions before Java 9 used the extension directories to find essential jars like sunjce_provider.jar, which contains a lot of algorithms required for SSL/TLS for example. So if you set java.ext.dirs, you may experience exceptions as described above. Solutions: a) include %JRE_HOME%/lib/ext respectively $JRE_HOME/lib/ext into the list of directories you set and hope that the environment variable JRE_HOME is set correctly or b) (much better) use -classpath instead. java and javac accept wildcards in -classpath. JNI does not so you have to write some code to make the expansion yourself.

Thursday, December 24, 2015

PC-Lint: using -estring to suppress MISRA-C warnings in the global wrap-up

Neither the PC-Lint manual nor the Gimpel forum - at least at the time of writing - gives a good recommendation how to suppress MISRA-C warnings in the global wrap-up. This issue pertains for example to the message "Note 960: Violates MISRA 2004 Required Rule 8.9, undefined symbol", which is followed by the name of the undefined symbol. You might have defined this symbol in Assembler, therefore a suppression of this message for this specific symbol is adequate. However:
  • All suppressions that pertain to a specific location in the source code are useless, as this message is raised during global wrap-up, where none of these suppressions apply.
  • -estring(960, "symbol name") is not specific enough: it suppresses most MISRA-C warning about that symbol, not only the violation of rule 8.9. That's only because most MISRA-C warning have message code 960 or 961. Otherwise this is just the right option to suppress message in the global wrap-up.
  • -esym(960, 8.9) disables rules 8.9 for ALL symbols.
  • -estring(960, "undefined symbol*symbol name") doesn't work either: it seems like the whole message text is not matched against the expression, only all parts of the message.
Only through some experimentation I finally found the solution: -estring(960, "undefined symbol", "symbol name") Opposite to other options like -esym, the arguments of the -estring option seem to be AND-ed for the match, not OR-ed. Therefore the above -estring option suppresses the MISRA-C warning about undefined symbols just for "symbol name" and nothing else.

Wednesday, December 9, 2015

PC-Lint: Beware of +libclass default

After using PC-Lint for several years in lots of projects, this one got me nevertheless today. Again.

It started as it had started in various projects before: a developer asking why this earns a warning in that file, but not in some header file. I checked with -vf and sure, the quiet header showed up as a library header. I searched the configuration for any +libdir directive or similiar when the familiarity of this problem struck me like thunder. So here this old but still current article goes:

Say you are using some libraries in your project and have disabled warnings from the headers of the libraries using the -wlib, -elib, or -elibsym options. Some of the platform configuration files created by Gimpel have a lot of -elib options, for example the ones for MS Windows.

To specify which header files are library header files, you use the +libclass, +libdir, +libh, and -library options.

Now here is the catch: the default setting for the +libclass option might classify most of your own header files as library headers and thus apply the relaxed rules for library code to your own code. If warnings appear or vanish when you shift code from one header to another without any apparent reason, it might got you too.

You can easily check if there is a problem with the classification of library headers using the -vf option: PC-Lint outputs for every header file whether it thinks it's a library header or not. You might be in for a surprise!

The default setting for +libclass is (foreign,angle), which means that all headers found via include path and all headers included with angles instead of quotes are library header files (if the -libh and -libdir options don't say otherwise).

This default setting is unfortunate, because I have seen a lot of projects where header files were put into separate directories named "inc" or "public" or something similar and were found via include path. If this holds for your project too, you'll want to change the configuration to +libclass(angle) or +libclass().

Sunday, December 21, 2014

Softwarearchitektur: Checkliste für Wartbarkeit-Szenarien

Szenarien sind ein weit verbreitetes Mittel, um die Qualitätsanforderungen an eine Software zu konkretisieren. Beigetragen hat dazu sicherlich das Software Engineering Institute der Carnegie Mellon University mit seiner szenariobasierten Methode zur Bewertung von Architekturen, genannt ATAM (Architecture Tradeoff Analysis Method).

Szenarien kommen also in zwei Situationen zum Einsatz: bei der Anforderungsklärung, um eine passende Software Architektur zu definieren, sowie bei der Bewertung einer Software Architektur, ob die Qualtitätsanforderungen ausreichend adressiert werden.

Ein Szenario hat vor allem folgende Attribute:

  • Stimulus: ein Ereignis, auf das die Software reagieren muss. Je nachdem, welches Qualitätsattribut durch das Szenario präzisiert wird (Wartbarkeit, Verläßlichkeit, Effizienz, etc), können das ganz unterschiedliche Dinge sein: die Installation der Software, eine Benutzereingabe, eine Nachricht von einem Fremdsystem, die Knappheit oder der Ausfall einer Resource, eine Änderungsanfrage vom Produktmanager oder noch was ganz anderes.
  • Response: die erwartete Reaktion der Software auf den Stimulus. Das kann die Beantwortung der Benutzereingabe, die Aufrechterhaltung des Betriebs trotz Teilausfalls oder die durchzuführenden Änderungen an der Software sein. Stimulus und Response sollten so konkret formuliert sein, dass tatsächlich eine Umsetzbarkeit durch den Architekten beziehungsweise eine Bewertung der Architektur möglich ist. Idealerweise ist die Metrik und der Zielwert für die Response exakt angegeben.

Weitere Attribute können sein:

  • ein Name für das Szenario
  • Quelle des Stimulus
  • Umgebung, in der das Szenario abläuft: beim Endnutzer, beim Entwickler, während der Installation, im degradierten Betrieb etc.
  • der Zielwert für die Repsonse
  • die Metrik für die Messung des Zielwerts
  • der Autor oder Ansprechpartner für Rückfragen
  • eine ID

Außerdem werden im Zuge einer Architekturbewertung natürlich alle Architekturentscheidungen, die eine Relevanz für das Szenario haben, diesem zugeordnet.

Bei der Arbeit mit Szenarien helfen Checklisten, alle wichtigen Details von Stimulus und Response zu erfassen und relevante Architekturentscheidungen zu identifizieren. Meine aktuelle Checkliste für Szenarien bezüglich Wartbarkeit sieht wie folgt aus:

Diese Checkliste basiert auf eigener Erfahrung und:

  • Appendix A Attribute Characteristics in ATAM: Method for Architecture Evaluation von Rick Kazman, Mark Klein, Paul Clements und
  • Applicability of General Scenarios to the Architecture Tradeoff Analysis Method von Len Bass, Mark Klein, Gabriel Moreno

Feedback willkommen: Hilft Dir das so? Was würdest Du ergänzen?

Friday, June 20, 2014

PC-Lint: -e??? and -elib(???) have not the effect you might expect

Sometimes I see -elib(???) in my clients' PC-Lint configuration. The intention is to suppress all but syntax errors from library headers. This doesn't work for two reasons. The first one: most syntax errors have a two digit error code, but not all. The reserved range for syntax errors is 1 - 199. This is documented in the PC-Lint manual.

The second reason really took me by surprise as I found out that -elib(???) also suppresses error code 10. I tested this with PC-Lint 9.00k and also the current beta version 9.00k2 and also with -e???. I was informed by the Gimpel support that for historical reasons, a pattern consisting entirely of question marks is treated as a star (*). This is something we recently reviewed and intend to change in the near future as the current behavior is not documented and, as you demonstrate, not intuitive.

So -e??? and -elib(???) have the same effect as -e* and -elib(*) but won't give you the very deserved warning 686: Option '-e*' is suspicious because of 'the likelihood of causing meaningless output'; receiving a syntax error inside a library file most likely means something is wrong with your Lint confinguration. This warning also explains why you should never suppress syntax errors even from library headers. Except for the very rare causes where library headers raise syntax error even with a perfect PC-Lint configuration. You can find a few examples in the co-... files supplied by Gimpel. And then you should only suppress that single syntax error, not all.

Instead of -elib(???) you should use -wlib(1). This actually suppresses all library messages except syntactic errors.

Friday, February 21, 2014

Fixing Outlook synchronization issue 0x000710D2 (no instances) when synchronizing Google Calendar

I got annoyed with the following warning whenever Outlook synchronized my Google Calendar: Task 'Internet Calendar Subscriptions' reported error (0x000710D2) : 'The VEVENT, "...", defined near line ..., contains a recurrence pattern that has no instances.'

So I downloaded the ICS (via the URL you had to enter when configuring the synchronization between Outlook and Google Calendar) and looked at the VEVENT at the specified line. There I found the name of the event and went to Google Calender to delete the problematic event. Alas, bummer: the search did not show up the event. Nor did scrolling through the calendar within the date range of the VEVENT.

So instead I made friends with the Google API explorer:

  1. Go into Outlook account settings, find your internet calendar, and copy the URL address of the calendar.
  2. Paste that URL into a browser and go. Choose "save" When asked to save or open the file.
  3. Open the downloaded text file with some application that shows line numbers. Most text editors will do. You might as well use MS Excel.
  4. Scroll down to the vicinity of the line number cited in the offending error message. Verify that this is the troublemaker, and then find the line starting “UID: “. This is the iCalUID that you will need later.
  5. Go to the Google Calendar API
  6. Enable authentication with the OAuth slider on the right. A dialog "Select OAuth 2.0 scopes" pops up. Check both options and click Authorize
  7. Click calendar.calendarList.list and then Execute on the following page. Below the Execute button, two headlines Request and Response. If the Response is 401 Unauthorized, the previous step has failed. Try again. Otherwise you get a list of your calendars with each entry starting like this: { "kind": "calendar#calendarListEntry", "etag": ... "id": "THIS IS THE ID OF THE CALENDAR", "summary": "THIS IS THE NAME OF THE CALENDAR", Put down the ID of the calendar. The ID of your main calendar seems to be identical with your email address.
  8. Use with the calendar ID and the iCalUID from the ICS. You should get only a single entry like this: { "kind": "calendar#event", "etag": ... "id": "THE ID THAT WE NEED", "status": "confirmed", ... "summary": "THIS IS THE NAME OF THE EVENT", ... Put down the ID of the event. This ID seems to be just the same as the one in the ICS without at the. Just specifying the calendar ID should show up ALL events, but the problematic event showed up only if you specified its iCalUID.
  9. Use with the calendar ID and event ID to delete the event. Problem solved!

In hindsight, you may as well go directly to and use your email address for calendarId and the ID from the ICS without for eventId. But no guarantee.

Now this was really fun. Felt a little like debugging sendmail via telnet on 25.

Update on May 28th 2014 because authorizaton changed and more explicit steps were requested.

Update on July 15th 2014: more details how to get the iCalUID. Thanks to Linda Stoutenburgh!

Thursday, February 20, 2014

Logging best practices and binary logger

The splunk website offers some logging best practices that I'd like to compare with binary logger, a small library I wrote to reduce the load caused by logging on small embedded devices.

Here are the best practices and how binary logger relates to them:

  • Use clear key-value pairs. This is also called structured logging and is one of the techniques recommended to try by the latest ThoughtWorks technology radar. With binary logger this is possible without ANY additional load on the embedded device (not ROM, not RAM, not CPU, not bandwidth).
  • Create events that humans can read. Obviously, binary logger can't offer this. You need a script (provided with the library) and the originally source code to decipher the binary log stream. On the other hand you can be really verbose in the decrypted log and strive for maximum readability without any load on the embedded device.
  • Use timestamps for every event. Do it! It doesn't cost you much with binary logger.
  • Use unique identifiers (IDs). See last point.
  • Log in text format. Again, this is where binary logger has its weakness.
  • Use developer-friendly formats. See first point: you are rather free in the format because it doesn't cost you any load on the embedded device.
  • Log more than just debugging events. Because logging with binary logger is very cheap on resources like stack, you might add logging messages where you couldn't with a standard logging facility.
  • Use categories. Adding categories to log messages costs you nothing on the embedded device with binary logger if you add them as static text.
  • Identify the source. The binary log stream format automatically contains the source of any log event, because it's needed for deciphering the binary log stream.
  • Keep multi-line events to a minimum. Do as you like with binary logger.

I think the above best practices are really good advice. Binary logger might help you to follow them when the constraints of your embedded device would normally let you refrain from it. I'd love your feedback on this post and binary logger!

Monday, January 13, 2014

Highly configurable source code formatting / indentation for Visual Studio

The latest release of Clang incorporates a new tool: clang-format. clang-format is a highly configurable source code formatting tool for C, C++ and Objective-C code.

clang-format is available as a plugin for Visual Studio 2010 and later from the bottom of this page. Just download and install, mark the source code to be formatted (Ctrl-A) and either select TOOLS|ClangFormat from the menu or simply press Ctrl-R Ctrl-F. This formats the selected code using the standard configuration. It also inserts and removes line breaks as seen fit.

There are multiple options how to give a different configuration to clang-format. Select TOOLS|Options from the menu and have a look:

Comment if you like this or have a better tool at hand!

Saturday, November 16, 2013

Proof of concept: unload formatting of log messages from embedded device

Elecia White explains in Making Embedded Systems: Design Patterns for Great Software how you should unload tasks from the device to the host to save precious processing power for things that must run on the device. This inspired me to show how you can offload the formatting of log messages from the device. The result is a very simple C logging library for the device and a few nifty Ruby scripts for the host. The C library uses some processor magic to mark the logging messages for the Ruby scripts and create a shorthand syntax for outputting log messages. There are still some things to do to turn it into production ready code like decoupling the logging library call and the actual output on the periphery. But hey, it's just a proof of concept! You can find it at There is also a job running on Travis-CI ( showing you the output of the latest version.

Wednesday, August 21, 2013

Disable dialog asking to debug or close program

This dialog is quite pesky if your unit tests run automatically and one of them crashes. Instead of the test executor being notified about the crash, the unit test sits there forever waiting for the user to react. Of course the test executor could implement a timeout and shoot the process down. Another option is to disable the dialog. Just add the following to your registry: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug] "Debugger"="drwtsn32 -p %ld -e %ld -g" "Auto"="1" This activates Dr. Watson as the automatically selected debugger. Dr. Watson will create a crash dump for post-mortem debugging. Alternatively you can select some other debugger or tool, but you can't leave it empty for the solution to work.

Tuesday, April 9, 2013

How to debug an unexpected UAC prompt

Recently a self created executable showed the UAC prompt and it wasn't clear why. It sure didn't need administrative privileges. So how to debug this?

Wikipedia tells the UAC prompt can be triggered by:

  • the "Run the program as an administrator" compatibility option. Just check the file properties
  • the executable's manifest: if requestedExecutionLevel is present and is not asInvoker, the UAC prompt is triggered. An external manifest can be just opened with a text viewer. Also check for an embedded manifest: open the executable file in Visual Studio and check the RT_MANIFEST resource. If Visual Studio displays an error message that there are no resources, you are fine. Without resources there is no embedded manifest
  • the UAC heuristic: it checks the file name, the string resources, the manifest for keywords that indicate an installer

In my case it was the UAC heuristic. To be specific, the UAC prompt was triggered by the long and cryptic (and automatically generated) file name. Some sequence in it told UAC that this must be an installer. So renaming the file fixed the problem - no UAC prompt any more.

Friday, April 5, 2013

Why backups if you have a NAS?

I recently bought a Synology DS212j and set up a SHR (RAID1 with extra features). Then - after some toyingthorough feature evaluation - I configured backup tasks using the Time Backup extension.

Why, you might ask, do you really think two hard disks are going to crash at the same moment?

No, I don't. But mirroring doesn't protect us against files being corrupted by faulty applications. Or accidentally deleted. Thanks to Jeff Mitchell for the reminder.

BTW: What IS the probability of two hard disks in a RAID array failing? Two hard disks from the same lot? With the exact same load through all their lifetime? Within the time frame that it takes to rebuild the RAID?

Synology: Time Backup on DiskStation has failed. Please check the package log for further information.

Today my new Synology DS212j notified me via email about: Time Backup on DiskStation has failed. Please check the package log for further information.

Aside from the email notification and missing versions in the timeline, I could not find any indication of the error nor its reason in the general web interface nor the Time Backup web interface.

Google told me that the Time Backup package log could be found at /var/log/timebkp.log.

So I logged in via ssh and found: {WARN}{1365130850}{...}{Task [matthias] has failed to backup shared folder [matthias] due to [error occurred while copying files].} {ERR}{1365130850}{matthias}{Task [matthias] has failed to backup version [20130405-0500] due to [error occurred while copying files].}

Not very informative. However, in the sibling /var/log/timebkp.debug I found: Apr 05 00:00:54 [14260]BK_ERR:rsync return with error, return code = 41

Which led me to notify the file /var/log/rsync.error which hold the solution: Apr 05 00:00:53 (14436) [ERROR] log.c (350): rsync: recv_generator: mkdir "/volumeUSB1/usbshare/TimeBackup/..." failed: No space left on device (28)

I was first confused because the device had plenty of space left, but then realized that the ext4 file system had run out of inodes. I had originally provisioned the file system for another purpose and therefore reduced the inode count by factor 256. This and the habit of Time Backup to use lots of hard links which consume an inode per hard link had created the inode shortage.

As ext4 doesn't allow to increase the inode count I had to re-create the file system.

I plugged the hard disk back into the Synology and issued "Back Up Now" for all backup tasks. I had expected the version count to be reset to 1, but instead it retained the version count. Uneasy with this obvious difference between Time Backup and the content of the hard disk I resorted to deleting and re-creating all backup tasks. This seems to have done it.

Update 2013-12-13: The file system has run out of inodes again. Seems like you should use an above standard ratio of inodes to size for Time Backup.

Saturday, February 16, 2013

I really like SnagIt the screen logger

Recently I was searching for a screen logger that would save my actions while trying to reproduce a hard to find bug. I found SnagIt, the award winning software. And I really liked it. First of all I was up and running with SnagIt in an instant. Getting the evaluation key, download, installation, firing it up - a matter of minutes. The system under test was a PC simulation of a two channel medical device. Meaning: there are two processes monitoring each other with quite sharp timeouts. Meaning: any CPU intensive task might make the simulation go into safe state, because one of the channels doesn't get enough CPU time. SnagIt is light enough on the CPU to not disturb this quite sensitive application. The third thing I noticed was the very nice end result: a quite small video file that exactly captured the application and my interaction with it. Perfect to be attached to a bug report.

Saturday, December 8, 2012

PC-Lint might include wrong system header files

PC-Lint uses by default the environment variable INCLUDE to find system header files. This environment variable might not be set suitably, especially if you have multiple toolchains installed.

In my case I ended up with PC-Lint including Visual Studio header files when checking a Renesas HEW compiled code base. The worst: I got plausible results, so I found it out only accidentally when I switched on the -vf option.

Running PC-Lint with the -vf option from time to time is a good idea anyway to check which files are considered library headers or library modules, which files are actually processed and - which headers are included.

To fix the behavior of PC-Lint I suggest: -incvar(PLEASE_IGNORE_INCLUDE) This tells PC-Lint to use the environment variable PLEASE_IGNORE_INCLUDE instead of INCLUDE. I found no way to just tell PC-Lint not to use any environment variable, just how to change the name of the used environment variable.

Monday, November 12, 2012

Neuer Artikel: Technische Schulden in der Unternehmensarchitektur

Die iX 10/2012 enthält einen neuen Artikel von Dr. Georg Molter über technische Schulden in Unternehmensarchitekturen, bei dem ich als Co-Autor mitwirken durfte, auch nachzulesen auf SlideShare.

Friday, September 7, 2012

Neuer Artikel über Softwarequalität und technische Schulden

Die aktuelle iX 9/2012 enthält einen neuen Artikel von mir über Softwarequalität und technische Schulden, auch nachzulesen auf slideshare.

Wirtschaftlich testen

Ein neuer Artikel von mir in der aktuellen MED engineering 09-10/2012 über das wirtschaftliche Testen von Software (in Medizinprodukten), auch bei slideshare nachzulesen. Über das Thema werde ich auch auf der Electronics goes medical sprechen.

Monday, September 3, 2012

German article about software quality and technical debt

The iX current issue 9/2012 contains an article by me about software quality and technical debt. You can also read it on slideshare.

Wednesday, April 11, 2012

BfR: Nickel und Duftstoffen in Spielzeug

Sind die Kleinen erst einmal sensibilisiert durch zuviel Nickel und Duftstoffen in Spielzeug und Kleidung, bleibt die Allergie ein Leben lang bestehen. Jeder Kontakt führt dann zu einer allergischen Reaktion. Leider sind die Grenzwerte viel zu hoch. Teilweise ist sogar unklar, ob die Grenzwerte nur für Kleidung oder auch Spielzeug gelten. Deswegen muss jeder selbst aufpassen, was er seinen Kindern kauft: Kontaktallergene in Spielzeug

Friday, March 30, 2012

Things you should have in your rakefiles

Ensure that stdout and stderr output is properly ordered and not neatly separated: $stdout.sync=true $stderr.sync=true

Always print stack trace on error instead of only if --trace option was given: Rake.application.options.trace = true

Update 2012-04-10: More intrusive variant - enable stack trace on error but not progress messages: module Rake class Application def standard_exception_handling begin yield rescue SystemExit => ex # Exit silently with current status raise rescue OptionParser::InvalidOption => ex # Exit silently exit(false) rescue Exception => ex # Exit with error message $stderr.puts "Exception: #{ex.message}" $stderr.puts ex.backtrace.join("\n") exit(false) end end end end

Don't truncate rake -T output. Alternative to fiddling with environment variables: Rake.application.terminal_columns = 999

Friday, March 16, 2012

LNK2023: bad DLL or entry point 'msobj80.dll'

Just kill the mspdbsrv.exe process, then build again.

Worked at least in my case. I had the inspiration for this approach after reading this post.

Thursday, March 1, 2012

Vermeidung von Kinderunfällen

Neue Merkblätter zu Kinderunfällen können jetzt bei der Kassenärztlichen Bundesvereinigung heruntergeladen werden:

Die Merkblätter beziehen sich jeweils auf ein bestimmtes Kindesalter, da sich die relevanten Unfallgefahren durch die Entwicklung des Kindes verändern. Pro Vorsorgeuntersuchung U1 bis U9 gibt es ein Merkblatt, das zu der jeweiligen Vorsorgeuntersuchung vom Arzt ausgegeben werden sollte, sowie ein allgemeines Merkblatt "A".

Die Merkblätter sind eine Gemeinschaftsproduktion der Kassenärztlichen Bundesvereinigung (KBV), dem Berufsverband der Kinder- und Jugendärzte (bvkj) und den gesetzlichen Krankenkassen.

Wednesday, February 29, 2012

Visual Studio watch window: select file of non-local static variable

The problem: you want to display a non-local static variable like "state". For example you have this in a file StateMachine12.cpp: static State state; Unfortunately you have a dozen of files defining such a variable. Chances are the watch window doesn't display the one you need. The solution: use a context operator in the watch window: {,StateMachine12.cpp,}state

Friday, February 24, 2012

Dreifachsieg für FRITZ!Box bei Stiftung Warentest

Dreifachsieg für FRITZ!Box bei Stiftung Warentest: „Drei Fritze an der Spitze“, so betitelt die Stiftung Warentest ihren aktuellen Vergleichstest von zwölf WLAN-Routern. In der Ausgabe 03/2012 stellt das Heft „test“ die Funkverteiler in drei Kategorien gegenüber: für VDSL-, ADSL- und Kabelanschlüsse. AVM belegt mit der FRITZ!Box 7390, 7330 und 6360 den ersten Platz in der jeweiligen Kategorie. Und bei der Gesamtnote haben alle AVM-Router eine eins vor dem Komma (1,6, 1,7 und 1,7). Vielseitige Funktionen einfach und sicher Stiftung Warentest bescheinigt den drei Vertretern der FRITZ!Box-Familie nicht nur ungewöhnlich vielfältige Einsatzmöglichkeiten, sondern auch eine besonders einfache Bedienung und gute Sicherheitsvorkehrungen: „Die Fritz!Boxen von AVM sind die sichersten im Test und trotz enormer Funktionsfülle sehr gut zu bedienen.“ So ist es nicht weiter verwunderlich, dass alle drei Geräte bei Vielseitigkeit, Handhabung und Sicherheit mit „sehr gut“ abschneiden. Auch bei der Datenübertragung die Nase vorn Hauptaufgabe eines Routers ist die schnelle Datenübertragung. Die FRITZ!Box 7390 und 6360 punkten hier, denn sie schicken die Daten über das 2,4- und 5-GHz-Band und sind damit „besonders flexibel“. Beide AVM-Produkte erhalten in puncto Datenübertragung die Note „sehr gut“.

Wednesday, February 22, 2012

Windows Embedded Compact und Qualitätssicherung

In der Dotnetpro sind zwei Artikel von mir erschienen:

Oder bei Slideshare:

Update 2012-02-29: Und jetzt auch als PDF hier.

Saturday, February 18, 2012

TortoiseSVN for Linux/Debian/Ubuntu/Gnome/Nautilus

Wanting overlay icons and file context menu just like with TortoiseSVN under Windows? It's called RabbitVCS.

Instructions for Ubuntu 11.10 (Oneiric Ocelot) (see also here): sudo add-apt-repository ppa:rabbitvcs/ppa sudo apt-get update sudo apt-get install rabbitvcs-nautilus3 Logout and login again to get Nautilus restarted.

There is also a package rabbitvcs-nautilus coming with Ubuntu 11.10, but that one is for Nautilus 2 only. You need the Nautilus extension for Nautilus 3, hence rabbitvcs-nautilus3.

Saturday, December 31, 2011

Keine Nüsse für Kinder unter 10 Jahren

99% der Fremdkörper, die aus der Lunge von Kindern wieder entfernt werden müssen, sind Nüsse oder Nussbestandteile. Daher empfiehlt der Deutsche Berufsverband der Hals-Nasen-Ohrenärzte e.V. keine Nüsse für Kinder unter 10 Jahren.

Sunday, December 4, 2011

Eisen-substituierte Babynahrung kann kindliche Entwicklung stören

Meldung des Ärzteblatts: Mit Eisen angereicherte Säuglingsnahrungen fördert nicht die Entwicklung des Kindes, schadet eventuell sogar.

Friday, December 2, 2011

Fenamiphos in Gurken aus Spanien

Die brandenburgische Lebensmittelüberwachung hat erhöhte Rückstände des Wirkstoffes Fenamiphos auf Gurken aus Spanien gefunden. Am 15.11.2011 wurde darüber über das europäische Schnellwarnsystem die Lebensmittelbehörden in Europa informiert. Das BfR (Bundesinstitut für Risikobewertung) hat geprüft, ob die Rückstände in Höhe von 0,11 Milligramm je Kilogramm Gurke die Gesundheit der Verbraucher schädigen können. Das Ergebnis: Die gemessene Menge des Pestizids kann eine akute Gesundheitsgefahr für Kinder darstellen. Für Erwachsene besteht keine akute Gefährdung.

Maßnahme laut BVL (Bundesamt für Verbraucherschutz und Lebensmittelsicherheit): "Mitteilung der Ermittlungsergebnisse". Das bedeutet wohl, die Ware wird ganz normal abverkauft - also Finger weg, wenn ihr Kinder habt! Ich denke, ich werde zukünftig die Meldungen im Europäischen Schnellwarnsystem für Lebensmittel und Futtermittel genauer beobachten....

Wednesday, November 30, 2011

Künstliche Säuglingsmilch ist nicht gleichwertig mit Muttermilch

Die Nationale Stillkommission am Bundesinstitude für Risikobewertung kritisiert sachlich falsche Werbeaussagen und unzulässige Abbildungen zu Säuglingsmilch.

Wissenschaft und Gesundheitswesen sind sich absolut einig in der Beurteilung des Stillens als unersetzlichen Wert für den Säugling, etwa durch die bedarfsgerechte Nährstoffzufuhr und eine Verminderung des Risikos für infektiöse Atemwegs- und Durchfallerkrankungen. Darüber hinaus zeigt Stillen auch wichtige langfristige Auswirkungen, da ehemalige Stillkinder deutlich seltener an kindlichem Übergewicht und Adipositas leiden sowie später eine bessere kognitive Leistungsfähigkeit entwickeln. [...] Werbung darf nicht geeignet sein, Eltern zu der falschen Annahme zu verleiten, dass die beworbenen Flaschennahrungen von vergleichbarem Wert wie das Stillen seien und damit das Stillen zu gefährden.

Mitteilung des BfR

Thursday, October 13, 2011

Commercial dry petfood has significant benefits for oral health in cats and dogs

Commercial dry petfood has significant benefits for oral health in cats and dogs: (CNC (UK) Ltd.) In a nationwide study of more than 17,000 dogs and 6,000 cats visiting over 700 Polish veterinary surgeries, researchers have shown that including at least some dry food in the diet has significant benefits for oral health in cats and dogs compared with home-prepared alternatives.

Monday, October 10, 2011

Measuring vital signs with a off-the-shelf smartphone

A team led by Ki Chon, professor and head of biomedical engineering at WPI, has developed a smart phone application that can measure not only heart rate, but also heart rhythm, respiration rate and blood oxygen saturation using the phone's built-in video camera. The new app yields vital signs as accurate as standard medical monitors now in clinical use: abstract.

New imaging agents for PET to make inflammation and cancer visible

A series of novel imaging agents could make it possible to “see” tumors in their earliest stages, before they turn deadly: study abstract

Saturday, September 17, 2011

Vitamin C therapy might prevent sepsis

Could an apple a day keep sepsis away?: (Lawson Health Research Institute) Sepsis kills more people than breast, colorectal, pancreatic, and prostate cancers combined. Outside of coronary care units, it is the leading cause of mortality in intensive care units. Every year 18 million people worldwide develop this potentially fatal disease. Thanks to a generous grant of $138,238.65 from the Jesse and Julie Rasch Foundation, Lawson Health Research Institute's Dr. Michael Sharpe is exploring a new sepsis therapy using Vitamin C.

Would be really great if something as accessible and side-effect free as Vitamin C helped against sepsis.

Playing outside reduces ADHD symptoms

For kids with ADHD, regular 'green time' is linked to milder symptoms: (University of Illinois at Urbana-Champaign) A study of more than 400 children diagnosed with Attention Deficit Hyperactivity Disorder has found a link between the children's routine play settings and the severity of their symptoms, researchers report. Those who regularly play in outdoor settings with lots of green (grass and trees, for example) have milder ADHD symptoms than those who play indoors or in built outdoor environments, the researchers found. The association holds even when the researchers controlled for income and other variables.

I always suspected that ADHD is just a symptom of activity deprivation. Although this might be a bit too simple, it seems to be partly true.

The nervous systems might be capable of repairs after all

New class of stem cell-like cells discovered offers possibility for spinal cord repair: (Allen Institute for Brain Science) The Allen Institute for Brain Science announced today the discovery of a new class of cells in the spinal cord that act like neural stem cells, offering a fresh avenue in the search for therapies to treat spinal cord injury and disease.

Tuesday, September 13, 2011

New hybrid imaging device shows promise in spotting hard-to-detect ovarian cancer

New hybrid imaging device shows promise in spotting hard-to-detect ovarian cancer: (Optical Society of America) By combining three previously unrelated imaging tools into one new device, a team of researchers from the University of Connecticut and the University of Southern California has proposed a new way to diagnose early-stage ovarian cancer in high-risk women through minimally invasive surgery. The new technique, described in the Optical Society's (OSA) open-access journal Biomedical Optics Express, may be better than the current standard procedure of preemptively removing the ovaries.

Monday, August 22, 2011

Visual Studio watch window

The watch window can do a lot more than simply displaying variables. The official documentation: "Variable Windows" in the MSDN. The article X64 Debugging With Pseudo Variables And Format Specifiers gives a few examples.

The watch window can also call functions. My favorites to display byte buffers in the watch window are: BitConverter.ToString(buffer) Encoding.ASCII.GetString(buffer, 0, buffer.Length)

And here are some tips mostly regarding the watch window GUI, but including also some other features: 10 Tips you should know about “Watch Window” While debugging in Visual Studio

If the format specifiers aren't sufficient, here are two articles that explain how to program Visual Studio to display your data structures the way you want using autoexp.dat:

See also Sara Ford's blog for more Visual Studio tips. Unfortunately she has left Microsoft.

Friday, August 19, 2011

Buchempfehlung: Baby-led weaning (BLW, Baby-geleitetes Abstillen)

Wenn das Baby mit aller Körperkraft und Geschicklichkeit versucht, am Tisch an unser Essen ranzukommen, dann will es was? Nein, keinen Brei in den Mund gesteckt bekommen: mitessen!

Bei BLW geht es nicht nur um's Abstillen - sprich wie schnell Muttermilch durch andere Nahrung ersetzt wird. Viel wichtiger ist die Entwicklung des Geschmacks an anderer Nahrung, der Fähigkeit selbstständig zu essen, dem Spaß dabei und das eigene Hungergefühl wahrzunehmen.

Es ist eine wahre Wonne, zu sehen, mit wieviel Freude und Geschicklichkeit unser 8 Monate alter Sohn, aussucht, was und wieviel er essen möchte. Und sich beschwert, wenn das, worauf er gerade Appetit hat, ihm ausgeht.

Die ausführliche Erklärung von BLW findet man hier: Baby-Led Weaning: The Essential Guide to Introducing Solid Foods and Helping Your Baby to Grow Up a Happy and Confident Eater

Das Kochbuch enthält nochmal eine kürzere Erklärung von BLW und dazu noch eine Menge Rezepte: The Baby-led Weaning Cookbook: Over 130 delicious recipes for the whole family to enjoy

Meine Empfehlung (auch wenn wir es andersherum gemacht haben): zuerst das Kochbuch anschaffen und wenn die Erklärungen dort nicht reichen, das dicke Buch nachkaufen.

Dazu empfehlen sich zum Beispiel diese Lätzchen.

Update 8.10.2011: Allerdings muss man sie einmal heiss waschen, damit sich die Schichten voneinander lösen; sonst sind sie zu steif.

Update 2.12.2011: Das heiße Waschen funktioniert nicht immer. Sowieso sind diese Lätzchen von Playshoes aber viel besser und auch wesentlich hübscher, auch wenn sie keinen Auffangbehälter habe wie die von J. J. Cole.

Top Agile Books 2011

If you don't know what to read:

Blogger: CSS for markup of blockquote and code

I recently decided to switch to a more semantic markup for my posts. For example, I wanted to use the code element for pre-formatted multi-line code. This is what I came up with.

Set in Settings|Formatting the option Convert line breaks to No. Otherwise blogger will insert br elements for every line break in your post, which makes proper styling impossible. OTOH, formatting your posts with line breaks instead of HTML markup will of course not work any more.

Open the template (Design|Edit HTML) and add the following to the CSS within the b:skin tags: blockquote { font-style: italic; margin-top: 1em; margin-bottom: 1em; margin-left: 10px; } code { white-space: pre; font-size: 80%; display: block; margin-left: 10px; margin-top: 0em; margin-bottom: 1em; }

Thursday, August 18, 2011

Visual Studio: Setting multiple startup projects via macro

UPDATE: For Visual Studio 2010 (and later?) see comments or

According to the documentation, this should work: Sub StartUpProj() Dim sb As SolutionBuild = DTE.Solution.SolutionBuild Dim startupProjects() As String = { "Project1.vcproj", "Project2.vcproj" } sb.StartupProjects = startupProjects End Sub Unfortunately, it also says in the MSDN here:

The StartupProjects collection in the current version of Visual Studio .NET allows you to set only a single startup project, but future versions will allow multiple startup projects.
This was written for Visual Studio .NET 2003 and still holds true for Visual Studio 2008. At least this works for setting a single startup project: Sub StartUpProj() Dim sb As SolutionBuild = DTE.Solution.SolutionBuild sb.StartupProjects = "Project1.vcproj" End Sub BTW: Above examples are for C/C++ projects. For other types of projects the extensions vary.

Monday, August 15, 2011


The ZY1000 is a JTAG adapter accessible over Ethernet instead of USB or similiar. It works driverless and also comes with a web interface. Supports RTCK/RCLK or adaptive clocking and has a built-in relay to power cycle targets remotely. Nice alternative to the standard JTAG dongles.

Sunday, August 14, 2011

PC-Lint: Interrupt Service Routines

PC-Lint regularly warns about Interrupt Service Routines (ISR) not being used. The simplest remedy is just an esym for every ISR: /*lint -esym(528,Interrupt_SCI0_ERI0) */ #pragma interrupt Interrupt_SCI0_ERI0(vect=VECT_SCI0_ERI0) static void Interrupt_SCI0_ERI0(void) { ... } But see how WET this code is? First you tell PC-Lint it's an ISR. Then you tell the toolchain it's an ISR. Then you write the function head, which - surprise! - has the signature of an ISR. We can do better than that: /* Define this once */ #ifdef _lint /*lint -e(961) Suppress MISRA warning for function-like macro */ #define INTERRUPT(VECT,HANDLER) \ /*lint -esym(528,HANDLER) Suppress warning for unused function */ \ static void HANDLER(void) #else #define DO_PRAGMA(X) _Pragma(#X) #define INTERRUPT(VECT,HANDLER) \ DO_PRAGMA(interrupt HANDLER(vect=VECT)) \ static void HANDLER(void) #endif /* And define all your ISR like this: */ INTERRUPT(VECT_SCI0_ERI0,Interrupt_SCI0_ERI0) { ... } More examples for different pragmas expected by other toolchains to follow.

Saturday, August 13, 2011

Language requirements for medical devices

The MDD leaves it to national law to decide about the language requirements for medical devices. The Europen Association of Notified Bodies for Medical Device has a nice overview of the resulting requirements on their website: Mandatory Languages Requirements for Medical Devices

Friday, August 5, 2011

PC-Lint: enum for constants

When using enum for constants, you should leave the enum anonymous like this:
enum { C = 123 };
Otherwise you'll get warnings like 641 when assigning from enum to integer or comparing enum and integer. This would trigger the warnings:
enum Tag { C = 123 };
You still might experience warnings because Lint assumes enums to be signed, so assigment to an unsigned integer raises a Lint warning. Consider to use #define or const for defining constants instead. Then you can clearly indicate the type of the constant.

Thursday, July 28, 2011

You may experience problems with the Amazon currency converter

It first seemed like a convenient way to save a few cents, but turned out to be a bad idea: using the Amazon currency converter when ordering with Amazon.UK.

Amazon.UK offers to pay in EUR - the "Amazon Currency Converter". Seems nice:

  • you see instantly what you are paying - in EUR
  • you save the bank fee for not paying in EUR
  • you have to type less in the expense report (you think)

But speaking of the expense report - that's where you need a correct invoice, and that's something you won't get. What you get on the printed invoice is:

  • the total in GBP instead of EUR and
  • a conversion rate that doesn't match what you were actually charged in EUR.

So first there is no way to match the amounts on the invoice to what you were charged and secondly you still have the typing effort to explain the relationship between foreign currency, conversion rate, and native currency in your expense report.

I already got the Amazon hotline to tell me that they

  • have a different conversion rate for my transaction in their system than is printed on the invoice
  • they charged me according to the conversion rate in their system not the one on the invoice

But up to now no corrected invoice - they still think I want money back, when all I want is a corrected invoice. Aaaaaargh!

Update 2011-07-31: The third e-mail was comprehended - they promised to send a corrected invoice. Jippie! Nevertheless I don't think I'll use the Amazon currency converter again.

Update 2011-08-18: Got no corrected invoice yet. Sent another email. Got the corrected invoice by fax after being called by Amazon UK and a short conversation on the phone. The real surprise here: there seems to be more manual work involved than I could imagine. I thought Amazon's system was not working correctly when it was just a everyday human error as it seems. Softened the title a little.

Sunday, July 17, 2011

Buchempfehlung: Schlafen statt Schreien

Baby sanft in den Schlaf helfen ohne Schreien lassen: Schlafen statt Schreien: Das liebevolle Einschlafbuch: Das 10-Schritte-Progamm für ruhige Nächte von Elizabeth Pantley. Eine liebevolle Gegenposition zu den Ratgebern, die einem erklären, wie man den "Machtkampf" gegen die Bedürfnisse des Babys nach Liebe, Aufmerksamkeit und Nähe gewinnt.

Siehe auch diesen klasse Forumsbeitrag zu dem Thema.

Friday, July 8, 2011

Windows error ERROR_ARENA_TRASHED - 7 - 0x07 - The storage control blocks were destroyed

This error code may simply mean, that the host name could not be resolved. Unfortunately nothing you could find on the Internet up to now pointed into that direction. :-( Got this error when using Ruby and CouchRest under Windows to upload data from my Hudons/Jenkins to a CouchDB. But obviously nothing of the above including the IPv6 incompatibility of Ruby that I read about had to do with the real problem: host name without a domain could not be resolved by a host in another domain...

Monday, July 4, 2011

Sharing a file system between Linux and Windows

I tried sharing an ext3 between Linux and Windows now for some months. For Windows I used the Ext2 Installable File System For Windows (IFS). The use case: my wife wanted her Firefox profile both under Windows and Linux.

I never had any problems with IFS, so I didn't expect any now. However I ended up with lots of errors in the ext3 file system twice. I suspect the little difference in the usage scenario (copying files back and forth between Linux and Windows vs. having an application constantly accessing it's configuration files) as the culprit. Perhaps Firefox had a few files still open or was manipulating them when Windows was shutdown respectively switched off the hard way.

This was especially cumbersome because Ubuntu doesn't seem to expect that fsck might ever ask for user input: the boot screen just gets stuck when this happens and no chance to get to the fsck prompt. Hence I had to boot from a LiveCD and invoke fsck then manually.

So now I try it the other way around: using a Windows file system (NTFS) from Windows and Linux. Let's see how this works out...

Sunday, May 29, 2011

Access the DOM of a SVG that is embedded by reference

You can reference SVG files via object, embed, or iframe tag. In each case, you can access the SVG DOM from within the parent document.

Use either the contentDocument property or the (deprecated) getSVGDocument function of the embedding element to access the SVG document, for example: var object = documents.getElementsByTagName('object')[0]; svgDocument = object.contentDocument;

See here for a more elaborate example. Note: For security reasons, the contents of the SVG document can be accessed from the parent document only if both documents are located in the same domain.

PC-Lint: Header files

Options to control the search for included files:
-i or -I
synonym options, simply specify a directory to search for incldued files
clear list of directories specified with -i options
like -i but directories specified with this option are search after directories specified with -i. Normally used to specify compiler and system include directories.
Included files are searched first in the same directory as the including file.
Beware that PC-Lint uses the INCLUDE environment variables. Say you have installed Visual Studio but are linting code for the Embedded Workbench, you might lint a mix of Windows and embOS header files. To avoid this either unset the INCLUDE environment variable or use the -incvar lint option, for example: -incvar(DONT_USE_ENVIRONMENT)

-incvar has to be given on the lint command line, not in a file.

PC-Lint: Read the message documentation carefully

Most messages are parametrized with a string, type, or symbol. Depending on the type of the parameter, the message can be suppressed with either -estring, -etype, or -esym. The message documentation (the endless list at the end of the user manual) exactly documents the type of the parameters of each message. Don't rely on common sense, the name of a type or function might very will be displayed in a string parameter. Caveat: I experienced once that the documentation is wrong in respect to the parameter type, but otherwise I found the documentation to be helpful.


Creating a PC-Lint configuration is easy: start up the configuration wizard, select the target platform of your code and it creates a configuration for you. Congratulations, 0.01% of the work of configuring PC-Lint is done. Where to turn for help when problems with PC-Lint arise:
  • discussion forum at Gimpel's website
  • the user manual
  • this blog (as soon as I posted a little more)

Tuesday, March 15, 2011

ING-DiBa und GnuCash/AqBanking

Seit einiger Zeit bietet ING-DiBa allen Kunden ohne besondere Anmeldung einen HBCI Zugang. Dazu werden die gleichen Zugangsdaten wie für das Internet-Banking verwendet. Dieser HBCI Zugang läßt sich auch mit GnuCash bzw. AqBanking nutzen.

Zunächst startet man den AqBanking Setup Wizard. Bei GnuCash 2.2.9 versteckt sich der im Menü unter Tools|Online Banking Setup...

Im Wizard legt man zuerst einen Benutzer/User an:

  • Der Name kann beliebig gewählt werden, darf aber nicht leer bleiben.
  • Die UserId ist die Kontonummer, mit der man sich auch beim Internet-Banking anmeldet.
  • Die Kundennummer/CustomerId muß leer gelassen werden.
Bei den HBCI Special Settings muß die HBCI Protokoll-Version 2.2 gewählt werden. Dazu setzt man ein Häckchen bei "Show Special Settings", damit die Auswahlbox erscheint.

Nun muß man nur noch die Schritt "Get Certificate" und "Get System Id" erfolgreich abschließen. Dabei wird auch automatisch die Liste der Konten heruntergeladen, so daß man diese gar nicht mehr konfigurieren muß.

Wenn AqBanking nach der PIN fragt, muß die Internet-Banking PIN eingegeben werden - und nicht der DiBa Key. Hört sich logisch an, man kann aber trotzdem darauf kommen, es anders zu machen. ;-)

Update 2011-12-20: Mit Gnucash 2.4.7 ergeben sich folgende Änderungen.

  • Statt eines Häckchens "Show Special Settings" gibt es im AqBanking Wizard nun einen simplen Knopf "Special Settings" um obige Einstellungen zu machen.
  • Nach wie vor muss als HBCI Protokoll-Version "2.20" gewählt werden.
  • Bei mir funktioniert HTTP 1.0 und 1.1 - am besten einfach die Voreinstellungen (1.1) lassen
  • TAN Medium ID leerlassen, Überweisung mit iTAN funktioniert auch so.
  • Ein Häckchen bei "Force SSLv3" ist nicht nötig, vermeidet aber ein paar Warnungen bei der Kommunikation.
  • Meine PIN hat 10 Stellen (Großbuchstaben, Kleinbuchstaben, Zahlen, keine Sonderzeichen oder Umlaute). Funktioniert ohne Probleme, obwohl man immer wieder liest, dass HBCI nur 6-stellige PINs erlaubt.
Hier noch ein paar Screenshots vom AqBanking Wizard (Gnucash 2.4.7 unter Ubuntu):

Tuesday, February 22, 2011

About indirection

David Wheeler

All problems in computer science can be solved by another level of indirection. But that usually will create another problem.

Diomidis Spinellis

On the other hand, the effect that indirection has on the comprehensibility of our code is a very important concern, because over the last 50 years, in contrast to the dizzying increases in CPU speeds, the ability of humans to understand code hasn't improved much.

Steve McConnell

The primary goal of software engineering is to reduce complexity.

Use the simplest implementation that solves the problem. If you think about using a more complex implementation for the sake of extensibility etc - what is the cost of adding the extensibility later? When you really need it? When you exactly know what kind of extension you have to add? What is the probability that you actually going to need it? (You ain't.) Compare with the increased cost for implementing and maintaining(!) the unnecessary complex solution.

Saturday, September 25, 2010

Marriage and name change

Happiest day of my life. :-)

And a side effect: my name changed from "Matthias Riese" to "Matthias Kraaz".