This might seem obvious for many Kotlin programmers but I did not realize that extension functions are also applied to mocks. This means that if you have a class you can not instantiate for some reason, like the constructor is private and in another package, or the class is abstract, you can still test your extension functions by simply mocking it.
Category: Software
Reading an ISKRA AM550 P1 Port with a Pi
Although I am the guy with a soldering iron and a bit of software development experience, I am not a fan of the “internet of things”, “smart meters” or smart anything really. Not because I don’t like technology, but because of the potential security and privacy problems it brings with it. That said, because of some unfortunate events I now have a smart meter my home. So when life gives you lemons, you make Pi!
I’ve got an AM550 Smart meter with a P1 port. Seeing all the online content and suggestions about reading your smart meter, I decided to have an hour of fun trying to read the P1 data. Here’s how I did it:
Travis CI and Dependabot added to Anonimatron
With new European rules like the GDPR and local variations like the Dutch AVG, interest in Anonimatron is increasing. Although I do not keep track of who is using it and where, sometimes new requirements do pop up. Recently a feature was added to Anonimatron 1.9.2 to also anonymize files.
In the wake of those additions, I planned to give Travis CI a try to automate the builds. It turns out that Travis CI integrates beautifully with GitHub, and automatically builds branches and pull requests right out of the box.
JSON alerts for Munin
Munin is a great and easy way to monitor your servers. The documentation for Munin is kind of all over the place, and sometimes not all that clear.
- There is the recent “Munin Guide” which is quite informative and well laid out.
- Sometimes additional info and background can be found on the old munin wiki.
Getting the standard mail alerts working on munin is simplest, but as soon as you want custom layouts or send alerts as a push message to a phone, it can take quite some work. Here’s what I figured out to get the Munin alert available to you as JSON inside your own Python script so you can do anything you want with it.
Fixing a Jenkins 1.5 Slave on Windows 2016
When you configure a Jenkins 1.5x slave on a Windows 2016 machine according to the instructions on wiki.jenkins-ci.org you will probably get a warning that the .Net 2.0 is not available. This is reported as issue 21484 and the fix is to upgrade, which sometimes can be a problem.
If you can’t upgrade to the latest version for whatever reason, you can easily fix the .Net problem by changing the jenkins-slave.exe.config file from:
<configuration>
<runtime>
<generatePublisherEvidence enabled="false"/>
</runtime>
</configuration>
To:
<!-- see http://support.microsoft.com/kb/936707 -->
<configuration>
<runtime>
<generatePublisherEvidence enabled="false"/>
</runtime>
<startup>
<supportedRuntime version="v2.0.50727" />
<supportedRuntime version="v4.0" />
</startup>
</configuration>
Hope this works for you. Cheers!
Mattermost Delete Channel “fixed”
Users of Mattermost have probably noticed the less-than-optimal interface design where de Delete option is right above the Leave option in the Channel menu. On a busy server, you can imagine having quite a few incidents where people accidentally completely delete a channel.
In the Open Source version of Mattermost, everybody van do anything, because there is no sensible security model with roles. Mattermost Inc. seems to think that the Open Source community is not entitled to roles, which I (and others with me) strongly disagree with.
Forking Mattermost, learning Golang and enabeling security, improving a few other issues for the open source community along the way is a plan. But there is a simpler workaround for people running Mattermost inside Nginx.
Installing GPG keys for Debian Backports
For Let’s Encrypt to automatically renew certificates on your Raspberry Pi, you probably want to install certbot. The installation instructions of certbot tell you to make use of the Debian Backports packages. Following the instructions to install backports packages into apt-get on raspbian (which is a Debian Jessie), you will probably run into the following error:
$ sudo apt-get update ... W: GPG error: http://ftp.debian.org jessie-backports InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 8B48AD6246925553 NO_PUBKEY 7638D0442B90D010
Make the ESP8266 talk 9600 baud
The default serial speed on the ESP8266 WiFi chip is 115200 baud. If you connect this chip to an Arduino and want to use SoftSerial to talk to it, it will not work. The SoftSerial library is limited to 9600 baud because of hardware limitations of the Arduino. If you want to talk to the ESP8266 with an Arduino at lower speeds, you need to tell the ESP8266 to slow down.
Solving the JAXB “unexpected element” problem
If you are using JAXB in a maven/java project to unmarshal an XML document and you get:
javax.xml.bind.UnmarshalException: unexpected element (uri:”urn:iso:std:somestuff:xsd:somestuff”, local:”Document”). Expected elements are (none)
Or if you are using JAXB to marshal an XML document and you get:
com.sun.istack.internal.SAXException2: unable to marshal type “generated.somestuff.Document” as an element because it is missing an @XmlRootElement annotation
You have probably fallen victim of the fact that JAXB does not do “Simple Binding” by default. If your project is a maven project and you generated classes based on an xsd file, this is how you fix it (without changing the xsd file):
Import/export an Oracle Schema using JDBC
When doing integration testing or fixing a bug in a piece of Java code that uses Oracle as a database, being able to do quick exports and imports of your schema can be a big help. Sometimes just calling Oracle’s imp/exp commandline tools from your code can be of help, but I was looking for something a bit more portable and less demanding on my local development machine. I found that Oracle’s datapump functionality can be called from stored procedures, which in turn can be called from a normal JDBC statement.
