- We design and build extraordinary applications for companies looking to make the next great idea a reality.
- learn more
The Ajax Experience 2008: Hope to see you in Beantown
I'm posting today from Boston, where my colleague Dietrich Kappe and I are proud to be presenting at The Ajax Experience 2008.
At 5.10 p.m. tomorrow (Tuesday 30 September), Dietrich will present "Saving Your Investment: Transforming J2EE Applications into Web 2.0 Using GWT." This 90-minute session will introduce noobs to the Google Web Toolkit; school experienced GWT developers in the security implications of leaky client-side business logic; and delight business folks and bean-counters alike with the money-savings possibilities of retrofitting a legacy webapp instead of building a new one from scratch.
At 8.10 a.m. the following day (Wednesday 1 October), I will present "Making Friends with the Browser: Ajax, Back Buttons and Bookmarks." In it, I'll look at the state of Ajax history management, from new libraries such as the JavaScript State Manager and dsHistory to my own project, Really Simple History. I'll discuss the problems and tradeoffs inherent in any browser history manager. I'll also examine the impact of new browsers such as Google Chrome and Microsoft Internet Explorer 8 on this small, rapidly evolving corner of the Ajax world.
We look forward to seeing some of you there and reporting back about the rest of the conference.
Topics: Ajax, Ajax Experience, events, Javascript
TankEngine: New plugin for Rails iPhone Development
Last Saturday at Windy City Rails, I had the pleasure of announcing TankEngine, a new Rails plugin for targeting iPhone and Mobile Safari. ("git" it here)
Now, I know, I've done this already, so why a brand-new version of the plugin with a new name?
Good question. The original plugin was basically a wrapper around the iUI JavaScript and CSS classes. After working with iUI for a while, it turned out that I had a few differences of opinion with iUI (which I still think is a very nice piece of work).
Continue reading »
Topics: iPhone, Ruby on Rails
Symphony of Ruby on Rails and Flex through RubyAMF

In a project that I am currently a part of, we inherited Ruby on Rails from our client's system and project front-end was designated to be developed in Flex. RubyAMF came naturally.
I have been working with two other AMF frameworks prior to this: AMFPHP and WebOrb. My experience with both was that they are fairly hard to set up and once you go through that minefield, everything works excellent. No need to say that I am a great advocate of AMF in general. RubyAMF brings the same good old AMF but with a stunning ease and speed of development!
My colleague working on the Ruby side, Justin Ficke, introduced me to code and architecture of Ruby on Rails and I was impressed to see with what ease, precision and speed can one develop it.
Justin and I put a little test together of this architecture and here is a screen cast of it.
All the lovely custom typed objects and speed of data transfer are there. Beauty of it, appart from obvious benefits from AMF, is that the development process couldn't have been better and faster.
Topics: amf, AS3, Flex, Ruby on Rails, rubyamf
“Build half a product, not a half-assed product” - tips on clarity and focus from Jason Fried of 37Signals
Jason Fried from 37Signals spoke yesterday at the ITA "Speaking of Success" event, about the history of 37Signals, their philosophy and culture, and the critical business decisions they've made to get them where they are today.
The software biz is fundamentally broken. Too many products fail because of the obsession of adding more and more, and trying to do too much.
Jason went on to say that the approach of adding more and more only works for companies that have lots of money and lots of time, but that for the average company the main goal should be to build something that is "good enough," get it out to the users, and improve the design based on their feedback. The challenge of which features to include, and which to say "No" to, is covered well in the "The Innovator's Dilemma," which he said "everyone in this room should have read." The book resonates the core philosophy of 37Signals, which is evident from their blogs, their book "Getting Real," and the design of the Rails framework. As an example of the "Good Enough" philosophy, Jason used his laptop and its basic webcam to stream the Q&A session out over justin.tv and send out a text to the 37signals Twitter group. "The quality probably isn't that great, but its good enough," and with that quick setup he had now broadened the audience by 1,000 users or so. (I searched for the video archive at justin.tv, but didn't find it yet.)
Rails Performance, Code Metrics, and Locking Down your Application: Tips & Tricks from Windy City Rails 2008
Windy City Rails was the best Rails conference I've ever been to, which is easy for me to say since it was my first actual Rails conference. But even speaking from a fairly uninformed point of view I found it very full of quality. In case you didn't know, it was created by ChicagoRuby, sponsored by Pathfinder (us) among others, and you can find tons more details if you're interested at http://windycityrails.org/. Anyway, it was this last Saturday the 20th, and after four days of digestion I am prepared to deliver some of the highlights:
Betting Your Business on the iPhone
Monopsony - the market condition that exists when there is only one buyer.
We all have heard the term "monopoly" and even know a little bit of what it means - a market where there is only one seller. But the related term "monopsony," a market where there is only one buyer, is not as well known and it's dangers not as well understood.
Certainly both monopolies and monopsonies will reduce competition, innovation and consumer choice, but they further constitute a big risk for the sellers. For businesses on the seller side a monopsony can be the kiss of death. Just ask Walmart's suppliers how good it's been for them.
Not all monopsonies are as obvious or as overtly damaging to suppliers as that of Walmart, but Apple's iPhone and iTunes appstore looks like a benign monopsony. A monopsony in that although the iphone consumer is the ultimate buyer, Apple determines what is permitted in it's appstore, and benign in the fact that Apple hasn't flexed that restrictive muscle more than a few times.
GWT Tutorial - Building A Model
Shalk Neethling has written up a nice, streamlined tutorial on how to build a model in GWT using the GWTx project's support for java.beans.PropertyChangeSupport.
The basic idea here is that while the browser is the View and the server side is the Model and Controller in MVC, you really should structure your browser side code as an MVC itself where only the Model interacts with the server.
Well worth a read.
What does your CSS Swiss Army knife look like?
CSS 2.1 is more like a Swiss Army knife than a fully stocked toolbox. We can accomplish a lot, but we have to get creative with the standard attachments. Floats, relative positioning, the box model - each tool must performs double or triple duty because they're the only ones we've got.
When we do discover a clever way to accomplish a common task using these limited tools, we're likely to employ that technique over and over. I'm not talking about CSS frameworks here; those help out more at the macro level. I'm talking about repeatable techniques that can be applied at the micro level. When done right, these simple techniques can feel like entirely new Swiss Army attachments rather than intelligent application of existing blades.
Whenever I start out on a new client project, I start off with the following plug-and-play components:
Topics: CSS, Javascript, Progressive Enhancement, Web Standards
Windy City Rails
A quick plug for the WindyCityRails conference being held tomorrow here in Chicagoland. I guess it's technically not a "plug" since the conference is all sold out, but it does promise to be a fun day. So think of this post as a promise against a longer post on Monday with a round up.
The headline session is a Q&A with David Heinemeier Hansson. David Chelimsky, lead developer of RSpec is also speaking. And we have three talks from Pathfinder as well.
John McCaffery will be doing a presentation on JavaScript practices including testing and debugging.
I'll be doing a talk on iPhone web development, and a talk on testing that I hope will also be fun.
Expect some round ups early next week. If you can't wait that long, I'll probably be updating my twitter feed all day with any interesting info.
Topics: Ruby on Rails
ZK 3.5 Released with Comet Support
ZK 3.5, the latest version of the server-side Ajax framework, is out with a raft of new features. Three of those features really stand out for me:
- Comet server push
- Customization of look and feel
- Performance monitoring
Server push via polling has been available in ZK for a while, and Comet in the ZK "Enterprise Edition," but now it is available to everyone. And it is pretty easy to use: "The implementation of server push is transparent to developers. ZK chooses which implementation to use according to the edition of ZK automatically, but it is configurable."
Customization of look and feel has gotten much easier. ZK has followed the example of a number of other frameworks in styling its widgets with predictably named CSS styles. Changing the look and feel of an application is now as easy as changing the ZK widget style sheet. Styles can further be overridden on a widget instance-by-instance basis.
Performance monitoring is perhaps the most exciting new feature. Client-side tools such as YSlow can guide optimization efforts and give you point in time performance snapshots. But critical applications need to be monitored and tracked end to end over their lifespan. With ZK 3.5, you now have the plumbing to instrument your application to capture five data points for each request:
- T1, the time browser sends a request to server
- T2, the time server receives a request
- T3, the time server sends a request to browser
- T4, the time browser receives a request from server
- T5, the time the browser finishes processing a request
ZKStudio 0.8.2
There's also a new version of ZKStudio for Eclipse out. The major change is that it now supports auto update via http://studioupdate.zkoss.org/studio/update
Topics: Ajax Frameworks, Announcement, ZK
Mouse wheel (scroll) Event in Flash Player running on a Mac
One of the great advantages of Flash technology is cross-browser and cross-platform compatibility. That is almost entirely true but a few things did slip Adobe.
A big issue that was overlooked is support for mouse wheel event on Mac OSX. A pretty basic functionality you would think. If your interface is heavily relying on mouse scrolling, your audience on Mac's will probably have a "so how does this work" blank stare.
Topics: externalinterface, Flash, Flex, Mac, mouse scroll, mouse wheel, osx
iPhone Usability: More Taps, Less In My Head
Consider this my somewhat belated follow up to Brian's post about iPhone usability.
First, one pure follow-up. If you are so inclined, you can join an online petition calling for Apple to allow iPhone users or developers to disable keyboard auto correct if they so desire.
Here are my usability notes. I should say, I'm not a complete mobile warrior or anything, so there are probably other users a lot more dependent on, say, mobile email than I am. Also, the iPhone is my first smartphone, so I don't have any residual BlackBerry or Window Mobile experiences to compare it to.
Phone Usability
For all that everybody focuses on the fancy stuff, an iPhone still needs to allow you to make and receive phone calls. I have to say, the basic phone interface is perhaps my favorite of the built in Apple applications. The basic set of in-call options (speaker, mute, etc...) are clearly and cleanly presented with large buttons, reducing the need to remember how to trigger different features. The visual voice mail interface is outstanding -- almost making it pleasant to deal with voice mail.
One More Thing...
The iPhone 2.x OS features an unusual password entry field, in that the most recent character typed is displayed plain while all the other characters are masked. The idea, presumably is to make it easier to catch password typos, and it's (I guess?) not all that likely that somebody would look over your shoulder to catch a password.
Still, the behavior feels weird. I thought it was a bug the first time I saw it. I opened this up on my twitter feed and got exactly two responses. One in favor, one against. Obviously the masses have spoken. What do you think?
Topics: iPhone
Porting Java Libraries - Jazzed About GWT
I've been building GWT interfaces for a while now, and it's been pretty cool. My attrophied Swing skills are slowly coming back and the kinds of stuff I've written has been leagues beyond my early Ajax stuff. So far so good.
Throughout it all, I've been trying to obey my own principle of avoiding leaky business logic and sensitive data. That means that most of the heavy lifting, business logic wise, happens on the server side.
This past weekend, however, I got a rare chance to do some programming for myself. One of my hobbies is chess, and I've written a few programs over the years to help me study and analyze the game. Right now I'm putting the plumbing together for a web/iphone application site. I've got all the stuff that handles FEN, move generation, PGN and UCI (interfacing to chess engines) on the server side, and the application side is mostly concerned with board displays.
A mea culpa, and a launch date, for Really Simple History 0.8
Time to come clean: I've been a terrible project lead on Really Simple History since version 0.6 launched last fall. The problem has been twofold:
- lack of documentation
- lack of time
The essential functionality of RSH works well in most supported browsers, but there are several special cases that have to be coded around in your actual application. Even basic usage, however, is documented mostly through example, not through tutorial-style, narrative prose. This has resulted in lots of noise in the issue tracker from folks seeking guidance on how to use the library. For all the folks whose questions and bug reports have gone unanswered, I offer a sincere and heartfelt apology. And to the more experienced users who stepped up to answer questions and help out, I offer heartfelt thanks.
The launch of Safari 3 caused some serious problems because code created to work around Safari 2's deficiencies caused things to break in Safari 3. I should have accepted suggested patches from some gallant RSH users and pushed out a new version months ago. But to be honest, I was so swamped with paid client work for Pathfinder that I couldn't find the time. I've learned my lesson about brittle, browser-specific workarounds. The next version of the library will fail far more gracefully.
Speaking of the next release: RSH 0.8 is nearing completion. I expect to publish an alpha version to coincide with my presentation October 1 at The Ajax Experience. My talk covers lots of interesting developments in Ajax history management, and I figured I should, you know, deliver the goods to my users before getting up on that stage.
Topics: Ajax, Javascript, Really Simple History, The Ajax Experience
Tips for Testing Plugins
I've been doing some heavy-duty plugin work recently, and bumped up against the same problem again -- how do you test plugins? Specifically, how do you test a plugin that extends Rails core classes and therefore requires a Rails environment to really be tested? How do you solve the chicken and egg problem of loading Rails pieces inside a plugin that also needs to have a Rails application outside of it?
The answer, not surprisingly, is "it depends", mostly on how complicated your plugin is and what parts of Rails you need to load. In this post, I'll be going through some tips for making specific pieces of an ordinary Rails test environment available to your plugin tests. The tips here are a combination of my own experience with ideas that some popular plugins use for testing.
Topics: Ruby on Rails
About Pathfinder
Recent
- Firefox Plugin Malware ‘Trojan.PWS.ChromeInject.A’
- Pathfinder releases version 1 of the its Flash Platform microsite (codename Mica)
- Pimp my Rails: Five Plugins & Gems to Make Rails Better
- iPhone: Using Pre-processor Directives for Device Testing
- Subtle OpenGL Projection Matrix Difference Between iPhone Simulator and Device
- App Security: Throw Out the Org Chart!
- Pimp my jQuery: Five plugins to replace the features Prototype and Scriptaculous users expect
- Thanksgiving 2008: What We’re Thankful For (In Rails)
- iPhone SDK: Testing with TextMate & GTM
- GWTQuery - JQuery-like Syntax in GWT
Archives
- December 2008
- November 2008
- October 2008
- September 2008
- August 2008
- July 2008
- June 2008
- May 2008
- April 2008
- March 2008
- February 2008
- January 2008
- December 2007
- November 2007
- October 2007
- September 2007
- August 2007
- July 2007
- June 2007
- May 2007
- April 2007
- March 2007
- February 2007
- January 2007
- December 2006
- November 2006
- October 2006
- September 2006
- August 2006
- July 2006
- June 2006
- May 2006
- April 2006
- March 2006









