Here is some software which I have written. It is published under the GPL.

Disk deduplicator


This searches specified directory trees for duplicate files. When duplicates are found, it will remove the duplicate, and replace it with a hard link to the original file. This is a great way to say significant storage space.


The program is generally run from a command line. It can be silent (by default) report duplicate files, and report total bytes saved. It is very safe in operation, as it renames the duplicate file, creates the hard link, then removes the renamed file. If anything goes wrong, an error message is printed, and the file is not deleted. The program is written in python, should work anywhere there is a python interpreter and on file systems that support hard links.
View readme  View source  Download

md5sum a directory tree


This generates a file in each directory of the specified directory tree which has a md5sum for each file in the three. When re-run, it reads the md5sum file and compares the md5sum with each file's current md5sum. It reports any differences, which can be caused by renaming files, adding files, removing files, or if a file gets corrupted. I use it on an entire disk partition to notify me if any files get corrupted. Some special, system directories are skipped.


The program is generally run from a command line. It reports changes on the command line, and the output can be redirected. The program is written in python, should work anywhere there is a python interpreter.
View readme  View source  Download

Hexbright flashlight review and my source code

The Hexbright flashlight started off as a kickstarted project and is billed as an open source flashlight. I decided to fund the project for one 'hexbright flex' flashlight. The project was funded Jul 18 2011. It was supposed to ship flashlights October 2011. That didn't happen. On April 15 2012 I decided I was tired of waiting and I 'sold' my reservation to someone else with the blessing of Christian Carlberg, the leader of the project. I sent Christian the contact info of the 'buyer'. On January 18 2013, I got a flashlight. I was a bit confused, as I had sold my reservation. Three months later on, I got an email from the person I sold the reservation saying "Christian Just told me that the hexbright I bought from you is between me and you. Did you receive a Hexbright?". I thought it odd that Christian decided that his mistake was now my responsibility. Later I got an email from Christian saying "I believe you agreed to sell this to xxx. Can you please send him his light or return his money back to him?" I thought that a very confusing way of dealing with his mistake...

I tried using the flashlight today. It was dead. No problem, I decided to charge it via the usb port. 10 hours later, still dead. It turns out that the super fancy 18650 protected lithium ion battery is truly dead. I tried charging it in two other chargers. No joy. I had another protected 18650 which I am now using in the light. Clearly the hexbright supplied and labeled battery had an issue. No idea if it is a random or systemic issue.

I decided I wanted to program the flashlight. In my experience, open source projects come with source code, and some documentation. This flashlight was advertised as being completely open source, with all the hardware documented, the circuit boards documented, and so forth. I have yet to see any documentation for the circuit board or the circuit at all. There was some example programs, and by reading some comments and trying out different things, I was able to write a program that ran in the flashlight. I don't consider this an open source flashlight, rather a flashlight with a development community, and a wiki for support. According to Github hexbright the license is BSD 2-Clause for original source code, so I am releasing my source code under the same license.

My Hexbright source 

The program includes 8 different brightness nodes, and 8 different blinking modes. When the light is off, holding the button down for under 500 milliseconds starts the light in the dimmest on setting. Holding the button down for more than 500 milliseconds, but less than 1500 milliseconds starts the light in the brightest setting. Holding the button down for more than 1500 milliseconds starts the light in the blinking mode, starting with the 'dazzle' setting, which is designed to disorient people.

When the light is turned on, holding down the button for more than 500 milliseconds turns the light off. Holding the button down for a shorter time, cycles through the modes. If the light is in non-blinking mode it cycles through the follow brightness settings (approximately):

4 lumens, 8 lumens, 16 lumens, 32 lumens, 64 lumens, 128 lumens, 246 lumens, 512 lumens

If the light is in blinking mode it cycles through the following modes:

dazzle mode, 4 blinks per second, 8 blinks per second, 16 blinks per second, 2 blinks per second, 1 blink per second, 0.5 blinks per second, 0.25 blinks per second

If you have comments or suggestions, Email me at