i wanna go wii, part two (SchemaTool)

I've been using a little schema management tool for a while now, and thought I'd release it into the wild.  And I just submitted it to Ben's CFUNITED/Wii contest. The submitted build is available here, as well as on Ben's site (post-contest).

In a nutshell, the tool provides a home for storing all your schema migrations in a reusable and managed location.  Then it takes care of updating any schema it gets deployed against automatically.  This keeps your schema definition in code, so you're assured that your DB changes are always released at exactly the same time your code is released.  If you've got a lot of environments (home, work, laptop, production, etc.), it can save a lot of time, because the database is just always right.

i wanna go wii, part one (TransactionAdvice)

I relicensed my ColdSpring AOP transaction advice under the ASL and just submitted it to Ben's CFUNITED/Wii contest. The submitted build (with no significant changes aside from licensing) is available here, as well as on Ben's site (post-contest).

Improved ComboBox Demo

After Koen (a coworker) pointed out that my online ComboBox demo was rather user-unfriendly (like how you just had to "know" to type an 'a' in the fields), I threw some instructions around it. It's available at /web/widgets/, as before. There's also a new distro at /web/widgets/widgets-b2231.zip, and the project page has been updated as well.  The actual code is unchanged, only the demo file has been updated.

ComboBox Widget Update

I've been making tweaks to my ComboBox widget (first published in July 2005) in various apps of mine that use it, and figured it was time to publish an update. You can download the archive at /web/widgets/widgets-b2218.zip, play with the online demo (which is just the expanded archive) at /web/widgets/, or visit the project page for most info.  I believe I've fixed every bug that people have brought to my attention, but if I missed something, let me know.

New and notable features (in no particular order):

  • multiple delimited values (defaults to comma delimited)
  • the ESC key will now close the dropdown, if it's open
  • the TAB key will select the current value and move focus off the combobox
  • automatic hiding of SELECT, APPLET, and EMBED elements under the dropdown (for IE)
  • automatic setting of autocomplete="off"
  • changed to update only ever 250ms, rather than on every key press, which greatly reduces needless churn with JS remoting-based dropdowns
  • added "Loading …" message while waiting for dropdown values (for JS remoting-based dropdowns)
  • removal of already-selected items from the dropdown (only useful for multi-select)
  • added wrapping with the arrow keys (pressing 'up' when the first item is selected will move the selection to the last item)
  • support for arbitrary HTML in the dropdown values that will be stripped to create the actual form field value

There are a few known issues:

  • if your dropdown is larger than it's allowed side, scrollbars will appear, but the scrolling won't reset when new items are loaded
  • untested on IE aside from a few spot checks. However, except for the hiding of SELECT/APPLET/EMBED elements (which is fixed), I've not received any IE-specific complaints, so I'd say it's pretty sound.
  • documentation is somewhat lacking.

I'm sure I'm missed some, but those are the high points. As always, it's MIT licensed so you can basically do whatever. If you find it useful (or think it's a piece of garbage), I'd love to hear about it.

My Files are Back

At long last, files are back on web.  All those old download links from before my server died last winter no longer point to missing files.  There are still some links that go to non-existent pages, but all the actual downloads should now be present.

Adobe's *@(#*&$ Browser Requirements

This chaps my @$$ every time I have to set up a new server.  Adobe's site simply blocks if you don't have a JS enabled browser.  I never install a GUI on my servers (why should I?), and every time I need to install CF, I'm stuck downloading it to my local machine, and then uploading back up to the server.  Repeat for each hotfix.  Aaaarrrggghhhh!

Where have I been?

I've been posting very little this year, and figured I'd take a bit of down time this rainy Saturday for a "personal update" kind of post. Big things first:

As many people know, I started a new job at Mentor Graphics at the beginning of the year. A rather big change moving from a company of 10 to one of 4000+. I'm a member of the web services team, which is basically in charge of the web presence for Mentor (duh). The main project the team has been working on for a year and a half is a complete rewrite of the customer-facing support portal. That's in the final stages before 1.0 release early next month. I haven't been terribly involved except in a couple narrow aspects (because I came into it late), but it'll be nice to get that done.

I've also been doing a lot of Flex work over the past couple months which has been interesting. It's provided some nice insight into various beliefs I've long held. Not changed them per se, but refined them. For example, I've always been a proponent of strongly-typed languages because they're easier to work with. However, I've come to the realization that strongly-typed languages usually have better tools support (because it's easier to write those tools), which is really what makes them easier to work with. For example, the tool support for AS3 (i.e. Flex Builder) is pretty sad, and it shows. And no, type-based code completion doesn't count as good tool support. I want global renaming/relocating of types and members at the very least.

In the completely non-technical realm, we're currently in the process of buying/selling houses and moving. We're closing on the new one this coming Friday (4/27), and then our current house closes the second Monday after (5/7). As such, we're madly packing and getting ready for the big move. Fortunately we'll have two weekends and a full week to get everything moved, unlike last time where both houses closed on the same day, and we had one [300 mile] trip in the U-Haul to do the entire move. The kids are also old enough (3 yr & 1.5 yr instead of 2 yr & 4 mo) to mostly entertain themselves this time, which greatly boosts productivity.

On the personal-technical front, I've actually grown somewhat accustomed to writing PHP, which is scary. Hosting my blog (along with numerous others) on Wordpress has provided ample opportunity to tweak stuff and build some custom extensions (like for photo galleries). The syntax and function libraries are still pretty revolting, but the tools support is pretty good, which goes a long way in my book.

I've been reading Cryptonomicon, which is the first novel I've read in a while. Stephenson is a little spastic in his writing, not just in the way he tells the story, but I get the feeling that he wrote the book in a fairly linear fashion, and his "right now" personal experiences drove his approach to telling the story.

I also just finished The Pragmatic Programmer, and have to say, I was rather disappointed. The book (and the series it has spawned) have gotten a lot of hype, so I slogged through it hoping to find a diamond somewhere in the muck, but aside from a few small pieces of amber, there was little of interest. The authors definitely have a strong sense of "do it our way, because we know we do it right," which was kind of annoying, and worse, they didn't even back it up with anything to really differentiate their way from what I've always considered as the "duh", way to program. And by "duh", I don't mean "I do it this way because I'm stupid", but rather "I do it this way because any other way would be silly."

Well, that's about it for now, I guess.

Telling it like it is

I was writing some Java today, and ran across the DraconianErrorHandler in the depths of Xerces (package com.sun.org.apache.xerces.internal.util).  It's a very apt name (it simply throws any errors it's passed), but the name struck me as something outside the bounds of the expected.  I'd have undoubtedly named it ErrorPropogationErrorHandler or something that described what it does, rather than alluding to a metaphor of it's behavior.

Dynamic Languages

Forta posted on CF being omitted from InfoWorld's article on dynamic languages. My question is "why should CF be on the list?" Let's compare CF against some others (I'm going to somewhat arbitrarily pick Python, Ruby, and Groovy as the main ones).

CF excels at JEE web presentation tier development. Python and Ruby are both commonly used to build web presentation tiers. Groovy is somewhat scarce in this space, but it's often used as "glue" code inside Java (including JEE) applications that rely on something else (JSP, Velocity, etc.) for the web presentation tier.

CF can only function in a JEE web environment. Python and Ruby are useful anywhere their interpreters are available. Groovy shares CF's dependence on a JVM, but not the JEE web environment. I can think of a lot of applications that run in an environment that includes interpreters/JVM access, but doesn't provide a JEE environment.

CF is little more than a proprietary replacement for JSP that ships with a pile of taglibs included. One could argue that CFCs clearly differentiate CF from JSP, and while that's a valid observation, it doesn't change the fundamental nature of the beast.

So stop trying to make CF out to be something that it's not. Just because it's not analogous to Dynamic Language X doesn't mean its' a bad platform. It just means that it's not a "toolbox" language (which is what most dynamic languages are designed to be). That's not good or bad, just different.

Taco Wagon Map

I love taco wagons, but I can never find them.  So I made a taco wagon map on Google Maps' new My Maps feature.  There's no collaboration features built into it yet, unfortunately, but if you know of other wagons, let me know and I'll add them.