Search

CodeProject

I'm currently completing the finishing touches on a new e-commerce site for my wife's stationary business. We decided a long time ago to use PayPal for all of the payment processing since we've had a great experience using it for our eBay selling. About a year ago Graeme Rocher polished off the last release of a PayPal plugin that is available in the Grails Plugin repository. It really is a very nice plugin, yet I had a couple of problems with it:

Ever wanted to do drag-n-drop sorting of a grid of images on a page and persist it? Here's my solution using Grails, Prototype, and Script.aculo.us.
Basically what prompted this was the need for my wife to be able to sort the various product images that she had on a screen at any given time in any way that she pleased, and it had to be easy to work with. What follows is by no means a complete solution to this problem, but it represents where I am in the development process and may be useful to you, my hapless reader.

A few days ago I pontificated on my need to choose a new “Language of the Year.” Right now I'm attempting to choose between Scala and Clojure. If nothing else, I've learned from this exercise that asking the community for feedback is a GOOD thing. Your comments have been very helpful.
To summarize:
As far as the polls go, Scala is in the lead by a margin of 4 to 2.

In 2007 I established several professional development goals (and later reported my progress on these), one of which was to learn Groovy and Grails. This goal stemmed from the continually referenced idea from The Pragmatic Programmer to “learn a new language every year.” This idea has become so ubiquitous that it even has it's own four-letter acronym, LOTY (Language of the Year).
Since establishing and reporting on these goals, I've had several things get in the way of fully realizing all of them.

I recently gave a 90 minute talk at work covering quite a bit of ground related to Agile Software Development. If I had to sum up agile development in one word, it would be FEEDBACK. Venkat Subramaniam and Andy Hunt give one of the best definitions of agile I've ever seen in their book, Practices of an Agile Developer:
Agile development uses feedback to make constant adjustments in a highly collaborative environment.

Interesting title, eh? Maybe this one will make it through Glen's filter at GroovyBlogs.org.
On to the meat. I've been steadily working on a couple of Grails applications, one being the website for the Memphis JUG, and another being the e-commerce site for my wife's soon to be launched designer stationery business. Just like your average Grails developer, I've been happily coding away at 127.0.0.1 using the good old development Jetty+MySQL stack.

In finishing up the first release of JUG Nexus, the open source engine (http://github.com/mstine/jug-nexus/tree/master) behind the new Memphis JUG website, I needed to put a good Textile engine in place. I really don't care for writing actual HTML in a content management system, and JUG Nexus being a lightweight CMS, I wanted a lightweight markup syntax for entering the details of upcoming JUG meetings. Textile is exactly that, and is also used for entering content into the very useful JUGEvents system produced by JUG Padova for the Java User Group community at large.

So as I'm sitting here thumbing through my InfoQ feed on Google Reader, I come across the following posting: Software Craftsmanship Manifesto: A Call to Arms. It seems that a group of “programming patriots” has struck again (see the Manifesto for Agile Software Development - circa 2001), complete with a “founding document” look and feel. Clicking through the source link, one finds the following:
As aspiring Software Craftsmen we are raising the bar of professional software development by practicing it and helping others learn the craft.

I'm currently working on a Grails application with a requirement for uploading product images, which are subsequently resized into thumbnails of various sizes for different shopping screens. Since it took a bit of doing to get this done, I thought I'd post my solution here in case anyone could benefit from it.
First, to set the stage, I've upgraded the application all the way to the newly released Grails 1.1.