'Annuitizing' a 401(k) Plan -- Options for Plan Sponsors and Participants

Posted by Unknown Monday, December 31, 2012 0 comments
Annuitizing' a 401(k) Plan -- Options for Plan Sponsors and Participants (Bloomberg BNA)
"The [DOL] is encouraging participants to think about annuities in its lifetime income project. Reportedly, the agency is working on a proposed regulation that would require that defined contribution plans include in benefit statements an illustration of the participant's benefit in annuity form."
Important word about authorship:
BenefitsLink ® (BenefitsLink.com) provides this page for you, with a hypertext link to an item we think is interesting and valuable for companies sponsoring employee benefit plans, employees who participate in plans, and firms who provide products and services to plans. But BenefitsLink is not the author of the item to which this hypertext link will take you (unless expressly indicated there).

View the original article here


Read more ....

BenefitsLink.com

Posted by Unknown Sunday, December 30, 2012 0 comments
Every day we link you to the freshest news, analysis, opinions and government documents about employee benefit plans.Our scope includes compliance, administration, design (especially cost savings), and policy.We cover all kinds of plans: 401(k), pension, profit-sharing and other retirement plans; group health, disability and other kinds of welfare plans; and executive benefits.ERISA plans sponsored by private employers, and ERISA-exempt plans sponsored by governments, churches, or for executives only.We present each day's links to you in two formats: All of our coverage is archived online, and fully searchable -- 15 years of Employee Benefits developments at your fingertips.Our award-winning job board at EmployeeBenefitsJobs.com is exclusively for employee benefits professionals: administrators, analysts, managers, attorneys, compliance officers, auditors, recordkeepers, trustees and all the rest of the hardworking and underappreciated crew Gotta lighten up sometimes. And more ... Join the community of over 16,000 registered users on our Message Boards. Search over 160,000 messages posted so far.Our directory of upcoming Conferences and Webcasts is open to all sponsors, on all employee benefits topics.We have an extensive employee benefits Software Directory.Find services and products for employee benefit plans in our Vendor Directory.Research rules and regulations: see the menu above for a complete list of authorities.

View the original article here


Read more ....

Are you frustrated with 8955-SSA or 1099 filings this year?

Posted by Unknown Saturday, December 29, 2012 0 comments
AppId is over the quota
AppId is over the quota
Select any of the menu options at the top of your screen to learn more.


Sorry, I could not read the content fromt this page.

View the original article here


Read more ....

Industry Education Begins with RPF

Posted by Unknown Friday, December 28, 2012 0 comments
AppId is over the quota
AppId is over the quota

View the original article here


Read more ....

What Makes Annuitization More Appealing?

Posted by Unknown Thursday, December 27, 2012 0 comments
What Makes Annuitization More Appealing? (National Bureau of Economic Research)
"A majority of respondents prefer to receive an extra 'bonus' payment during one month of the year that is funded by slightly lower payments in the remaining months. Concerns about later-life income, spending flexibility, and counterparty risk are the most important self-reported motives that influence the annuitization decision, whereas the desire to leave a bequest has little influence on this decision."
Important word about authorship:
BenefitsLink ® (BenefitsLink.com) provides this page for you, with a hypertext link to an item we think is interesting and valuable for companies sponsoring employee benefit plans, employees who participate in plans, and firms who provide products and services to plans. But BenefitsLink is not the author of the item to which this hypertext link will take you (unless expressly indicated there).

View the original article here


Read more ....

Investors by lowering expectations for retirement living

Posted by Unknown Wednesday, December 26, 2012 0 comments
WarningNews is not found for id = language = fr. sorry, I could not read the content fromt this page.

View the original article here


Read more ....

The Impact of Fee Disclosure Regs on 403(b) Plan Sponsors and Participants: Detailed Survey Results (PDF)

Posted by Unknown Monday, December 24, 2012 0 comments
The Impact of Fee Disclosure Regs on 403(b) Plan Sponsors and Participants: Detailed Survey Results (PDF) (Plan Sponsor Council of America)
"PSCA conducted a survey of 403(b) plan sponsors to determine what effect, if any, the recently conducted fee disclosures have had on not-for-profit organizations and their plan participants. The results show little impact on the behavior of participants and plan sponsors." [Editor's note: Detailed report of survey results in charts and graphs.]
Important word about authorship:
BenefitsLink ® (BenefitsLink.com) provides this page for you, with a hypertext link to an item we think is interesting and valuable for companies sponsoring employee benefit plans, employees who participate in plans, and firms who provide products and services to plans. But BenefitsLink is not the author of the item to which this hypertext link will take you (unless expressly indicated there).

View the original article here


Read more ....

Peer Pressure Can Boost Retirement Savings

Posted by Unknown Sunday, December 23, 2012 0 comments
Peer Pressure Can Boost Retirement Savings (Investment News; free registration required)
"More than half of the respondents to a new consumer survey ... said they would be motivated to save more for retirement if they discovered that their nest eggs didn't measure up to those of their peers."
Important word about authorship:
BenefitsLink ® (BenefitsLink.com) provides this page for you, with a hypertext link to an item we think is interesting and valuable for companies sponsoring employee benefit plans, employees who participate in plans, and firms who provide products and services to plans. But BenefitsLink is not the author of the item to which this hypertext link will take you (unless expressly indicated there).

View the original article here


Read more ....

Effects of an Individual Development Account Program on Retirement Saving

Posted by Unknown Saturday, December 22, 2012 0 comments
Effects of an Individual Development Account Program on Retirement Saving (Brookings)
"[This study examines] the 10-year follow-up effects on retirement saving of an Individual Development Account (IDA) program [that] included financial education, encouragement to save, and matching funds for several qualified uses of the savings, including contributions to retirement accounts. The results indicate that, as of 2009, 6 years after the program ended, the IDA program had no impact on the propensity to hold a retirement account, the account balance, or the sufficiency of retirement balances to meet retirement expenses."
Important word about authorship:
BenefitsLink ® (BenefitsLink.com) provides this page for you, with a hypertext link to an item we think is interesting and valuable for companies sponsoring employee benefit plans, employees who participate in plans, and firms who provide products and services to plans. But BenefitsLink is not the author of the item to which this hypertext link will take you (unless expressly indicated there).

View the original article here


Read more ....

Upper Middle Class Delays Retirement -- A Look at the Road Ahead

Posted by Unknown Friday, December 21, 2012 0 comments
Upper Middle Class Delays Retirement -- A Look at the Road Ahead (Forbes)
"[A recent survey of] households with between $50,000 and $250,000 in total investable assets ... [revealed] that 56 percent of respondents reported that they plan to retire later than they thought they would one year ago. In a year where the S&P 500 has grown more than 12 percent and the unemployment rate has fallen, why are people growing more pessimistic about their retirements?"
Important word about authorship:
BenefitsLink ® (BenefitsLink.com) provides this page for you, with a hypertext link to an item we think is interesting and valuable for companies sponsoring employee benefit plans, employees who participate in plans, and firms who provide products and services to plans. But BenefitsLink is not the author of the item to which this hypertext link will take you (unless expressly indicated there).

View the original article here


Read more ....

Get Your (Social Security) Tricks on Route 66: Picking the Best Starting Date

Posted by Unknown Thursday, December 20, 2012 0 comments
AppId is over the quota
AppId is over the quota

View the original article here


Read more ....

Study Shows That Fee Disclosure Has Not Significantly Influenced Participant Behavior (PDF)

Posted by Unknown Wednesday, December 19, 2012 0 comments
AppId is over the quota
AppId is over the quota
Sorry, I could not read the content fromt this page.Sorry, I could not read the content fromt this page.

View the original article here


Read more ....

More Boomers Encountering 'Unplanned' Early Retirement

Posted by Unknown Tuesday, December 18, 2012 0 comments
More Boomers Encountering 'Unplanned' Early Retirement (LifeHealth Pro)
"The prospect of an unplanned early retirement is real, and is happening more frequently since the US economic downturn. (This is consistent with results from prior surveys, where the percentage ranged from a low of 37% in 2007 to a high of 52% in 1991.) Advisors need to discuss with their clients the risk of early retirement as much as the desire for early retirement."
Important word about authorship:
BenefitsLink ® (BenefitsLink.com) provides this page for you, with a hypertext link to an item we think is interesting and valuable for companies sponsoring employee benefit plans, employees who participate in plans, and firms who provide products and services to plans. But BenefitsLink is not the author of the item to which this hypertext link will take you (unless expressly indicated there).

View the original article here


Read more ....

Recipe for Success: Retirement Savers Can Learn from WeightWatchers

Posted by Unknown Monday, December 17, 2012 0 comments
AppId is over the quota
AppId is over the quota

View the original article here


Read more ....

Many Adults Caring for Elderly Parents Say They'll Tap Retirement Savings to Help Their Parents Financially (PDF)

Posted by Unknown Sunday, December 16, 2012 0 comments
AppId is over the quota
AppId is over the quota
%PDF-1.4 %???? 240 0 obj <> endobj xref 240 40 0000000016 00000 n 0000001766 00000 n 0000001887 00000 n 0000002306 00000 n 0000002420 00000 n 0000003511 00000 n 0000003944 00000 n 0000004313 00000 n 0000004768 00000 n 0000005896 00000 n 0000006894 00000 n 0000007971 00000 n 0000008994 00000 n 0000010018 00000 n 0000011044 00000 n 0000011882 00000 n 0000015086 00000 n 0000015199 00000 n 0000015228 00000 n 0000015303 00000 n 0000015381 00000 n 0000015460 00000 n 0000015539 00000 n 0000015618 00000 n 0000015764 00000 n 0000015910 00000 n 0000016219 00000 n 0000016274 00000 n 0000016390 00000 n 0000016514 00000 n 0000016592 00000 n 0000017008 00000 n 0000018794 00000 n 0000018872 00000 n 0000019036 00000 n 0000019115 00000 n 0000019236 00000 n 0000019382 00000 n 0000019737 00000 n 0000001096 00000 n trailer <]/Prev 863453>> startxref 0 %%EOF 279 0 obj <>stream h?b```b``9?????V? `

View the original article here


Read more ....

Mercer Workplace Survey, 2012

Posted by Unknown Saturday, December 15, 2012 0 comments
Mercer Workplace Survey, 2012 (Mercer)
"Facing an unconvincing economic recovery, workers are nonetheless extending their new commitment to retirement savings both inside and outside their workplace retirement plans. 401(k) and other retirement savings are on the way up again. Feeling vulnerable and out of time, older workers especially are funding their 401(k)s more generously.... Participants are also finding the overall benefits landscape more difficult to navigate this year than last with perceived complexity up and quality of information down, a striking reversal of historic experience. At the same time, this insured population of workers is ever more skeptical of national health care reform and what it will mean to them and their personal circumstances."
Important word about authorship:
BenefitsLink ® (BenefitsLink.com) provides this page for you, with a hypertext link to an item we think is interesting and valuable for companies sponsoring employee benefit plans, employees who participate in plans, and firms who provide products and services to plans. But BenefitsLink is not the author of the item to which this hypertext link will take you (unless expressly indicated there).

View the original article here


Read more ....

All or Nothing? An Expanded Perspective on Retirement Readiness (PDF)

Posted by Unknown Friday, December 14, 2012 0 comments
All or Nothing? An Expanded Perspective on Retirement Readiness (PDF) (EBRI)
"Approximately 44 percent of the Baby Boomer and Gen-Xer households are simulated to be at-risk of running short of money in retirement assuming they retire at age 65 and retain any net housing equity in retirement until other financial resources are depleted.... Nearly one-half (49.1 percent) of Gen Xers have at least 20 percent more than is simulated to be needed; approximately one-third (31.4 percent) have between 80-120 percent of the financial resources necessary to cover the retirement expenses and uninsured health care costs; and about 1 in 5 (19.4 percent) are projected to have less than 80 percent of what is needed."
Important word about authorship:
BenefitsLink ® (BenefitsLink.com) provides this page for you, with a hypertext link to an item we think is interesting and valuable for companies sponsoring employee benefit plans, employees who participate in plans, and firms who provide products and services to plans. But BenefitsLink is not the author of the item to which this hypertext link will take you (unless expressly indicated there).

View the original article here


Read more ....

Are you frustrated with 8955-SSA or 1099 filings this year?

Posted by Unknown Wednesday, December 12, 2012 0 comments
AppId is over the quota
AppId is over the quota
Select any of the menu options at the top of your screen to learn more.


Sorry, I could not read the content fromt this page.

View the original article here


Read more ....

Continued Success of U.S. Retirement System Likely Despite Shift from DB to DC Plans (PDF)

Posted by Unknown Tuesday, December 11, 2012 0 comments
Continued Success of U.S. Retirement System Likely Despite Shift from DB to DC Plans (PDF) (Investment Company Institute)
"The U.S. retirement system has successfully provided adequate retirement resources to generations of Americans....The shift in private-sector retirement plans from predominantly defined benefit (DB) plans to predominantly defined contribution (DC) plans is unlikely to reduce retirement preparedness.... Rather than the traditional three-legged stool analogy, a pyramid is a more accurate depiction of the resources Americans rely on in retirement."
Important word about authorship:
BenefitsLink ® (BenefitsLink.com) provides this page for you, with a hypertext link to an item we think is interesting and valuable for companies sponsoring employee benefit plans, employees who participate in plans, and firms who provide products and services to plans. But BenefitsLink is not the author of the item to which this hypertext link will take you (unless expressly indicated there).

View the original article here


Read more ....

Java ConCurrentHashMap explained.

Posted by Unknown Sunday, December 9, 2012 0 comments
This is the best explaination after 30 mins google search. 

http://ria101.wordpress.com/2011/12/12/concurrenthashmap-avoid-a-common-misuse/

Posted at 04:48PM Nov 13, 2012 by ray bao in Java  | 


View the original article here


Read more ....

An easier way to exclude methods from Grails JMX plugin services

Posted by Unknown 0 comments
20121029 Monday October 29, 2012

An easier way to exclude methods from Grails JMX plugin services The Grails JMX plugin is a great way to quickly make a service available through JMX. Things get trickier when you want to only expose a few methods on the service. The plugin provides the option to list methods to exclude, but you need to list all of them including the ones Grails added to the service. Fortunately, we can use the metaclass to help us out. We can add a list of the few methods we want exposed and then use to that to generate the list of exclude method as follows: (2012-10-29 22:58:51.0) Permalink


View the original article here


Read more ....

Griffon vs Eclipse4: First Round

Posted by Unknown 0 comments
I've been doing Eclipse RCP development for the past 2 months as part of my day job (nope, Swing is not dead, it just so happens the customer is an Eclipse shop), and while we used Eclipse 3.x initially we switched to Eclipse 4.x in recent weeks. Now, everyone following Eclipse knows that in the last 3 years there's been a big change when migrating from Eclipse 3.x to Eclipse 4.x, mainly due to a full overhaul in the platform's design. As someone staying in the periphery of the Eclipse community I couldn't help but to notice some similarities between Eclipse 4.x and Griffon.

Serendipity stroke during Øredev as I met with Lars Vogel (@vogella) during one of the breaks. We chatted for a while about our respective frameworks just to discover how similar in spirit and features they are. The following is a list of such features, and I'm just scratching the surface.


Eclipse4: Provides DI facilities implementing the standard javax.inject annotations plus a pair of extensions (@Optional and @Preference). I cannot stress enough how lightweight this mechanism is, and how easy is to get going with DI. Eclipse 4 follows a well defined pattern to find out the container of a particular instance when injection must take place. Lars has written an excellent tutorial on how to get started with Eclipse RCP applications under the new design; the dependency injection chapter contains a detailed description on this feature.


Griffon: All MVC members are automatically injected by name; this is how model and controller get injected into a View script. Also, service instances defined as properties on controllers follow the same rules. However, there are standard extensions that provide DI and more: spring, weld and guice. There's also the recent addition of a resource injection API that greatly simplifies setting up i18n aware resources.


Eclipse4: Dealing with events requires two parts: a component that can trigger events, the other is a set of event handlers. The first part is provided by IEventBroker, a platform instantiated broker that can trigger events asynchronously (post) and synchronously (send). Here's some sample code showcasing this part:

public class SomeBean { @Inject private IEventBroker eventBroker; public void doit() { eventBorker.send("MY_SYNC_EVENT", "event data (sync)"); eventBorker.post("MY_ASYNC_EVENT", "event data (async)"); }}

Handling events requires the usage of special annotations on method arguments, either @EventTopic or @UIEventTopic, the latter makes sure the event handler is invoked inside the UI thread. So, this is how a component can handle the previously defined events

public class MyEventHandler { @Inject public void eventHandlerMethod1(@EventTopic("MY_ASYNC_EVENT") String data) { assert "event data (async)".equals(data); } @Inject public void eventHandlerMethod2(@EventTopic("MY_SYNC_EVENT") String data) { assert "event data (sync)".equals(data); }}

Once more, Lars made sure to publish a great tutorial on event handling.


Griffon: like in Eclipse, there are two parts involved with event publishing and handling: The EventRouter and event handlers. However Griffon's event mechanism differs a bit from Eclipse's. To begin with EventRouter may publish events in 3 modes

synchronouslyasynchronouslyhybrid

The last one sends the event (sync) if the current thread is not the UI thread, otherwise it issues a post (async). The application instance is normally used as the event publisher, like so

class SampleController { void doSomething(ActionEvent evt) { app.event('MySyncEvent', ['some data (sync)']) app.eventAsync('MyAsyncEvent', ['some data (async)']) }}

In Eclipse, all event handlers are automatically discovered during boot time (here's why understanding E4's DI is so important). In Griffon however you must specify which instances may become event handlers. But, to simplify things all controller and service instances are automatically registered as event handlers. Here's how another controller may react to the previously defined events

class AnotherController { def onMySyncEvent = { String data -> assert data == 'some data (sync)' } void onMyAsyncEvent(String data) { assert data == 'some data (async)' }}

Handlers must follow a naming convention, they can either be Closure properties (as the first case) or methods (as the second case). Developers may event define these event handlers in the following way

class AnotherController { void mvcGroupInit(Map args) { app.addApplicationEventHandler([ MySyncEvent: { assert it == 'some data (sync)' }, MyAsyncEvent: { assert it == 'some data (async)' } ]) }}

Griffon goes further by allowing any component to become a local event bus, just by annotating it with @EventPublisher

@griffon.transform.EventPublisherclass Pulser { void pulse() { publishEvent('HeartBeat') }}// at some other placepulser.addEventListener('HeartBeat', {println System.nanoTime()})

Eclipse4: Though SWT is the default UI toolkit of choice when writing Eclipse RCP application it's not the only option, as Kai Tödter has demonstrated in this entry at his blog. SWT, Swing and JavaFX; all work with Eclipse4 thanks to it's renderer framework. There's even a Vaadin port!


Griffon: Swing is the default UI toolkit of choice for Griffon as there are no additional JARs required other than the standard JDK to get started. But of course, being a framework that embraces choices it also provides support for SWT, JavaFX, Pivot and Qt. There's no equivalent for web based rendering, then again that's what Grails is for in the first case (and much more!).


Eclipse4: Given the different renderers supported by the platform there's an inherent need to provide a base abstraction on top that deals with the UI thread, as every toolkit makes its own assumptions and provides its own rules. Eclipse provides UISynchronizer to deal with this.


Griffon: Likewise, Griffon provides it's own UI thread abstraction in terms of UIThreadManager.


I'll continue my research on Eclipse 4 during the following weeks, the initial findings make me think there's a high chance that integration between both platforms is possible, whether that means a Griffon powered Eclipse RCP application or a Griffon application driven by an Eclipse4 kernel remains to be seen.


Keep on Groovying!


eclipse griffon groovy


View the original article here


Read more ....

Griffon: Bringing back the fun to desktop development

Posted by Unknown 0 comments
Update: The article was written by the time Griffon 0.9.5 came out. During this period additional plugins such as actions, i18n and i18n-support were required to make the application work. These plugins are no longer needed since Griffon 1.1.0. Furthermore, their usage is highly discouraged as Griffon 1.1.0 provides the same behavior.

The following article appeared in Java Tecth Journal, April 2012.


Building desktop applications can be an enjoyable experience if you’re willing to thrown in a bit of Groovy into the mix. Griffon is an application framework that follows the spirit of Grails to bring back the fun to desktop development.


by Andres Almiray


"Desktop application development", a term that isn't heard much these days as web development nor concurrency and parallelism are, however that doesn't mean it's dead as some proclaim. There are indeed some industry sectors where a desktop application is the top alternative for solving a particular problems, in some other environments it's the only choice for security reasons. Think of financial institutes, banks, the health industry, biological research, chemical laboratories, satellite operations and the military; just to name a few. All of them impose a particular set of restrictions where desktop applications excel over web applications, such as security, access to local resources, devices and port communications. The other thing they have in common is Griffon. Yes, the Griffon framework has helped teams in all those industries and spaces to get the job done.


You may have heard of Griffon before but still wonder what it is. In short, it's a desktop application platform for the JVM. It has strong roots in the Groovy community as the project is the brain child of the Groovy Swing team: Danno Ferrin, James Williams and myself. That being said, you may excuse me if I get a bit excited explaining some of Griffon's features, as I'm very fond on the project. A key driving force behind the framework's design is that it should be easy to pick up by Java developers. It should also enable quick coding cycles while keeping the source nice and tidy. Finally the productivity gains and the fun factor must be immediately perceived. For these reasons the team decided to follow in the steps of the Grails framework and its community. There are a lot of similarities between both frameworks. For instance, both have a command line interface that helps you get around with the usual tasks of creating, building, packaging and deploying applications. Both frameworks leverage the Groovy language as a glue for their respective software stacks. The tool integration is also quite good, as major IDEs and popular text editors offer good support for dealing with this kind of projects.


But enough of the theory, let's get some practice! The rest of this article will be devoted to building a simple addressbook application. We'll definitely won't build a full-fledged application in the few pages that we have to spare but it it's my hope that all the things to be discussed will give you enough pointers to get you going with the framework.


The first step is to download and configure Griffon on your computer; there are several choices for doing so. If you pick the universal installer from the download page it will unpack the binaries and configure the path environments for you, particular on Windows platforms. Or if you're on Linux machines you can give it a try to either the RPM or Debian based packages. ZIP or TGZ packages may work as your last resort. Simple download the package, uncompress it on a directory of your choosing -- preferably one without spaces. Next configure an environment variable GRIFFON_HOME pointing to the directory where the Griffon binary distribution was unpacked. Lastly make sure that the PATH environment variable contains a reference to GRIFFON_HOME/bin. If all goes well invoking griffon command with the --version flag turned on should display a similar output as the following one

$ griffon --version------------------------------------------------------------ Griffon 0.9.5------------------------------------------------------------ Build: 15-Mar-2012 12:56 PM Groovy: 1.8.6 Ant: 1.8.2 Slf4j: 1.6.4 Spring: 3.1.0.RELEASE JVM: 1.6.0_29 (Apple Inc. 20.4-b02-402) OS: Mac OS X 10.6.8 x86_64

Alright. Time to get down to business.


First things first, how do we create an application? Typically you may the maven based approach and select an appropriate archetype to bootstrap a project. Or you just can simple create a new directory, fetch some Ant scripts and be done with it. Or let your trusty IDE decided. Choices, choices, choices. The griffon command line tool is here to help. Every Griffon application starts in the same way, by invoking the following command

$ griffon create-app addressbook$ cd addressbook

You'll notice a furry of lines in the output. Go ahead and inspect the contents of the newly created application if you want. The create-app command initializes the application by creating several directories and some files. One of these directories is of particular importance, it's name is griffon-app. Within this directory you'll find another set of directories that help keeping the source code organized. Figure 1 shows the expanded content of the griffon-app directory as created moments ago


addressbook1


Figure 1: Contents of the addressbook application


As you can appreciate, Griffon makes use of the MVC pattern to arrange the elements that comprise an application. When an application is created you'll also get an initial MVC group whose name matches the name of the application. Inside each MVC member there's enough code to make the application run. Yes, believe it or not the application is ready to be launched. Go back to the console and execute the following command

$ griffon run-app

This should compile the application sources, package resources, roundup dependencies and launch the application. In a matter of seconds you should see a window popping up, like the one shown in Figure 2.


addressbook2


Figure 2: Addressbook application running for the first time


Granted, it doesn't loom like much but we haven't written a single line of code yet! If you open up the file griffon-app/views/addressbook/AddressbookView.groovy you'll find the following inside


Listing 1

package addressbookapplication(title: 'addressbook', preferredSize: [320, 240], pack: true, //location: [50,50], locationByPlatform:true, iconImage: imageIcon('/griffon-icon-48x48.png').image, iconImages: [imageIcon('/griffon-icon-48x48.png').image, imageIcon('/griffon-icon-32x32.png').image, imageIcon('/griffon-icon-16x16.png').image]) { // add content here label('Content Goes Here') // delete me}

What we see here is a Swing based Domain Specific Language (or DSL for short) based on a popular Groovy feature: builders. In our particular case we're dealing with SwingBuilder. Builders are but a collection of nodes and rules that know how to build hierarchical structures. It so happens that a Swing UI is comprised of a tree of components. In the View we can observe a top level node named application and some properties being applied to it. Next we see a child node named label with a single text entry. You may recognize the code structure with what's shown by Figure 2. That's the power of the Swing DSL. The code and the UI resemble each other a lot, it's quite easy to follow how components are structured when reading the DSL.


Now that we have seen a bit of code in the Views let's continue with this MVC member, we'll cover the other 2 in moment. In the spirit of keeping things simple we'll update the UI so that it looks like Figure 3


addressbook3


Figure 3: New looks for the addressbook application


Let's decompose each section. On the left we see a white space with a title 'Contacts'. This will be a list that holds all the contacts in our addressbook. In the middle we see a form that we may use to edit the details of a particular contact found in the list. Next on the right we discover a series of buttons that will perform operations on a contact. You may also appreciate a menu named 'Contacts' which contains menu items with the same names as the buttons. Listing 2 describes the updated AddressbookView


Listing 2

package addressbookapplication(title: 'Addressbook', pack: true, resizable: false, locationByPlatform:true, iconImage: imageIcon('/griffon-icon-48x48.png').image, iconImages: [imageIcon('/griffon-icon-48x48.png').image, imageIcon('/griffon-icon-32x32.png').image, imageIcon('/griffon-icon-16x16.png').image]) { menuBar { menu('Contacts') { controller.griffonClass.actionNames.each { name -> menuItem(getVariable(name)) } } } migLayout(layoutConstraints: 'fill') list(model: eventListModel(source: model.contacts), constraints: 'west, w 180!', border: titledBorder(title: 'Contacts'), selectionMode: ListSelectionModel.SINGLE_SELECTION, keyReleased: { e -> // enter/return key if (e.keyCode != KeyEvent.VK_ENTER) return int index = e.source.selectedIndex if (index > -1) model.selectedIndex = index }, mouseClicked: { e -> // double click if (e.clickCount != 2) return int index = e.source.locationToIndex(e.point) if (index > -1) model.selectedIndex = index }) panel(constraints: 'center', border: titledBorder(title: 'Contact')) { migLayout(layoutConstraints: 'fill') for(propName in Contact.PROPERTIES) { label(text: GriffonNameUtils.getNaturalName(propName) + ':', constraints: 'right') textField(columns: 30, constraints: 'grow, wrap', text: bind(propName, source: model.currentContact, mutual: true)) } } panel(constraints: 'east', border: titledBorder(title: 'Actions')) { migLayout() controller.griffonClass.actionNames.each { name -> button(getVariable(name), constraints: 'growx, wrap') } }}

We can see the menuBar node we mentioned earlier. We can also see three main components: a list that will be placed on the west side; a panel in the middle that somehow creates a pair or label and textField for each property found in a list of properties. then we see the third component, a panel that holds buttons. The code may look a bit magical at first glance but really what we're doing is taking advantage of the conventions laid out by Griffon. A View MVC member has access to the other two members, that is the Model and the Controller. the job of the View is to laid out the UI components. The job of the Controller is to hold the logic that reacts to user input. The job of the Model is to server as a communication bridge between View and Controller. We can see references to a model and a controller variables in the View; this variables point to their respective MVC members.


Next we'll update the Model found in griffon-app/models/addressbook/AddressbookModel.groovy. Here we'll make sure the Model keeps a list of contacts in memory; it will also hold a reference to the contact currently being edited. We'll make use of GlazedLists (a popular choice among Swing developers) to organize the list of contacts. Listing 3 shows all the code that's required to build the list and keep a reference to the currently edited contact. Now, the contacts list has a special binding defined in relation to its elements. Whenever an element is edited it will publish a change event that the list will intercept; the list in turn will update whoever is interested in lists changes. Looking back to Listing 2 you can see that the list definition makes use of a listEventModel node. This is exactly the component that will notify the UI whenever an update is available, this repainting the affected region. And we only had to connect a pair of components for this to happen! The AddressbookModel works with two domain specific classes: Contact and ContactPresentationModel. The first can be seen as a plain domain class, as it defines what a contact should be in terms of simple properties. The latter is an observable wrapper around the Contact class. Presentation models are usually decorators that can support binding operations. We'll see these two classes in just a moment.


Listing 3

package addressbookimport groovy.beans.Bindableimport ca.odell.glazedlists.*import griffon.transform.PropertyListenerimport java.beans.PropertyChangeEventimport java.beans.PropertyChangeListenerclass AddressbookModel { final EventList contacts = new ObservableElementList( GlazedLists.threadSafeList( new BasicEventList()), GlazedLists.beanConnector(ContactPresentationModel) ) final ContactPresentationModel currentContact = new ContactPresentationModel() @PropertyListener(selectionUpdater) @Bindable int selectedIndex = -1 private selectionUpdater = { e -> currentContact.contact = contacts[selectedIndex].contact } AddressbookModel() { currentContact.addPropertyChangeListener(new ModelUpdater()) } private class ModelUpdater implements PropertyChangeListener { void propertyChange(PropertyChangeEvent e) { if(e.propertyName == 'contact' || selectedIndex < 0) return contacts[selectedIndex][e.propertyName] = e.newValue } } void removeContact(Contact contact) { currentContact.contact = null ContactPresentationModel toDelete = contacts.find { it.contact == contact } if(toDelete != null) contacts.remove(toDelete) }}

But before we show the domain let's cover the final MVC member: the Controller. It's the job of the controller to react to user input and orchestrate the flow of information. For now we only need to fill in the blanks to make the application work again, for example by pasting the code shown in Listing 4 into griffon-app/controllers/addresbook/AddressbookController.groovy


Listing 4

package addressbookclass AddressbookController { def model void newAction(evt) { } void saveAction(evt) { } void deleteAction(evt) { }}

Do you remember that Models mediate data between Controllers and Views? That's precisely why there's a model property on the controller class. Griffon sports a basic dependency injection mechanism that will assure each MVC member can talk to the other two as long as certain properties are defined in their respective classes. The Domain If you're a Grails developer you may have noticed we did not start by modeling the domain, which is the usual case when working with Grails applications. There are two reasons for making this choice. First, to show you the basics of the MVC members and how they interact with each other. The second is that Griffon does not support domain classes out of the box, at least not as Grails understands it, that is, there's no GORM API for Griffon, yet. But we can manage ourselves by writing simple domain classes. Here's for example how the Contact domain class may look like


Listing 5

package addressbook@groovy.transform.EqualsAndHashCodeclass Contact { long id String name String lastname String address String company String email String toString() { "$name $lastname : $email" } static final List PROPERTIES = ['name', 'lastname', 'address', 'company', 'email']}

This class can be defined in the file src/main/addressbook/Contact.groovy. Next to it we'll define the companion presentation model, in src/main/addressbook/ContactPresentationModel.groovy with the following code in it


Listing 6

package addressbookimport groovy.beans.Bindable@griffon.transform.PropertyListener(propertyUpdater)class ContactPresentationModel { // attributes @Bindable String name @Bindable String lastname @Bindable String address @Bindable String company @Bindable String email // model reference @Bindable Contact contact = new Contact() private propertyUpdater = { e -> if(e.propertyName == 'contact') { for(property in Contact.PROPERTIES) { def bean = e.newValue delegate[property] = bean != null ? bean[property] : null } } } String toString() { "$name $lastname" } void updateContact() { if(contact) { for(property in Contact.PROPERTIES) { contact[property] = this[property] } } }}

As we mentioned before, the domain class is simple in it's design; it only needs to be concerned with the data we want to keep. The presentation model on the other hand mirrors the domain class by having the same properties but with a slight modification: each one of them is observable. This means that whenever the value of any of those properties changes an event will be fired. These events are the ones that enable binding. Griffon makes use of the @Bindable annotation to instruct the Groovy compiler to inject a set of instructions into the byte code that makes this class an observable one. @Bindable belongs to a set of special interfaces found in the Groovy language that open the door for byte code manipulation. This set is know as AST transformations. There's another AST transformation found in this code, it's @PropertyListener. This transformation is a fancy way to define an attach a PropertyChangeListener on a particular class and property. In our case, we're attaching a PropertyChangeListener that reacts on all property changes. The next effect of all the code we have in Listing 6 is that when a Contact instance is attached to an instance of ContactPresentationModels all of the property values will be copied from the contact to the model. The reverse operation will take effect when the updateContact() method is called.


Good. We're almost ready to run the application again. But before we do we must install a group of plugins that will make our life easier. We said we'll make use of GlazedLists, this library is provided by a plugin so we'll install that. In the view we make use of MigLayout, so we'll install a plugin for it too. Finally we'll install another plugin that makes creating UI actions based on controller methods a breeze. Go to your console prompt and type the following commands

$ griffon install-plugin glazedlists$ griffon install-plugin miglayout$ griffon install-plugin actions

After a few lines of output for each plugin install we have all that's needed to run the application again.


Time to finish up the application. We have a few tasks ahead of us:

Fill the code required by each controller actionSave the contact list to a databaseMake sure to load the contacts from the database when the application starts up

Filling up the actions is a straight forward operation as the bulk of the data manipulation is already taken care of by the bindings we have put in place. Listing 7 shows the final code for AddressbookController


Listing 7

package addressbookclass AddressbookController { def model def storageService void newAction(evt) { model.selectedIndex = -1 model.currentContact.contact = new Contact() } void saveAction(evt) { // push changes to domain object model.currentContact.updateContact() boolean isNew = model.currentContact.contact.id < 1 // save to db storageService.store(model.currentContact.contact) // if is a new contact, add it to the list if(isNew) { def cpm = new ContactPresentationModel() cpm.contact = model.currentContact.contact model.contacts << cpm } } void deleteAction(evt) { if(model.currentContact.contact && model.currentContact.contact.id) { // delete from db storageService.remove(model.currentContact.contact) // remove from contact list execInsideUIAsync { model.removeContact(model.currentContact.contact) model.selectedIndex = -1 } } } void dumpAction(evt) { storageService.dump() } void mvcGroupInit(Map args) { execFuture { List list = storageService.load().collect([]) { new ContactPresentationModel(contact: it) } execInsideUIAsync { model.contacts.addAll(list) } } }}

The first action, newAction, is concerned by reseting the current selection (if any) and creating an empty Contact. The saveAction() should push the changes from the presentation model back to the domain object, store the data in the database and in the case that this is a new contact, add it to the list of contacts. Notice that when dealing with database concerns we'll delegate to another component called storageService which we'll see right after we finish describing the Controller. The third action deletes a contact first by removing it from the database then removing it from the contacts list. We added fourth action that will be used to dump the database contents into the console. The last pice of information found int he code relates to loading the data from the database and filling up the contacts list. The method name is special as it's a hook into the MVC lifecycle. This particular method will be called after all MVC members have been instantiated, think of it as a member initializer. We're ready to have a look at the storageService component.


Services in Griffon are nothing more than regular classes but they receive special treatment from the framework. For example, they are treated as singletons and will be automatically injected into MVC members as long as the member defines a property whose name matches the service name. Armed with this knowledge we'll create a StorageService class, like this

$ griffon create-service storage

This will create a file in griffon-app/services/addressbook/StorageService.groovy with default content. Listing 8 shows the code that must be put inside that file for the application to work


Listing 8

package addressbookclass StorageService { List load() { withSql { dsName, sql -> List tmpList = [] sql.eachRow('SELECT * FROM contacts') { rs -> tmpList << new Contact( id: rs.id, name: rs.name, lastname: rs.lastname, address: rs.address, company: rs.company, email: rs.email ) } tmpList } } void store(Contact contact) { if(contact.id < 1) { // save withSql { dsName, sql -> String query = 'select max(id) max from contacts' contact.id = (sql.firstRow(query).max as long) + 1 List params = [contact.id] for(property in Contact.PROPERTIES) { params << contact[property] } String size = Contact.PROPERTIES.size() String columnNames = 'id, ' + Contact.PROPERTIES.join(', ') String placeHolders = (['?'] * size + 1)).join(',') sql.execute(“””insert into contacts ($columnNames) values ($placeHolders”””, params) } } else { // update withSql { dsName, sql -> List params = [] for(property in Contact.PROPERTIES) { params << contact[property] } params << contact.id String clauses = Contact.PROPERTIES.collect([]) { prop -> "$prop = ?" }.join(', ') sql.execute(“””update contacts set $clauses where id = ?”””, params) } } } void remove(Contact contact) { withSql { dsName, sql -> sql.execute('delete from contacts where id = ?', [contact.id]) } } void dump() { withSql { dsName, sql -> sql.eachRow('SELECT * FROM contacts') { rs -> println rs } } }}

Each one of the service methods makes use of a method name withSql. This method becomes available if we install another plugin. Let's do that now

$ griffon install-plugin gsql

Perfect. We now have enabled Groovy SQL support in our little application. Groovy SQL is another DSL on top of regular SQL. With it you can make SQL calls using a programmatic API that closely resembles working with objects and object graphs. As a matter of fact you can even apply Groovy closures, Groovy strings, and other Groovy tricks, like those shown in the implementation of the StorageService class. There are two more items we must take care of before launching the application again. We must tell the GSQL plugin that the withSql method must be applied to services; secondly we must define the database schema. As we said earlier there's no GORM API yet, database schemas must be defined by hand.


The first task is accomplished by editing the file griffon-app/conf/Config.groovy and appending the following line

griffon.datasource.injectInto = ['service']

The second task gets done by creating a file in griffon-app/resources/schema.ddl with the following content

DROP TABLE IF EXISTS contacts;CREATE TABLE contacts( id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, address VARCHAR(100) NOT NULL, company VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL);

Good, we're done. What about seeding the database with some initial data? In Grails this is done by editing a file named BootStrap.groovy, in Griffon it's done by editing griffon-app/conf/BootstrapGsql.groovy. Let's add an entry to the contacts table, as Listing 9 shows


Listing 9

import groovy.sql.Sqlclass BootstrapGsql { def init = { String dataSourceName = 'default', Sql sql -> def contacts = sql.dataSet('contacts') contacts.add( id: 1, name: 'Andres', lastname: 'Almiray', address: 'Kirschgartenstrasse 5 CH-4051 Switzerland', company: 'Canno Engineering AG', email: 'andres.almiray@canoo.com' ) } def destroy = { String dataSourceName = 'default', Sql sql -> }}

Phew. Now we're really done. Launch the application once more. You should see one entry in the contacts list as Figure 4 shows. Select it with the mouse and either press enter or double click on it. this will make the contact the active one and place all of its values in the middle form. Edit some of its properties then click on the save button. Create a new contact and save it too. Now click on the dump button. You should see as many rows in he output as entries can be found in the contacts list.


addressbook4


Figure 4: Addressbook application with one entry selected


We have had quite the whirlwind tour on the Griffon basics. Granted, there are more things that meet eye in just a few pages and code listings. I hope this has been enough to wet your appetite for more, or at least consider giving Griffon a try. All of the behavior we wrote so far fits in a mere 291 lines of code. Don't believe me? Run the following command

$ griffon stats

A table listing all sources by type will appear, similar to this one

+----------------------+-------+-------+| Name | Files | LOC |+----------------------+-------+-------+| Models | 1 | 32 | | Views | 1 | 45 | | Controllers | 1 | 39 | | Services | 1 | 57 | | Lifecycle | 5 | 3 | | Groovy/Java Sources | 2 | 40 | | Unit Tests | 1 | 13 | | Integration Tests | 1 | 15 | | Configuration | 2 | 47 | +----------------------+-------+-------+| Totals | 15 | 291 | +----------------------+-------+-------+

Nice. The full source code for this application can be found at Github. There more things that we could add to this application, for example there's no error handling whatsoever. What if SQL is not your cup of tea? No problem, you can pick any of the supported NoSQl options. Or maybe Swing is not for you. No problem either, Griffon supports SWT and JavaFX as well. Changing UI toolkits will mean changing the View mostly while keeping the other components almost intact. There are definitely many choices ahead of you.


Andres Almiray, a Java/Groovy developer with more than 12 years of experience in software design and development. He has been involved in web and desktop application development since the early days of Java. His current interests include Groovy and desktop apps. He is a true believer of open source and has participated in popular projects like Groovy, Griffon, JMatter and DbUnit, as well as starting his own projects (Json-lib, EZMorph, GraphicsBuilder, JideBuilder). Founding member and current project lead of the Griffon framework. He likes to spend time with his beloved wife, Ixchel, when not hacking around.


griffon groovy


View the original article here


Read more ....

Eclipse e4 branch quality stats

Posted by Unknown 0 comments
Just read mail from Paul and did some bugzilla math: here is a fact based, non-biased look on the Eclipse e4 branch quality based on first "fiscal quarter" since Eclipse Juno release (Eclipse 4.2, first Eclipse release based on the e4 UI technology).  

Let's start with a citation from the attached mail posted on e4 mailing list: "The Platform UI team will be focusing on regressions and performance for the next while, and not on new features for Kepler yet." Kepler is the next planned Eclipse release, and the list of the most important bugs to fix provided in this mail is also worth to read.


Let's now check the entire list of already known e4 bugs:


https://bugs.eclipse.org/bugs/buglist.cgi?bug_severity=blocker&bug_severity=critical&bug_severity=major&bug_severity=normal&bug_severity=minor&bug_severity=trivial&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&classification=Eclipse&component=UI&product=e4&product=Platform&query_format=advanced&version=4.0&version=4.1&version=4.2&version=4.2.2&version=4.3&version=4.2.1&order=priority%2Cbug_severity&limit=0


As of today it shows: 884 bugs found, reported in 3 years, with the average rate 295 bugs / year.


For better comparison here is the list of all other platform UI bugs (not e4 related), since beginning of Eclipse:


https://bugs.eclipse.org/bugs/buglist.cgi?bug_severity=blocker&bug_severity=critical&bug_severity=major&bug_severity=normal&bug_severity=minor&bug_severity=trivial&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&classification=Eclipse&component=UI&product=Platform&query_format=advanced&version=1.0&version=2.0&version=2.0.1&version=2.0.2&version=2.1&version=2.1.1&version=2.1.2&version=2.1.3&version=3.0&version=3.0.1&version=3.0.2&version=3.1&version=3.1.1&version=3.1.2&version=3.2&version=3.2.1&version=3.3&version=3.2.2&version=3.3.1&version=3.4&version=3.3.2&version=3.4.1&version=3.4.2&version=3.5&version=3.6&version=3.5.1&version=3.5.2&version=3.7&version=3.6.1&version=3.6.2&version=3.7.1&version=3.8&version=3.7.2&version=3.8.1&order=priority%2Cbug_severity&limit=0


As of today it shows: 3137 bugs found, reported in 11 years, with the average rate 285 bugs / year.


Average yearly bug rates are very similar for e4 and 3.x streams, so the first impression after comparison would be that e4 quality is similar to 3.x stream. Nothing surprising so far.


But e4 was only ~3 months a "mainstream" release, not 3 years, so it was exposed to the end users only ~4 months now. 


Let's take e4 recent 6 and 3 months results (Eclipse Juno based first time on e4 was released 27 June 2012) and check how e4 branch quality looks like if being exposed to the "mainstream" end users:


https://bugs.eclipse.org/bugs/buglist.cgi?bug_severity=blocker&bug_severity=critical&bug_severity=major&bug_severity=normal&bug_severity=minor&bug_severity=trivial&classification=Eclipse&chfieldto=2012-10-22&chfield=%5BBug%20creation%5D&query_format=advanced&chfieldfrom=2012-04-22&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&version=4.0&version=4.1&version=4.2&version=4.2.1&version=4.2.2&version=4.3&version=4.2.1&component=UI&product=e4&product=Platform


311 bugs in last 6 months => 6220 in 10 years.


https://bugs.eclipse.org/bugs/buglist.cgi?bug_severity=blocker&bug_severity=critical&bug_severity=major&bug_severity=normal&bug_severity=minor&bug_severity=trivial&classification=Eclipse&chfieldto=2012-10-22&query_format=advanced&chfield=%5BBug%20creation%5D&chfieldfrom=2012-07-22&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&version=4.0&version=4.1&version=4.2&version=4.2.1&version=4.2.2&version=4.3&version=4.2.1&component=UI&product=e4&product=Platform


176 bugs in last 3 months => 7 040 in 10 years.


Now the bug counts projection for e4 is doubling the 3.x stream, and one also can see that bug creation rate is increasing steadily. This  are very alarming numbers.


Anyone here to explain those numbers?


View the original article here


Read more ....

First Impressions of Android Development

Posted by Unknown 0 comments
First Impressions of Android Development

I started doing iOS development around 4 years ago. It‘s certainly not perfect, but developing for it is totally different than the way you work with the largely open source based stacks that have come to dominate the Java World. There‘s documentation, sample apps, and stuff works. Having written an app for the iPhone that I needed to port, I have finally started into the Android World, seriously, with an open mind. So far, there are some good things, but to my mind, a dispassionate comparison to iOS would make Obama‘s electoral college victory look like a squeaker. Since I‘ve shown myself incapable of dispassionate analysis, I‘ll give my usual screed format, hoping (genuinely) that others can perhaps tell me where I‘m reading the gauges wrong.


When cars get reviewed or examined, there‘s a list of expectations that we have that together constitute our notion of what a modern car should be. For me, TDD provisions would literally be the first item on the list. In his seminal book, way back in 1994, Bertrand Meyer said garbage collection was a requirement of a modern language (ARC and 10 years of suffering with the VM‘s GC disabused me of that notion), but seriously, if you don‘t think that TDD is an absolutely essential ingredient in a modern framework offering, you are a neanderthal. Apparently, even though Cedric, author of TestNG and a book on testing, was on the Android team, really, seriously, what score does this platform get? I would give it a 2 (out of 10). Their page on ‘Testing Fundamentals‘ (here), reads like ‘I drew the short straw and had a choice between writing this retrospective, dog‘s dinner documentation or train new recruits for the next month..‘ Funny thing is, at first I read this and thought ‘oh, ok, this sounds promising,‘ then the holes in it fed a vortex that gobbled up so much time I started to see spots.


The sale here is that there is an easy way to do end-to-end tests, which is great. Sadly, the reality is that the emulator is a torture device that‘s so slow that you cannot say its suited for work unless the operator is lobotomized. Have these guys ever seen the Simulator in Xcode? Lightning fast and 100% coverage; in short, exactly aha you want in a simulator. When I tried to run my first tests, I seriously lost almost an hour because I was convinced my tests were hanging. Then I was reading threads (how you learn) and came across one where a responder was telling an OP that you have to wait because the test could still be loading. Sure enough, finally got it to work.


Running the app on the device is extremely fast.


The next thing I wanted on the TDD front was to just write a simple unit test. Next task was to call a web service, get some HTML back and parse it. There is an HttpClient inside the android jar. Great. So I want to start with a bunch of unit tests that just parse the HTML. Ok, how do you just write a unit test that is not an integration test? Turns out, like almost everything else, that requires a bunch of reading and the answers are still not forthcoming. Furthermore, android has junit inside it, so you aren‘t just pulling in your own version. I took some time trying to add Hamcrest. That‘s rather simple, but then it gets tangled too because Android‘s version of JUnit is an older one so you don‘t have assertThat in your static import options.


You‘d think there would be a lot of sample code that would include both unit tests and ‘unit‘ integration tests. I couldn‘t find them. There are examples from elsewhere. There are also other testing tools, one that uses mocks Roboelectric, that looks pretty good, but seriously, before you can write a simple app, you have to do all this research and figure out which tree limbs to inch to the end of?


Overall: 2 might be generous. Early on going in this direction, it was pretty clear that even after all this work, there‘s zero chance the result would be as good as iOS where you can just turn things on/off in schema and run them at light speed.


Granted, I have not wandered far into the woods yet, but the framework itself looks really tired. Everything is an action, or an intent, and components are looked up by id, etc. Anemic I don‘t think covers this. Reminds me of and exchange on The McLaughlin Group yesterday where Pat Buchanan said most drug offenders started with pot and Clarence Page‘s response was ‘another study said even more started by drinking milk.‘ If I went into a design meeting to lay out my thoughts about, I dunno, say a model for implementing a nutritional problem and said ‘if you think about it, everything‘s pretty much an action,‘ my guess is that there would be a lot of chuckling.


It‘s also just tiring to see the usual stuff of having to stick casts in all over the place. Seriously?


But even more surprising is this: if the Java World really believes the BS they trumpet from the mountain tops all the time, that its base of open source is what makes it so wonderful, how come Android is an island? The team chose not to use maven (in 2007), not to update JUnit, not to make DI the backbone of its architecture (good choice there, but DI sucked up most of Java‘s energy in said decade). Probably the strongest defense would be ‘well we are doing a platform so we can‘t drag in these other things.‘ Ok, then the great advantages of open source are only available on one layer to users who are at the end of the fabrication chain. Pretty sure that sounds like a bad idea.


Cocoa is not perfect, but either there‘s another clatch of undiscovered docs about Android or this is looking like another huge mismatch.


Already mentioned that the emulator is completely insane. Slow. The wizard to create a new one (and the supporting documentation) is abysmal. The result is unusable.


Working inside eclipse has been ok so far. There are a few wizards for making new things that speed stuff a little bit (of course Xcode‘s are much more extensive, which is inexcusable because I think eclipse is easier to extend, having written some plugins). The code completion works pretty well. I have not used the debugger for much yet. Logging looks a tad more capable in Android as you can create different logs by associating different strings with the logger and each will have its own console.


The design tool is a complete joke next to Interface Builder. I would love to see someone make some screencasts that show someone using this thing to create a simple app or a stub for an app. For sure if you made a split screen where you had one iOS dev and one android dev and gave them a simple app to do that involved stubbing out a few screens and getting some simple navigation working, that‘s going to be not John Henry versus the Steam Engine, more like a featured subject from Hoarders vs. someone who‘s pushed work across an organized desk for some time.


Another mismatch here.


The results on this was completely unexpected to me. I thought surely there would be some form of ORM in Android. Nope. Folks, most projects end up bearing the scars of having been too ambitious, Android just shows at every turn that this was slapped together by madmen who were running to match an existing offering. Again, ORM was one of the things the Java world spent most of its energy on in the same decade, and I have argued, to greatest success. There is none. They expect you to use some stupid helper class and then just push your junk into the database on your own. Really? Again, maybe I am missing some other area of smoldering slag somewhere. Laughably incapable of being compared to iOS which has CoreData. Not perfect, but CD allows me to make a simple diagram, wire up some attributes and relationships, and then have my stuff going in and out of the db, and it has migration tools, etc.


I checked these items with a friend who has been doing a bunch of Android development. He urged me to adopt Roboelectric, the Maven plugin and IntelliJ.


Read a review today of the Nexus. Their conclusion was the iPad beat it primarily because of the better software that was available. Again, the Developer, surprise, sees his role as central. There were probably a ton of reasons to jack Forstall, but if the new Apple is the CFO running the company and the knighted industrial designer ‘designing‘ the software, they are doomed. I am convinced, still, though, that it‘s theirs to lose. Android is not going to get magically fixed; the MFC experience was a good example of how a simplistic, inept core cannot just sprout a capable spawn. Even for the people who are willing to endure some more pain in the name of open, are going to find that the law of diminishing returns quickly starts to be exponential rather than fractional or multiple. In other words, you‘ll start thinking ‘ok, I can add a few ‘if platform()==KINDLE‘ statements where needed,‘ and then wake up one day to a subpar experience that requires a stupid amount of bloodflow to keep alive.

( Nov 12 2012, 07:06:27 PM PST ) Permalink

View the original article here


Read more ....

Project SwingJD Panels Part 3: TitlePanel

Posted by Unknown 0 comments

20121201Saturday 01 December, 2012

SwingJD work Tables, part 3: TitlePanel Table Title:

TitlePanel is a custom swing JPanel. This extends the JPanel and replaces the method paintComponent ().

How TitlePanel looks like?

Table title appearance in various subjects?


Click for more information and source code source and the link below

Project SwingJD Panels Part 3: TitlePanel

Posted by Jeeru (Dec 01, 2011, 10: 59: 19 AM EST) Permalink


View the original article here


Read more ....

Grails script to generate JAXB classes

Posted by Unknown 0 comments
20121127 Tuesday November 27, 2012

Grails script to generate JAXB classes

I think Groovy's MarkupBuilder is great and I use it often. Sometimes though, I need to generate a complex XML document that conforms to an XSD. MarkupBuilder often leads to markup and business logic being mixed together much like HTML and Java code gets mixed in complex JSP pages. In cases like this, I like to use JAXB instead. I can generate classes from the XSD, load up an object model and let JAXB generate the markup.


It's fairly easy to create a script to handle generating the JAXB classes for you. JAXB comes with a handy Ant task that takes your XSD and generates classes. The trick is passing the build classpath to the task. There is a "grailsSettings" variable available in scripts that contains BuildSettings. We can get the list of build dependencies files from this class to generate the classpath. Here is a simple example that takes the Microsoft books.xsd in the etc/schema directory and generates the code to the src/java directory:


UPDATE: Sometimes having the JAXB jars on your path can cause problems with your application. In those cases, you call the generation class directly:

(2012-11-27 22:12:29.0) Permalink

View the original article here


Read more ....

The Failure Free Void

Posted by Unknown 0 comments
20121023 Tuesday October 23, 2012

The Failure Free Void

One of the great things about open source is that, since there is no deadline, and there is no one to run out of money, you can never really call anything a failure. Right? I mean, like the Axis team, who spent a decade trying to make it possible to wrap access to a web service in XML, you can just keep doing the phoenix by adding another number to your project name. Surely, the age of distributed computing that was sought first with the rigid, nerdy nonsense of CORBA, and then promised when EJB was trotted out, must be called for time now, and finally be given, not so much a toe tag, as a drooling bib for excessive development failing to result in advancement past infantilism. The idea that Java was going to finally make weight with 5 and then 6 is starting to look, even by the current (absurd) measures of hype, laughably improbable.


I was reading some documentation the other day about installing Atlassian products. It goes to some pains to explain that you cannot deploy more than one Atlassian product from the same container. Oh, and if you were planning to use a Mac, better not since the Mac JDK is not supported. Finally, to get the issue tracking system JIRA installed, you ought put aside a day or so. You know, to make users, setup a database, get all your launch scripts working, etc. No wonder people do get kind of delirious when they hear about the cloud.


But seriously, do we need to have data centers running 24×7 just because software deploy and config utterly refuses to grow up?? I upgraded tomcat on my mac mini server 2 days ago. From bloody 7.0.24 to 7.0.32. It was so stupid. Usually, that would be a really quick operation, but on the mini, you have to have a plist file to get launchctl to load tomcat. You are probably going to keep that in the tomcat dir. So once you symlink the new version, that‘s gone. Oh, and my JENKINS_HOME was being set in catalina.sh. Then there was the port mapping in server.xml (to 8081) and the connection pool. Finally, there‘s the mysql driver I left lying around in lib. Wait, I forgot, the .sh files had to be chmod‘ed. And the dir and symlink had to be chown‘ed.


Wow, I think maybe IT has to draft and train special therapists. I definitely think my aversion to nerds has developed into a full-blown, knee-jerk autoimmune response at this point. I mean, when things like this upgrade happen, I just start thinking ‘wait, these nerdy little thumbsuckers wean themselves on repeat viewings of life in make believe worlds where technology has mastered everything, and then they watch a few decades go by and think it makes perfect sense for someone climbing a few builds up a release chain, to run around fetching stuff for hours.‘


Here are a few ideas:

so much open source is apache, couldn‘t the apache community get projects to adopt a configuration spec that would guarantee something where as each customization is wrought, the system knows it has been changed and subsequent upgrades could easily coalesce prior changes? Would be cool to do this with something like git. But it also reminds me of John Dvorak‘s true statement that the Registry guaranteed that Windows could never be stable. Transactional control over changes in an environment were known to be a fundamental component of sane quality control in the 1960s.of course, in the spirit of the original impulse of this post, haven‘t we proved with messes like this that distribution requires modularization? why is it not the case that when the server is installed, its coconspirators are installed as well (e.g. the connection pool) and each thing can have its code refreshed without blowing some uninventoried agents to smithereens?maybe it‘s time for declarative configuration, e.g. the combination of a DSL on the write side and a simple output language that can be run on any instance of something that would show all the things that are required and what was provided

An adage that has been around programming for a long time is ‘frameworks promise to do something, given answers to a few required questions.‘ This is the ‘hollywood principle‘ that Spring reduced to warm spit (promised rant coming on why DI is bad). Yet we don‘t apply the same thinking to one of the most basic aspects of computing; configuration.


Of course, along this path, we can find our way back to the core conundrum of open: we have to have the power to customize everything, but we can‘t be bothered to make it possible to reach basic operation without mass tinkering. There is less config in the Apple world because you aren‘t standing up empty boxes on one of 50 supported OS distros, serving your content into one of a bevy of bug ridden browsers. It would be great if someone were ready to offer the best of both worlds. Meantime, I think it‘s clear you‘re never going to be able to install JIRA (one of the most successful ticketing systems) without hours of tinkering, yet a teen can get an app into the app store that people all over the world can download and use.

( Oct 23 2012, 08:55:16 PM PDT ) Permalink

View the original article here


Read more ....

How to Override Java Security Configuration per JVM Instance

Posted by Unknown 0 comments
Override Java Security Configuration per JVM Instance

A post in my new blog explains how to override java.security configuration file per JVM instance, you can read it here.

Posted at 11:35PM Nov 26, 2012 by Eyal Lupu in Java  | 


View the original article here


Read more ....

Installing JIRA as a WAR

Posted by Unknown 0 comments
20121026 Friday October 26, 2012

Installing JIRA as a WAR

Ah, the ironies are a plenty: the archive name (war), the fact that Atlassian‘s newest product is called Bonfire. Finally installed JIRA on my mini server last night and it was hell on earth. Decided to try to install the war. Now, I upgraded the mini to 16GBs of RAM in anticipation of having to run several tomcats, so I plead guilty to being a complete ape in deciding to instead attempt the war install. It was an unmitigated disaster. Death by a thousand cuts, pick your cliche, but the long and short of it was after a LOT of tinkering, Tomcat was not extracting the war file into the web apps directory, even though the server.xml param was telling it to, and JIRA was bombing out on an NPE. (This is where in my little kangaroo (pun intended) court, I'd be ready to start throwing down a sentence of a year or two on an Aleutian Island.) What was even funnier though, was I found this thread where the enraged blogger is being assuaged by a polite representative of Atlassian. It‘s like, hey dude, if you are going to be so polite, do us a favor and go at least put a bloody exception in the code! (The polite explanation is basically ‘well we just can‘t support that configuration.‘ Ok, perfect job for an exception.)


Eventually, I relented and installed the standalone version and that was fairly simple to setup. The usual crap: create a db, make a user, refresh your memory about GRANT ALL, then chown a bunch of dirs. Ah, the tonics that make a man a man… [as Revenge of the Nerds was testament to, nerds are in fact the underfoot version of everything they supposedly hate: macho, chest-pounding apes].


Anyway, the one task that remained was getting it setup for launchctl (OS X‘s way of doing daemons). There was actually a doc page in the Atlassian documentation (which is dogfood-based wiki), but it was pretty paltry pickings, not really ready to go. Definitely some shoemaker‘s son in the Atlassian Ecosystem (they are selling tools for documenting projects). The good thing is, they have a bunch of screencasts that are pretty decent. And, again, they seem to be cutting a very interesting, practical tack with regards to the fusion of Lean and lifecycle management (ticketing), so the tools still look good, but do not, under any circumstances, decide to do a war install of JIRA et al. I would probably agree to eat raw Jellyfish tentacles to avoid repeating that catastrophe….)


I did a tour a bit ago (thankfully brief) on a project where wikis were quite literally verboten, because, as the prior lead said, the code was the documentation. Oh, ok, let me go check with the code to see why we are putting resources in /var/empty or how ssh key handshaking is done in the build. (As you could imagine, the code was a completely undocumented pile of radioactive witlessness that was aping BDD by having a bunch of tests that say ‘ok, call x, now assert that x was called.‘)


Anyway, seriously everything anyone ever wanted to know about the failure of Java to deliver on the promise of a WORA platform that would support modularity, interchangeability, scalability beyond rewriting the code, is on exhibit in this episodic little tragedy. But it‘s abundantly clear that Java is just the latest scapegoat to be blamed for the failure to deliver real modularity at a platform level, and folks, this is not a case of seeing an engine on the track but having to wait for it to come into the station, there is literally no one out there working on it at all. Drug resistant TB is back in India but big pharma would rather work on the next penis pill. Likewise, in IT, the Age of Quixote is over and the current gen is all about slapping up the boards and getting out of town. These are two topics I want to drill more in on: what would real modularity look like and why in hell can‘t we get there in the Age of the Cloud? and what happens to a culture that never builds anything they have to live in for more than a year or so? Anyone who has tried to hire in the last decade knows the dominant genus that‘s out there is the hermit crab. Eventually, that makes the witlessness of the platform become a self-fulfilling prophecy.

( Oct 26 2012, 10:07:30 PM PDT ) Permalink

View the original article here


Read more ....

Converting XML to Flat Files with Groovy

Posted by Unknown 0 comments
Sunday November 11, 2012

Converting XML to Flat Files with Groovy

When integrating systems, you often need to convert data from one format to another. For example, you may receive data from a web service in XML and need to convert it to a flat file for a legacy system. It's usually not as simple as just moving data from a tag to a column either. There's often calculations and formatting required. Most often the code has the work of parsing, converting and formatting all mixed together. With a dynamic language like Groovy which has closures, we can abstract much of that work. For our example, we'll take a subset of the Microsoft sample books.xml file:


We would like to provided a mapping for each column that allows us to pull data out of the XML file and define the width of the column. We'll keep it simple to start with by assuming a fixed width flat file with all columns left justified. Following is a simple mapping using an array of maps:


Each closure should get a GPathResult to a "row" in the XML file. The closure should return the text that should go in the column. We'll need to supply the tag that identifies the tag in the XML file to pass to the closure. Following is an example test using our books data:


The implementation is fairly simple. We process each "tag" in the XML. For each mapping, we set the delegate for the closure to a map with the tag name and the GPathResults for that tag. The closure can then be executed to get the text for the column:


The above piece of code abstracts the processing into 8 lines of code. It is a testament to the power of a dynamic language that provides closures.

(2012-11-11 16:27:31.0) Permalink

View the original article here


Read more ....

SwingJD πίνακες μέρος 2

Posted by Unknown 0 comments

20121130Friday, November 30, 2012

SwingJD tables part 2

StandardCurvedPanel is a custom swing JPanel. This extends the JPanel and replaces the method paintComponent (). StandardCurvedPanel looks like this

RoundedRectangle background + figure + OuterRectangle = StandardCurvedPanel.
Now allows us to discuss how each is created from it.


//Create the roundRect table
Shape shape = new RoundRectangle2D. Double (0, 0, width, height, 26, 26);
//Create color variation
Painting new GradientPaint GradientPaint = (0, 0, bgColor (color), 0, 2 *
getHeight (), WHITE Color);
//Add the color table roundRect
g2d. setPaint (Paint);
//Fill the shape
g2d.Fill (SHAPE);

>

Figure//Curved
Shape = shape createShape (width);
Painting new GradientPaint GradientPaint = (0, 2, new color (255, 255, 255, 200), 0, 50, fgColor. getColor2 ()),
g2d. setPaint (Paint);
g2d.Fill (SHAPE);

private {shape createShape (int width)
Shape shape = new GeneralPath ()?
.MoveTo (figure (GeneralPath)) (15.1308, 1.8172914);
.CurveTo (figure (GeneralPath)) (6.820799, 1.8172914, 2.1307993, 4.507291, 2.1307993, 13.817291);
.LineTo function (figure (GeneralPath)) (2.1307993, 31.78604);
.CurveTo (figure (GeneralPath)) (39.09004, 37.30802, 86.78241, 40.69229, width/2, 40.69229);
.CurveTo (figure (GeneralPath)) (width/2, 40.69229, width/2 + 30, 38.130333, width-1, 33.84854);
.LineTo function (figure (GeneralPath)) (width-1, 11.817291);
.CurveTo (figure (GeneralPath)) (width-1, 6.507291., width-5, 2.8172914, width-13, 1.8172914);
.LineTo function (figure (GeneralPath)) (18.1308, 1.8172914);
(Shape) closePath (GeneralPath);
return shape?
} //External contour
g2d. setStroke (new BasicStroke (3))?
shape = new RoundRectangle2D. Double (1, 1,-3, width height-3, 11.2, 11.2);
g2d. setPaint (new color (255, 255, 255,100));
g2d.Draw (SHAPE);

For more information and source code click on the following location
SwingJD works Panels Part2
Posted by Jeeru (Nov 30, 2011, 12: 01: 16 PM EST) Permalink


View the original article here


Read more ....

Eclipse 3.x branch quality stats

Posted by Unknown 0 comments
This is a followup on comments to my previous post regarding the 4.2 branch quality. 

I must apologize - last numbers were created from bogus queries which included only still opened bugs, not all created bugs in a specific period of time. So I hope the last update on statistics. The e4 numbers are not looking shockingly anymore, if not say that they are looking much better.


I love what Sir Winston Churchill said once: “I only believe in statistics that I doctored myself”.


Eclipse Platform UI bugs statistics


So here is another data series as requested by readers: how the recent 4.2 release (I'm talking about platform UI only) looks like compared with other releases 3 month after the release date? I only count newly created bugs here and only for 3.x stream, as the 2.x wasn't delivered on a yearly base and the user base was definitely too small compared with 3.x.


First 3 months of 3.0 platform UI: 573 bugs created (58 still open).


First 3 months of 3.1 platform UI: 499 bugs created (103 still open).


First 3 months of 3.2 platform UI: 522 bugs created (97 still open).  


 First 3 months of 3.3 platform UI: 418 bugs created (102 still open).  


First 3 months of 3.4 platform UI: 325 bugs created (90 still open).  


First 3 months of 3.5 platform UI: 240 bugs created (82 still open).  


First 3 months of 3.6 platform UI: 174 bugs created (68 still open).  


First 3 months of 3.7 platform UI: 269 bugs created (98 still open).  


First 3 months of 3.8+4.2 platform UI: 346 bugs created (205 still open).  


First 3 months of 4.2 platform UI + e4 UI (without 3.8): (310 bugs created + 54 for e4) = 364 (182 + 11 = 193 still open).  


So the bug counts for 4.2 looks now similar to first 3 months of 3.1 - 3.3 releases. Between 3.0 and 3.2 new bug rate was extremely high but 3.3 managed to improve the situation and new bug rate declined constantly until 3.6. Since 3.6 the new bug rate is steadily increasing. e4 didn't changed much on the increasing bug rate trend started with 3.6.


P.S. 


For those who proposed I should start contribute to Eclipse instead of looking on bug statistics - please let me decide what I should do in my free time. Some play Nintendo, some read books, some collect funny car plates, some bug counts.


I'm not paid to work for Eclipse, and so I think I do enough already for it (besides contributing to my own Eclipse projects). Finally, as a mathematician, why I shouldn't have fun with numbers?


P.P.S


In Germany 4.2 quality software is called "Bananaware" - the software which is similar to bananas harvested in a green state with the hope that it will became yellow when delivered to customers. This is unfortunately the problem with the entire IT industry today, nothing specific to Eclipse. However what still drives me mad is that 3.8 is not promoted in any way as a better alternative to the green bananas. Resolved wontfix?!? I feel this is not honest and a sign of a disrespect to the customers.


View the original article here


Read more ....

SwingJD Project Panels Part 1

Posted by Unknown 0 comments
20121129 Thursday November 29, 2012 SwingJD provides the user to create custom swing JPanels.Currently it supports the following panels Standard PanelsGradient PanelsSimple Glossy PanelStandard GlossyPanelCurvedGlossyPanelTitledPanelsTranslucentPanel
For more information and source code click the below link
Posted by Jeeru ( Nov 29 2012, 11:12:49 AM EST ) Permalink

View the original article here


Read more ....

2 Weeks in the cut cable universe

Posted by Unknown 0 comments

20121207Friday 07 Dec 2012

2 Weeks in the cut cable universe

Well, after my last post, I thought that I had finally achieved pax U-verse. But then a clerical got my router and my static addresses expelled and it took me 3 h to understand what had happened and that was the end. It was like a wound cauterized at this point: there was no turning back.

So I went to the Apple store and bought another AppleTV and an Airport Express for my bedroom. Being a Californian, naturally have a number of friends and acquaintances who are probably very upset by the idea of wireless in the bedroom, but I networked my plugins zombie killer so when track there, I put the TV timer, and when it turns off, discouraged power for everything.

Mostly, I'm pretty excited about the life of a severed cable. I started my Netflix subscription and again via AppleTV and I rounded up some things from the store. Now that I have a network, I copied all my DVDs Finally I had lying around. Found an app called that recognition is pretty awesome: gives you an editor to implement tags your video so that they look like the real thing when you are browsing around trying to find things to watch. Got lucky and found a Seagate 3 TB drive on Amazon for $ 99 that was the # 1 seller for a few days (and then sold out). Think about how insane that is. My biggest complaint about the recognition is that it is quite silly to match and the devs were too lazy to make it so that if you actually provide the information, sends it back to the source database. (More about the search stuff later: since dominated computer search for the last decade, it is pathetic what nightmare is, perhaps because Google has like Roundup and anything else that seemed worth doing or promises had been killed as a spermofyeis.)

One week in waiting, iTunes 11 declined. OK, I'm going to call the usual categories of Apple Fanboy, but you have to be a Moron not to see the new itunes as a vast improvement. Especially if you are doing such things. You can quickly emerge inside and outside various stores content and click and play boom. I am really psyched about this issue, and the renewal of the remote app is also a huge improvement. I laugh when I did a straightener on my desk the other day and my Assistant who pushed me Logitech universal remote (of long) and asked "what is this? ' and I realized that I paid nearly as much for this as well as I did for my mini ipad. There are still some more things to make this remote app, but it's pretty awesome.

Here are some comments that I think are important.

Living in a buffet for Hogs, notice I'm not saying pigs, using the definition of Rizzo. I want to live in a Las Vegas style buffet (another post, most of us do now that is a huge reason why overweight people rates exploded). Anyway, that's what TV: we're encouraged to just turn and take out a bunch of different platters until our time. What a ridiculous model. Kind of funny, edu has turned into this model too: you have time available, we have classes, and no structure (structure cause are fascists). What I found after a small cut cable, per my previous posts, the main reason for the smorgasbord is that it is a search for things and drag. You have to put things into a queue, and then let the snub. With the new iTunes, can I still do a tail of television broadcasting or WWDC sessions! One of the great things about the new remote app is you can type search letters using the iPad now! The days using the arrows up and running around the field of literature (um, is your knuckle-draggers 2012). The high side steal things is that you're a bit more seriously what is done and you can just concentrate on looking (without ads). Plus, it's funny, it's really nice to have the ads coming through the speakers, where if you don't happen to get the remote control. Finally, a decade of failure commercials with the remote control is enough.

Note to content sources: think hard before inserting outrageous prices for things. If you look really should cost each Viewer, 50 € to see a season pass, you are headed for Boot Hill. (BTW, I finally saw the season and series finale of the body last night ... don't know what it is to finish things, but like six feet under, it was sappy, stupid, tasteless, minors, and not only satisfying, it was like doing a corrosive, shot of acid accumulator: MAGIC in all that poured 8 years of their lives to only ship to redeem that bad). (See the connection was terminated because Body? the sum of all the stars increased revenue demands of the past ...)

Oh, one thing: you'll be able to change your diet, and for the better. I now raise WWDC sessions anywhere: in an ipad in the tub, whichever AppleTVs. Not to mention things like planet Earth or Nat Geo's stuff on how was the Earth, etc. It's all much better than watching stupid trash.

I had gotten into the habit of having Joe this morning on the background when am when I was getting started. That is completely gone. It was kind of good timing: Nate silver v. epilogue Megacorp stupid election made it clear that the television stations that filling buffet trough deluded and deluding their nonsense in reference to a fake world in which the greatest mystery is maintaining their opiated paying mass, indirectly. Watching the dance media and politicians were kind of fun, but then after a while you realize, ' we are now a full administration of the past of the deluge and nobody really talks about healthcare, or rights, or the jobs, all the political noise about these things. "also, this scary how time can swallow them genetically. I have said before, I will continue to repeat: If fired the total gov and replaced them with tech people, we will have a better Condition overnight. California once ranked as the worst run State in the country. Watching the news hours that change does not change even one iota.

(JAN 07, 2011 10: 14: 29 AM PST) Permalink

View the original article here


Read more ....

Java 7 examples

Posted by Unknown 0 comments
10:10PM Nov 07, 2012 in category Java by Andrey Loskutov


I've posted a brief introduction into new Java 7 language features / API. There is a 1 hour presentation slides plus some ready-to-run code examples.

Feel free to contribute. Permalink


View the original article here


Read more ....

New Ruminations on Tools

Posted by Unknown 0 comments
20121023 Tuesday October 23, 2012

New Ruminations on Tools

Been a couple years ago that I went from Rally to AgileZen. About to move to Atlassian now.


In the spirit of keeping the tone the usual combination of acerbic and direct, I‘ve decided to group my reasons for this, first the philosophical ones:

NoQA has it right, but No Ticky, No Good: So the basic premise of NOQA is that programmers leave things undone and then think it‘s someone else‘s job to file complaints into another system. However, thinking you can just keep pushing stories back into the In Development column is a fantasy. Frankly, there are other ways to conflate the absurdity of having two worlds, aka three-legged sack race. The one I‘m drawn to now is to keep practicing NoQA, but also have the ability to have the Customer enter tickets and push them onto the board. When I first looked at GreenHopper it looked like a tinkertoy that couldn't make up its mind whether it was a kanban or a cork board. It looks a lot better now. When we moved from Rally to AgileZen, it was to try radical Kanban, after watching iteration planning turn into a massive exercise in slogging a wet slurry twice a month. Kanban only is not less predictable. It doesn‘t equal no deadlines. It‘s not lightweight, or a proxy or a hall pass for the lazy. The problem is that for it to work, the scope needs to be not vast: this is the main shortcoming of Lean and tools in general: there is no means using modularization to keep the board from exploding (you could divide teams into different projects but then there‘s no way to see how they impact each other as they pursue their deliverables).The problem with tickets is that in a QA-based environment, there is: a. the Customer, b. the QA person, c. a PM, d. the original Developer. It‘s pretty funny when you think about it. It often degrades into ‘open wide‘ followed by a bunch of scenes where apple sauce turns into an airplane, narrated with much babytalk. It‘s not always the dev‘s fault that the story doesn‘t just run from one edge of the board to the other. That said, in the best of worlds, you will have situations where stupid little seams need caulk and writing a new story or reopening a story to add something that is clearly not restating anything about what was done is just wrong.I was going back to look at Atlassian because of the chimerical fusion of kanban and tickets, but in so doing, I discovered they have a new testing tool. It looks stupidly visionary. (See it here: Bonfire) The mission of the tool is in this same seam: give a Customer (not a QA person) the easiest, most powerful way to communicate issues, not just one at a time, but as part of sessions, with annotations, etc. Really psyched to try this and the integration with the rest of the suite is crucial. Lean dictates that the Value Stream Map is the focus of continuous improvement. Maps that have more steps and people are not good. I am not saying there should never be QA. I am saying that projects should practice the first precept of Lean: grow into resources through need.Have become more and more convinced that the tools world is chasing its tail, dining on a dog‘s dinner of assorted bromides. Lean has the most right impulses, but most Lean toolmakers are porcine posers who were stuffed into polyester rent-a-cop suits a few days ago.It‘s time for tools to start moving away from just a list management for the subjugation of serfs by List Lords.

Now for the non-philosophical drivers:

I posted about how AgileZen had added no features in a year of paying them $100/month. That‘s an iPhone 4 a month and they couldn‘t even fix one of their many infantile omissions. Here‘s my final judgment on that: buh-bye. (Their explanation was ‘yeah, sorry, we were porting to EC2…‘ Oh, ok, apology accepted.. ??? Really?)Atlassian made points with its Bitbucket remake which is clearly an antidote to GitHub‘s witless greed.The membrane between Customer and Architect should be permeable and fluid. If there‘s any evolution required, adaptation, creativity, etc., this is the seam the Complexity guys identified (a hundred years after Nietzsche) where chaos and order fuel generative energy. (BTW, when you hear programmers whining about the lack of ironclad certainty in the working spec, it‘s kind of like listening to the whack jobs on wall street complaining about uncertainty. (Although it is funnier in the case of the wall streeters, since they are making their money running a bloody casino. It‘s like a swimmer complaining about having to get wet.)

There are still a lot of shortcomings in the tools space. It seems more likely that a unicorn will bolt through your next Kanban Board than one of these teams will start to really think up some new, creative ways to make things more effective. Atlassian may finally be getting with it after making their first bid to be a playa doing the usual jig of checking feature boxes like an M&A team at a New York bank. Most tools are so dead that they remind you of the part of Zarathustra where the main character is carrying a corpse around until he realizes its time to bury it and move on.

( Oct 23 2012, 11:42:06 PM PDT ) Permalink

View the original article here


Read more ....
Trik SEO Terbaru support Online Shop Baju Wanita - Original design by Bamz | Copyright of Info Zone.