Post navigation

I was trying to set up a standalone instance of Hadoop + Zookeeper + Accumulo yesterday and found that after every reboot I needed to destroy and recreate my Accumulo instance, otherwise it wouldn’t connect to Zookeeper. It didn’t seem to make a difference whether I did a clean shutdown or not.

Turns out I didn’t read zoo.cfg very carefully:

# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp

Make sure that your Zookeeper data is being saved in a spot where it won’t get blown away on every reboot!

If you’re running the current version of Chrome (25.0.1364.97 as of this writing) you might find that the dropdown button is not showing properly on date input fields. What’s actually happening is that the dropdown is getting rendered below the date input, which can make it invisible if your control isn’t big enough.

Weasyprint is the best python tool I’ve found to convert HTML to PDF. Well-maintained, frequent releases, great documentation, with a solid rendering engine. But for some reason they’re really hard to find when doing a google search for “python html pdf converter”. So here’s my best effort at giving them a little googlejuice: use Weasyprint!

If you are new to LDAP, and you are compelled to set up an LDAP server for your organization, then you may find that sometimes you will make changes on the server that do not appear when you query from your client.

For instance, maybe you’ve defined a set of POSIX groups and have begun adding members to those groups with the memberUid attribute. And then when you go to one of your LDAP clients and run ‘groups’ or ‘id’ or ‘getent group’ you don’t see the group membership you just set up.

…don’t include any flow control. Therefore, if your producer is producing messages much faster than your consumers can consume them, the messages will buffer. And buffer. To the point that you will either run out of memory, or your workers will start to page out and their performance will degrade badly.

The good news is, there’s an easy fix for this. Use ZMQ’s “High Water Mark” feature to implement blocking on PUSH- and PULL-type sockets. In pyzmq, use the method:

socket.setsockopt(zmq.HWM, LIMIT)

On the sockets for both the producer and consumers. Where LIMIT is the maximum number of outstanding messages. I’ve set PRODUCER_LIMIT to be n*CONSUMER_LIMIT where n is the number of consumers, seems to work pretty well.

There’s a lot of misinformation out there re. how to set javac and scalac compiler options in sbt. You might see stuff about defining a custom Build object in a .scala file. Or a custom Project object. It’s all nonsense. I guess it applies to previous versions of sbt. In sbt 0.11.2, you set javac and scalac compiler options as shown on the sbt examples page here: