S.E.A.N.I.C.U.S.

Thursday, June 22, 2006

New site is live

My new site, seancribbs.com is live! Today I got it hooked up with lighttpd so it runs MUCH faster. As soon as I get the weblogging functionality where I want it, I'll be moving my weblog over there. Until then, enjoy the rest of the site.

I heartily recommend Textdrive. The signup process was painless, the support ticket for a lighttpd port took less than 2 hours, and their servers are rock solid. Kudos to them!

Wednesday, June 21, 2006

Design Guidelines

Yesterday, Sierra (one of the WS interns) and I sat down in our usual way to work on a design mockup/comp for the website redesign. The way we decided to start this time was to look at a bunch college websites and critique them. We came up with a bunch of things that we liked and disliked about them and ultimately -- although it wasn't our intention -- some guidelines about what makes a good design in general. I'm sure this is documented more elegantly in many design books, but here's what we came up with. Keep in mind that none of the ideas are independent of one another, so I may repeat myself.

People-oriented


  • Information should be relevant to the user and organized and layed out in a person-friendly fashion. We may work with computers, but we don't work for them.
  • The design should have a personal touch, appealing to our sensibilities and evoking emotion. Many college websites had the "smiling faces" pictures which were effective.
  • Cater to your audience. The college sites we found most effective focused on who the user is, rather than how the colleges were organized.

Simplicity


  • Overall, the design should be clear and uncluttered.
  • Elements that have different meaning or function should be cleanly separated.
  • Less is more - say what you mean, briefly.

Focus


  • Our eyes are naturally drawn to the center. Put the most important information in the center, and use visual elements to draw our attention there.

  • Properly weight elements. Items that have more importance or hierarchical rank should appear larger or bolder or more saturated than ones with less significance. You'd be surprised how many times this principle is violated, even though it seems self-evident.

  • Avoid distractions. Don't put in a flashy, animated dancing carrot that draws the user's attention away from the primary content.

  • Make interface highlights (e.g. rollovers or page markers) subtle but meaningful.


Consistency


  • Make your primary and your secondary interface elements (e.g. front page and secondary pages) retain similarities so that the user doesn't have to learn a new interface every time.
  • Function should be correlated with appearance. If a button is in one interface, and has the same function in another interface, make it look the same.
  • Make your navigation consistent, for the love of Pete. This goes back to the first point.
  • I hate to borrow it too heavily, but use convention instead of configuration. In other words, give your user one way and one way only to achieve a certain result and make identical elements mean the same thing everywhere. The less they have to learn, the better.

Semantics


  • Make visual elements relevant to the context. If a page is about Faculty, have an image of an instructor in front of the classroom. If I'm on a page about International Student services, don't show me just any old picture of the campus.
  • Forge cognitive associations through consistency and iconography. Our brains largely discover meaning through association, so exploit it.
  • Don't be too wordy, use non-textual clues instead. It can be tiring to read a lot of text just to find out I'm on the Art department page. Show someone painting a canvas instead. This relates to simplicity and focus as well.


I never thought of myself as a designer, but I think I can tell a good design from a bad design. And now I have a rubrick to guide me in my own web designs!

A few personal notes

I decided to take the plunge and purchased some hosting from Textdrive this morning, and did a bunch of updates to my DynDNS account. Pretty soon, this blog will go away, in favor of my own site, the soon-to-be-registered seancribbs.com. My reasons for the change are these:
  1. I'm tired of Blogger's slow publishing time.

  2. I want more control over the layout, structure, and style of my blog.

  3. I want to be able to do web applications in a real environment, not just over my pitiful cable modem connection.

  4. Because I can.
The new site will have a template designed by me. Here's a preview. Yeah I know it's cheesy, get over it ;). Lately I have come to love the Franklin Gothic family of TrueType fonts, so if you have them, the site will be gorgeous. If not, you'll have to settle for Tahoma or Verdana. The site will also be running RadiantCMS, for which I intend to add a few modifications, including comments and integration with the Syntax library.

Tonight I'll be giving a presentation during the KCRUG Ruby on Rails workshop, specifically talking about AJAX and RJS with Rails. I'm in the midst of my preparations right now, so wish me luck!

KCKCC has made me an offer for at least a half-year, salaried and with benefits. I haven't decided whether I'll take it yet -- I may want to consult some people who have been in the workforce a bit longer. It's a decent offer, and while I don't want to stay there forever, it might be nice to use that time to improve my skills and get some more projects under my belt.

Tuesday, June 13, 2006

You learn something new everyday

I reaffirmed this morning my previous habit of using console-printing as a debugging method. In trying to ferret out the FlexTimes problem (see yesterday's post), I found that part of my logic was flawed in the write_attribute. Here's a snippet that doesn't work:
case column.klass # the AR column type
when Date
@attributes[attr_name] = Date.today.to_hash.update(value).to_date
when Time
@attributes[attr_name] = value.to_time
else
@attributes[attr_name] = value
end
Here's the replacement that does:
if column.klass == Date
@attributes[attr_name] = Date.today.to_hash.update(value).to_date
elsif column.klass == Time
@attributes[attr_name] = value.to_time
else
@attributes[attr_name] = value
end
Very subtle difference, but it makes me wonder if I'm not understanding Ruby's case statement correctly. Does it actually check for equality of the when argument to the case argument? Anyone who could elucidate this would receive my eternal gratitude.

Oh yes, and the bug(s) described in yesterday's posts are fixed. Go ahead and use 1.5... I know I will!

Monday, June 12, 2006

My apologies

I sincerely apologize to all of you who use FlexTimes. I committed many changes without verifying that they work. So here's the low-down.

The overloading of ActiveRecord::Base.write_attribute does not work. I cannot figure out why. Maybe it's because it's a private method of AR::Base. Maybe it's because I'm not mixing it in correctly. Either way, it means automagic marshalling of Hashes into AR instances doesn't work the way it should. Even if it did, I'm not sure that mass-assigned attributes (i.e. with Object.new(params[:object]) or @object.attributes=params[:object]) wouldn't slip by it.

Here's what you can do.

  1. Option 1: Continue to use FlexTimes 1.5 from the SVN. If you choose to do this, still use datetime_column and its sister calls until I figure it all out.

  2. Option 2: Do as Option 1, but use the 1.1 tarball or check out revision 1 from SVN.

Thursday, June 08, 2006

New plugin! Learn about Rails!

First order of business: I've released in_place_controls, ... IT'S ALIVE! IT'S ALIVE!...errm check it out at RubyForge. If you want to try it, please check it out via SVN or the script/plugin command. Also, I fixed a serious bug in FlexTimes 1.5 so make sure to get the latest.

Second, KCRUG will be hosting a Ruby on Rails workshop where you can learn how to build your own cool web applications! I'll be giving a presentation toward the end of the workshop on how to use AJAX and RJS. It's REALLY CHEAP to attend, so please come if you can -- however, you will have to bring your own laptop. Shashank, the host and primary instructor, who has been doing Ruby for four years and who edits a major online Ruby-zine, got nice props for the workshop on the ruby-talk list.

Tuesday, June 06, 2006

Major FlexTimes update/refactor

Prompted by a bug submitted to the project last night, I've decided to add some major stuff to FlexTimes:

  1. Many options that are normally passed through to the non-instance helpers (select_xxx) were not being passed, so I'm modifying datetime_select to cleanse the options hash and then pass it on to each helper. One example is :start_year. Unfortunately, because of the way the hash parameters will be parsed, I don't think I'll allow :include_blank.

  2. The most common error in using FlexTimes was not having a datetime_column declaration (or one of its sister declarations) in the model. I've decided to alleviate this by overriding ActiveRecord's write_attribute method, rather than futzing with multiparameter attributes. Spawned from this effort were some other refactorings:

    • Hash will receive two new methods: to_date, and to_time. It only makes sense, since much of what is done in the AR helpers is converting between a hash and a date or time.

    • Likewise, Date and Time will receive a to_hash method. QED.


Not that I have any illusions, but if FlexTimes were to be included in the core, this is the path it must take -- DRY and multi-purpose integration.

For compatibility, the old AR methods will not go away. I'll be posting this newest update as version 1.5 (tarball). I anticipate version 2.0 will do away with the AR declarations.