Sunday, December 25, 2005

WTP, Eclipse, JDBC, and Dynamo

It's been a pretty significant 72 hours. I was talking about it with my wife, and realized that I've been pushing in this direction, being able to build java web apps, for the past 5 years. Through a handful of forks in the road, I got distracted. PHP got most of my attention, and most recently, Actionscript and Flash. But at long last, I've begun building a java web application. It's a content management system that I've decided to call "Dynamo" It's not the most original name, but I don't care. I like it.

I figure that it'd be a good idea to document the things that I've done to actually make this happen. In the most recent post, I was getting frustrated with the Eclipse plugin for Tomcat, provided by I've since decided that the Web Tools Platform (WTP) plug in is much better suited. However, I will say that it's MUCH more heavy duty than the Tomcat plugin provided by sysdeo. WTP is made to build full fledged J2EE compliant web applications, and it shows. Interestingly enough, they released version 1.0 the same day that I found out about it.

A few notes about WTP should be noted.

First, this has most to do with my inexperience in using Eclipse, but it took me a while to figure out how to actually "build" a class. It turns out that by default, in Eclipse, this happens for you automatically. In the "Project" menu, there's an option named "Build Automatically". And guess what it does? Exactly! It builds stuff for you as soon as you save your java class. How Cool!

I ran into a bit of a problem at first because I was building a servlet, but in the browser, I was getting an error. This simply had to do with my bad java. Once I fixed the bad code, and re-launched the app, it worked. It took me a while to figure out what was going on because everything just worked without me thinking about it. I imagine this is how it must have felt when automatic transmissions were introduced in automobiles. "How do you make it go if you can't make it SHIFT!?!" I felt this way about compiling servlets.

What's really nice about WTP is that it places all of the classes in the correct places. Servlets that exist in the [Project]/src/ directory are built and placed in the WEB-INF/classes directory where they belong. You can also define any directory as a source directory. This gives you the ability to keep the source separated from the build. I like that.

Also of note is that it might be a good idea to have a plain vanilla, just-unzipped-and-left-alone, version of Tomcat installed for WTP to use. It seems to wrangle it somehow, taking over the Container entirely. I don't even know where the tested web applications are deployed from yet. Even in the unzipped-and-managed-by-eclipse/WTP installation of Tomcat, the developing web apps don't show up. Odd. I wonder where they go?

Another gotcha for me happened when trying to add a 3rd party driver (for the database). By default, the WTP creates a Web Application Library for these kinds of things, but I couldn't figure out a way to add this through the IDE. So, what I did was simply add it manually to the WEB-INF/lib directory in the project. I don't think that it was the right thing to do, but I couldn't figure out how to do it otherwise. However, once I did that, my application worked. I even tried to add another library, outside of the default web application library, but somehow, it wasn't recognized when deploying. Strange.

Although figuring out how to make Eclipse build, test and deploy web applications was a big deal, the biggest deal of the weekend happened when I was able to successfully build a page that connected to the database, and pull out content. I know that in itself is no big deal, but whenever you're working with a new technology, and things connect and work the way they should, it feels great!

I do have to say that it was a bit tricky figuring out how to get the database connection and query working though. I followed the unenlightening instructions at, but something was missing. Other than the fact that my driver wasn't being loaded, I couldn't quite figure out how to go from making the connection to making a query and pulling out the results.

Making a database connection turns out to be a 2 step process.

First, define the driver.

The second step is to make the connection.
 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test?user=monty&password=greatsqldb");

Now, where should you do this in a web application? The answer, is simple. You do this wherever you want to connect to the database and make a query. I chose to do this by making a connection in the ServletContext, so it was created once, and globally available to all of the servlets in the application. In the long run, I don't know if this is the best thing to do in an MVC style web application. Servlets usually play the role of a controller, and it doesn't really make sense to ask a controller to pass along a Connection reference whenever communication has to happen with the database. This is like asking your boss everytime you have to go to the bathroom. He really doesn't need to know about it. So I will probably move the connection logic to the Model Layer. However, as I delve into Hibernate and Struts, I think most of the answers will be provided for me.

Now, as I write this, something odd has happened to my Eclipse and WTP installation. I no longer have the option to create a "Dynamic Web Application" and the "server" project doesn't notice my Tomcat installation anymore. Harrumph. The joys of open source flexibility, eh?

I've managed to fix it with a fresh installation of Eclipse 3.1 with WTP bundled. Something I do certainly like about Eclipse is the ability to just unzip and run it. The fact that there are no installers makes it super easy to experiment without causing irepparable harm. You can find the Web Tools Platform bundled with Eclipse on the downloads page. Look for the All-in-one. That's what you want.

Now that I feel empowered enough to build webapps in a development environment, my next goal is to jump head first into the deep end. I plan on creating a simlpe CRUD application for a database table using Struts. And after that, maybe in conjunction, I plan on doing this with Hibernate to manage the data. And after that, Probably in tandem with the others, is learning about JSTL, or perhaps a templating technology like Tiles and/or Velocity. Although, after looking briefly, I think that JSTL, and perhaps some custom tags for specific presentation features, might be enough to do the job. I'm excited to start playing around.

Friday, December 23, 2005

Using Eclipse to build Webapps

As much as I enjoy doing things by hand, I've realized that it's important to be efficient. Doing things by hand isn't necessarily very efficient. Which is why we have tools. It's easier to build a house with a pneumatic nail gun than it is with a hammer. There's obviously some overhead to doing things with more sophisticated tools, but often, the overhead is a minor concern. It usually becomes overshaddowed by the gained efficiency and rate at which things can be done.

For this reason, I've decided to lay asside my beloved UltraEdit and use Eclipse for developing my Java web applications. There's going to be a learning curve to be sure, but that's ok. I look at it as an investment. Investments are expensive, but in the long run they pay off. If everything goes well, that is. To help out, I found a good tutorial, which seems to address the goals I want to accomplish. It teaches how to use Eclipse to develop Struts applications for Tomcat. Just what I wanted.

Among the relevant tasks in this tutorial is setting up a plugin to connect Eclipse to Tomcat. This Eclipse plugin for Tomcat is available from This plugin helps to create Tomcat-specific projects and start, stop and restart Tomcat.

After going through the above tutorial, however, there are a couple of things lacking. First is the lack of directions for building a servlet. To do this, you just need to go to File>new>class. This will start a new class. At that point, you can create a Servlet. I looked around for a while trying to figure out how to "build" or "run" the servlet, but there's no way to do this in Eclipse. Instead, going to the url that you define in the servlet mapping should do the trick. It took me an hour or more of fumbling around to figure it all out.

Additionally, the struts examples seem to be a bit out of date. When I tried this tutorial out, I used Struts 1.2.8, and the issue that the author mentions about the file is irrelevant. As such, following the directions about changing the source location just causes problems. There's probably more going on there than I understand though.

All in all, after doing this tutorial, things are a little more clear. I don't know if I like this particular plugin for creating web applications though. I might try something different. I don't know if I like the way it sets up the development directory structure. What I'd really like, is a plugin that keeps the source out of the deployment environment, and allows me to deploy a war file. However, this plugin is nice in the way that it controls Tomcat. But there's gotta be something different. The search begins!

Apache, Tomcat, and mod_jk

Last evening I spent a couple of hours configuring Tomcat to work with Apache, with the help of mod_jk in a windows environment. mod_jk is a module that passes specific requests from Apache to Tomcat. Tomcat processes a request, and sends the response back through Apache. It's a simple enough concept, and fortunately, it's relatively simple to configure as well.

The first thing I did was install Tomcat. In a windows environment, the best way to do this is to install with the executable installer. This hooks into the windows services which control the startup and stop of Tomcat. Apache should be installed the same way. I chose to install Apache 2.0.45 and Tomcat 5.5.12. The Apache installation is a bit old, but the Tomcat version is the latest that's available. Installing these in a default way is the best way to start.

At this point, you can install mod_jk. This is available as a binary download, as well as in source for custom building. Simply place the binary module file that you download in the modules folder for Apache to find. Then, in the httpd.conf for Apache, point to the module as such

LoadModule    jk_module  modules/
I then followed the instructions layed out in the quick start guide for configuring mod_jk to work with Apache and Tomcat. The file is very basic, so be forewarned. This should work pretty well for development purposes, but for a production environment, you'll probably want to set up some sort of load balancing.

OK, back to the httpd.conf. The entire relevant configuration for mod_jk looks like this:

LoadModule      jk_module  "C:/Program Files/Apache Group/Apache2/modules/"
JkWorkersFile "C:/Program Files/Apache Group/Apache2/conf/"
JkLogFile "C:/Program Files/Apache Group/Apache2/logs/mod_jk.log"
JkLogLevel info
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
But that's just for me. I simply placed this in a seperate file called mod_jk.conf, and included it in the httpd.conf file.

Then I set up a virtualhost, where I set the all important Jkmount directive. The virtualhost looks like this:

DocumentRoot "C:/tomcat/webapps"
ServerName localhost
ErrorLog logs/localhost-error_log
CustomLog logs/localhost-access_log common

JkMount /jsp-examples/* worker1

DirectoryIndex index.jsp index.php index.html
ErrorDocument 404 /404.html
Options MultiViews Indexes FollowSymlinks
AllowOverride All


The place to note is the Jkmount directive. Now, when I go to http://localhost/jsp-examples, it looks the same as http://localhost:8080/jsp-examples. I am successfully serving jsp's and servlets through port 80.

Wednesday, December 21, 2005

It's a....

That's right, we're having a baby boy!!! This is what Junior looks like at 20 weeks

Monday, December 19, 2005

Struts and Hibernate in a Content Management System

I've recently decided that I would like to try my hand at building a Struts - driven Content Management System. I've almost completed the construction of a CMS written in PHP, and I'm dissatisfied with it. It took a long time to build, and it turns out to be less flexible than I had hoped.

So, now that I have some experience under my hat, and a bit of a better idea for what would work for a flexible and powerful content management system, I'm about to start over.

I've been wanting to dig into a Java based server environment for man, probably 5 years. I can't believe it's taken me this long. But it's time.

The goal is to build a CMS that's relatively simple in it's data model. I have a design drawn up with currently 9 tables. The records table contains the body of content. A collections table contains records which group the records. Both of those tables have related properties tables which allow any number of properties to be added to the records and collections. Another table allows tagging a set of categories for a record, and a sorting table helps to organize the collections of records.

To get started, I figured that I'd need, and want, to deploy a number of different technologies, API's, IDE's and related services. Among which are:

Java 5
Eclipse 3.1
Hibernate 3.1
jsvc (when I decide to do this all over again in a Unix environment)
and a templating engine to be decided.
I'd also like to use Lucene for searching

There will be more too, but this is a start.

I'm hoping that I can accomplish the following with this project.

  1. Create a solid, enterprise level, content management system
  2. Learn Struts
  3. Learn Hibernate
  4. Learn Eclipse
  5. To a lesser extent, become familiar with ANT
  6. Become more familiar with Transactions, triggers, and stored procedures.

So it's certainly a pedagogical practice, but I think it's going to be worth the effort. In the long run, I hope to turn it into something that can be sold to clients and repurposed efficiently. However, I have to admit, it's mostly just an educational endeavor. But I'm excited about it. I plan on keeping notes here as I begin to understand things.

Tuesday, July 05, 2005

Happy Daisies

I just took a 30 minute walk at lunch and picked a couple daisies. It wasn't more than 15 minutes later that they started to wilt. Now they're stuck here in the flourescent light, poking out of the spout in the cap of my portable coffee cup. I have a feeling that they were MUCH happier outside where I found them.

I feel soooo guilty.

Sunday, June 05, 2005

OS x86

News is breaking that Apple is going to be making a shift to an Intel based architecture for their computers. The news is good news. There are a lot of skeptics out there who think that a move to Intel is a bad idea, but I can't figure out why. In my mind, if in fact Apple is talking of migrating to an x86 processor architecture, it's a good thing for everyone.

It will be good for Apple because it will make their computers cheaper potentially allow people to use OS X on any x86 computer. Yet people are skeptical about this move because they believe that it will harm Apple. But such beliefs are really unfounded.

In my mind, right now there are only 2 legitemate reasons to buy an Apple. The first is the operating system. OS X is very cool, and it gets great reviews. I think it'd be fantastic if it was available to run on any computer. I'd ditch windows in a heartbeat if I could run OSX on the box I've got. The second reason to buy an Apple is the design of their computers. Let's face it, they drive the trends. Their computer design is the best in the industry, by a wide margin. Why else do people buy Apples? People are ceratinly not buying them because they are cheap or fast.

So this move makes sense to Apple. They have the potential to grow as a company by bringing a real alternative to Windows to the mainstream. It enhances the strengths of their business, and causes no harm. If OS X becomes runnable on the other 95% of computers in the world, they can sell a ton of software. And let me tell you, I have a good feeling that there are MUCH better profit margins on software than there are on hardware. Additionally, such a move wouldn't harm their hardware business because people are only buying apples because of the design. So, that part of competition would not change.

Let the skeptics rest. Intels in Apples is a good idea. The only thing that might be a problem is to the developer. How much extra work will be required to make current software run on an x86 OS X platform? Lots of software vendors already support both platforms. What's involved?

Thursday, May 26, 2005


When I've heard people talking about XPath in the past, I see eyes light up, I hear voices raising in pitch with excitement, but I never understood why until today.

Quite simply, XPath allows you to search an XML file like a mini database.

Did that hit you? Read it again if you didn't, because it's extremely cool. An XML file becomes a searchable database. You get results and can use the values for your pleasure. And that my friends, is power. It's pretty much an essential tool if you're doing anything with XSLT. But I'm excited about it because I'm a Flash developer.

XML and Flash are like best friends, and with this handy dandy XPath package written in actionscript, I think they might be getting married. With it I can search an XML data source, and navigate around from that point. Using it, I can more easily create custom Objects and such. My head is bursting because it's so cool.

Friday, April 01, 2005


Sometimes we fall into patterns and need to listen to a different perspective in order to remember what it is we're working for in life. It's called motivation. As simple as it is, I believe we all need to have this kind of perspective refreshing once in a while. It can come from many different sources, from a news story, to a talk with someone over coffee, or some kind of random event. Or, in some cases, like today it can come in the form of a tape on the way to work in the morning.

I was listening to tape 3/4 of Lead The Field, by Earl Nightingale this morning. It was all about setting goals and thinking. Basically, what he said is that if you set goals, and remind yourself of that goal, you WILL achieve it. You just have to know what you want. It's unbelievably simple. He states that "anything you can conceive and belive, you can acheive." How empowering is that?

The second side of the tape was about thinking. He stated that most people don't think. And I thoroughly believe this. People have problems and aren't willing to try to figure out a solution. They try to avoid thinking about them at all costs. Our minds are great untapped resources for figuring out solutions to problems, all you have to do is think.

I just wanted to jot this down quick because I really want to remember it. Goals and thinking are 2 of the major keys to living a successful life. And that's what I want to do.

Monday, March 07, 2005

Bad registration

Coming from the world of print, registration of images when printing is a big deal. The different colors of ink have to hit in the correct spot to look good, especially with a 4 color CMYK print.

However, when the registration is off, it creates a bit of an effect, showing the hidden pieces of the image. This can be cool if controlled. So, I set out to figure out a good way to simulate this kind of effect with photoshop and illustrator. It turns out to be extremely simple.

The first step in the process is to take the channel of an image to isolate the part of the image. To do this, first start by making sure your image is in CMYK, not greyscale or rgb.

  1. Then click on the channels palette and choose a channel.

  2. Then select all and copy it into an Illustrator file. Make sure the color of the document is RGB.
  3. Select the copied image.
  4. Adjust the color:
    You need to adjust the color of the image and tell it to be the color that it was. To do this go to the 'Filter' menu and choose 'Adjust Colors' Option
  5. This will open a dialog boxwhere you can tweek the color. Check both the 'Preview' and 'Convert' checkboxes.
  6. Then choose the 'RGB' from the dropdown list.

  7. Now you can adjust the color of the selected image. Follow this guide:

    • CYAN
      • set Red = 0
      • set Green = 63
      • set Blue = 78
      • set Red = 100
      • set Green = 0
      • set Blue = 50
    • YELLOW
      • set Red = 100
      • set Green = 100
      • set Blue = 0
    • BLACK
      • set Red = 0
      • set Green = 0
      • set Blue = 0

  8. Now just set the transparency mode to 'Darken' on all of the items, and knock them out of register as you see fit.

What's cool is that you can play with other colors if you don't want to use the traditional CMYK. You can also use just a few channels for a duo-tone effect.

Thursday, February 24, 2005

It's the simple things

A phenomena that I've seen occur when trying to find information on the internet, especially regarding Open Source technologies, is that it's very hard to find a concise set of instructions to bootstrap yourself when learning. Simple things you need to know in order to get started are assumed, omitted, or forgotten.

So, today, I've been working on picking Java up where I left off 2 years ago. Back then, I'd taken a class or two, and learned enough to realize what I was talking about. I didn't understand what I was doing entirely, but I accomplished what I needed to in order to get the grade. Today I'm working on understanding.

Specifically, I wanted to work on using Ant to build a java app that I could use for a custom JSP Tag. I decided that I'd first try to compile a program with multiple classes within a package. Now, stop.

This task should be simple enough. In fact it is simple if you know what you're doing. I didn't.

Problem 1. I kept getting compile errors because I didn't have the package defined correctly. How do you use packages when building a java app? The solution was to do the following:

  1. Put the main class' java file in a directory.
  2. Make a directory with the name of the package the main class uses and put it in the same directory as the main class java file.
  3. At the top of the main class file write:
    import packageName.*;
  4. In each of the .java files for the package you're using, write this at the top of the page:
    package packageName;
    import packageName.*;

  5. Put all of the java files for the package in the directory with the package name
  6. Then you can compile the thing with a command prompt and javac:
    prompt$ javac
  7. If it doesn't work, don't blame me ;-)
OK, that worked. But I wanted to use Ant. Fortunately, ant is extremely easy to use. Just read the docs and get it installed correctly.

Problem 2. How do I set up ant to work for my application?

Fortunately the docs are reasonably good for this app. I had good luck simply customizing the existing example build file. When you have that set up, just make sure to customize the project names and directories you want, and put it in a directory with the same directory tha tholds all of your source code (I used a dir called 'src', as the build file uses). This XML build file must be named 'build.xml'. Then, you can take a prompt, cd to that directory where the build.xml file is, and type 'ant' at the prompt. It will do the building for you. Cool!

Problem 3. How do I get the jar file that ant builds to run as an executable?

Even though this doesn't really have to work in order to build a tag for JSP, I wanted to do it anyway, to see if I could do it. Ant is cool because it automates lots of commands that you'd use when building an app, including the generation of a .jar file. Handy! The only thing is, the jar file that it generates doesn't become executable by default. The solution involves the following:

  1. Set up the MANIFEST.MF file in the META-INF dir of the jar so that it knows which class is the main one to call when executing. This means putting a 'Main-Class:' declaration in that file.
  2. Customizing the build.xml file that ant uses
After noodling around, I adjusted the manifest just fine. and that worked. Then I wanted to use ant to make the MANIFEST.MF file for me. To do that put in a couple lines as a child node to the tag:

<target name="dist" depends="compile"
description="generate the distribution" >
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>

<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
<jar jarfile="${dist}/lib/FactoryPattern.jar" basedir="${build}">
<!-- set up the MANIFEST -->
<attribute name="Built-By" value="${}"/>
<attribute name="Main-Class" value="${app}"/>

Here's some handy tips:
  • For what it's worth, a jar file is just a zip file with a different extension
  • jar works much like tar. To create a jar file type:
    jar cf [input directory and input files] [output file].jar
  • If you want to add a mainfest file, you can do the following:
    jar cmf [input directory and input files] [path/to/MANIFEST.MF] [output file].jar
  • To extract a jar file:
    jar xvf [jarfile].jar
  • To run an executable jar file from the command line:
    java -jar [jarfile].jar
I know these are simple things, and I realize that this is the same kind of non-comprehensive set of information that I was complaining about, but, hopefully this will be helpful enough to get'cha started.

I had trouble getting the classpath set up correctly at first, but ant handles it quite elegantly. Basically, you set up a path variable in the build.xml file, and then refer to it in the tag when building.

<path id="base.path">
<fileset dir="${tomcat.home}/common/lib/">
<include name="**/*.jar">

<target name="compile" depends="init" description="compile the source " >
<javac srcdir="${src}" destdir="${build}" >
<classpath refid="base.path"/>
The benefit of keeping the classpath info in the build.xml file is that it doen't need to be set in the shell when you're dealing with custom classes and third party stuff

Wednesday, February 02, 2005

How to Create a Singleton in PHP

Using singletons in PHP can have great benefits for an application. A singleton allows a single reference to be maintained during execution of the application. So for example, you could create a singleton that would hold a reference to a database connection. That way, when making multiple database calls, with the chance for easily making multiple connections to the database, you don't have to worry. Only one connection to a database would be created when using a singleton. In addition, it helps when trying to access an Object from multiple places when the data within that object needs to be persistent.

I've read a number of different threads and articles on creating a singleton pattern in PHP. None of them seemed very satisfactory to me. In the classic sense a Singleton should store a static reference of it's own instance. Since PHP only supports static variables within functions, doing this is a little wierd. So, I set out to create a simple pattern for creating singletons in PHP

The goals were as follows:

  1. Make the singleton in such a way that it can be called statically, such as
    $instance = Singleton::getInstance();
  2. Make the singleton a class, not just a function
  3. Make the singleton retrievable from within other arbitrary classes
  4. The Class should store and retrieve an instance of itself

The following code accomplishes these goals:

class Singleton
function &getInstance() {
static $obj;
if (!isset($obj)) {
// Assign a reference to the static variable
$v = &new Singleton;
$obj = $v;
return $obj;

The singleton requires only a method to retrieve it's instance. No constructor is required. Since the 'normal' way to make a singleton is by using a private constructor, and then an accessor to retrieve an instance of itself, stored statically, we can't make a traditional singleton. The static variable would need to be a member variable.

Instead, we have to use the means of static variables in PHP. Static variables have many idiosyncracies. Of particular note, they can only exist within functions, and they cannot store references (in PHP4). Therefore, we have to play a little bit of a trick to make this work.

First, the static variable to hold the instance needs to reside in the getInstance function. Kind of wierd, but it's the right way to do it.

Second, since static variables cannot hold variables passed by reference, the instance of the singleton class cannot be set on the static variable. To get around this, create an intermediate variable to set the reference to, then set the value of that intermediate variable to the static var. By looking at it, it seems that the reference would be lost, but that's not the case. It sticks. Try it!

Finally, PHP5 seems to solve lots of the above problems and work arounds. The most significant change is that references can be held by static variables. That means that there's no intermediate variable trick that needs to happen. In addition, there are private, protected, and public declarations for functions and variables. So a more true Singleton can be achieved in that regard as well.

A PHP5 singleton would look something like this:

class Singleton
function &getInstance() {
static $obj;
if (!isset($obj)) {
$obj =&new Singleton;
return $obj;

How simple can it get?

Tuesday, January 25, 2005

Balance, or The Pursuit of Happiness, or How to Light a Fire in the Middle of January

This past weekend Shana and I went up North for a weekend with some friends. I can't exclaim enough about how fabulous it was. There weren't any particularly fabulous events that made it so great. It wasn't much more than a bit of some intermittent snowshoeing in the beautiful northwoods of Wisconsin with 5 of our friends. We ate, we drank, we sat around talking, we sat around quiet, we played ping pong and scrabble, we snowshoed around and then across Clear Lake, we lit 5 minutes worth of fireworks out the back patio door, and we talked about ice fishing. That was about it. It wasn't the most wild experience I've ever had.

But it changed my perspective and gave me renewed energy like I've never felt before. At first I couldn't figure out what it was. It related to the people that I was with, and simply the relaxed fun we were having. I didn't realize until much later that the fact that it was in such stark contrast to the work I've been doing. I have a tendency to bog myself down with obligations, and I forget what really matters in life. And this weekend up north reminded me that obligations, although important, are not what makes life worth living.

What I'm trying to say is that balance is important. Obligations need to be taken care of, but dreams and ideas need to be entertained. Without pursuing creative interests, life gets dull. It's important to take time for the pursuit of happiness.

Tuesday, January 11, 2005

Well, I have a feeling daily plans are too personal

What can I say, I think the activity of this blog so far is enough of an indication itself, using a blog as a means of planning my day is just not going to work. I just think it's too personal, too boring, and inappropriate for public view.

So, back to the drawing board. Blogging is cool, but I really need to be more organized about it.

Tuesday, January 04, 2005

Well, I'm clearly not using this as a planner > and & that's ok.