Latest News
Due to a lingering cold, I'm taking a break of blogging for a bit. This is a great opportunity to use my RSS feed to keep up with my posts.
I haven't been able to post new stuff to this blog as I'm knee deep in holiday logistics. Hope everyone has a safe and enjoyable holiday season this year.

As is my tradition, I post a sort of year-end evaluation of my life around my birthday. This year is no exception.
I was on a holiday sojourn in Brooklyn this year when I turned 38. By weird chance, I was but a few doors away from John Hodgman's home. I did not see the nerd hero and fellow Massachusetts native in person, but I did detect his home's WiFi network. How do I know this? Because his network is very clearly marked.
This year was a transition for me and I suppose many people. I lost my long-time job with Leostream, a company I helped launch. That was the first job from which I was ever let go. Technically, I was laid off. Had the economy been better, I don't think there would have been a reduction in force. But, for every door that closes, a new one opens.
I have not been idle during this time. I have done some contracting and have attempted to launch my own software company. Although that failed, I did learn how to write a formal business plan. I have been revitalizing my technical skills, which had become narrowly focused during my Leostream years on virtualization. That lead to two restructures of the taskboy.com site and a few new public utilities. I have become interested in video production using python. And I have some ideas for next year that I'm very excited about.
Sally and I have essentially finished renovating the interior of our home. I adore where I live and whom I live with. I'm an extraordinarily lucky fellow. If I've had some setbacks, I am still very far ahead of the game. And the future is an unwritten book.
There's a new online tool section on the Projects page of this site that contains links to tools I've written that may be useful to other people.
There are two additions to this toolset. The first is an encoder/decoder that can handle uuencoding and base64. This can be useful if you need to do a quick conversion, but don't want to bust out Perl/Python/PHP etc. to do it.
The second addition helps convert phone alpha phrases (e.g. 1-800-MYPIZZA) into all digits. There are many such utilities on the web, but here's my take on it.
Enjoy.
UPDATE: Added Percent encoder to the mix. I should have done this 12 years ago. It would have saved me a lot of pain.
The migration to the new theme here at the taskboy has gone well. Now it's time to pay for all of this.
As of today, I'm putting some Google AdWords on this site. The positioning is relatively hidden, but I think anyone looking for ads can find them easily enough.
To improve google's indexing of my site, I have created cached versions of all my blog entries (over 1200 pages!). The permalink format for the blog entries has changed a bit. I guess that makes the old links not very perma.
I will be adding more technical content here more regularly. I'll try to crank out a solid article every week with daily updates of my technical shenanigans.
Perhaps I'll even make some merch on Zazzle in the pursue of filthy Mammon.
If I feel the need for non-technical blogination, I'll either update my Facebook profile (which I'm loathe to do) or finally use my LiveJournal account.
Finally getting around to implementing the new taskboy them that Robert Oliver designed for me. There's a lot of breakage right now, but I will be fixing broken items in priority order. Your patience is appreciated.
It seems my spam filter has been very aggressive lately. If I haven't responded to your email, I probably only just fished it out of the trash.
As of last week, I have become an independent software consultant again. As part of this transition, I'll be redesigning this here web site and moving content around a bit. I also will be putting ads on this site and taking the content in a more technical, professional direction.
Some may question the taskboy.com domain for this purpose, but actually I obtained this domain specifically for a business idea.
The content I have in mind will move beyond just Perl. Some of it, while useful, will probably be quite boring to my non-industry friends. I suppose Facebook as a purpose after all.
Now you can see more unsettling pictures of me than ever before!
It's my Christmas gift to the world.
Birthday number 37 is nearly over for me. It's been a hell of a year and much better than last year. Mother Nature gifted me (and most of northern NE) with a historic ice storm that knocked out power to my home. I was kept awake last night by the insanely frequent sounds of branches failing under the weight of 1" of ice. Doesn't sound like much, but it was enough to snap mighty limbs of the mature oaks in my yard.
I'm a lucky guy. I've got a great wife, a wonderful home and even a job that pays me. What more could I ask for (*cough* Amazon gift certificates *cough*)?
I'm moving taskboy to a new server. Everything will be broken for a while, especially taskboy.com mail.
I'll get it fixed eventually. I hope.
UPDATE: Mail is working (it appears). RSS feed generation is not. Probably The Feed Bag isn't either.
Taskboy is moving from the excellent colo arrangement it now has for something new. So expect some turbulence from now until Jan. 2009.
I'd also like to publicly thank Nate Patwardhan for all his unsung admin work in keeping the box alive and stable. Nate should get a job as a sysadmin or something...
Is it just me or does this Amazon review by Scott Smith look a bit too familiar?
I've never been so closely, er, quoted before.
Visited Lowell General Hospital today for the first time, in which a doctor looking very much like Alton Brown informed me that my eye was swollen from non-viral conjunctivitis. I get to put jelly in my eye for three days.
So, I have that going for me.
Dear Internet,
Because I'm currently homeless, I do not have regular access to my taskboy.com email. If you need to reach me, please use a different address. If you don't know what that address is, I'm not telling you here.
That is all.
UPDATE Because of this fabulous article, I can read taskboy email again! I'm at the cutting edge of 1991 tricknology!
The graphic above shows the number of pages served per year. Nice tread, eh? Maybe it's time to slap some Google Ads on this puppy and CASH OUT!
Despite not wanting to put overly personal things in this space, I wanted to announce this bit of news once to avoid repeating myself.
Pictured above is my Mom, Pat. On November 15th, I brought her to the hospital because she was complaining of "feeling off." She had trouble speaking. She could not find the right words to express herself.
After a number of tests, it was confirmed that tumors in her brain were causing some of her discomfort. She had had undiagnosed lung cancer for some time that had spread to her brain, adrenal glands and lymph nodes. She was a life-long smoker.
For such an advanced stage of cancer, there is no treatment.
This week, Mom will be going to a nursing home that will attend to her final needs, which amounts to morphine. She can no longer speak and doesn't appear to be eating. We expect the end soon.
Over the past few weeks, my brothers and I have been very busy putting her affairs in order.
If you wish to send your condolences to her, please email me and I will provide you with the contact information. I would ask that you not try to visit her, as she will likely be sleeping when you arrive.
Thank you for your support during this time.
UPDATE: Mom passed at 3:30A on 12/02/2007. Rest in Peace, Mom.
UPDATE: Mom's obituary will appear in Sunday's Boston Globe and Cape Cod Times, 12/09/2007. No funeral is planned (her wishes), but a memorial service will be announced later. In lieu of flowers, please consider making a donation to the American Lung Association in Pat's name.
Happy Birthday, me!
On Decemeber 12th I have, as I have had for the last 35 years, a birthday. If last year's didn't convince me that I'm no longer young, this one makes the point more insistently.
Since I'm likely to be very, very busy until then, I post about this monumental event now.
Still, things in Joe Central aren't all that bad. I have a delightful girl friend, reasonably good health, many good friends and a ever more prosperous business. All these have to count for something.
UPDATE: Today is the 12th and it's a fine, fine day.
UPDATE: Got my present from Sally: a hoodie that says "Awesome since 1971." And you know? That's absolutely the case.
Sorry for the lack of updates, but I've been really, really busy with work. I've created my first Java GUI wizard for installing Virtual Applications on to ESX 3, which will be more useful than it sounds.
Oh, I guess there was some kind of holiday too in there...
A remix of an old track Without You is now available for mass consumption. Remixed with better audio equipment, new synth patches and a new organ track, I hope this track will be received with all the attention it so richly deserves.
Because I can't do anything original, I copied Sean Burke and pulled my old posts from use.perl.org into taskboy, complete with the right post dated.
Now Taskboy is the COMPLETE REPOSITORY FOR WORLD KNOWLEDGE about all things Joe Johnston-ish.
In my continuing quest to implement hot technology from the year 2000, I've created an RSS aggregator.
This application is more than a rehash of Rael Dornfest's Meerkat, which I miss.
I'm very fond of Firefox's Live Bookmarks, but I don't always have my computer with me. This way, I can get to the important feeds from any machine.
All VC funding offers should be directed to the email at the bottom of this page. The gravy train is pulling out of the station!
I'm also working on a sort of Wiki for Taskboy, but it's not quite ready for prime time yet.
I spent this glorious summer day remaking an old song that I love called Round the Bend. This version captures the bouncy feeling better than the hasty demo I made years ago. This version is electrified for your protection with my telecaster.
UPDATE: I remastered a few older tracks, which you might find interesting. I swapped out some old, clunky synth patches for new, clunky synth patches.
- Strings
- Coming Down (much improved)
- Germs
- Spooky
I just fixed a bug that prevented all blog entries of a given tag to appear. For instance, computers has about 25 articles, but only the last 10 appears. Stupid SQL limit constraints.
It's fixed now, so I declare the terror alert level at taskboy to be lowered to papaya whip.
As some of you have seen, I've implemented a tagging system that links to Technorati . I did so after consultation with and guidance from Jason McIntosh.
I tagged some old blogs, and may have damaged those a bit. Please report broken pages to me when you notice them.
I'm not entirely sure how I feel about tagging. It's a form of bottom-up catagorization and makes the type-A personality in me whince. However, I'm not about to implement a top-down ontology for a frigging blog, so tags it is.
I've created a few backend administration pages to help me with these new features. Unfortunately, you can't see them, because their password-protected. One of these pages is a web form that allows me to make new blogs. While I do really, really prefer emacs for composition, a web UI let's me bang out these trivial updates more easily and from any networked computer.
Let me know what you think. If requested, I'll make a page that allows you to browse entries by tag.
UPDATE: I tagged most of the old blog entries. I also created a new page called Tags (which can be found under Sections) that can be used to thread entries by tag. I stole, I mean, reused the CSS from del.icio.us to weight the tags by occurrences. I think that brings taskboy up to the cutting edge of 2003 blogging technology.
The people have spoken. When it comes to mouthing off on this site, you want to muscle in on my turf. In the interests of peace and understanding, I have creating a commenting system for taskboy.com.
Since this is my house, these are my rules:
- Not every blog entry will have comments enabled.
- Comments require my approval before getting published.
- You can make only one comment per blog entry every five minutes.
- You have a very restricted set of HTML that you can use.
- Comments are not formated automatically, so learn some HTML already.
- You cannot edit your comment once you submit it.
As we all learned from Peter Parker's Uncle Ben: with great power comes great responsibility. On taskboy, the power is now yours.
I covered another Erik Carter song, this one called Except me. This is one of my favorites from Erik's band Mumble and Peg.
This arrangement features me on piano, which was cleaned up only in a few spots. The mix was enhanced with Sonic Maximizer, which does help (surprisingly). It's a slow song, but definitely not easy listening. Enjoy.
Check out the new album, called Lurid, in taskboy's music section. It took over three years from the start of tracking the opening title Rusted Gunnels to get to the final mix. Whew! Special thanks to Nate Patwardhan for lending me all of his formidable music talent and use of his home studio. Also, Ira Schwartz, who drums on "Rusted Gunnels," has become my personnal percussion savior.
I think there's a little something for every one on this collection.
It's true what they say: art is never finished, only abandoned.
(Note 1: This is the third and last part of a series on the taskboy CMS. It's the least informative of the three, substituting opinion for fact in a thuggish way.)
(Note 2: I stole this picture of TV cook and personal hero Alton Brown from the Internet Wayback Machine, since he no longer blogs. He had an ugly incident with the public, it seems. Personally, I think it became too much of a time sink for him. I hardly have a life at all and I can't add content here daily.)
XML, SOAP and other windbags
This is a very long post already, but I'll chime in some recurring trash talk about XML-RPC that irks me. Before I start, I want to clarify one thing: this screed isn't directed against Mr. Harold, who is to be praised for making his manuscript available for free. That's something I'd like to see more of from all quarters. Mr. Harold has done his part to make the world a little brighter by providing a free and quality resource for java programers.
OK. Time for the shit storm.
In Processing XML with Java, Elliotte Rusty Harold asserts the following while introducing the section on SOAP:
«XML-RPC was in large part invented by a single person who really didn't know a lot about XML. Consequently he made many very questionable choices...
Whereas XML-RPC was a quick hack by one developer, SOAP has been developed by a committee of XML experts from various companies including IBM and Microsoft.
You've undoubtedly heard the old saw about a camel being a horse designed by committee... SOAP is a much more robust protocol than XML-RPC. It is much better designed from an XML standpoint as well. It takes advantage of numerous features of XML such as attributes, Unicode, and namespaces that XML-RPC either ignores or actively opposes. (my emphasis) XML-RPC is adequate for simple tasks. However, if you get serious with it you rapidly hit a wall...
The biggest conceptual difference between SOAP and XML-RPC is that XML-RPC exchanges a limited number of parameters of six fixed types, plus structs and arrays. However, SOAP allows you to send the server arbitrary XML elements. (my emphasis) This is a much more flexible approach. »
This is a very common argument made against XML-RPC and here's why it's dumb.
The beauty of web services doesn't lie in XML; it lies in the simplicity of the process. Yes, XML (sort of) helps this simplicity, but the real value of a web service in the work it faciliates. It's the platform neutral procedure calls that make web services interesting. Too many SOAP advocates are thinking in terms of only one language (*cough*java*cough*) and so expect a very close mesh between their language and an RPC mechanism. News flash: XML-RPC ain't RMI. I've used XML-RPC in at least a have dozen languages. SOAP is just painful, even in java (which I used for a cell phone application). Sometimes I expect an array of strings just be an array of strings.
XML-RPC is caveman simple and that is a colossal advantage. It's restriction of datatypes is an advantage that many OO-heads should wake up to. Not only are most things in life not Objects or Classes, many things for which there are Objects and Classes shouldn't be. Sometimes a plain old ASCII string is Good Enough, despite political posturing.
I dislike XML and barely tolerate it in XML-RPC. All of the XML features mentioned in the quote, particularly namespaces and user-defined datatypes make SOAP a digital Babel. I hardly like attributes in XML. SOAP's flexibility is a liability. How many times of Perl hackers been taken to task for their language's robust syntax? WSDL is little help to taming the complexity of web services here. It contributes to the traffic jam. I LIKE that there's no offical DTD for XML-RPC. DTD's are sooo SGML. Well formedness is all you need. Everything else is a data validation problem for the application.
That's right, I said: the app needs to validate data. Does your language make this easy? If not, get one that does.
The KISS principal of XML-RPC goes very, very far here. The features that SOAP has are for a future web of web services that may never come. XML-RPC is here today; stable with a boatload of implementations in many languages. SOAP is one document format too far and too far out.
The End: "Well, I'm back."
(This article continues my thoughts on the taskboy CMS.)
How the taskboy CMS works
Once I decided that content would be managed through emacs (to as large a degree as possible), the rest fell mostly into place. The blog, the music section, the polls and the ratings would all be stored in mysql and accessed through a XML-RPC API. I would use PHP to define the layout, pulling the content from the database where needed. Templates as such are not used. To my thinking, a PHP page is the template. I also decided against database abstraction classes, since I'm unlikely to move from mysql any time soon. I do have a collection of PHP utility functions (like, sql_insert, sql_delete, sql_select) to make database access less painful. Each PHP page calls the same header and footer pages. Much of this code was developed along side State Secrets. Together, this makes the PHP stuff pretty easy to modify.
Getting from emacs to PHP is a little circuitous, so please bear with me. It is straight forward to write a perl script that's an XML-RPC client using the Frontier::RPC2 library. So that's what I did first. I verified that I could talk to the PHP page that processes XML-RPC requests. Emacs is an extentable editor using the macro language lisp. The creator of Perl, Larry Wall, said of lisp that it had all the visual appeal of "porridge with toenail clippings" and I agree. However, I did learn just enough lisp to write the current emacs buffer to standard out to be read by a perl script which could then make the appropriate XML-RPC request and make some snappy response that emacs could deal with. This solution is what I wrote about on use.perl.org.
Gnu Privacy Guard
The new wrinkle for taskboy is security. The XML-RPC messages go across the network in clear text. The primary risk I wanted to address is not that someone will see my blog before it's posted, but that an unauthorized fool would mess with my XML-RPC service. Whatever authorization mechanism I choose would have to work over clear text. It's true I could have used SSL with HTTP Authentication for the web services PHP page, but I didn't want to. Fortunately there is already a solution for this kind of problem, but for a different form of internet messaging.
Back in the mid-80's, Phil Zimmerman had a problem: he couldn't prove he was him. That is, email that claimed to be from him could have been forged by some joker only claiming to be him. How could those receiving email from he be assured that the sender Phil Zimmerman was the Phil Zimmerman? The answer became known as Pretty Good Privacy and it involved some very scary math. But you can think of it as something like a lock and key mechanism. When an email is sent out, a Very Big Number is computed with the content of the message and your private key. Your private key has a sibling called a public key that the recipient of mail will already have (and verified). When the recipient gets this message, pgp uses the public key on file to decode the message (or signature). If nothing has been changed in the message, the math will work out (via magic) and you can be pretty sure that Phil indeed has told you to "go pound sand."
The important concept here is that PGP was meant to guarentee the identity of a sender using a message that anyone could read, but not change. Now in web services, I also have messages that anyone could read, but I want the server to accept only requests from me. Although it's not a seemless fit, PGP turns out to be a good authenication method for private web services. Here's how I modified Edd Dumbill's XML-RPC PHP library and Ken MacLeod's Frontier::RPC to use Gnu Privacy Guard (any open source version of PGP) to look down my web service. The strategy in both cases is that requests should be signed, not responses. It would be staight-forward to implement response signing too, but I don't deem it necessary for my application.
Tweaking the PHP server
This class merely extends the xmlrpc_server class found in xmlrpcs.inc. I need to intercept the content, verify the signature, remove it if the message checks out and pass the rest of the XML doc to the parent class for handling. Hats off to Edd and the boys for getting the class partitioned so that I needed to override only one method.
One PHP tip: name your class files with .php. That way, you can point a browser to them and check the syntax. After all the syntax typos are gone, the page will appear blank. The the contents of files with .inc extensions are typical just displayed by the web server without parsing.
VerifyRequest($data)) {
return $this->RPCError("Couldn't verify request");
}
$data = $this->RemoveSignature($data);
}
# pass off to parent
return parent::parseRequest($data);
}
#-----------------------------------------
# Look at the body of the request. Does it have
# a signature to verify?
function VerifyRequest ($data="") {
# BTW: I hate this solution
# write out to a tmpfile
$infile = "/tmp/" . posix_getpid() . ".vrf";
if ($fh = fopen($infile, "w")) {
fwrite($fh, $data);
fclose($fh);
} else {
return 0;
}
# is this signed by someone I trust?
$cmd = "/usr/bin/gpg --homedir=/path/to/gpg "
. "--verify <$infile 2> /dev/null";
$retval = 1; # default to failure
if (file_exists($infile)) {
system($cmd, $retval);
} else {
return 0;
}
unlink($infile);
return $retval ? 0 : 1;
}
#-------------------------------------------
# remove signature header/footer
function RemoveSignature ($data="") {
# for GPG
# strip of the GPG stuff to get the basic XML back
$preamble = "/-----BEGIN PGP SIGNED MESSAGE-----r?n"
. "Hash: SHA1r?nr?n/";
$footer = "/-----BEGIN PGP SIGNATURE-----r?n"
. "Version: .+r?nr?n(S+r?n)+"
. "-----END PGP SIGNATURE-----/";
$data = preg_replace($preamble,"", $data);
$data = preg_replace($footer,"",$data);
return $data;
}
#--------------------------------------------
# wrapper for easier (and non-granular) error reporting
function RPCError ($msg=0) {
return new xmlrpcresp(0,500,"Bad request: $msg");
}
}
?>
A few notes on this amateurish PHP code. First, any security wonk will tell you not to create temp files with PID names. In my case, I trust the other users on my server and don't feel compelled to improve the security here. You may want to. I'm using the fact that gpg process has an exit value of 0 if the verify succeeds. The only way I saw of getting the exit value of a process in PHP is by using system(). There are a couple of other process handling functions, but those didn't seem to give me this simple result to check (I could have used popen() and grepped through the output, but that seemed painful [although I might have done that if this were a perl module]).
parseRequest() is called by the parent class to unpack the XML request. Here, I look for the GPG signature and if all goes well, I pass just the XML string to the parent parseRequest() for processing.
Keep in mind that PHP runs as whichever user Apache runs as. This affects GPG. You have to set up the file ownership for the keys so that Apache can read and write to a directory. You should create keys specifically for this web service and not reuse your own GPG stuff. You were warned.
This class is used identically to the xmlrpc_service class defined in xmlrpcs.inc. No, I don't know what the "da_" stands for in the class name. I though I wrote "ds_", which would have stood for "digital signature."
Expanding the Frontier
For the perl client, I simply defined to classes at the start of the program. Keep in mind, this is a win32 perl program.
package RPCEncoder;
use Frontier::RPC2;
@RPCEncoder::ISA = qw[Frontier::RPC2];
sub encode_call {
my ($self) = shift;
my $request = $self->SUPER::encode_call(@_);
# sign it. 2-way opens hurt my brain
my $outfile = "C:/blog/tmp.txt";
unlink $outfile;
my $cmd = qq[|C:/blog/gnupg/gpg.exe --homedir=/blog/gnupg ]
. qq[--clearsign > $outfile];
open GPG, $cmd or die "Can't proc open: $!";
print GPG $request;
close GPG;
open IN, $outfile or die "Can't open signed $outfile: $!";
undef($request);
while () {
$request .= $_;
}
close IN;
unlink($outfile);
return $request;
}
sub decode {
my ($self) = shift;
my ($string) = shift;
my %args = ('Style' => 'Frontier::RPC2',
'use_objects' => $self->{'use_objects'},
);
$self->{'parser'} = XML::Parser->new(%args);
return $self->{'parser'}->parsestring($string);
}
#-----------------------------------------------------
package RPCClient;
use Frontier::Client;
@RPCClient::ISA = qw[Frontier::Client];
sub new {
my ($self) = shift->SUPER::new(@_);
my %args = ('encoding' => $self->{'encoding'},
'use_objects' => $self->{'use_objects'}
);
$self->{'enc'} = RPCEncoder->new(%args);
return $self;
}
The perl is a little weirder because of the way the Frontier Client works with XML::Parser, itself a horrible creation of Cthulhu. The Frontier::Client constructor needs to be overrided so that I can insert my custom RPCEncoder class, which is a thin coating over Frontier::RPC2. All the XML encoding and decoding happens in Frontier::RPC2 and that's what I need to intercept.
When making a request, I need to sign the XML string before it goes on the wire. All things being equal, I'll like to open the gpg process for reading (to feed it the string I've got in memory), but also read from it to get the output. This is a kind of double pipe, which is easy to do in shell, but weird to do with perl and especially so on Windows. Once again, I write a temp file and I don't even pretend to give security a mind. Windows boxes are typically single user machines and mine doubly so. Also note that I don't need to worry about running as a different user when I make the XML-RPC request. I'm in emacs (which runs as the current user); it spawns a shell to run perl; perl spawns a shell to run gpg.exe). All these processes run will run as me.
I had to also override decode(), because the parent uses ref($self) to determine the class name of the XML callbacks (n.b. BAD MONKEY!). This
really should have been hard coded to 'Frontier::RPC2' since the callbacks all
have hardcoded class names (see the code for the real scoop). I think this was
an attempt to make child classes easier to write, but this trick backfired.
A Quick Note on GPG setup
Getting up to speed on how GPG works took longer than integrating it into
the taskboy web service. I cannot go in to all the set up details here, but
if you are familiar with ssh key mananagement, you will be well ahead of the
game in GPG. If ssh keys make your brain hurt, GPG is a veritable migraine.
But it boils down to this: you must make a GPG key pair for the source machine
with the perl/emacs setup. You must copy the public key to the server. You
must import that key into GPG and verify it (with gpg --edit).
If you don't do all of these steps, this digital signature for XML-RPC hack
won't work and you'll be mystified at what went wrong.
Verify your GPG at all stages using test files, so that you can get the
GPG errors.
Note to jjohn: Move the *gpg files to wherever gpg want to find them. It will make things go easier on you.
The next three posts are about how XML-RPC makes taskboy go, why XML-RPC is better than SOAP and how PHP and perl excel in their own domains. I wrote these as one long article, but, taking pity on my readers, I broke the leviathan into three parts. I expect to be rewarded for my gesture of mercy with crazy-go-nuts xmas stocking stuffers this year.
Web Logs
Although web logs, more popularly called blogs, have recently come to most people's attention during the 2004 US presidential election, the idea of having an easy mechanism to post ideas large and small onto a web site is not new at all. After writing the first dozen or so HTML pages by hand, most of us starting thinking there must be a better way.
Enter the Content Management System
The content management system (or CMS) is a software package that sits on the web server (and perhaps has a special client for your local machine) which faciliates publishing web content and maintaining a consistent look and feel from page to page. The core technology for a consistent look and feel is the use of a templating system. That is, a pattern of code that content can be paired with to generate the final HTML page that visitors to a site view. A natural fit with the use of templates is an underlying database in which to keep the core, user-defined content (and possibly the templates too). So much for web design history up to 1998.
Early CMS tools were written in a variety of languages. Back in the day, Perl was the king of dynamic web applications and was used to build many CMS systems. The trouble with Perl is that it's fidgity in spots to learn and (for some people) it's complexity isn't welcomed as a templating language.
Enter PHP
PHP is a dynamic, perl-like language specifically designed for the web domain. It's both fast and feature-full (and not a little unwieldy at times from problems stemming from it's early lack of namespaces). Knocking out simple, but powerful dynamic web sites with PHP is criminally easy and fast. PHP even has a Windows help file, for those of us workin' on Uncle Billy's farm.
But not everything needed to make a web site go happens in CGI land. There are plenty of system-level things and non-http tasks for which PHP isn't suited (despite some heroic hacks from the PHP community). Wouldn't it be nice to have a way to get the best of both worlds: to use PHP for web front end stuff and perl for backend management?
Enter XML-RPC
XML-RPC is way for programs written in different languages to talk to each other. This concept has the buzzword-compliant name of "middleware" and it's a far from new idea. Programs are, almost by definitions, fiefdoms onto themselves in which data gets trapped. It's hard enough to make computers do what you want to today, let alone try to build software in such a way that it will be useful tomorrow. XML-RPC is the method by which one program's procedure is serialized as XML, passed over a network using HTTP, executed on the receiving machine who then returns the response as XML to be unserialized back into a format mostly easily consumed by the caller. It is a "web service wire protocol" and is the forerunner of the more feature-rich (but strangely less useful) SOAP. This complex dance allows Perl and PHP to use each in appropriate contexts. But what are those contexts? The answer lies with existing CMS.
Thin clients? Fat chance!
The web browser is arguably the most important application to be written in past ten years. In network architecture terms, browsers are thin clients that handle a variety of display issues and a small subset of user input tasks. This is the key to the success of the web. The browser, as envisioned by Tim Berns-Lee, was for reading and changing web pages. By latching onto the read-only aspect, browser makers forestalled what would have been a virtually endless debate about how to implement security for changing web pages. Web page security became the domain of web servers. Which is why CMS systems must be installed on web servers and can, for convenience or to implement specific features, have a client piece on a web author's desktop. Many CMS just used the browser for their client.
And this is exactly the thing that most blogging software does: use the browser to compose entries and manage the content. Blogs, often being simply one page, wouldn't have gotten so popular if each required some kind of special input client on each author's machine. Blogs then are a very specialized form of CMS.
The problem is: I hate composing prose in web browsers. Being a programmer, I've invested a lot of time learning to use a programmer's editor (emacs, in my case). What I want from a blog CMS is to compose, publish and manage my blog entries from emacs editor on my desktop. Now many a blogging CMS have some kind of web service APIs that allow you to hack up glue for your editor of choice to do the same thing that I've done with taskboy. Much of the taskboy system derives from what I did for my use.perl.org journal.
When I decided to move my first blog off use.perl.org, I knew that I wanted to continue using emacs to compose and edit my entries. However, I now had to deal with the front end display logic for the blog. Having written and modified several perl CGI/mod_perl HTML generating programs, I wanted to avoid that solution. Instead, I wanted to learn more about PHP and I'm glad I did.
Next: The dirty details
A while ago, I was asked to write a theme song for a cable access TV show. Although none of my submissions were selected, I enjoy these little works. I hope you do too.
I also reworked the music page a bit to show what songs are new or updated.
I have enabled voting on each blog entry here on Taskboy. This feedback mechanism allows you, the reader, to voice your "hell yeah!" or "hell no!" to whatever drivel is on this page.
Rock, rock on
Former New York City mayor Ed Koch became famous for asking the man on the street "how am I doing?". Taking a page from his playbook, I've implemented a crude voting system on the music page which allows you to give me feedback on my work (almost) anonymously.
To prevent multiple voting, I accept only one vote per IP address. Don't let that scare you too much, though. I'm pretty lazy and it would take more work to find out who trashed my music than I would want to expend.
Over time, I hope this system helps me figure out what I've done that's interesting to other people.
Continue rawkin'
UPDATE: I'm thinking about implementing rating for my blogs too. I think this is a good anonymous and simple feedback mechanism.
I just did some quick number crunching on those requesting this blog's RSS feed. From August, 2005 until now, there have been over ten thousand requests for this feed. Knowing web spiders as I do, I'm not overly surprised by that number. What is surprising is that there are over 160 unique IP addresses requesting this feed. That's about 159 IP addresses more than I thought.
Here's the list of the top 20 requesters. If you recognize your IP on this list, I salute you! The first, fifth and last IP addresses can be ignored as those requests come from me.
67.18.128.218 => 2639
24.113.6.164 => 1831
207.245.72.170 => 1428
64.252.94.178 => 756
66.30.141.93 => 540
216.148.212.188 => 532
66.150.15.150 => 474
146.115.28.9 => 348
216.148.212.182 => 181
216.148.212.187 => 153
80.186.152.184 => 133
68.94.148.43 => 109
65.75.18.11 => 104
193.166.2.179 => 076
66.92.68.14 => 072
144.118.54.222 => 064
144.118.16.227 => 059
72.14.199.1 => 056
68.90.144.52 => 045
66.92.68.148 => 039
This, of course, means that I get a bigger trailer.
Awhile ago, I wrote a script that presents a graphic representation of RSS feeds. It's mostly a toy, but kind of fun anyway. It looks at the links in the feed, fetches those pages and extracts images from them. It then creates a mosaic of these and turns that into an image map. As I said, it's a toy.
Yesterday, I noticed it wasn't working, so I hacked it a bit more. I also changed the way the images get packed, so that the pictures are more spread out (an idea I got from one of Jon Orwant's hacks he did for O'Reilly).
Enjoy!
Cobbled together from various earlier efforts, but collected together for the first time, the songs that compose Nukular Potatoe are some of my more recent work. Too much rock? I think not.
Fun for all ages (if that age is between 13 and 19).
![]() |
![]() |
![]() |
![]() |
The third and hopefully last incarnation of State Secrets is now available on taskboy.com. There will be bugs, but the game is afoot now. It really has a win condition and PvP violence, so that's delic.
State Secrets is a game I designed that was inspired by Seth Able's Funeral Quest and his excellent earlier offering Legend of the Red Dragon (L.O.R.D). In SS, you assume the role of either an FBI agent or shadowy Man In Black to ferret out a collection of Secrets from ne' do wells around town. The game ends after someone defeats the 3 Lodge sub-bosses in Pier 13.
Putting together this game was a lot more work than I ever thought and I'm certain I'm not done. I need a lot more error detection and cheat prevention, at a minium. Business applications are far easier to write.
Anyway, sign up and poke around. Let me know what you think.
I've posted a couple of remixes and rethought some of the collections a bit. The playlist of Cheap Sneakers has been been shortened to four of the best songs. "Fall Down" and "Plug Nickle" have been remixed and substantially enhanced with retracting. The work in progress, Encode has it's playlist in the preferred order and a more complete version of the song "Not Amused," which I feel still needs work. However, this version is closer to my vision than the demo.
With autumn and winter approaching, I hope to get more studio time in with Nate. There's a great version power trio version of "Rusted Gunnels" that I need to finish mixing that will entertain, I'm sure.
Carry on, my wayward sons.
I added about 6 more tracks to the Mother Bodfish album. Because, this music is for the people.
I've reorganized the music section so that the songs are grouped into "albums." I've added around a half dozen Mother Bodfish tracks and will add more over time. Even after almost fifteen years, those little bits of madness make me laugh out loud.
Also, it is my desire to produce at least one CD of my music. In the near future, I'd like to setup some kind of pay site for those who want to support my efforts directly. I've had a few thoughts on this. One model is to offer $25/year subscriptions that allow users access to a restricted directory with exclusive content. Another model is to offer all my songs for free, but put up a donation button. Juliana Hatfield experimented with this model, but stopped. She said that the program worked well, yet she's also not doing it anymore. The last model is like iTunes, in which you pay $1 for each full song.
If you're interested in supporting my musical activities, which model would you recommend? Please email me.
Update: I decided to accept donations for now. It's easy to set up and doesn't precude a premium content site later.
Good news, everyone! I've modified my primative perl script to
report interesting
Again, I'd like to ask that anyone who's downloading my crappy version of Immigrant Song please explain the joke. I know it's terrible, but it's not terrible enough to be ironically hip. Throw a brother a bone, huh?
A note of explanation is require for this report. The songs are ordered in popularity, as determined by the number of raw requests (successful or not) for this this file.
You can get a better idea of how many individuals are interested in the song by counting the unique Internet Protocol (IP) addresses used to request to the file. If you haven't heard of IP addresses, this isn't the place to learn about them, but roughly speaking every computer needs one to get to the Internet.
The way in which files are requested by web browsers (or more generally HTTP clients) allows for either the full retrieval of the file (using a "GET" request) or simply a check to see if the file is still there (using a "HEAD" request). Generally, people-manned web browsers use "GET" requests and web crawling robots make "HEAD" calls. By comparing the statistics for each kind of request, you can get some idea whether real humans are listening to my music or whether I am simply entertaining robots. I'm fine with either case.
1) /music/immigrant_song.mp3 :
last requested: [07/Aug/2005:12:49:21]
total requests: 2188
unique IPs: 500
GET: 1713
HEAD: 475
---------------------------------------------------------------------------
2) /music/you_belong_to_me.mp3 :
last requested: [07/Aug/2005:11:25:00]
total requests: 1859
unique IPs: 913
GET: 1485
HEAD: 374
---------------------------------------------------------------------------
3) /music/shut_up_and_listen.mp3 :
last requested: [28/Jul/2005:01:30:17]
total requests: 1372
unique IPs: 712
GET: 1220
HEAD: 152
---------------------------------------------------------------------------
4) /music/walk_away.mp3 :
last requested: [06/Aug/2005:13:34:21]
total requests: 842
unique IPs: 325
GET: 769
HEAD: 073
---------------------------------------------------------------------------
5) /music/on_the_air_remix.mp3 :
last requested: [07/Aug/2005:11:29:18]
total requests: 830
unique IPs: 590
GET: 210
HEAD: 620
---------------------------------------------------------------------------
6) /music/m_vs_r_jjohn.mp3 :
last requested: [07/Aug/2005:11:29:24]
total requests: 655
unique IPs: 303
GET: 459
HEAD: 196
---------------------------------------------------------------------------
7) /music/dance_of_the_sunni_4trk.mp3 :
last requested: [30/Jul/2005:20:38:50]
total requests: 590
unique IPs: 362
GET: 538
HEAD: 052
---------------------------------------------------------------------------
8) /music/but_not_yours.mp3 :
last requested: [06/Aug/2005:20:46:09]
total requests: 458
unique IPs: 296
GET: 423
HEAD: 035
---------------------------------------------------------------------------
9) /music/yapc_rave_02.mp3 :
last requested: [07/Aug/2005:11:29:18]
total requests: 425
unique IPs: 240
GET: 179
HEAD: 246
---------------------------------------------------------------------------
10) /music/dont_be_late.mp3 :
last requested: [20/Jul/2005:22:18:53]
total requests: 321
unique IPs: 177
GET: 275
HEAD: 046
---------------------------------------------------------------------------
Endnotes:
1) The use of the word interesting may not met your local requirements. Please see your local chamber of commerce for details.
That's right. I said it. I've been working on a variety of new projects and thought that this might be a good place to put them. I used blog exclusively on use.perl.org, which is also where many of my friends blogginate, but I craved a bit more editorial control. So any and all subjects are fair game for this space.
Also, I can post stunning pictures, such as the following:
Ah, the seductive power of full HTML control!
At some point, I'll have to update the rest of the site, but one smallstep at a time.
This blog is controlled through emacs via XML-RPC. It's the small technical things that make me happy. I'll get around to making an RSS feed when there's more content to merit it.
UPDATE: Did the RSS thing. I remembered that I already had most of the HTML and perl code lingering around from PseudoCertainty radio show site. Code repositories are a beautiful thing.
About this blog
The taskboy blog is a exploration of computer technology by Joe Johnston. Topics of posts include practical examples Perl, PHP, Python and Java as well as book reviews, industry insights and miscellaneous good stuff.
Current Status
Watching _Brass Latern_. Ah IF, your coyness is your charm.
Posted: Sun Sep 05 16:02:15 +0000 2010
Latest Feedbag
- Stadiums vanish, but their debt lives on
- Hillary Clinton on America's future: US retains role as world leader
- Stephen Hawking looks at the cosmos in 'The Grand Design'
- Need Niche Network Group Buying Deals? Meet ChompOn
- Q&A: Five key questions about midterm elections in Congress
- Microsoft intros Kinect bundle
- European Parliament All But Rejects ACTA
- Grain Sack Doubles Up As A Water Purifier Kit
- BMW Takes Internet Car Reveals To A Weird New Level
- Monocolumn: Imelda Marcos, Mark 2
Generated: 10:45 on 08/Sep/2010
Recent posts
- Very quick git primer for basic functionality
- Tips for spammers: don't insult me
- CakePHP vs. Symfony: a quick note
- Creating events for Yahoo and Google calendars
- SANs on a budget: iSCSI under Ubuntu
- iPad, iTouch and Kindle: Which is the better mousetrap?
- Rise of the Ad-Hocracy, Part II
- Rise of the Ad-Hocracy, Part I
- Small Hiatus






