Behind the scenes: Redesigning and coding the Highrise sidebar modules

in Signal vs. Noise, Wed, 27 Aug 2008 23:58:00 GMT

I’ve wanted to redesign the Highrise sidebars for a long time. They’ve felt cluttered and messy to me, and as we add more features to Highrise the mess will only multiply. So I was glad to have the chance this week to redesign the sidebar modules. The visual side of the redesign was straightforward, but implementing the design in code required a few tricks. Here’s a look behind the scenes at the coding decisions we made for the new Highrise sidebars.

“Subjects” in Highrise

Which sidebar modules am I talking about? In Highrise you can keep track of People, Companies, and Cases. These all have the same basic code and UI. You can keep notes about them, set tasks for the future, and manage some common types of metadata. Since People, Companies and Cases share so much plumbing, we’ve abstracted them as subjects. A subject is anything in Highrise that you can attach notes and tasks to. When you look at a subject’s page, you see a sidebar with some modules for adding or editing metadata such as contact information, background information (a kind of static text description), dates to remember for that subject, and more. The screenshot below shows a subject page with the sidebar modules highlighted.

Redesigning the modules

Each module has a header like “Contact Bob” or “Dates to remember” and data below. In the original design, modules can be either “active” or “empty” based on whether they have any data in them. Empty modules have a grey header and an “add” link floated right. Active modules have a light blue header and an “edit” link on the right. We made this distinction so your eye would more easily catch active modules when you’re looking for information. The idea was good, but the original implementation looked messy with its mix of grey and blue, scattered red action links, and lack of separation between modules.

For the first redesign (above) we cleaned up the modules. Active modules are now wrapped entirely in a light grey box with a tiny drop shadow. We killed the blue header style, relying instead on the space between modules to separate them. Empty modules no longer have a header. They are grey boxes collapsed down to a single link to add the content relevant to that module. Finally we replaced all the red links with grey links in order to put the focus on the data within active modules rather than all the possible actions. One last tweak: we changed the text for “About [subject’s name]” to “Add background information.” We’ve gone back and forth a number of times on the language for this feature, and at this stage we decided to try “background info” on for size again.

The first redesign was a big improvement. But we didn’t like the way active and empty modules looked mixed together. The dim bar in between those two active modules creates a kind of striped look that we want to avoid. The problem was worse on subjects with more sidebar modules, like companies or cases. So we decided to group all the active modules together on the top, and then group the empty modules on the bottom. The result is much cleaner, and it’s easier to scan when you load up a subject in order to quickly grab some info like an email address or birthday.

The re-ordered sidebar was a winner. But it came at a price. We couldn’t just change the CSS and call it a day. Now we also had to write code to re-order the sidebar modules dynamically based on whether they were empty or active. Ruby’s power and flexibility really came in handy for this job.

The code

I said earlier that people, companies, and cases are handled by the same plumbing because we abstracted them as subjects. The result of this abstraction is that whether you are looking at a person, a company or a case, the sidebar is rendered by the same template: subjects/_sidebar.rhtml.

(This kind of “view polymorphism” has been subject to a lot of internal debate since we first released the app. It makes maintenance both easier and harder because the code has less repetition on one hand but on the other it is less intention-revealing due to the abstractions and indirection.)

This is what the original template code looked like to render the subject sidebars:

in app/views/subjects/_sidebar.rhtml:

  <% if @subject.is_a?(Party) %>
    <%= render(:partial => 'parties/contact_info') %>
  <% end %>

  <% if show_company_contact_info?(@subject) %>
    <%= render(:partial => 'parties/contact_info', :object => @subject.company) %>
  <% end %>

  <%= render :partial => 'backgrounds/show' %>
  <%= render :partial => 'contact_dates/index' %>

  <% if @subject.is_a?(Kase) %>
    <%= render :partial => 'kases/parties' %> 
  <% end %>

  <% if @subject.is_a?(Company) %>
    <%= render :partial => 'companies/people' %>
  <% end %>

Don’t worry too much about the individual partials and conditions. The key point is that each partial is a sidebar module, and each module is conditioned based on the particular subject we are rendering. A different mixture of partials will be rendered depending on whether the subject is a person, a company or a case, but they’ll always render in the same order.

We want to re-order these partials dynamically based on whether each module is active or empty. That means we need to represent the possible partials, the conditions for displaying them, and also the conditions for determining whether they are active or empty within some kind of data structure. So we popped open our Rails subjects_helper.rb and represented this information in an array.

in app/views/helpers/subjects_helper.rb:

  def sidebar_modules_to_sort
    returning [] do |m|
            # partial to render       module_is_active?                 options                          render the module for this subject? 
      m << ['parties/contact_info'  , show_contact_info_module_on_top?, {}                             ] if @subject.is_a?(Party)
      m << ['parties/contact_info'  , true                            , {:object => @subject.company}  ] if show_company_contact_info?(@subject)
                                        #necessarily true per the condition at right
      m << ['backgrounds/show'      , !@subject.background.blank?     , {}                             ]
      m << ['contact_dates/index'   , @contact_dates.any?             , {}                             ]
      m << ['collections/parties'   , @subject.parties.any?           , {}                             ] if looking_at_collection?
      m << ['companies/people'      , @subject.people.any?            , {}                             ] if @subject.is_a?(Company)
    end
  end

The helper method sidebar_modules_to_sort returns a parent array full of child arrays, one for each module with an element for the template path, a true/false value to show if it is active, and an options hash for the render method. The conditions that used to determine whether each partial should be rendered now determine whether each child array should be included in the parent array. Thanks to that boolean in the second element of each child array, we can partition the parent array into two groups: those where the second element which represents that the module is ‘active’ are true, and those were that element is false. We use another helper method to partition and reassemble the array into groups.

in app/views/helpers/subjects_helper.rb:

  def sidebar_modules_in_order
    active_group, empty_group  = sidebar_modules_to_sort.partition {|m| m[1]}
    active_group.concat empty_group
  end

Finally we return to our sidebar template to do the actual rendering.

in app/views/subjects/_sidebar.rhtml:

<%= sidebar_modules_in_order.map {|m| render sidebar_module_partial(m)}.join %>

This line in the template takes the sorted array of sidebar modules and replaces each element in the array with the rendered partial. Then the join method converts each element to a string and concatenates them. sidebar_module_partial is a call to one more helper. This helper assembles the arguments for render out of the elements provided in the array. It looks like this:

in app/helpers/subjects_helper.rb:

  def sidebar_module_partial(m)
    m[2].merge({:partial => m[0]})
  end

In the snippet above, sidebar_module_partial takes the third element of each module array, which is either an empty hash or some special options for render, and merges a key specifying the template path onto that hash.

We definitely could’ve hidden these rendering gymnastics behind a helper, perhaps called render_sidebar_modules or something similar. However we’ve decided for style reasons to avoid calling render from within our helpers. Therefore we decided to use a helper to merely fill in the arguments to the call to render within the template itself.

In the end, we have a new sidebar design and some clean and intention-revealing code. This was a fun chance for me to expand my Ruby knowledge by dipping into the nuts and bolts of arrays and hashes. Thanks to Jamis for reviews and advice when I knew there had to be “a better way.” We hope you enjoy the new sidebar modules in Highrise.

Related: What belongs in a helper method?

Activation fees are obscene

in Signal vs. Noise, Wed, 27 Aug 2008 21:22:00 GMT

Wanna feel ripped off today? Sign up for an online virtual service that charges a one-time activation fee. It’s a special feeling to hand over $35 for nothing.

I’d almost understand if there was actual work involved. Or hardware was manually set up. Or someone had to climb some stairs and walk down a few halls to flip something on.

But to charge me $35 to “activate” my account by adding a few records to a few databases, well, that feels like… You know what that feels like.

Product Blog update: Highrise boosts magic site, flooring company uses Backpack, etc.

in Signal vs. Noise, Wed, 27 Aug 2008 19:04:00 GMT

Some recent posts at the 37signals Product Blog:

Highrise
Top magic site thrives due to Highrise and Getting Real
“The real crux of our system is Highrise. We use it in managing projects, production, post-production, and marketing. We use it to stay organized. We use it to manage our authorized retailer clients around the world. And we couldn’t breathe as well or sleep as well without it.”

Backpack
All about tags in Backpack
A tag is a simple label or keyword you can use to categorize your Backpack pages any way you want. Then when you click a tag you can see all the other pages that have that tag. It’s a great way to keep your pages loosely grouped in ways that make sense to you.

Scottish wood floor company runs its business using Backpack
“Our first task was to store documents that we use on to our ‘Important Documents’ page. Traditionally these documents were stored on our company server but it was sometimes problematic accessing these via a VPN if we were working from home or abroad. Accessing them on the cloud via Backpack has simplified this task and we are now working faster and with less hassle.”

gallery
McKay Hardwood Flooring, a Backpack customer, installed the flooring throughout the National Galleries of Scotland.

Basecamp
Embedding a tutorial video into a Basecamp project
“I used the same idea to embed our Camtasia videos into our Tutorials project… solves a huge issue for me since before I could only add a link to the video … I have attached a image of how it looks. It was a great help.”

Subscribe to the Product Blog RSS feed.

The danger of laughing at your customers

in Signal vs. Noise, Wed, 27 Aug 2008 14:36:00 GMT

The other day I went to sell some books at The Strand bookstore. They have a separate desk in the back for selling books. I brought in a bag and two clerks started sorting through them.

Then another guy lined up behind me. One of the clerks said to him, “You here to sell books?” He said, “Yes.” The clerk responded, “Wait in the line outside.” The guy went outside.

Thirty seconds later he was back. The clerk repeated, “Wait in the line outside.” The guy said meekly, “There is no line outside.”

The clerk sighed, looked at the other clerk, and sarcastically said, “There is no line outside.” The other clerk said gruffly, “If you can’t figure out the line, then you can’t sell books here.” The potential seller walked back outside meekly.

A minute later, a girl walked up with books. “Wait in the line outside,” said the clerk again. She walked outside. A few moments later, she was back. “What are you doing?” She said, “Selling books.” He said, “The line is outside.” She walked outside again. The clerks laughed. “Let’s see if the Mensa society out there can figure out how the line works!” And they laughed some more. As if both these customers were complete morons.

Lucky for me, I had arrived moments before these other two. Because I sure had no idea there was a place outside to wait in line. Or that “there’s a line outside” actually means “form a line outside.”

I think a lot of people who work in customer service make a similar mistake in laughing at customers or making fun of them behind their backs (PEBKAC comes to mind).

It can be a dangerous trap. Sure, any one customer might be stupid. But if multiple customers are repeatedly making the same mistake, maybe it’s not a mistake on their part. Maybe it’s a mistake on your part. If no one can figure out where to wait in line, maybe that’s a sign that you’re not doing a good enough job explaining it.

Social Networking for Books: One Ring, or Loosely Joined?

in O'Reilly Radar, Wed, 27 Aug 2008 06:49:44 GMT

I have to confess that one of the social networking tools I find most valuable is Goodreads. (It's a close second to Twitter, and way ahead of Facebook, Friendfeed, or Dopplr.) Unlike twitter, where I follow hundreds of people (possible because of twitter's minimalism) and am followed by thousands, on Goodreads, I follow and am followed by a small circle of friends and people whose taste in books I trust. As someone who loves books, it is the pinnacle of private social networking for me.

So it was with some interest that I read about Amazon's acquisition of Shelfari. Much of the resulting commentary has focused on the problems this poses for LibraryThing, in which Amazon also has an invesment (via their recent purchase of Abebooks.) I'm a bit surprised that the articles have seemingly ignored the fact that Goodreads appears to be the market leader, at least based on data from compete.com:

Of course, that could change quickly if Amazon throws their muscle behind Shelfari and integrates it into their overall service. And there's the rub: we're entering a period of Web 2.0 consolidation. After all, web 2.0 is all about network effects in applications that get better the more people use them. And that means that companies with dominant share tend to get more dominant over time; that dominance need not be organic to start with (though it helps.) Over time, I expect to see companies who've achieved dominant market share in one market segment to use it to dominate a related segment.

But here's the counter: open and interoperable applications, including open social networks. When are companies with "point applications" of social networks going to realize that their best option, in the face of inevitable competition from big companies looking to dominate their market, is to join forces via shared social networks?

Some of my friends prefer LibraryThing. Others may prefer Shelfari. But I only network with those on Goodreads because that's the service I ended up using first. What a shame that I can't see what my friends on LibraryThing and Shelfari might be reading! I'd love to see a firm commitment to cross-application connectivity, with the social network as infrastructure rather than application.

This applies to other specialized social networks as well. Sorry, even though I'm an investor in Tripit, I'm not going to try to rebuild the social network I've already got on dopplr, just because Tripit thinks they'd better add this hot functionality to what was already a unique and interesting product.

I've argued for years that one of the critical architectural decisions we can make about Web 2.0 applications is whether they are built on the "one ring to rule them all" model that we saw with Microsoft Windows and Office, a game where network effects drive a winner-takes-all marketplace, or the Unix/Internet model of "small pieces loosely joined," in which cooperating applications come together to build value greater than any of the pieces do alone.

We're entering the critical phase of that decision. Application developers need to embrace the "small pieces loosely joined" model, or they will be picked off one by one by dominant companies who've already reached scale, and who are practicing the "one ring" model. As Benjamin Franklin said during the American Revolution, "Gentlemen, we must all hang together, or we shall assuredly all hang separately." Now is a good time for LibraryThing and Goodreads to start talking about interoperability.

The Google Alphabet, 2008 edition

in O'Reilly Radar, Wed, 27 Aug 2008 05:08:40 GMT

Google has added Google Suggest to their homepage. When Google suggest first-launched Buster McLeod (AKA Erik Benson) checked the suggested term for each letter to create the Google Alphabet, 2004 edition. When Google News Suggest launched in 2006 I did the same. Now in honor of Google Suggest graduating from labs here is the annotated Google Alphabet, 2008 edition:

A = amazon
B = bebo
C = craigslist (in 2004 this was cnn)
D = dictionary
E = ebay
F = facebook (in 2004 this was firefox's turf)
G = gmail
H = hotmail
I = ikea
J = john lewis (the first result is for John Lewis, a UK retailer that I had never heard of till now)
K = kelly blue book
L = limewire
M = myspace
N = nbc olympics
O = olympics
P = photobucket (over Paypal and beating out 2004's Paris HIlton)
Q = quotes (the first result is for The Quotations Page; I hadn't realized how popular quotes were)
R = runescape
S = sears (I am impressed that Sears is able to beat second-place Skype; 2004 winner Spybot is gone)
T = target
U = utube (you know your site is popular when a misspelling is a top searched term; Google's spell corrector doesn't even try to stop this misspelling)
V = verizon wireless
W = wikipedia (www.youtube.com was ninth on this list)
X = xbox (the only Microsoft product to make the list this year; hotmail was a part of the alphabet in 2004 and gmail was not)
Y = youtube (not a surprise with all the foreshadowing, but this does mean that Yahoo! is no longer on the list)
Z = zip codes

How does Google's algorithms choose the alphabet, err top term? According to the FAQ it's primarily popularity. There must be some other unnamed factors because some of the Google Trends matchups don't support that.

Here's Yahoo! vs. YouTube. Based on the chart it's not surprising that YouTube has come out on top.

y trends chart

Its no surprise that Spybot is gone, but I would have guessed that Skype would come out above Sears.

s trends chart

The Olympics beat out second-place Orkut right now, but I wonder how long it will retain the top spot before coming back again in 2010.

o trends chart

People are more likely to look for free stuff than the news, not surprising that Craigslist is ahead of CNN:

c trends chart

It's been a long, close battle, but Photobucket has definitely beaten out Paypal and Paris Hilton. Paris will probably be apart of the alphabet every so often when she gets a spike in notoriety.

p trends chart

Flickr's Burning Man Map Uses Open Street Map

in O'Reilly Radar, Wed, 27 Aug 2008 00:27:29 GMT

flickr osm brc map

Flickr is best known for its photo-sharing, but increasingly its most innovative work is coming from its geo-developers (Radar post). Yesterday they announced the addition of a street-level map of Black Rock City so that we can view geotagged Burning Man photos. Flickr got the mapping data via Open Street Map's collaboration with Burning Man.

yahoo brc map

Flickr uses Yahoo! Maps for most of their mapping (and fine maps they are). The underlying data for them is primarily provided by NAVTEQ. NAVTEQ's process can take months to update their customers' mapping data servers. For a city like Burning Man that only exists for a week every year that process won't work. However, an open data project like Open Street Map can map that type of city. To the right you can see what Yahoo's map currently looks like.

This isn't the first time Flickr has used OSM's data. They also used it to supplement their maps in time for the Beijing Olympics. I wonder if Yahoo! Maps will consider using OSM data so that their sister site doesn't continue to outshine them (view Beijing on Yahoo Maps vs. Flickr's Map to see what I mean). OSM's data is Creative Commons Attribution-ShareAlike 2.0.

In other geo-Flickr news they have added KML and GeoRSS to their API. This means that you can subscribe to Flickr API calls in your feed reader or Google Earth. (Thanks for the tip on this Niall)

If you want to get more insight into Flickr's geo-thinking watch their talk from the Where 2.0 2008 conference after the jump.

How I Learned to Love Middle Managers

by Joel Spolsky in Joel on Software, Tue, 26 Aug 2008 22:45:01 GMT

Inc. Magazine“Another programmer came to us. ‘I thought you should know that people are really unhappy,’ he said bluntly, ‘and it’s starting to make it so that people just complain all day, instead of doing their work, and that’s not good.’”

From my latest Inc. column: How I Learned to Love Middle Managers

Not loving your job? Visit the Joel on Software Job Board: Great software jobs, great people.

Architects: 1998 called and it wants its web sites back

in Signal vs. Noise, Tue, 26 Aug 2008 13:40:00 GMT

I’ve been poking around a lot of architects’ web sites lately and I’m thoroughly surprised at how bad they are. It seems almost without fail that they are either blowing my browser window up full size, asking me to read light grey 9px text, overflowing with obfuscatory flashterbation, teasing me with custom designed scrollbars that don’t behave as you’d expect, or asking me to evaluate their work based on postage stamp sized photographs. It really feels like 1998. I see I’m not alone in this observation.

Architects have so much to gain from the web. Big huge photographs of their work, clear statements of who they are and what they believe in, easily linkable and sharable portfolio pages, daily links of interest.

As it stands today, if you want to show someone an interesting piece of work you usually have to give them a step-by-step guide on how to get there: First go to the home page, wait for the countdown timer to expire, then hover over the logo, then grab a magnifying glass, then squint, then click the 4th tiny icon on the left (I can’t really tell what it is), then use that custom scrollbar that looks like an elevator, then take a screenshot, then pull that screenshot into Photoshop, then zoom in about 8 times so it’s all nice and big on your screen, then take about 10 steps back from your computer, then look.

I’m only half kidding.

Come on, architects, get with it! Anyone got any links to a great architect’s site that bucks this trend?

Improving Highschool Science Education

in O'Reilly Radar, Tue, 26 Aug 2008 10:00:00 GMT

As I read this fascinating NYTimes piece on a Florida teacher covering evolution, I was reminded of an interesting email exchange I had recently with Kevin Padian, a UC Berkeley professor in the Dept of Integrative Biology, and curator of the UC Museum of Paleontology. He was at Science Foo Camp, and afterward wrote in email:

My area is evolution, the most misunderstood concept in all of science. Two websites that help the public with this are at Berkeley's Museum of Paleontology (evolution.berkeley.edu) and the National Center for Science Education (www.ncseweb.org) (our ExecDir Genie Scott was one of the other participants at camp). I'm in the process of constructing a website on major transitions in evolution to which scientists can contribute, and which will be available to all teachers, students, and textbook writers. We really want to get this stuff into textbooks so that the creationist assertions that we have no evidence for microevolution can be countered. I've outlined a strategy for this in an article (PDF).

Kevin was kind enough to send me a copy of his paper. His thesis is that highschools react to college demands, so providing great free resources for college textbook authors will raise the bar for highschool textbooks. He points to a new type of illustration, the evogram (caution: long, see also this PDF of the relevant slide), which clearly shows evolutionary continuity over both organisms and time. He suggests evograms as a useful addition to the educational toolbox.

My reaction was that I didn't think targeting colleges would work:

I enjoyed your paper. I disagree with your pivotal assumption, though, that if colleges up their game then the high-schools will have to follow. That's just not the case--you only have to look to computer science to see how CS has been gutted at the high-school level. It's as though math were taught in high-schools as "how to use a calculator". Despite our jests, math isn't that bad in high schools--there's still serious math education happening even if it could be done better, but there's precious little serious computing education at all.

Kevin stuck to his guns, though:

Interesting observation, but I think you're making a slightly different (and highly valid) point: that "simplification" for lower grade levels can mean "dumbing down" or even "subvert crucial skills" (like using calculators for everything because they're not making kids learn multiplication tables, estimates, and so on). As a result, the whole structure of CS -- what kids need to know to be literate about CS at the HS level -- is lost. That's exactly what happens when the whole science of macroevolution becomes reduced to making "molds and casts" of fossils instead of teaching concepts about biodiversity through time.

But I will stick to my thesis: K-12 curricula won't include this stuff unless it's taught at the college level. Everything is downward-driven. High schools structure their course offerings based on what will get their kids into colleges. Even at the university level we structure our major requirements for many science departments based on what medical and professional schools want as preparation. It doesn't necessarily mean that if something is in a college text it will be taught in high school, but I'm making a different point: if it's not an important part of the college curriculum, it definitely won't be taught in K-12.

PS: take a look at our UCMP website, evolution.berkeley.edu to see what can be done informally to circumvent the usual textbook-curriculum-standards bottleneck.

I now agree with Kevin—if something's critical at college level, high schools will want to teach it and teach it well. I also love the idea of providing free educational materials that make it easy for textbooks and teachers to cover a topic well. It reminds me of csunplugged.org (created by Kiwis!) that Google funded to be publicly available at no cost. I'd love to see more organized efforts to improve the high-school and college education of science (and computer science) through small reusable teaching resources. Anyone know of some?

a plea to the press: Please just cover the convention(s)

by Lawrence Lessig in Lessig Blog, Tue, 26 Aug 2008 03:15:10 GMT
The Democrats have a HD broadcast of their convention, but only on some platforms, through a Microsoft product. Those fortunate enough to own the most modern technology (and (contrary to the norm) fortunate enough to have fast broadband) can get full convention coverage. The rest of America (to the extent they care, and the point may be related) are stuck with broadcasters coverage. From NPR to the networks, "coverage" means some ridiculous unprepared interview with a party has-been, while a prepared speech by someone currently significant is being given in the background. Please, networks, and especially, NPR, can you please just cover the convention -- both the Democratic and Republican. Obviously, it is party propaganda. But it is also American politics. It is ridiculous that the only people who actually get to see what each party believes it should say are those who are at the Convention, or those with powerful computers and fast technology.

More on broadband numbers

by Lawrence Lessig in Lessig Blog, Mon, 25 Aug 2008 23:30:36 GMT
As I said about my McCain on Technology video, the opening graph is not well defined. Others said the same thing. Neither are the data provided. If I had all the time in the world, I would correct both in the video. I don't. So here's a clarification: I am using a hybrid of the ITU data (2000-2007) and OECD data (1997-1999) in my analysis, but only the latter in the chart. You can see a spreadsheet with both here. The numbers (#5, #22) refer to the U.S. ranking for broadband penetration over that period. OECD doesn't have exactly the same analysis, but because there are relatively few countries with broadband penetration of any significance, it is easy to calculate that broadband penetration for the US goes from #2 to #22 from 1997 through 2007. The Communication Workers of America have a new site and study to bolster the embarrassing state of US broadband quality. You can download their 50 state survey here. Far as I can tell, the simplest explanation for broadband speed is this: How close are you to DC regulators. The closer you are, the better your broadband. Not a perfect predictor, but pretty good.
View: More on broadband numbers - More entries from Lessig Blog, Innovation

Panamaps: A Multi-Layered Map

in O'Reilly Radar, Mon, 25 Aug 2008 22:54:15 GMT

A map is valuable for its ability to convey information. Too much and its illeligible; too little and the map isn't very useful. Layers are used by cartographers to make maps more usable. Layers are easy to turn on and off on digital maps, but it's difficult to have multiple ones on a physical map. The recently-released Panamaps are able to have three layers on a single map. You can get Panamaps for Chicago and New York City. The layers include neighborhoods, transit and streets.

The maps are very cool and are very solid feeling. As you tilt the map you see a different layer. At certain angles you can see two layers at once. The technology behind the layers is fairly advanced as they explain:

1. Artwork for three views of Manhattan is created and optimized for visual performance. This requires a detailed understanding of typeface, line orientation, color contrast and a host of additional subtle but significant design concerns.

holopana

2. The three Images are interlaced by alternating horizontal strips from each. The resulting compound image is calibrated to a specially designed polymer lens substrate. Lenses contain between 60 to 200 micro-lenses per inch, depending on the desired outcome. This is mounted to a backing, die cut and packaged.

viewpana

3. The underlying technology essentially fools the human eye. By rotating the map, the angle of viewing is changed and one of the resulting three layers can be viewed.

Panamaps are produced by Urban Mapping, a geo-data company known for its neighborhood and transit data (Radar post). The company sent me a map of each city. I will definitely be taking my Panamap with me around Manhattan when I am there for Web 2.0 Expo. Neighborhoods, streets, and transit are the most sensible layers for a city map, but what would really get me excited would be the ability to create Panamaps for any set of layers - perhaps your favorite Platial or Google MyMap of a city. Ian White, the CEO, didn't think the economics of this idea would work, but I think that there could be a real market for this.

37signals Live: Tuesday, August 26 at 11:00am central time

in Signal vs. Noise, Mon, 25 Aug 2008 22:47:00 GMT

The next 37signals Live will be tomorrow, August 26th at 11am central time.

The first two Live shows were general Q&As. This time we’re going to narrow down the focus to chapter 13 of Getting Real: Promotion. Generating buzz, getting press, promotion without a budget, launch, etc.

Come armed with questions and we’ll fire back answers. We’ll see you tomorrow at 37signals Live!