09 June 2008

ISPN3 Meeting: Updates

I've just gotten word of a few changes in the ISPN meeting schedule.
  1. The ISPN meeting will be held on July 21–22, with a social on July 20.
  2. Registration at pre-meeting rate is extended to July 1.
  3. Abstracts will be accepted until July 1.
For more details, see the Protist 2008 website and/or my previous post.

06 June 2008

Three-Pound Monkey Brain: The Open Source Project

In an earlier post, I was bemoaning the unimaginative (and self-centered) name I was using for my general open source ActionScript project: net.tmkeesey. But someone pointed out to me this morning that a better name was staring me in the face all this time. Thus, I have changed the packages from net.tmkeesey to ... threelbmonkeybrain! (A bit long-winded, but unfortunately you cannot start package names with numerical digits.)

Along with this much-better name is a new location for the code. Point your Subversion clients to:
(Or, if you just want the code itself without unit tests, etc.: http://svn3.cvsdude.com/keesey/PROJECTS/ threelbmonkeybrain/as3/trunk/src/threelbmonkeybrain)

I've added a lot of new packages under the rubrics of threelbmonkeybrain.load and threelbmonkeybrain.net, but I have not had time to build full unit tests for them. Once that's done, I'll write more about those.

04 June 2008

More Additions to Open Code: Collections and Connectivity

I've added two new utility packages to net.tmkeesey. SVN repository here.)

Static classes with utilities for handling Flex objects.
Contains a convenience method for converting arrays to ArrayCollection objects with filters and/or sorts.
Contains handy functions which can be used for ICollectionView.filterFunction.
Contains a convenience method for converting ListCollectionView objects to arrays, using filters and/or sorts.

Static classes with utilities for handling flash.net objects.
Contains methods for cloning and comparing URLRequestHeader objects.
Contains methods for cloning and comparing URLRequest objects.
Contains methods for cloning and comparing URLVariables objects.

As always, I commit nothing until I've created ASDoc comments and flexunit tests for everything.

(O.K., not the most exciting update, but....)

03 June 2008

The Dinosauricon Is Dead.

Long live The Dinosauricon.

As some of you may know, I used to run a website devoted to dinosaur information and illustration called The Dinosauricon. In recent years, it went fallow—I had no time to keep it updated, let alone finish building it. The old version stayed online—a living fossil of sorts.

Recently, someone emailed me asking where it was. I looked, and, indeed, it seems the host service (which was hosting it for free) finally pulled the plug. And, honestly, it was overdue—like putting down an old, sick pet.

The Dinosauricon was my biggest labor of love, and something I was very proud of (if never completely satisfied with). It opened a lot of doors for me. I sold illustrations to publishers who had seen the site. It was an excellent showcase for my technical skills when seeking work as a web developer. It got mentioned in books. It got me my first coauthorship on a scientific paper. It helped get me a job as a paleo-technician for the Wyoming Dinosaur Center. And it helped make me a lot of friends at SVP meetings.

It was also a great project for learning web development. Through it I learned HTML, XML, CSS, JavaScript, PHP, MySQL, XSL, XSLT, XPath, and more. (Not to mentioning sharpening my C++ skills—yes, I actually used C++ for one version of it.) I owe a lot of my professional expertise to that site.

Besides just helping myself, though, it was primarily meant to help others. I think it did a very good job, not just of getting scientific information out to the public, but also of promoting illustrators, especially up-and-coming ones. I used to really enjoy viewing all the submissions, providing feedback for the pieces that needed some work and marveling at the ones that didn't.

The Dinosauricon was not always called "The Dinosauricon". Back in 1995, during my first semester in college, it was a bunch of crummy HTML 1.0 pages loosely thrown together as my first website and called, rather unimaginatively, "The Dinosaur Web Pages". Around this time I started subscribing to the Dinosaur Mailing List (which I'm still on), and started hearing about newfangled (to me) concepts like "cladistics" and "phylogenetic taxonomy". (I wasn't a big fan at first, but we've seen how that turned out.) On the original site, I tried to do a blend of Linnaean and phylogenetic taxonomy. (I also illegally used some Greg Paul artwork, but took it down once I realized you couldn't just put anything in your web page.)

In 1996, I took the first-ever class of Tom Holtz' HONR 259C: Topics in Dinosaur Research. Using information I learned in that (excellent) class, I began to patch up the silly taxonomy I'd used at first, replacing it with proper cladograms. (Sometimes I get credit for inventing a style of writing cladograms in ASCII, but, as with many inventions, this was really invented piecemeal by a lot of people and I just pitched in and helped promote it.)

I also started to get interest from young paleo-artists. Rachel K. Clark and Peter Buchholz were the first to offer their work for my site. (I already had some of my own work up.) I gladly accepted, and eventually went on to build up a gallery with thousands of images, by dozens of artists from all over the globe.

Eventually the site needed a new name. After much thought, I decided on The Dinosauricon, an homage to Lovecraft's Necronomicon, and roughly Greek for "image of the terribly great lizard". Many people pronounced it wrong (like "dinosaur icon") or thought it looked like the name of a convention, but I think it was a pretty good name.

The site reached its pinnacle, in my opinion, at the end of 1999. I had procured an independent study program specifically for the project, and I poured tons of time into it. I worked obsessively, feverishly, often tallying dinosaur names into wee hours. (I didn't have much of a life.)

In December 1999 I graduated and in January 2000 I moved to Los Angeles. A new chapter of my life began with the new millennium. (Yes, O.K., technically it started in January 2001, but shut up.)

This was a busier chapter. I began, slowly, to actually acquire a life. I had less and less time for the Dinosauricon. In 2002, during a rough period, I poured a lot of work into a new version, but I never had time to get more than partly done. The new and old versions coexisted for a while, with a better gallery on the new version but more scientific information on the old.

As the years went by, web technologies began to develop at an ever-increasing rate. I always felt the site was hopelessly behind the times. There was a vision in my head of how it could be. But I only had so much time to work on it. Every time I got some time, I'd revisit the old work I'd done, shake my head at how outdated it was, and start over from scratch. Not surprisingly, this led to getting a lot of nothing done fast. (Except for learning new technologies, which was useful.)

For years I kept saying I'd have another version done, but it never came to pass. The old version, which had been hosted at a little donated computer at my college, finally went down. The new version persisted for a while. Now it is dead.

There may be hope for the future. My two big personal projects right now are related to paleontological illustration (March of Man) and biological information (Names on Nodes). Much of the ideas and code going into these could be ported to a new Dinosauricon. I have to see these two ideas through, but once they are in a stable place, perhaps I'll look into the matter of reviving The Dinosauricon.

No promises.

Motion Blur

O.K., last one for the day—I promise.

I just committed a small addition to net.tmkeesey. As alluded to in my last post, it's motion blur. How easy is it to use? Here:

import net.tmkeesey.anim.effects.MotionBlur;
new MotionBlur(myDisplayObject);

Done. Now myDisplayObject will blur whenever you move it. It even works with preexisting filters. (Note that the blur looks best for horizontal and vertical motion, though. I may work on an improvement for that later.) There are also a few optional parameters: blurFactor (how much to blur per pixel moved), optimized (optimization flag—only uses powers of two for blurring if set to true the default), and quality (blur quality).

In the future I'd like to update this so that the parameters can be changed on the fly, but I'm not sure how useful that would really be. Good enough for now.

Once again, the code can be checked out from:

Updates to Open AS3 Code

Pursuant to my last post, I've added some general utility classes to the net.tmkeesey repository. They are arranged in two packages: utils.core and utils.display:

  • ClassUtil
  • ObjectUtil
  • StringUtil
  • TimerUtil
  • UIntUtil
  • XMLListUtil
  • XMLUtil
  • ColorUtil
  • DisplayObjectUtil

A couple of highlights:

UIntUtil.closestPowerOf2() can be used to optimize blur filters. (Coming soon: MotionBlur class.)

DisplayObjectUtil.findAncestor() searches an object's display ancestry for an object of a certain class. This can greatly facilitate communication between visual components. (And even nonvisual objects, as long as they have a parent property which is an instance of DisplayObjectContainer.)

As always, all classes come with unit tests and all code is commented with ASDoc (except for unit test code, where it would really be superfluous).

Once again, the repository is at: http://svn3.cvsdude.com/keesey/PROJECTS/tmkeesey/trunk

02 June 2008

I'm Going Open Source!

Over the years, I've come up with a large number of ActionScript packages that I reuse on projects. I've been meaning for a long time to release some of these packages to the public. Well, there's no time like the present, so I'm going to start.

One note: I'm using net.tmkeesey as a package name, but eventually I'd like to name it after something other than myself. So this is just provisional until I start opening up collaboration.

The repository is located at:

(I'm assuming that anyone who's read this far knows how to check out a project from a Subversion repository.)

I figured I'd start with the basics. I've included three very low-level packages: assert, core, and relate. These are distilled from packages I am using for Names on Nodes and other projects.

Utility class with methods for making assertions.

Generic error type for a failed assertion.

Utility class for object properties.

Stores a stack of ordered, two-object comparisons. Used to prevent recursion.

Utility class for determining equality (either qualititave equality or identity) of two objects. Works with Equatable.

Interface with a single method, equals(Object):Boolean, for determining qualitative equality.

Utility class for determining the relative order of two objects. Works with Ordered.

Interface which extends Equatable and adds a single method, findOrder(Object):int, for determining relative order.

There is also a full complement of unit tests in the flexunit_src folder. All code has full ASDoc comments.

Future additions may include: management of loaded assets, digital puppetry, some general user interface components, animation assistance, collection-related code, buttloads of utility classes, triggers, XML translation, MathML processing, "exoskeleton", and "champagne".

P.S. You may note that I'm defying my previous stance on uncradled brackets. I have to say, I gave them a chance, and I'm starting to understand why people like them. I can't put it into words just yet, but....