Slow oh-my-zsh loading on macOS 11

At some point, starting a zsh (I’m using iTerm2 here) took almost 10 seconds on macOS 11 Big Sur. This only happened the first time when I opened iTerm2 after a reboot. After mentally going through all the software changes I had done to my rig, I was pretty sure this happened right after installing Xcode. After some debugging in the oh-my-zsh code I found the culprit: it’s related to Apple’s git version which comes with Xcode. After installing the Homebrew version of git, the delay no longer occurred. It’s important though that the Homebrew git binary is found first when calling git from the command line.

However, a few days later, the initial delay came back again. This time, the culprit was nvm (Nodejs version manager) or more specifically, adding the nvm variables to my ~/.zshrc. I’ve found a snippet that lazy loads the in ~/.zshrc. Check out this Gist:

The two workarounds combined drastically reduce (oh-my-)zsh loading times on my Mac. Make sure to remove an existing nvm init variables from ~/.zshrc before applying the lazy loading code.

Auto-restart crashed mining processes in ethOS 1.2.7

I have been running a crypto-currency mining rig on the Linux based ethOS distro for quite some time now. While I realize that ethOS is problematic license-wise, it’s still a great distro to get a mining rig up and running in almost no time. The Nvidia GPUs in my rig are well tuned to operate at their optimum cost/hashrate ratio. However, due to bugs in the miner and/or the GPU drivers, every few days one of the GPUs stops mining. Sometimes ethOS is able to recover the GPU and gets it back to mining but sometimes it doesn’t seem to detect the crashed/hanging mining process at all. This is why I added a cron job that runs every 15 minutes and checks if all GPUs are still mining. If not, the miners will be re started using the minestop and minestart commands provided by ethOS.

The cron job starts the Bash script below. If it detects a problem, it writes to the console and additionally to /tmp/rigcheck.log. It’s been running smoothly on my ethOS v1.2.7 mining rig. I recommend putting it in /home/ethos/ and don’t forget to add execute permissions using chmod +x /home/ethos/

The cron job can be created like this:

cat << EOF | sudo tee /etc/cron.d/rigcheck
*/15 * * * *   root    /home/ethos/

Thanks to this script, crashed or hanging miners will be restarted fairly quickly and my rig’s pool-reported hashrate stopped dropping in such situations.

Running Java applications on OS X with only Java 7 installed

If Java 7 is the only Java environment on a Mac, quite a few applications demand the installation of a Java 6 environment:

To open “Eclipse”, you need a Java SE 6 runtime. Would you like to install one now?

To open “Adobe Device Central CS5”, you need a Java 6 SE runtime. Would you like to install one now?

To open “Cyberduck”, you need a Java 6 SE runtime. Would you like to install one now?


I didn’t want to pollute my Mac with an outdated Java version. Here’s a tip that works well with Eclipse and CS5 and may work with other Java software which ignores the presence of a Java 7 SDK as well. So far I’ve only tested it with OS X 10.8.3. It may or may not work with earlier or later versions of OS X.

At first you need to determine which Java 7 version is currently installed. Open Terminal and enter

cd /Library/Java/JavaVirtualMachines

You should get something like


I’m using this version as a sample below. Replace the name of the Java 7 SDK directory in the first line below and execute the commands:

export JDK=jdk1.7.0_21.jdk # needs to be replaced!
sudo mkdir /System/Library/Java/JavaVirtualMachines
sudo ln -s /Library/Java/JavaVirtualMachines/$JDK \

And you’re all set!

wget binary for Mac OS X

“wget” is a very handy Unix command line utility to download files over http. It not only shows details about the connection but also tracks current and overall download speed in KB/s or MB/s. Unfortunately, it’s not part of Mac OS X. If you already own Apple’s Xcode development environment you could easily compile your own wget binary or just download it from this site’s download area.

 => `10mb.test'
Connecting to[]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10,485,760 [application/octet-stream]

100%[================================================================================================>] 10,485,760 1.86M/s ETA 00:00

19:59:17 (1.63 MB/s) - `10mb.test' saved [10485760/10485760]

You could do something similar with curl (which is included in OS X by default) but I prefer wget’s output over curl’s.

curl -o test.bin
 % Total % Received % Xferd Average Speed Time Time Time Current
 Dload Upload Total Spent Left Speed
100 10.0M 100 10.0M 0 0 1739k 0 0:00:05 0:00:05 --:--:-- 2119k

How to read WebLogic 10.3 transaction logs (TLOG)

When analyzing distributed XA transaction problems it can prove useful to have a look at Oracle WebLogic’s internal transaction backup log file (TLOG). Since that file is all binary, it needs to be converted into a more human readable format first. In WebLogic 10.3, the TLOG file can be converted to text using this class:


The class needs the transaction library from the modules directory and weblogic.jar in the classpath. Continue reading

MMITunes v3.0 brings you genre-based playlists

Just in case you’re one of the few users of MMITunes: I added a new feature to auto-create genre-based playlists in MMITunes v3.0. If you select create playlists for genres MMITunes will generate .m3u playlists for every genre it finds in the tracks on the selected volume (which ideally is an SD-card or similar).

If you find playlists with weird names like (79).m3u you will have to convert the ID3-tags of that particular track to a newer version. You’ll find the names of the tracks which may require attention in the MMITunes output window. To convert the ID3-tags simply open iTunes, right-click the track, select Convert ID3 tags and apply ID3 v2.4. An easier way is to convert all your tracks at once instead of selecting single tracks. Don’t forget to re-export the tracks you modified to your destination volume.

The names of the three default playlists MMITunes creates have changed slightly as well. MMITunes v3.0 is available in the downloads area.

RTMPDump 2.4 binaries for OS X 10.7 Lion

I just got word from a commenter that RTMPDump 2.4 is out (thanks!). Since the release of Xcode 4 I have been unable to compile the RTMPDump binaries using the supplied Makefile. Actually, the binaries are all there but I always get a signal fault when the rtmpdump binary tries to establish a connection to a target server. I had to resort to plan B which was to import the RTMPDump sources into Xcode and to create a proper console application project. Continue reading

When is the next Apple keynote address?

Since Apple announces their keynote addresses in their respective time zone (Pacific Standard Time or PST), I always thought it would be nice to have some sort of automatic time zone aware converter that shows the start of a keynote address for everyone’s local time zone. Since no one else is providing this kind of service (at least not that I know of) I took matters into my own hands.

Once Apple announces a keynote address, will show the start time of the keynote depending on the time zone setting it finds on your computer. By the way, did you know they have a :45 minute time zone offset on Chatham Island?

The link list gets shuffled every time the page is loaded so not to give preference to any of the linked web sites. I wanted the site to look like a real keynote slide and I think the design comes pretty close to that. This was primarily a fun project to try out some programming techniques I wasn’t too familiar with. It would have been a lot more work if it hadn’t been for the fantastic jQuery JavaScript library, the very useful time zone detection JavaScript from Josh Fraser and Jon Nylander and the uber cool looking countdown timer JavaScript from Vassilis Dourdounis.

Check out

Controlling WSO2 Enterprise Service Bus programmatically using JMX

A few weeks ago I started working with WSO2‘s Enterprise Service Bus software, which is a lightweight and extremely high performance, open source enterprise service bus (ESB). One reason it’s so lightweight and fast is that it doesn’t have to be run in a bloated application server environment (although it can, but where’s the point). Instead, it’s running in an OSGi container. While the ESB itself still needs some polishing, especially in the area of deployment in large company environments, it looks extremely promising. We even flew in a few guys from HQ in Sri Lanka to help us with the initial setup of the product. Judging from the guys I’ve met, there must be a lot of talent in that company! Support is top notch and fairly priced.

One thing I was working on over the last few days is a command line remote control utility for the WSO2 ESB. It supports deployment and undeployment of the Eclipse Carbon Studio .car files and many other features, which at the time are only available through the web based user interface. The utility comes with an awesome name too: Carbonara :) We need this command line functionality for our fully automated change and configuration management processes. There’s no point in releasing the whole thing to the public because it’s tailor-made for the staging processes in my company.

Here’s a small Carbonara excerpt that shows how to send administrative commands like shutdown or entering/exiting maintenance mode to any WSO2 product using JMX. You can also use JConsole to remotely control any WSO2 product by the way. You will have to activate the JMX registry in the carbon.xml file in order to be able to use JMX. The supplied username and password will have to match a user with administrative privileges in the user store. Continue reading

MMITunes: Create playlists for your Audi MMI/RNS-E on the Mac

I have an iPod Classic connected to the Audi Music Interface (AMI) in my car to listen to music over the Audi multimedia system MMI 3G. The iPod is able to store a vast collection of music but sometimes I just want to listen to the tracks I recently downloaded in the iTunes music store without having to walk down to the garage, disconnecting the iPod, sync it on my Mac and so on. Continue reading

Nofollow tag cloud for WordPress

I love the tag cloud widget that comes with WordPress. There’s just one thing that bugs me: it floods every post or page with lots of internal links that a search engine crawler will follow. The SEO community says that this could be seen as some sort of artificial link generation by a search engine and eventually lead to a disadvantage in a site’s SERP ranking. Having fewer internal links on a post should also pass a higher page rank to linked posts as well. See this post from Matt Cutts detailing how it makes sense to nofollow non-essential internal links:

There’s no stigma to using nofollow, even on your own internal links; for Google, nofollow’ed links are dropped out of our link graph; we don’t even use such links for discovery. By the way, the nofollow meta tag does that same thing, but at a page level.

Unfortunately, it’s not possible to instruct the built-in WordPress tag cloud sidebar widget to use nofollow tags for the generated links. Continue reading

Must Read Posts: New version 2.0

After quite a long time with no updates I just released a new version of my WordPress plugin “Must-Read Posts”. The new version adds several configurable sorting options which was the most requested missing feature. With the exception of the custom sort order they’re pretty self explanatory and include:

  • Post date descending (latest posts/pages first)
  • Post date ascending (oldest posts/pages first)
  • Random (randomizes the sort order)
  • Custom

The custom sort order allows pre-defined ordering of posts or pages and was the default and only sort option in the earlier versions of the plugin. If you update from an earlier version of the plugin this still is the default sort order. The sort ordering option can be found on the widget’s configuration area.

In case you’re using the non-widget PHP function, the sort order parameters are:

  • date_asc
  • date_desc
  • rnd
  • custom

If you don’t specify a sort order, the default is “custom”. If you’re using a plugin like WP Super Cache don’t expect the random sort order to show a different order every time you load the page.

The plugin can be installed/updated from the plugins admin page within your WordPress site or downloaded here.

WordPress Plugin/Widget for Must Read Posts

Today, I was looking for a simple WordPress widget that allows me to statically display links to certain posts in the sidebar. I could have used the links widget but it wasn’t flexible enough for me. My idea was to use a certain custom field of a post or page as a trigger to display it in a widget. I searched for almost an hour but I just couldn’t find any simple, widget-capable WordPress plugins that could do this?! 

In the end, I ended up writing my own widget-capable plugin. I decided to publish it so anyone else can use it on her/his blog too. The plugin’s name is “Must Read Posts”. It shows your most recommended posts and pages in a sidebar widget or in a page. As the widget’s title is editable in the WordPress Dashboard you could change it to something like “Recommended Posts”, “Important information”, “Tips & Tricks” or whatever you like. Continue reading