Athletics Weblog
on design, art, web, business, culture, etc.
NY77 Nominated for an Emmy
Wednesday July 16, 2008 - 1 week ago
Posted by James Ellis / Filed under Film, Motion Graphics, New York

We are all excited to learn that NY77: The Coolest Year In Hell has been nominated in the 29th Annual News and Documentary Emmy Awards for the Outstanding Arts & Culture Programming and Outstanding Individual Achievement in a Craft: Graphic Design and Art Direction categories.
In the summer of 2007 Athletics’ David Ahuja worked with Wyeth Hansen and Todd Neale to design and animate this two-part, two-hour documentary for VH1’s Rock Docs series.
You can read the news on AWN here:
http://news.awn.com/index.php?ltype=top&newsitem_no=23969
You can check out a montage on David’s site:
http://www.amoebalabs.com/work_NY77.php
As well as a clip here from the show about the July 1977 Blackout:
http://www.spike.com/video/2881108
Link: VLU interviews Pinball Publishing
Monday July 7, 2008 - 2 weeks ago
Posted by James Ellis / Filed under Links
Yesterday Viewers Like You published an interview with the folks from Pinball Publishing, a small, sustainable/eco-friendly printing operation in Portland, Oregon. The interview takes a look at Pinball’s work and process, and comments on the benefits of having a good relationship with a printer.
Made me miss running a printing press.
Delicious API Integration
Tuesday July 1, 2008 - 3 weeks ago
Posted by James Ellis / Filed under Code, Web
Last week we announced the relaunch of the Thinking for a Living website. Today a bit about how it works.
Earlier this year Duane King (of BBDK) and I started discussing possibilities for a new TFAL website. What had started out as a brief booklet was evolving into a larger concept: an open-source design education resource. Duane wanted to grow a database of print and online resources, and find a way to publish this information effectively online. I recommended using Delicious, the Yahoo-owned online bookmarking service, as a back-end.
Delicious allows you to maintain a single repository of bookmarks, with all data hosted on Delicious servers instead of your local machine. The obvious benefit to this system is that your bookmarks are accessible from any computer on the web.
It’s easy to push new bookmarks to the system: You can use the Delicious Firefox extension or browser bookmarklets to quickly bookmark items as you browse. Each bookmark may include information such as title and description. And rather than organize bookmarks by placing them in specific folders, each Delicious bookmark can be associated with any number of tags.
Most important for our purposes, and where things get interesting: Delicious offers an API that allows external applications to communicate with the service. By tapping into the API, we can access the TFAL Delicious account bookmarks, and (re)publish this data/content on the TFAL website in whatever fashion we like.
This is interesting as most people view Delicious as a personal internet utility, not a content management system. It’s also interesting that we can take our bookmark data/content out of the highly normalized Delicious environment and integrate it within something of our own design.
It could be said that we’re simply reformatting information, however, I think there is more to do it than that. The important point is that we’re able to involve our content in a larger context and give it greater meaning. And by presenting it in a format of our own design, we can make the content that much more uniquely ours. Given the standardization of the modern web, we think a little specialness goes a long way.
Working with the API
Athletics has been working with the Zend Framework for some time now. Given the investment we’ve made in our existing systems/infrastructure, ZF’s plug-n-play approach to framework integration suits us well. ZF should be accessible to anyone with a decent grasp of PHP.
ZF provides dozens of modules designed to address a variety of different tasks. For this project we made use of Zend_Service_Delicious, a module designed specifically for interfacing with the Delicious API.
An example of the code required to connect to the Delicious API and query for all posts:
<?php // Connect to the Delicious service $delicious = new Zend_Service_Delicious('username', 'password'); // Query for all posts $all_posts = $delicious->getAllPosts(); // Loop through all posts foreach ($all_posts as $post) { echo "Title: $post->getTitle()"; echo "Url: $post->getUrl()"; } ?>
It doesn’t get much easier than that. ZF abstracts all the complicated stuff; you never have to bother about XML/JSON/etc.
Caching
Delicious is strict about how often you hit the API, as they can’t have external apps slamming the service and draining bandwidth. From their API help page:
- Please wait AT LEAST ONE SECOND between queries, or you are likely to get automatically throttled.
- Please watch for 503 errors and back-off appropriately.
This means you must implement some sort server-side caching to prevent your site from making too many calls to the Delicious API. With TFAL, we store the result of $delicious->getAllPosts() for about two hours. We do this using another handy ZF module: Zend_Cache.
In the following example we combine Zend_Service_Delicious with Zend_Cache to store the Delicious data for two hours:
<?php $frontendOptions = array( 'lifetime' => 7200, // cache lifetime (60 * 60 * 2 = 2 hrs) 'automatic_serialization' => true ); $backendOptions = array( 'cache_dir' => 'path_to_cache_dir' // Directory where we put the cache files ); // Instantiate a Zend_Cache_Core object $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions); // Can we load the cache? if( !$delicious_data = $cache->load('AllPosts' ) ) { try { // Connect to the Delicious service $delicious = new Zend_Service_Delicious( 'username', 'password' ); $delicious_data = $delicious->getAllPosts($tag=null); // Save the results to the Cache $cache->save( $delicious_data, 'AllPosts'); } catch ( Zend_Service_Delicious_Exception $e ) { // If connection to Delicious failed, load old cache regardless of expiration $delicious_data = $cache->load('AllPosts', $doNotTestCacheValidity=true ); } } ?>
In the code above we initialize a Zend_Cache object on lines 1-12. On line 15 we attempt to load the cached version of the Delicious data. If the cache has expired we continue to lines 17-29 where we first try to connect to the Delicious API and request all posts (lines 19-24). If this fails (the server couldn’t connect to the Delicious service for any reason), we catch the exception (line 26) and force load the last cached version of the Delicious data, regardless of whether it has passed its 2-hour expiration date.
We found this sort of caching essential as Delicious doesn’t hesitate to block your requests if you get too greedy. (We were blocked a couple times during development.)
Additional caching
Storing $delicious->getAllPosts() is great and will definitely keep you from being booted off the Delicious API, but once you start dealing with large data sets (with over 1200+ items, TFAL certainly qualifies) additional page-level caching can speed things up significantly. For a high-traffic page like the Home page, we store the system-rendered HTML page output for 10 minutes instead of repeatedly asking the system to spider all 1200+ items just to determine what constitutes the latest 3 resources. This makes a lot of sense given that the $delicious->getAllPosts() data-set only updates every 2 hours.
We have page-level caching functionality built into our general purpose web framework. The implementation is very similar to that of WP-Cache. However, I should mention that Zend_Cache can also be used for page-level output caching.
The numbers:
Rendering the Home without page caching requires 0.2 seconds and 6.24MB of memory. (This is, of course, using the cached result of $delicious->getAllPosts(). Making the full trip to the Delicious API takes much longer — usually a second or two.)
0.2 seconds might seem fast, but it’s actually a bit excessive. By using a full page-cache we can get this down to .01 seconds and 1.83MB of memory. Big improvement. This additional caching is particularly important the day your site gets linked up on a heavily trafficked website and an avalanche of traffic rolls in.
Additional notes:
The odd del.icio.us name/web address has always bothered me a bit. I’m all for waving the nerd flag, but I’ve never found domain hacks to be all that clever. Inevitably in conversation someone ends up saying “dell dot ick-eo dot you-ess”, which is ridiculous. After being acquired by Yahoo they picked up delicious.com, which bounces you to del.icio.us. I understand Yahoo intends to rebrand the service simply “Delicious” at some point. I’m looking forward to that.
Also, this post was an excuse to play with GeSHi, the PHP-based generic syntax highlighter class. It’s really quite handy and supports fifty-eleven languages. We’ll be using this for code highlighting from now on.
Questions/Comments: Contact James via email - .
Thinking for a Living
Monday June 23, 2008 - 1 month ago
Posted by James Ellis / Filed under Design, Web

As designers we celebrate meaningful libraries of information. We love the information, but it’s not our only concern. We also take the design of the library itself – the system that organizes the information – very seriously.
Designers have a long history of library-making. Pre-internet, we compiled books (reference books, monographs, retrospectives, magazines, etc.) Now we find ourselves reinventing our libraries for an online world. We develop new systems to better manage and deliver our information, and to accommodate the scale and scope of the internet.
Unlike the finality of books, online libraries constantly change, and this dynamic nature makes modern library-making a unique challenge. To do it right, you need more than the designer and archivist; you need the information architect – the online system builder – as well.
Today we’re happy to announce the significant relaunch of a modern online resource. We partnered with our friend and colleague Duane King (the DK of BBDK) to develop a system that extends his immense library of online resources to the web. Please enjoy Thinking for a Living™:
Two introductions. One new desk.
Tuesday June 3, 2008 - 1 month ago
Posted by James Ellis / Filed under Random
This summer we have two new faces in the studio.
Jason Bishop – fellow Brooklynite and one of our long-time buddies via Richmond, VA punk rock (think Avail, Action Patrol era) – will be spending the summer with us. Jason is currently an MFA Designer as Author candidate at the School of Visual Arts. Prior to going back to school, Jason was working in NYC doing primarily web design/development for clients such as nytimes.com and Cornell University. Now he’s expanding his skill sets to include to motion and traditional print design.
Jason’s work:
http://jasonbishop.net
Dylan Mulvaney is entering his fourth and final year of study earning a BFA in graphic design in Iowa State University’s College of Design. Dylan is interested in the intersection of digital and traditional tools of production within graphic design; meaning, he likes to get his hands dirty. This summer he’ll be bouncing back and forth between here and our friends at Rad Mountain. In the fall he will be studying in Rome’s Piazza delle Cinque Scole, getting knee deep in contemporary European design culture. After graduating in May 2009, Dylan plans to locate to NYC proper.
Dylan’s work:
http://dmulvaney.com
The addition of Jason and Dylan required an Athletics expansion: birch-top desk #10.
We like building our own desks. And it’s always nice to visit “the nicest guys in the world” at Meserole Lumber.
Wood cut to size, Jason sanding:

Built, ready to poly:

Poly’d, drying:

The Wiggle Puppy, observing:

Final product in context. 3-desk superstation:

