Reviews by Alex White


Color-Mix (0.02) *****

I think this module will be helpful for building a color theme for emacs, terminal, and other tools.

It did not calculate colors in the way I was expecting, but this was just my own ignorance. I had to learn a bit about color theory today to understand this, but the tools I have used in the past worked on the old traditional RYB color wheel. This has nothing to do the hex color being specified in RGB. Using the RYB scheme, the complimentary color of red is green.

The documentation is very explicit that it uses the RGB color wheel, but that didn't mean anything to me at first. Using that scheme, the complement of red is cyan.

At first I was convinced that the color schemes generated by Color::Mix were not as nice as the ones I generated on RYB. But after looking at a lot more samples, I think this is similarly nice, and will solve my problems.

Memory-Usage (0.201)

I didn't see it listed anywhere in the docs, but this only works on OSes that support procfs (/proc).

Date-ICal (1.72) **

I ran into some incompatibility between this module and When I schedule an event for 6pm in my local time zone, the time stamp generated is 20100219Z (no hh/mm/ss), but ignores entries that are missing the time stamp, e.g. 20100219T000000Z. I emailed the author--he responded very quickly and explained to me that these two ISO dates mean very different things, the former refers to an entire day while the latter refers to a specific time. This seems to support the idea that this is a bug in Date::ICal since there it is impossible to generate a timestamp that refers to the time midnight in GMT.

The author was very hesitant to change this behavior since it has been in production environments for years. Instead he strongly encouraged me to use the DateTime module. For anyone else looking to do this, I've had some success doing this:

my $dt = DateTime->from_epoch( epoch => $due );

my $start = $dt->ymd('') . 'T' . $dt->hms('') . 'Z';

Other than this one bug, the module is great--I'm only rating it low so that other folks know to look to DateTime.

Chart-Clicker (2.58) *****

I've been watching this project and it keeps getting better. The prettiest plug-and-play data graphs on CPAN!

The docs are good but missing information on a number of the subtle tweaks. For example, I had troubles figuring out how to adjust the width of the line in a line chart (the default width is far too thick when there are thousands of points on the graph). It turns out to be easy enough ($ctx->renderer->brush->width(1)) but I couldn't find it in any the docs or tutorial. I ended up finding it in the examples, which are a fabulous resource:

The time-series graphs are great, but bring your own date parsing of the source data. I'm looking forward to trying out the candlestick graphs.

Chart-Gnuplot (0.12) ****

A very useful module for dealing with Gnuplot.

I still prefer gnuplot over Chart::Clicker and SVG::TT::Graph::TimeSeries for graphing time series data. I've used gnuplot directly in the past and didn't have much trouble adapting to this module's interface.

My one issue was that it isn't possible to use the interactive x11 terminal (it displays the image for a fraction of a second and then it immediately disappears). I was able to get it working by including the code below in my script.

In case the code doesn't format well, see:

# interactive gnuplot terminal

use Hook::LexWrap;

wrap 'Chart::Gnuplot::_execute',

pre => sub { my ( $self ) = @_;

# if this isn't an x11 terminal, there's nothing to do

return unless $self->{terminal} eq "x11";

# add 'pause' command to script to keep image from immediately disappearing

open(GPH, ">>$self->{_script}") || confess("Can't write $self->{_script}");

print GPH "\npause mouse button1\n";


# output is not a file, delete the 'output' param or we'll get an error in _execute

delete $self->{output};


GRID-Machine (0.101) *****

This module is similar to IPC::PerlSSH, but so much more powerful. All you need on the remote end is an ssh login and perl (GRID::Machine doesn't even need to be installed on the remote machine). Local modules can be sent to the remote end, callbacks on the remote end can invoke methods on the local end, and data structures are automatically serialized across the ssh connection. A really cool idea with a solid implementation.

The interface is well designed and the documentation is extensive and contains many useful examples. I was surprised how easy it was to get this up and running.

One thing to note when interacting with many remote machines is that the examples only illustrate non-blocking interaction with the remotes. If you want to call a slow blocking method on many machines in parallel, you'll need to take care of the forking yourself (e.g. combine with POE::Wheel::Run).

I contacted the author with a tiny bug fix and he responded to me very quickly and uploaded a new version incorporating my patch in a matter of hours.