Archive for June, 2009

The newspapers are doomed, part CXXVIII

Thursday, June 18th, 2009

Penelope Trunk offers another reason why old media is doomed:

So we don’t need stupid rules about conflict of interest for people who are putting themselves on the line. That rule is for old media, where writers were putting only the brand of the newspaper on the line. In old media most journalists were no-names, writing under big (newspaper) names. So if they wrote something moronic, so that they could increase the value of a stock they held, or, maybe, get more oral sex, they would put only the newspaper brand at risk. Not their own.

Which means that the arcane conflict of interest rules are to protect the newspaper, not the readers. And this, by the way, is why newspapers are going down: because they are more about themselves, and their hierarchies, and rules and structures, than they are about what their readers want. Readers should not care about the business dealings of the writers or their publishers. Readers just want good content.

Celebrating Bloomsday

Wednesday, June 17th, 2009

In my social circle, Alonzo Subverbo is the main evangelist for Joyce. I am glad to be on Subverbo’s mailist, which mostly focuses on music, but encompasses all things literary. I liked what he sent out on Bloomsday, and so, with permission, repost it here:

June 16th: Bloomsday

Another Bloomsday has come, the day that James Joyce set Ulysses, the day that Leopold Bloom and Stephen Daedalus wandered the streets of Dublin being extravagantly modernist, the day that turned into the night that Molly Bloom lay in bed, contemplating desire and desire’s memory, saying Yes, saying it again. But though I am Bloomsday’s Proselytizer-in-Chief Among People I Know, have been for many years now, I find myself distracted from my devotions by an obsessive concern for the news from Iran, which has become extraordinary. This was poor planning on the part of the Iranians, surprising in such a literature-loving people. How can anyone concentrate on a properly self-indulgent stream of consciousness with all this going on? What has the one thing to do with the other and how might one mind encompass them both?– as one mind encompassed the world of Ulysses, created it, handed it over, a world almost as irritating and beautiful and pointlessly meaningful as our own. Connections must be found — the color green, meddlesome clergymen, the grand claims of Blake and Shelley and Whitman and all the unacknowledged legislators of poetry and freedom, of the undivided imaginations of the rooftop shouter and street demonstrator and of the scribbling blind Irish prick, who thought he was a genius.

When I once again put a potato in my pocket, as Bloom did on his day, and have the usual pints of Guinness, and wander around my city once more with the spuds and the book and the brown beer — as if something might happen, something requiring just this equipment — and remember Bloomsdays past and all those I have loved and given potatos to, this time it will be a bit different, this time that potato will be a fucking Freedom Potato, and the toasts will travel halfway around the world, and the untranslatable words will understand everyone, everywhere.

Happy Bloomsday.

Rediscovering the reminder site Remember The Milk

Tuesday, June 16th, 2009

Last year we used Remember The Milk as our project management tool for a major project. At first we loved it, but then we hated it. It helped us get organized, but it didn’t help us get the client organized.

So we switched to Basecamp as our main project management tool. It is great at facilitating conversations with the whole team, including the client.

But Basecamp does not remove the need for email – rather, the opposite, it sends out a flood of email. It encourages “send to all” communications. That is good for most of our projects, most of the time. But Thunderbird 2.0.0.19 tends to crash a lot on my Ubuntu 8.04 machine. In fact, all versions of Thunderbird have tended to crash a lot, and that causes me to lose track of the emails that I was about to respond to.

Remember The Milk lets me send my email to it. So when I’ve got an email that I need to respond to, but I don’t have the time to respond to it right now, I can send it Remember The Milk. Remember The Milk won’t let me forget that email.

And potentially, I might start sending out tasks from Remember The Milk. It encourages a 1 to 1 style of communication, which is appropriate, on our projects, as often as Basecamp’s many-to-many conversations are.

To the extent that email is essential for getting a project organized, then getting email organized is also essential to getting a project organized. And Remember The Milk offers a much better interface (than Thunderbird or Basecamp )for converting email into assigned tasks.

Google now offers scripting on Android

Sunday, June 14th, 2009

Earlier I complained that Apple had not yet ported AppleScript to the iPhone. I am very pleased to see that Google is now supporting scripting on Android:

Scripts can be run interactively in a terminal, started as a long running service, or started via Locale. Python, Lua and BeanShell are currently supported, and we’re planning to add Ruby and JavaScript support, as well.

Google is doing everything right to win the hearts of developers. Will this matter in the long run? Apple has a big head-start with the iPhone. But then, once upon a time, Apple was the only company selling a personal computer that supported a GUI interface. It’s possible cell phones will see a shake-out like what happened in the 1980s – Apple is there first, but alienates its developers, a competitor arrives late, but woos developers and in the end wins more market share.

Simple business transactions

Saturday, June 13th, 2009

Jason Fried likes simple business transactions:

I called them. 10 minutes later the guy came by. He was down the street on another job. We walked out back. I told him what I needed done. He looked around for 20 seconds and said $300. I said “deal.”

That’s it. No proposal. No “I’ll get back to you tomorrow”. No “Let me see how much the materials will cost and I’ll drop an estimate in your mailbox next week.”

Just $300. Deal. When can you start? Wednesday. How long will it take? A few hours for a few guys.

He knows his business. I know what my time is worth. End of transaction. It was so damn refreshing.

I know everything can’t be done like this, but often it seems like we’ve slid down a path of formality with so many things that really don’t need it. Extensive contracts, delays, red tape, precise cost estimates based on precise amounts of materials, “let me think about it and I’ll get back to you,” etc. Essential? Sometimes yes, but most of the time probably not.

This does sound appealing, though as general business advice, I think one would have to modulate this strategy depending on the gender of one’s customers. I just got done re-reading You Just Don’t Understand: Men and Women in Conversation which mentions that one difference between the genders is the amount of social interaction they tend to think should be part of the transaction.

Cleanse a directory tree of Subversion

Thursday, June 11th, 2009

This has often tripped me up: I copy a folder (which is under version control) to another location and all the”.svn” files get copied too. So this is useful: Scott Meves posts a trick for recursively clearing out the “.svn” files.

Symfony plugins need a rating system

Thursday, June 11th, 2009

WordPress suffers from “plugin hell”. There are thousands of plugins for every imaginable use, most of them are buggy, most of them are unsupported, most of them have been abandoned and only work on old, out of date versions of WordPress. Every significant WordPress project involves at least a day wasted testing plugins, trying to find one that works for you.

I worry about the plugins for Symfony going down the same road. Of course, the Symfony plugin system is much better than the WordPress system, and it enforces having the correct version.

At least for now, the community of Symfony plugin developers are small. The companies that offer plugins seem reputable and ready to stand behind their plugins.

CentreSource recently released 9 new plugins:

1) csDoctrineActAsAttachablePlugin – associates various uploads with multiple models, and includes an AJAX uploading client interface.

2) csDoctrineActAsCategorizablePlugin – associates models into nestable categories and category groups.

3) csDoctrineActAsGeolocatablePlugin – integrate your model with the Google Maps API to pull in geocodes based on record fields. Supports radius and proximity searches.

4) csDoctrineActAsSortablePlugin – adds a sortable behavior to your models

5) csDoctrineSlideshowPlugin – add and configure slideshows in your project.

6) csFormTransformPlugin – give your forms a web 2.0 look within a few easy steps.

7) csGlossaryPlugin – group your models alphabetically in glossary/directory format

8) csSEOToolkitPlugin – A toolkit to improve your website’s search engine optimization.

9) sfSympalSlideshowPlugin – An advanced slideshow used for the Sympal Content Management Framework.

What I’d like to see is one blog that just focuses on the plugins, and perhaps evaluates them, to say which ones are good.

Crowd sourcing customer service

Thursday, June 11th, 2009

Morgan Zuehlke suggests that a customer-to-customer question and answer site is a great way to handle customer support for certain companies, such as Apple:

Apple is unique. Their lifestyle-permeating products cultivate customers who enjoy providing answers to others with no evident reward beyond the satisfaction of shared knowledge. Not many companies are blessed with such dedicated customers. Taking the Apple.com customer-to-customer model a few steps further in the Yahoo! Answers direction, a Q/A system can involve call and response credits. This inspires users to answer each other’s questions in order to earn the ability to ask a question. This is precisely how Yahoo! Answers built up such an active body of users sharing an incredible wealth of knowledge (and lack, thereof)!

Dunder Mifflin is not the best fit. Much like creating a social network, this is not suited for every company. Here are some key questions to ask when evaluating whether or not the Yahoo! Answers model would be a good fit for your company:

1. Do my customers consider my product or service to be a part of their lifestyle?

2. Do we get a high volume of customer service inquiries?

3. If we have a message board on our company site, is it very active?

4. Do my customers have more than just one or two questions about interacting with my products throughout the course of our relationship?

5. Do my customers have things in common with each other?

If you can answer “Yes” to all of these questions, your company would likely be a good fit for a Q/A system modeled after Yahoo! Answers.

But he points out that the model fails unless the customers are passionate about the product, and unless they, for some reason, want to volunteer their time to helping other customers.

For other companies another approach is needed – offering small cash rewards to have customers help other customers. This would be similar to the community that grew up on the tech-support boards on AOL back in 1993 and 1994. Back then, AOL charged $2.95 per hour you were online, but the fee was waived if you volunteered time on the tech support boards.

What most companies need is software that allows for questions and answers, and which makes it easy to distribute small amounts of cash back to users who contribute a lot.

So frustrated with Mozilla that I’ve got a sore throat from yelling

Monday, June 8th, 2009

FireFox can crash any machine. Not “crash” in the sense of “blue screen of death” but crash as in “uses up all memory so the machine becomes unresponsive”. This is a reliable fact of using FireFox, regardless of whether you are on Ubuntu Linux, Windows XP, or Mac OS X (I can’t speak of Camino, as I don’t use it).

Sometimes I say this to other programmers and they respond “It’s not FireFox that is the problem, it is the plugins that you use – it is FireBug and Session Manager and all the others.” Of course, any programmer who reveals this attitude needs to be re-educated. If you offer a plugin system that is unable to manage the plugins, then maybe you should not offer that plugin system? It suggests a (possibly frightening?) willingness to shirk responsibility if a programmer defends a plugin system that can crash a computer.

I wonder what Brendan Eich is thinking?

One suggestion for others: if you use FireFox, every time a new version of FireFox comes out, FireFox will ask you if you want to upgrade. I used to always say “yes”. Now I realize, if your computer is more than a year old, you should say “no”. Each version of FireFox tends to be heavier and slower than the previous version. My Ubuntu machine is from 2006, and that is part of the reason why FireFox is so slow on it.

On my Windows machine, I just switched over to Google Chrome as my new default browser. I’m giving up on FireFox. On my Ubuntu machine, I am stuck with FireFox for now. I’m not aware of any other serious browsers for Linux.

For email, I would love to give up on Thunderbird, if I could find a substitute. I run Thunderbird on my main desktop machine which runs Ubuntu. Thunderbird has had a persistent bug that has survived several upgrades (of both Thunderbird and Ubuntu). The bug is with the address auto-completion. If I type an address fast, hit “Enter” to accept and start typing again fast, Thunderbird crashes. This can lose a lot of work for me (Where “work” might simply mean “Opened email and left them open because I found some that were important and so answering them will take some time.”). Apparently there is no equivalent of SessionManager for Thunderbird, no way of remembering which emails were open, waiting for a response, when Thunderbird crashes. No, instead, after Thunderbird crashes, I need to re-start it, go back 3 days, and then read through all my email again, looking for the important ones.

At work we had a deadline today, and I worked through the weekend to meet it. I kept getting feedback from various people testing the site. Some of the email I got was thoughtful, and offered intelligent suggestions about what we should do next. By this morning, I had about 20 emails open, waiting for me to have the time and focus to write a reply. Then Thunderbird crashed and they all vanished. I yelled so loud my throat was sore. Now I have to go back to Friday and read through all the email again, to find the ones that I wanted to respond to.

If I could find something better than Thunderbird, that runs on Linux, I’d switch immediately.

In economics, what does the word ‘growth’ mean?

Saturday, June 6th, 2009

David Van Couvering is talking about a steady state economy.

A few reactions:

Imagine an accounting system that allows a company to treat all incoming cash as a profit. Expenses are not counted at all. If this company gets $1 million in money, and has expenses of $1.1 million, it records a $1 million profit. Sounds pretty crazy, huh? And if this company’s incoming cash increases to $2 million, while its expenses increase to $3 million, it is allowed to claim that its profits have increased by 100%.

I am exaggerating to make a point. But it is a point worth considering. The way GDP is calculated tends to count all increases as good. Many forms of losses are external to the way the GDP is calculated.

Imagine this scenario: A healthy and prosperous man is standing on a street corner. Another man approaches him, pulls out a gun, shoots the first man, takes his wallet and then flees the scene. Someone calls 911. The injured man is rushed to the hospital. Over the next 6 months he requires multiple surgeries and extensive physical therapy to recover. All of this medical care is counted toward the growth of the GDP. The emotional pain and suffering of the man and his loved one’s are not subtracted from the GDP. To the extent that the GDP is suppose to offer a rough indication of human welfare, it fails badly in situations such as this.

If the economy is at full employment (and let’s note that “full employment” is something of an abstraction) then, theoretically, there are no extra people who can replace that injured man at his job, so for the 6 months that he is recovering, his lack of labor is subtracted from the GDP. So in this scenario, the GDP would shrink somewhat, due to the man’s injuries (but let’s note that his lost ability to produce wealth is not the only loss that has been suffered). However, if the economy is not at full employment, then society has surplus labor, and so, in theory, someone could take the job that the injured man had held, and so the GDP would see no shrinkage at all (I’m leaving aside the issue of whether or not the man had a rare skill that no one else could replace). Though, from a moral and practical standpoint, the man, his loved ones, and society have all suffered a loss, the loss is never recorded in the GDP (if the economy is not at full employment).

Any exchange of money is treated as something positive. This is like the company I mention above, that gets to record all incoming cash as profit, and never has to record any expenses.

There are, at this point, some well known areas where losses are external to the way the GDP is calculated. Environmental loss is an obvious one. Property rights don’t extend to the air we breathe, so air pollution can not easily be recorded as damaging anyone’s wealth. “Tragedy of the commons” scenarios are common, especially involving areas such as deep sea fishing, where property rights are non-existent.

There are other scenarios that are less talked about. There are the emotional losses that a family might suffer when the forest they live next to is torn down and replaced with a chicken processing plant. The new plant produces wealth that is added to the GDP, but if something has been lost, it is not recorded. That sense of loss that people might feel in such scenarios is sometimes denigrated as a nostalgic and sentimental attachment to the past. Emotions show up in the GDP only when something symbolic of emotions is purchased, for instance, a wedding ring. Or, to bring up the issue of subjectivity, we could ask, what is the value of perfume? It’s practical value is difficult to assess. It’s value is determined subjectively, by each person who purchases it. It no doubt has some emotional value to the person using it, and we measure that value by its price, but other kinds of emotions, if they don’t involve a purchase of some kind, don’t get counted.

My point, in all of this, is to suggest that “growth” is a nebulous term. Or rather, when I hear the word “growth” I think of Mandelbrot’s essay “How long is the coast of Britain?” In the same way that he argued that the coast of Britain could be of any length, depending on how you wanted to measure it, so too, I think one could argue that we suffer, or enjoy, a lot of growth, a little growth, or negative growth, depending on how you might specify which inputs are valid. I can think of a thousand ways to measure to growth, and each way would give a different answer. As Joseph Schumpeter once said “The social process is really one indivisible whole,” from which economists pluck various aspects and call them “economic”. Given an endless stream of data that has as many dimensions as we wish to define, the process of deciding which dimensions shall be treated as important will always be arbitrary. Or rather, such decisions can be made to build models that work for us as useful tools (or un-useful tools). Such models don’t take us closer to any kind of reality, they simply give us feedback that we have decided that we need if we are to build whatever kind of world that we have previously decided we want to build.

Again, if you are measuring the coast of Britain, you first need to decide on what your goals are for doing the measurement. If your goals are to aid navigation by boat, you might come up with one method of measurement, useful for your goal. If your goal is to track the growth or shrinkage of the eco-system available to some ocean-loving bird, you might use a different method. All that matters is whether your method of measurement allows you to achieve your pre-determined goal. Neither method can pretend to be more accurate than the other. Accuracy is not a coherent concept, in this discussion. And likewise, the word “growth”, when applied to the GDP, has to be understood as a tool that is maybe useful, or perhaps un-useful, in achieving a particular kind of civilization. But there is no final reality behind it. We could use a different system of measurement and achieve a different result, and whatever system of measurement we used, none could be said to be more accurate than the others, they could only be judged on how well they help acheive pre-determined goals.

On a different note, right before he was assassinated, Robert Kennedy offered a similar critique, far more eloquent than mine:

We will find neither national purpose nor personal satisfaction in a mere continuation of economic progress, in an endless amassing of worldly goods. We cannot measure national spirit by the Dow-Jones average, nor national achievement by the gross national product. For the gross national product includes air pollution and advertising for cigarettes, and ambulances to clear our highways of carnage. It counts special locks for our doors, and jails for the people who break them. The gross national product includes the destruction of the redwoods, and the death of Lake Superior. It grows with the production of naplam and missles and nuclear warheads… It includes Whitman’s rifle and Speck’s knife, and the broadcasting of television programs which glorify violence to sell goods to our children.

And if the gross national product includes all this, there is much that it does not comprehend. It does not allow for the health of our families, the quality of their education or the joy of their play. It is indifferent to the decency of our factories and the safety of our streets alike. It does not include the beauty of our poetry or the strength of our marriages, the intelligence of our public debate or the integrity of our public officials… the gross national product measures neither our wit nor our courage, neither our wisdom nor our learning, neither our compassion nor our devotion to our country. It measures everything, in short, except that which makes life worthwhile; and it can tell us everything about America – except whether we are proud to be Americans.

Why do we need JavaFX when we have Groovy?

Friday, June 5th, 2009

The more I learn about Groovy, the less I understand why the world needs JavaFX.

Back around 2002 or 2003 I studied Java, but it seemed heavy to me, verbose, and slow to program with. My attitude has mostly been, life is short, so I’d rather program in light-weight, high level programming languages. I want to be able to go as fast possible. For the last few years I’ve mostly been doing web development, mostly with PHP, though I did one project with Ruby On Rails.

But then the iPhone came out. And then the iPhone app store. So I became intrigued with the idea of programming for cell phones. But I didn’t want to especially learn Objective C just to be able to work with the iPhone. I was relieved to hear that Google was coming out with its Android operating system for cell phones, and programming for Android would be done in Java. That opened the door to using the light-weight languages (derived from Java) for cell phone programming. Very cool.

So I began to delve into the world of Java, something I hadn’t done much in the last few years. At first I was attracted to JavaFX, which Sun was hyping. But then I began to wonder why JavaFX was suffering such a slow uptake, and why programmers seemed less thrilled about it than I.

Now that I’ve started to study Groovy, I realize why JavaFX has so little traction: it isn’t needed. Much of what I liked about JavaFX is already present in Groovy. Lexecorp expresses some of the same hesitation that I feel:

I wonder whether I will be able to like JavaFX! Have I been spoilt already by Groovy (it does, virtually, the same thing)? Maybe, but I managed to accept the long winded Java language well after Perl’s expressive power had spoilt me. I learned to love Java for its platforms and immense libraries, so what can I love about JavaFX?

Consider this tutorial, which showed how to draw a coffee cup, and which showed off the clean, declarative style of JavaFX:

def plateGroup = Group {

translateX: 250
translateY: 300

content: [

// The gray ellipse under the plate
Ellipse{centerX:0 centerY:10 radiusX:160 radiusY:50 fill:Color.DIMGRAY},

// The thin "lip" of the plate (provides a sense of 3D)
Ellipse{centerX:0 centerY:3 radiusX:170 radiusY:50 fill:Color.LAVENDER},

// The large plate ellipse
Ellipse{centerX:0 centerY:0 radiusX:170 radiusY:50
fill:RadialGradient{
centerX:0.5 centerY:0.75
stops:[Stop {offset: 0.0 color: Color.WHITESMOKE},
Stop {offset: 0.5 color: Color.LIGHTGRAY},
Stop {offset: 1.0 color: Color.DARKGRAY}]
}
},

// Recessed plate center
Ellipse{
centerX:0 centerY:5 radiusX:90 radiusY:22
fill:RadialGradient{
centerX:0.5 centerY:0.75
stops:[Stop {offset: 0.0 color: Color.BLACK},
Stop {offset: 0.4 color: Color.LIGHTGRAY},
Stop {offset: 1.0 color: Color.GHOSTWHITE}]
}
}
]
}

def cupGroup = Group {

translateX: 152
translateY: 20
scaleX: 3.0
scaleY: 4.0

content: [
// Cup body
Circle {centerX: 100 centerY: 100 radius: 50
fill: RadialGradient {
centerX: 0.4 centerY: 0.0 focusX: 0.5 focusY:.65, proportional:true
stops: [Stop {offset: 0.0 color: Color.GHOSTWHITE},
Stop {offset: 1.0 color: Color.SILVER}]
}
},

// Cut top of cup
Rectangle{stroke: BGCOLOR fill: BGCOLOR
x:25 y:50 width:150 height:50},

// Outer rim
Ellipse{fill: Color.WHITE centerX:100 centerY:100 radiusX:50 radiusY:8},

// Inner rim
Ellipse{centerX:100 centerY:100 radiusX:48 radiusY:7 //inner rim
fill: RadialGradient {
centerX: 0.4 centerY: 0.0 focusX: 0.5 focusY:.4, proportional:true
stops: [Stop {offset: 0.0 color: Color.GHOSTWHITE},
Stop {offset: 1.0 color: Color.SILVER}]
}
},

// Create “coffee in cup” by intersecting coffee ellipse with inner rim ellipse
ShapeIntersect {

fill:Color.SADDLEBROWN

//Inner Rim
a: Ellipse{centerX:100 centerY:100 radiusX:48 radiusY:7} // inner rim dimensions

//Coffee
b: Ellipse{centerX:100 centerY:102 radiusX:46 radiusY:6} // coffee dimensions
}
]
}

Stage {
title: “Coffee Cup”
width: 500
height: 500
visible: true
scene: Scene {
fill: BGCOLOR
content: [plateGroup,cupGroup]
}
}

That’s impressive! Look how clean the code is! So much simpler than Swing! But then Andres Almiray turned around and demonstrated how to draw a coffee cup with Groovy:

group( id: ‘plategroup’, bc: ‘none’ ) {
// gray ellipse under the plate
ellipse( cx: 0, cy: 10, rx: 160, ry: 50, f: color(’darkGray’).brighter() )

// thin ‘lip’ of the plate (provides a sense of 3D)
ellipse( cx: 0, cy: 3, rx: 170, ry: 50, f: ‘lavender’ )

// large plate
ellipse( cx: 0, cy: 0, rx: 170, ry: 50 ) {
radialGradient( cx: 1, cy: 1, fy: 100, r: 270 ) {
stop( c: ‘whiteSmoke’, s: 0 )
stop( c: ‘lightGray’, s: 0.5 )
stop( c: ‘darkGray’, s: 1 )
}
}

// recessed plate center
ellipse( cx: 0, cy: 5, rx: 90, ry: 22 ) {
radialGradient( cx: 1, cy: 1, fy: 20, r: 180 ) {
stop( c: ‘black’, s: 0 )
stop( c: ‘lightGray’, s: 0.4 )
stop( c: color(’white’).darker(), s: 1 )
}
}

transformations {
translate( x: 250, y: 300 )
}
}

group( id: ‘cupgroup’, bc: ‘none’ ) {
subtract( id: ‘cup’, asShape: yes ) {
circle( cx: 100, cy: 100, r: 50 )
rect( x: 25, y:50, w: 150, h: 50 )
}
draw( cup, keepTrans: yes ) {
radialGradient( cx: 0.4, cy: 0, r: 100 ) {
stop( c: ‘whiteSmoke’, s: 0 )
stop( c: color(’whiteSmoke’).darker(), s: 1 )
}
}

// outer rim
ellipse( cx: 100, cy: 100, rx: 50, ry: 8, f: ‘white’ )

// inner rim
ellipse( cx: 100, cy: 100, rx: 48, ry: 7, id: ‘innerRim’ ) {
linearGradient( y2: 1 ){
stop( c: ‘whiteSmoke’, s: 0 )
stop( c: color(’whiteSmoke’).darker(), s: 1 )
}
}

intersect( f: color(’darkOrange’).darker().darker() ) {
shape( innerRim )
ellipse( cx: 100, cy: 102, rx: 46, ry: 6 )
}

transformations {
scale( x: 3, y: 4 )
translate( x: -16, y: -70 )
}
}

transformations {
translate( x: -50, y: -50 )
}

Damn. Doesn’t that look similar? There are some syntax differences, but both use a declarative style, and both require less work than using Swing.

Groovy offers some solid MVC frameworks. For web development, there is Grails, which is an imitation of Ruby On Rails. For the desktop, there is Griffon. Consider this post on Transentia:

Although it is early days yet for the project, Griffon aims to bring the same “Configuration by Convention” goodness to desktop GUI development that Grails has brought to Web development. In fact, Griffon ‘borrows’ heavily from Grails: many of the build scripts, etc. are straight carry-overs, meaning that anybody familiar with Grails can get started easily.

This is all that is needed to get started:

griffon create-app GT
cd GT
griffon run-app

These three shell commands give a simple immediately runnable application.

As with Grails, Griffon imposes a clear MVC structure for the code and also creates a standard project filesystem heirarchy.

I haven’t yet worked with Griffon, but the setup described on Transentia looks very clean. Certainly, everything I’ve learned so far about Groovy has left me impressed. And since Groovy integrates with regular Java far more smoothly than JavaFX, why do we need JavaFX? Can anyone name one thing that JavaFX gives us that Groovy hasn’t already given us?