Conversations with Customers: Chef'n

It’s time once again for another post in our “Conversations with Customers” blog series. This time I had the honor of speaking with Jessica Ahlering, Marketing Manager for Chef’n. The interview below details how Jessica and the team at Chef’n are using Onehub as a retailer and distributor extranet.

Chef'n Logo

Kurt Ricketts (Onehub): Can you tell us a little about what Chef’n does, and what role you play in the company?

Jessica Ahlering: We are a house wares company; we design kitchen gadgets, utensils, and other things for cooking. We also have a few other brands in the lifestyle and entertainment category, as well as cleaning products. I am the Marketing Manager so I handle all of the PR, trade shows, packaging, websites, etc.

Kurt Ricketts (Onehub): How did you hear about Onehub?

Jessica Ahlering: Oddly enough, I heard about Onehub through our website developer. We were looking for something that was much prettier than standard FTP sites of today, and our website developer uses Onehub with the company he works for and recommended it to us.

Kurt Ricketts (Onehub): And how is Chef’n using Onehub today?

Jessica Ahlering: We use it as an FTP replacement for hosting all of our product photography, which is one of the largest components of our selling approach. Onehub provides the perfect alternative where if we don’t have the product in hand to sell, at least we have an easy way to share and view product photos. We’re also providing hi-res images for our distributors so they can print them out for their catalogs or our retailers can print them out for store signage and other things.

A lot of our photos can be up to 12mb in size, and the Chef’n line alone has over 80 products, and when you include all of the colors that are involved you end up in the hundreds of products, there was really no source available to provide all of that without either slowing down people’s computers or being too complicated to understand. We were also really concerned with making sure it was brand specific. We didn’t want to create an FTP site that we had to manage, maintain, and host, because that was more than we wanted to handle in-house.

We currently have hubs where we host photography and videos. We also have hubs used domestically for our retailers, and others used internationally for our distributors, where I can give them collateral, advertisement and marketing ideas, PR samples, all in a very clean and presentable package.

Kurt Ricketts (Onehub): When you were evaluating various services, what led you to choose Onehub?

Jessica Ahlering: I did a ton of research on FTP sites, and other options and possibilities. We needed a solution that was easy for our retailers and distributors to access, so they see all of our products and easily download the photos to choose what they want. Some services in my search just became too complicated to do this. Also, I love how you can view the photos nicely and easily, which helps to create an environment where it feels like our retailers are purchasing the products in the store.

The second thing which is a huge bonus is the customization and branding. We have added our logo, and we can choose a color scheme that is specific to our brand. Not only are we a design forward company but we are very color conscience and very well known for that in our industry, so being able to provide a really bright and colorful online location was an added benefit. I think it’s just easier, I mean, all of the other FTP sites that

I looked at kind of looked like a Microsoft folder, and some of them were just way too difficult to understand and had no personality. One of our core values is that we are design oriented so speaking to our retailers and distributors through something with no personality wasn’t going to work for us.

Kurt Ricketts (Onehub): What benefits are you seeing from your use of Onehub?

Jessica Ahlering: A lot of the people and industries we interact with don’t have a lot of experience with computers, so Onehub has helped us to provide information to our retailers and distributors in an easy to understand format. FTP was simply too complicated for most users, and it would have been too costly to try and develop and manage something on our own.

Kurt Ricketts (Onehub): What is your favorite feature in Onehub, and why?

Jessica Ahlering: I would have to say the customization potential, I spent a lot of time customizing and tailoring Onehub to fit our specific needs, from the color scheme, to the layout, and adding the right features for each hub’s purpose. The hubs are friendly, welcoming, and interesting. I feel that our site will inspire them to want more.

Rolling Deployments with Capistrano

Our rails application runs on a number of servers, each with a number of mongrels, and we use Capistrano to handle our deployments.

Typically, for deployments that involve changes to database structures (migrations), we put up our maintenance page, perform the deployment, and remove the maintenance page. That is all handled in one capistrano command:

cap production deploy:migrations

For most other changes, we deploy code and restart our servers without posting the maintenance page:

cap production deploy

All of the servers are deployed simultaneously, and all mongrels on our servers are then restarted simultaneously. There could be an extended delay (tens of seconds) for someone accessing our site during this period, as the mongrels that are restarting are unable to service requests.

A better experience for our customers would be to deploy the code simultaneously, but then restart the mongrels one-by-one. In this way, our overall raw capacity is diminished, but requests are being serviced continuously through the deployment interval.

We could spend a lot of time “shaving the yak” on this one, but keeping it simple works for most cases. Here’s what our restart task looks like:

desc <<-DESC
   Restart the Mongrel processes on the app server by starting and stopping the cluster. This uses the :use_sudo
   variable to determine whether to use sudo or not. By default, :use_sudo is set to true.
   If roll is true (either invoked via roll task or roll is set) will sleep between restarts of mongrels.
         DESC

task :restart, :roles => :app do
 sudo "/usr/bin/monit restart all -g #{daemon_group}"

 if exists?(:roll)
   rolling_restart_message
   mongrel_count = app_servers.first.attrib?('mongrel_servers').to_i
   starting_port = app_servers.first.attrib?('mongrel_port_number').to_i
   mongrel_count.times do |i|
     sleep rolling_delay # Give daemons and the other mongrel 10 seconds to recover.
     sudo "/usr/bin/monit restart mongrel_#{starting_port + i}"
   end
 else
   sudo "/usr/bin/monit restart all -g #{mongrel_group}"
 end
end

There’s nothing fancy here – we loop through all of the mongrels, and restart them one by one using monit, waiting 10 seconds between restarts.

This type of deployment must be used carefully, since different mongrels will be running different code—any mongrel could service any request at any time. Generally, any time controller actions, validations, or state-encoding methods (e.g. session variables) are changed, rolling deploys can’t be used. But to fix an embarrassing misspelling during prime time with no downtime, it can’t be beat.

Conversations with Customers: Construction Management Solutions

Last week I mentioned our new blog series called “Conversations with Customers” and I’m excited to continue it with a new conversation. This week, I spoke with Adam Trimm of Construction Management Solutions, headquartered in Sierra Madre, CA. Read more about how Adam is using Onehub as a central location to access information.

Construction Management Solutions

Kurt Ricketts (Onehub): Can you tell us a little about what CM Solutions does, and what role you play in the company?

Adam Trimm (Construction Management Solutions):

We are a construction management company; also specializing in claims consulting, project controls, and 4-D project scheduling. We work primarily with agencies and contractors involved with large public works projects, waste water, roads/highways, and bridges.
I am an associate. I do project management working with the client, but I also wear many hats.

Kurt Ricketts (Onehub): How did you hear about us?

Adam Trimm (CMS):
I think through a web search, in hopes of finding something better than SharePoint. We had a serious issue (sharing information outside our network), I’m sure SharePoint is good if you have a full time person that can manage it and develop features as needed, but we were having a real hard time with it and wanted something simple.

Kurt Ricketts (Onehub): How are you using Onehub today?

Adam Trimm (CMS): My colleague and I share duties on several projects so we use it internally for file sharing where we both need access to the same files. It keeps us from emailing files back and forth. We also have some projects with larger clients where the client’s project manager has access to their own hub for an easy way for them to access large files that we need to send them.
We keep one Hub to share files between some employees of CMS marketing operations, and then we have project hubs that we share with our larger clients. We do all of our schedules in 4D, and link 3D drawings in our scheduling software that creates a virtual build-out of our projects. This process creates a very large file that we can turn into, say, an .avi video file that we then upload to Onehub and send to our client so they can see the project build before any ground is ever broken. These large files made it necessary to use Onehub.

Kurt Ricketts (Onehub): When you were evaluating alternatives, what led you to choose Onehub?

Adam Trimm (CMS): The user interface was VERY simple. In a good way, it doesn’t have frivolous bells and whistles. Another one we looked at is a construction management specific solution that everyone in our industry knows. Everyone has been saying they wished there was “software like it that was simple to use without the million useless bells and whistles that make the software so convoluted.”

Kurt Ricketts (Onehub): And Onehub accomplishes that need?

Adam Trimm (CMS): So far it’s been great, exactly what we were looking for. Everyone likes using it and has been happy with it.

Kurt Ricketts (Onehub): What benefits are you seeing from your use of Onehub?

Adam Trimm (CMS): Everyone operates very independently so whether we’re on project sites, or home offices, or the main office, or wherever we may be on any given day; this is a nice way to give us a centralized location to access information. Sort of an easier alternative to FTP.

Kurt Ricketts (Onehub): Thanks for your time.

Adam Trimm (CMS): Thank you.

Conversations with Customers: Jen Francis Design

We’re excited to announce a new blog series called “Conversations with Customers” . Every few weeks we will feature a new customer and share with you their successes while using Onehub. We hope that each interview opens up new ways to use the service and even unlock some new ways of thinking about your current business processes. We will feature companies from all industry types and sizes, each who are using Onehub in their own unique way. This week I had the privilege of interviewing Jen Francis of Jen Francis Design, a graphic design firm located in Warwick, New York. Read more about how Jen is utilizing Onehub as a client extranet.

Jen Franics Design

Kurt Ricketts (Onehub): Tell me about what you do? What is your specialty?

Jen Francis: We do everything from print to web, logos, brochures, annual reports, ads, trade show booths, websites with content management systems, and our clients range from everything from pharmaceuticals to food service.

Kurt Ricketts (Onehub): How are you using Onehub today?

Jen Francis: We use Onehub as a client extranet solution to share files and collaborate with our clients.

Kurt Ricketts (Onehub): Can you give me an example of a client that you work with and how you’re using Onehub with them?

Jen Francis: We’re doing a pro-bono project for the library in our town here, and they ran a photo contest for their annual calendar, we had over 200 entries and needed to pick 13 winners for the calendar.
Everybody was flooding my inbox with these large images, since we needed high res images for the calendar. So we sent out a Hub invitation for each person that won and they were able to go in and just upload their images to the Hub so they weren’t bogging me down.

We use it a lot, say we’re building a website for a client, we set up a hub and everyone on the project can upload their content to it – from the sitemap to the images. It allows us to better collaborate with the developers, we can upload the hi-res images for them to download.

Kurt Ricketts (Onehub): Based on your evaluation of other solutions, what led you to choose Onehub?

Jen Francis: It was a variety of things, the price for what you get… a lot of other solutions either didn’t give you enough storage space, workspaces, or were difficult to manage. We looked at some solutions that were way too costly.

Kurt Ricketts (Onehub): What are your clients, partners, and colleagues saying about the Onehub service?

Jen Francis: Well I personally think it’s very intuitive, the people that know their way around the internet are instantly comfortable with it, or those who have the basic knowledge of how an ftp site would work.

You really don’t need instructions, you just go on and immediately know what to do and it’s not hard to find your way around, everybody seems to be very pleased with it.

And it’s great for our printers too, instead of having to upload to all our different printers’ FTP sites, and trying to figure out all the different ways to send files through their sites, we just upload everything to Onehub and they can grab what they need. It is also great for when I want to work from home for a day, I have all my files on Onehub.

Kurt Ricketts (Onehub): Would you say you’ve been able to save time or money with Onehub?

Jen Francis: Definitely, instead of building a custom extranet, or having someone build a custom ftp site for us, Onehub is much more robust compared to the amount of money we would have to have paid to develop one. It just didn’t make any sense to reinvent the wheel.

Kurt Ricketts (Onehub): Jen, Thank you for your time.

Jen Francis: Thank you very much.

Decorating ActiveRecord Accessor Methods

Recently, I was faced with a quandary. I needed to impart some of our ActiveRecord accessor methods with special functionality, but I also needed to maintain the default behavior for those fields. This was done to support a new input type which we added to the venerable CalendarDateSelect plugin which allows a user to enter a date, time, and meridian, all in separate fields.

CalendarDateSelect Fields

Though I could parse each of the fields in the controller and pass the resulting time to the model, this is messy, error-prone, and unnecessary.

What I really want to be able to do is something like this:

 >> CalendarEvent.new(
      :start_time => {:date => '6/23/2009', :time => '12:30', :meridian => 'pm'})
 => #<CalendarEvent start_time: "2009-06-23 19:30:00">

My first thought was to simply override the accessor methods like so:

CalendarEvent < ActiveRecord::Base
  ...
  def start_time=(new_time)
    self[:start_time] = parse_time_from_hash(new_time)
  end
end

However, as I alluded to before, there’s a problem with this approach. Rails already does some magic behind the scenes to ensure that time values stored to your ActiveRecord objects are automatically cast to and from UTC. The code above will completely overwrite these default accessors, and time zone casting will cease to function for those fields. What I really want to do is decorate these accessor methods, so that I can add to the existing functionality without completely circumventing it.

One way we might think about accomplishing this would be to redefine our accessor method and add behavior to it using alias_method_chain.

def start_time_with_hash_parsing=(new_time)
  new_time = parse_time_from_hash(new_time)
  start_time_without_hash_parsing = new_time
end
alias_method_chain :start_time=, :hash_parsing

Try that, though, and you’ll get this fun little error

`alias_method':NameError: undefined method `start_time=' for class `CalendarEvent'

It doesn’t work because there is no original start_time= method to alias; ActiveRecord creates those methods only when the class is loaded, because it has to read the columns from the database at runtime. So, how do you decorate methods which haven’t even been created yet? Well, it turns out you have to decorate ActiveRecord::Base.define_attribute_methods, which is responsible for creating accessor methods for each model.

There are a couple of ways you can go about doing this, depending on your goals. I wanted to be able to use these enhanced date/time inputs with any model in our application and trigger it from an initializer, so my approach uses alias_method_chain to modify ActiveRecord::Base directly.

module TimeAttributeExtensions
  module ClassMethods

    def define_attribute_methods_with_time_parsing
      if define_attribute_methods_without_time_parsing

        columns_hash.each do |name, column|
          if [:datetime, :timestamp].include?(column.type)
            unless method_defined?(:"#{name}_without_time_parsing=")

              define_method("#{name}_with_time_parsing=") do |time|
                send(:"#{name}_without_time_parsing=", parse_time_from_hash(time))
              end

              alias_method_chain :"#{name}=", :time_parsing
            end
          end
        end

        return true
      end
    end
  end

  module InstanceMethods
    def parse_time_from_hash(time)
      # Do time parsing here
    end
  end

  def self.included(receiver)
    receiver.send(:include, InstanceMethods)
    receiver.extend ClassMethods

    unless receiver.respond_to?(:define_attribute_methods_without_time_parsing)
      class << receiver
        alias_method_chain :define_attribute_methods, :time_parsing
      end
    end
  end
end

Ok, so what exactly does that code do? First, we call the original version of define_attribute_methods. If that returns true, then we know that the attribute accessor methods have been generated. We loop over each column in the model, checking to see whether it stores either a datetime or a timestamp. If so, this is an accessor we’re interested in decorating. We do a quick check to make sure we haven’t already decorated the accessor (which can bite us in development mode), then we redefine the accessor with time parsing, and use the magic of alias_method_chain to alias our original method but still maintain a reference to it.

At the bottom, we use the Module#included callback to add the methods contained in our module, and we once again use alias_method_chain to redefine our version of define_attribute_methods.

Then, in the initializer, you would write something like

ActiveRecord::Base.send(:include, TimeAttributeExtensions)

At this point, any time-based field in any of your models will be able to accept a hash as a value, and properly parse it.

This works well, but one thing I don’t like about this solution is its rampant use of alias_method_chain. There has been some debate in the Rails community over its validity as a design choice, though there really are no other options if you need to modify all subclasses of ActiveRecord::Base (as you would to support a plugin like CalendarDateSelect).

Another Approach

If modifying every subclass isn’t a design requirement, you can clean up the code significantly:

module TimeAttributeExtensions
  module ClassMethods

    def define_attribute_methods
      if super
        columns_hash.each do |name, column|
          if [:datetime, :timestamp].include?(column.type)
            define_method("#{name}=") do |time|
              super parse_time_from_hash(time)
            end
          end
        end

        return true
      end
    end
  end

  module InstanceMethods
    def parse_time_from_hash(time)
      # Do time parsing here
    end
  end

  def self.included(receiver)
    receiver.send(:include, InstanceMethods)
    receiver.extend ClassMethods
  end
end

Notice here we’re just defining define_attribute_methods and calling super when we want access to the previous implementation. The same goes for decorating the actual accessor methods.

The downside of this approach is that you have to explicitly include the module in your ActiveRecord models:

CalendarEvent < ActiveRecord::Base
  include TimeAttributeExtensions
  ...

As with any decision, the approach you take will depend on your requirements, and tradeoffs you’re willing to make between explicitness and ease of use.

Delivery Agent Creates Secure Collaboration Portal

Delivery Agent chooses Onehub to Create a Secure Collaboration Portal and Reduce IT Administration

Delivery Agent, the leader in shopping-enabled entertainment, chooses Onehub to collaborate with high-profile media company partners as well as create a company-wide intranet

Delivery Agent Logo

Situation

Delivery Agent, Inc., is the leader in shopping-enabled entertainment for television shows, movies, magazines, sports, and music videos. Delivery Agent created the market for shopping-enabled entertainment by redefining how products seen on or related to entertainment content are catalogued, sold and measured online.

Delivery Agent partners with high-profile media companies, such as Discovery, A&E, NBC, ABC, CBS, FOX NBC, MTV, UFC, and Universal just to name a few.

They need to share different types of graphical and audio-video media files, spreadsheets, and presentation documents with theses partners.

Splash of Screens

Prior to finding Onehub, Delivery Agent was using a combination of systems and services. Including their own hosted FTP, FTP hosted by their partners, other systems that required software installation on Delivery Agent systems and finally email. Delivery Agent knew that the FTP server had to be replaced and also wanted to consolidate the variety of systems and methods used to share files in order to better manage costs, training time, administration, and support issues. “We had been waiting for an easy to use application like Onehub that would combine collaboration functions (similar to those in popular social networking sites), security that would enable us to protect assets and access, and robust file sharing that was reliable and would accommodate the size and variety of files we work with,” said Glen Hendler, Delivery Agent Customer Support Technician.

Solution
BENEFITS
  • Cost Effective
  • Reduced IT Administration
  • Intranet and Extranet Solution in One

Delivery Agent explored many possible solutions and found Onehub to be the most cost effective solution to meet their needs. Onehub had all the features the Delivery Agent team needed for their extranet and company intranet — and with unlimited user accounts and generous files size and bandwidth restrictions, their search was over.

Implementation and deployment of the Onehub service was effortless, especially compared to solutions that require new client software. With Onehub, Delivery Agent already enjoys savings in time spent on internal IT support and administration. But soon (if not already) the ability for employees who work with outside contacts to create a customized and secure portal to collaborate will outweigh the IT benefits.

“When I see the number of hubs created by staff, and files shared with partners, without IT requests for assistance, I consider that positive feedback. I fully expect a number of our partners will purchase their own Onehub accounts to share files with their other contacts.”

Delivery Agent also needed a Human Resources intranet site for facilitating employee access to benefit information and company news. Instead of purchasing a separate hardware/software solution and taking the time to install, configure and deploy, it was a simple matter instead to create a hub called Human Resources and populate it with information. “Now we have created several other Intranet portals, including one for company/corporate services, one for the IT Helpdesk and several for other organizational groups,” says Hendler.

Using Onehub as a Sharepoint Alternative

Microsoft Sharepoint is now used by the vast majority of enterprise companies. Sharepoint is a powerful solution for building Intranet applications and has grown to become Microsoft’s fastest growing server product. However, Sharepoint is often overkill for small and medium business users and has significant challenges when sharing data and collaborating outside your company.

Onehub provides a powerful, easy-to-use alternative to Microsoft Sharepoint.

When should I use Onehub instead of Sharepoint? Not in every case. If you are building a custom web application or running an company-wide Intranet in a large organization, Sharepoint is the right solution for you. If you are building a client extranet, collaborating with partners, building an Intranet for a department or small business, then Onehub is easier to use, lower cost and much quicker to implement.

Key Benefits of Onehub Compared to Sharepoint

Easy to Use – Onehub does not require a manual or 500 page book to learn. Our service is designed for the business user with the goal of being fun to use while making you more productive.

Setup in Minutes – Onehub is on-demand and you can setup a secure workspace and share with others in minutes. There is no software to install and you can access Onehub from Internet Explorer, Firefox, Safari and Google Chrome.

Drag-and-Drop Customization – Customizing your workspace with drag-and-drop tools and add features with Onehub Widgets. Onehub’s design tools makes it easy to customize a secure workspace to meet your needs without writing a line of code.

Collaborate Outside Your Firewall – Onehub is web application not an Intranet application. We make is easy to invite users, regardless of where they work and control permissions through roles, without any IT involvement.

Affordable Monthly Plans – Onehub is free for the first 30 days and service plans start at just $19 per month. There is no hardware or software to install and you can cancel at any time.

Try Onehub for yourself and see why PC World described Onehub as "All the power of Sharepoint, without the complexity".

Why We Chose 960.gs for Our CSS Framework

A few months back, we redesigned Onehub.com to coincide with the public launch of the Onehub service. There were a ton of goals to achieve with the new design from education, sales and marketing perspectives. I also had my own hidden agenda which resulted in us implementing a CSS framework.

Leading up to the public launch, the breadth and depth of the site had started growing at a pretty good clip. The design and messaging of Onehub.com were already incredibly important to me and their importance was only going to increase post-launch. That being said, the amount of time it was going to take to maintain the site, was just as important to me. After all, if given the choice, I would much rather spend my time on the Onehub service – designing new features and improving existing ones for our customers.

I knew that maintaining Onehub.com in it’s current state was going to start pulling me away from the product. Something was going to have to give. Or was it?

What I wanted to accomplish

I needed to make Onehub.com much easier to maintain but wanted to do it without sacrificing style and flexibility. I was not specifically looking for a CSS framework in the beginning. In fact, I understood at face value why you might actually want to avoid them. However, after realizing that it wouldn’t make sense to leverage the existing Onehub CSS framework, I drafted a simple list of requirements (based on the typical cons of CSS frameworks) and went on the hunt.

Our requirements

  • Should be easy to learn
  • Should be easy to maintain
  • Should have a small footprint
  • Should be as semantic as possible

The frameworks that were considered

There are a bunch. I tried most of them and immediately narrowed the list down to 960.gs, Boilerplate, Tripoli, Blueprint and YUI. From here, the only one I immediately disliked was YUI – thanks to crazy naming conventions and some overkill. Of the remaining 4, it mostly came down to personal preference. Blueprint and Tripoli did more than what I was looking for. Boilerplate did less.

960.gs emerged as the framework that I felt had the potential to be most useful most often. Here is why it worked particularly well for us.

Easy to learn

Quite frankly, the learning curve for 960.gs is almost non-existent. If you already understand the concept of grids and the necessity for having access to the first and last items in a given collection – understanding the 960.gs syntax is a piece of cake.

You’ve got two grids to choose from. One that allows for 12 columns and one for 16. Want a 3 column layout? Create a 12 column container and fill it with 3 elements, each 4 columns wide:

<div class="container_12">
    <div id="blog" class="grid_4"></div>
    <div id="photos" class=grid_4"></div>
    <div id="links" class="grid_4"></div>
</div>

No really. It’s that easy.

Easy to maintain

Because 960.gs is so easy to learn, it is naturally easier to maintain. Getting multiple designers on the same page can be as simple as showing them the code snippet above and having them go to town. If you buy in to the 960.gs conventions, you can immediately begin taking advantage of it in your work flow.

Furthermore, 960.gs is browser compliant all the way down to IE6. Now, you can certainly mess that up if you try, but it is absolutely killer to be able to rely on a bulletproof grid out of the gates.

Has a small footprint

I didn’t use the text.css file from 960.gs as everything it covered was going to be redone anyway. That left us with Eric Meyer’s CSS Reset and the main 960.css file which is a mere (3.6 KB) when compressed. It is brilliantly small. See for yourself:

The only tweaks that I made, were in implementing some snazzy, automatic float clearing to the 960.gs containers and .alpha classes. Everything else is custom CSS on top of 960.gs for the Onehub.com design.

As semantic as possible

Let’s be honest. In order to make a CSS framework useful, you’re going to have to make some sacrifices when it comes to semantics and naming conventions. I think Nathan Smith, the guy behind 960.gs, made some incredibly smart ones.

Most of us use something like container or wrapper for classing our containing elements. If you want a container that allows for 16 columns using 960.gs, you’d use:

<div class="container_16"></div>

Are you mixing some structure in to your class names with the 16? Sure. Is it worth it? I’ll say. It doesn’t make the class any less descriptive. In fact, depending on how you see it, one could argue that it adds clarity. If another designer were to see this HTML they now know it is a container element and contains 16 columns.

Remember, the underlying purpose of being semantic is to avoid having to revisit the structure of your site as often as you revisit the style of your site. Adding the 16 in this particular case does not make it any more or less likely that you’ll need to revisit that code.

Point being, choose your battles wisely. In the time you could argue the relevance of naming conventions like these – I just built a 16-column layout.

For the interior elements, Nathan also chose to avoid the common practice of repeatedly typing a class name like column as well as a number designator. Rather, he combined them in to one. Furthermore, using grid in the name further reinforces the idea of making multiple designers aware of the grid when they go in to edit the HTML.

I’m also a fan of the alpha/omega classes in place of a traditional first/last. Though it doesn’t seem like a big deal at first, I think it is a clever way of conveying the meaning of first/last while adding back a tiny bit of flexibility. It is also a life saver for the handful of times when you decide to break up your grid and nest grid elements inside each other.

960.gs gets you on a grid and then gets out of your way

Converting all of our mockups for the Onehub redesign to working layouts took a single day. Integrating our existing content took another day. After that, it was all polish.

After launch, rolling on 960.gs has allowed us to continue to design and maintain Onehub.com faster, with fewer mistakes and without having to worry about IE for the majority of our layout issues. This allows us to spend the majority of our time on the creative aspects and the messaging of Onehub.com.

Most importantly, it gives me more time to spend on the product. This makes me and our customers happier and I simply can’t argue with that.

Rails Maintenance Pages Done Right

A maintenance page is a common feature in a rails deployment. This feature enables the developers to put their application into “maintenance mode”, returning 503 (Service Temporarily Unavailable) and a helpful page that describes what is happening and when the user can expect service to resume.

In an nginx configuration file this would be something like this:

if (-f $document_root/system/maintenance.html) {
  return 503;
}

error_page 404 /404.html;
error_page 500 502 504 /500.html;
error_page 503 @503;
location @503 {
  rewrite ^(.*)$ /system/maintenance.html break;
}

The page can then be activated or deactivated from a simple Capistrano task:

# Swap in the maintenance page
namespace :web do
  task :disable, :roles => :web do
    on_rollback { run "rm #{shared_path}/system/maintenance.html" }

    run "if [[ !(-f #{shared_path}/system/maintenance.html) ]] ; then ln -s #{shared_path}/system/maintenance.html.not_active #{shared_path}/system/maintenance.html ; else echo 'maintenance page already up'; fi"
  end

  task :enable, :roles => :web do
    run "rm #{shared_path}/system/maintenance.html"
  end
end

This pretty typical configuration is lacking two desirable features. First, what if you want your logo image on your maintenance page? Lets try this:

if (-f $document_root/system/maintenance.html) {
  return 503;
}

error_page 404 /404.html;
error_page 500 502 504 /500.html;
error_page 503 @503;
location @503 {
  # Serve static assets if found.
  if (-f $request_filename) {
    break;
  }

  rewrite ^(.*)$ /system/maintenance.html break;
}

This configuration will serve any static assets nginx can find on disk, but it will continue to return the 503 HTTP Status Code.

Finally, nginx, like most webservers will not let you POST to a static file. If a user loads your login page, then you switch on your maintenance page, the user will be greeted with the standard nginx 405 (Method Not Allowed) page. The solution is to capture 405 errors in your @503 location block, serving the maintenance page. In addition, you will have to enable @recursiveerrorpages@, since you are first, intentionally, throwing a 503 error, and then the user is throwing a 405 by posting to your static file:

recursive_error_pages on;

if (-f $document_root/system/maintenance.html) {
  return 503;
}

error_page 404 /404.html;
error_page 500 502 504 /500.html;
error_page 503 @503;
location @503 {

  error_page 405 = /system/maintenance.html;

  # Serve static assets if found.
  if (-f $request_filename) {
    break;
  }

  rewrite ^(.*)$ /system/maintenance.html break;
}

Now you can serve your stylish maintenance page no matter what the situation is.

CEA chooses Onehub to share files more easily with clients and reduce printing

Onehub helps real estate services company save money, the environment and surpass customer expectations.

Situation

Construction Economists of America (CEA International)
Construction Economists of America (CEA International) is a Rochester, NY-based real estate services company that specializes in estimating and construction monitoring services for banks that provide mortgages on large real estate projects. The CEA client base is predominantly commercial real estate lenders like Bank of America, HSBC Bank, Citizens Bank and more.

“Onehub is not only saving us time, it’s also saving us money because it has lessened the need for color printing and binding of reports. In addition, Onehub is helping us do our part for the environment, because we have reduced our printing by over 50%.”Louis Giardino, President of CEA International

CEA produces hundreds of highly-confidential reports for their clients each month. The reports are typically large (over 100 MB) .pdf files. As a service provider, the CEA team needs to share these reports with their clients on a regular basis.

Before Onehub, CEA often had to print, bind and send these very large reports via mail. They evolved into sending parts of the reports by email attachments, and eventually through an unsecure FTP site—which was always a concern.

“We wanted to make improvements to the way we shared business information and files and enhance the service we provide to our customers. We found solutions that cost upwards of $50,000 to set up but it was essential that we find a more cost effective alternative,” said Louis Giardino, President of CEA International.

Solution

Onehub was the solution

In October 2008, CEA chose Onehub as their extranet solution provider. CEA has over 40 Hubs for each of their clients and the CEA team is sharing gigabytes of data each month. Onehub gave CEA the ability to upload a complete report without having to divide it into smaller files to send via email.

“Onehub is not only saving us time, it’s also saving us money because it has lessened the need for color printing and binding of reports,” said Giardino. “In addition, Onehub is helping us do our part for the environment, because we have reduced our printing by over 50%.”

In addition, Onehub features like the shared calendar have improved their customers’ satisfaction by allowing them to share scheduling information. “Our clients have told us that they find Onehub to be user friendly and a pleasure to work with. We are happy to have surpassed their expectations,” said Giardino.