![]()
As a developer of web apps, I'm inevitably running 3 or 4 browsers, each with 10 tabs open containing my application under development, Google searches, gotapi (pronounced "got a pie?" of course!), design wireframes, and all kinds of other very important stuff. And in one of those tabs, somewhere, is Pivotal Tracker. Browsers and tabs are great, but sometimes you just want an Application -- notice the capital "A."
Fluid to the rescue! Fluid lets you create Site Specific Browsers, which "provide a great solution for your WebApp woes." In a nutshell, Fluid makes a custom WebKit browser that, when launched, opens just the site you configured it to open, such as Gmail, Pandora, or even Pivotal Tracker. I love that I can maximize the Pivotal Tracker app and boost the font 3 or 4 levels, filling a screen with Tracker goodness without the clutter or navigation buttons, bookmark bars, or tabs. And where is Tracker? Just command-tab!

Here's how to create a Fluid application for Pivotal Tracker.
- Download and install Fluid
- Download the Fluid Icon for Pivotal Tracker
- Launch Fluid
- Enter the following:
- URL: http://www.pivotaltracker.com
- Name: Pivotal Tracker
- Location: pick one!
- Icon: pick 'Other...' then find the tracker icon you downloaded earlier

- Click Create, then launch it!
Once launched, open the Pivotal Tracker preferences and change the Window Style to "HUD (Black)" under Appearance Preferences Why? Because it looks cool.

Update
Here is the Fluid icon, upon request.
![]()
Omar is on fire. Just a few days after publishing his Guide to creating a Google App Engine / Remix API / Facebook app, he's released Remix.NET, a C# wrapper for the Best Buy Remix API.
Code sample:
Using Remix;
Product p = null;
try
{
Server remix = new Server("username", "password");
String filter = "iphone";
String postalcode = "94102";
String radius = "25";
bool tersemode = true;
int pagenum = 0;
// Get all Hardgoods that match "iphone" in the name attribute and
// are in stores in the 94102 area code in a 25 mile radius.
// When "tersemode" is true, only return a handful of information.
// (See method signature for details.)
Products list = remix.GetHardGoods(filter, tersemode, pagenum, postalcode, radius);
if (list.Count > 0) p = list[0];
}
catch (Exception e)
{
}
return p;
We've rolled out some new features in Pivotal Tracker.
New API Version
There's a new version of the developer API, with the following changes:
- support for ActiveResource
- responses no longer wrapped in an element, using HTTP return codes instead to indicate success or error
- ability to get a list of your projects
- you can now page through stories with a limit and offset
- it's now possible to obtain an authentication token by specifying a username and password (via basic auth or header parameters). This makes it easier to build interactive clients, for example a mobile app.
The previous API version (v1) is still supported, but will be deprecated at some point in the future. Please see the API Help page for more details.
Ability to change point scale
It's now possible to change your project's point scale, even if you've already estimated stories.
Demo Projects
New Tracker users will now see a link on the Dashboard to create a demo project, with example stories. You can also create a demo project from the My Projects page.
Story Comment Notifications
There's now an option (on the My Profile page to receive new comment email notifications for all stories in you project(s), not just stories you're a requester/owner of.
As always, we look forward to your feedback!
Check out Omar Abdelwahed's* guide to using Google App Engine with Best Buy's Remix API to build a Facebook app.
Omar is also the author and maintainer of the bbyremix Twitter app.
Sign up for an api key at the Remix API website.
* friend of Pivotal
Interesting Things
application.rb vs. application_controller.rb: As we all know,
ApplicationControllerbreaks with Rails convention and lives in theapplication.rbfile, notapplication_controller.rb.Be careful if you create anapplication_controller.rbfile of your own, as this can confuse Rails class loading and might result in Rails deciding not to loadapplication.rb.Google Webmaster Tools: Note that if you are using Google Webmaster Tools that statistics are different for www.example.com and example.com (sans www).

Nested Model Forms are coming in Rails 2.3! There is even a patch in progress.
A great little Ruby tutorial using HTTParty with the Remix API.
Finance and Commerce: Best Buy API Aims To Expand Store's Reach Online.
For more on Remix, check out the Remix API website (where you can sign up for a developer key).
Renowned design firm Cooper hosted a panel discussion at Pivotal Labs where founder Alan Cooper joined other senior members of the firm to discuss the challenges of integrating user interaction design work with the agile development process.
The entire panel discussion is posted to our podcast and the talks page of our website.
There's a reason you don't stick your hand into fires, walk into traffic, or use Windows Vista. Humans, along with pretty much every other organism with a central nervous system, have evolved fear as a defense mechanism that protects us from doing things that cause us pain. We can override this to a certain extent, but fear is instinctual and basic.
ActiveRecord's update_attribute() method is useful for setting a single attribute value while bypassing validation.
You may not know, however, that when invoked on a new record, update_attribute() saves the record, including all the fields, and bypassing validation for all fields.
This can lead to some unwelcome surprises. For example, acts_as_list uses update_attribute(), so if you're using acts_as_list, watch out for unexpected, unvalidated saves when using new records within the list.
Thanks to Adam Milligan for the heads-up.
Interesting Things
- Web based sprite generator - here
This also makes the generated sprite really small which is great if you care about page load times. A Ruby+ImageMagick sprite generator might also be a good thing to build.
- Cool way of detecting if a file is UTF-8 enconded using Ruby+IConv - here
Ask for Help
"Is there an onReady() for AJAX events?"
- onAJAXReady() ?
- JQuery Live Events might do the trick
