Weird Ways of Working

I was gone all weekend on a wonderful camping trip, hence the radio silence. Today I’m back in the saddle, and faced with an annoying situation with my home setup.

I’ve come to the conclusion ‘yawl’ just can’t cut it as a development host. I had no idea that Pentium 4 CPU’s were such garbage. A 2.26 ghz machine isn’t fast enough to do serious work in Eclipse.

Most of my development is done on ‘clipper’, but alas it’s a Windows machine (it can’t help it, it was born that way). I wanted to start fiddling with CONGO (v2.0) via Konqueror, and hit upon running up ye ole VNC viewer on ‘yawl’, and just ‘moving’ the Eclipse environment onto yawl’s desktop.

Lo, it worked remarkably well. Clipper’s monitor is powered down, and I have an Eclipse environment on my Linux KDE desktop, but actually powered by the Windows dual core laptop next to it. I could overlap a Konqueror browse window and flip between it normally, and keyboard interaction was snappy and useful.

It’s not quite like having a local Eclipse install, but it’s mighty close. It gives me a feel for what it’s like for folks having big vmware server installations, and other less fortunate folks dealing with the variety of RDP based solutions, and being able to just pop into an existing running machine and work with it directly.

Really though, I should have a faster desktop machine. Alas, that’ll have to wait, it’s pretty low on the budget tree nowadays. And, in case anyone is curious, that is in fact a snapshot of CONGO v2 running in a pure Java environment – screens and back end all running within a Tomcat server. Sure it looks identical to CONGO v1, but that’s by choice. Quick port to Struts + JSP, then enhance and refactor. Progress is being made.

Furthering my supposed damnation

I’m packing up to head out to a geek camping event going on in upstate New York, but wanted to share this with ya’ll. It’s no secret I enjoy taking part in the debates on the Convert Me Livejournal community, taking on my Aspect as a rabid evangelical agnostic, and wielding my Attribute of “be a dick”. It keeps the heart rate up and gives me a good rant target.

Someone in the group pointed to a fascinating atheist blog / website called Russels Teapot. On the top of the site is the following quote:

“If I were to suggest that between the Earth and Mars there is a china teapot revolving about the sun in an elliptical orbit, nobody would be able to disprove my assertion provided I were careful to add that the teapot is too small to be revealed even by our most powerful telescopes. But if I were to go on to say that, since my assertion cannot be disproved, it is intolerable presumption on the part of human reason to doubt it, I should rightly be thought to be talking nonsense. If, however, the existence of such a teapot were affirmed in ancient books, taught as the sacred truth every Sunday, and instilled into the minds of children at school, hesitation to believe in its existence would become a mark of eccentricity and entitle the doubter to the attentions of the psychiatrist in an enlightened age or of the Inquisitor in an earlier time.” – Bertrand Russell

Pretty good commentary and right in line with my thinking.

Want to be a lighthouse keeper?

Saw this come across a sailing list I’m on. Scituate Lighthouse is looking for a new keeper…

“A lot of people have a romantic notion of living in a lighthouse,” said historical society president David Ball. “There are responsibilities that go with it. There’s a lot more to it than people think. It takes a special person, no doubt about it.”

For the past 22 years, that special person has been Ruth Downton. Since 1986 she has lived in the keeper’s cottage at the picturesque, 198-year-old lighthouse that marks the entrance of Scituate Harbor. But Downton is set to retire this fall.

I know for me, being a lighthouse keeper definitely had that romantic edge of being on your own, doing a job that others depend on, isolated but there for the ships and travelers that pass nearby. I suppose nowadays I’d need to have a net connection…

See the entire article on Boston.com.

A decent ride today. Phew

While Zach was out to lunch with Rosa, I decided to take the bike in to town with me, and ride around Cambridge. I don’t get much opportunity to ride in town, so I thought it would be a good opportunity.
I managed to avoid all the downpours that were skirting through the area, and got in about 10 miles on city streets. I passed all the hot spots of Cambridge… Porter Square, Community Boating, Central Square, Harvard Square, etc etc
Afterwards, Zach and I had an hour or two to kill, so we walked down on the north end and took a good look at the Constitution (I had never actually seen it in person). We didn’t have time to go on the tour of it, but Z was suitably impressed (“That’s a big boat! All wood? Wow.”).
The combination of the long walk and the bike ride, and my lack of anything resembling regular exercise lately (coupled with helping Tim and Ellen move yesterday) has left me pretty wiped out. The hot tub is calling my name.

Revisiting old code, and Good decisions made

Over 5 years ago, I began work on an application called CONGO, a registration and badging system, not only in the vein of “There’s gotta be a better way”, but also to help out a friend who was running registration at con in Philadelphia.

The first versions of CONGO were crude, but worked well – with a custom Swing interface, custom terminals and servers, it was an impressive setup. What wasn’t apparent was this was my first foray into writing any decent sized Java application. I made what I thought at the time were good design decisions, and looking back on 30+ events run, and hundreds of thousands of badges printed, I’d say the design was, for what I knew at the time, solid.

But it’s time to change. With everything I’ve done over the last 3 years in Java and enterprise-level applications, I feel I’m ready to rewrite CONGO into a proper Java based webapp. CONGO 1.0 was part Java, part PHP, part templating. CONGO 2.0 will be a pure java application, based on Struts, and will allow features that I could not shoehorn into the old model

I started work on CONGO2 about a week ago, and I have my first screens working properly and chaining together as they should. Part of this process is factoring in the old logic code, and linking it up with the new presentation layer I’m building using JSPs and Struts. This means making calls to 12,000+ lines of Java code that was written as I was learning the language.

But one thing I did consistently – I documented my methods. Every piece of the CONGO appserver has full Javadocs describing how to call the method, and what it returns

Because I’m doing CONGO2 using modern tools (like Eclipse and Tomcat, my GUI is showing me these docs whenever I try to link to my old code, and is reminding me how to use the old libraries. Why is this remarkable? Because other than generating static documentation, I’ve never actually seen my own comments and documentation popping in interactive windows in my IDE. Until now.

It gives me a little thrill each time I see my own docs pop up as helper windows in Eclipse, showing me comments I made half a decade ago on structures and calls, and reminding me how to use the system.

It wasn’t easy to learn Java, it wasn’t easy to learn Swing, it wasn’t easy to learn JSPs, JSTL, and Struts. But now I do know them – some more than others, and I’m enjoying this massive refactoring of one of my proudest creations.

And now, a word from my day job.

I don’t talk about my day job much. For those outside of the Java Geeky circles, it’s pretty dull stuff. But today has been particularly active, so I thought I’d share some of the bits I learned while teaching myself the wonders of Struts. This can best be summed up by the following revelations…

1) When changing a struts.xml file, within an Eclipse WTP environment, being serviced by Tomcat, WTP does not click that the Tomcat server needs to be restarted. The ‘Dynamic’ part of WTP does not take effect, and no matter how many times you save what you’re working on, it won’t go live in the server until you actually restart Tomcat.

2) Despite all the awesome advances in Eclipse in the last few years, there’s twitches that still drive me absolutely gonzo. One is that the ‘smart insert mode’ (which helpfully closes XML tags and closes quotes and parentheses for you) cannot be turned off globally. You can do it on a per-editor basis, but not globally, so I’m always forgetting to turn it off when I open a new editor. Another is XML syntax validator is still quite twitchy, and occasionally will flag incomplete tags or non-well-formed XML when the file is just fine. A close and re-open fixes it, but ugh.

3) Last, but not least – that which almost got me up on the roof with a high powered rifle. I give you a quiz as my example. One of these two struts.xml configurations apparently tickles a bug in Struts2 and will cause an internal server error and stacktrace with a Null Pointer Exception. The other will not. Can you figure out which is which?

<action name="/*">
<interceptor-ref name="mystack" />
<result name="success">/WEB-INF/jsp/{1}.jsp</result>
<result name="login">/WEB-INF/jsp/index.jsp</result>
</action>
<action name="*">
<interceptor-ref name="mystack" />
<result name="success">/WEB-INF/jsp/{1}.jsp</result>
<result name="login">/WEB-INF/jsp/index.jsp</result>
</action>

Just for fun, here’s the actual stack trace:

1.
INFO: Server startup in 954 ms
2.
Jun 17, 2008 7:41:14 PM org.apache.catalina.core.StandardWrapperValve invoke
3.
SEVERE: Servlet.service() for servlet default threw exception
4.
java.lang.NullPointerException
5.
at com.opensymphony.xwork2.config.impl.ActionConfigMatcher.convertActionConfig(ActionConfigMatcher.java:168)
6.
at com.opensymphony.xwork2.config.impl.ActionConfigMatcher.match(ActionConfigMatcher.java:144)
7.
at com.opensymphony.xwork2.config.impl.DefaultConfiguration$RuntimeConfigurationImpl.getActionConfig(DefaultConfiguration.java:316)
8.
at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:169)
9.
at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:41)
10.
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:494)
11.
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
12.
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
13.
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
14.
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
15.
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
16.
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
17.
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
18.
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
19.
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
20.
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
21.
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
22.
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
23.
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
24.
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
25.
at java.lang.Thread.run(Thread.java:619)

How the hell am I supposed to debug that?

I finally did, after a good 2 hours of hair-ripping, gnashing of teeth, and spewing my venom upon the #struts IRC support channel.

How Not to Run a Convention

I do conventions. I work a lot of them. Even though I’m not a conchair, I’ve been high enough up in the hierarchy, and worked with enough of them, to know how much work they are, and how they can go wrong.

But I’ve never seen one go as badly as this.

This is the story of FedCon USA. A Trek convention in Dallas Ft Worth where the organizer, one Tim Brazeal, apparently through pure incompetence, caused an entire event meltdown. The reasons appear to be manifold, but the causes seem to be miscommunication, poor organization, and in some cases, out right falsehoods.

On the flip side, it appears this failure is, apparently purely due to mismanagement, and cannot be ascribed to malice. He didn’t wreck the event on purpose, for profit or for some other reason – he simply screwed it up. Badly.

It should be noted, that this is FedCon USA, which only bears the name FedCon as borrowed from FedCon Germany. That organization, which is widely respected, issued a press release describing their dealings with Tim, and how he lied and alienated them as well. FedCon Germany withdrew support for the event, but Tim went on advertising that he had their financial and organizational backing:

I never in my life meet an individual like Tim. First he seems like to be a great buddy, but after a while you discover a person, who is constantly lying, apologizing and making things up. He was never straight forward, almost everything he said was a lie. I never in my life met someone who actually believes all this BS he says. He was always totally sure, what he says. But saying and doing are two totally different things. He is the person who says: “Okay no problem, i book the flights for you!” As soon as you hang up he totally forgot the conversations he just had. But if i would have told the fans earlier, I would for sure got some legal problems!”:
All i can say is, FedCon Germany (the real thing) is always a feast for the fans and if i can help out some of you at one of our next shows please let me know, just email us and sent us some proof that you purchased a ticket for FedCon USA and we give you something back at our next show.
I also think, the whole staff from FedCon USA (not Tim!!) have nothing to do with this mess and they sure worked their asses up to make some things better, but with their figurehead hiding in dream worlds, lame excuses and lies, this was just not possible.

My heart goes out to the volunteers, staff, and particularly the attendees who, in some cases, drove many hours or flew in for the event, only to have most of the guests not show (even though they were still on the conventions schedule), and have the event shut down halfway through Saturday.

So next time you’re having a hard time at an event? Think of how bad it could get, and thank your event staff.

And another one done.

Today is the last day of the National Cohousing Conference at Bentley College in Waltham, MA. I, naturally, was providing CONGO for registration and badging, and oddly enough, everything went smoothly. Systems and printers all worked as planned, no last minute badge panic, and the database worked great.
In the background, I’m starting work on Congo v2.0. I’vebranched SVN, and I’m committing against a new 2.0 branch. More on this later, but suffice to say I’m pretty excited.
As always, I learned a lot, figured out problems that need to be fixed, and made plans to add features. This was also the first time we had directly linked CONGO to a credit card payment system, though that wasn’t active at the event. Next time, however, we’ll have it all live at the same time, and won’t that be cool! 🙂
Everything’s packed up into the cases, and we’re ready to head home.
Another one done.

Housework is always better with music

Today, I’m up in Maine. The house is empty but for Zach and myself. After a morning of swimming, I’m settling down to do some work on the house, Zach is alternately reading and playing around with Scratch.
We had the wonderful
Terry and Allen up since yesterday morning, with their awesome two kids, and Cat was here since Friday night. Now it’s just down to Zach and I, a sunny day, work to be done, and… music.
I rarely get to indulge in listening to music at a reasonable (cough) volume while I work. It tends to annoy people around me (hard to talk over Peter Gabriel blasting out a live version of In Your Eyes) but Zach doesn’t seem to mind, and for me, it just keeps the energy up, and makes the time go smoother.
We had a great weekend, and it’s not over yet, but with socializing and spaces, there’s always work to be done. Now I’m doing laundry, cleaning the kitchen, putting away floaties and boats, and doing some repairs on the house (durned carpenter ants)… but that’s okay, because I have Radio Paradise hooked up on the big stereo, and the space to play it in.
Not a bad way to spend a sunny summer Sunday.

Hooray Dell!

Wait, what? Hooray Dell? Dave, have you gone MAD?
Nope! I finally managed to get Dell tech support to acknowledge that the fan in clipper was shot. Last time we went through a service call, the suggested fix was a BIOS upgrade. (Folks may remember the problem was that clipper would overheat doing just basic things, like just sitting in it’s dock, powered on).
As the warm weather came around again, the overheating was getting worse. The laptop couldn’t be used except under extreme circumstances that involved levering up the underside, and placing various fans around it. Hardly optimal.
On Tuesday I settled myself into a long online chat with a Dell technician, and convinced them that yes, indeed, my cooling fan and/or heatsink needed servicing, and could they send someone out please?
The fellow turned up yesterday, and after 2 hours of surgery on my kitchen table, clipper was up and running again.
Since then I’ve used the machine on my lap, in it’s dock, and run heavy duty compiles and testing on it, and I have yet to hear the cooling fan kick up above ‘normal’.
Hooray for field techs! (And I used to be one!)

Life Update – Volleyball!

ZOMG sore ouchie wow.
Yes dear readers, it must be the beginning of summer. And that means… VOLLEYBALL!
Last night I had my second evening playing (first was last Thursday). All the old muscles are creaking back to life, and ones I had forgotten existed are making themselves known. On the court, I’m playing far better for “first time out” than I was same time last year. Last night’s games included some mighty good hits, an acknowledgement from the fellow who runs the games that my hitting and blocking were such that I should be ‘switched out’ from setting (sad, because I actually like setting, but being 6’6″ tall, I really should be in the hitter position).
Probably the highlight of the evening was I was in the right hitter position, ball’s on the other side, received and passed, set to the woman just in front of me (who has -outstanding- technical form, she’s saddled by being rather short), she goes up for the hit, I time it juuust right, and go up to block. STUFFED! She glares at me, turns to the team, “ALRIGHT, Who put that damned wall there?”
Gonna be a good summer.