<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>factor[e] :: on the floor</title>
    <description>Find out the latest from the back room at factor[e].</description>
    <link>http://factore.ca/on-the-floor</link>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/factore" /><feedburner:info uri="factore" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>Making a stand at factor[e]</title>
      <description>&lt;p&gt;Oh so many punsibilities with this little bit of news.&lt;/p&gt;
&lt;p&gt;Over the past little while we've been reading a lot about the merits of standing all day vs. sitting all day. The general gist of most of them being that sitting will kill you. I really don't think it's all that bad, but given my amazing ability to slouch and *incredible* posture I figured it might be a good idea.&lt;/p&gt;
&lt;p&gt;So, with &lt;a href="http://factore.ca/company/15"&gt;Marc&lt;/a&gt; being the driving force and &lt;a href="http://factore.ca/company/17"&gt;Martin&lt;/a&gt;&amp;nbsp;(literally) standing in as our case study Marc and I have just set up our first standing desks.&lt;/p&gt;
&lt;p&gt;It's only been a few hours, but the first thing I've noticed is how much more alert I feel. I've also noticed I need better insoles.Either way I'm starting to get into this. We'll post updates and let you know how it goes.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;And in case you were wondering, everyone else in the office thinks we're crazy.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://factore.ca/system/images/images/148/original/stand-up.jpg?1328808187" /&gt;&lt;/p&gt;
&lt;p&gt;Here's a little bit of reading if you're at all curious:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.medicalbillingandcoding.org/sitting-kills/"&gt;Sitting is Killing You: The Truth About Sitting Down [Infographic]&lt;/a&gt; - This is a little dark, but it's an infographic so I enjoyed it more than all those articles with words.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mashable.com/2011/04/22/standup-desks/"&gt;Are You Sitting Down? Why Standing Up Might Save Your Life&lt;/a&gt; - A bit of history, a bit of information and a few links to other articles that have been written.&lt;/p&gt;
&lt;p&gt;Some science for those who only trust scientists:&lt;br /&gt;
&lt;a href="http://www.sciencedaily.com/videos/2008/0610-stand_up_for_your_health.htm"&gt;Physiologists And Microbiologists Find Link Between Sitting And Poor Health [Video]&amp;nbsp;&lt;br /&gt;
&lt;/a&gt;&lt;a href="http://www.sciencedaily.com/releases/2007/11/071119130734.htm"&gt;Sitting May Increase Risk Of Disease&lt;br /&gt;
&lt;/a&gt;&lt;a href="http://diabetes.diabetesjournals.org/content/56/11/2655.full"&gt;Role of Low Energy Expenditure and Sitting in Obesity, Metabolic Syndrome, Type 2 Diabetes, and Cardiovascular Disease&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Also, try Googling &amp;quot;treadmill desk&amp;quot; or &amp;quot;cycling desk&amp;quot; for a few more energetic approaches to not sitting at work.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/RxVc_fuUUe0" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 09 Feb 2012 12:22:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/RxVc_fuUUe0/129-making-a-stand-at-factor-e-</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/129-making-a-stand-at-factor-e-</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/129-making-a-stand-at-factor-e-</feedburner:origLink></item>
    <item>
      <title>Hamilton Wins 4 EDCO Awards</title>
      <description>&lt;p&gt;&lt;a href="http://www.investinhamilton.ca/"&gt;Hamilton Economic Development&lt;/a&gt;&amp;nbsp;(EcDev), the city's economic development division, collected four awards at the &lt;a href="http://www.edco.on.ca/"&gt;Economic Developers Council of Ontario&lt;/a&gt; (EDCO)'s annual conference last night.&lt;/p&gt;
&lt;p&gt;Of those four awards, we're all very proud and honoured to be a part of &lt;strong&gt;three&lt;/strong&gt; of them!&lt;/p&gt;
&lt;p&gt;Last year, we worked closely with EcDev to design their &lt;a href="http://www.investinhamilton.ca/"&gt;award-winning website&lt;/a&gt; which took home the award of 'Best Economic Development Website'.&lt;/p&gt;
&lt;p&gt;We also designed their 2010 annual report titled 'One Billion', which took home the award for 'Best Annual Report'. The book was titled 'One Billion' to reflect 2010 as the first year in which $1 billion was invested in the City of Hamilton. The book also featured the brilliant architectural photography of &lt;a href="http://bankophotographic.com/"&gt;Dan Banko&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We were also part of an award-winning ad campaign with both EcDev and Maple Leaf Foods.&lt;/p&gt;
&lt;p&gt;We'd like to officially congratulate EcDev on their successes last night. They are doing wonderful things for our city and it's been nothing but a pleasure working with them. We're on for another year as agency of record and we're all looking forward to being part of building up our city and telling the world &lt;a href="http://youtu.be/hpfbhv373n4"&gt;how great it is here in Hamilton&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Read more&lt;/p&gt;
&lt;p&gt;Today's article in the &lt;a href="http://www.thespec.com/iphone/news/article/665045--city-department-takes-away-four-economic-development-awards"&gt;Hamilton Spectator&lt;/a&gt;&lt;br /&gt;
The post on &lt;a href="http://www.investinhamilton.ca/hamilton-wins-4-edco-awards/"&gt;EcDev's site&lt;/a&gt;&lt;br type="_moz" /&gt;
&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img width="550" height="424" align="middle" alt="" src="http://factore.ca/system/images/images/147/original/EcDev_webshot.jpg?1328288718" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/u2RgmA2wSDU" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 03 Feb 2012 12:10:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/u2RgmA2wSDU/128-hamilton-wins-4-edco-awards</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/128-hamilton-wins-4-edco-awards</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/128-hamilton-wins-4-edco-awards</feedburner:origLink></item>
    <item>
      <title>Furor Over Working Conditions At Apple Suppliers Is A Risk Of Globalization</title>
      <description>&lt;p&gt;&lt;em&gt;The public relations nightmare that Apple is experiencing over working conditions at its suppliers is the result of the tension between its marketing and its image, and reality.  It shows what happens when market forces in one country clash with market forces in another.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A &lt;a href="http://www.nytimes.com/2012/01/26/business/ieconomy-apples-ipad-and-the-human-costs-for-workers-in-china.html?pagewanted=all"&gt;report in the New York Times&lt;/a&gt; about working conditions at Foxconn and other Apple suppliers in China has triggered &lt;a href="http://sumofus.org/campaigns/ethical-iphone/"&gt;petitions for 'an ethical iPhone 5'&lt;/a&gt; and &lt;a href="http://www.macworld.co.uk/apple-business/news/?newsid=3333878&amp;amp;pagtype=allchandate"&gt;calls for a boycott of Apple products&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Apple has an extraordinarily good public image, and stories like these represent a significant risk to the Apple brand.  It didn't take long, however, before people started to push back.&lt;/p&gt;
&lt;p&gt;One of the most widely-cited counter-arguments is a piece called &lt;a href="http://www.forbes.com/sites/timworstall/2012/01/29/the-apple-boycott-people-are-spouting-nonsense-about-chinese-manufacturing/"&gt;The Apple Boycott: People Are Spouting Nonsense about Chinese Manufacturing&lt;/a&gt;.  In it, author Tim Worstall argues that workers in these factories enjoy a better working experience and overall standard of life than most Chinese workers, that suicide rates among Foxconn employees compare favourably against the Chinese national average, and that the incidence of serious injuries and fatalities at these plants compares favourably against the rate of accidents at American factories.&lt;/p&gt;
&lt;p&gt;In fairness to Apple, much of this may be true.  It is also true that these suppliers supply not just Apple but most of the major electronics companies, including Apple's most significant competitors.&lt;/p&gt;
&lt;p&gt;At the same time, one cannot argue that working conditions are far different from what Westerners take for granted.  In the &lt;em&gt;Times&lt;/em&gt; piece, we learned that workers commonly work twelve-hour shifts, six days per week (and sometimes seven); that they live in crowded dorms with up to 20 people per 3-room apartment on-site at the factory; that riots have broken out over working and living conditions; and that some workers say they &amp;quot;stand so long that their legs swell until they can hardly walk&amp;quot;.  All this while performing intensely repetitive tasks at astonishing speed.&lt;/p&gt;
&lt;p&gt;Worstall's response is blunt:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;Well, yes, they&amp;rsquo;re poor people living in a poor country. That&amp;rsquo;s what being poor means, having to work extremely hard to make very little. Yes, that is a harsh thing to say but then reality can indeed be harsh.&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;No one can deny that reality can be harsh. At the same time, its undeniable that Apple - and, of course, the other electronics companies - does not truthfully convey that reality to its customers. Doing so would not be in Apple's best interest. However, if the calls for a boycott succeed, it would demonstrate that having this tension between reality and image is also not in Apple's best interest.&lt;/p&gt;
&lt;p&gt;Worstall goes on to make the standard corporatist argument that the behaviour of corporations is outside of their control, because they are subject to market forces.  For example:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;Wages paid to manufacturing workers in China are not determined by the productivity of those specific workers. They are not determined by US wages, by the profits that Apple makes nor even by the good intentions of the creative types that purchase Apple products. They are determined by the wages paid by other jobs in China and that is itself determined by the average level of productivity across the Chinese economy.&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;But Apple is made up of humans.  It is not a windmill that turns whichever way the winds of the Chinese labour market happen to blow.  It is not humanly impossible to demand that a supplier adhere to higher standards than are prevalent in the rest of China.&lt;/p&gt;
&lt;p&gt;Setting that aside, let's examine the issue purely from the standpoint of the marketplace, but rather than looking at the Chinese labour marketplace, let's look at the consumer goods marketplace in the West.&lt;/p&gt;
&lt;p&gt;Humans respond to a variety of different factors when making purchasing decisions. It is not just about price and quality, but can also be about morality and emotion. In this instance, Apple's customers may be persuaded to boycott Apple because of these subjective factors.&lt;/p&gt;
&lt;p&gt;That may seem unfair to some, but isn't that just a risk of globalization? After all, a global company must deal with market forces everywhere it operates: both market forces affecting who makes its products, and market forces affecting who purchases them.&lt;/p&gt;
&lt;p&gt;Apple will be forced to balance these market forces, and when it does so, it may result in lower profit margins but better working conditions at its suppliers' factories.&lt;/p&gt;
&lt;p&gt;Seen from this perspective, what is happening to Apple's image could be dubbed a market correction.  Proponents of globalization should be pleased.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/w8d3wMXs054" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 03 Feb 2012 07:19:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/w8d3wMXs054/127-furor-over-working-conditions-at-apple-suppliers-is-a-risk-of-globalization</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/127-furor-over-working-conditions-at-apple-suppliers-is-a-risk-of-globalization</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/127-furor-over-working-conditions-at-apple-suppliers-is-a-risk-of-globalization</feedburner:origLink></item>
    <item>
      <title>Reversible Rails Generators</title>
      <description>&lt;p&gt;In order to help us develop our sites more efficiently, we use some custom Rails generators, particularly one that creates a scaffold hand-crafted for our purposes. &amp;nbsp;After &lt;code&gt;generate&lt;/code&gt;-ing a new scaffold incorrectly, I &lt;code&gt;destroy&lt;/code&gt;ed it. &amp;nbsp;I noticed, however, that one of the steps in the scaffold had been duplicated during the &lt;code&gt;destroy&lt;/code&gt;, rather than being reversed. &amp;nbsp;Hmm, how to fix that?&lt;/p&gt;
&lt;p&gt;First things first, when you run a generator (either by invoking it with &lt;code&gt;generate&lt;/code&gt; or &lt;code&gt;destroy&lt;/code&gt;), every method is called once. &amp;nbsp;So, the secret to creating a reversible method is in discovering how the generator was invoked. &amp;nbsp;After doing a ton of Googling, then reading the &lt;a href="https://github.com/wycats/thor"&gt;Thor&lt;/a&gt; documentation and source code, I found out that you just need to check &lt;code&gt;self.behavior&lt;/code&gt; inside the method, and tailor the code depending on the return value, like this:&lt;/p&gt;
&lt;pre&gt;
def do_some_stuff
  case self.behavior
  when :invoke
    # do that stuff
  when :revoke
    # undo it!
  end
end
&lt;/pre&gt;
&lt;p&gt;Bam! &amp;nbsp;Reversible generator.&lt;/p&gt;
&lt;p&gt;Bonus tip: &amp;nbsp;One of the methods I wanted to reverse required some user action once the method had run. &amp;nbsp;You can output coloured output from the method by using the &lt;code&gt;say&lt;/code&gt; method, and passing it the string and the colour. &amp;nbsp;To save you the googling, source code reading and head-scratching, you specify the colour like this:&lt;/p&gt;
&lt;pre&gt;
say &amp;quot;WTF?!?&amp;quot;, :red&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/H8WS_sJ9EDk" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 02 Feb 2012 16:07:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/H8WS_sJ9EDk/126-reversible-rails-generators</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/126-reversible-rails-generators</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/126-reversible-rails-generators</feedburner:origLink></item>
    <item>
      <title>Sponsoring Chocolate Fest: a yearly tradition at factor[e]</title>
      <description>&lt;p&gt;factor[e] couldn't be happier to begin its eighth straight year sponsoring the yummy Chocolate Fest fundraiser for SACHA, Sexual Assault Centre of Hamilton and Area. SACHA is one of factor[e]'s oldest clients and we congratulate them on all the hard work and dedication they bring to this vital cause each year. Chocolate Fest is an elegant evening of chocolate treats from Hamilton's finest bakeries and restaurants. Mark your calendars! This year's event is on Thursday February 9th, 2012. Get your tickets and we'll see you there!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Chocolate Fest Event Collateral" src="http://factore.ca/system/images/images/146/original/CF_materials_sm.jpg?1325886199" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/jcZufzpF4LQ" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 06 Jan 2012 16:41:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/jcZufzpF4LQ/125-sponsoring-chocolate-fest-a-yearly-tradition-at-factor-e-</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/125-sponsoring-chocolate-fest-a-yearly-tradition-at-factor-e-</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/125-sponsoring-chocolate-fest-a-yearly-tradition-at-factor-e-</feedburner:origLink></item>
    <item>
      <title>Tricks Of The Project Manager's Trade</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;span style="color: rgb(0, 0, 0); "&gt;&lt;span style="background-color: rgba(255, 255, 255, 0.917969); font-family: arial, sans-serif; font-size: 13px; "&gt;Being a project manager means that I have to be on top of everything. If something gets missed or slips through the cracks, it's no-one's fault but my own and I hate making mistakes.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="im" style="color: rgb(80, 0, 80); font-family: arial, sans-serif; font-size: 13px; background-color: rgba(255, 255, 255, 0.917969); "&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;As in any job, trying to remember the things you need to do, when to do them, and what's involved can be taxing at the best of times. When that's ALL your job entails, you have to figure out little tricks to help you along.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;&lt;b&gt;Post-it Notes&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;There is one thing I can't live without &amp;ndash; in work and in my personal life: Post-it Notes. I love them! I love the different sizes to accommodate the length of the note and the colours to code different things accordingly.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;Some have lines, some don't, but they all do their job 100% effectively: they keep me in-the-know. Admittedly, I use too many of them, but when you need to write things down as often as I do, they ensure things don't get missed.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;img width="400" height="498" border="1" align="middle" alt="" src="http://factore.ca/system/images/images/145/original/PosIt.png?1325869861" /&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;&lt;b&gt;A Paper To-Do List&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;The next love of my life is my to-do list. It keeps me in the loop on where things are at and what I need to do. I like to reward myself for getting things done, my inner geek comes out and I put little checks beside each item so when I'm finished the task, I can have a moment of victory when I get to literally &amp;quot;CHECK!&amp;quot; another thing off my list.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;I also categorize my list into two sides. One side is for updates from the team - things I'll need to know that I may have to update people on. The other side is Tara-specific: items I need to personally take care of.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;I like reflecting on this list often. I find the more I look at it, the more things I can think of that I will need to do now or later on. It helps me be proactive, and the more I learn the industry and the services we provide, the lengthier my lists get.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;Reflection is really a key part of good project management.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;&lt;b&gt;Online Task Reminders&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;An extension of my to-do list is my online task reminder in Highrise. This is email-specific. Every time I read an email that requires me to follow up on something or light a fire under a colleague or client's toes, whether it's today, this week, this month or 6 months from now, I track it in my online system and set a reminder to pop up.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;I always set it a few days in advance if it is something that requires relying on someone else. &amp;nbsp;That helps avoid delays. &amp;nbsp;Keeping things on time helps build trust with clients and coworkers.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;And finally, I bring a pen and paper EVERYWHERE! I have them in my car, in my purse, and numerous places in my home. My desk is covered in note pads and writing utensils.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;You never know when you are going to need to write something down, and for me it's all the time. &amp;nbsp;It doesn't matter what I am doing, random things will pop in my head about things I'll need to do, and if I don't write it down right then, they're gone as quick as they arrived.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style="color: rgb(34, 34, 34); font-family: arial, sans-serif; font-size: 13px; background-color: rgba(255, 255, 255, 0.917969); "&gt;&lt;span style="color: rgb(0, 0, 0); "&gt;I've never been one of those fortunate people that have the ability to remember everything without writing things down. I always tend to forget at least one thing, but these tricks really help me stay on top of my game, and ultimately help the team provide the best possible service for our clients.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/iz-QUqSnR2o" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 06 Jan 2012 12:12:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/iz-QUqSnR2o/124-tricks-of-the-project-manager-s-trade</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/124-tricks-of-the-project-manager-s-trade</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/124-tricks-of-the-project-manager-s-trade</feedburner:origLink></item>
    <item>
      <title>Access vs. Ownership</title>
      <description>&lt;p&gt;Last October I subscribed to Rdio, a music streaming service that's available for iPhone.&amp;nbsp; For some reason or another, after syncing my contacts and calendars and mail accounts, I decided not to spend time syncing my music.&amp;nbsp; Instead, I opted to look for an alternative.&lt;br /&gt;
&lt;br /&gt;
The service is $9.99 per month and after three months of using it I'm still very pleased with collection of music it has to offer.&amp;nbsp; What's more is that it provides recommendations based on my listening history - allowing me to discover new music at no additional cost.&lt;br /&gt;
&lt;br /&gt;
This inspired me to look at design-related services I use that offer resources in a similar way:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.factore.ca/system/images/images/144/original/01-Access-v-Ownership.jpg?1325793130" alt="" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Google Web Fonts&lt;/strong&gt;&lt;br /&gt;
Historically, web designers have been relegated to use standard display fonts (Arial, Verdana, Times, etc.) because they were commonly owned. Services like Cufon an Sifr offer ways to embed fonts into websites but still require the designer to own them.&lt;br /&gt;
&lt;br /&gt;
Google Web Fonts is a directory of fonts that is free to use and can be easily accessed.&amp;nbsp; You can pick a font and choose an embed method or download the file to use in a mock-up.&amp;nbsp; The library is constantly growing and the service allows (and encourages) designers to contribute.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;iStock Photo&lt;/strong&gt;&lt;br /&gt;
Has anyone hired a professional to photograph an attractive girl in a headset for a company's contact page?&amp;nbsp; What about to illustrate a yellow stick-man walking up a bar graph?&amp;nbsp; Probably not.&lt;br /&gt;
&lt;br /&gt;
Even though I do support and advocate the use of professional photographers and illustrators, it's hard to deny the low-cost accessibility of stock photography websites - especially when working on tight budgets.&lt;br /&gt;
&lt;br /&gt;
However, because the images are so accessible, you may find that same girl waiting to take your call on a number of different websites.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;jQuery&lt;/strong&gt;&lt;br /&gt;
This open-source JavaScript platform provides developers a way to quickly and easily write plugins (or modify exiting ones) that perform a variety of functions.&amp;nbsp; As a basic example, consider the commonly used image rotator.&lt;br /&gt;
&lt;br /&gt;
There's no longer a need to write a custom script to achieve such a simple effect.&amp;nbsp; You can access the base script through download or Google API and customize it by using plugins or changing settings.&lt;br /&gt;
&lt;br /&gt;
As a designer, I appreciate the accessibility of libraries like this because it gives me something to design for.&amp;nbsp; Looking through tutorials and demos, I'm able to create a design that suggests not only the layout, but also an effect that is triggered once an element is clicked or hovered upon.&lt;br /&gt;
&lt;br /&gt;
There are many more examples than the ones I've cited above and I'm excited to see how media and software will continue to evolve to accommodate the way people use it.&amp;nbsp; I'm not the first one to suggest that access will trump ownership, but I feel that it will become much more apparent in 2012.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/ppXZP2xvPuw" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 05 Jan 2012 14:48:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/ppXZP2xvPuw/123-access-vs-ownership</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/123-access-vs-ownership</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/123-access-vs-ownership</feedburner:origLink></item>
    <item>
      <title>My Holiday Reading List</title>
      <description>&lt;p&gt;This year, I'm all about maintainable code. &amp;nbsp;Making it, turning old code into it, making sure it stays that way.&amp;nbsp;I'm so serious about it, in fact, that I'm declaring 2012 to be &amp;quot;The Year of Maintainable Code&amp;quot;. &amp;nbsp;We'll see how well that holds up&amp;nbsp;next December.&lt;/p&gt;
&lt;div&gt;In preparation for MMXII:TYOMC, I've got a stack of reading material for my Christmas break:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://www.amazon.ca/Code-Complete-Steve-McConnell/dp/0735619670/ref=sr_1_1?ie=UTF8&amp;amp;qid=1324659470&amp;amp;sr=8-1"&gt;Code Complete by Steve McConnell&lt;/a&gt;. &amp;nbsp;Even if you've already read this book, take the time to read it again. &amp;nbsp;This is one of those books that you can open&amp;nbsp;at random, read the page and go &amp;quot;Oh yeah, that's a good idea&amp;quot;. &amp;nbsp;Awesome awesome awesome.&lt;/li&gt;
    &lt;br /&gt;
    &lt;li&gt;&lt;a href="http://www.amazon.ca/Refactoring-Improving-Design-Existing-Code/dp/0201485672/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1324659514&amp;amp;sr=1-1"&gt;Refactoring by Martin Fowler et al&lt;/a&gt;. &amp;nbsp;I just picked this up and haven't read it yet, but I'm looking forward to it. &amp;nbsp;I've written my share of &amp;quot;legacy code&amp;quot; this year&amp;nbsp;and I'm hoping this will give me some good advice on cleaning up the messes I've made.&lt;/li&gt;&lt;br/&gt;
    &lt;li&gt;&lt;a href="http://www.amazon.ca/RSpec-Book-Behaviour-Development-Cucumber/dp/1934356379/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1324659547&amp;amp;sr=1-1"&gt;The RSpec Book by David Chelimsky et al&lt;/a&gt;. &amp;nbsp;Test, test again, test some more. &amp;nbsp;I know it's possible to write bad code that still passes all the tests, but it's pretty hard&amp;nbsp;to justify turning bad code into good code if you don't know that it still does the same thing it used to.&lt;/li&gt;&lt;br/&gt;
    &lt;li&gt;&lt;a href="http://www.amazon.ca/Eloquent-Ruby-Russ-Olsen/dp/0321584104/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1324659581&amp;amp;sr=1-1"&gt;Eloquent Ruby by Russ Olsen&lt;/a&gt;. &amp;nbsp;I'm one of those people that learned Ruby via Rails rather than the other way around. &amp;nbsp;I wish I had read this book two years ago.&amp;nbsp;Having said that, it's still a good read now, especially when you get past &amp;quot;The Basics&amp;quot;. &amp;nbsp;Super useful for helping you write readable, ruby-like code.&lt;/li&gt;&lt;br/&gt;
    &lt;li&gt;&lt;a href="http://www.amazon.ca/Best-American-Comics-2011/dp/0547333625/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1324659648&amp;amp;sr=1-1"&gt;Best American Comics 2011 edited by Alison Bechdel&lt;/a&gt;. &amp;nbsp;I'm not a robot; this one is just for the fun of it. &amp;nbsp;My Graphic Novel Book Club is reading this one for January.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Merry Christmas! &amp;nbsp;See you in 2012!&amp;nbsp;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/goi_KBJ-Mdg" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 23 Dec 2011 11:53:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/goi_KBJ-Mdg/122-my-holiday-reading-list</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/122-my-holiday-reading-list</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/122-my-holiday-reading-list</feedburner:origLink></item>
    <item>
      <title>Apple Made a Mistake</title>
      <description>&lt;p&gt;Most designers have a little OCD in them, in one form or another. My OCD usually manifests itself while looking at UI elements, typefaces and icons. Today though, the unthinkable happened - I noticed a mistake in one of Apple's icons in OS X Lion! Wait, what? Apple, champion of usability, detail and design made a... mistake?!&lt;/p&gt;
&lt;p&gt;Yup!&lt;/p&gt;
&lt;p&gt;The error lies in the rendering of the Launchpad icon. While I do like the cute little rocket ship, I'm afraid that somebody at Apple seems to have looked over a small detail - the radial gradient. The gradient is supposed to represent a piece of lathe-turned metal, not unlike a volume knob on a vintage hi-fi, but I don't think it's supposed to appear over the rocket ship. To my eyes anyway, I think the rocket icon is mean to appear as if its been embossed into the metal surface and then painted gray. It looks like it should also be matte finish, but even if it were supposed to be glossy gray paint, &amp;nbsp;an angled highlight would have worked better than the continuation of the radial gradient from the metal. I can't think of any other reason for this, other than it being an oversight.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Nonetheless, I've gone ahead and ammended this for you, Apple.&lt;/p&gt;
&lt;p&gt;&lt;img align="middle" alt="" src="http://factore.ca/system/images/images/139/original/launchpad_icon.png?1323982995" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/VT2HchSQihU" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 15 Dec 2011 15:49:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/VT2HchSQihU/121-apple-made-a-mistake</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/121-apple-made-a-mistake</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/121-apple-made-a-mistake</feedburner:origLink></item>
    <item>
      <title>Recent Identity Work</title>
      <description>&lt;p&gt;We've been working hard on quite a few branding projects recently. We love it when we are able to implement the full identity&amp;nbsp;package, which typically includes business cards, letterhead and sometimes more. Here are a few examples of our recent work.&lt;/p&gt;
&lt;p&gt;&lt;img width="540" height="381" alt="" src="http://factore.ca/system/images/images/141/original/Angus-Gordon-Identity.jpg?1324319932" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img width="540" height="381" alt="" src="http://factore.ca/system/images/images/143/original/MSA_Identity2.jpg?1324326798" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img width="540" height="381" alt="" src="http://factore.ca/system/images/images/142/original/ComstockPLUS_identity2.jpg?1324320108" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img width="540" height="381" alt="" src="http://factore.ca/system/images/images/137/original/HBSA-Logo-for-portfolio.jpg?1323981188" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img width="540" height="617" alt="" src="http://factore.ca/system/images/images/138/original/MomentumBrandingPost.jpg?1323981222" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/0yxoWPxVD5c" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 15 Dec 2011 14:23:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/0yxoWPxVD5c/120-recent-identity-work</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/120-recent-identity-work</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/120-recent-identity-work</feedburner:origLink></item>
    <item>
      <title>Amazing Bed Race 2011</title>
      <description>&lt;p&gt;factor[e] likes to get involved in the community as often as we can. We sponsor charities and various other events to show we care about the health and well being of the people, businesses and organizations in the surrounding area. In September we had the pleasure of sponsoring the &lt;a href="http://www.amazingbedrace.ca/"&gt;Amazing Bed Race&lt;/a&gt;, held in Burlington, Ontario, all the proceeds of which go to support the Joseph Brant Memorial Hospital.&lt;/p&gt;
&lt;p class="p1"&gt;This was our first year sponsoring this event and in addition to sponsoring, our Project Manager, Tara actually participated in the race. Tara organized a team from her local sports league, the &lt;a href="http://hammercityrollergirls.ca/"&gt;Hammer City Roller G&lt;/a&gt;&lt;a href="http://hammercityrollergirls.ca/"&gt;irls&lt;/a&gt;, and worked directly with the organizers of the Bed Race to ensure that there was ample promotion and hype built up in the months prior to the event. With the help of factor[e] &amp;ndash; Tara's team raised over $500 for the cause, and next year we'll be striving for more. The Amazing Bed Race officials have always been very appreciative of the team's involvement. They are quite a crowd favourite &amp;ndash; despite not being the winning team.&lt;/p&gt;
&lt;p class="p1"&gt;Factor[e] is a very proud to sponsor the team, and we look forward to continuing the support in the years to come.&lt;/p&gt;
&lt;p class="p1"&gt;&lt;img alt="" src="http://factore.ca/system/images/images/129/original/BedRace_blog.jpg?1323359413" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/diuFfD_Dpv8" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 08 Dec 2011 11:19:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/diuFfD_Dpv8/118-amazing-bed-race-2011</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/118-amazing-bed-race-2011</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/118-amazing-bed-race-2011</feedburner:origLink></item>
    <item>
      <title>Compiling libRETS On OS X</title>
      <description>&lt;p&gt;&lt;em&gt;This is very technical information suitable for developers who rely on libRETS for parsing real estate transaction standard (RETS) data, which we do for HomeFinder. &amp;nbsp;If this doesn't describe you, move along, there's nothing to see here.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Here's how we've managed to successfully compile libRETS on OS X. &amp;nbsp;These instructions are for Ruby developers, because they install the Ruby versions of swig and so on, but it's probably pretty trivial to modify these for Python, etc.&lt;/p&gt;
&lt;h2 style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0.6em; margin-left: 0px; padding-top: 0.5em; padding-bottom: 0.17em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(170, 170, 170); font-size: 19px; font-family: sans-serif; line-height: 19px; "&gt;&lt;span class="mw-headline"&gt;On OSX Snow Leopard &amp;amp; Snow Leopard With MacPorts&lt;/span&gt;&lt;/h2&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;Notes: I have not been able to compile librets 1.5.2 under ruby 1.9. librets 1.5.1 seems to work fine, however.&lt;/p&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;Get the libRETS source from &lt;a href="http://www.crt.realtors.org/projects/rets/librets/files/"&gt;here&lt;/a&gt; - we recommend 1.5.1, as we had issues with 1.5.2. &amp;nbsp;And go get MacPorts, as well, of course. &amp;nbsp;If you already have MacPorts installed, you might want to update it first with:&lt;/p&gt;
&lt;pre style="padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(47, 111, 171); border-right-color: rgb(47, 111, 171); border-bottom-color: rgb(47, 111, 171); border-left-color: rgb(47, 111, 171); line-height: 1.1em; "&gt;
 sudo port selfupdate
&lt;/pre&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;Then:&lt;/p&gt;
&lt;pre style="padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(47, 111, 171); border-right-color: rgb(47, 111, 171); border-bottom-color: rgb(47, 111, 171); border-left-color: rgb(47, 111, 171); line-height: 1.1em; "&gt;
 sudo port install antlr
 sudo port install expat
 sudo port install openssl
 sudo port install zlib
 sudo port install boost # Note:  I was getting an error compiling librets with boost 1.46.0_0.  It worked with 1.45.0_0 and 1.44.0_0.  To install an older version, you have to find one in the MacPorts repository, e.g. &lt;a class="external free" title="https://trac.macports.org/browser/trunk/dports/devel/boost/Portfile?rev=73885" rel="nofollow" style="text-decoration: none; color: rgb(51, 102, 187); background-image: url(http://wiki.factore.ca/skins/monobook/lock_icon.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; padding-right: 16px; background-position: 100% 50%; background-repeat: no-repeat no-repeat; " href="https://trac.macports.org/browser/trunk/dports/devel/boost/Portfile?rev=73885"&gt;https://trac.macports.org/browser/trunk/dports/devel/boost/Portfile?rev=73885&lt;/a&gt;, download the Portfile, copy it to some place like /usr/local (won't work in one of your folders), then run sudo port install
 sudo port install curl +ssl
 sudo port install swig-ruby
&lt;/pre&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;Then, go to the librets source directory and:&lt;/p&gt;
&lt;pre style="padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(47, 111, 171); border-right-color: rgb(47, 111, 171); border-bottom-color: rgb(47, 111, 171); border-left-color: rgb(47, 111, 171); line-height: 1.1em; "&gt;
 ./autogen.sh
 ./configure --disable-java --disable-perl --disable-dotnet --disable-php --disable-python --with-expat-prefix=/opt/local --with-boost-prefix=/opt/local --enable-shared_dependencies
 make
 sudo make install
&lt;/pre&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;Hooray!&lt;/p&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0.6em; margin-left: 0px; padding-top: 0.5em; padding-bottom: 0.17em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(170, 170, 170); font-size: 19px; "&gt;&lt;span class="mw-headline"&gt;On OS X Lion With Homebrew and Compilation From Source&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;&lt;strong&gt;&lt;em&gt;UPDATE&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;: there is a recipe in Homebrew for libRETS now, so before trying the steps below, try running brew install librets - that may do the trick without all this other nonsense.&lt;/em&gt;&lt;/p&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;Homebrew doesn't have all of the recipes we need, so let's start with what it does have:&lt;/p&gt;
&lt;pre style="padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(47, 111, 171); border-right-color: rgb(47, 111, 171); border-bottom-color: rgb(47, 111, 171); border-left-color: rgb(47, 111, 171); line-height: 1.1em; "&gt;
 brew install antlr expat openssl pcre
&lt;/pre&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;More recent versions of boost will not work with libRETS, so we need to install an older version. This is actually a pain-in-the-ass, but hey, you didn't expect this to be easy, did you? So here's what you do. First of all, make sure that Homebrew has an up-to-date git repository:&lt;/p&gt;
&lt;pre style="padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(47, 111, 171); border-right-color: rgb(47, 111, 171); border-bottom-color: rgb(47, 111, 171); border-left-color: rgb(47, 111, 171); line-height: 1.1em; "&gt;
 brew update
&lt;/pre&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;Go to Homebrew's folder (probably /usr/local) and type git status, you should see normal git output. Now we want to try and find a version of the formula for boost when boost was at version 1.45.&lt;/p&gt;
&lt;pre style="padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(47, 111, 171); border-right-color: rgb(47, 111, 171); border-bottom-color: rgb(47, 111, 171); border-left-color: rgb(47, 111, 171); line-height: 1.1em; "&gt;
 brew versions boost
&lt;/pre&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;You should see:&lt;/p&gt;
&lt;pre style="padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(47, 111, 171); border-right-color: rgb(47, 111, 171); border-bottom-color: rgb(47, 111, 171); border-left-color: rgb(47, 111, 171); line-height: 1.1em; "&gt;
 1.48.0   git checkout fa1c5b9 Library/Formula/boost.rb
 1.47.0   git checkout 57665ff Library/Formula/boost.rb
 1.46.1   git checkout d0bcc2a Library/Formula/boost.rb
 1.46.0   git checkout 0476235 Library/Formula/boost.rb
 1.45.0   git checkout c65892f Library/Formula/boost.rb
 1.44.0   git checkout a18c756 Library/Formula/boost.rb
 1.43.0   git checkout 3640fb9 Library/Formula/boost.rb
 1.42.0   git checkout c5d56bc Library/Formula/boost.rb
 1.41.0   git checkout 0ff5680 Library/Formula/boost.rb
 1.40.0   git checkout 928317d Library/Formula/boost.rb
 1.39.0   git checkout 271acec Library/Formula/boost.rb
&lt;/pre&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;So, commit c65892f is the one we want:&lt;/p&gt;
&lt;pre style="padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(47, 111, 171); border-right-color: rgb(47, 111, 171); border-bottom-color: rgb(47, 111, 171); border-left-color: rgb(47, 111, 171); line-height: 1.1em; "&gt;
 git checkout c65892f Library/Formula/boost.rb
 brew install boost
&lt;/pre&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;If you want to revert back to the HEAD version of boost:&lt;/p&gt;
&lt;pre style="padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(47, 111, 171); border-right-color: rgb(47, 111, 171); border-bottom-color: rgb(47, 111, 171); border-left-color: rgb(47, 111, 171); line-height: 1.1em; "&gt;
 git reset HEAD Library/Formula/boost.rb
 git checkout Library/formula/boost.rb 
&lt;/pre&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;Now let's go install some stuff from source.&lt;/p&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;Download and install swig from&amp;nbsp;&lt;a class="external free" title="http://sourceforge.net/projects/swig/files/swig/swig-2.0.4/swig-2.0.4.tar.gz/download" rel="nofollow" style="text-decoration: none; color: rgb(51, 102, 187); background-image: url(http://wiki.factore.ca/skins/monobook/external.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; padding-right: 13px; background-position: 100% 50%; background-repeat: no-repeat no-repeat; " href="http://sourceforge.net/projects/swig/files/swig/swig-2.0.4/swig-2.0.4.tar.gz/download"&gt;http://sourceforge.net/projects/swig/files/swig/swig-2.0.4/swig-2.0.4.tar.gz/download&lt;/a&gt;&lt;/p&gt;
&lt;pre style="padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(47, 111, 171); border-right-color: rgb(47, 111, 171); border-bottom-color: rgb(47, 111, 171); border-left-color: rgb(47, 111, 171); line-height: 1.1em; "&gt;
 tar -xzvf swig-2.0.4.tar.gz
 cd swig-2.0.4
 ./configure
 make
 sudo make install
&lt;/pre&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;Download and install zlib from&amp;nbsp;&lt;a class="external free" title="http://zlib.net/zlib-1.2.5.tar.gz" rel="nofollow" style="text-decoration: none; color: rgb(51, 102, 187); background-image: url(http://wiki.factore.ca/skins/monobook/external.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; padding-right: 13px; background-position: 100% 50%; background-repeat: no-repeat no-repeat; " href="http://zlib.net/zlib-1.2.5.tar.gz"&gt;http://zlib.net/zlib-1.2.5.tar.gz&lt;/a&gt;&lt;/p&gt;
&lt;pre style="padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(47, 111, 171); border-right-color: rgb(47, 111, 171); border-bottom-color: rgb(47, 111, 171); border-left-color: rgb(47, 111, 171); line-height: 1.1em; "&gt;
 tar -xzvf zlib-1.2.5.tar.gz 
 cd zlib-1.2.5
 ./configure
 make
 sudo make install
&lt;/pre&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;Then, go to the librets source directory and:&lt;/p&gt;
&lt;pre style="padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(47, 111, 171); border-right-color: rgb(47, 111, 171); border-bottom-color: rgb(47, 111, 171); border-left-color: rgb(47, 111, 171); line-height: 1.1em; "&gt;
 ./autogen.sh
 ./configure --disable-java --disable-perl --disable-dotnet --disable-php --disable-python --enable-shared_dependencies
 make
 sudo make install
&lt;/pre&gt;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 19px; font-family: sans-serif; font-size: 13px; "&gt;Hooray!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/cKA59Vpi-lw" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 05 Dec 2011 15:25:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/cKA59Vpi-lw/117-compiling-librets-on-os-x</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/117-compiling-librets-on-os-x</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/117-compiling-librets-on-os-x</feedburner:origLink></item>
    <item>
      <title>Poorly Designed, Broken Websites Are Costing Canadian Corporations Millions</title>
      <description>&lt;p&gt;Last night I had an experience which once again emphasized the wretched state of websites developed by large Canadian corporations.&lt;/p&gt;
&lt;p&gt;In this case, it's the website for &lt;a target="_blank" href="http://www.pizzapizza.ca/"&gt;Pizza Pizza&lt;/a&gt;, and all I was trying to do was order a pizza online.&lt;/p&gt;
&lt;p&gt;If you're not from Canada, especially Ontario, you may not be familiar with this chain, but they're the market leader in Ontario with over 500 locations, and they're &lt;a target="_blank" href="http://tmx.quotemedia.com/quote.php?qm_symbol=PZA.UN"&gt;publicly traded&lt;/a&gt;.  Their pizza is quite good, and although I typically prefer ordering from local independent restaurants, not all of them deliver, so Pizza Pizza works when you're in a pinch.&lt;/p&gt;
&lt;p&gt;All in all, a big company with lots of money that provides a quality product: the kind of corporation that ought to have a really well-designed, well-executed way to order their product online.&lt;/p&gt;
&lt;p&gt;How wrong I was.  Here's my experience in a nutshell:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Arrive at website, click 'Order'. I'm told I have to create an account. Stupid move already: there's no good reason to require an account for online orders unless you're ordering an online membership of some kind, and requiring account creation has a marked negative effect on conversions.  But I'm hungry and the kids are crabby, so I create an account.&lt;/li&gt;
    &lt;li&gt;Immediately after creating an account, I'm redirected to a page that says 'Session expired. Please login again.'  Odd system, I think, but okay.&lt;/li&gt;
    &lt;li&gt;I log back in and I proceed to creating my order.  It's not the most attractive interface, but it works.  I've got all my toppings selected and ready to go, and I'm ready to proceed to checkout, when suddenly: &amp;quot;Session expired&amp;quot;!  Again!  This is after being on the website for all of four minutes.&lt;/li&gt;
    &lt;li&gt;Maybe that was just bad luck, I think - maybe their system expires sessions once every X hours and my session was at a bad time.  Kids are screaming.  Wife is asking me why I don't just call.  &amp;quot;Hang on,&amp;quot; I say.  I start over.  If I can just perform my order really quickly, maybe I'll be okay...&lt;/li&gt;
    &lt;li&gt;I start over, fill out my order at lightning speed, fill in my credit card information to pay online, submit the order, and wham, session expired, &lt;strong&gt;AGAIN&lt;/strong&gt;.  You have got to be kidding me!  Now I'm thinking, &amp;quot;fool me once, shame on you, etc.&amp;quot;, but the problem is that I had filled out all my credit card details and submitted them.  So now I don't know if I was charged or not, and whether or not my pizza is on its way.  Once again I login.  I manage to find my order, which is &amp;quot;incomplete&amp;quot;.  I retrieve it, try to pay online, my card is rejected (probably because of the previous attempt, or something), so I choose to pay at the door, and finally, my pizza is on its way (which I pay for using the same card that was rejected online).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What an appalling waste of time.  But I'm the kind of web developer that always point out website issues so they can be fixed, so I go and find their &lt;a target="_blank" href="http://www.pizzapizza.ca/PPLWeb/CommandServlet?command=screenscmd&amp;amp;screenID=ft_contactus"&gt;contact form&lt;/a&gt; and write out this helpful message:&lt;/p&gt;
&lt;blockquote&gt;     Your website's session management is broken. I'm a web developer, and while placing an order (rapidly, I might add), I was told my session had expired four times!  Including one time immediately after I submitted my order, complete with credit card information.  You need to fix this, because it's costing you a lot of money.  More details, email: EMAIL ADDRESS.   &lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Helpful, right?  I submit this form and I end up on &lt;a href="http://www.pizzapizza.ca/PPLWeb/jsp/mail/mailer.jsp"&gt;on this page&lt;/a&gt; with this message: &amp;quot;Could not send email.&amp;quot;&lt;/p&gt;
&lt;p&gt;Their web developers are apparently so bad they can't even design a contact form that works.&lt;/p&gt;
&lt;p&gt;Here's another example.  We often shop at a local grocery store chain called &lt;a target="_blank" href="http://fortinos.ca/"&gt;Fortinos&lt;/a&gt;. (Side note: when you visit their website, it forces you to choose your location, starting with selecting your province - but they only have stores in a single province, Ontario, so what's the point of that?)&lt;/p&gt;
&lt;p&gt;They process photos in the store under the brand &lt;a target="_blank" href="https://www.photolab.ca"&gt;PhotoLab&lt;/a&gt;.  I've processed photos there since my early twenties (over a decade ago) and at some point, probably around 2005, they started offering online photo processing.&lt;/p&gt;
&lt;p&gt;And it was excellent: really quite straightforward and easy to use, relying on just standard form uploads to get the job done.  We processed a ton of photos through this service, and would pick them up at the grocery store, which was very convenient.&lt;/p&gt;
&lt;p&gt;Then, in 2008, they &amp;quot;redesigned&amp;quot; it and switched to a Java applet, and it went from functional and useful to outright terrible.  So terrible, that even as a technologically proficient web developer, I found it impossible to actually upload photos and place an order.  Here's part of the email I sent to them about it in April 2008 (as always, I was trying to help):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I'm sure the developers of your new photo uploader applet worked hard, and as a developer myself, I almost hate to say this, but here it is anyway: your new photo applet for uploading photographs is terrible.&lt;/p&gt;
&lt;p&gt;Previously, my wife, who is above-average when it comes to her computer skills and frequents all of the usual web applications you might expect (Yahoo Mail, Facebook, etc.), had no trouble whatsoever ordering photos online.  She ordered lots of photos all of the time, particularly since we have a young baby who we photograph like crazy.  Many visits to Fortinos for groceries also entailed picking up an envelope of photos.&lt;/p&gt;
&lt;p&gt;Some time ago she started complaining to me that the uploader had changed and that she was having difficulty with it.  As a result she has not placed any photo orders since Christmas.  Today, I told her I would help her with uploading the photos.&lt;/p&gt;
&lt;p&gt;I did not anticipate that it would be terribly difficult.  I was wrong.  The applet is slow.  It's hard to navigate.  The interface and behaviour is totally unintuitive.&lt;/p&gt;
&lt;p&gt;For example, suppose you've uploaded 30 pictures (a difficult process), creating a paginated list of photos.  Then you want to add them to your cart.  If you hit Select All and add them, only the ones on the page where you've hit Select All are actually added, so when you go to your cart to specify quantities, many of the photos you are expecting are not there.  However, if you choose Select All and then delete them, ALL of them are deleted, NOT just the ones on the page.  This behaviour is contradictory.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I got some stock response from their support team, and we tried it a few more times in the weeks afterwards, but nothing changed. We started using a different, less convenient service, even though we didn't want to.&lt;/p&gt;
&lt;p&gt;I checked back on their website a few months ago, and it was still the same, although checking it now, I see they've changed it again.  Perhaps it's better now, but &lt;em&gt;they kept their online service in this appalling state for at least three years&lt;/em&gt;, costing them untold amounts of money.&lt;/p&gt;
&lt;p&gt;I see stuff like this on the websites of big Canadian companies all the time, and as a professional web developer who cares about producing quality work, this situation is totally unacceptable to me.  I obsess about things like A/B testing how well a certain piece of text on a button works.  &lt;em&gt;These companies are producing websites that just don't work at all.&lt;/em&gt;  It's crazy, it's embarrassing, and it's costing them millions.&lt;/p&gt;
&lt;p&gt;Now, I know that in each of these cases, there are big back-end systems that have to dispatch orders, coordinate jobs, etc.  Those systems are complex, I can't see them, and maybe they're really well-designed (although I wouldn't bet on it).  But when it comes to the end-user experience, they suck, and they really need to get their acts together.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/TwbIQAaO9TI" height="1" width="1"/&gt;</description>
      <pubDate>Sat, 03 Dec 2011 07:23:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/TwbIQAaO9TI/116-poorly-designed-broken-websites-are-costing-canadian-corporations-millions</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/116-poorly-designed-broken-websites-are-costing-canadian-corporations-millions</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/116-poorly-designed-broken-websites-are-costing-canadian-corporations-millions</feedburner:origLink></item>
    <item>
      <title>WIN Hamilton Goes Public</title>
      <description>&lt;p&gt;One of the Rails projects I worked on when I had just become used to coding in Ruby on Rails (after about a year) has gone public. &amp;nbsp;&lt;a href="http://winhamilton.ca/"&gt;WIN Hamilton&lt;/a&gt;&amp;nbsp;&amp;quot;offers information on services that assist job seekers and the community to discover local employment, training, and upgrading programs&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;img style="margin-top: 10px; margin-bottom: 10px;" alt="WIN Logo" align="middle" src="/system/images/images/128/original/win_logo.png?1322511473" /&gt;&lt;/p&gt;
&lt;p&gt;I'm personally fond of this project for a couple of reasons. &amp;nbsp;First, it's the first Rails project where I think I pretty much did everything right, and the result is a clean, maintainable codebase that drives a nicely functional application.&lt;/p&gt;
&lt;p&gt;&lt;a class="forge-inserted-thumbnail" title="WIN Search Results" rel="zoom" href="/system/images/images/127/original/search_results.png?1322511458"&gt;&lt;img style="margin: 5px 0px 15px 15px; float: right;" alt="WIN Search Results" src="/system/images/images/127/thumb/search_results.png?1322511458" /&gt;&lt;/a&gt; Second, we worked really hard on this to create a really easy-to-use, attractive database of services and service providers (&lt;a href="http://www.inform.hamilton.ca/"&gt;Inform Hamilton&lt;/a&gt; provides a similar though much broader service, and although it's an invaluable service the design and usability leaves much to be desired).&lt;/p&gt;
&lt;p&gt;Third, we (that is, the client, &lt;a href="http://htab.ca"&gt;HTAB&lt;/a&gt;,&amp;nbsp;and associated partners including us) managed to get broad-based participation from many service providers, ultimately creating a very comprehensive database.&lt;/p&gt;
&lt;p&gt;Unfortunately, the public couldn't get any benefit from it, since all the information was accessible by service providers only. &amp;nbsp;The idea was that service providers could use the service to help them refer clients. &amp;nbsp;However, we've long seen the potential of opening this up to the public, and we've finally done so.&lt;/p&gt;
&lt;p&gt;It's a specialized niche, but we're proud of the work we've done and we hope it helps some people.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/TPkjd-D7rD4" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 28 Nov 2011 15:18:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/TPkjd-D7rD4/115-win-hamilton-goes-public</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/115-win-hamilton-goes-public</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/115-win-hamilton-goes-public</feedburner:origLink></item>
    <item>
      <title>Website Launch Update</title>
      <description>&lt;p&gt;Whew! We've been so busy creating new websites that we got behind with our announcements. We've piled up quite a few and here is just a sampling.&lt;/p&gt;
&lt;p class="p1"&gt;&lt;strong&gt;Great Lengths - &lt;a href="http://greatlengthscanada.com"&gt;greatlengthscanada.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="p1"&gt;Great Lengths is the leader in the worldwide market of bonded hair extensions. This reputation is largely built upon the depth of extensive product R&amp;amp;D, and sourcing of the highest quality hair on the market. We wanted to produce a website that would showcase the company's creativity, vision and modern aesthetic. It was great working with the team over at Great Lengths and we are very happy with the end result.&amp;nbsp;&lt;/p&gt;
&lt;p class="p2"&gt;&lt;img alt="Great Lengths Website Home Page" width="540" height="540" src="http://factore.ca/system/images/images/122/original/Great-Lengths-Home-Page.png?1321892251" /&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;strong&gt;Hockey Now - &lt;a href="http://hockeynow.ca"&gt;hockeynow.ca&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="p1"&gt;Hockey Now needed a new website that could organize large amounts of content and media across multiple regions and leagues. We delivered on that while also integrating tools for social media engagement, providing a clear path to improved SEO, and creating a fresh new design.&amp;nbsp;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;img alt="" src="http://factore.ca/system/images/images/124/original/Hockey-Now-Home-Page.png?1321892681" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;strong&gt;McCallum Sather - &lt;a href="http://mccallumsather.com"&gt;mccallumsather.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="p1"&gt;McCallum Sather Architects is a leading architecture firm based in Hamilton Ontario. When we first met with them it was immediately&amp;nbsp;apparent&amp;nbsp;that this team of architects is very focused on the future. They are heavily invested in sustainability in their design, and this extends to their business practices and community involvement as well. We designed a grid based layout for the site which allowed us to present a comprehensive view of the current activities of this forward thinking firm.&lt;/p&gt;
&lt;p class="p2"&gt;&lt;img width="540" height="712" alt="" src="http://factore.ca/system/images/images/125/original/McCallum-Sather-Home-Page.png?1321894174" /&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;strong&gt;Kataya - &lt;a href="http://kataya.ca"&gt;kataya.ca&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="p3"&gt;Kataya is a boutique on Locke Street in Hamilton, and&amp;nbsp;&lt;span class="s1"&gt;kataya.ca&lt;/span&gt;&amp;nbsp;is its new, stylish website. Featuring the designs of owner Zoe Zimmerman, this site&amp;nbsp;has a large online catalogue with oversize, professional photographs. The site also provides plenty of styling views so customers know how to mix and match their new clothing.&amp;nbsp;Kataya.ca is built with&amp;nbsp;&lt;a href="http://factore.ca/forge-cms"&gt;Forge&lt;/a&gt;, and incorporates its built-in blog, custom pages and e-commerce modules.&lt;/p&gt;
&lt;p class="p2"&gt;&amp;nbsp;&lt;img width="540" alt="" src="http://factore.ca/system/images/images/126/original/Kataya-Home-Page.png?1321894436" /&gt;&lt;/p&gt;
&lt;p class="p2"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="p3"&gt;And that's not all! When you get a chance, take a look at these other sites we've done over the last while.&lt;/p&gt;
&lt;p class="p3"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="p1"&gt;Hamilton Economic Development &lt;a href="http://www.investinhamilton.ca/"&gt;www.investinhamilton.ca&lt;/a&gt;&lt;/p&gt;
&lt;p class="p1"&gt;Comstock Canada &lt;a href="http://comstockcanada.com/"&gt;comstockcanada.com&lt;/a&gt;&lt;/p&gt;
&lt;p class="p1"&gt;Momentum Fitness Club &lt;a href="http://getmomentum.ca/"&gt;getmomentum.ca&lt;/a&gt;&lt;/p&gt;
&lt;p class="p1"&gt;Bioenterprise &lt;a href="http://www.bioenterprise.ca/"&gt;bioenterprise.ca&lt;/a&gt;&lt;/p&gt;
&lt;p class="p1"&gt;Judy Marsales Real Estate &lt;a href="http://judymarsales.com/"&gt;j&lt;/a&gt;&lt;a href="http://judymarsales.com/"&gt;udymarsales.com&lt;/a&gt;&lt;/p&gt;
&lt;p class="p1"&gt;Ontario Road Builders Association &lt;a href="http://orba.org"&gt;orba.org&lt;/a&gt;&lt;/p&gt;
&lt;p class="p1"&gt;Hot Run &lt;a href="http://hotrun.net/"&gt;hotrun.net&lt;/a&gt;&lt;/p&gt;
&lt;p class="p1"&gt;Celli's &lt;a href="http://cellis.ca/"&gt;cellis.ca&lt;/a&gt;&lt;/p&gt;
&lt;p class="p1"&gt;Ontario Home Builders Association &lt;a href="http://ohba.ca/"&gt;ohba.ca&lt;/a&gt;&lt;/p&gt;
&lt;p class="p1"&gt;Rainbow's End Community Development Corporation &lt;a href="http://rainbowsend.ca "&gt;rainbowsend.ca&amp;nbsp;&lt;/a&gt;&lt;/p&gt;
&lt;p class="p1"&gt;An Instrument for Every Child &lt;a href="http://aninstrumentforeverychild.ca/"&gt;aninstrumentforeverychild.ca&lt;/a&gt;&lt;/p&gt;
&lt;p class="p1"&gt;Wolsak &amp;amp; Wynn &lt;a href="http://wolsakandwynn.ca/"&gt;wolsakandwynn.ca&lt;/a&gt;&lt;/p&gt;
&lt;p class="p1"&gt;The Village &lt;a href="http://thevillagetnd.com/"&gt;thevillagetnd.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="p3"&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/F6Kbe4Oasww" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 22 Nov 2011 10:30:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/F6Kbe4Oasww/113-website-launch-update</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/113-website-launch-update</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/113-website-launch-update</feedburner:origLink></item>
    <item>
      <title>Recent Rodman Hall Art Centre print publications</title>
      <description>&lt;p&gt;The programming at Rodman Hall Art Centre always challenges us to design unique print publications which document their wildly diverse contemporary exhibitions. Here are two recent gallery publications we produced for them.&amp;nbsp;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;strong&gt;Grudge Match - Graeme Patterson&lt;/strong&gt;&lt;/p&gt;
&lt;p class="p1"&gt;This CD publication documents Graeme Patterson's imaginative sculptural installation and stop-motion animation. The exhibition also spawned an artists' wrestling performance entitled &amp;quot;The Main Event&amp;quot; at Rodman Hall for which we designed the poster and invitation. The CD pack includes a 12 page booklet.&lt;/p&gt;
&lt;p class="p1"&gt;&lt;img width="520" height="473" alt="" src="http://factore.ca/system/images/images/120/original/GrudgeMatchPortfolio_triple.jpg?1320773936" /&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="p2"&gt;&lt;strong&gt;The Main Event &lt;/strong&gt;- Poster and Rack Card Invitation&lt;/p&gt;
&lt;div&gt;&lt;img width="300" height="331" alt="" src="http://factore.ca/system/images/images/118/original/MainEvent-post.jpg?1320773751" /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;p class="p1"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;strong&gt;Theatrum Mundi - Catherine Heard&lt;/strong&gt;&lt;/p&gt;
&lt;p class="p3"&gt;
&lt;div style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;
&lt;p class="p1"&gt;&lt;span class="s1"&gt;Catherine Heard&amp;nbsp;&lt;/span&gt;is known for her sculptural work depicting things both monstrous and wondrous. Her installation Theatrum Mundi transformed the rear bay window wells of Rodman Hall's historic mansion into her own cabinet of curiosities. We designed this publication to function in part as a documentation of the installation as well as an element of the piece itself. We created a 40 page book with an original cover printed in gold ink on a velvety tactile deep brown paper stock that evokes an earlier era of fine craft. On the inside cover is a printed reproduction of a portrait of the Bearded Lady whose image resided in a drawer of the actual cabinet. The card was printed separately and die cut with scalloped edges. After the book and cards were printed and delivered, the artist added the &amp;quot;Genuine Souvenir&amp;quot; and inserted the card into the precut slits on the inside cover of the book by hand. This Artist Multiple provides an opportunity for the gallery visitor to carry home a piece of the curious world they've encountered inside the cabinet.&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p class="p3"&gt;&lt;img width="520" height="416" alt="" src="http://factore.ca/system/images/images/119/original/Theatrum-Mundi-post.jpg?1320773798" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/Hzmg_DcO-dA" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 08 Nov 2011 12:39:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/Hzmg_DcO-dA/112-recent-rodman-hall-art-centre-print-publications</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/112-recent-rodman-hall-art-centre-print-publications</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/112-recent-rodman-hall-art-centre-print-publications</feedburner:origLink></item>
    <item>
      <title>Local Not-For-Profit's Take A Multi-Disciplinary Approach</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="background-color: rgb(255, 255, 255); padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: Arial, Verdana, sans-serif; font-size: 12px; "&gt;
&lt;p&gt;Over the years factor[e] has worked with many not-for-profit organizations to help get their message out. Recently we successfully completed two such projects for &lt;a href="http://www.sacha.ca/home.php"&gt;Hamilton's Sexual Assault Centre (SACHA)&lt;/a&gt; and the &lt;a href="http://www.ywcahamilton.org/"&gt;Hamilton YWCA&lt;/a&gt;.&lt;/p&gt;
&lt;p class="p1"&gt;SACHA's Workplace Harassment Training project uses a multidisciplinary approach; namely video and print to promote this important new service offering. From start to finish we produced a video which was loaded onto a custom flash drive. The drives were intended as giveaways to SACHA's target audience and were attached by a tiny ball chain to a printed hangtag that provides information about the program. In addition we produced two other info cards; one handout and one mailer. The flash drive housing was made of high density recycled paper and was screen printed on both sides.&lt;/p&gt;
&lt;p&gt;&lt;iframe src="http://player.vimeo.com/video/27597481" width="517" height="291" frameborder="0" webkitallowfullscreen="" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p class="p2"&gt;&amp;nbsp;&lt;img alt="SACHA's Workplace Harassment Training Promo" width="517" height="511" src="http://factore.ca/system/images/images/115/original/DSC_2967adj2.jpg?1319212584" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="p1"&gt;Similarly, the Hamilton YWCA wanted to come up with an eye catching promo package for their &amp;quot;Women in Skilled Trades&amp;quot; program. The program offers specialized training to women interesting in pursuing a career in the skilled trades. The package consists of a unique printed cross fold brochure design which folds to a compact 3.5&amp;quot; x 3.5&amp;quot; size. When the piece is fully opened, the reader will find a &lt;a href="http://www.google.com/help/maps/favoriteplaces/business/barcode.html"&gt;QR code&lt;/a&gt; that directs potential students and employers to the YWCA website to view the accompanying video that completes the promo package.&lt;/p&gt;
&lt;p&gt;&lt;iframe src="http://player.vimeo.com/video/25780659?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="517" height="291" frameborder="0" webkitallowfullscreen="" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;img alt="YWCA WIST Promo" width="517" height="245" src="http://factore.ca/system/images/images/114/original/WISTduo2.jpg?1319204820" /&gt;&lt;/p&gt;
&lt;p class="p1"&gt;In general not-for-profit organizations need to work within very tight budgets, and it is always rewarding when we can produce a successful piece within these constraints. These are just two examples.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/Cv3S5HL3pEY" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 20 Oct 2011 15:32:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/Cv3S5HL3pEY/111-local-not-for-profit-s-take-a-multi-disciplinary-approach</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/111-local-not-for-profit-s-take-a-multi-disciplinary-approach</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/111-local-not-for-profit-s-take-a-multi-disciplinary-approach</feedburner:origLink></item>
    <item>
      <title>We're presenting at DemoCamp tonight</title>
      <description>&lt;p&gt;Martin Eckart and Adrian Duyzer are presenting at &lt;a href="http://www.softwarehamilton.com/democamp/"&gt;DemoCamp&lt;/a&gt; tonight.&lt;/p&gt;
&lt;p&gt;We'll be showcasing &lt;a href="http://homefinder.ca"&gt;HomeFinder&lt;/a&gt;, the real estate search website we redesigned and relaunched a few months ago. &amp;nbsp;HomeFinder is part of the family of &lt;a href="http://www.metroland.com/"&gt;Metroland Media&lt;/a&gt; websites and is, quite frankly, the best way to find a home.&lt;/p&gt;
&lt;p&gt;We'll be discussing some of HomeFinder's internals and discussing how to present a clean and enjoyable user experience on a site that has a complex internal structure and hosts a vast amount of data. &amp;nbsp;We also look forward to comments about the site and hope that some of the attendees might consider using HomeFinder the next time they look for a home.&lt;/p&gt;
&lt;p&gt;We hope to see you there!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/p1qYg-UXesE" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 28 Sep 2011 11:19:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/p1qYg-UXesE/110-we-re-presenting-at-democamp-tonight</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/110-we-re-presenting-at-democamp-tonight</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/110-we-re-presenting-at-democamp-tonight</feedburner:origLink></item>
    <item>
      <title>Hamilton Light Rail Initiative Launches</title>
      <description>&lt;p&gt;We just launched a redesign of the &lt;a href="http://hamiltonlightrail.com"&gt;Hamilton Light Rail&lt;/a&gt; website.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://factore.ca/system/images/images/105/original/lightrail.png?1316790644" /&gt;&lt;/p&gt;
&lt;p&gt;Hamilton Light Rail is an independent group of citizens who believe that Hamilton needs an ambitious approach to economic development and urban revitalization based around high quality rapid transit. To that end, Hamilton Light Rail is dedicated to promoting the goal of building a light rail transit (LRT) system in Hamilton.&lt;/p&gt;
&lt;p&gt;We support that goal and believed it was important to support it right now with a more effective website, in particular because of the upcoming provincial election and ongoing uncertainty at City Hall about the direction of the project.&lt;/p&gt;
&lt;p&gt;On a personal level, we believe LRT would have a transformative effect on our city. &amp;nbsp;As a business, we believe it is important to invest in modern, high-speed transit - and the type of urban development that follows LRT investment - in order to be able to attract the talented employees that are the core of our organization.&lt;/p&gt;
&lt;p&gt;We hope you like the new site, and that you'll take a moment to &lt;a href="http://hamiltonlightrail.com/"&gt;read about the initiative and add your name to the list of supporters&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/79avr1Lz-14" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 23 Sep 2011 10:02:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/79avr1Lz-14/109-hamilton-light-rail-initiative-launches</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/109-hamilton-light-rail-initiative-launches</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/109-hamilton-light-rail-initiative-launches</feedburner:origLink></item>
    <item>
      <title> Just Completed: Bee Kind Organics Candle Boxes</title>
      <description>&lt;p&gt;I just received the samples of the candle boxes we designed for &lt;a href="http://www.beekindorganics.ca/"&gt;Bee Kind  Organics&lt;/a&gt;, a small organic family farm, located in the Hasting Highlands of Eastern Ontario. Concern for the environment is a  top priority for this grassroots producer of Pure Beeswax Candles,  Natural Soaps, Cremes, Oils and Balms, among other things.&lt;/p&gt;
&lt;p&gt;&lt;img width="215" height="210" alt="" src="http://factore.ca/system/images/images/104/original/BeeKindBoxFront.jpg?1316118612" /&gt;&lt;img width="300" height="211" alt="" src="http://factore.ca/system/images/images/103/original/BeeKindBoxSideViews.jpg?1316118589" /&gt;&lt;br /&gt;
&lt;br /&gt;
These boxes were printed by &lt;a href="http://greenprinteronline.com"&gt;greenprinteronline.com&lt;/a&gt; on 100% recycled chip  board using a single colour (dark brown) toner that is inert and &lt;a href="http://environmentaldefence.ca/campaigns/toxic-nation/glossary/vocs-volatile-and-semi-volatile-organic-compounds"&gt;VOC&lt;/a&gt;  free.&lt;br /&gt;
&lt;br /&gt;
We were especially impressed that Green Printer's finishing team took  the extra time to test their scoring method to minimize any cracking  that could happen when this fibrous stock is folded.&lt;br /&gt;
&lt;br /&gt;
In addition, Green Printer provided us with our Eco Savings data for the order. Here's the data for this order of 500 boxes. &lt;br /&gt;
&lt;br /&gt;
&lt;img width="300" height="206" alt="" src="http://factore.ca/system/images/images/99/original/ECO_AUDIT_Bee_Kind.jpg?1316181757" /&gt;&lt;br /&gt;
&lt;br /&gt;
We're really happy with the results of this print project. These little  boxes are sturdy and attractive in there simplicity. And they work  nicely with the &lt;a href="http://www.factore.ca/on-the-floor/100-spotlight-on-local-label-supplier-"&gt;stickers&lt;/a&gt; we produced as well.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/AfG_ejOxzuk" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 16 Sep 2011 09:57:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/AfG_ejOxzuk/108--just-completed-bee-kind-organics-candle-boxes</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/108--just-completed-bee-kind-organics-candle-boxes</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/108--just-completed-bee-kind-organics-candle-boxes</feedburner:origLink></item>
    <item>
      <title>Welcome Matt!</title>
      <description>&lt;p&gt;We have a new addition to our family here at factor[e]. &amp;nbsp;Matt McPeak Is a local guy who &amp;nbsp;loves his city. &amp;nbsp;He's active in the community and he's a great designer.&lt;/p&gt;
&lt;p&gt;Matt graduated from Griffith University in 2006 with a degree in E-Commerce. Since 2007, he's worked as a Web Designer specializing in layout and front-end programming. Matt has a strong belief that &amp;lsquo;less is more&amp;rsquo; and applies a simple, functional approach to his work. He has worked with small businesses and international brands before coming to factor[e].&lt;/p&gt;
&lt;p&gt;I'm sure there are many of you that know him already, and the rest of you will get to know him soon.&lt;/p&gt;
&lt;p&gt;We all look forward to seeing how Matt's design style and approach to work fits in here!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/ZsmpZpR0OUw" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 13 Sep 2011 10:18:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/ZsmpZpR0OUw/107-welcome-matt-</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/107-welcome-matt-</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/107-welcome-matt-</feedburner:origLink></item>
    <item>
      <title>TIL:  Integer#times yields a counter that starts at zero and goes to Integer - 1</title>
      <description>&lt;p&gt;I showed someone at work a method I had written which had this in it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0.upto(my_string.length - 1) do |pos|   char = my_string[pos]   ... end&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;He said, &amp;quot;Why don't you use my_string.length.times so you don't have to use the ugly '- 1'?&amp;quot;&lt;/p&gt;
&lt;p&gt;I said, &amp;quot;Because you will just have to use it in the block anyway to start and end at the right point of the string array.&amp;quot;&lt;/p&gt;
&lt;p&gt;And someone else said, &amp;quot;No, the counter starts at zero and goes to i - 1.&amp;quot;&lt;/p&gt;
&lt;p&gt;So, now I have:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;my_string.length.times do |pos|   char = my_string[pos]   ... end&lt;/code&gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/DJfUdAL7nNk" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 25 Aug 2011 21:41:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/DJfUdAL7nNk/106-til-integer-times-yields-a-counter-that-starts-at-zero-and-goes-to-integer-1</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/106-til-integer-times-yields-a-counter-that-starts-at-zero-and-goes-to-integer-1</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/106-til-integer-times-yields-a-counter-that-starts-at-zero-and-goes-to-integer-1</feedburner:origLink></item>
    <item>
      <title>TIL:  A better way of figuring out rails model attributes</title>
      <description>&lt;p&gt;&amp;nbsp;I find it annoying looking through schema.db when I can't remember the name of an attribute on a rails model. &amp;nbsp;It seems so... un-ruby. &amp;nbsp;Anyway, there is a more ruby-like way, if you happen to have a console open:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ModelName.column_names.sort&lt;/code&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/4Cc2vX1ChAY" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 11 Aug 2011 14:58:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/4Cc2vX1ChAY/105-til-a-better-way-of-figuring-out-rails-model-attributes</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/105-til-a-better-way-of-figuring-out-rails-model-attributes</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/105-til-a-better-way-of-figuring-out-rails-model-attributes</feedburner:origLink></item>
    <item>
      <title>TIL:  Using .include in an AREL chain invalidates :default_scope</title>
      <description>&lt;p&gt;Imagine you have Car model:&lt;/p&gt;
&lt;pre&gt;
class Car &amp;lt; ActiveRecord::Base
...
  has_many :photos
...
end&lt;/pre&gt;
&lt;p&gt;In the Photo model, you have&lt;/p&gt;
&lt;pre&gt;
class Photo &amp;lt; ActiveRecord::Base
  ...
  :default_scope order =&amp;gt; &amp;quot;sort_order ASC&amp;quot;
  ...
end&lt;/pre&gt;
&lt;p&gt;where sort_order is just a field where you can manually set the sort order.&lt;/p&gt;
&lt;p&gt;In your CarsController, you have something like this:&lt;/p&gt;
&lt;pre&gt;
class CarsController &amp;lt; ApplicationController
  ...
  @car = Car.include(:photos).find(params[:id])
  ...
end&lt;/pre&gt;
&lt;p&gt;and in your show.html.haml view you have:&lt;/p&gt;
&lt;pre&gt;
...
- @car.photos do |p|
  = img_tag p.photo_file_name
...&lt;/pre&gt;
&lt;p&gt;And then you load the page and the car photos aren't in the correct order.&lt;/p&gt;
&lt;p&gt;This is because when you add the include (for performance reasons, perhaps), it ignores the&lt;/p&gt;
&lt;pre&gt;
:default_scope&lt;/pre&gt;
&lt;p&gt;on the Photo model.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/Itni_2LooAc" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 05 Aug 2011 11:08:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/Itni_2LooAc/104-til-using-include-in-an-arel-chain-invalidates-default-scope</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/104-til-using-include-in-an-arel-chain-invalidates-default-scope</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/104-til-using-include-in-an-arel-chain-invalidates-default-scope</feedburner:origLink></item>
    <item>
      <title>Ruby / Rails Grab Bag</title>
      <description>&lt;p&gt;It's a long weekend, and I've had a rough week, so here's a quick post about some Ruby and/or Rails stuff that came in handy this week.&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;If you want to execute arbitrary SQL statements against your Rails database, you can do it like this: &amp;nbsp;ActiveRecord::Base::connection().update(&amp;quot;some sql here&amp;quot;)&lt;/li&gt;
    &lt;li&gt;You can store an unsaved object in session[]. &amp;nbsp;So, you could, for example, instantiate an Order object, save it from page to page while your customer adds products to it, then only save it when the credit card is processed&lt;/li&gt;
    &lt;li&gt;yield has always confused me. &amp;nbsp;But I found a new way to think about it that makes it so much more obvious to me: &amp;nbsp;Rather than think about it as stopping the method to allow the block to run (like, yielding to oncoming traffic), I now think about it yielding a result to my block (like, &amp;quot;this garden yields a lot of carrots&amp;quot;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Umm, that's about it. &amp;nbsp;Have a good holiday!&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/F0zIUKGs29M" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 29 Jul 2011 16:52:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/F0zIUKGs29M/103-ruby-rails-grab-bag</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/103-ruby-rails-grab-bag</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/103-ruby-rails-grab-bag</feedburner:origLink></item>
    <item>
      <title>The benefits of using vector shapes in Photoshop</title>
      <description>&lt;div&gt;Before Photoshop version 6, the Adobe product lineup was pretty clear - Illustrator was for vector graphics and Photoshop for was for raster graphics and image re-touching. Since the introduction of vector drawing tools in Photoshop version 6, the lines between the two applications have been blurred - for the better. Here's why:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;1. Vector shapes let you work faster&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Using vector shapes to draw page elements is fast. And as long as 'snap to pixels' is selected from the Geometry Options pull-down menu, your vector shapes will always lock onto the nearest pixel which is crucial for pixel-perfect web layouts. Additionally, each time you create a new vector shape, Photoshop will automatically create a new layer for each shape too. Brilliant.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;2. Vector shapes let you work more accurately&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Using vector shapes to draw rounded rectangles (for instance) let's you determine the corner radius before you draw it. This becomes increasingly helpful when you want to nest elements with rounded corners into other elements with rounded corners because you can gradually reduce the radius amount so the corners always look concentric.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Vector shapes can still be blended, faded and masked like raster shapes, but they always retain their mathematical precision and edit-ability.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;3. Vector shapes let you make changes quicker&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Changing the size or shape of a vector object is easy. Instead of using selection tools to copy/paste pixels around your layout, you simply grab it's anchor points with the direct select tool and move them around.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Changing and object's colour is also simple. Instead of selecting the layer or shape and filling with a background/foreground colour (which can result in ugly aliased edges), you need only double-click the layer thumbnail and the familiar &amp;quot;select a colour&amp;quot; window appears.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;4. Vector shapes let you scale your design&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;I'm sure this has happened to everybody at one point or another - a request to &amp;quot;make a large-size print of the home page&amp;quot;. Well, had you been using raster shapes for everything, you'd be in trouble. But since you're using vector shapes, all you need to do is change the resolution from 72 to 300ppi, choose a print size and voila! All your page elements and text (text was made fully vector in Photoshop 7) are re-sized without any loss in image quality.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Further reading: &lt;a href="http://methodandcraft.com/videos/combining-vector-shapes-in-photoshop"&gt;Combining vector shapes in Photoshop&lt;/a&gt; (by &lt;a href="http://methodandcraft.com/"&gt;Method &amp;amp; Craft&lt;/a&gt;), &lt;a href="http://en.wikipedia.org/wiki/Adobe_Photoshop_release_history"&gt;Adobe Photoshop release history&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/LDjR2CtOpbI" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 25 Jul 2011 09:07:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/LDjR2CtOpbI/102-the-benefits-of-using-vector-shapes-in-photoshop</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/102-the-benefits-of-using-vector-shapes-in-photoshop</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/102-the-benefits-of-using-vector-shapes-in-photoshop</feedburner:origLink></item>
    <item>
      <title>Spotlight on Local Label Supplier </title>
      <description>&lt;p&gt;I&amp;rsquo;ve been asked many times to quote on small quantities of labels for our clients. And until recently it was often a difficult task to find someone who could do small runs for a reasonable price.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;So I was thrilled to discover Reprolabels.net, and to add them to our list of excellent print vendors. Specializing in fine quality short run labels, Reprolabels are located on Brucedale Avenue right here in Hamilton. The labels they produce are the peel and stick variety and can be diecut to any shape. They offer transparent, white &amp;amp; metallic stocks and use waterproof, smudgeproof, durable ink. They can also do double sided and reverse printed labels.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;We recently got labels printed for Bee Kind Organics, a small organic family farm that creates beeswax candles, natural soaps and earth medicine.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;We did the design and Reprolabels produced 500 &amp;ndash; 1.5&amp;rdquo; diameter white labels that can be used on products, packaging, carry bags etc.; a great option for startups and small businesses. Reprolabels made the process seamless and timely. And we were very pleased with the quality.&lt;/p&gt;
&lt;p class="MsoNormal" style="text-align: left;"&gt;&lt;img src="http://factore.ca/system/images/images/98/original/bKInd1.jpg?1310675133" style="width: 558px; height: 354px;" alt="" /&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;To come: Bee Kind Organics candle boxes printed on recycled chip board by another of our great area print vendors.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/lLHB8o3qrho" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 14 Jul 2011 16:16:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/lLHB8o3qrho/100-spotlight-on-local-label-supplier-</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/100-spotlight-on-local-label-supplier-</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/100-spotlight-on-local-label-supplier-</feedburner:origLink></item>
    <item>
      <title>A Good Reason For Keeping Your Fixtures Directory Clean</title>
      <description>&lt;p&gt;After some recent updates to &lt;a href="http://factore.ca/forge-cms/"&gt;Forge&lt;/a&gt;, our tests stopped working. &amp;nbsp;I don't mean in the &amp;quot;usual&amp;quot; way, like we had introduced a new bug into the code and a test which had formerly passed was now failing. &amp;nbsp;I mean that every test we tried to run generated an error:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;LoadError: Expected /Users/marckelsey/path/to/app/models/ckeditor/asset.rb to define Asset&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The class definition in that file looked like this:&lt;/p&gt;
&lt;pre&gt;
class Ckeditor::Asset &amp;lt; ActiveRecord::Base
&amp;nbsp; ...
end&lt;/pre&gt;
&lt;p&gt;which at first glance seemed right. &amp;nbsp;And besides, the code ran fine in both the development and production environments.&lt;/p&gt;
&lt;p&gt;After some thought, we realized where the problem occurred: &amp;nbsp;loading the fixtures. &amp;nbsp;There was an old, unused file in the test/fixtures directory called assets.yml. &amp;nbsp;When the test environment was loaded, it went looking for a file called asset.rb in the models directory, found one, and tried to load the asset class. &amp;nbsp;Boom!&lt;/p&gt;
&lt;p&gt;Once that file was deleted, a second error started happening:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: ckeditor_pictures: DELETE FROM &amp;quot;ckeditor_pictures&amp;quot; WHERE 1=1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This error was easier to debug, having figured out the first one. &amp;nbsp;With the refactoring, there was still a CKEditor::Picture model, but it was inherited from CKEditor::Asset rather than having its own table. Removing the old CKEditor fixtures solved that problem too.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/A_xb8OihTWk" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 19 May 2011 10:52:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/A_xb8OihTWk/99-a-good-reason-for-keeping-your-fixtures-directory-clean</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/99-a-good-reason-for-keeping-your-fixtures-directory-clean</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/99-a-good-reason-for-keeping-your-fixtures-directory-clean</feedburner:origLink></item>
    <item>
      <title>HTML/ERB to HAML</title>
      <description>&lt;p&gt;I have a project coming down the pipes that is being sliced in HTML. I will need to convert those files to HAML before I can tie it all into &lt;a href="http://factore.ca/forge-cms/"&gt;Forge&lt;/a&gt; for the client. So, I did a bit of research and found quite a few solutions. This has been written about tons, but I thought I'd just compile my notes for future reference.&lt;/p&gt;
&lt;p&gt;There are a number of ways to do this and they all use a command line executable that does all the dirty work -- html2haml. If you have the &lt;a href="http://rubygems.org/gems/haml"&gt;haml gem&lt;/a&gt; installed run &lt;code&gt;haml --help&lt;/code&gt; for details.&lt;/p&gt;
&lt;div class="spacer" style="border-top:1px solid #E5E5E5;height:1px;margin:10px 0;width:100%;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;A great script to find all erb files and list the command you would run to convert them:&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://shifteleven.com/articles/2008/06/08/converting-erb-to-haml-snippet"&gt;http://shifteleven.com/articles/2008/06/08/converting-erb-to-haml-snippet&lt;/a&gt;&lt;/h3&gt;
&lt;div class="spacer" style="border-top:1px solid #E5E5E5;height:1px;margin:10px 0;width:100%;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;If you use Texmate you can add a pretty simple command to the Ruby Haml bundle:&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://autonomousmachine.com/2009/11/13/convert-html-to-haml-withint-textmate"&gt;http://autonomousmachine.com/2009/11/13/convert-html-to-haml-withint-textmate&lt;/a&gt;&lt;/h3&gt;
&lt;div class="spacer" style="border-top:1px solid #E5E5E5;height:1px;margin:10px 0;width:100%;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;There is also a web-based option. Dump your HTML in one field and out pops HAML in the other.&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://html2haml.heroku.com/"&gt;http://html2haml.heroku.com/&lt;/a&gt;&lt;/h3&gt;
&lt;div class="spacer" style="border-top:1px solid #E5E5E5;height:1px;margin:10px 0;width:100%;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;The source of the above site can be found here:&lt;/p&gt;
&lt;h3&gt;&lt;a href="https://github.com/twilson63/html2haml"&gt;https://github.com/twilson63/html2haml&lt;/a&gt;&lt;/h3&gt;
&lt;div class="spacer" style="border-top:1px solid #E5E5E5;height:1px;margin:10px 0;width:100%;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;And, for my Vim friends. This seems like a pretty interesting list of solutions for you to try out:&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://vimgolf.com/challenges/4d3c51f1aabf526ed6000030"&gt;http://vimgolf.com/challenges/4d3c51f1aabf526ed6000030&lt;/a&gt;&lt;/h3&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/jzOTovmKAL4" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 11 Apr 2011 12:09:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/jzOTovmKAL4/98-html-erb-to-haml</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/98-html-erb-to-haml</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/98-html-erb-to-haml</feedburner:origLink></item>
    <item>
      <title>Copying specific files from one project to another</title>
      <description>&lt;p&gt;&amp;nbsp;Recently I've been pulling a modules from various projects into my current project. &amp;nbsp;Instead of copying files individually and creating new directories for views etc. I figured out how to do this the unix-like way...&lt;/p&gt;
&lt;blockquote style="background: #F2F2F2;font-size: 11px; padding: 5px"&gt;
&lt;p&gt;find . -wholename &amp;quot;*model*&amp;quot; | cpio -pdumv ../destination_dir&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Where &amp;quot;*model*&amp;quot; finds any file with the word &amp;quot;model&amp;quot; in it and ../destination_dir is the directory you want to copy these files and directories to. &amp;quot;-wholename&amp;quot; specifies that directories with that name are also copied (handy when you want to copy views and helpers).&lt;/p&gt;
&lt;p&gt;For those of you who like turning this into a script:&lt;/p&gt;
&lt;blockquote style="background: #F2F2F2;font-size: 11px; padding: 5px"&gt; #!/bin/bash&lt;br /&gt;
#Copy all files of a certain name to a new directory&lt;br /&gt;
NAME=$1&lt;br /&gt;
DEST=$2&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
find . -wholename $NAME &amp;nbsp;| cpio -pdumv $DEST&lt;br /&gt;
&lt;/blockquote&gt;
&lt;p&gt;Once I've done the copy, sometimes I want to call the model something new which involves renaming all of the files and view directories:&amp;nbsp;&lt;/p&gt;
&lt;blockquote style="background: #F2F2F2;font-size: 11px; padding: 5px"&gt; rename -v &amp;quot;s/oldname/newname/g&amp;quot; `find . -wholename *oldname*` &lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;If, like me you're copying and renaming a rails resource to a new project, then you'll also want to rename your models inside the code:&lt;/p&gt;
&lt;blockquote style="background: #F2F2F2;font-size: 11px; padding: 5px"&gt; sed -i &amp;quot;s/oldname/newname/g&amp;quot; `find . -type f -name *newname*`&lt;br /&gt;
sed -i &amp;quot;s/Oldname/Newname/g&amp;quot; `find . -type f -name *newname*` &lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;More info than you can shake a stick at:&lt;/p&gt;
&lt;p&gt;find:&amp;nbsp;&lt;a href="http://unixhelp.ed.ac.uk/CGI/man-cgi?find"&gt;http://unixhelp.ed.ac.uk/CGI/man-cgi?find&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;cpio:&amp;nbsp;&lt;a href="http://unixhelp.ed.ac.uk/CGI/man-cgi?cpio"&gt;http://unixhelp.ed.ac.uk/CGI/man-cgi?cpio&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;rename:&amp;nbsp;&lt;a href="http://unixhelp.ed.ac.uk/CGI/man-cgi?rename"&gt;http://unixhelp.ed.ac.uk/CGI/man-cgi?rename&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;sed:&amp;nbsp;&lt;a href="http://unixhelp.ed.ac.uk/CGI/man-cgi?sed"&gt;http://unixhelp.ed.ac.uk/CGI/man-cgi?sed&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/cMSMrPh9HAA" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 06 Apr 2011 15:00:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/cMSMrPh9HAA/97-copying-specific-files-from-one-project-to-another</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/97-copying-specific-files-from-one-project-to-another</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/97-copying-specific-files-from-one-project-to-another</feedburner:origLink></item>
    <item>
      <title>Snow Leopard, RubyGems and MySQL</title>
      <description>&lt;p&gt;I ran into a few issues while setting up my new macbook and I thought I'd share in case there were people out there who were running into the same issues.&lt;/p&gt;
&lt;h2 style="margin-top:30px"&gt;MySQL and MAMP&lt;/h2&gt;
&lt;p&gt;The first issue was MySQL. If anyone has ever tried installing MySQL on OS X, you may know what I mean. I tried several methods: from source, through &lt;a href="http://www.macports.org/"&gt;MacPorts&lt;/a&gt;, following the &lt;a href="http://hivelogic.com/articles/compiling-mysql-on-snow-leopard"&gt;hivelogic directions&lt;/a&gt;, with the help of a &lt;a href="http://omgsean.com/2009/09/installing-the-mysql-ruby-gem-on-os-x-10-6-snow-leopard/"&gt;co-worker&lt;/a&gt;, and I'm sure there were some combos of all of those. By the end of it I wasn't even sure what methods I had already tried.&lt;/p&gt;
&lt;p&gt;After all this and a good night sleep, I tried a different tact. I set up &lt;a href="http://www.mamp.info/en/index.html"&gt;MAMP&lt;/a&gt; and configured my mysql gem that way. It honestly took me about 30 minutes and worked on the first try.&lt;/p&gt;
&lt;p&gt;These are the step by step directions (by Fred Wu) that I used: &lt;a href="http://www.beyondcoding.com/2009/11/10/using-ruby-mysql-gem-with-mamp-1-8-x-on-snow-leopard/"&gt;Using Ruby MySQL Gem with MAMP 1.8.x on Snow Leopard&lt;/a&gt;. Brilliant.&lt;/p&gt;
&lt;h2 style="margin-top:30px"&gt;RVM and RubyGems&lt;/h2&gt;
&lt;p&gt;The other hangup I was stuck on was an incompatibility between the version of Ruby I was using (1.8.7) and the RubyGems version that RVM installed by default (1.6.1).&amp;nbsp;The best explanation I found was on&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/5176782/uninitialized-constant-activesupportdependenciesmutex-nameerror"&gt;stackoverflow&lt;/a&gt;.&amp;nbsp;When trying to run a project I was getting the error:&lt;/p&gt;
&lt;p&gt;
&lt;meta charset="utf-8" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;uninitialized constant ActiveSupport::Dependencies::Mutex (NameError)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;
&lt;meta charset="utf-8" /&gt;&lt;/p&gt;
&lt;p&gt;The solution was to use RVM and &lt;a href="http://rvm.beginrescueend.com/rubies/rubygems/"&gt;install the version of rubygems&lt;/a&gt; I know worked with our projects (1.3.7).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;rvm rubygems 1.3.7&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This installs the version of rubygems you need and makes it the default for that rvm version of ruby.&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/WLN8nqCGS7s" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 31 Mar 2011 14:39:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/WLN8nqCGS7s/96-snow-leopard-rubygems-and-mysql</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/96-snow-leopard-rubygems-and-mysql</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/96-snow-leopard-rubygems-and-mysql</feedburner:origLink></item>
    <item>
      <title>Issues As A Result Of Internet Explorer 9 </title>
      <description>&lt;p&gt;Microsoft has just released Internet Explorer 9 (IE9).  Users of IE9 are experiencing many issues with websites that do not display correctly, including the following issues:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Specialized fonts fail to render properly or render at all:&lt;/strong&gt; Changes to the way IE9 deals with SVG and VML means that technologies used to display specialized fonts (such as &lt;a href="https://github.com/sorccu/cufon/wiki/about"&gt;Cufon&lt;/a&gt;) no longer work or require updated versions to work correctly.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Minor display issues:&lt;/strong&gt; users are reporting that minor display elements like rounded corners no longer appear correctly in IE9.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Minor to major layout issues&lt;/strong&gt; users are reporting that the layout of some websites is either partially or wholly broken.  This is often the result of relatively minor changes in IE9 that have caused website layouts that depend on precise positioning to no longer display correctly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;
This is likely only a partial list of issues.&lt;/p&gt;
&lt;p&gt;It is important to check how your website is currently displaying in IE9 if you have not done so already.  If you're one of our clients, you can request that we examine your website for issues on your behalf.&lt;/p&gt;
&lt;p&gt;If your website is having problems displaying in IE9, we feel for you.  It's unfortunate that Microsoft has chosen to release a new browser that is not fully compatible with previous versions of Internet Explorer (and this is far from the first time they've done so).  In an ideal world, you'd be able to bill Microsoft for the cost to upgrade your website to ensure IE9 compatibility.&lt;/p&gt;
&lt;p&gt;We always take great care to test all of our websites in all modern browsers at the time that they are completed, but we can't predict what browser vendors will do in the future.  Given Microsoft's track record with browser compatibility, we'll continue to recommend that our clients use alternatives such as &lt;a href="http://www.google.com/chrome"&gt;Chrome&lt;/a&gt; or &lt;a href="http://www.mozilla.com/en-US/firefox/"&gt;Firefox&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/K66sihkXvu4" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 21 Mar 2011 10:59:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/K66sihkXvu4/95-issues-as-a-result-of-internet-explorer-9-</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/95-issues-as-a-result-of-internet-explorer-9-</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/95-issues-as-a-result-of-internet-explorer-9-</feedburner:origLink></item>
    <item>
      <title>Make Halftone Dots using Illustrator's 'Transform Each' Command</title>
      <description>&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Arial"&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;strong&gt;Halftone&lt;/strong&gt; is the printing technique that simulates continuous tone imagery through the use of dots, varying either in size, in shape or in spacing. Though it's existence was intended as a solution for reprography, it's become somewhat of a graphical phenomenon, especially celebrated in the Pop Art era. Since then, artists and designers have used it as a graphical &lt;em&gt;element&lt;/em&gt;, rather than simply a bi-product. &amp;lsquo;Halftone dots&amp;rsquo;, as they&amp;rsquo;re commonly referred to, have been used in everything from logos to website design.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;For a more detailed description and history of halftone dots, please &lt;a href="http://en.wikipedia.org/wiki/Halftone"&gt;read this entry&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;There are as many online tutorials describing methods of emulating them with Photoshop as there are thousands of Photoshop brushes and patterns available to download. But none of them offers the flexibility and scalability of working with vector graphics, so this short tutorial will demonstrate how easily it can be done with Illustrator&amp;rsquo;s &amp;lsquo;Transform Each&amp;rsquo; command.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Step &lt;/strong&gt;&lt;strong&gt;1 &lt;/strong&gt;- Create a new document and turn the document grid on (Cmd+&amp;rsquo;) and then make sure &amp;lsquo;Snap to Grid&amp;rsquo; is turned on (Shift+Cmd+&amp;rdquo;). Snapping to a grid ensures uniform spacing between all the dots you&amp;rsquo;re about to draw.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;img align="left" alt="" src="http://factore.ca/system/images/images/87/original/step1.jpg?1300204514" /&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Step 2&lt;/strong&gt; - Draw a circle at one of the intersecting grid points using the ellipse tool (L). By holding down the (Shift) key as you click, the ellipse will be constrained to a perfect circle.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;img align="left" alt="" src="http://factore.ca/system/images/images/88/original/step2.jpg?1300204533" /&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Step 3&lt;/strong&gt; - Now we&amp;rsquo;re going to create a row of circles, so copy the original circle by holding down the (Option/Alt) key, clicking on the circle and dragging it over to the right. Because we turned on &amp;lsquo;Snap to Grid&amp;rsquo; in step one, the circle will be copied to a distance dictated by the grid, as well as be constrained to 90 degree angles.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;img align="left" alt="" src="http://factore.ca/system/images/images/89/original/step3.jpg?1300204546" /&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;To repeat the last transformation (in this case, copying the circle over to the right), press (Cmd+D). Press it repeatedly until you have an entire row of circles.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Step 4&lt;/strong&gt; - Select your entire row of dots, and repeat step 3, but this time copy the row down below the original row. Repeat this transformation (Cmd+D) until you have a sufficient number of rows.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;img align="left" alt="" src="http://factore.ca/system/images/images/90/original/step4.jpg?1300204558" /&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Step 5&lt;/strong&gt; - Now, in this case I&amp;rsquo;ve decided that I&amp;rsquo;d like my fade to happen from left to right, so the dots in the left-most column will be the largest ones. Select the second column of dots and press (Alt+Shift+Cmd+D). This brings up the &amp;lsquo;Transform Each&amp;rsquo; window. Since I have 10 columns of dots, and I&amp;rsquo;ve already determined that the first column will be the largest (100%), my second column will be 90% of the original size. Enter &amp;lsquo;90&amp;rsquo; into both the horizontal and vertical scale fields and press &amp;lsquo;OK&amp;rsquo;. Because we&amp;rsquo;re transforming &amp;ldquo;each&amp;rdquo; element that is selected, they will all scale relative to themselves, meaning they will retain their respective center positions on the grid.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;img align="left" alt="" src="http://factore.ca/system/images/images/91/original/step5.jpg?1300204772" /&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Step 6&lt;/strong&gt; - Continue across the columns, repeating step 5 and entering values of 80%, 70%... and so on. You should have a grid of dots that looks like this. Depending on how large or small you&amp;rsquo;ve made it, you should have a pretty authentic looking gradient of halftone dots.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;img align="left" alt="" src="http://factore.ca/system/images/images/92/original/step6.jpg?1300209369" /&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Step 7 &lt;/strong&gt;- Get creative! The sky is the limit here, so experiment with all sorts of grids, linear and radial gradients, angled grids and staggered dot placement etc. and have fun!&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;img align="left" alt="" src="http://factore.ca/system/images/images/93/original/step7.jpg?1300209704" /&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/SJhJRNSfp1Q" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 15 Mar 2011 14:38:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/SJhJRNSfp1Q/94-make-halftone-dots-using-illustrator-s-transform-each-command</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/94-make-halftone-dots-using-illustrator-s-transform-each-command</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/94-make-halftone-dots-using-illustrator-s-transform-each-command</feedburner:origLink></item>
    <item>
      <title>Escaping the Zone?</title>
      <description>&lt;p&gt;&lt;em&gt;&amp;quot;I've got to get out of this rut and back into the groove.&amp;quot; - Homer Simpson&lt;/em&gt;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;As programmers, the holy grail of productivity is that sweet, sweet combination of concentration + motivation known as &lt;a href="http://en.wikipedia.org/wiki/Flow_(psychology)"&gt;flow&lt;/a&gt;.&amp;nbsp;You know you're there when you experience lost time, stop eating and&amp;nbsp;walk to the bathroom with your eyes on the floor so you don't get stuck talking to co-workers and losing your train of thought.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;As much as possible, I structure my day and my work environment to maximize my potential for flow. &amp;nbsp;I try to batch common tasks,&amp;nbsp;or group small programming jobs together so that I can make blocks of (potentially) uninterrupted time which I can fill with working&amp;nbsp;on the larger, tougher projects. &amp;nbsp;That doesn't necessary mean that I will achieve that flow-like state: phones still ring, colleagues&amp;nbsp;still talk, priorities still change. &amp;nbsp;I don't worry too much about it; tomorrow might be different.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;What I DO struggle with, though, is being routed from flow. &amp;nbsp;Last week, I was programming away on a project, completely in the zone,&amp;nbsp;the end was in sight, and then things changed. &amp;nbsp;A client called to report a pretty serious bug with their app, and I had to deal with&amp;nbsp;it immediately. &amp;nbsp;As I stopped what I was doing on my original task, making notes about what I was working on and saving my changes-in-progress, I&amp;nbsp;noticed myself feeling annoyance and some anger. &amp;nbsp;As I started working on debugging and fixing the new problem, I could feel the pull&amp;nbsp;of the other issue, and had a hard time getting motivated on the new one. The bug got fixed, eventually, but I couldn't shake the&amp;nbsp;negative feelings I had from having to shift mental gears so quickly.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;I don't have any solutions for this. &amp;nbsp;In fact, I am looking for suggestions. &amp;nbsp;How do &lt;em&gt;you&lt;/em&gt; pull yourself out of the flow and get into&amp;nbsp;a new zone with minimal mental disorder?&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/gZEUA31mmTQ" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 14 Mar 2011 13:58:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/gZEUA31mmTQ/93-escaping-the-zone-</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/93-escaping-the-zone-</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/93-escaping-the-zone-</feedburner:origLink></item>
    <item>
      <title>Our New Project Manager</title>
      <description>&lt;p&gt;We're very pleased to announce that Tara Pledge has joined our ranks in the role of Project Manager.&lt;/p&gt;
&lt;p&gt;Tara is an honours grad of Mohawk College's 3-year Advertising and Communication Media programme, after which she worked with a number of companies both small and large to maintain client relationships, devise strategies and collaborate with and manage in-house and external creative and production teams. Tara also held an extended-by-request internship at Ogilvy &amp;amp; Mather, during which she worked on the IBM and Kraft accounts.&lt;/p&gt;
&lt;p&gt;Tara leads a violent, fast-moving second life as Scooby Doom, captain of the Hamilton Harlots roller derby team, and is a huge fan of terrible 80s movies and music - so pretty much a perfect fit for factor[e].&lt;/p&gt;
&lt;p&gt;If you work with us, you'll probably get to know Tara quite well - she'll make sure you're taken care of. We're sure you'll be as happy as we are to have her aboard.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/Q5z2mD4y9kg" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 07 Mar 2011 10:20:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/Q5z2mD4y9kg/92-our-new-project-manager</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/92-our-new-project-manager</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/92-our-new-project-manager</feedburner:origLink></item>
    <item>
      <title>Moving Into Mobile</title>
      <description>&lt;p&gt;As &lt;a href="/on-the-floor/87-html5-vs-native-apps"&gt;previously discussed&lt;/a&gt; on factor[e]'s blog, there are primarily two types of applications you can develop for mobile platforms: HTML5 apps, which consist of web technologies like CSS, Javascript, and modern HTML capabilities, and are encapsulated within a browser; and native apps, which are written in source code that is compiled and then run directly on the device's processor, without the intermediate layer of a browser.&lt;/p&gt;
&lt;p&gt;There are various advantages to each approach, but at this point, if you want to take full advantage of the capabilities of a given mobile device, there is no question that native apps have the edge.  They are faster, tie in better with the underlying hardware, and can be used to create more compelling experiences.&lt;/p&gt;
&lt;p&gt;For developers who specialize in web development, however, native app development poses a tricky problem.  Much of the power of high level languages like Ruby and Python vanishes when one enters into the lower-level programming realm of, say, Objective C.  New languages, new IDEs, new APIs, new libraries, and an entire new paradigm combine to create a substantial learning curve for web developers seeking to move into mobile.&lt;/p&gt;
&lt;p&gt;The rewards for doing so, though, are significant, and I'm not just talking about money.  The growing ubiquity of mobile devices capable of running advanced applications represents the most exciting advance in personal computing in decades.  Major opportunities exist to shape the future of mobile development, changing lives in the process.&lt;/p&gt;
&lt;p&gt;factor[e] is committed to participating in this computing revolution.  We are well-positioned to take part: we have excellent design skills, a history of successfully completing complex technological projects, and decades of combined programming experience.  Our developers have worked in a long list of programming languages: Ruby, PHP, Python, Perl, C, C++, Java, Visual Basic, ASP, Pure Data, Lisp, SQL and assembler.  Adding Objective C to the list is not going to be a problem.&lt;/p&gt;
&lt;p&gt;So, do you need a mobile app?  Looking to target smartphones or tablets?  Interested in getting in on the App Store gold rush?  &lt;a href="/contact"&gt;Contact us&lt;/a&gt; and let us know.  We can help.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/avSYjt-a6Jw" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 28 Feb 2011 09:22:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/avSYjt-a6Jw/91-moving-into-mobile</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/91-moving-into-mobile</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/91-moving-into-mobile</feedburner:origLink></item>
    <item>
      <title>More than 20 Textmate shortcuts I use all the time</title>
      <description>&lt;p&gt;In a Mac environment, one of the favourite text editors for development is &lt;a href="http://macromates.com/"&gt;Textmate&lt;/a&gt;.&amp;nbsp;Some people around the office have migrated to &lt;a href="http://macvim.org/OSX/index.php"&gt;Vim&lt;/a&gt;, but I'll let them address that in their own posts.&lt;/p&gt;
&lt;p&gt;I've been finding most of these shortcuts by accident. Usually by missing a usual shortcut with an inaccurate keystroke, then sudden, unexplained magic happens.&lt;/p&gt;
&lt;p&gt;I've also discovered quite a few while watching &lt;a href="http://railscasts.com/"&gt;Railscasts&lt;/a&gt;. If you watch the upper right hand corner of a Textmate shot you'll usually see what sort of shortcut is used to make the magic happen.&lt;/p&gt;
&lt;h3 style="margin-top:20px"&gt;Here's a few I use all the time:&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cmd + T&lt;/strong&gt; : List of most recent files and quick file search&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ctrl + Shift + D&lt;/strong&gt; : Duplicates you current line/selection&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ctrl + Shift + K&lt;/strong&gt; : Removes the entire line the cursor is on&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ctrl + Cmd + R&lt;/strong&gt; : Show the file you are working on in the drawer&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alt + Cmd + Down&lt;/strong&gt; : Opens the view of the action your cursor is currently in&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ctrl + L&lt;/strong&gt; : Inserts &amp;quot; =&amp;gt; &amp;quot; (in an .rb file)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cmd + ] or Cmd + [&lt;/strong&gt; : Indent left or right&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alt + Cmd + ]&lt;/strong&gt; : Align assignments within a block&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cmd + /&lt;/strong&gt; : Comments out the line/selection of code using the appropriate syntax (most of the time)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cmd + Del&lt;/strong&gt; : Deletes everything after the cursor&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cmd + Backspace&lt;/strong&gt; : Deletes everything before the cursor&lt;/p&gt;
&lt;h2 style="margin-top:30px"&gt;Tab completion&lt;/h2&gt;
&lt;p&gt;This, like terminal, works more often than not. Depending on the bundles you have installed and the extension of the file you are coding, hitting tab following some snippet of code may complete what you are doing. You can also continue to tab through the options in blocks that have more than one condition/option/variable.&lt;/p&gt;
&lt;h3 style="margin-top:20px"&gt;Loops&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Def then Tab&lt;/strong&gt; : def &lt;em&gt;method&lt;/em&gt; ... end&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Do then Tab&lt;/strong&gt; : do |&lt;em&gt;variable&lt;/em&gt;| ... end&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If then Tab&lt;/strong&gt; : if &lt;em&gt;condition&lt;/em&gt; ... end&lt;/p&gt;
&lt;h3 style="margin-top:20px"&gt;Validations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;vp then Tab&lt;/strong&gt; : validates_presence_of :&lt;em&gt;attribute&lt;/em&gt;, :on =&amp;gt; &lt;em&gt;:create&lt;/em&gt;, :message =&amp;gt; &amp;quot;&lt;em&gt;can't be blank&lt;/em&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;vu then Tab&lt;/strong&gt; :   validates_uniqueness_of :&lt;em&gt;attribute&lt;/em&gt;, :on =&amp;gt; &lt;em&gt;:create&lt;/em&gt;, :message =&amp;gt; &amp;quot;&lt;em&gt;must be unique&lt;/em&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;vf then Tab&lt;/strong&gt; : validates_format_of :&lt;em&gt;attribute&lt;/em&gt;, :with =&amp;gt; &lt;em&gt;/^[\w\d]+$/&lt;/em&gt;, :on =&amp;gt; &lt;em&gt;:create&lt;/em&gt;, :message =&amp;gt; &amp;quot;&lt;em&gt;is invalid&lt;/em&gt;&amp;quot;&lt;/p&gt;
&lt;h3 style="margin-top:20px"&gt;Relationships&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;bt then Tab&lt;/strong&gt; : belongs_to :&lt;em&gt;object&lt;/em&gt;, :class_name =&amp;gt; &amp;quot;&lt;em&gt;Object&lt;/em&gt;&amp;quot;, :foreign_key =&amp;gt; &amp;quot;&lt;em&gt;object_id&lt;/em&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;hm then Tab&lt;/strong&gt; : has_many :&lt;em&gt;objects&lt;/em&gt;, :class_name =&amp;gt; &amp;quot;&lt;em&gt;object&lt;/em&gt;&amp;quot;, :foreign_key =&amp;gt; &amp;quot;&lt;em&gt;reference_id&lt;/em&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ho then Tab&lt;/strong&gt; : has_one :&lt;em&gt;object&lt;/em&gt;, :class_name =&amp;gt; &amp;quot;&lt;em&gt;Object&lt;/em&gt;&amp;quot;, :foreign_key =&amp;gt; &amp;quot;&lt;em&gt;object_id&lt;/em&gt;&amp;quot;&lt;/p&gt;
&lt;h3 style="margin-top:20px"&gt;Migrations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;mcol then Tab&lt;/strong&gt; : Provides you with the options available for column migrations&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;mtab then Tab&lt;/strong&gt; : Provides you with the options available for table migrations&lt;/p&gt;
&lt;h2 style="margin-top:30px"&gt;And finally&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ctrl + Cmd + T&lt;/strong&gt; : To see a list of all bundle items (shortcuts) available to the file you are currently working on&lt;/p&gt;
&lt;h2 style="margin-top:30px"&gt;DIY&lt;/h2&gt;
&lt;p&gt;You can also make your own by recording and saving a Macro. In the menu under Bundles &amp;gt; Macros you can:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ctrl + CMd + M&lt;/strong&gt; : Start recording. This will record any keystrokes you make so that you can create your own shortcuts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Shift + Cmd + M&lt;/strong&gt; : Replay the last recording to see how it works or just repeat the last recorded action over and over.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alt + Cmd + M&lt;/strong&gt; : Record the last recording and assign a shortcut to it.&lt;/p&gt;
&lt;p&gt;There are tons of bundles and shortcuts you can add use in textmate and this is only scratching the surface. Give it a shot and see what you find.&lt;/p&gt;
&lt;p style="font-size:11px"&gt;&lt;strong&gt;REFERENCES:&lt;/strong&gt; &lt;a href="http://szeryf.wordpress.com/2010/02/15/textmate-shortcuts-you-should-be-using/"&gt;http://szeryf.wordpress.com/2010/02/15/textmate-shortcuts-you-should-be-using/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/uYhp1wOAfPo" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 28 Jan 2011 12:29:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/uYhp1wOAfPo/90-more-than-20-textmate-shortcuts-i-use-all-the-time</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/90-more-than-20-textmate-shortcuts-i-use-all-the-time</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/90-more-than-20-textmate-shortcuts-i-use-all-the-time</feedburner:origLink></item>
    <item>
      <title> Using Views to Connect a Legacy Database to Rails</title>
      <description>&lt;div&gt;
&lt;div&gt;One of my first challenges as a new developer here at factor[e] has been to create a Rails application that runs on an existing database which is also the back-end for another php-driven website. &amp;nbsp;Since Rails favours naming conventions in tables and keys this means a lot of translational code in the models. &amp;nbsp;However, following inspiration from &lt;a href="http://www.slideshare.net/napcs/Rails-and-legacy-databases-Railsconf-2009"&gt;slide 20 of this presentation&lt;/a&gt;, I solved this using conventionally named views on the MySQL database.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;What are views?&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;SQL views act as virtual tables in a database. &amp;nbsp;They're primarily used for saving SELECT statements and exposing a specific data-set. &amp;nbsp;Typically a view will join together information from a number of different tables (through JOIN statements), however, in order for a view to be updatable it must be associated with only one table.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;From the MySQL reference:&lt;/div&gt;
&lt;blockquote style="background: #F2F2F2;font-size: 11px; padding: 5px"&gt;
&lt;div&gt;&amp;quot;Some views are updatable. That is, you can use them in statements such as UPDATE, DELETE, or INSERT to update the contents of the underlying table. For a view to be updatable, there must be a one-to-one relationship between the rows in the view and the rows in the underlying table.&amp;quot; - &lt;a href="http://dev.mysql.com/doc/refman/5.5/en/create-view.html"&gt;http://dev.mysql.com/doc/refman/5.5/en/create-view.html&lt;/a&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;For more info on views check this &lt;a href="http://www.techotopia.com/index.php/An_Introduction_to_MySQL_Views"&gt;MySQL Views Introduction&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Views with Rails&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;In order to create effective views with Rails, they need to be updatable. &amp;nbsp;Therefore we need to create a new view for each table that that we want read/write access to in the legacy database without JOINing any tables together (that's what we'll use Rails' has_many and belongs_to methods for). &amp;nbsp;Creating a view is as simple as running a SELECT statement:&lt;/div&gt;
&lt;blockquote style="background: #F2F2F2;font-size: 11px; padding: 5px"&gt;
&lt;div&gt;CREATE OR REPLACE VIEW employees AS SELECT * FROM Employee_Table;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;However, for Rails this only solves the problem of having misnamed tables and not well-formed column names. &amp;nbsp;For more control:&lt;/div&gt;
&lt;blockquote style="background: #F2F2F2;font-size: 11px; padding: 5px"&gt;
&lt;div&gt;CREATE OR REPLACE VIEW employees AS SELECT Employee_Table.EmployeeID AS id, Employee_Table.CompanyID AS company_id, Employee_Table.FName AS first_name, Employee_Table.LName AS last_name FROM TEmployee;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Here we've effectively created a new view which has a conventional name, well-formed column names and properly named primary and foreign keys (id and company_id). &amp;nbsp;Now we need to tell Rails to create the model and other viscera:&lt;/div&gt;
&lt;blockquote style="background: #F2F2F2;font-size: 11px; padding: 5px"&gt;
&lt;div&gt;Rails generate resource Employee --migration false&lt;/div&gt;
&lt;div&gt;or&lt;/div&gt;
&lt;div&gt;Rails generate scaffold Employee --migration false&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;The &amp;quot;--migration false&amp;quot; option tells Rails not to create any migrations since we're working on an existing database.&lt;/div&gt;
&lt;div&gt;Finally, to get the view to act properly with respect to entity relationships, we need to add methods for the foreign keys.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;in &lt;u&gt;app/models/employee.rb&lt;/u&gt;&lt;/div&gt;
&lt;blockquote style="background: #F2F2F2;font-size: 11px; padding: 5px"&gt;
&lt;div&gt;class Employee &amp;lt; ActiveRecord::Base&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;belongs_to &amp;nbsp;:company &amp;nbsp;&lt;/div&gt;
&lt;div&gt;end&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Now we should have a fully functional Rails interface to the legacy 'Employee_Table' through the view 'employees'.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Automating the process&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;Since the database I'm working with contains 50+ tables, I decided that my time would be better spent writing a rake task that would generate the necessary MySQL statements and Rails commands.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;First we need the database schema:&lt;/div&gt;
&lt;blockquote style="background: #F2F2F2;font-size: 11px; padding: 5px"&gt;
&lt;div&gt;mysqldump -u username -p password --no-data=TRUE &amp;quot;db_name&amp;quot; &amp;gt; schema.sql&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Next, create a rake task to parse the schema. &amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;u&gt;tasks/lib/create-views.rake&lt;/u&gt;&lt;/div&gt;
&lt;blockquote style="background: #F2F2F2;font-size: 11px; padding: 5px"&gt;
&lt;div&gt;
&lt;div&gt;namespace :create_views do&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;#load the database environment. &amp;nbsp;Will get &amp;quot;database not configured&amp;quot; errors otherwise.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;task :load_config =&amp;gt; :rails_env do&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;require 'active_record'&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ActiveRecord::Base.configurations = Rails.application.config.database_configuration&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;end&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;desc &amp;quot;Create views from schema file&amp;quot;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;task(:views =&amp;gt; :load_config) do&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@views = Array.new&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;#filter out any reserved words that might break the SQL&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;reserved = [&amp;quot;unique&amp;quot;]&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;create = Regexp.new(&amp;quot;CREATE TABLE `([^`]*)`&amp;quot;) #table name&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;column = Regexp.new(&amp;quot;^\s*`([^`]*)`[^,]*.*$&amp;quot;) #column name&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;primary_key = Regexp.new(&amp;quot;^\s*PRIMARY KEY [^`]*`([^`]*)`.*$&amp;quot;) #primary key&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;foreign_key = Regexp.new(&amp;quot;^\s*KEY `([^`]*)`[^`]*`([^`]*)`&amp;quot;) #foreign key&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;table_end = Regexp.new(&amp;quot;ENGINE&amp;quot;) #end of table marker&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;File.open('schema.sql').each do |line|&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;match_create = create.match(line)&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;if match_create #table name found&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@view = Hash.new&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@view[:columns] = Hash.new&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@view[:foreign_keys] = Array.new&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;table_name = match_create[1]&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@view[:old_table_name] = table_name&lt;/div&gt;
&lt;div&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;table_name = table_name.gsub(/^T/, &amp;quot;&amp;quot;) #remove initial T from each table name&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;table_name = table_name.tableize&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@view[:table_name] = table_name&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;puts table_name&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;end &amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;match_column = column.match(line)&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;if match_column #column name found&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;column_name = match_column[1].underscore&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;#Check for columns wrongly named &amp;quot;id&amp;quot;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if column_name == &amp;quot;id&amp;quot;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;column_name = @view[:table_name] + &amp;quot;_id&amp;quot;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;end&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;#check for reserved words&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if reserved.index(column_name)&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;column_name += &amp;quot;_val&amp;quot;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;end&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@view[:columns][match_column[1]] = column_name&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;end&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;match_primary_key = primary_key.match(line)&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;if match_primary_key #found primary key&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;primary_key_name = match_primary_key[1].underscore&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if !@view[:primary_key]&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@view[:primary_key] = primary_key_name&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;end&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;end&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;match_foreign_key = foreign_key.match(line)&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;if match_foreign_key #found foreign key&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreign_key_name = match_foreign_key[1].underscore&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@view[:foreign_keys].push foreign_key_name&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;end&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;match_table_end = table_end.match(line)&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;if match_table_end #found table end&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@views.push(@view)&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;end&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;end&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sqlfile = File.open(&amp;quot;add_views.sql&amp;quot;, 'w') #sql script to create all the views&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;rails_script = File.open(&amp;quot;rails_generate.sh&amp;quot;, 'w') #shortcut to create all the &amp;quot;rails generate&amp;quot; statements&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@views.each do |view|&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;viewquery = &amp;quot;CREATE OR REPLACE VIEW #{view[:table_name]} AS SELECT&amp;quot;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;#rename primary key to &amp;quot;id&amp;quot;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;if pk_index = view[:columns].index(view[:primary_key])&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;view[:columns][pk_index] = &amp;quot;id&amp;quot;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;end&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;if pk_index = view[:foreign_keys].index(view[:primary_key])&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;view[:foreign_keys][pk_index] = &amp;quot;id&amp;quot;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;end&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;view[:foreign_keys].each do |fkey|&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;#if you want to do something with foreign keys, do it here&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;end&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;view[:columns].each do |old_col, new_col| #rename the columns&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;viewquery += &amp;nbsp;&amp;quot; #{view[:old_table_name]}.#{old_col} AS #{new_col},&amp;quot;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;end&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;viewquery = viewquery.chomp(&amp;quot;,&amp;quot;)&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;viewquery += &amp;nbsp;&amp;quot; FROM #{view[:old_table_name]}&amp;quot;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;sqlfile.write(viewquery+&amp;quot;;\n&amp;quot;)&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;rails_script.write(&amp;quot;rails generate resource #{view[:table_name].classify} --migration false\n&amp;quot;) # Rails 3&lt;/div&gt;
&lt;div&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp;rails_script.write(&amp;quot;script/generate controller #{view[:table_name]}\n&amp;quot;) # Rails 2&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;end&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sqlfile.close&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;rails_script.close&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;end&lt;/div&gt;
&lt;div&gt;end&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Run the script with&amp;nbsp;&lt;/div&gt;
&lt;blockquote style="background: #F2F2F2;font-size: 11px; padding: 5px"&gt;
&lt;div&gt;rake create_views:views --trace&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Check out the files to make sure the parsing worked properly&lt;/div&gt;
&lt;blockquote style="background: #F2F2F2;font-size: 11px; padding: 5px"&gt;
&lt;div&gt;cat add_views.sql |more&lt;/div&gt;
&lt;div&gt;cat rails_generate.sh | more&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Be sure to edit add_views.sql if you want to change some of the column names to be more readable/reasonable.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Set the execute bit on our generated script&amp;nbsp;&lt;/div&gt;
&lt;blockquote style="background: #F2F2F2;font-size: 11px; padding: 5px"&gt;
&lt;div&gt;chmod +x rails_generate.sh&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Create the views&lt;/div&gt;
&lt;blockquote style="background: #F2F2F2;font-size: 11px; padding: 5px"&gt;
&lt;div&gt;mysql -u username -p password db_name &amp;lt; add_views.sql&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Run the script&lt;/div&gt;
&lt;blockquote style="background: #F2F2F2;font-size: 11px; padding: 5px"&gt;
&lt;div&gt;./rails_generate.sh&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;And now you should be able to update your models with proper foreign key pairings (with belongs_to etc.). &amp;nbsp;I haven't been able to automate that portion yet, but I also want to be sure to edit each model anyway. &amp;nbsp;Note that the parsing script was specific to the database I was working with and you'll need to tweak it in order to get better naming translations for your own system. &amp;nbsp;Also note that this was done with Rails 3.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Hope this information can help some of you struggling with building Rails applications on top of legacy databases. &amp;nbsp;If anyone can suggest a good way to automate the foreign key/belongs_to model building then please comment!&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/FhUZBi0Y-1w" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 24 Jan 2011 10:34:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/FhUZBi0Y-1w/89--using-views-to-connect-a-legacy-database-to-rails</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/89--using-views-to-connect-a-legacy-database-to-rails</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/89--using-views-to-connect-a-legacy-database-to-rails</feedburner:origLink></item>
    <item>
      <title>CSS Hexagons</title>
      <description>&lt;p&gt;One of my other nerdly pursuits is playing and designing &lt;a href="http://boardgamegeek.com/boardgame/57390/catacombs"&gt;boardgames&lt;/a&gt;, and so naturally I found myself wondering the other day, &amp;quot;Can you make a hexagonal map purely in html and css?&amp;quot;&lt;/p&gt;
&lt;div&gt;It turns out you can, of a sorts, though there are a few problems associated with it.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Note&lt;/strong&gt;: &amp;nbsp;I designed this using Chrome, and briefly looked at it in Firefox and Safari, but as for IE YMMV.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Looked at the right way, a hexagon is just a rectangle bracketed by two triangles, and so could be fairly easily represented by a regular div and two &lt;a href="http://www.google.ca/search?num=100&amp;amp;hl=en&amp;amp;q=css+triangles&amp;amp;aq=f&amp;amp;aqi=&amp;amp;aql=&amp;amp;oq="&gt;css &amp;quot;triangles.&amp;quot;&lt;/a&gt; &amp;nbsp;I wrapped it in a container div to keep it as a single unit, and ended up with this:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;code&gt; &amp;lt;div id=&amp;quot;a1&amp;quot; class=&amp;quot;hex blue&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;div class=&amp;quot;hex_left&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;div class=&amp;quot;hex_centre&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;div class=&amp;quot;hex_right&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;nbsp;&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;A little trigonometry and some css styling, and the hexagon is complete.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;code&gt; body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form, fieldset, input, textarea, p, blockquote, th, td {margin:0px; padding:0px; }&lt;/code&gt;&lt;/div&gt;
&lt;code&gt;
&lt;div&gt;.hex {position:absolute; width:200px; height:172px;}&lt;/div&gt;
&lt;div&gt;.hex_left, .hex_right {float:left; border-width: 86px 50px; border-color:transparent; border-style:solid; width:0px; height:0px;}&lt;/div&gt;
&lt;div&gt;.hex_left {border-left-width:0px;}&lt;/div&gt;
&lt;div&gt;.hex_centre {font-family: Helvetica,&amp;quot;Helvetica Neue&amp;quot;,Arial,sans-serif; font-size:36px; float:left; border:0px solid transparent; padding: 50px 30px; width:40px; height:72px;}&lt;/div&gt;
&lt;div&gt;.hex_right {border-right-width:0px;}&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;.blue .hex_left {border-right-color:blue;}&lt;/div&gt;
&lt;div&gt;.blue .hex_centre {background-color:blue;}&lt;/div&gt;
&lt;div&gt;.blue .hex_right {border-left-color:blue;}&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;To make things interesting, I added some classes for different colours, and some ids for positioning, and ended up with &lt;a href="http://factore.ca/experiments/hexmap/index.html"&gt;this hexmap&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;The biggest issue (demonstrated if you roll-over the hexes in the link above) is that the triangular divs overlap, so javascript selection of individual hexes might be problem. &amp;nbsp;Also, I don't think it's possible to make outlined hexes without using some kind of border image.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Still, I am reasonably impressed with how easy this was to implement.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/26oREFf7puQ" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 17 Jan 2011 13:05:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/26oREFf7puQ/88-css-hexagons</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/88-css-hexagons</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/88-css-hexagons</feedburner:origLink></item>
    <item>
      <title>HTML5 vs. Native Apps</title>
      <description>&lt;p&gt;It is not always easy or straightforward to choose between HTML5 and native application programming when making a decision on the best technology to use for a mobile application.&lt;/p&gt;
&lt;p&gt;If you're developing a game and you want to make money from it, the choice is pretty clear: you should develop a native app for the iOS platform and sell it in the Apple App Store. &amp;nbsp;But for many other types of applications, the choice is not as straightforward. &amp;nbsp;To help clarify your options, I've developed a chart that examines many different factors.&lt;/p&gt;
&lt;p&gt;&lt;big&gt;&lt;a href="http://factore.ca/experiments/html5_vs_native/map.jpeg"&gt;Click here to view the chart: HTML5 vs. Native Apps.&lt;/a&gt;&lt;/big&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/kwuuO7Woz3M" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 31 Dec 2010 15:00:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/kwuuO7Woz3M/87-html5-vs-native-apps</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/87-html5-vs-native-apps</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/87-html5-vs-native-apps</feedburner:origLink></item>
    <item>
      <title>To Label Or Not To Label</title>
      <description>&lt;p&gt;So I've babbled on in my previous two posts about forestry     certification, labeling and working it into the production workflow     and still I haven't put one label on one printed piece! Yes -     clients are getting interested in being &amp;quot;greener&amp;quot; and a few of those     like the idea of really being recognized as such, yet somehow the     opportunity to use a label seems to elude me.&lt;br /&gt;
&lt;br /&gt;
One recent project is a case in point. The piece was a 12 x 24&amp;quot;     poster that would fold down to 6 x 6&amp;quot;. It was for a traveling art     exhibition initiated by a large public art gallery. Since my eco     printing consciousness has been raised of late, I made a special     effort to specify a very &amp;quot;green&amp;quot; paper stock that was &lt;a href="http://www.fsccanada.org/default.htm"&gt;FSC certified&lt;/a&gt;.     I had the job quoted by two FSC certified printers and the estimate     was happily accepted by our client. I made a point of explaining to     the client that we would be able to to use the FSC label and that it     would identify this printed piece as being produced using paper from     a responsibly managed forest and that the printer of the piece was     certified. She was happy with that idea -- in theory. &lt;br /&gt;
&lt;br /&gt;
But when the art was approved I asked our vendor for the placeholder     label and took a close look at the guidelines for &lt;a href="http://www.fsccanada.org/labelandlogouse.htm"&gt;FSC label usage&lt;/a&gt;     which had recently been updated. Unfortunately the size requirement     for the label seemed quite obtrusive in the design of the piece and     actually competed unfavourably for attention with the gallery logo.     I didn't like it and neither did our client. In the end we decided     not to use the label. The client's investment in being recognized as     eco conscious did not outweigh her interest in producing an     aesthetically pleasing printed piece.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;br /&gt;
&lt;img alt="" src="http://factore.ca/system/images/images/84/original/FSC_labelBig.jpg?1292955176" style="width: 272px; height: 270px;" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
So then I thought, why worry? The client knows the piece is &amp;quot;green&amp;quot;     and we as the designers also know. We've made the responsible  choices. How important is it that everyone else knows about it? &lt;br /&gt;
&lt;br /&gt;
I guess in the end it comes down to the client's mandate. Some organizations,     especially governmental and large corporations have made it part of     their mandate to improve their environmental standards and they are     willing and able to go the extra mile to make sure they are     perceived as such. Other smaller organizations may not be quite     there yet. And when it comes to arts organizations, aesthetics wins out in more cases than not.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" src="http://factore.ca/system/images/images/86/original/AdadHannah_noFSClabel.jpg?1292960403" /&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;So label or no label, I will     concentrate on specifying paper from mills that purchase certified     pulp in significant quantities and using certified printers.&lt;br /&gt;
&lt;br /&gt;
But while we're on the subject, here's an excellent, eye-opening     &lt;a href="http://www.paperspecs.com/mainblog/the-fsc-sfi-sham-or-is-it/"&gt;article&lt;/a&gt; from Paper Specs that discusses the complex subject of     eco-certification, what the labels actually mean and how they work     in practice. Would it surprise you to know that the FSC certified     paper you buy may not actually contain any FSC certified pulp? Most     people would say yes - and might also be quite outraged - a reaction     that is described in this article. But as Sabine Lenz explains, that     doesn't mean the whole eco-certification endeavour is a sham. Read     the article for yourself and there are also some enlightening     comments that are worth a read as well.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/Nq6ASVme8AY" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 21 Dec 2010 14:42:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/Nq6ASVme8AY/86-to-label-or-not-to-label</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/86-to-label-or-not-to-label</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/86-to-label-or-not-to-label</feedburner:origLink></item>
    <item>
      <title>Image placeholders made easy</title>
      <description>&lt;p&gt;On the topic of &lt;a href="http://factore.ca/on-the-floor/84-preparing-psd-files-for-development"&gt;slicing tidy PSDs&lt;/a&gt;, I've been using a service lately I came across a while ago called &lt;a href="http://placehold.it/"&gt;placehold.it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I was finding that while slicing some designs I was spending a bunch of time doing one of three things to create temporary placeholder images:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Cropping stock images to fit into templates;&lt;/li&gt;
    &lt;li&gt;Using a styled div and having to go back to set up the images; or&lt;/li&gt;
    &lt;li&gt;Setting up &lt;a href="http://factore.ca/forge-cms/"&gt;Forge modules&lt;/a&gt; before I fleshed out the layout, which would, inevitably, result in rolling something back.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Either way I was probably spending more time on this than was necessary.&lt;/p&gt;
&lt;p&gt;A few templates ago I started using &lt;a href="http://placehold.it/"&gt;placehold.it&lt;/a&gt; and haven't looked back. Put simply, it is quick and easy image placeholder. The only down-side is that you need to be connected to the internet to use it.&lt;/p&gt;
&lt;p style="margin-top: 20px;"&gt;In your code all you have to do is insert a url as your source:&lt;/p&gt;
&lt;script src="https://gist.github.com/745132.js?file=gistfile1.html"&gt;&lt;/script&gt;
&lt;p&gt;This becomes a 200 by 100 image:&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" src="http://placehold.it/200x100" /&gt;&lt;/p&gt;
&lt;p style="margin-top: 20px;"&gt;If you'd like to change the colour:&lt;/p&gt;
&lt;script src="https://gist.github.com/745143.js?file=gistfile1.html"&gt;&lt;/script&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" src="http://placehold.it/200x100/a00000/ffffff" /&gt;&lt;/p&gt;
&lt;p style="margin-top: 20px;"&gt;How about custom text?&lt;/p&gt;
&lt;script src="https://gist.github.com/745148.js?file=gistfile1.html"&gt;&lt;/script&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" src="http://placehold.it/200x100/a00000/ffffff&amp;amp;text=hello+world" /&gt;&lt;/p&gt;
&lt;p style="margin-top: 20px;"&gt;You can also create an image using the format of your choice by simply appending the extension after any option except the text. The default format is .gif.&lt;/p&gt;
&lt;script src="https://gist.github.com/745150.js?file=gistfile1.html"&gt;&lt;/script&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" src="http://placehold.it/200x100/a00000/ffffff.png&amp;amp;text=yo!" /&gt;&lt;/p&gt;
&lt;p style="margin-top: 20px;"&gt;This isn't a huge game changer and may not fit into your own workflow, but it has allowed me to focus on the task of slicing before jumping deeper into code.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/bTTewAcCytU" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 17 Dec 2010 11:00:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/bTTewAcCytU/85-image-placeholders-made-easy</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/85-image-placeholders-made-easy</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/85-image-placeholders-made-easy</feedburner:origLink></item>
    <item>
      <title>Preparing PSD Files for Development</title>
      <description>&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span style="letter-spacing: 0.0px"&gt;If you're designing for the web, and you work in an 'assembly line' environment as I do - whereby designers design and developers develop - you&amp;rsquo;ll be familiar with the moans and groans developers emit while dissecting a sloppy layout. In an effort to streamline productivity and keep the development time as efficient as possible, I have a few suggestions for designers.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;strong&gt;&lt;span style="letter-spacing: 0.0px"&gt;Keep your photoshop documents as tidy and organized as possible.&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;span style="letter-spacing: 0.0px"&gt;Half of the struggle developers endure is trying to find and isolate specific layers (or layer groups) within a document in order to create appropriate slices. This can be made MUCH easier if the designer takes the time to label the layers and groups with appropriate (and descriptive) names. It also helps to gather layers together into groups representing specific parts of the site.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;img align="absMiddle" alt="" src="http://factore.ca/system/images/images/80/original/layers_palette.jpg?1291923182" /&gt;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;strong&gt;&lt;span style="letter-spacing: 0.0px"&gt;Note to developers:&lt;/span&gt;&lt;/strong&gt;&lt;span style="letter-spacing: 0.0px"&gt; You can also right-click anywhere in the photoshop document, and photoshop will bring up a list of layers under that click. This might make it easier to find a certain layer if the file is poorly organized.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span style="letter-spacing: 0.0px"&gt;If you&amp;rsquo;re using &lt;strong&gt;vector shapes&lt;/strong&gt; (and you really should be) to draw objects, make sure to check the &amp;ldquo;Snap to Pixels&amp;rdquo; box under the shape options drop-down menu.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;img align="middle" alt="" src="http://factore.ca/system/images/images/81/original/vector_options.jpg?1291923254" /&gt;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span style="letter-spacing: 0.0px"&gt;If you want clean and sharp graphics, this option will keep shapes on whole pixels instead of between pixels. If you have to edit a previously-drawn shape, zoom in, select the vector shape&amp;rsquo;s points using the Direct Select Tool (keyboard shortcut: A) and adjust with your mouse or keyboard.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;img align="middle" alt="" src="http://factore.ca/system/images/images/82/original/vector_shapes.jpg?1291923316" /&gt;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span style="letter-spacing: 0.0px"&gt;Another thing that might help the process along is to &lt;strong&gt;create a developer-only mockup&lt;/strong&gt; containing notes, font styles, button states, colour swatches and information on any non-web fonts. The client doesn&amp;rsquo;t care about this mockup in the same way a developer doesn&amp;rsquo;t care about the client-only mockup... but it makes it dead easy for a developer to extract only the relevant information required to create the code.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;img align="middle" alt="" src="http://factore.ca/system/images/images/83/original/layers.jpg?1291923392" /&gt;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span style="letter-spacing: 0.0px"&gt;You can &lt;a href="http://dl.dropbox.com/u/3022833/layers.psd"&gt;download the PSD&lt;/a&gt; for the above example to get an idea of what a good developer-only layout looks like. The font used in this example is Colaborate, available from &lt;a href="http://www.fontsquirrel.com/fonts/Colaborate"&gt;Font Squirrel&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;span style="letter-spacing: 0.0px"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/A97LG2JNwcQ" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 09 Dec 2010 14:38:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/A97LG2JNwcQ/84-preparing-psd-files-for-development</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/84-preparing-psd-files-for-development</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/84-preparing-psd-files-for-development</feedburner:origLink></item>
    <item>
      <title>HeadJS:  A Quick Review</title>
      <description>&lt;p&gt;&lt;a href="http://headjs.com/"&gt;HeadJS&lt;/a&gt; is a lightweight javascript...script...that has become pretty popular on &lt;a href="http://www.reddit.com/"&gt;reddit&lt;/a&gt; and &lt;a href="http://news.ycombinator.com/"&gt;Hacker News&lt;/a&gt; in the last week or so.&amp;nbsp; HeadJS essentially does three things:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Loads and executes other javascript files&lt;/li&gt;
    &lt;li&gt;detects some browser / page properties and&lt;/li&gt;
    &lt;li&gt;adds classes to your &amp;lt;html&amp;gt; element&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With those three features, HeadJS allows you to do some pretty interesting things:&lt;br /&gt;
&lt;br /&gt;
1) You can determine how your javascript files will be loaded and executed.&amp;nbsp; By placing only HeadJS in your html head and using it to load the rest of your scripts in your page, you can reduce much of the loading time associated with javascript blocking.&amp;nbsp; You can also get some speed gains by loading the javascript files in parallel, and by running scripts as soon as their dependencies are loaded (as opposed to waiting for all the files to load.&amp;nbsp; Though you can do that too, if you need to.).&lt;br /&gt;
&lt;br /&gt;
2) You can craft your css to take into account browser and page features, or the lack thereof.&amp;nbsp; When HeadJS loads, it checks the browser to see what kind/version it is and whether it supports various css properties.&amp;nbsp; It then adds aptly-named classes to the html element based on its findings.&amp;nbsp; For instance, if the browser is Firefox, HeadJS adds the &amp;quot;mozilla&amp;quot; class.&amp;nbsp; If it supports border-radius, a &amp;quot;borderradius&amp;quot; class is added; if not, the &amp;quot;no-borderradius&amp;quot; class will be there instead.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In addition, HeadJS will assign a class based on the width of the current page, allowing you to style the site for different browser widths.&amp;nbsp; While it does assign these width-based classes in realtime, as the page is being re-sized, the real benefit of it is that it allows you to style for mobile browsers, which are often as full-functioning as their &amp;quot;stationary&amp;quot; brethren, but just have less real-estate.&lt;br /&gt;
&lt;br /&gt;
3) By allowing you to add your own classes to the html element based on any javascript function that returns a boolean value, you can trigger css styles based on things such as whether a user is logged in, the page name, whether a certain action has occured, and so on.&lt;/p&gt;
&lt;p&gt;The CSS&amp;nbsp;functionality (2 and 3 above) emphasizes a Certain Way of Doing Things, which may or may not mesh with yours.&amp;nbsp; Do you want to detect the current page that a user is on, set a class in the head, and style elements accordingly?&amp;nbsp; Or do you want to serve just the content that you need?&amp;nbsp; HeadJS definitely favours the former approach.&amp;nbsp; Similarly, do you want to create one html file and one stylesheet that contains all the divs and rules you might need to cover the various types and sizes of browsers?&amp;nbsp; Or would you rather keep them separate and serve up the ones needed?&amp;nbsp; Again, HeadJS emphasizes the first approach.&amp;nbsp; And are you happy with designing for the lowest common denomonator, then adding styling for browsers support modern features (HeadJS), or do you like to use, for example, plugins like &lt;a href="http://jquery.malsup.com/corner/"&gt;jQuery Corner&lt;/a&gt; that add functionality to obsolete browsers?&lt;/p&gt;
&lt;p&gt;The real value of HeadJS is definitely the javascript loader, which  can significantly improve your page load times (though can leave them  succeptible to a &lt;a href="http://en.wikipedia.org/wiki/Flash_of_unstyled_content"&gt;FUOC&lt;/a&gt;).&amp;nbsp; The author seems to know this, as he has split the loading functionality into its own script.&lt;/p&gt;
&lt;p&gt;I have only played with HeadJS for a couple of hours, but my initial impressions are that the javascript loading features are probably valuable on any project, but the CSS&amp;nbsp;functionality seems like it would be best suited for reasonably small/simple/personally controlled sites, where your markup/css aren't overly huge and you get to make the presentation decisions.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/ky_94wzCTHk" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 07 Dec 2010 09:39:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/ky_94wzCTHk/83-headjs-a-quick-review</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/83-headjs-a-quick-review</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/83-headjs-a-quick-review</feedburner:origLink></item>
    <item>
      <title>The Two Types Of Candidates We're Seeking</title>
      <description>&lt;p&gt;&lt;span style="background-color: rgb(255, 255, 0); "&gt;&lt;strong&gt;PLEASE NOTE:&lt;/strong&gt;&lt;/span&gt; This position has been filled. &amp;nbsp;More details on our new team member to come soon.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;We're hiring: we have an opening for a web developer and we'd like to fill it in the next few weeks.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;What You'll Do&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;You'll code using the latest web development techniques, mainly using Ruby, Javascript, HTML, CSS, Rails, and Sinatra.  From time to time you might do a little PHP, but that's getting rarer all of the time.&lt;/li&gt;
    &lt;li&gt;You'll work on &lt;a href="/portfolio"&gt;beautifully designed websites&lt;/a&gt; of all shapes and sizes.&lt;/li&gt;
    &lt;li&gt;You'll help build interesting web apps, start ups, and new ventures in all kinds of fields: business operations, mapping and geocoding, e-commerce, content management, social media analysis, and that's just scratching the surface.&lt;/li&gt;
    &lt;li&gt;You'll integrate applications with the latest APIs and web services.&lt;/li&gt;
    &lt;li&gt;You'll work on the content management system we developed, &lt;a href="/forge-cms"&gt;Forge&lt;/a&gt;.  Sure, everyone's developed a CMS, but this one is sweet.  You'll also work on some of the other startup ventures we're working on.&lt;/li&gt;
    &lt;li&gt;You'll get a chance to shape the company culture of a great company.  You'll work with people who are intensely passionate about their work, who constantly strive to be the best at it, but who also understand - and maintain - work/life balance.&lt;/li&gt;
    &lt;li&gt;You'll also make a wage that will put you in a great spot if you live in Hamilton or nearby (or are interested in moving here), plus you'll get a nice benefits package.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;
We are seeking one of two types of developer:&lt;/p&gt;
&lt;h2&gt;Candidate #1: The Experienced Developer Who Wants A Change&lt;/h2&gt;
&lt;p&gt;You have several years - perhaps even a decade or more - of programming experience.  You know several languages including at least a couple that you know really well.  You've worked on a ton of different projects and you know the ins and outs of web development - languages like Ruby, Python, PHP, Perl and Javascript, MySQL and maybe some SQLite and/or NoSQL databases thrown in there as well, the complexities of cross-browser compatibility, web frameworks, jQuery or similar, and so on - like the back of your hand.&lt;/p&gt;
&lt;p&gt;You love open source technologies, and perhaps you've contributed to some in the past (let us know!)  If we're lucky, you also know Ruby and Rails really well, and you've worked on some complex RoR projects in the past, but this is not required.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You're also looking for a change, and you're willing to earn less than what you're currently making, or what you would make, doing this job in Toronto, in exchange for working at a different sort of company.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You don't want to work overtime.  Perhaps you have a family and you want some flexibility to take days off, leave early to attend appointments with your kids, and so on.&lt;/p&gt;
&lt;p&gt;You're sick of commuting.  You're sick of traffic.  You want to be able to buy a nice house with lots of space and a backyard in a nice neighbourhood for a price a third of what you'd pay in Toronto. You believe that life should be about more than work and you want to work with people who truly think - and more importantly, &lt;strong&gt;act&lt;/strong&gt;, the same way.&lt;/p&gt;
&lt;p&gt;Practically speaking, you'll make less than $60,000/year to start - but you'll get your life back. Why this salary range?  Because we're based in Hamilton.  The cost of living and doing business here is far lower than in Toronto, and as a result, rates - and thus salaries - are also lower.  That may change eventually, but for now it's a reality.&lt;/p&gt;
&lt;p&gt;Interested?  &lt;a href="/contact"&gt;Contact us&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Candidate #2: The Junior Developer Who Wants A Chance&lt;/h2&gt;
&lt;p&gt;You look at the requirements for candidate #1 with a sinking feeling.  Looks like a lot of job postings you've seen and not qualified for.  But damnit, you've got passion, determination, and creativity!  You know you could be a great web developer if you'd just get a chance to work on complex stuff with talented people who don't mind teaching you how to get great.&lt;/p&gt;
&lt;p&gt;You're &lt;strong&gt;creative&lt;/strong&gt;.  Although your web development experience is somewhat limited, you've got a long history of working on creative projects and making interesting things (they might have nothing to do with web development: we'll still want to hear about it).  You're ambitious and energetic.&lt;/p&gt;
&lt;p&gt;You love technology and you're comfortable with it.  You're not a rank amateur: you've received formal education in software development, and/or you have some years of experience.  You know at least one web programming language reasonably well (such as PHP).  Knowing how to slice layouts and develop cross-browser compatible HTML and CSS is a substantial asset.&lt;/p&gt;
&lt;p&gt;Interested?  &lt;a href="/contact"&gt;Contact us&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/qBqgV2iyoo4" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 12 Nov 2010 13:52:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/qBqgV2iyoo4/82-the-two-types-of-candidates-we-re-seeking</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/82-the-two-types-of-candidates-we-re-seeking</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/82-the-two-types-of-candidates-we-re-seeking</feedburner:origLink></item>
    <item>
      <title>The 10 Basic Requirements Of A Political Website</title>
      <description>&lt;p&gt;I spent a lot of time looking at the websites of candidates during Hamilton's &lt;a href="http://elections.raisethehammer.org/election/1"&gt;recent municipal election&lt;/a&gt;.  I also carefully examined the campaign website of Mayor Fred Eisenberger, found it wanting, and sent along a lot of feedback, most of which his team ignored.  (He lost: probably not because his website was terrible, but it sure didn't help.)&lt;/p&gt;
&lt;p&gt;I've also worked on online politically-oriented campaigns that gave me some valuable hands-on experience in the sphere.  And of course, there are certain principles that apply to almost any website, not just political websites. Here's what you absolutely must have on your website if you're running for office.&lt;/p&gt;
&lt;h2&gt;Basic Requirements&lt;/h2&gt;
&lt;p&gt;If you're somewhat web-savvy, many of these may seem blindingly obvious to you.  I was astonished, however, by the number of candidates whose sites failed to meet some or all of these requirements.&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;strong&gt;You must have one: &lt;/strong&gt;a website, that is. It's 2010. If you're running for office without a website, you may as well appear at public functions carrying a club and wearing a bearskin hide you tanned yourself.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;It must look good and function well.&lt;/strong&gt; You ought to have it professionally designed but you can make do with an attractive template and the assistance of a knowledgeable volunteer if you must.  An ugly, hard-to-navigate, flaky website does not inspire confidence in your ability to govern. Ensure it has clear presentation of information, clear navigational structure, is suitable for display on mobile devices with decent browsers, and is search engine accessible.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;A prominent campaign slogan.&lt;/strong&gt; It also helps if it's good. Every challenger says something trite about &amp;quot;change&amp;quot;, and most incumbents say something trite about &amp;quot;leadership&amp;quot; or &amp;quot;experience&amp;quot; or &amp;quot;results&amp;quot;. Perhaps it's time for something different?&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;A positioning statement.&lt;/strong&gt; Clearly and concisely communicate what you're about and why people should vote for you.  Try to grab their attention in the process so they keep reading.  If you're an incumbent, a short list of your most compelling achievements is helpful.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Strong calls to action&lt;/strong&gt; for the things you want potential supporters to take right when they visit the site: donate to you, volunteer for you, request a lawn sign, or send your site to their friends and family (via email, social networks, etc.)&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Recent news/blog.&lt;/strong&gt; You &lt;em&gt;must&lt;/em&gt; be able to respond quickly to events as they happen, counter your opponents, capitalize on good press, and so on.  That means you need a recent news/blog section, and it must be something you and your volunteers can easily update yourself at any moment via a content management system (CMS).&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Mailing list signup.&lt;/strong&gt; Your site needs an easy way for people to sign up for email updates and you need an easy way to send them.  A good mailing list is immensely powerful, particularly in a campaign situation.  There will be moments when you badly want to communicate with the public, but the media aren't cooperating.  Use this instead.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Social networking tie-ins&lt;/strong&gt;, particularly with Facebook.  Facebook drives more traffic than Twitter and it's also easier to maintain, because your supporters will write wall posts and talk to each other, keeping up the appearance of activity. This helps avoid a danger with social media: &lt;em&gt;the unused profile&lt;/em&gt;.  The only thing worse than having no social media presence is having one that is unused and unmaintained.  Put the time into it: social media can feel like a waste of time but in political campaigns they can create a powerful advantage.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Your platform.&lt;/strong&gt; Some voters will want to learn exactly where you stand on the issues (if only all voters had this desire!)  Give them something meaty to digest in the form of a comprehensive platform.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;An easy way to contact you.&lt;/strong&gt; Don't assume that everyone who can help you will fit into one of the categories that you've created calls to action for.  Some people may want to provide special assistance, communicate helpful criticisms, call you a fascist, etc.  The best method: display an email address.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;More Advanced Features&lt;/h2&gt;
&lt;p&gt;If you're running a grassroots campaign for a low-profile office (school trustee, councillor for a small city, etc.), then the list of basic requirements may be enough for you.  But that list was just the bare minimum.  Here's what you &lt;em&gt;should&lt;/em&gt; have, in addition to what you must have.&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;strong&gt;Professionally designed and developed.&lt;/strong&gt; Get a qualified team of professionals to design and develop a custom website that is perfectly suited to your campaign message and branding.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Professionally shot and edited video on the site&lt;/strong&gt; (at least one clip). It should make you look trustworthy, responsible, and sane, even if you are none of those things.  The video should play on mobile devices.  There is nothing wrong with using YouTube to host it and you may get some additional traffic that way.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Nicely designed interactive elements&lt;/strong&gt; to add some life to your site, such as an image gallery, polls, etc. Consider having comments on your news and blog post items, but only if you can tolerate public criticism, because censoring comments is a recipe for disaster (unless they are defamatory, constitute hate speech, etc.)&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Events and event calendar.&lt;/strong&gt; On a basic website you can use the blog/news section to advertise events, but at this level, you should be more focused.  Let people register for events on your site, or use a third-party service like &lt;a href="http://www.constantcontact.com/event-marketing/index.jsp"&gt;Constant Contact&lt;/a&gt; to handle it.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Taking It To The Next Level With Custom Development&lt;/h2&gt;
&lt;p&gt;The items listed here are just the standard bits that any decent political website ought to have, but to really take advantage of the opportunities the Internet can provide, you should consider taking things to the next level.&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;strong&gt;Automated telephone calls&lt;/strong&gt; and text messaging with a web service like &lt;a href="http://www.twilio.com/"&gt;Twilio&lt;/a&gt;. Robocalls need not be the sole domain of candidates with big campaign chests.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Online tools that assist with campaign operations&lt;/strong&gt; and volunteer coordination.  In a hectic campaign environment, operations can quickly degenerate into an unmanageable flurry of emails.  You can organize your team more effectively with the right technology.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Tap into public support for the issues you stand for&lt;/strong&gt; and build your mailing list by asking site visitors to sign a pledge on your site or contribute their ideas for the city or region you are campaigning in.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;These ideas still just scratch the surface&lt;/strong&gt; of what you can accomplish with a great website.  A strong, creative website will pay off with more votes, more donations, and more volunteers.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Good luck!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/JlbWzUEprrw" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 11 Nov 2010 10:00:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/JlbWzUEprrw/81-the-10-basic-requirements-of-a-political-website</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/81-the-10-basic-requirements-of-a-political-website</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/81-the-10-basic-requirements-of-a-political-website</feedburner:origLink></item>
    <item>
      <title>Latest Launches: October, Second Edition</title>
      <description>&lt;p&gt;Keeping very busy over here... Here are a few more sites we've launched in the past little while.&lt;/p&gt;
&lt;div class="spacer" style="height: 10px;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2&gt;&lt;a href="http://detourcoffee.com/"&gt;Detour Coffee&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/images/launch/detourcoffee.png" rel="zoom"&gt;&lt;img style="float: left; margin: 0pt 20px 10px 0pt;" src="/images/launch/detourcoffee-sm.png" alt="" /&gt;&lt;/a&gt;&lt;a href="http://detourcoffee.com/"&gt;Detour Coffee&lt;/a&gt; is a wholesale roaster and retailer based in Dundas, Ontario. They were looking to consolidate their online presence in one site and build an online store.&lt;/p&gt;
&lt;p&gt;Powered by &lt;a href="http://factore.ca/forge-cms/forge-cart"&gt;Forge Cart&lt;/a&gt;, complete with shipping calculations, and tied seamlessly to &lt;a href="http://www.paypal.com/ca"&gt;Paypal&lt;/a&gt;, Detour Coffee folks can now reach out to coffee connoisseurs all over the world.&lt;/p&gt;
&lt;div class="spacer" style="height: 30px;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2&gt;&lt;a href="http://cilla.ca/"&gt;CiLLA&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/images/launch/cilla.png" rel="zoom"&gt;&lt;img style="float: left; margin: 0pt 20px 10px 0pt;" src="/images/launch/cilla-sm.png" alt="" /&gt;&lt;/a&gt;&amp;quot;&lt;a href="http://cilla.ca/"&gt;CiLLA&lt;/a&gt; is an Active Lifestyle Brand for Women founded in 2007 by Professional Snowboarder Priscilla Levac along with the help of her mother and co-founder Suzanne Levac. Bringing freshness and style to first layers and active wear in the snowboarding industry CiLLA was an instant success.&amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt;The CiLLA site is a simple, slick re-design of their old Flash-based site. The result is a much more dynamic, search-engine friendly and easily updatable site powered by &lt;a href="http://factore.ca/forge-cms/why-forge"&gt;Forge&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/YFijLSxfrzQ" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 28 Oct 2010 09:00:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/YFijLSxfrzQ/80-latest-launches-october-second-edition</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/80-latest-launches-october-second-edition</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/80-latest-launches-october-second-edition</feedburner:origLink></item>
    <item>
      <title>Stop Trolls And Improve Discussions By Creating A Troll Fantasyland</title>
      <description>&lt;p&gt;&lt;em&gt;In this blog post I &lt;strike&gt;introduce a new technique (new to me, anyway)&lt;/strike&gt; rehash an existing, very old technique to counter trolls, which I am calling the Troll Fantasyland.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Popular blogs and forums always attract trolls. (Note: in this post, I will use the verb form of troll, as in &amp;quot;trolling for reactions&amp;quot;, as well as the noun form, as in &amp;quot;don't feed the troll&amp;quot;.  Please don't troll me by getting semantic.)&lt;/p&gt;
&lt;p&gt;Dealing with them can be a bit of a pain-in-the-ass.  One of the best methods is to use voting, a technique popularized mainly by Digg and Reddit that is now in use on many different sites.  Trolls find their comments voted down consistently and usually obscured in some way (by getting pushed to the bottom, faded out, or even removed as the number of downvotes accumulates).&lt;/p&gt;
&lt;p&gt;This technique is effective, but trolls have some counterstrategies that can allow them to continue to dominate and eventually destroy discussions.&lt;/p&gt;
&lt;p&gt;For example, subtle trolls may write comments which appear legitimate and are virtually indistinguishable from normal comments.  On a busy website, only very regular visitors will be able to detect this pattern of behaviour, leaving the rest of users vulnerable to the trolling.&lt;/p&gt;
&lt;p&gt;Hyperactive trolls, on the other hand, will post responses to any new discussion item immediately, which lets them hijack it for a period of time until the accumulation of downvotes has its effect; or, the sheer volume of their comments means that downvotes simply can't keep up.&lt;/p&gt;
&lt;p&gt;In this blog post I introduce a new technique to counter trolls, which I am calling the &lt;strong&gt;Troll Fantasyland&lt;/strong&gt; (the technique is new to me, anyway, and so far as I know original).  &lt;strong&gt;Edit:&lt;/strong&gt; Nope, &lt;a href="http://ask.metafilter.com/117775/What-was-the-first-website-to-hide-trolls-activity-to-everyone-but-the-troll-himself"&gt;not original at all&lt;/a&gt;, as it turns out.&lt;/p&gt;
&lt;p&gt;The general principle of the Troll Fantasyland is to create an alternate reality for trolls, one in which their comments appear on the website, attract votes and probably numerous downvotes (if voting is a website feature), and provoke angry responses.  However, unknown to them is the fact that they are the only users who are seeing their comments, votes, and responses: all of this behaviour is totally invisible to the other users on the site.&lt;/p&gt;
&lt;p&gt;The technique works as follows:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Administrators identify a troll based on past behaviour (on high traffic sites, this detection could be automated).&lt;/li&gt;
    &lt;li&gt;Monitoring commences.  If the troll is a registered user, the particular computers they use (based on cookies, IP addresses, etc.) are noted.  If the troll posts anonymously, a record for the troll is created, and the same computers are noted.&lt;/li&gt;
    &lt;li&gt;Once a certain period has elapsed and it is likely that the computers and devices the troll uses have all been identified, the trap has been set, and the troll is ushered into their very own private Fantasyland.&lt;/li&gt;
    &lt;li&gt;In Fantasyland, when they post a comment, it immediately starts attracting votes, downvotes, and angry comments.  They see these, but no one else does.  It may be necessary to employ some semi-sophisticated language processing algorithms to develop reasonably realistic responses for the troll from time to time, but it may also be sufficient in many cases for responses to simply voice disagreement or displeasure.&lt;/li&gt;
    &lt;li&gt;Result: the troll is gratified by the constant attention and controversy.  Meanwhile, discussions among regular users continue as usual.  The troll is locked away in Fantasyland, a miserable, angry place where they feel right at home.&lt;/li&gt;
&lt;/ol&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/EAnbuRnQGRc" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 22 Oct 2010 09:58:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/EAnbuRnQGRc/79-stop-trolls-and-improve-discussions-by-creating-a-troll-fantasyland</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/79-stop-trolls-and-improve-discussions-by-creating-a-troll-fantasyland</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/79-stop-trolls-and-improve-discussions-by-creating-a-troll-fantasyland</feedburner:origLink></item>
    <item>
      <title>jQuery and Rails 3</title>
      <description>&lt;p&gt;I got a little frustrated the other night trying to get an application working properly with jQuery. The problem I was having was related to the new &lt;a href="http://therailworld.com/posts/26-Using-Prototype-and-JQuery-with-Rails3-UJS-"&gt;unobtrusive javascript features&lt;/a&gt; introduced to Rails 3.&lt;/p&gt;
&lt;h2 style="margin-top: 30px;"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;I had a simple page delete button (HAML):&lt;/p&gt;
&lt;script src="http://gist.github.com/624686.js?file=gistfile1.haml"&gt;&lt;/script&gt;
&lt;p&gt;This creates the following HTML:&lt;/p&gt;
&lt;script src="http://gist.github.com/624690.js?file=gistfile1.html"&gt;&lt;/script&gt;
&lt;p&gt;The resulting link was taking me to the show view for that page rather than destroying the record as I requested.&amp;nbsp;&lt;/p&gt;
&lt;h2 style="margin-top: 30px;"&gt;The Solution&lt;/h2&gt;
&lt;p&gt;I found the solution I was looking for &lt;a href="http://github.com/lleger/Rails-3-jQuery"&gt;here&lt;/a&gt;. This is a script that installs a template to a new Rails 3 app that uses the new jQuery drivers instead of the default prototype ones.&lt;/p&gt;
&lt;p&gt;If you know you want to use jQuery on your new Rails project before you start the project, include the template by running:&lt;/p&gt;
&lt;script src="http://gist.github.com/624694.js?file=gistfile1.txt"&gt;&lt;/script&gt;
&lt;p&gt;If, like me, you've already got a project underway simply run this rake task in your existing project:&lt;/p&gt;
&lt;script src="http://gist.github.com/624699.js?file=gistfile1.txt"&gt;&lt;/script&gt;
&lt;p&gt;And make sure you remember to include the new rails.js and jquery.js files in your application:&lt;/p&gt;
&lt;script src="http://gist.github.com/624768.js?file=gistfile1.haml"&gt;&lt;/script&gt;
&lt;h2 style="margin-top: 30px;"&gt;Resources&lt;/h2&gt;
&lt;p&gt;Git repo with really clear instrucitons: &lt;br /&gt;
&lt;a href="http://github.com/lleger/Rails-3-jQuery"&gt;http://github.com/lleger/Rails-3-jQuery&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The explanation post by the author of the script:&lt;br /&gt;
&lt;a href="http://loganleger.com/rails-3-jquery"&gt;http://loganleger.com/rails-3-jquery&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A nice simple explanation of the unobtrusive javascript features introduced in Rails 3:&lt;br /&gt;
&lt;a href="http://therailworld.com/posts/26-Using-Prototype-and-JQuery-with-Rails3-UJS-"&gt;http://therailworld.com/posts/26-Using-Prototype-and-JQuery-with-Rails3-UJS&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/hhUby_pnmu8" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 14 Oct 2010 10:58:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/hhUby_pnmu8/78-jquery-and-rails-3</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/78-jquery-and-rails-3</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/78-jquery-and-rails-3</feedburner:origLink></item>
    <item>
      <title>Rails Gotcha With before_validation</title>
      <description>&lt;p&gt;&lt;img src="file:///Users/marckelsey/Library/Caches/TemporaryItems/moz-screenshot.png" alt="" /&gt;Let's see if you can figure this one out faster than I did:&lt;br /&gt;
&lt;br /&gt;
You have a Product model.&amp;nbsp; Products can be physical, or virtual (like a pdf). If a product is virtual, there are certain attributes that can be ignored, like whether shipping should be charged. So, to standardize the data in these fields, you do something like this:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;before_validation :clean_up_data&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
some code&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
def clean_up_data&lt;br /&gt;
&amp;nbsp; if self.is_virtual&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; self.shipping = nil&lt;br /&gt;
&amp;nbsp; end&lt;br /&gt;
end&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Code works, data is great.&amp;nbsp; Sometime later, you decides that &lt;code&gt;Product.shipping&lt;/code&gt; should no longer allow nulls. You change the schema, and update &lt;code&gt;Product.clean_up_data&lt;/code&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;def clean_up_data&lt;br /&gt;
&amp;nbsp; if self.is_virtual&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; self.shipping = false&lt;br /&gt;
&amp;nbsp; end&lt;br /&gt;
end&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Right? Wrong.&amp;nbsp; Now, your products won't save, and you get no error messages explaining why.&amp;nbsp; What's the problem?&lt;br /&gt;
&lt;br /&gt;
The problem is this:&amp;nbsp; validations tell rails that something is wrong by setting errors on the model.&amp;nbsp; Callbacks tell rails that something went wrong by returning false. When I changed the line &lt;code&gt;self.shipping = nil&lt;/code&gt; to &lt;code&gt;self.shipping = false&lt;/code&gt;, I was returning false from the before_validation callback, and rails was happily cancelling the rest of the processing on the model, including the validations on the model.&lt;br /&gt;
&lt;br /&gt;
Since the point of this model was not to stop the validations from happening, I added a true to the bottom of the function and everything worked again.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/_3367qGMiRg" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 12 Oct 2010 09:30:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/_3367qGMiRg/77-rails-gotcha-with-before-validation</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/77-rails-gotcha-with-before-validation</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/77-rails-gotcha-with-before-validation</feedburner:origLink></item>
    <item>
      <title>Managing Rubies and Rails with RVM</title>
      <description>&lt;p&gt;With Rails3 looking to become our project staple, I began looking into ways of managing many Ruby versions with different Rails versions. Enter Ruby Version Manager (RVM).&lt;/p&gt;
&lt;h2 style="margin-top: 30px;"&gt;Installing RVM&lt;/h2&gt;
&lt;p&gt;There are a few ways to &lt;a href="http://rvm.beginrescueend.com/rvm/install/"&gt;install RVM&lt;/a&gt;. I went with the github repo route, but you can use whichever way gets the job done:&lt;/p&gt;
&lt;p class="code"&gt;bash &amp;lt; &amp;lt;( curl http://rvm.beginrescueend.com/releases/rvm-install-head )&lt;/p&gt;
&lt;p&gt;Next step is to add the following to your profile at the very end after all the path loads:&lt;/p&gt;
&lt;p class="code"&gt;[[ -s &amp;quot;$HOME/.rvm/scripts/rvm&amp;quot; ]] &amp;amp;&amp;amp; . &amp;quot;$HOME/.rvm/scripts/rvm&amp;quot;&lt;/p&gt;
&lt;p&gt;To see if RVM has been installed properly restart terminal then run the following:&lt;/p&gt;
&lt;p class="code"&gt;type rvm | head -n1&lt;/p&gt;
&lt;p&gt;If everything is good to go you'll see &amp;quot;rvm is a function.&amp;quot; If not check the &lt;a href="http://rvm.beginrescueend.com/rvm/install/"&gt;install page&lt;/a&gt; for trouble shooting tips.&lt;/p&gt;
&lt;p&gt;For future reference RVM is installed here: &lt;strong&gt;~/.rvm&lt;/strong&gt;. This is where all your gemsets and ruby versions will be stored if you ever need to go looking for them.&lt;/p&gt;
&lt;h2 style="margin-top: 30px;"&gt;Installing Rubies&lt;/h2&gt;
&lt;p&gt;To install a version of ruby:&lt;/p&gt;
&lt;p class="code"&gt;rvm install 1.8.7&lt;/p&gt;
&lt;p&gt;To find out what versions of ruby you have installed with RVM:&lt;/p&gt;
&lt;p class="code"&gt;rvm list&lt;/p&gt;
&lt;p&gt;This will return a complete list with an arrow pointing to the active installation:&lt;/p&gt;
&lt;p class="code"&gt;rvm rubies&lt;br /&gt;
&lt;br /&gt;
=&amp;gt; ruby-1.8.7-p302 [ i386 ]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;ruby-1.9.1-p378 [ i386 ]&lt;/p&gt;
&lt;h2 style="margin-top: 30px;"&gt;Gems and Gemsets&lt;/h2&gt;
&lt;p&gt;Each version of Ruby in RVM has its own collection of gems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Do not use SUDO to work with rvm gems.&lt;/strong&gt; When you do sudo you are running commands as root, another user in another shell and hence all of the setup that RVM has done for you is ignored while the command runs under sudo []&lt;a href="http://rvm.beginrescueend.com/rubies/rubygems/"&gt;more details&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;Through RVM you can separate your project gems inside &lt;a href="http://rvm.beginrescueend.com/gemsets/"&gt;gemsets&lt;/a&gt;. In my reading I've found this to be the most logical way of doing it. Locally I've created &amp;quot;rails3&amp;quot; and &amp;quot;rails2&amp;quot; gemsets, but you can create a gemset for each project if you feel so inclined.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Once created gemsets only belong to one Ruby installation. You can however &lt;a href="http://rvm.beginrescueend.com/gemsets/copying/"&gt;copy&lt;/a&gt;, &lt;a href="http://rvm.beginrescueend.com/gemsets/exporting/"&gt;export&lt;/a&gt; and &lt;a href="http://rvm.beginrescueend.com/gemsets/importing/"&gt;import&lt;/a&gt; gemsets as required.&lt;/p&gt;
&lt;p&gt;Create the gemset:&lt;/p&gt;
&lt;p class="code"&gt;rvm gemset create rails2&lt;/p&gt;
&lt;p&gt;Installing a gem to the gemset is same as usualbut without sudo (see above):&lt;/p&gt;
&lt;p class="code"&gt;gem install rails -v=2.3.5&lt;/p&gt;
&lt;h2 style="margin-top: 30px;"&gt;Switching Rubies and Setting a Default&lt;/h2&gt;
&lt;p&gt;Run Ruby 1.8.7 with the rails2 gemset:&lt;/p&gt;
&lt;p class="code"&gt;rvm 1.8.7@rails2&lt;/p&gt;
&lt;p&gt;Run Ruby 1.9.2 with the rails3 gemset:&lt;/p&gt;
&lt;p class="code"&gt;rvm 1.9.2@rails3&lt;/p&gt;
&lt;p&gt;To set a default version, in this case ruby 1.8.7 with the rails2 gemset:&lt;/p&gt;
&lt;p class="code"&gt;rvm 1.8.7@rails2 --default&lt;/p&gt;
&lt;p&gt;If you want to use the system version of Ruby:&lt;/p&gt;
&lt;p class="code"&gt;rvm system&lt;/p&gt;
&lt;h2 style="margin-top: 30px;"&gt;Resources:&lt;/h2&gt;
&lt;p&gt;Fantastic article about setting up rvm and gemsets:&lt;br /&gt;
&lt;a href="http://www.stjhimy.com/posts/10-five-quick-steps-to-set-up-rvm-with-rails-2-and-rails3"&gt;http://www.stjhimy.com/posts/10-five-quick-steps-to-set-up-rvm-with-rails-2-and-rails3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;RVM Docs:&lt;br /&gt;
&lt;a href="http://rvm.beginrescueend.com/"&gt;http://rvm.beginrescueend.com/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/_O9Q8bVIesI" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 07 Oct 2010 09:00:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/_O9Q8bVIesI/76-managing-rubies-and-rails-with-rvm</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/76-managing-rubies-and-rails-with-rvm</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/76-managing-rubies-and-rails-with-rvm</feedburner:origLink></item>
    <item>
      <title>Steve Jobs' Office Worker Fantasy</title>
      <description>&lt;p&gt;I just looked at my desk and realized that it's Steve Jobs' fantasy of what every office worker's desk ought to look like.&lt;/p&gt;
&lt;p&gt;&lt;img align="middle" alt="" src="http://factore.ca/system/images/images/77/original/fantasy.jpg?1286388006" /&gt;&lt;/p&gt;
&lt;p&gt;From left to right: Macbook Pro, iPad, iPod Touch, Mac Mini.&lt;/p&gt;
&lt;p&gt;And yes, this photo was taken with an iPhone.&lt;/p&gt;
&lt;p&gt;I'm living inside Steve Jobs' fantasy. &amp;nbsp;That makes me feel a little uncomfortable.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/TXQc1cTyzeU" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 06 Oct 2010 13:56:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/TXQc1cTyzeU/75-steve-jobs-office-worker-fantasy</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/75-steve-jobs-office-worker-fantasy</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/75-steve-jobs-office-worker-fantasy</feedburner:origLink></item>
    <item>
      <title>Latest Launches: October, First Edition</title>
      <description>&lt;p&gt;Busy, busy, busy. Here are some more sites we've launched since the last update.&lt;/p&gt;
&lt;p&gt;Stay tuned, lots more to come!&lt;/p&gt;
&lt;div class="spacer" style="height: 10px;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2&gt;&lt;a href="http://foodies.ca/"&gt;Foodies&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/images/launch/foodies.png" rel="zoom"&gt;&lt;img style="float: left; margin: 0pt 20px 10px 0pt;" src="/images/launch/foodies-sm.png" alt="" /&gt;&lt;/a&gt;&lt;a href="http://foodies.ca"&gt;Foodies.ca&lt;/a&gt; is the new website for the fourth season of the popular &lt;a href="http://foodies.ca/the-show"&gt;cooking show&lt;/a&gt; (Sundays at 11:30AM on Global in Ontario).&lt;/p&gt;
&lt;p&gt;The site features full episodes, tips for cooking and entertaining, and a large recipe database with basic and advanced search.&lt;/p&gt;
&lt;p&gt;Under the hood, it uses a &lt;a href="http://factore.ca/forge-cms/custom"&gt;custom-built Forge module&lt;/a&gt; with a recipe-building wizard and tools to attach content to specific episodes of the show.&lt;/p&gt;
&lt;div class="spacer" style="height: 30px;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2&gt;&lt;a href="http://actionsspeaklouder.ca/"&gt;Actions Speak Louder&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/images/launch/actionsspeaklouder.png" rel="zoom"&gt;&lt;img style="float: left; margin: 0pt 20px 10px 0pt;" src="/images/launch/actionsspeaklouder-sm.png" alt="" /&gt;&lt;/a&gt;&amp;quot;&lt;a href="http://actionsspeaklouder.ca"&gt;Actions Speak Louder&lt;/a&gt; is a conference about culture building. This 1 1/2 day event is focused on engaging partners, creating dialogue and exploring creative solutions for livable cities.&amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt;The Actions Speak Louder team needed a one-stop shop for event, session and venue information as well as ticket handling. They got it. Powered by &lt;a href="http://factore.ca/forge-cms/"&gt;Forge&lt;/a&gt;, &lt;a href="http://factore.ca/forge-cms/forge-cart"&gt;Forge Cart&lt;/a&gt; and &lt;a href="http://paypal.ca"&gt;Paypal&lt;/a&gt;, everything you need to know about the conference can be found here.&lt;/p&gt;
&lt;div class="spacer" style="height: 30px;"&gt;&amp;nbsp;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/EmXJHMoTu48" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 05 Oct 2010 13:00:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/EmXJHMoTu48/74-latest-launches-october-first-edition</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/74-latest-launches-october-first-edition</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/74-latest-launches-october-first-edition</feedburner:origLink></item>
    <item>
      <title>Clustering made easy in Google Maps v3</title>
      <description>&lt;p&gt;&amp;nbsp;I recently worked on a vacation rental site where listings are shown on a map of varying sizes (the world -&amp;gt; a city). &amp;nbsp;To display a varying number of listings over a map of varying size, some method of listing clustering is required to make their display make sense. &amp;nbsp;This used to be a real pain in the ass to do, but in the new version of the google maps API (v3) there is ready made clustering, &amp;nbsp;which is dead simple to use. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;This is a ruby on rails project, so I JSON'd out my listings, iterated over them to create marker objects and fed them to the markerClusterer. &amp;nbsp;It handles all of the clustering/zooming automatically.&lt;/p&gt;
&lt;script src="http://gist.github.com/604674.js?file=cluster.js"&gt;&lt;/script&gt;
&lt;p&gt;One interesting, if rather frustrating issue I encountered was when I tried to add an infoWindow for each of the markers. &amp;nbsp;It seems as if you can only have one at a time, and when I was adding them directly to the marker, only the last one ever appeared, regardless of which marker was clicked. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;Getting around this issue is done by making a closure action, and then recreating the infoWindow onclick.&lt;/p&gt;
&lt;p&gt;Happy clustering!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/K3MYn_8bamo" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 30 Sep 2010 10:48:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/K3MYn_8bamo/73-clustering-made-easy-in-google-maps-v3</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/73-clustering-made-easy-in-google-maps-v3</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/73-clustering-made-easy-in-google-maps-v3</feedburner:origLink></item>
    <item>
      <title>Another jQuery plugin for my list</title>
      <description>&lt;p&gt;I'd like to append another plugin on to my &lt;a href="http://factore.ca/on-the-floor/63-3-jquery-plugins-i-use-all-the-time"&gt;previous list of three&lt;/a&gt;. I've used this one a few times of late and it's come in quite handy so I thought I would pass it on as well.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://srobbin.com/blog/jquery-plugins/jquery-backstretch/ "&gt;jQuery Backstretch&lt;/a&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;This plugin stretches an image to fill the entire background of the browser window. As the browser window changes size, the image will also stretch and scale to fill the window.&lt;/p&gt;
&lt;p&gt;Make sure you use an image with the width of at least 1024px -- though the average screen monitor size seems to be &lt;a href="http://www.w3schools.com/browsers/browsers_display.asp"&gt;increasing rapidly&lt;/a&gt;. Generally speaking, a smaller image will leave your background image pixelly in larger browser windows. A larger image will result in slower loading times. Use your own discretion.&lt;/p&gt;
&lt;p&gt;Include the script:&lt;/p&gt;
&lt;script src="http://gist.github.com/599653.js?file=gistfile1.js"&gt;&lt;/script&gt;
&lt;p&gt;Then simply add this to your .js file:&lt;/p&gt;
&lt;script src="http://gist.github.com/599655.js?file=gistfile1.js"&gt;&lt;/script&gt;
&lt;p&gt;There are also three options to give you a little control over position and how long it will take the image to fade in, if at all.&lt;/p&gt;
&lt;p&gt;centeredX(boolean), default =&amp;gt; true - Centers the image on the x-axis. &lt;br /&gt;
centeredY(boolean), default =&amp;gt; true - Centers the image on the y-axis. &lt;br /&gt;
speed(integer or jQuery speed string), default =&amp;gt; 0 - The speed at which the image will fade in.&lt;/p&gt;
&lt;p&gt;For example, this will cause the image to fade in rather than suddenly appear when your javascript loads:&lt;/p&gt;
&lt;script src="http://gist.github.com/599658.js?file=gistfile1.js"&gt;&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/pmWQ4OXQ5Xg" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 27 Sep 2010 15:00:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/pmWQ4OXQ5Xg/72-another-jquery-plugin-for-my-list</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/72-another-jquery-plugin-for-my-list</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/72-another-jquery-plugin-for-my-list</feedburner:origLink></item>
    <item>
      <title>Rails Console Barfs Too Much Data. Stop It.</title>
      <description>&lt;p&gt;I bet you frequently use Rails' console (&lt;code&gt;script/console&lt;/code&gt;), especially in your production environment, to retrieve data, check up on bugs, etc.&lt;/p&gt;
&lt;p&gt;When you do you'll often find yourself retrieving large arrays of data, for example, the results of ActiveRecord queries.  Like this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;people.each { |person| puts person.name }&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;When you do this, you'll notice that first you get the names of people like you wanted, but then console barfs out the array of everything you are iterating through, in this case all of the people.&lt;/p&gt;
&lt;p&gt;This is because it shows, not only what you &lt;code&gt;puts&lt;/code&gt;, but also what the method returns - in this case, the array itself.&lt;/p&gt;
&lt;p&gt;You can stop this behaviour with just:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;people.each { |person| puts person.name }.size&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It will show all of the names, and then a number for the size of the array instead of the array contents.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/RNaCi-If6J8" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 21 Sep 2010 09:06:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/RNaCi-If6J8/71-rails-console-barfs-too-much-data-stop-it-</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/71-rails-console-barfs-too-much-data-stop-it-</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/71-rails-console-barfs-too-much-data-stop-it-</feedburner:origLink></item>
    <item>
      <title>Chain of Custody: Who and What is Being Certified?</title>
      <description>&lt;p&gt;&lt;img alt="" style="width: 561px; height: 209px;" src="http://factore.ca/system/images/images/74/original/chain.jpg?1284584602" /&gt;&lt;/p&gt;
&lt;p&gt;In my &lt;a href="http://www.factore.ca/on-the-floor/48-earth-friendly-paper-and-print-production"&gt;last blog post&lt;/a&gt; I introduced the subject of sustainability in the print and paper industries as means to become more familiar with environmental issues affecting my job and the job of print designers in general. As a starting point I discussed The Forest Stewardship Counsil (FSC) whose logos and labels are becoming quite common in the marketplace. But FSC isn't the only forest certification system out there. The following is a more complete list of the various systems in use, taken from the &lt;a href="http://www.metafore.org/index.php?p=Introduction_to_Certification_Programs&amp;amp;s=167"&gt;Forest Certification Resource Centre&lt;/a&gt;&lt;/p&gt;
&lt;ul style="font-family: verdana; font-size: 11px;"&gt;&lt;span class="homeContent"&gt;
    &lt;div&gt;
    &lt;div&gt;&lt;blockquote&gt;          &lt;span class="homeContent"&gt;&lt;span class="content"&gt;&lt;a href="http://www.metafore.org/index.php?p=ATFS&amp;amp;s=168"&gt;&lt;span style="display: none;" id="1284660759621S"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="display: none;" id="1284660758695S"&gt;&amp;nbsp;&lt;/span&gt;The American Tree Farm System&lt;/a&gt; is a program for small, private, non-industrial landowners (family forest landowners). ATFS certifies contiguous parcels from 10 - 20,000 acres and was endorsed by PEFC in August of 2008.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/span&gt;&lt;/span&gt;          &lt;span class="homeContent"&gt;&lt;span class="content"&gt;&lt;a href="http://www.metafore.org/index.php?p=CSA&amp;amp;s=169"&gt;The Canadian Standards Association&lt;/a&gt; is a national standard for sustai&lt;/span&gt;&lt;/span&gt;&lt;span class="homeContent"&gt;&lt;span class="content"&gt;nab&lt;/span&gt;&lt;/span&gt;&lt;span class="homeContent"&gt;&lt;span class="content"&gt;le forest management and tracking and labeling certified material. It covers operations in Canada.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
    &lt;br /&gt;
    &lt;span class="homeContent"&gt;&lt;span class="content"&gt;&lt;a href="http://www.metafore.org/index.php?p=FSC&amp;amp;s=170"&gt;The Forest Stewardship Council&lt;/a&gt; is an international system covering forest management practices and the tracking and labeling of certified prod&lt;/span&gt;&lt;/span&gt;&lt;span class="homeContent"&gt;&lt;span class="content"&gt;ucts and paper products with recycled content.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
    &lt;br /&gt;
    &lt;span class="homeContent"&gt;&lt;span class="content"&gt;&lt;a href="http://www.metafore.org/index.php?p=PEFC&amp;amp;s=171"&gt;The Programme for the Endorsement of Forest Certification Schemes&lt;/a&gt; is a mutual recognition framework for national forest certification standards.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
    &lt;br /&gt;
    &lt;span class="homeContent"&gt;&lt;span class="content"&gt;&lt;a href="http://www.metafore.org/index.php?p=SFI&amp;amp;s=172"&gt;The Sustainable Forestry Initiative&amp;reg; Program&lt;/a&gt; is a sustainable forest &lt;/span&gt;&lt;/span&gt;&lt;span class="homeContent"&gt;&lt;span class="content"&gt;management standard targeting large industrial operations in Canada and the United States.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
    &lt;br /&gt;
    &lt;span class="homeContent"&gt;&lt;span class="content"&gt;Additionally, there are several &lt;a href="http://www.metafore.org/index.php?p=Forest+Certification+Around+the+World&amp;amp;s=173"&gt;emerging  forest certification systems&lt;/a&gt; in Asia, Australia and South America. &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
    &lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;
    &lt;/blockquote&gt;   &lt;blockquote&gt; &lt;/blockquote&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;/span&gt;&lt;/ul&gt;
    &lt;p&gt;So now that we have some idea about who is doing the certifying, the next logical question is - &lt;strong&gt;What is Being Certified?&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;
    That's where the concept of Chain-of-Custody comes in. Chain-of-Custody is &amp;quot;the means of tracking a paper product along its supply chain - through its forest of origin, manufacturing, distribution, and printing&amp;quot;. It includes all the operations that take physical or legal ownership of the paper. According to &lt;a href="https://www.spicers.ca/forestcertifications/forestcertifications.htm"&gt;Spicers.ca&lt;/a&gt;, &amp;quot;a product that bears a forest certification logo, such as FSC, SFI or PEFC, can be tracked   from the tree trunk to printed brochure. Buyers are guaranteed that the fibre originated from a forest managed according to relevant forest management standards&amp;quot;. Another important point to stress is that &amp;quot;understanding and implementing forestry management practices ... not only effects the well-being of the forest and its biodiversity, but the social and economic livelihoods of the communities around it&lt;img height="589" width="349" align="right" alt="SFI Certified Label - On A Package" style="padding-left: 15px; padding-top: 15px; padding-bottom: 15px;" src="../../../system/images/images/75/original/SFI_package.jpg?1284661067" /&gt;.&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    So with all this in mind, where in this chain do we, as the paper purchasers come in? Well - it can start with us or it can start with our client. Having become aware of the environmental and social benefits to choosing certified paper, whenever possible I will make the extra effort to specify it, when I begin a project. Or if it is important to our client to use certified paper, we as designers will make that part of the planning process from the start. The main thing to remember is that we as print buyers and designers do not need to be certified, but our printers must, in order to maintain the integrity of the chain.&lt;br /&gt;
    &lt;br /&gt;
    &lt;b&gt;Planning a Forestry Certified Print Project&lt;/b&gt;&lt;br /&gt;
    &lt;br /&gt;
    In order to use a Forestry Management logo, you will need to find a certified printer or printers and obtain your print quotes through them. One source for finding a certified printer, if you don't already know of one, is at the &lt;a href="http://www.fsccanada.org/fscprinters.htm"&gt;Forestry Stewardship Council's website&lt;/a&gt;. Of course the printers listed there will be specifically FSC certified, but it's a place to start. The Sustainable Forestry Initiative offers a pdf of SFI Certified printers on &lt;a href="http://www.sfiprogram.org/find-sfi-forest-products/certified-paper-printers.php"&gt;their website&lt;/a&gt;, but it refers to only US printers as far as I can tell. &lt;br /&gt;
    &lt;br /&gt;
    Once you've found your printer and have specified your certified paper for the project, you really just need to make sure your design works with the paper you've selected and that your time schedule works with the printer.&lt;/p&gt;
    &lt;p&gt;There are a couple of things to consider. &amp;nbsp;First of all,&amp;nbsp;is the paper a special order from the mill or does the printer have it available on the floor? If it's a mill order you need to leave enough time in your schedule for the order.&lt;/p&gt;
    &lt;p&gt;Secondly, if you plan to use a certification logo you will need approval from the certification body, for example, FSC. This step may add a slight cost to your project as well as a couple of days to your timeline. During the design phase, designers can use low res images of the FSC labels as a placeholder so the client can see how it will look in the layout. The placeholder labels are available at &lt;a href="http://www.fsccanada.org/productlabel.htm"&gt;www.fsccanada.org/productlabel.htm&lt;/a&gt;.&lt;/p&gt;
    &lt;p&gt;Once the design is approved by the client, the designer must send an electronic file of the final piece - with the low res FSC label in place - to the printer. The printer will then need to send that file to the certifier for approval. If the printer is certified and is used to the process it shouldn't take too long. The key is to communicate with your printer so that all expectations are understood. Once the approval is given by the certifier, the high resolution label can be placed for output in the file.&lt;/p&gt;
    &lt;p&gt;--&lt;br /&gt;
    &lt;br /&gt;
    For a nice overview on the subject of chain of custody and other print related environment/sustainability issues, go to &lt;a href="https://www.spicers.ca/"&gt;Spicers Paper&lt;/a&gt; and click on the environmental tab.&lt;/p&gt;
    &lt;p&gt;--&lt;br /&gt;
    &lt;br /&gt;
    Next Post: A discussion of certification labelling such as the Mixed Sources label.&lt;/p&gt;
    &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/ZEPP1SrsAFM" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 16 Sep 2010 14:36:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/ZEPP1SrsAFM/69-chain-of-custody-who-and-what-is-being-certified-</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/69-chain-of-custody-who-and-what-is-being-certified-</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/69-chain-of-custody-who-and-what-is-being-certified-</feedburner:origLink></item>
    <item>
      <title>Latest Launches: September Edition</title>
      <description>&lt;p&gt;Business is booming and we've been super busy as of late. As a result we haven't really gotten around to letting anyone know about all of the websites we've launched in the past while.&lt;/p&gt;
&lt;p&gt;In a bit of a game of catch up, here's three of the more recent websites we've launched.&lt;/p&gt;
&lt;div style="height: 10px;" class="spacer"&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2&gt;&lt;a href="http://breadbar.ca/"&gt;Bread Bar&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a rel="zoom" href="/images/launch/breadbar.png"&gt;&lt;img alt="" src="/images/launch/breadbar-sm.png" style="float: left; margin: 0pt 20px 10px 0pt;" /&gt;&lt;/a&gt;Earth to Table Bread Bar is a new addition to the great community on Locke St in Hamilton. Artisan Bakery by day, Pizzeria by night.&lt;/p&gt;
&lt;p&gt;Photos, videos and the store vitals -- including a full menu -- make up the content of this site.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Also included on this site is a complete install of &lt;a href="http://factore.ca/forge-cms/forge-press"&gt;Forge Press&lt;/a&gt;. This allows Bread Bar to manage and keep in touch with their mailing list directly through &lt;a href="http://factore.ca/forge-cms/"&gt;Forge&lt;/a&gt;.  If they have a major announcement, upcoming event or special they can  send out a customized HTML email to everyone on their list with the  click of a button.&lt;/p&gt;
&lt;div style="height: 30px;" class="spacer"&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2&gt;&lt;a href="http://bestagents.com.au/"&gt;Best Agents&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a rel="zoom" href="/images/launch/bestagents.png"&gt;&lt;img alt="" src="/images/launch/bestagents-sm.png" style="float: left; margin: 0pt 20px 10px 0pt;" /&gt;&lt;/a&gt;&lt;font&gt;Bestagents helps real       estate professionals improve their marketing skills in order to       help their clients and themselves.&amp;nbsp; &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font&gt;Through this site, Bestagents members have access       to free downloads, MP3s, letter templates and other resources.&amp;nbsp; With the integration of &lt;a href="http://factore.ca/forge-cms/forge-cart"&gt;Forge Cart&lt;/a&gt;, visitors can purchase       products, enter coupons and pay (in this case) via &lt;a target="_blank" href="http://paypal.com"&gt;PayPal&lt;/a&gt;.&amp;nbsp; &lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="height: 30px;" class="spacer"&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2&gt;&lt;a href="http://kingshitmag.com/"&gt;King Sh*t Magazine&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a rel="zoom" href="/images/launch/kingshit.png"&gt;&lt;img alt="" src="/images/launch/kingshit-sm.png" style="float: left; margin: 0pt 20px 10px 0pt;" /&gt;&lt;/a&gt;This video-heavy online version of a premiere Canadian skateboarding  magazine was designed to take full advantage of the mobile experience.&lt;/p&gt;
&lt;p&gt;This site boasts video in a format compatible with iPhones and iPads, and  an innovative online magazine browser optimized for the iPad.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Warning: content may be offensive to some - actually, it probably will  be.)&lt;/em&gt;&lt;/p&gt;
&lt;div class="spacer"&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/UaZQH1p2QlY" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 16 Sep 2010 09:39:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/UaZQH1p2QlY/70-latest-launches-september-edition</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/70-latest-launches-september-edition</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/70-latest-launches-september-edition</feedburner:origLink></item>
    <item>
      <title>A Free Twitter Template</title>
      <description>&lt;p&gt;&amp;nbsp;If you've ever needed to design a Twitter page - whether it's for a client's new social media initiative or your own company, you'll realize there's a lot of moving parts on that page that it would be handy to be able to edit - especially if you need to provide a mockup.&lt;/p&gt;
&lt;p&gt;Enter the &lt;strong&gt;factor[e] Twitter template&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img width="590" height="343" alt="" src="http://factore.ca/system/images/images/73/original/factore_Twitter_template.jpg?1284397847" /&gt;&lt;/p&gt;
&lt;p&gt;All the text, colours and so on are layered and editable, so you can make sure the page looks exactly how you or your client wants it before even venturing into Twitter's theming tool. It's also a great way to find out how your Twitter background art will look when covered up by the main interface.&lt;/p&gt;
&lt;p&gt;The file's provided as a PSD, free of charge. Make cool things with it!&lt;/p&gt;
&lt;p&gt;&lt;a href="/system/documents/documents/1/original/factore_Twitter_template.psd.zip?1284399164"&gt;&lt;img alt="" src="/images/forge/file-icons/file-generic.png" /&gt;&amp;nbsp;factor[e] Twitter Template PSD (397.4 KB)&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/_DT15i9hHI0" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 13 Sep 2010 13:45:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/_DT15i9hHI0/68-a-free-twitter-template</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/68-a-free-twitter-template</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/68-a-free-twitter-template</feedburner:origLink></item>
    <item>
      <title>Overwriting the Default nanoc Template</title>
      <description>&lt;p&gt;&lt;a href="http://nanoc.stoneship.org/" target="_blank"&gt;nanoc&lt;/a&gt; is a set of ruby scripts that let you generate a static website from a template and some simple content files.&amp;nbsp; When you type &amp;quot;nanoc create_site my_site&amp;quot;, nanoc creates a directory called my_site and populates it with a new nanoc app, including some default templates and content.&lt;br /&gt;
&lt;br /&gt;
Very simply, this is how nanoc works: when you compile a site (with &amp;quot;nanoc compile&amp;quot;), nanoc looks at the files in your content/ folder, parses them one at a time, and sticks the parsed data into a template in your templates/ directory.&amp;nbsp; The output goes in the output/ folder, which is a complete static site ready for uploading to your web server.&lt;br /&gt;
&lt;br /&gt;
If you are only going to be creating a couple of sites with nanoc, the default content, templates and styles are fine. But if you are going to be using nanoc for a lot of projects, you might have other preferences.&amp;nbsp; For instance, I have a basic html layout and an a reset stylesheet I like to start with when coding sites, so I would rather have nanoc generate those.&amp;nbsp; Also, nanoc supports many filters:&amp;nbsp; you can write your content and templates in html, haml, markdown, textile and so forth.&amp;nbsp; Since I like using haml, that's how I want my default templates to be written.&lt;br /&gt;
&lt;br /&gt;
There are a couple of ways you could work around this:&amp;nbsp; you could have a default template you copy into each new project when created (boring and repetitive); you could edit the base nanoc code (and re-edit everytime you update it); you could plead with the developers to add a feature letting you specify a template (it might get added someday); or you could wrap the &amp;quot;nanoc create_site&amp;quot; call with your own ruby script and overwrite the defaults yourself (I called the file hammock.rb, for obvious reasons :)&lt;/p&gt;
&lt;script src="http://gist.github.com/574352.js?file=hammock.rb"&gt;&lt;/script&gt;
&lt;p&gt;Now, you can just type &amp;quot;./hammock.rb my_haml_site&amp;quot;, ignore the warnings about overwritten constants, and start making your awesome site.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/-XA09zJmLxM" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 10 Sep 2010 16:53:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/-XA09zJmLxM/67-overwriting-the-default-nanoc-template</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/67-overwriting-the-default-nanoc-template</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/67-overwriting-the-default-nanoc-template</feedburner:origLink></item>
    <item>
      <title>Ruby Gotcha With Array::uniq!</title>
      <description>&lt;p&gt;Here's one from the &amp;quot;I-Banged-My-Head-Against-The-Wall-Trying-To-Figure-This-Out-So-I'll-Post-This-So-You-Don't-Have-To&amp;quot; Department:&lt;/p&gt;
&lt;p&gt;I had a method that added a bunch of stuff to an array, then did some clean-up to it before returning it.&amp;nbsp; The method initially had some working code in it like this:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt; def get_stuff&lt;br /&gt;
&amp;nbsp; # collect stuff here...&lt;br /&gt;
&amp;nbsp; stuff.uniq!&lt;br /&gt;
&amp;nbsp; stuff.sort! { |x,y| x.list_order &amp;lt;=&amp;gt; y.list_order }&lt;br /&gt;
end&lt;br /&gt;
&lt;/code&gt; &lt;br /&gt;
Then, I realized that the method shouldn't sort the array, so I deleted the last line, like so:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt; def get_stuff&lt;br /&gt;
&amp;nbsp; # collect stuff here...&lt;br /&gt;
&amp;nbsp; stuff.uniq!&lt;br /&gt;
end&lt;br /&gt;
&lt;/code&gt; &lt;br /&gt;
At some point later, I noticed that my app was sometimes broken and sometimes worked fine, and then spent a bunch of time trying to figure out why.&amp;nbsp; I got some other people involved and then Mark said, &amp;quot;Oh, I've done that before.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Can you see the annoyance in my code that Mark saw right away?&lt;br /&gt;
&lt;br /&gt;
It turns out that Array::uniq! will return itself, i.e. a unique array ONLY IF IT ACTUALLY DID SOMETHING.&amp;nbsp; Otherwise, it returns nil.&amp;nbsp; So, when I deleted the line of code that did the sorting, I introduced the possibility that my method would sometimes return the value I was expecting, and sometimes not.&lt;/p&gt;
&lt;p&gt;Arrgh.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/GqKaKtW4MCw" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 30 Aug 2010 16:25:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/GqKaKtW4MCw/66-ruby-gotcha-with-array-uniq-</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/66-ruby-gotcha-with-array-uniq-</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/66-ruby-gotcha-with-array-uniq-</feedburner:origLink></item>
    <item>
      <title>Automatically Encode Video to HTML5 Formats With Zencoder</title>
      <description>&lt;p&gt;&lt;em&gt;(Note to readers: this is a highly technical tutorial aimed at intermediate to advanced Rails developers who wish to add video encoding capabilities to their application.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Online video is increasingly popular, so managers, clients, and most importantly users, are clamouring for integrated video capabilities on websites.&lt;/p&gt;
&lt;p&gt;However, serving video online can be a tricky proposition.  There are only a few video formats that are useful for the web, and many (or most) devices and video editing software suites produce video that falls outside of these formats.  Additionally, you may have requirements such as a particular bitrate, a consistent size, or the generation of thumbnail images.&lt;/p&gt;
&lt;p&gt;Sites like Vimeo and YouTube offer easy upload and encoding of videos, but very limited control.  Integrating FFMPEG directly into your application also has its drawbacks, such as extensive CPU usage, and leaves you dealing with the headache of supporting a myriad of video formats and codecs.&lt;/p&gt;
&lt;p&gt;There's an obvious market opportunity for services that do the hard work of researching codecs, developing encoders, and maintaining infrastructure for you.  Several exist, but it was a relative newcomer that caught our attention: &lt;a href="http://zencoder.com"&gt;Zencoder&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Why Zencoder?  In a nutshell, Zencoder offers a robust platform, an excellent and easy-to-utilize API, a superb web interface, reasonable pricing with pay-per-encoded-minute plans, and best of all, easy access to core developers who are willing to work with you to develop superb video encoding solutions.&lt;/p&gt;
&lt;p&gt;No matter how easy they try and make it, however, video encoding is not an easy addition to any Rails project.  This tutorial walks you through the process, focusing on all of the hard parts and providing plenty of source code that you can use in your projects.  Views and standard controller actions (e.g. delete) are excluded - your Rails skills should be at a level where these are trivial for you.&lt;/p&gt;
&lt;h2&gt;Requirements&lt;/h2&gt;
&lt;p&gt;This relies on using Paperclip for file attachments, although the integration with Zencoder would work equally well using any other method for file uploads.  The assumption that you have installed Paperclip and are reasonably familiar with it is made throughout this tutorial.&lt;/p&gt;
&lt;p&gt;In our &lt;a href="/forge-cms"&gt;content management system&lt;/a&gt;, we use SWFUpload to upload the original video files, as they are often very large (up to a couple of gigabytes), so a regular HTTP upload is not suitable.  We'll leave the details of that implementation up to you as there are plenty of tutorials on how to use SWFUpload and related technologies, and you may also be using something else to get the videos up to your server before transfer to S3 via Paperclip (e.g. FTP).&lt;/p&gt;
&lt;p&gt;This also demonstrates using S3 to host the video files as this is the easiest way to retrieve the output files that are produced by Zencoder; as well, it's one of the cheapest ways to host large files.  If you aren't interested in the S3 integration portion of this tutorial, you can skip the S3-focused portions and read just the Zencoder-related portions if you wish.&lt;/p&gt;
&lt;p&gt;You'll need an account with S3 (https://s3.amazonaws.com/) and with Zencoder (http://zencoder.com - free accounts available for testing purposes) to complete this tutorial.&lt;/p&gt;
&lt;h2&gt;Integrating Your Video Model With S3 And Paperclip&lt;/h2&gt;
&lt;p&gt;Start with the model for which you want to encode video - in this case, we'll be using the obvious choice Video.  We'll add in the Paperclip fields that are necessary for storing information about the video and a thumbnail image that we'll ask Zencoder to create for us.&lt;/p&gt;
&lt;p&gt;Start by getting the Amazon S3 gem with &lt;code&gt;gem install aws-s3&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In config/environment.rb, inside your &lt;code&gt;Rails::Initializer.run do |config|&lt;/code&gt; block, add:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;config.gem &amp;quot;aws-s3&amp;quot;, :lib =&amp;gt; &amp;quot;aws/s3&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Underneath the config block (or in an initializer if you prefer), add:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;require 'aws/s3'&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now, assuming that you have a model called Video already, add fields to it for handling the attachments and some additional information that we'll be retrieving or setting with &lt;code&gt;script/generate migration add_video_fields&lt;/code&gt;:&lt;/p&gt;
&lt;script src="http://gist.github.com/540755.js?file=add_video_fields.rb"&gt;&lt;/script&gt;
&lt;p&gt;Now it's time to tell the Video model to use S3 for its attachments.  In this case, we'll be using S3 specifically for the video attachments, allowing other storage (such as the file system) to be utilized for other attachments as necessary.  If you wish, you can modify these instructions to use S3 for all attachments.  In the next gists, comments will indicate where and what adjustments you would make to utilize S3 for all attachments instead.&lt;/p&gt;
&lt;p&gt;Create (or modify if it exists already) the file config/initializers/paperclip_defaults.rb:&lt;/p&gt;
&lt;script src="http://gist.github.com/540757.js?file=paperclip_defaults.rb"&gt;&lt;/script&gt;
&lt;p&gt;(Don't forget to restart your app after making this change, as without a restart these new settings won't be loaded.)&lt;/p&gt;
&lt;p&gt;Note that this references a file called config/s3.yml.  We need to create that as well if it does not exist, and put our S3 access keys into it.  We'll add the standard development, test and production buckets.&lt;/p&gt;
&lt;pre&gt;
development:
  bucket: YOUR-PROJECT-NAME_development
  access_key_id: # obviously, your actual S3 keys will go in here 
  secret_access_key: 

test:
  bucket: YOUR-PROJECT-NAME_test
  access_key_id: 
  secret_access_key: 

production:
  bucket: YOUR-PROJECT-NAME
  access_key_id: 
  secret_access_key: 
&lt;/pre&gt;
&lt;p&gt;Now we need to declare that Video has attached files for the video and the thumbnail image.  Open up app/models/video.rb and add somewhere near the top:&lt;/p&gt;
&lt;script src="http://gist.github.com/540758.js?file=gistfile1.rb"&gt;&lt;/script&gt;
&lt;p&gt;Now it's time to set up your buckets in S3.  There are lots of tools for this, but Amazon has released a decent &lt;a href="https://console.aws.amazon.com/s3/home"&gt;web-based console&lt;/a&gt; that you can use.&lt;/p&gt;
&lt;p&gt;Create buckets that correspond with the ones you've defined in config/s3.yml, so in this case, buckets for YOUR-PROJECT-NAME_development, YOUR-PROJECT-NAME_test, and YOUR-PROJECT-NAME.  While you're at it, &lt;strong&gt;create a bucket for the encoded files that Zencoder will create&lt;/strong&gt; (we'll store the bucket information in a separate config file that we create just for Zencoder).  Call it YOUR-PROJECT-NAME_encoded.&lt;/p&gt;
&lt;p&gt;Note that bucket names must be unique across all of S3.&lt;/p&gt;
&lt;h2&gt;Integrating With Zencoder&lt;/h2&gt;
&lt;p&gt;Now the fun begins.  We'll be taking a lightning quick tour, source code provided, for how to integrate with Zencoder for video encoding that will impress your clients like practically nothing you've done before.  We're not going to dwell too much on the technical details for how the integration works, for that, you can &lt;a href="http://zencoder.com/docs/api/"&gt;read their API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Start by granting Zencoder the appropriate permissions to the S3 buckets we just created.  Grant &amp;quot;list&amp;quot; and &amp;quot;upload/delete&amp;quot; permissions to the buckets (why the console does not display &amp;quot;READ&amp;quot;, &amp;quot;WRITE&amp;quot;, &amp;quot;READ/WRITE&amp;quot; and so on is beyond me) like so: select the bucket in the web-based console, click on Properties, select Add more permissions, enter &amp;quot;aws@zencoder.com&amp;quot; as the grantee, then check the appropriate checkboxes and click Save.&lt;/p&gt;
&lt;p&gt;You should do this for four buckets (development, test, production, and encoded).&lt;/p&gt;
&lt;p&gt;Now you need to add a method that will accept notifications from the Zencoder service to the controller, which I'm assuming is called videos_controller. (This is also where you'll have your new, edit, create, update, etc. methods for videos, which I'm assuming you are fully capable of creating yourself - you will need at minimum new and create actions so you can upload the original videos).  Just drop in this dummy method:&lt;/p&gt;
&lt;pre&gt;
# capture notifications from the Zencoder service about video encoding
def encode_notify
end
&lt;/pre&gt;
&lt;p&gt;If your videos controller is under access control (e.g. it is part of an admin panel), you're going to want to skip the before_filters or whatever you are using for access control, for the encode_notify action.  You're also going to want to drop the CSRF protection for that method:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;protect_from_forgery :except =&amp;gt; [:encode_notify]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Of course, you can also create a separate controller just to capture notification requests if you don't want to follow this approach.&lt;/p&gt;
&lt;p&gt;Add in the route for this action as well - it should be a :post request.&lt;/p&gt;
&lt;p&gt;We've now set up enough stuff that we can create a configuration file for Zencoder.  Create a YAML file called zencoder.yml in the config folder, and drop in some settings for the encoded bucket and some other key information about your app and the way we want videos to be encoded.  It should look like this, as a minimum:&lt;/p&gt;
&lt;pre&gt;
s3_output:
  bucket: YOUR-PROJECT-NAME_encoded
  access_key_id: YOUR-ACCESS-KEY-ID
  secret_access_key: YOUR-SECRET-ACCESS-KEY
settings:
  notification_url: http://YOUR-ENCODE-NOTIFY-URL-HERE, e.g. http://myproject.com/videos/encode_notify
&lt;/pre&gt;
&lt;p&gt;Note that for your app to automatically receive updates from Zencoder about video status, your encode_notify path must be accessible by Zencoder, i.e. the app must be online.  However, Zencoder provides a handy alternative way to receive updates about video status that works well in development mode, which we'll cover in a minute.&lt;/p&gt;
&lt;p&gt;Now we'll add a private method to our video model to retrieve these settings from the configuration file:&lt;/p&gt;
&lt;pre&gt;
def zencoder_setting
  @zencoder_config ||= YAML.load_file(&amp;quot;#{RAILS_ROOT}/config/zencoder.yml&amp;quot;)
end
&lt;/pre&gt;
&lt;p&gt;We can use in our video model to retrieve settings, as in &lt;code&gt;zencoder_setting[&amp;quot;s3_output&amp;quot;][&amp;quot;access_key_id&amp;quot;]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Next up, we're going to integrate with the Zencoder API.  To do this, we're going to build a simple class based on HTTParty.  Start by installing HTTParty with &lt;code&gt;config.gem 'httparty'&lt;/code&gt; in your config.rb and then &lt;code&gt;rake gems:install&lt;/code&gt;, or just &lt;code&gt;gem install httparty&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now drop a file into lib called zencoder.rb.  Here's some code you can use that will take care of the basics.  This has several limitations, including but probably not limited to just one output format and just one thumbnail, but you can modify for your purposes as you see fit (be sure to put in your API key):&lt;/p&gt;
&lt;script src="http://gist.github.com/536873.js?file=zencoder.rb"&gt;&lt;/script&gt;
&lt;p&gt;Your video model is going to need some code that will deal with S3 and the Zencoder class we just created.  This example model has everything you need for that in it, with everything else that you'll probably want in your app removed (for example, stuff dealing with user associations, commenting, swfupload, etc.)  The comments provide useful information about how the methods work:&lt;/p&gt;
&lt;script src="http://gist.github.com/536890.js?file=video.rb"&gt;&lt;/script&gt;
&lt;p&gt;You'll also need code in your controller that will trigger the video encoding, as well as a fleshed out encode_notify method that will accept notifications from Zencoder.&lt;/p&gt;
&lt;p&gt;In our case, because we are using SWFUpload for uploading videos, all of our videos go through a single method, regardless of whether the video is a new or an updated video.  That lets us drop in &lt;code&gt;@video.encode!&lt;/code&gt; just in that one method.&lt;/p&gt;
&lt;p&gt;Here are example methods that show encoding and the encode notification:&lt;/p&gt;
&lt;script src="http://gist.github.com/536899.js?file=videos_controller.rb"&gt;&lt;/script&gt;
&lt;p&gt;So long as you've ensured that the critical bit here, &lt;code&gt;@video.encode!&lt;/code&gt;, exists in whatever method you are using to upload your video (convention would indicate 'create' and 'update', but as stated previously we're using SWFUpload due to large file sizes), encoding with Zencoder should commence automatically.&lt;/p&gt;
&lt;p&gt;When it's done, Zencoder will attempt to notify your application that it is complete.  This will fail, however, because in all likelihood your application will not be accessible by Zencoder when you're working locally.&lt;/p&gt;
&lt;p&gt;What you need is a different way to notify your application that encoding is complete, one that works on your local development machine.  Luckily, Zencoder has provided this with the zencoder-fetcher gem: &lt;code&gt;gem install zencoder-fetcher&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You'll use this gem like so: &lt;code&gt;zencoder_fetcher -u http://localhost:3000/ENCODE-NOTIFY-PATH API-KEY&lt;/code&gt;.  This will notify your application of the status of any encoding jobs.&lt;/p&gt;
&lt;p&gt;In your views, you can instantiate a video and display its status with &lt;code&gt;video.encoded_state&lt;/code&gt;  If its encoded state is &amp;quot;finished&amp;quot;, then display the video!  It's accessible at &lt;code&gt;video.output_url&lt;/code&gt;.  And, of course, you can display thumbnails with Paperclip's standard syntax, e.g. &lt;code&gt;video.thumbnail(:original)&lt;/code&gt; for a full-sized thumbnail of the frame.&lt;/p&gt;
&lt;p&gt;I realize this is a ton of code and a lot of concepts.  If you have trouble, feel free to add a comment below - I'll get an email when you do and if I'm able I'd be happy to help.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/LxxQdeV8_-I" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 20 Aug 2010 13:27:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/LxxQdeV8_-I/65-automatically-encode-video-to-html5-formats-with-zencoder</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/65-automatically-encode-video-to-html5-formats-with-zencoder</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/65-automatically-encode-video-to-html5-formats-with-zencoder</feedburner:origLink></item>
    <item>
      <title>Turn Wordpress into an Image-Slinging Warhorse in Three Steps</title>
      <description>&lt;div&gt;
&lt;p&gt;Wordpress: know it, love it. One of the largest publishing platforms in the world, used by everyone from CNN to Kobe Bryant to some guy in Provo who really likes Tetris Party. Wordpress: something for everyone.&lt;/p&gt;
&lt;p&gt;Where Wordpress really starts to fall apart is in the image-handling department. It's pretty easy to make and embed image galleries and to put images directly into posts. No sweat. If that's all you want to do, stop here. You're good.&lt;/p&gt;
&lt;p&gt;If you want to do anything more ambitious - say, attaching an image directly to a post and then pulling it out later at a predetermined size for use in your template - then read on, intrepid Wordpresser.&lt;/p&gt;
&lt;p&gt;First, you're going to want to find and install a plug-in called &lt;a target="_blank" href="http://wpgogo.com/development/custom-field-template.html"&gt;Custom Field Template&lt;/a&gt;, written by Hiroaki Miyashita. The site for it is entirely in Japanese, but the plugin itself is so straightforward, you won't need to learn a foreign language. &lt;br /&gt;
(Note: if you already speak Japanese, you're ahead of the game! おめでとうございます!)&lt;/p&gt;
&lt;p&gt;Once it's installed, you'll see a plug-in settings page like this:&lt;br /&gt;
&lt;img width="590" height="572" alt="" src="http://www.factore.ca/system/images/images/68/original/customfield.jpg?1281976920" /&gt;&lt;/p&gt;
&lt;p&gt;Aww geez - that looks complicated! Luckily, we can ignore 90% of that jazz and concentrate on the part that says &lt;strong&gt;Template Content&lt;/strong&gt;. This uses some custom markup to indicate what kind of hooks we're adding to posts and pages. This entire system uses Wordpress' existing 'custom fields' system, so if you decide later that Custom Field Template isn't for you, you're not locked into anything.&lt;/p&gt;
&lt;p&gt;Let's make an upload field for our image attachment. Insert the following into the &lt;strong&gt;Template Content&lt;/strong&gt; box.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;[image-upload]&lt;br /&gt;
type = file&lt;br /&gt;
label = Hey, I can upload an image!&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The part contained in the square brackets is the name of the Wordpress custom field that the uploaded image will be associated with. If it doesn't exist, it'll get created when you upload an image - zero configuration! The &lt;strong&gt;type = file&lt;/strong&gt; part tells the plugin to throw up a file upload box for us, and the label is to tell you what this is all about. If you're uploading more than one image to a page or post, this would be a good place to put a reminder, like &amp;quot;Upload the header image! Remember: it has to be at least 440px!&amp;quot;&lt;/p&gt;
&lt;p&gt;If you check out your 'New Post' or 'New Page' pages, you'll now see something like this:&lt;/p&gt;
&lt;p&gt;&lt;img width="590" height="99" alt="" src="http://www.factore.ca/system/images/images/69/original/image-upload.jpg?1281977239" /&gt;&lt;/p&gt;
&lt;p&gt;.. and once you've attached an image to your post, it'll look like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://www.factore.ca/system/images/images/70/original/image-uploaded.jpg?1281977285" /&gt;&lt;/p&gt;
&lt;p&gt;The image is associated directly with your post or page. Fantastic!&lt;/p&gt;
&lt;p&gt;But wait - 'shopping images really sucks! You've got better things to do, like write your next opus of a blog post. No time for fooling around with image editors! Not to worry. Wordpress has an image-crunching algorithm built-in. Check &lt;strong&gt;Settings &amp;gt; Media&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img width="590" height="215" alt="" src="http://www.factore.ca/system/images/images/72/original/imagesizing.jpg?1281977358" /&gt;&lt;/p&gt;
&lt;p&gt;Put in your digits. In this case, we've got a medium-sized image of 440 pixels width - the zero indicates it'll resize the height with respect to the width, rather than a fixed, absolute image size. Handy! Obviously these values should be tailored to fit your templates.&lt;/p&gt;
&lt;p&gt;By setting these settings, you never need to run through another Photoshop gauntlet to make a new header image, byline, or whatever for your site - all the image-finessing action is handled by raster-happy pixies on the server.&lt;/p&gt;
&lt;p&gt;So we've got the image attachment. We've got the image handling done on the server. How do we get the size we want into our site?&lt;/p&gt;
&lt;p&gt;All it takes is a big ball of front-end PHP. Part of really digging into the guts of Wordpress consists of chaining together some of Wordpress' internal functions. Not all of them make sense (if you've ever run into one of Wordpress baffling gaps in obvious functionality, you'll feel my pain) and a lot of them are poorly documented. Think of this as a nugget of code, freed from the code mines.&lt;/p&gt;
&lt;p&gt;If you're a programmer by trade and not merely by circumstance, this might be perfectly obvious. That being said, pulling out attached images from Wordpress seems to be a bone of contention on the web at large, so I'm sharing this in the hopes of a brighter, happier Wordpress-templating future.&amp;nbsp;Are you ready? Here it is:&lt;/p&gt;
&lt;code&gt;
&lt;p&gt;&amp;lt;?php&lt;br /&gt;
$key = &amp;quot;image-upload&amp;quot;; &lt;br /&gt;
$keymeta = get_post_meta($post-&amp;gt;ID, $key, true);&lt;br /&gt;
$img = wp_get_attachment_image($keymeta, $size='medium', $icon = false);&lt;br /&gt;
echo $img;&lt;br /&gt;
?&amp;gt;&lt;/p&gt;
&lt;/code&gt;
&lt;p&gt;Urgh. Take a breath, it's not that bad. Let's break this down.&lt;/p&gt;
&lt;code&gt;
&lt;p&gt;$key = &amp;quot;image-upload&amp;quot;;&lt;/p&gt;
&lt;/code&gt;
&lt;p&gt;So here we're merely telling Wordpress what we want to pull out - the name of the custom field.&lt;/p&gt;
&lt;code&gt;
&lt;p&gt;$keymeta = get_post_meta($post-&amp;gt;ID, $key, true);&lt;/p&gt;
&lt;/code&gt;
&lt;p&gt;Hey Wordpress, remember that value I just gave you? Pull out the data in the custom field with that name, s'il vous pla&amp;icirc;t. (Yes, you could easily replace $key in this line with the value from the first line. This keeps things a little more parsable, in my opinion.)&lt;/p&gt;
&lt;code&gt;
&lt;p&gt;$img = wp_get_attachment_image($keymeta, $size='medium', $icon = false);&lt;/p&gt;
&lt;/code&gt;
&lt;p&gt;Magic happens! Wordpress mashes up the post ID, the custom field value, and the size we want (medium), and pulls out a fully fleshed html &amp;lt;img&amp;gt; tag.&lt;/p&gt;
&lt;code&gt;
&lt;p&gt;echo $img;&lt;/p&gt;
&lt;/code&gt;
&lt;p&gt;Finally, we nudge PHP to do some work and it turfs the aforementioned tag into your template.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
There you have it - three pretty simple steps to make Wordpress into a macho powerhouse of image storing, styling and serving.&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/jtTXR2JrMN4" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 16 Aug 2010 12:50:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/jtTXR2JrMN4/64-turn-wordpress-into-an-image-slinging-warhorse-in-three-steps</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/64-turn-wordpress-into-an-image-slinging-warhorse-in-three-steps</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/64-turn-wordpress-into-an-image-slinging-warhorse-in-three-steps</feedburner:origLink></item>
    <item>
      <title>3 jQuery plugins I use all the time</title>
      <description>&lt;p&gt;When making anything over and over you tend not to notice repetitive actions. The other day I stepped back from what I do and I noticed a few things. I've used a lot of jQuery plugins. I started looking through some of the ones I use consistently and came up with these three.&lt;/p&gt;
&lt;br/&gt;
&lt;h2&gt;&lt;a href="http://jquery.malsup.com/cycle/" target="_blank"&gt;jQuery Cycle&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Fancy front page slide shows are all the rage right now and jQuery Cycle is my favourite solution. I've tried &lt;a href="http://flesler.blogspot.com/2008/02/jqueryserialscroll.html" target="_blank"&gt;SerialScroll&lt;/a&gt; as well, but I've found over and over that jQuery Cycle is much easier to implement.&lt;/p&gt;
&lt;p&gt;First include the files in the head:&lt;/p&gt;
&lt;script src="http://gist.github.com/519712.js?file=gistfile1.html"&gt;&lt;/script&gt;
&lt;p&gt;Build your photo collection wrapped in a div:&lt;/p&gt;
&lt;script src="http://gist.github.com/519702.js?file=gistfile1.html"&gt;&lt;/script&gt;
&lt;p&gt;Add some styles:&lt;/p&gt;
&lt;script src="http://gist.github.com/519709.js?file=gistfile1.css"&gt;&lt;/script&gt;
&lt;p&gt;Then all you have to do is add the specs into your chosen applications javascript file:&lt;/p&gt;
&lt;script src="http://gist.github.com/519716.js?file=gistfile1.js"&gt;&lt;/script&gt;
&lt;p&gt;This will cycle through each child of #rotating-photos. It is also very easy to add and style previous/next buttons as well as pagination. There are a pile of examples &lt;a href="http://jquery.malsup.com/cycle/"&gt;here&lt;/a&gt; to help you get started.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://jquery.malsup.com/corner/"&gt;jQuery Corner&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Have you ever noticed how designers seem to love rounded corners? To do this you used to have to make all kind of images then use some fancy CSS to get it all looking right. And once you get it working in Firefox or Safari you have to do it all over again for Internet Explorer. Good times.&lt;/p&gt;
&lt;p&gt;jQuery corner is a cross-browser solution to those woes.&lt;/p&gt;
&lt;p&gt;Create your object:&lt;/p&gt;
&lt;script src="http://gist.github.com/519717.js?file=gistfile1.html"&gt;&lt;/script&gt;
&lt;p&gt;Style your object:&lt;/p&gt;
&lt;script src="http://gist.github.com/519718.js?file=gistfile1.css"&gt;&lt;/script&gt;
&lt;p&gt;And tell your script to round the corners:&lt;/p&gt;
&lt;script src="http://gist.github.com/519719.js?file=gistfile1.js"&gt;&lt;/script&gt;
&lt;p&gt;Don't forget to include the files in the head:&lt;/p&gt;
&lt;script src="http://gist.github.com/519722.js?file=gistfile1.html"&gt;&lt;/script&gt;
&lt;p&gt;You can also do a number of other things to your corners such as &amp;quot;Sharp,&amp;quot; &amp;quot;Fray&amp;quot; or &amp;quot;Wicked.&amp;quot; There are &lt;a href="http://jquery.malsup.com/corner/"&gt;quite a few possibilities&lt;/a&gt; that I don't think I would ever use, but it's always nice to have options.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://remysharp.com/2007/01/25/jquery-tutorial-text-box-hints/" target="_blank"&gt;jQuery Hint&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This one is really straight forward. It provides a &amp;quot;hint&amp;quot; in a text field which disappears when the field is in focus.&lt;/p&gt;
&lt;p&gt;Include the files in the head:&lt;/p&gt;
&lt;script src="http://gist.github.com/519724.js?file=gistfile1.html"&gt;&lt;/script&gt;
&lt;p&gt;Add you field, which will obviously be part of a larger form:&lt;/p&gt;
&lt;script src="http://gist.github.com/520953.js?file=gistfile1.html"&gt;&lt;/script&gt;
&lt;p&gt;Then simply call it up from your javascript file:&lt;/p&gt;
&lt;script src="http://gist.github.com/519727.js?file=gistfile1.js"&gt;&lt;/script&gt;
&lt;p&gt;That's it! The title you've added becomes the hint in the text field.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Anyone else have any favourites?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/zhiTe6_vWuY" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 12 Aug 2010 09:36:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/zhiTe6_vWuY/63-3-jquery-plugins-i-use-all-the-time</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/63-3-jquery-plugins-i-use-all-the-time</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/63-3-jquery-plugins-i-use-all-the-time</feedburner:origLink></item>
    <item>
      <title>Operator Precedence and Code Readability in Ruby</title>
      <description>&lt;p&gt;I was reading about operator precedence in ruby the other day and noticed that the &amp;quot;and&amp;quot; and &amp;quot;or&amp;quot; operators are NOT the same as the &amp;amp;&amp;amp; and || operators.&amp;nbsp; They are actually about 6 levels of precedence below &amp;amp;&amp;amp; and ||, meaning that there is a lot of stuff that gets processed before &amp;quot;and&amp;quot; and &amp;quot;or&amp;quot; become relevant.&lt;br /&gt;
&lt;br /&gt;
This means that your logical expressions can become a little more readable by using a mix of the two kinds of logical operators.&amp;nbsp; Compare this:&lt;br /&gt;
&lt;br /&gt;
(var1 || var2) || (var3 &amp;amp;&amp;amp; var4)&lt;br /&gt;
&lt;br /&gt;
with:&lt;br /&gt;
&lt;br /&gt;
var1 || var2 or var3 &amp;amp;&amp;amp; var4&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/lj3CAvv-jYs" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 30 Jul 2010 14:51:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/lj3CAvv-jYs/62-operator-precedence-and-code-readability-in-ruby</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/62-operator-precedence-and-code-readability-in-ruby</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/62-operator-precedence-and-code-readability-in-ruby</feedburner:origLink></item>
    <item>
      <title>Goodbye NetBeans, Hello Textmate</title>
      <description>&lt;p&gt;I recently decided to give up on NetBeans as my editor/IDE for my rails development as it was bogging my system down too much.&amp;nbsp; It, coupled with 20 open tabs in Firefox, and my countless desktop widgets were making my system unusable.&amp;nbsp; Rather than cut back on widgets, I've decided to give Textmate another shot, and have been really happy with it, after an initial period of adjustment.&lt;br /&gt;
&lt;br /&gt;
This adjustment period has been made a lot easier by GetBundles.&amp;nbsp; This handy little bundle, incidentally, has allowed me to continue with my plugin/habit habit. It itself, is an easy install, and it allows you to install other bundles through the TextMate UI. &lt;script src="http://gist.github.com/491115.js?file=bun.sh"&gt;&lt;/script&gt;	 	 &lt;br /&gt;
There were initially a few almost show-stoppers for me, in particular the really slow &amp;quot;search in project&amp;quot; functionality.&amp;nbsp; As a replacement, I've been using &amp;quot;ack in project&amp;quot; which I installed through GetBundles.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
After modifying the .ackrc file as below to have ack search all file types and group, it returns useful search results REALLY quickly: &lt;script src="http://gist.github.com/491117.js?file=.ackrc"&gt;&lt;/script&gt;	 &lt;br /&gt;
One thing that I still miss from NetBeans is the ability to ctrl-tab through my open files, like in Firefox.&amp;nbsp; TextMate allows for switching b/w open files, but only from left to right in the list of files you currently have open. Has anyone found a way to get ctrl-tab type switching working in TextMate?&lt;br /&gt;
&lt;br /&gt;
Other than this minor adjustment I've had to make in the way I navigate, I've found the switch fairly easy, and definitely appreciate the lack of overhead in this lightweight editor.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/Qj2ec2CmQmQ" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 26 Jul 2010 15:39:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/Qj2ec2CmQmQ/61-goodbye-netbeans-hello-textmate</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/61-goodbye-netbeans-hello-textmate</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/61-goodbye-netbeans-hello-textmate</feedburner:origLink></item>
    <item>
      <title>GeoTrail Featured on CBC News</title>
      <description>&lt;p&gt;The CBC&amp;nbsp;nightly news in Toronto recently did a short piece on the &lt;a href="/portfolio/85"&gt;GeoTrail website&lt;/a&gt;, check it out below!&lt;/p&gt;
&lt;object width="595" height="359"&gt;&lt;param name="movie" value="http://www.youtube.com/v/WVT5I2c7z-A&amp;amp;hl=en_US&amp;amp;fs=1?rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/WVT5I2c7z-A&amp;amp;hl=en_US&amp;amp;fs=1?rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="595" height="359"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/RRuiPGF9DB0" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 07 Jul 2010 16:04:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/RRuiPGF9DB0/60-geotrail-featured-on-cbc-news</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/60-geotrail-featured-on-cbc-news</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/60-geotrail-featured-on-cbc-news</feedburner:origLink></item>
    <item>
      <title>CSS3 Transformations</title>
      <description>&lt;p&gt;Transforms are a feature of CSS3 that let you apply matrix-based transformations to html elements.&amp;nbsp; There are two properties that you can use to apply the transformations: &lt;em&gt;&lt;strong&gt;transform&lt;/strong&gt;&lt;/em&gt;, which specifies the actual transformation(s); and &lt;em&gt;&lt;strong&gt;transform-origin&lt;/strong&gt;&lt;/em&gt;, which specifies where in the element the transformation acts on.&lt;br /&gt;
&lt;br /&gt;
There are four basic transformations you can apply to an element.&amp;nbsp; A &lt;strong&gt;translation&lt;/strong&gt; just moves the element around, and I am not sure if practically there is any difference between this and top and left.&amp;nbsp; I think you just get translations for free when you implement matrix transforms.&amp;nbsp; &lt;strong&gt;Scaling&lt;/strong&gt; means stretching or shrinking the element.&amp;nbsp; It's kind of cool, because when you do it, the internal elements scale too, which means text gets bigger and so forth.&amp;nbsp; &lt;strong&gt;Skewing&lt;/strong&gt; an element means that you push it sideways and turn it into a parallelogram instead of a rectangle.&amp;nbsp; And a &lt;strong&gt;rotation&lt;/strong&gt; means spinning it.&lt;br /&gt;
&lt;br /&gt;
And this is where the transform-origin property comes in.&amp;nbsp; Using rotation as an example, the default is to rotate the element about its centre.&amp;nbsp; If you want to rotate it about one of its corners, or any other point, you can change that by modifying transform-origin.&lt;br /&gt;
&lt;br /&gt;
There are several ways of applying the transformations.&amp;nbsp; If you are mathematically inclined, you can use the matrix() function and pass in your raw transformation.&amp;nbsp; Luckily, there are helper functions that let you just specify a simple rotation, for example, with rotate(33deg).&lt;br /&gt;
&lt;br /&gt;
If you are using multiple transformations, and you are not using the matrix method to indicate them, you must define them on one line, like this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;transform: rotate(45deg) scale(2);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Trying to define them on multiple lines won't work; writing:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;transform: rotate(45deg);&lt;br /&gt;
transform: scale(2);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;will only apply the last transformation, as it's analogous to writing something like:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;border: 1px;&lt;br /&gt;
border: solid;&lt;br /&gt;
border: black;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;These transformations allow you to add a lot of interesting &lt;a href="http://factore.ca/experiments/transform/shadow.html" target="_blank"&gt;effects&lt;/a&gt;, and give you the option of some interesting &lt;a href="http://factore.ca/experiments/transform/bauhaus.html" target="_blank"&gt;layouts&lt;/a&gt;.&amp;nbsp; Practically speaking, however, they seem to me to be most relevant in the context of fixed layout web sites.&amp;nbsp; For example, in my bauhaus poster example above, I still have live, searchable type, which is a bonus, but the whole concept of page flow has been bent, broken, trampled, put through a shredder and lit on fire.&amp;nbsp; Trying to dump dynamic content into this (without resorting to overflow:scroll;) would not be good.&lt;br /&gt;
&lt;br /&gt;
Having said that, now that the designers in our office have seen this, I'm sure I'll be asked to make it work &amp;gt;:(&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PS&lt;/strong&gt;: It should go without saying that these demos only work on Mozilla- and Webkit- based browsers, mostly because I couldn't be bothered trying to figure out the math to make it work with &lt;a href="http://msdn.microsoft.com/en-us/library/ms533014%28VS.85%29.aspx"&gt;IE's weird filter thingy.&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/frKVtES22Os" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 30 Jun 2010 16:45:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/frKVtES22Os/59-css3-transformations</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/59-css3-transformations</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/59-css3-transformations</feedburner:origLink></item>
    <item>
      <title>Narcissism is the New Black</title>
      <description>&lt;p&gt;&lt;em&gt;A Personal Recollection of Recent International and Personal News &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Earlier this month a young person on a bus, speaking to a friend, commented on the sad state of humanity. &amp;quot;People,&amp;quot; she said, &amp;quot;especially North Americans, are just spectators, who sit watching on TV as crisis after crisis devastates our planet.&amp;quot;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
In many ways she's absolutely right. I did not write a letter to Stephen Harper protesting the use of a billion tax dollars to turn downtown Toronto into a fortress for the G20. I did not help clean up the Gulf of Mexico after the oil spill. I did not fundraise to get Greece out of debt. I did not spend any time planning Middle East peace. Nor did I, in any way, help stop the violence in Kyrgystan. &lt;br /&gt;
&lt;br /&gt;
Here is my personal account of recent news: &lt;br /&gt;
&lt;br /&gt;
On April 20, 2010, an oil rig called Deepwater Horizon exploded, spewing a constant flow of oil thousands of feet underwater. Also on April 20, I had a group presentation worth 100% of the mark in one of my classes. When I finished that presentation I raced home to finish another project for the following day, so I could get to a printshop before it closed. I found out about the oil spill five days later.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
May 5, 2010 was the date of the general strike in Greece and the country was paralyzed. Greek unions decided to strike in reaction to a huge aid package from other Euro nations that would inevitably have to be repaid by the Greek people. On May 5, I left Hamilton first thing in the morning for a portfolio review in Toronto, at a design firm I was considering working for.&lt;br /&gt;
&lt;br /&gt;
I later stopped at a second location, to drop off a portfolio and introduce myself. Both interviews went well. On my return home I found that I had several voice mails from two clients and four urgent business emails. &lt;br /&gt;
&lt;br /&gt;
On May 25, 2010, the Canadian Government announced that it was going to spend $930 million dollars on security at the G8 and G20 summits starting June 25. Also on May 25, I had an interview at factor[e] for an internship position. I was completely oblivious to political decisions being made hundreds of kilometers away.&lt;br /&gt;
&lt;br /&gt;
In Kyrgystan, on June 7, 2010, a crime boss named Aibek Mirsidikov was assassinated. He had earlier attempted to seize control of the city of Jalal-Abad. Intense and prolonged violence in this city and others was driving this city into anarchy. June 7 was also the first day of my internship at factor[e]. &lt;br /&gt;
&lt;br /&gt;
Today, hundreds of other conflicts, political schemes and criminal activities are taking place everywhere. Meanwhile, I'm eating lunch and writing this factor[e] blog post in the fourth week of my internship at this organization. &lt;br /&gt;
&lt;br /&gt;
Here is my personal prediction for the future: &lt;br /&gt;
&lt;br /&gt;
There are going to be a bunch of wars and ecological disasters, corruption and crime will continue, people will be born and people will die. Meanwhile, many individuals and organizations will plan for the future, artists will make art and authors will write books and countless numbers of people will go about their day-to-day lives. &lt;br /&gt;
&lt;br /&gt;
This afternoon I am going to work on a website or two and edit this blog post, but first, I'm going to get a coffee.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/vJGmpZs9BhA" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 29 Jun 2010 16:03:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/vJGmpZs9BhA/58-narcissism-is-the-new-black</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/58-narcissism-is-the-new-black</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/58-narcissism-is-the-new-black</feedburner:origLink></item>
    <item>
      <title>Migrating from sqlite to mysql -- UPDATED</title>
      <description>&lt;p&gt;We recently moved some of our sites, and in the process moved the older sites off of sqlite3, in favour of mysql. &amp;nbsp;This sounds like a really annoying task, but it was actually rather painless. &amp;nbsp;I made use of the handy plugin yaml_db, which does most of the heavy lifting for you.&lt;/p&gt;
&lt;p&gt;Here it is in 3 easy steps:&lt;/p&gt;
&lt;p&gt;First step is to install the plugin:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;script/plugin install git://github.com/adamwiggins/yaml_db.git &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The second step is to dump the database, using your current database.&lt;/p&gt;
&lt;p&gt;rake db:dump&lt;/p&gt;
&lt;p&gt;The final step (this one is tricky) is to build your new database with your old data.&lt;/p&gt;
&lt;p&gt;Change your database.yml to your mysql connection.&lt;/p&gt;
&lt;p&gt;Run rake db:load.&lt;/p&gt;
&lt;p&gt;That's all there is to it!&amp;nbsp;&lt;/p&gt;
&lt;p&gt;One final thought is to make sure you modify any database specific functions, such as &amp;quot;RAND&amp;quot; to their mysql counterparts &amp;quot;RANDOM&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;-- EDIT --&lt;/p&gt;
&lt;p&gt;Ok, so I'm full of shit.&lt;/p&gt;
&lt;p&gt;This works a lot of the time, but sometimes.... it doesn't.&lt;/p&gt;
&lt;p&gt;I found another route, which is actually just a one liner:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sqlite3 db/development.sqlite3 .dump | perl db/convert.pl | mysql -uroot XXXXXXX_development&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This assumes you are running from your project root, and have the convert.pl script in your db folder (and that you're using the root db user with no password).&amp;nbsp; Just put your database name in where the XXXX's are.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;The convert.pl script is a slightly modified version of a script I found on &lt;a href="http://stackoverflow.com/questions/18671/quick-easy-way-to-migrate-sqlite3-to-mysql"&gt;stackoverflow.com&lt;/a&gt;. &amp;nbsp;I needed to add a couple of regular expressions to clean up some improperly escaped single quotes, and allow for the indexes to be created.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Here is my updated version:&lt;/p&gt;
&lt;script src="http://gist.github.com/458933.js?file=convert.pl"&gt;&lt;/script&gt;
&lt;p&gt;This MAY work for you, or may need to be modified to catch whatever quicks are in your specific schema.&amp;nbsp; Download and save the file locally as convert.pl.&lt;/p&gt;
&lt;p&gt;Now &lt;u&gt;that's&lt;/u&gt; all there is to it. &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/k-OgaLEVOLU" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 29 Jun 2010 13:42:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/k-OgaLEVOLU/57-migrating-from-sqlite-to-mysql-updated</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/57-migrating-from-sqlite-to-mysql-updated</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/57-migrating-from-sqlite-to-mysql-updated</feedburner:origLink></item>
    <item>
      <title>Going Mobile</title>
      <description>&lt;p&gt;It's pretty obvious: a big part of the future of the web is mobile - smartphones, iPads, other mobile devices. We're increasingly reading websites on smaller screens with new and different input methods. When I had a dumbphone, I thought, &amp;quot;Psh, web on my phone? That's dumb.&amp;quot; Now that I have a smartphone, I use mobile browsing everywhere. Why? It delivers information when and where I want it.&lt;/p&gt;
&lt;p&gt;Some sites and services have embraced this and produced really slick mobile versions. Gmail is a great example of this. Check this out - that's exactly the same mailbox - one's optimized for my giant desktop monitor and the other's designed specifically for the touch input and limited size of an iPhone screen.&lt;/p&gt;
&lt;p&gt;&lt;img width="590" height="347" alt="" src="http://www.factore.ca/system/images/images/67/original/tom_gmail.jpg?1277226033" /&gt;&lt;/p&gt;
&lt;p&gt;On the other hand, a lot of other sites that are great on the desktop have a crummy (or non-existent!) user experience on mobile devices. Let's say I wanted to check my bank balance.&lt;/p&gt;
&lt;p&gt;&lt;img width="590" height="347" alt="" src="http://www.factore.ca/system/images/images/66/original/tom_cibc.jpg?1277223684" /&gt;&lt;/p&gt;
&lt;p&gt;Desktop version: no problem. Mobile version - Whoa, what? I can't read that. I'm going to have to pinch and zoom like a madman to use this site.&lt;/p&gt;
&lt;p&gt;What can we take away from this? There's a handful of lessons to learn here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Think about what your users might want to do online.&lt;/strong&gt; In the case of Gmail, this is obvious: read e-mail. Google's done a good job of optimizing their mobile interface to do just that, and not much more. I don't expect a mobile site to have all the bells and whistles - I'm not going to apply for a mortgage on my phone, for instance - but supporting those base functions should be job #1.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Think about the interaction model.&lt;/strong&gt; Humans tend to have giant fat fingers, compared to the 1-pixel hit area of a mouse pointer. Clickable items need to be big and noticeable. That's great for iPhones, but what about Blackberries? And that's great for Blackberries, but what about Palm devices, etc.? Make sure you've covering all your use cases.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Think about the device itself, and its connectivity.&lt;/strong&gt; Having a bare-bones mobile site is better than getting the full desktop experience on your mobile device. I don't want to load all those graphics! Data is expensive, man! Most of the mobile sites I came across in putting together this post were smart about this: text interface, great use of CSS, and images only where necessary.&lt;/p&gt;
&lt;p&gt;I've been pleasantly surprised to find a super mobile version of a site way more often than I've had to deal with a compressed desktop version. Overall, I think there's increasing awareness of how to make a great mobile site, and why it's valuable. By thinking about these kinds of rules of thumb and best practices, we're helping to keep that awareness growing.&lt;/p&gt;
&lt;p&gt;The mobile browsing trend is still accelerating. Let's make sure we're ready to build great experiences.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/Ef8mDO5aMvs" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 22 Jun 2010 12:10:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/Ef8mDO5aMvs/56-going-mobile</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/56-going-mobile</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/56-going-mobile</feedburner:origLink></item>
    <item>
      <title>WTF is HTML5 and why we should all care</title>
      <description>&lt;p&gt;NOTE:&amp;nbsp;I did not design this infographic, nor did I have anything to do with the making of it. However, as a designer who has very little development skills, I found this infographic to be quite good in explaining this new era of web technology.&lt;/p&gt;
&lt;p&gt;Click &lt;a href="http://www.flickr.com/photos/pixer/4681732186/sizes/o/"&gt;HERE&lt;/a&gt; for a full-size view.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://factore.ca/system/images/images/64/original/html5.gif?1276712350" alt="" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/pma0IBjVM8E" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 16 Jun 2010 14:13:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/pma0IBjVM8E/55-wtf-is-html5-and-why-we-should-all-care</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/55-wtf-is-html5-and-why-we-should-all-care</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/55-wtf-is-html5-and-why-we-should-all-care</feedburner:origLink></item>
    <item>
      <title>The Problematic Faucet</title>
      <description>&lt;p&gt;Sometimes as web designers, it can become difficult to consistently produce designs which maintain a high degree of originality. Sometimes we find ourselves in a bit of a rut, using the same styles and 'tricks' over and over again. And while they may 'work', and the clients may really like the design, it's not a very gratifying place to be, creatively. To me, creativity implies originality; and originality requires inspiration. Problem is, creativity isn't like a faucet that can be turned on and off again at will. Creative inspiration may come while kayaking around a harbour or riding a bicycle. Ideas and solutions may come in the middle of the night, or while watching a soccer match on a Sunday afternoon. But rarely does that faucet turn on at nine and off again at five. &lt;br /&gt;
&lt;br /&gt;
So we as designers have to learn to cope with the fact that sometimes the faucet trickles, sometimes it gushes and yet other times it's completely dry. While we have no control over when inspiration will happen, I think the best thing we can do is to immerse ourselves in other worlds of right-brained creativity - worlds &lt;em&gt;other&lt;/em&gt; than graphic and web design.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Look to Photography&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Most times, a site's colour scheme is mandated by the company's branding, but sometimes we get to choose - though this sounds much easier than it actually is. When presented with virtually limitless hues, it can become a real challenge to settle upon only a few solid swatches. In recent years though, online tools such as Adobe's Kuler will help you attain some inspiration, but perhaps an even better method of selecting a colour palette is to look at photography - specifically landscape photography. Sometimes I'll spend hours looking at the photos taken by great photographers like &lt;a href="http://www.flickr.com/photos/28338337@N03/collections/"&gt;Machel Spence&lt;/a&gt;, &lt;a href="http://www.flickr.com/photos/rasone"&gt;Jesse Estes&lt;/a&gt; and &lt;a href="http://www.flickr.com/photos/hkvam/"&gt;Helen Kvam&lt;/a&gt;, admiring the gorgeous hues in the brilliant vistas of their work. Millions upon millions of colours exist in nature, so why not let the natural world inspire you?&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Look to Fashion Design&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
While I've never considered myself 'fashionable', I think the world of fashion design has much to offer us web designers. Fashion is tangible, and we all need it on some level or another (we all need clothes), so all of us can relate to at least one aspect of it. Colour, pattern, trim, fit, feel, material, practicality and even price have much in common with most other design disciplines, and since we live within a very fashion-forward culture, following trends in fashion can be an excellent way to stay ahead of the trends in graphic/web design. There may be better sites out there (remember, I'm not 'fashionable'), but here are a few sites I check out from time to time when I'm seeking out some inspiration.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.fashionmagazine.com/"&gt;fashionmagazine.com&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.next.co.uk/"&gt;next.co.uk&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.style.com/"&gt;style.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Look to Industrial Design&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Thanks largely to guys like Jonathan Ive and Karim Rashid, we've all become accustomed to what industrial design &lt;em&gt;is&lt;/em&gt; in recent years. Despite the lackluster title, industrial designers shape the way all the products around us look. Even the screen on which you're reading this blog post has been designed by an industrial designer. While us web designers work with pixels rather than pens, clay, foam or SolidWorks, we can certainly draw inspiration from the physical realm. Studying materials, texture, form, balance, practicality and of course user-experience can all help inspire us when designing for the screen. Here are a few sources to view the latest and prettiest in the world of industrial design.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.yankodesign.com/"&gt;yankodesign.com&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.core77.com/"&gt;core77.com&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.industrialdesignserved.com/"&gt;industrialdesignserved.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Listen to Classical Music&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
I've always preferred instrumental over music with lyrics, because I think it leaves more up to the imagination. Instead of listening to a story being told to us, instrumental music and especially classical music leaves us to interpret the mood ourselves and make up our own story. This is an excellent exercise for us to keep our creativity as fresh as possible. The patterns, themes, variations, melodies and harmonies all combine to help create a setting, a mood, and a story. Go ahead and close your eyes while you listen, and let your imagination take over. If you don't know where to begin, might I recommend &lt;a href="http://www.last.fm/music/Gustav%2520Holst?ac=gustav%20hol"&gt;Gustav Holst&lt;/a&gt;, &lt;a href="http://www.last.fm/music/Johannes%2520Brahms?ac=johannes%20br"&gt;Johannes Brahms&lt;/a&gt; or &lt;a href="http://www.last.fm/music/Thomas%2520Newman?ac=thomas%20newman"&gt;Thomas Newman&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While looking to these other areas of creativity, keep an open mind and try to find beauty in the details. With a child-like sense of awe and wonder, appreciate the time and effort that went into the symphony, the product, the runway show and the surreal landscape photograph. And remember, the creators of these works were probably just as frustrated and stuck for inspiration as you have been.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/CQcP4FiO9rA" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 14 Jun 2010 10:58:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/CQcP4FiO9rA/54-the-problematic-faucet</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/54-the-problematic-faucet</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/54-the-problematic-faucet</feedburner:origLink></item>
    <item>
      <title>No Aliens Required</title>
      <description>&lt;p&gt;The &lt;a href="http://www.washingtonpost.com/wp-dyn/content/article/2010/05/21/AR2010052104713.html"&gt;Washington Post recently reported&lt;/a&gt; on a conference that the US Library of Congress is having about portolan charts, which are maps produced as early as 1275 that are stunningly accurate.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt; It is a rare representative of one of the world's greatest and most enduring mysteries: Where and how did medieval mapmakers, apparently armed with no more than a compass, an hourglass and sets of sailing directions, develop stunningly accurate maps of southern Europe, the Black Sea and North African coastlines, as if they were looking down from a satellite, when no one had been higher than a treetop?  &lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The answer is simple: aliens.  At least, that's what some people think, says Evelyn Edson, one of the conference's speakers and author of &amp;quot;The World Map: 1300-1492&amp;quot;.&lt;/p&gt;
&lt;p&gt;The phenomenon of attributing major advances from historical times to aliens is pretty common.  A lot of people think that the pyramids were built with extraterrestrial help, and the astronomy of the Mayans is frequently chalked up to alien contact.&lt;/p&gt;
&lt;p&gt;If it's amazing and it's ancient, people are often easily persuaded that there's no way a human could have done it on their own.&lt;/p&gt;
&lt;p&gt;What it really shows, however, is the widespread belief that people living in ancient times were not as intelligent as people who live now.&lt;/p&gt;
&lt;p&gt;That, of course, is nonsense.  Although modern industrialized societies have certain advantages over ancient societies that may help boost the baseline intelligence level of their populations (such as good nutrition), there is no reason to think that the average well-off citizen of ancient Rome or Maya was any less intelligent than the average citizen today.&lt;/p&gt;
&lt;p&gt;The span of time between ancient Egypt and now is a blink of an eye in evolutionary terms and no significant evolution of the human brain has taken place in that period.  So when we consider Egyptian achievements, we must do so keeping in mind that these were highly intelligent people.&lt;/p&gt;
&lt;p&gt;A complement to the belief that people in ancient societies were generally stupider than people now is the idea held by many individuals that they, personally, are better educated and more knowledgeable than an individual living hundreds or thousands of years ago.&lt;/p&gt;
&lt;p&gt;While it is true that on the whole modern societies are better educated than ancient ones, that does not mean that the average citizen of a modern society is better educated than the best educated citizens of ancient societies.&lt;/p&gt;
&lt;p&gt;The theorem of geometry that states that in a right-angled triangle the square of the hypoteneuse is equal to the sum of the two other sides squared (a&lt;sup&gt;2&lt;/sup&gt; + b&lt;sup&gt;2&lt;/sup&gt; = c&lt;sup&gt;2&lt;/sup&gt;) is generally attributed to Pythagoras, who was born around 570 BC, but the principle was known since Babylonian times.  And yet, the average North American will give you a blank stare if you ask them about it.&lt;/p&gt;
&lt;p&gt;Most people just don't need this knowledge, just like they don't need the knowledge required to create a detailed map without the use of satellite photography.  And so, since they have no idea how they would go about solving a particular problem, they assume that people in ancient times would not either.&lt;/p&gt;
&lt;p&gt;This is no more true than the assumption that just because they can't solve for x, neither could someone in ancient Greece.&lt;/p&gt;
&lt;p&gt;The remarkable accomplishments of hundreds and thousands of years ago illustrate a fundamental fact: great solutions are designed by people who are motivated to solve great problems.&lt;/p&gt;
&lt;p&gt;The people who drew the incredibly detailed and accurate portolan maps between the thirteenth and sixteenth centuries had no access to modern surveying and mapmaking technology.&lt;/p&gt;
&lt;p&gt;They faced immense obstacles in designing an accurate, reliable map that would assist sailors over great distances through often treacherous obstacles.  But the need to overcome this problem was great enough that, relying on their intelligence, education and ingenuity, they developed a solution whose origins baffle modern scholars.&lt;/p&gt;
&lt;p&gt;No aliens required.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/8EhuwY7ZXbQ" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 01 Jun 2010 10:19:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/8EhuwY7ZXbQ/52-no-aliens-required</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/52-no-aliens-required</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/52-no-aliens-required</feedburner:origLink></item>
    <item>
      <title>Applying / Merging Changes From One Git Repository To Another</title>
      <description>&lt;p&gt;&lt;em&gt;This tutorial demonstrates how to apply changes made to a project hosted in one git repository onto a completely separate project in a different git repository:&amp;nbsp;essentially, merging changes between two totally separate git repositories.  If you don't use git, this will likely not interest you much.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Consider two projects that are both managed with git that do not share a commit history of any kind, i.e., one is not a branch of the other.  It may be the case, however, that in real life they have a common ancestry.&lt;/p&gt;
&lt;p&gt;For example, if you have a project in git that you copy into a new git repository, you will end up with two projects that as far as git is concerned are totally separate.  However at the moment of copying they are identical to one another, and over time still share many similarities.&lt;/p&gt;
&lt;p&gt;When changes are made in one repository, you may want an easy way to transfer them from that repository to the other, similarly to the way in which you merge changes from one branch to another.  You can do that with patches.&lt;/p&gt;
&lt;p&gt;We'll call the first project the &amp;quot;source&amp;quot; and the second project the &amp;quot;target&amp;quot;.  The source project is the one in which there are changes you also want in the target project.&lt;/p&gt;
&lt;p&gt;Start by going to your source project's directory.  Use:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git log&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To find the commit you want to create a patch &lt;strong&gt;since&lt;/strong&gt;.  Use the commit that is the one immediately before the first one you want included in the patch (i.e. the commit you choose is &lt;strong&gt;not included&lt;/strong&gt; in the patch).  For instance, if your log looks like this (abbreviated):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;commit 29cebfa985b3621b79b6d462393a91b97fea14bb &lt;br /&gt;Author: Adrian Duyzer &amp;lt;adrian@Macbook-Pro.local&amp;gt;&lt;br /&gt;Date:   Thu May 20 00:00:38 2010 -0400 &lt;br /&gt;fix issue with levels&lt;br /&gt;&lt;br /&gt;commit 8a5cfe37cdc838c055e38a4783c724996a71d15f &lt;br /&gt;Author: Adrian Duyzer &amp;lt;adrian@Macbook-Pro.local&amp;gt;&lt;br /&gt;Date:   Wed May 19 23:27:27 2010 -0400 &lt;br /&gt;freezes and thaws&lt;br /&gt;&lt;br /&gt;commit 5ebe34bcb343a272ffda331db2f30dfffa52240f &lt;br /&gt;Author: Adrian Duyzer &amp;lt;adrian@Macbook-Pro.local&amp;gt;&lt;br /&gt;Date:   Wed May 19 16:15:34 2010 -0400 &lt;br /&gt;notes, date report error fix &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And you want a patch for the commits &amp;quot;freezes and thaws&amp;quot; and &amp;quot;fix issue with levels&amp;quot;, you will want to start with commit 5ebe34bcb343a272ffda331db2f30dfffa52240f, which is the one right before the two that we want.&lt;/p&gt;
&lt;p&gt;In this case, we're dealing with a different series of log messages, where the commit hash immediately before the changes we want is actually 34382279d69e676e7739c9c225ada307a864288b.  Using that commit hash we now proceed to create a series of patches like so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git format-patch 34382279d69e676e7739c9c225ada307a864288b&lt;code&gt; &lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will create a series of patches that are each named according to the particular commit that was created, e.g. like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0001-removed-forgery-protection-from-application-controll.patch &lt;br /&gt;0002-cleaning-up-updating-spawn.patch &lt;br /&gt;0003-new-version-of-spawn.patch &lt;br /&gt;0004-dispatches-are-now-sent-in-the-background-via-spawn.patch &lt;br /&gt;0005-new-help-button.patch 0006-minor-help-text.patch &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each of these files contains the information needed to apply your changes to the other project.  They are not difficult to read and in fact, you can make changes to them if you want (incidentally, Textmate will also automatically syntax-highlight the patch files and I'm sure it's not the only IDE that does so).&lt;/p&gt;
&lt;p&gt;Now, copy these files to the folder where your target project lives, then cd to that folder.&lt;/p&gt;
&lt;p&gt;For each of the patch files you want to:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Check what files are affected by the patch&lt;/li&gt;
    &lt;li&gt;See if you can apply the patch cleanly&lt;/li&gt;
    &lt;li&gt;If you can, apply it&lt;/li&gt;
    &lt;li&gt;If you cannot, you may need to edit the patch to apply it cleanly.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To check what files are affected:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; git apply --stat 0005-new-help-button.patch &lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;To see if you can apply the patch cleanly:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; git apply --check 0005-new-help-button.patch  &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If nothing is returned, you can apply the patch with:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; git apply 0005-new-help-button.patch  &lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Otherwise, you'll get something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;error: patch failed: app/models/mailer.rb:14 &lt;br /&gt;error: app/models/mailer.rb: patch does not apply &lt;br /&gt;error: patch failed: config/forge_config.yml:1 &lt;br /&gt;error: config/forge_config.yml: patch does not apply &lt;br /&gt;error: patch failed: config/routes.rb:33 &lt;br /&gt;error: config/routes.rb: patch does not apply &lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;If you have errors, the entire patch will fail to apply.  However, if you want to apply just the parts that will work, you can do so with the --reject flag:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git apply --reject 0004-dispatches-are-now-sent-in-the-background-via-spawn.patch &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will create files with a .rej extension in the same folder as the files that it failed to patch.  You can find these with:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find . -name *.rej &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Take a look at those files to figure out how to proceed.  Alternatively, just look at the output of git when it complains about stuff.  It should be fairly easy to make the changes you want manually.  Once you're done making those changes, delete the .rej files.&lt;/p&gt;
&lt;p&gt;You can also manually edit the patch files as stated above.&lt;/p&gt;
&lt;p&gt;When I did this, although I'm not sure if this is a best practice or not, each time I successfully applied a patch (or made the adjustments manually), I committed my changes and then moved on to the next patch.  That way, if a patch applied really messily, I had an easy way of determining which files were changed or added (git status) and could revert if needed.&lt;/p&gt;
&lt;p&gt;Incidentally, the more atomic your commits are, the easier this process is, because you can skip patches that you don't want.  For example, you will often get rejected patches for things like configuration file changes, but if those were committed separately, it would not be a problem as you could just skip them.  Yet another reason to create clean commits (with sensible commit messages!)&lt;/p&gt;
&lt;p&gt;When you're done, delete your .patch files. You've successfully patched your app!&lt;/p&gt;
&lt;p&gt;Final tip: you can also create a single patch with all changes in it.  If you use the --reject flag when applying it, this is probably the easiest and fastest way to patch things.  Do this like so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; git format-patch REVISION --stdout &amp;gt; PATCH_NAME.patch &lt;/code&gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/1r4mnPZhStw" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 28 May 2010 07:00:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/1r4mnPZhStw/51-applying-merging-changes-from-one-git-repository-to-another</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/51-applying-merging-changes-from-one-git-repository-to-another</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/51-applying-merging-changes-from-one-git-repository-to-another</feedburner:origLink></item>
    <item>
      <title>Building a Solar System with Raphaël</title>
      <description>&lt;p&gt;Remember the first time you looked at some Assembly code, and you thought, &amp;quot;OMG, WTF is this?&amp;quot; That's kind of how I've felt every time I've looked at SVG markup.&amp;nbsp; So, when I stumbled across &lt;a href="http://raphaeljs.com/"&gt;Rapha&amp;euml;l&lt;/a&gt;, a javascript library that lets you create and manipulate SVG images on the fly, I thought that this might be a good way to finally learn something about this stuff.&lt;br /&gt;
&lt;br /&gt;
SVG (&lt;a href="http://www.w3.org/Graphics/SVG/"&gt;w3&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Scalable_Vector_Graphics"&gt;wikipedia&lt;/a&gt;) stands for &amp;quot;Scalable Vector Graphics.&amp;quot;&amp;nbsp; These are graphics that, rather than being defined on a pixel by pixel basis (&amp;quot;raster graphics&amp;quot;), are instead defined by mathematical equations (&amp;quot;Draw a line from (0,0) to (25,4). Now draw a funky curve to (-12,-8).&amp;nbsp; Now draw a line back to the start.&amp;nbsp; Fill it in with &lt;a href="http://en.wikipedia.org/wiki/Chartreuse_%28color%29"&gt;chartreuse&lt;/a&gt;&amp;quot;).&amp;nbsp; The big problem with raster graphics is that when you try to scale them up, you don't have the information to do so, and you lose quality.&amp;nbsp; With vector graphics, though, you just change the scale of the graph and run the calculations again, and your image is a smooth as butter.&amp;nbsp; SVG markup is a language like html or xml that lets you create all those funky shapes and chartreuse fillings and render it in an html &amp;lt;canvas&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
Rapha&amp;euml;l's super-awesomeness is that it wraps up all of this stuff in javascript, with the following benefits:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;because you are used to javascript, the barrier to entry on SVG is lower&lt;/li&gt;
    &lt;li&gt;SVG elements become objects, and attributes become properties, and this makes them easier and more intuitive to use&lt;/li&gt;
    &lt;li&gt;since you are probably using js to manipulate the rest of your site, why not put all this stuff in the same place?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;
There are a couple of downsides, though.&amp;nbsp; For instance, you are still going to have to learn all the arcane syntax that lets you create paths more complicated than simple shapes, and gradient fills, and all that stuff (remember &lt;a href="http://en.wikipedia.org/wiki/Logo_%28programming_language%29"&gt;Logo&lt;/a&gt; and that damned turtle?).&amp;nbsp; And, if you want to make complex shapes, you had better get some graph paper, because this stuff can get tricky to do in your head.&amp;nbsp; And, since we have introduced another layer of abstraction, SVG features not implemented / improperly implemented in Rapha&amp;euml;l will be unavailable to you (I'm thinking of the &amp;quot;viewport&amp;quot; property in particular, but I could be wrong about this.)&amp;nbsp; Still, those are all arguments you could make about any language/library, I suppose, so maybe that's just being picky.&lt;br /&gt;
&lt;br /&gt;
For my first Rapha&amp;euml;l project, I wanted to pick something that was simple, but still kind of interesting.&amp;nbsp; Around about the same time I discovered Rapha&amp;euml;l, my 5-year-old son started getting into the solar system, and so we have been reading a lot of kids books about the planets and the sun and stuff.&amp;nbsp; So, I figured that I would make him a little solar system in a box that he could play around with.&lt;br /&gt;
&lt;br /&gt;
In creating this project, there were some interesting considerations before I even did any coding.&amp;nbsp; My first thought was that I wanted to build an actual scale model of the solar system.&amp;nbsp; That is, the planets' distances from the sun would be mapped to the same scale as their radii, so that you could get a real sense of their prominence.&amp;nbsp; Taking Mercury as the smallest planet (Pluto is a &lt;a href="http://en.wikipedia.org/wiki/Dwarf_planet"&gt;DWARF PLANET!&lt;/a&gt;&amp;nbsp; Get used to it.) and setting its diameter of ~4880km equal to 1px, I worked out that I would need a canvas 1,845,674px x 1,845,674px in order to fit in the orbit of Neptune.&amp;nbsp; So, my solar system uses two sizing scales, one that scales the planets' distances from the sun, and one that scales their sizes.&lt;br /&gt;
&lt;br /&gt;
My solar system is pretty simplistic.&amp;nbsp; Among other things:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Planets are circular, not elliptical&lt;/li&gt;
    &lt;li&gt;Orbits are circular, not elliptical&lt;/li&gt;
    &lt;li&gt;There are no moons, dwarf planets or comets&lt;/li&gt;
    &lt;li&gt;The Kuiper Belt and the Oort Cloud aren't shown&lt;/li&gt;
    &lt;li&gt;The planets don't start in their current positions.&amp;nbsp; Rather, they are just lined up like an astrologer's wet dream.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, there is a bug in here somewhere.&amp;nbsp; If you speed up the animations, you will notice that the orbits get a little wonky after a few revolutions.&amp;nbsp; Not sure if that is a timing issue, a bug in the code, a bug in Rapha&amp;euml;l or a bug in the browser.&amp;nbsp; If you figure it out, let me know.&lt;/p&gt;
&lt;p&gt;Check it out here:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://factore.ca/experiments/solar_system/index.html"&gt;http://factore.ca/experiments/solar_system/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let me know what you think!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/qc-ImHEfWoA" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 21 May 2010 12:36:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/qc-ImHEfWoA/50-building-a-solar-system-with-rapha-l</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/50-building-a-solar-system-with-rapha-l</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/50-building-a-solar-system-with-rapha-l</feedburner:origLink></item>
    <item>
      <title>Add Search to Ruby on Rails Projects with acts_as_xapian</title>
      <description>&lt;p&gt;I recently built a search in a project using acts_as_xapian, and was quite impressed by the speed of the search, as well as the flexibility in setting things up... once I understood the documentation. &amp;nbsp;&lt;br /&gt;
Here's a summary of what I found. &amp;nbsp;Hope it helps someone!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;How to install xapian and acts_as_xapian&lt;/h2&gt;
&lt;p&gt;You will need to install the xapian engine &lt;a href="http://xapian.org/download"&gt;here&lt;/a&gt; if you don't already have it installed.&lt;br /&gt;
Install acts_as_xapian via script/plugins install http://github.com/frabcus/acts_as_xapian.git and you're good to go.&amp;nbsp; There are other forks of the plugin, and other means to install it, but this is how I did it.&lt;br /&gt;
You'll need to set up the&amp;nbsp; paths to your xapian databases, mine are in environment/xapian.yml&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;In your model&lt;/h2&gt;
&lt;p&gt;Include the following in any models you want indexed.&amp;nbsp;    &lt;br /&gt;
&lt;script src="http://gist.github.com/398884.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
There are several key parameters to specify here.&lt;/p&gt;
&lt;p&gt;&lt;script src="http://gist.github.com/398880.js"&gt;&lt;/script&gt; 	This tells xapian which columns to index. &lt;br /&gt;
&lt;br /&gt;
&lt;script src="http://gist.github.com	/398890.js"&gt;&lt;/script&gt; Here you specify an array of arrays, in the form [column, internal identifier (must be a capital letter), prefix to use in search]. This allows you to search for matches only on a specific field, e.g. &lt;strong&gt;last:smith&amp;amp;first:dan&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Note that the internal identifier must be unique across you application, and cannot be any of the reserved values ('M' &amp;amp; 'I' -- perhaps some others) &lt;br /&gt;
&lt;br /&gt;
&lt;script src="http://gist.github.com/398891.js"&gt;&lt;/script&gt;	 Again, an array of arrays, in the form [column, internal identifier (must be a number), prefix, field type]. This allows you to specify sort order in the returned values.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="http://gist.github.com/398892.js"&gt;&lt;/script&gt; An optional array of associated objects to eagerly load when returning the values from your search.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;In your controller&lt;/h2&gt;
&lt;script src="http://gist.github.com/398893.js"&gt;&lt;/script&gt;
&lt;p&gt;In this case, I'm searching the User model, and have formatted my query to use the prefixes I've set up above in my model.&lt;br /&gt;
&lt;br /&gt;
You can also easily include pagination in your results by using a pagination plugin such as will_paginate, and passing in the pagination values via the querystring.&lt;br /&gt;
&lt;script src="http://gist.github.com/398895.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;In your view&lt;/h2&gt;
&lt;p&gt;Iterate through the collection in @search.results to show the matches.&lt;br /&gt;
You can paginate as follows&lt;br /&gt;
&lt;script src="http://gist.github.com/398899.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Indexing your content&lt;/h2&gt;
&lt;p&gt;You will need to run the xapian rake task to populate your xapian db. &lt;script src="http://gist.github.com/398922.js"&gt;&lt;/script&gt;   Remember that after each change to the xapian settings in your model, you'll need to rebuild the index.    &lt;br /&gt;
&lt;br /&gt;
There it is.  Quick and easy!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/ljUtZomXo0Y" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 12 May 2010 13:25:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/ljUtZomXo0Y/49-add-search-to-ruby-on-rails-projects-with-acts-as-xapian</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/49-add-search-to-ruby-on-rails-projects-with-acts-as-xapian</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/49-add-search-to-ruby-on-rails-projects-with-acts-as-xapian</feedburner:origLink></item>
    <item>
      <title>Earth Friendly Paper and Print Production</title>
      <description>&lt;p&gt;&lt;img alt="Irresponsible Forestry" src="http://factore.ca/system/images/images/63/original/jenns1.jpg?1273609777" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Responsible Foresty" src="http://factore.ca/system/images/images/62/original/jenns2.jpg?1273609739" /&gt;&lt;/p&gt;
&lt;p&gt;
&lt;meta http-equiv="content-type" content="text/html; charset=utf-8"&gt;As print production manager at factor[e] part of my day to day includes maintaining relationships with and sourcing new suppliers for printing and paper etc. Recently I've noticed an increased interest in environmentally friendly print materials from a number of our clients. I've discovered several printers and paper suppliers that offer &amp;quot;sustainable printing&amp;quot; and/or &amp;quot;environmental choices&amp;quot;. But now I feel like I have more questions than answers.      &lt;/meta&gt;
&lt;/p&gt;
&lt;div class="h5"&gt;So I've decided to do some research and to devote my next few blog posts to the exploration of the many areas where eco concerns meet the world of print production. I can't promise to be comprehensive, but I will pass on any demystifying tidbits I find along the way. &lt;br /&gt;
&lt;br /&gt;
Where to start, hmm ... It's such a big subject.&lt;br /&gt;
&lt;br /&gt;
I &lt;a href="http://www.greenprinteronline.com/blog/?page_id=7"&gt;recently read&lt;/a&gt; that the papermaking industry is the third largest polluting industry in the world, right behind oil manufacturing. Although I wasn't able to verify this claim (let me know if you have figures to the contrary), there's little doubt that the industry has a major environmental impact, so I thought I'd start there.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="gmail_quote"&gt;
&lt;div bgcolor="#ffffff" text="#000000"&gt;These days in the world of paper and print, one of the most common acronyms you come across is FSC. You may have seen the FSC logo on packaging in your local grocery store and if you're doing any kind of printing it will probably seem ubiquitous.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;So what is FSC?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I think about 5 or 6 years ago, I remember beginning to hear the term&lt;b&gt; FSC certified &lt;/b&gt;to describe certain papers that were becoming available to designers through our paper merchants. &lt;b&gt;FSC &lt;/b&gt;stands for &lt;b&gt;Forestry Stewardship Counsel&lt;/b&gt;. &lt;br /&gt;
&lt;br /&gt;
Here's the blurb from &lt;a href="http://www.fsccanada.org/about.htm"&gt;FSC Canada's website&lt;/a&gt;...&lt;/div&gt;
&lt;div bgcolor="#ffffff" text="#000000"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;div class="gmail_quote"&gt;
&lt;div bgcolor="#ffffff" text="#000000"&gt;&amp;quot;FSC is an international certification and labeling system that guarantees that the forest products you purchase come from responsibly managed forests and verified recycled sources. &lt;br /&gt;
&lt;br /&gt;
Under FSC certification, forests are certified against a set of strict environmental and social standards, and fibre from certified forests is tracked all the way to the consumer through the chain of custody certification system. The end result is products in the marketplace carrying the FSC 'check-tree' logo. &lt;br /&gt;
&lt;br /&gt;
FSC certification is a voluntary and market-based mechanism for ensuring that our forests are healthy. Consumer demand for FSC-certified products encourages forest managers and owners to become FSC-certified. Independent third-party auditors conduct all FSC certification audits.&amp;quot;&lt;/div&gt;
&lt;div bgcolor="#ffffff" text="#000000"&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class="gmail_quote"&gt;
&lt;div bgcolor="#ffffff" text="#000000"&gt;So essentially, FSC is a watch-dog over the forestry industry. But it only works if consumers demand more environmentally responsible forest management. There are other certification bodies, such as the Sustainable Forestry Initiative Inc. (SFI) and the Programme for the Endorsement of Forest Certification Schemes, (PEFC). But there &lt;a href="http://www.benfieldatt.co.uk/technical_information/environment/the_truth_about_fsc_and_pefc_timber_certification"&gt;seems to be agreement&lt;/a&gt; that FSC represents the &amp;tilde;gold&amp;quot; standard of certification.&lt;br /&gt;
&lt;br /&gt;
Oh, and FSC doesn't just certify paper manufacturers and mills, they also certify printers, but I'll get to that in a later post. &lt;br /&gt;
&lt;br /&gt;
First, here's a link to a simple but effective video that I thought introduced the subject quite well. If you're looking for a reason to pay attention to the FSC designation, you may find it &lt;a href="http://www.secret-life.org/paper"&gt;here&lt;/a&gt; ... . And maybe this kind of awareness campaign explains the growing number of requests from our clients for us to pay attention too.&lt;br /&gt;
&lt;br /&gt;
Stay tuned ... here's my tentative list of future topics:&lt;/div&gt;
&lt;ul&gt;
    &lt;li&gt;... more on Forestry Certification Organizations (a controversial subject)&lt;/li&gt;
    &lt;li&gt;Sustainable Printing&lt;/li&gt;
    &lt;li&gt;Eco Papers&lt;/li&gt;
    &lt;li&gt;Vegetable and Soy Based Inks&lt;/li&gt;
    &lt;li&gt;Waterless Printing&lt;/li&gt;
    &lt;li&gt;Designing to reduce paper waste - working with your printer&lt;/li&gt;
    &lt;li&gt;What do we mean by &amp;quot;environmental choices&amp;quot; - real vs perceived environmental responsibility&lt;/li&gt;
    &lt;li&gt;To print or not to print ...?&lt;/li&gt;
    &lt;li&gt;... and maybe more.&lt;/li&gt;
&lt;/ul&gt;
&lt;div bgcolor="#ffffff" text="#000000"&gt;&lt;br /&gt;
My main goal here is to make more informed choices in our print buying practices. And that will no doubt allow us to make more confident recommendations to our clients. That's the hope anyway.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/NEPngK4rm_U" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 11 May 2010 16:21:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/NEPngK4rm_U/48-earth-friendly-paper-and-print-production</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/48-earth-friendly-paper-and-print-production</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/48-earth-friendly-paper-and-print-production</feedburner:origLink></item>
    <item>
      <title>The Often Forgotten Footer</title>
      <description>&lt;br /&gt;
&lt;p&gt;We all say things like &amp;quot;designed from the ground up&amp;quot;, but I wonder how often that's actually the case when designing websites. When starting a new website project, most designers will start with a very rough wireframe to plot out where the content will reside on the screen. I usually do this on paper to make it quick, and will draw a series of boxes and label them 'header', 'nav', 'main copy', 'pull quote' and so on. I've done this many times for many projects, but noticed that a) I always start from the top, and b) I've never really spent any time thinking about (or even drawing a box for) the footer. &lt;br /&gt;
&lt;br /&gt;
When it comes time to produce the design in Photoshop, I'll throw in a footer, but often it's an afterthought. Sure, it'll include the usual suspects like copyright info, some brief contact info and maybe a text-based mini-nav, but that's about it. &lt;br /&gt;
&lt;br /&gt;
This got me thinking - what is the real purpose of the footer? Does it even &lt;em&gt;need&lt;/em&gt; to be there? Traditionally, I think footers in web design function in a similar manner to the first few pages of a book. In their most basic form, they will tell a user who owns the site, contain some legal information, the date of publishing and direct the user how to get in touch with the company. They might also contain navigation, which would be the equivalent of a table of contents. &lt;br /&gt;
&lt;br /&gt;
Lately though, there has been a trend towards elevating the footer's presence - even celebrating it. Designers have been adding more and more 'stuff' into this often forgotten area of a website. Stuff like social networking links and blurbs, contact forms, photos, maps and even real content have been making their way to the bottom of websites in recent years. Although there is no real &lt;em&gt;need&lt;/em&gt; for this added attention, I really enjoy seeing what some designers have done with this neglected area of a website. And why not celebrate this overlooked territory? &lt;br /&gt;
&lt;br /&gt;
Being a designer, my favourite footer-trend is to use massive graphics at the bottom of a site. We've all been trained to scroll down when scouring through a site, so why not 'reward' the user with a fresh dose of graphics and/or colour? Take a look at the header of Vimeo.com - it's quite simple and unobtrusive.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img alt="vimeo_top" src="http://factore.ca/system/images/images/60/original/vimeo_top.gif?1273084040" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Now scroll all the way down to the bottom of the site and BAM! On your way down you've absorbed some content, saw some neat things,  maybe even clicked a couple of them, but then you reach the bottom and  instead of just scrolling back up or hitting the 'back' button, all that  work is made worthwhile with that whimsical illustration. The copyright  and legal info are all still there, but the main focus of this footer  is that rewarding image.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img alt="vimeo bottom" src="http://factore.ca/system/images/images/61/original/vimeo_bottom.gif?1273084618" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Instead of a 'reward image', another method of making the footer interesting is to seamlessly blend the footer into the content so it becomes difficult to determine where the content stops and the footer starts. This can be a good way to mask the 'boring' bits as actual content and keep the user reading right 'til the end. &lt;br /&gt;
&lt;br /&gt;
Another technique is to use the footer as a sort of 'coles notes' version of the site. When a site as a huge amount of content the footer can be a useful place to summarize the site. I've even found myself skipping the content entirely and just heading down to the footer area hoping to find some brief blurbs, links and the like - something to tell me what the site is all about. &lt;br /&gt;
&lt;br /&gt;
All this to say that I really enjoy this new trend of celebrating the often-forgotten bottom area of a website. And even though we view websites from the top down, having an awesome footer sets a solid foundation and to me feels better proportioned and structurally sound - like a skyscraper or a pyramid. I'm going to make a more conscious effort to place more focus on the footer of the sites I design - to make that space fun and useful - instead of just an afterthought.&lt;/p&gt;
&lt;p&gt;If you want to be inspired by some remarkable footer designs, check out &lt;a href="http://box.mepholio.com/collections/8/recent"&gt;MephoBox&lt;/a&gt; and &lt;a href="http://patterntap.com/tap/collection/footers"&gt;Pattern Tap&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/00UcH27g7Bg" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 05 May 2010 14:37:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/00UcH27g7Bg/47-the-often-forgotten-footer</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/47-the-often-forgotten-footer</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/47-the-often-forgotten-footer</feedburner:origLink></item>
    <item>
      <title>Information Architecture in Two Really Easy Steps</title>
      <description>&lt;p&gt;&lt;strong&gt;Information Architecture&lt;/strong&gt; is a term that gets thrown around by web designers. We like thinking about it, talking about it, and building it into your projects, and it sounds cool. But what is it? Basically, it's how to organize your information. A website is usually a meeting of the minds between you and your designer. Let's have better mind-meetings! Here's how: visualizing your own information architecture.&lt;/p&gt;
&lt;p&gt;Before we start, here's a few things to think on. If you break it right down, information architecture is all about hierarchies. We're looking at the information you have for us - whether it's on an older site, a Word doc, in an e-mail - and figure out how it should all be related. What are the most important parts? What's the content that users are most likely to want? The answers to these questions will be expressed in site structure, visuals, typography and so on.&lt;/p&gt;
&lt;p&gt;Let's get going - you'll need a piece of paper and a pen or pencil.&lt;/p&gt;
&lt;h2&gt;Step 1 - Let's Draw Clumps&lt;/h2&gt;
&lt;p&gt;Let's think about a website. There's the design, and then there's content, right? Nope, sorry. The content is the design. The design is the content. Lots of design with no content is like a cake that's 90% frosting: kind of gross, no nutritional value. Building the content is the most important part of any project, and it's also the core of building an information architecture.&lt;/p&gt;
&lt;p&gt;So: clumps. Think about what should go on the homepage. Don't try to draw a page layout - we're just making a simple list right now. There should probably be contact information, and a tagline (if you have one!) and some paragraphs about your products or services. What else? Maybe some photographs or customer testimonials. Done! That's your homepage clump.&lt;/p&gt;
&lt;p style="text-align: center; "&gt;&lt;img width="189" height="213" alt="" src="http://www.factore.ca/system/images/images/57/original/sitemap1.jpg?1272379643" /&gt;&lt;/p&gt;
&lt;p&gt;Let's make a couple more - let's say you want a Contact page, and an About Us page. Let's make a couple clumps for those, too. Maybe you want to talk about your employees - another clump.&lt;/p&gt;
&lt;p style="text-align: center; "&gt;&lt;img width="434" height="384" alt="" src="http://www.factore.ca/system/images/images/58/original/sitemap2.jpg?1272379733" /&gt;&lt;/p&gt;
&lt;p style="text-align: center; "&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Step 2 - Reach Out and Touch Someone&lt;/h2&gt;
&lt;p&gt;So you've figured out what kinds of content should go on each page. That's great! But how does it all fit together? Websites aren't just pages hanging out - they like making connections. Let's drawn some lines between our clumps. Hmm - &lt;strong&gt;Employees&lt;/strong&gt; seems like maybe it &lt;em&gt;belongs &lt;/em&gt;to &lt;strong&gt;About Us&lt;/strong&gt;. Let's link it up that way.&lt;/p&gt;
&lt;p style="text-align: center; "&gt;&lt;img width="434" height="384" alt="" src="http://www.factore.ca/system/images/images/59/original/sitemap3.jpg?1272379782" /&gt;&lt;/p&gt;
&lt;p&gt;Hey, it's like some kind of website or something. Yup, it's really that easy. By breaking your content apart, you can get a better idea of what works together, what needs its own page, and the relative importance of each piece.&lt;/p&gt;
&lt;p&gt;If you're working with web designers who live and breathe information architecture, two things will happen. One, they'll praise you as the rare gem that you are for undertaking this task; and two, they'll be able to use this information to build a better website.&lt;/p&gt;
&lt;p&gt;It's always beneficial to think about your information like this - as connected resources. Your website isn't a brochure that lives on the internet - it's a method for starting a discussion with your customers. By spending a little time on organization, you can make that discussion better.&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/v7vPP-lynXE" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 27 Apr 2010 10:45:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/v7vPP-lynXE/46-information-architecture-in-two-really-easy-steps</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/46-information-architecture-in-two-really-easy-steps</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/46-information-architecture-in-two-really-easy-steps</feedburner:origLink></item>
    <item>
      <title>The Painful but Essential Process of Imagining Failure</title>
      <description>&lt;p&gt;&lt;em&gt;What I've discovered about business is that it is always easy to find the reasons for failure once failure has been demonstrated.  Unfortunately, by then it's too late.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Four months ago, an independent office supply shop opened up down the street.  They offered the usual products and services you'd expect: office supplies, printing, ink cartridge refilling, and so on.  They sunk a lot of money into computers, high-end printers, and a beautiful, expensively furnished board room available for rent.&lt;/p&gt;
&lt;p&gt;The owners, who were awfully nice, came by our office to introduce themselves.  I hoped they'd be another success story on Locke St., one of Hamilton's most flourishing commercial districts.  And why not?  They were providing valuable services and they'd put a lot of money into their business.&lt;/p&gt;
&lt;p&gt;They cared about their business, and it showed.&lt;/p&gt;
&lt;p&gt;Four months later they've shut down for good.  Four months was all it took to wreck their dream.&lt;/p&gt;
&lt;p&gt;I'm not privy to the decision they made to close their doors, but all signs point to the obvious conclusion that they simply weren't making enough money.&lt;/p&gt;
&lt;p&gt;The problem is they opened on a street that is bustling, but it's bustling with retail stores, restaurants, and hair and beauty salons.  There are only about three offices on the strip, including ours.  Of these, all (I believe) have their own boardrooms, so there goes that expensive boardroom and all the space it takes up.&lt;/p&gt;
&lt;p&gt;Perhaps they also assumed that they'd also get business from people in the neighbourhood who need ink jet refills and paper.  They may have been right that this is needed, but it would seem that they were wrong about how much money it would bring in.&lt;/p&gt;
&lt;p&gt;In other words, it's kind of obvious why their business failed.&lt;/p&gt;
&lt;p&gt;Or is it?&lt;/p&gt;
&lt;p&gt;What I've discovered about business is that it is always easy to find the reasons for failure once failure has been demonstrated.&lt;/p&gt;
&lt;p&gt;Unfortunately, by then it's too late.  Dreams have been dashed and money has been lost.&lt;/p&gt;
&lt;p&gt;I chose this business as an example because it's a simple business and because its failure is recent.  However, the phenomenon of easy-to-find reasons for failure once failure has occurred is very common, including (and perhaps especially) among web startups.&lt;/p&gt;
&lt;p&gt;In fact, it's so common that I think it's important to start facing up to unpleasant truths &lt;em&gt;before&lt;/em&gt; resources are committed.&lt;/p&gt;
&lt;p&gt;I propose a simple method for doing this: &lt;strong&gt;imagine failure&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Imagining Failure&lt;/h2&gt;
&lt;p&gt;Start by picking a sensible time in the future.  A good time might be the date at which your startup capital runs out if your new business is not replenishing it.&lt;/p&gt;
&lt;p&gt;Now, imagine locking up the doors of your office and heading home with the painful knowledge that this was your last day working on what you loved.  Now you've got to sort out the bills, let your investors know its over, and if you've got a family, let them know too.&lt;/p&gt;
&lt;p&gt;Your business has failed.&lt;/p&gt;
&lt;p&gt;Why?&lt;/p&gt;
&lt;p&gt;If you can't answer this question yourself - if you simply can't think of any compelling reason why your business idea is not 100% guaranteed to succeed - you're probably too emotionally invested in your business idea to make rational judgments about it, and you need to find somebody else to talk to.&lt;/p&gt;
&lt;p&gt;If you can, find a stranger who is knowledgeable about your industry who is willing to give you a little of their time.  Set up the business failure scenario, and ask them to analyze it with you.&lt;/p&gt;
&lt;p&gt;You're far more likely, I think, to get an honest opinion about your business idea if you let somebody view it as a failure, for several reasons.&lt;/p&gt;
&lt;p&gt;First, they will feel less of the social pressure to validate your idea based on how you &lt;em&gt;feel&lt;/em&gt; about it.  In other words, if it's just plain stupid, hopefully they'll tell you.&lt;/p&gt;
&lt;p&gt;I sometimes wonder how much money has been lost because people didn't want to hurt someone else's feelings.&lt;/p&gt;
&lt;p&gt;Second, most people are hesitant to make predictions about the future.  We've all seen some crazy ideas succeed, so people are often willing to give ideas the benefit of the doubt before they're put into practice.  That doubt disappears after a proven failure, which is what you're asking them to imagine.&lt;/p&gt;
&lt;p&gt;Third, it changes the tone of the discussion by inhibiting your ability to defend your idea.  You can no longer rely on the assumption that your idea is a guaranteed success, because it's actually an abject failure.  Once the invincible armour of your brilliant idea has been removed, you and your advisor are free to consider the external forces that will affect the future of your business.&lt;/p&gt;
&lt;p&gt;Lastly, this discussion should also help you prepare for what you will do if it turns out that this is more than just a thought experiment and your business really does fail.  You should know when to cut your losses and have a plan in place to deal with failure if it occurs.&lt;/p&gt;
&lt;h2&gt;Rethink&lt;/h2&gt;
&lt;p&gt;By this point, you should have a list of reasons for failure (if you don't, someone is either being incompetent or dishonest, because there is no business idea that is immune to risk).&lt;/p&gt;
&lt;p&gt;It's now up to you to go over these reasons in the most rational, objective way you can.  You should be asking yourself two important questions.&lt;/p&gt;
&lt;p&gt;First, is your business idea viable at all?  Perhaps the list of reasons for failure is so long, or so compelling, that you would really be better off spending your time on something else.&lt;/p&gt;
&lt;p&gt;Second, assuming that your business idea is still viable, what changes can you make to address the points of failure you have identified?  How do you mitigate these risks?&lt;/p&gt;
&lt;p&gt;The great thing is that at this point you haven't spent a penny.  You're free to rethink your idea, plan your defenses against risk and conduct more market research.  In many ways you are now much more likely to succeed.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/H-QWHC18ihI" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 22 Apr 2010 09:21:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/H-QWHC18ihI/45-the-painful-but-essential-process-of-imagining-failure</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/45-the-painful-but-essential-process-of-imagining-failure</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/45-the-painful-but-essential-process-of-imagining-failure</feedburner:origLink></item>
    <item>
      <title>"The OS As App" or "Developing Rails Apps on Windows (The Joyful Way)"</title>
      <description>&lt;p&gt;My situation may be specific, but I doubt it is unique.  At work, I use a Mac Mini to develop Rails apps.  This works well for me:  I love working on Macs, Rails loves working on Macs, and life is good.&lt;/p&gt;
&lt;p&gt;At home, though, it's a different situation.  My old G4 laptop is woefully underpowered, both in terms of processing ability and battery life, and the current state of my bank account prohibits me from replacing it at this moment in time.  The year-old family computer performs well, but is currently running Windows Vista, mostly because my wife uses it for work and, let's be honest, because she is comfortable and happy using it.  So, if I want to write Rails apps at home, I have to find a way to do it on the Windows machine.&lt;/p&gt;
&lt;p&gt;If you develop Rails apps for even a small amount of time, one of the first things you will notice is that you tend to be on the command line a lot.  Assuming ruby and gem are already installed, rails is installed by dropping into a shell, typing 'gem install rails', and watching all the pretty text scroll by.  From there, you will use the command line to: start your Rails app running;  install plugins;  check your Rails code into and out of your version control system;  update your libraries;  and deploy your app to its live home.  If you are uber-hard-core, you might be actually writing your code there too.&lt;/p&gt;
&lt;p style="float: right; width: 300px; padding: 5px; text-align: center;"&gt;&lt;img width="300" align="right" height="203" src="http://factore.ca/system/images/images/56/original/2789840324_04da44367a_b.jpg?1271190770" alt="" /&gt;(Photo courtesy &lt;a href="http://www.flickr.com/photos/pomo/"&gt;katutaide&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Now, playing around in the command line on a Unix-like OS (OS X, Linux, whatever) is a joy.  In contrast, playing around in the command line on a Windows system is like playing in a concrete-covered urban school yard, filled with vandalized play structures, broken glass and heaps of dog turds.  In short, &amp;quot;not a joy.&amp;quot;&lt;/p&gt;
&lt;p&gt;I gave it a try, though, I really did.  I installed ruby on the PC, then set up Rails.  I installed Cygwin (an app that mimics a Unix-style shell on Windows) so that I could use it to install and run git. I tried to get sqlite3 to install with no luck, before I found out that sqlite3 probably &lt;a href="http://stackoverflow.com/questions/515639/ruby-cannot-find-sqlite3-driver-on-windows"&gt;doesn't work with ruby&lt;/a&gt; on Windows right now.&lt;/p&gt;
&lt;p&gt;And then I thought, &amp;quot;Why am I trying so hard to make Windows work like OS X or Linux?  Why don't I just INSTALL LINUX?&amp;quot;  Now, I've been down the dual-boot road before, and I don't like it.  In our house, the computer is on a lot, with my son, my wife and me switching back and forth between logins to play games, check email or develop apps (as the case may be).  Having to log everyone out, restart, make sure my stuff is saved, restart, log my son in, restart, open my files again, etc. seemed like &amp;quot;not a joy.&amp;quot;  But luckily, that's not your only option if you want to run two different OSes on the same computer.&lt;/p&gt;
&lt;p&gt;By using virtualization software, you can create a less-powerful version of your computer that runs on your installed OS, just like any other program.  You fire it up and shut it down when you want, you can leave it running while you switch to another user, you can minimize it, whatever.  The virtual computer is set up with a virtual network connection, and can use your USB connections and optical drives.  On that virtual computer, you can install another OS. (On that OS, I imagine, you could even install the virtualization software and install another OS, but I haven't tried that yet.)&lt;/p&gt;
&lt;p&gt;&lt;img width="300" vspace="5" align="right" hspace="5" height="169" src="http://factore.ca/system/images/images/55/original/screencap.png?1271189713" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;I chose to use &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; as the virtualization software, and &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; as my OS, mostly because they are both free and seem to be very usable and stable.  Setting up VirtualBox was easy, just the usual download a setup exe and run it.  Installing Ubuntu was just as easy.  I downloaded the Ubuntu .iso file, and then created a new &amp;quot;Guest OS&amp;quot; on VirtualBox, using the .iso file as a virtual CD in the virtual CDROM drive.&lt;/p&gt;
&lt;p&gt;After that, it was the usual &amp;quot;fresh OS install&amp;quot; stuff, like checking that I could connect to the internet, running the software updater, and changing the desktop image.  After THAT, I installed the VirtualBox's &amp;quot;Guest Additions&amp;quot; for Ubuntu, which is a collection of software that modifies the guest OS installation so it integrates better with VirtualBox (stuff like automatically changing the display settings of the virtual computer to match the size of the window it's running it, and auto-grabbing the mouse and keyboard when you click on the guest OS).  Finally, I installed ruby, rails, git, the sqlite3 driver for ruby (yay!) and now I'm happy again.&lt;/p&gt;
&lt;p&gt;There are downsides to running an OS on top of another in this way, mostly performance ones.  When you set up the guest OS, you need to specify how much of your memory it is allowed to command, and so that memory is unavailable to the host OS while it is running.  Similarly, you also need to allocate a certain amount of hard-drive space to the guest OS.  But in my case, these aren't that much of a worry.  Ubuntu seems to run fine with the 384Mb of RAM I allocated to it, and web development is mostly text files, which aren't really that big.&lt;/p&gt;
&lt;p&gt;I was very impressed by how easy it was to set this up my system. Being able to run an OS as just another app has allowed me to do things my way, and I am once again finding it a pleasure to develop on my home computer.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/KhOZKJ_e9Kg" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 13 Apr 2010 15:40:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/KhOZKJ_e9Kg/44--the-os-as-app-or-developing-rails-apps-on-windows-the-joyful-way-</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/44--the-os-as-app-or-developing-rails-apps-on-windows-the-joyful-way-</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/44--the-os-as-app-or-developing-rails-apps-on-windows-the-joyful-way-</feedburner:origLink></item>
    <item>
      <title>The future of computing?</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://factore.ca/system/images/images/54/original/computing.jpg?1271182834" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/ZloI2WqPRqU" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 13 Apr 2010 14:20:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/ZloI2WqPRqU/43-the-future-of-computing-</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/43-the-future-of-computing-</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/43-the-future-of-computing-</feedburner:origLink></item>
    <item>
      <title>factor[e] design initiative OBAA finalist video</title>
      <description>&lt;p&gt;This video was displayed at the event and was produced by Creative  Artists Group (C.A.R.S.) Inc.Thanks Bill.&lt;/p&gt;
&lt;p&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10782229&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=10782229&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/10782229"&gt;factor[e] design initiative  OBAA finalist video&lt;/a&gt; from &lt;a href="http://vimeo.com/user3551391"&gt;factor[e] design initiative Inc.&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/bbvQ3uVT7NY" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 08 Apr 2010 13:56:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/bbvQ3uVT7NY/42-factor-e-design-initiative-obaa-finalist-video</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/42-factor-e-design-initiative-obaa-finalist-video</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/42-factor-e-design-initiative-obaa-finalist-video</feedburner:origLink></item>
    <item>
      <title>factor[e] Recognized by Chamber of Commerce</title>
      <description>&lt;p&gt;On March 31, 2010, factor[e] was recognized by the &lt;a href="http://www.hamiltonchamber.on.ca/"&gt;Hamilton Chamber of Commerce&lt;/a&gt; for &amp;quot;Ongoing Contributions To Business Excellence In The City Of Hamilton&amp;quot; as part of their 2009 Outstanding Business Achievement Awards.&lt;/p&gt;
&lt;p&gt;We were nominated in the Communication Technology category, and eventually became one of just two finalists.&lt;/p&gt;
&lt;p&gt;The award ultimately went to the other finalist in the category, &lt;a href="http://www.atrianetworks.com/"&gt;Atria Networks&lt;/a&gt;.&amp;nbsp; We'd like to extend our congratulations to Atria for this prestigious recognition of their accomplishments in the past year.&lt;/p&gt;
&lt;p&gt;We'd also like to thank the Chamber for nominating us for the award and selecting us as a finalist.&amp;nbsp; And of course, a big thanks goes to all of our clients and employees: without you, this kind of recognition would never happen.&lt;/p&gt;
&lt;p&gt;A full list of finalists for 2009 is available from the &lt;a href="http://www.thespec.com/article/744801"&gt;Hamilton Spectator&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/EU-QkDX-oOk" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 06 Apr 2010 15:03:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/EU-QkDX-oOk/41-factor-e-recognized-by-chamber-of-commerce</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/41-factor-e-recognized-by-chamber-of-commerce</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/41-factor-e-recognized-by-chamber-of-commerce</feedburner:origLink></item>
    <item>
      <title>5 Time-Saving Photoshop Tips</title>
      <description>&lt;p&gt;Photoshop is one of those  applications that takes years to master. I've been using it for about 8  years now, and I'm still learning new things, or better methods of  performing a certain task etc.. Here are 5 tips which can boost your  productivity - even if by only a couple seconds at a time.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Draggable Fields&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Instead of typing in a  numeric value in a text field (the text size field, for instance), move  your mouse just to the left of the field and you'll notice that your  cursor now includes a left/right arrow. If you click and drag sideways,  you can adjust the value in that field. This works for most of the text  fields in your palettes - go ahead and give it a try!&lt;/p&gt;
&lt;p&gt;&lt;img align="left" alt="" src="http://factore.ca/system/images/images/48/original/draggable.jpg?1269965613" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Move  a Selection&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
If you've made a selection (either rectangular or  circular), but you're not happy where you placed it's origin, don't  worry - you can move it around. While still holding the mouse button,  hold down the space bar and move it around. By holding down the mouse  button, you can still control the height and width of your selection.  NOTE: This also work's in the OS X Finder's screen capture shortcut  (Command + Shift + 4).&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://factore.ca/system/images/images/49/original/move_selection.jpg?1269965637" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Toggle Through Tools&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Some  tools like the brush, the eraser and the pen have a few tools hidden in  one icon. You can access these easily with your keyboard by pressing  Shift + the letter of the tool you want. So for example, Shift + P will  toggle through the various pen tools.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://factore.ca/system/images/images/50/original/tool_toggle.jpg?1269965655" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Opacity&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
To  quickly alter the transparency value of a layer, simply press a numeric  key while the layer you want to alter is selected. Pressing 4 will  reduce the layer to 40%, pressing 5 to 50% and so on. If you want to  bring your layer back up to 100% (not transparent) press 0. NOTE: you  can also enter exact values by quickly typing in the percentage in rapid  succession.&lt;/p&gt;
&lt;p&gt;&lt;img align="left" alt="" src="http://factore.ca/system/images/images/52/original/opacity.jpg?1269965942" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Frequently-Used Elements&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
To speed up the  design phase, it's a good idea to create a document containing  frequently-used design elements. This allow you to simply drag and drop  these elements into your new design. Feel free to use the one we use,  and add your own social media icons, buttons, tabs and even font styles.  &lt;a href="http://dl.dropbox.com/u/3022833/safari_elements.psd"&gt;Download the PSD here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://factore.ca/system/images/images/53/original/safari_elements.jpg?1269965959" /&gt;&lt;br /&gt;
&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/ATM1ijVo-g0" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 30 Mar 2010 12:20:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/ATM1ijVo-g0/40-5-time-saving-photoshop-tips</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/40-5-time-saving-photoshop-tips</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/40-5-time-saving-photoshop-tips</feedburner:origLink></item>
    <item>
      <title>How I Learned To Stop Worrying And Love The Tablet</title>
      <description>&lt;p&gt;A lot of concern has been expressed by developers about the closed nature of the iPad and its ecosystem.&lt;/p&gt;
&lt;p&gt;Applications that run natively on the device (as opposed to web applications which run in the web browser Safari), are completely controlled by Apple.  You have to purchase them from Apple's app store, and you can't modify them in any way.  Nor can you modify any core part of the operating system, or the device itself, without hacking it.&lt;/p&gt;
&lt;p&gt;This has upset many software developers.  Many (including myself) are unwilling to develop for a platform that requires someone else's approval before people can use their software.  Many also have philosophical objections: the iPad banishes tinkering; threatens open source software; takes away all control from its users and developers, and so on.&lt;/p&gt;
&lt;p&gt;These concerns are not without merit.  However, I believe that regardless of how you perceive Apple's business strategy (and it is a straightforward business strategy, namely vertical integration), the iPad is probably very good for both native application and web developers, although it does carry some risk.&lt;/p&gt;
&lt;h2&gt;The Attention Market&lt;/h2&gt;
&lt;p&gt;Authors and book publishers are realizing that the biggest threat to their livelihoods is not technology - the fear that they're next in line for demolition after the music industry - but the dwindling amount of attention people are paying to books.&lt;/p&gt;
&lt;p&gt;People only have so much free time, and they spend very little of it reading books.  &lt;a href="http://www.washingtonpost.com/wp-dyn/content/article/2007/08/21/AR2007082101045.html"&gt;One in four Americans reads no books at all&lt;/a&gt;, and the others don't read much: of those who do, the median quantity is nine books per year for women and five per year for men (to make it worse for novelists, those figures count religious books like the Bible).&lt;/p&gt;
&lt;p&gt;People do, however, watch a heck of a lot of television.  They also spend a lot of time on the Internet.  Interestingly, in Canada, &lt;a href="http://www.ipsos-na.com/news-polls/pressrelease.aspx?id=4720"&gt;weekly Internet usage just moved ahead of television viewing&lt;/a&gt; for the first time since polling firm Ipsos-Reid started tracking it.&lt;/p&gt;
&lt;p&gt;As time spent on the Internet grows, time spent in other recreational activities diminishes.  Competing for people's attention is a zero-sum game.&lt;/p&gt;
&lt;h2&gt;So What Do Developers Want?&lt;/h2&gt;
&lt;p&gt;We want people to be using our software, whether it's a web application hosted on a server somewhere, or a native application running directly on a device.&lt;/p&gt;
&lt;p&gt;We want to be able to effectively compete against the myriad other activities that people engage in: reading books, watching movies and television, listening to music, and even doing things that don't involve staring at a glowing rectangle.&lt;/p&gt;
&lt;p&gt;That's why the creation and popularization of really compelling tablets is so good for developers.  Tablets are much more suited to becoming part of people's living room activities than regular computers are.&lt;/p&gt;
&lt;p&gt;The iPad is slim, attractive, easy to use on the couch, easy to hand to someone else, good for two-person gameplay, a compelling substitute for magazines - the list goes on.  Any decent competitor to the iPad will share these characteristics.&lt;/p&gt;
&lt;p&gt;That makes the tablet a new vector into the attention market.&lt;/p&gt;
&lt;p&gt;Developers who care about an open ecosystem - the ones who object to developing for Apple's app store - just need there to be a strong alternative to the iPad to cash in on this vector.  So how long before we see a compelling competitor?&lt;/p&gt;
&lt;p&gt;I think we'll see the first of the competitors in 12 to 18 months.  This is a different situation than the iPhone, where strong competitors have only emerged in the last few months, years after the introduction of the iPhone.  In this case, all the ingredients you need for a tablet, such as a screen and an operating system designed for multi-touch, have been developed for phones.  This is one excellent reason for Apple's patent lawsuit against HTC: they are seeking to prevent the launch of an iPad competitor in the near future.&lt;/p&gt;
&lt;p&gt;The biggest risk to developers posed by the way Apple has chosen to develop the iPad is that it will prompt other companies to follow similar business models.  This wouldn't be surprising: Amazon, for example, has taken this approach with the Kindle.&lt;/p&gt;
&lt;p&gt;If every company that chooses to manufacture a tablet follows a strategy as closed as Apple's, developers will have no choice but to either stick purely to web development, or bite the bullet and accept the terms of an app store.&lt;/p&gt;
&lt;p&gt;I think this is unlikely simply because of Google's involvement, along with the powerful financial incentives for other advanced device manufacturers to jump onto the tablet bandwagon.  Google has shown its commitment to a different way of doing business in the smartphone industry by pushing Android as the best alternative to the iPhone OS for smartphone manufacturers that want to go head-to-head with Apple.  Tablets are surely next.&lt;/p&gt;
&lt;p&gt;That means that developers of native applications will soon reap the rewards of a new way to grab the attention of millions of people.&lt;/p&gt;
&lt;p&gt;Web developers, of course, can reap those benefits immediately by developing for Safari on iPad, taking advantage of one of the best implementations of HTML5 features, built on the open-source rendering engine WebKit.&lt;/p&gt;
&lt;p&gt;And just like Apple failed to be the primary beneficiary of the personal computing revolution it helped launch, so it may well fail to be the primary beneficiary of the tablet revolution it is popularizing.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/x7Agg4EYFcE" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 29 Mar 2010 09:15:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/x7Agg4EYFcE/39-how-i-learned-to-stop-worrying-and-love-the-tablet</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/39-how-i-learned-to-stop-worrying-and-love-the-tablet</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/39-how-i-learned-to-stop-worrying-and-love-the-tablet</feedburner:origLink></item>
    <item>
      <title>Thinking about the Process - with Videogames</title>
      <description>&lt;div&gt;You might remember the first time you were dropped into the 8-bit world of Super Mario Brothers. Limited colours, unfamiliar mechanics, threatening turtles. With a little bit of work, you figured it out - how to interact with the world and find out that the princess was, indeed, in another castle.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div style="float:left; padding-right: 15px; padding-bottom:10px;"&gt;&lt;img alt="" src="http://www.factore.ca/system/images/images/46/original/coin.gif?1269527829" /&gt;&lt;/div&gt;
At some point, you bumped the underside of a question block and discovered that some considerate individual had placed coins &lt;em&gt;everywhere&lt;/em&gt;. That coin looked like this: a collection of orangey-yellow pixels. How did you know it was a coin? It made a proper coin sound effect, with animation reminiscent of a coin spinning. It had enough &lt;strong&gt;coin-ness&lt;/strong&gt; to be convincing, even though a real coin looks nothing like this.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div style="float:right; padding-left: 15px; padding-bottom:10px;"&gt;&lt;img alt="" src="http://www.factore.ca/system/images/images/47/original/coin2.gif?1269527915" /&gt;&lt;/div&gt;
That blob of pixels was presented, and accepted, as a coin because it built an idea in the mind of players - a picture that looked more like this - the golden coin archetype.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;How does this tie into design? A large part of what designers think about is user experience. Before pen is put to paper or mouse to Photoshop document, there's planning: how best to communicate the ideas that our clients want to present.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;If we look at these two coins, one exists in the game, and one exists in the mind of the end user. For all of its sophistication, the web is still a nascent medium - we can do a lot in terms of interaction, presentation and thoughtfulness, but there are limitations. As designers, we strive to overcome those restraints. By building the collection of pixels, our goal is to build the idea.&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/F3ZrfPgzvXk" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 25 Mar 2010 10:34:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/F3ZrfPgzvXk/38-thinking-about-the-process-with-videogames</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/38-thinking-about-the-process-with-videogames</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/38-thinking-about-the-process-with-videogames</feedburner:origLink></item>
    <item>
      <title>Battle Royale: Client vs. Vendors</title>
      <description>&lt;p&gt;Thanks for visiting our blog.&lt;/p&gt;
&lt;p&gt;You may notice the post you're looking for isn't here. Upon further  reflection, and a really quick roundtable discussion in the office, we  decided it was really sending the wrong message.&lt;/p&gt;
&lt;p&gt;Sure, it was funny, but I realized I was jumping on the &amp;quot;clients  don't understand design&amp;quot; bandwagon, which is not at all reflective of factor[e]'s actual views on the matter.&lt;/p&gt;
&lt;p&gt;The truth is, clients do understand design.&amp;nbsp; They  have a great grasp on what it takes to run their business, just as we do  for ours. Being able to teach prospective clients a little about what  we can do for them is great, not a source of derision.&lt;/p&gt;
&lt;p&gt;In light of this, what we find we're actually talking about is why this  opinion is so prevalent among designers - a far more interesting  discussion. We'd love to hear your thoughts on it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Update: &lt;/strong&gt;The full initial post as well as a short explanation can be found &lt;a href="http://eimaj.net/sandbox/9"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/hCxU7DUCaZg" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 19 Mar 2010 09:00:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/hCxU7DUCaZg/37-battle-royale-client-vs-vendors</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/37-battle-royale-client-vs-vendors</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/37-battle-royale-client-vs-vendors</feedburner:origLink></item>
    <item>
      <title>2.0</title>
      <description>&lt;p&gt;&lt;img height="137" width="601" src="http://factore.ca/system/images/images/41/original/image1.png?1268424637" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;It started life as a straight-forward, static web site with a reasonably simple design:&amp;nbsp; #wrapper, #header, #content, #footer, done.&amp;nbsp; Then, the client wanted a sidebar.&amp;nbsp; The designer wanted a custom font.&amp;nbsp; You wanted to make it work in IE6. &lt;br /&gt;
&lt;br /&gt;
&lt;img height="162" width="600" src="http://factore.ca/system/images/images/42/original/image2.png?1268424707" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Small changes happened.&amp;nbsp; The client wanted a blog, so you installed WordPress.&amp;nbsp; The side bar got bloated with links, so you turned it into a multi-level menu.&amp;nbsp; The client wanted a new space in the header to run banner ads.&amp;nbsp; The designer wanted rounded corners on the footer.&lt;br /&gt;
&lt;br /&gt;
&lt;img height="227" width="600" src="http://factore.ca/system/images/images/43/original/image3.png?1268424757" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Big changes happened.&amp;nbsp; The client wanted to add a forum and a photo gallery.&amp;nbsp; The designer wanted a semi-transparent background.&amp;nbsp; You still wanted to make it work in IE6.&lt;/p&gt;
&lt;p&gt;&lt;img height="244" width="600" src="http://factore.ca/system/images/images/44/original/image4.png?1268424790" alt="" /&gt;&lt;br /&gt;
&lt;br /&gt;
And then one day, you had an awakening.&amp;nbsp; Maybe you were tracking down a missing semi-colon in a php file, or scrolling through obsolete css classes to find out why that damn link was the wrong colour, or trying to debug some javascript you lifted from a web site somewhere, but you realized that this project was no longer a tightly coded, fast-loading, straight-forward web site and was, in fact, a steaming pile of shit.&lt;br /&gt;
&lt;br /&gt;
What happened next was up to you.&amp;nbsp; Maybe you thought, &amp;quot;All my web sites suck.&amp;quot;&amp;nbsp; Maybe you said, &amp;quot;This client is a jerk, anyway,&amp;quot; and then fixed the bug and went home.&amp;nbsp; Maybe you thought, &amp;quot;Not my problem,&amp;quot; and then left it for someone else to fix.&amp;nbsp; Maybe you got a phone call and forgot all about it.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Maybe you said, &amp;quot;This site should be re-done from scratch,&amp;quot; and then decided it was too much work.&amp;nbsp; Or you were afraid that you would break it.&amp;nbsp; Or you were afraid that the client wouldn't pay for it.&amp;nbsp; Maybe you started to fix it, but got distracted by something else.&lt;br /&gt;
&lt;br /&gt;
Or maybe you got all the people involved in the project together, and talked about the problem, and decided to deal with it.&amp;nbsp; You made a plan, you had some late nights, you fought with your wife, you went over-budget and the client refused to pay the difference - but twelve months later, there was a brand new web site sitting where your dog's breakfast of spaghetti code had been a year earlier.&amp;nbsp; And, to top it all off, it still worked in IE6.&lt;/p&gt;
&lt;p&gt;&lt;img height="172" width="600" src="http://factore.ca/system/images/images/45/original/image5.png?1268424829" alt="" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/zsyyWEp3b3w" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 18 Mar 2010 09:04:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/zsyyWEp3b3w/36-2-0</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/36-2-0</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/36-2-0</feedburner:origLink></item>
    <item>
      <title>Chromatics, Grids and the Golden Section</title>
      <description>&lt;p&gt;I figured that since this is my first attempt at writing a post to our blog (or any blog for that matter) that a natural choice for the subject would track how I entered into this industry. My background is in fine art (sculpture and painting) and I didn't own a computer until I decided to start this company with a few guys nearly 10 years ago.&lt;br /&gt;
&lt;br /&gt;
In art school I got my first chance to use a computer as a means to create art, but it was completely experimental, and in the early days of Photoshop 3.0, before the advent of adjustment layers, actions etc. Layers had just been introduced! Basically, my classmates and I were taken into a room full of Power Macintosh 7100s and shown how to turn it on and start a project in Photoshop - then left alone for hours to tool around. I don't recall anything great coming out of these experiments, but I had a good time.&lt;br /&gt;
&lt;br /&gt;
The interesting thing was that I did get quite a lot of instruction in more traditional applications of media for design and typesetting that tied directly in with my fine arts background. These same techniques have stayed with me, and I still think the same way as I used to when working on a layout, illustration or when art directing.&lt;br /&gt;
&lt;br /&gt;
I find that too often, these traditional methods and old school ways of thinking are lost in modern design.&amp;nbsp; I have a sweet spot for these processes, but over the years I've replaced much of the hand drawn and pasted together layout approaches to project conception with digital methods. Much of the reason for this is just the sheer speed in which you can cobble together ideas and variations - and be able to send something to a client and review directly without having to scan or send hard copies.&lt;br /&gt;
&lt;br /&gt;
Design in my mind is kind of like the great great grandchild of Fine Art: theories and issues that Fine Art had established and solved decades ago are still used today. Chromatics, Grids, and the Golden Ratio are great examples of this. All of these influence how we look at things, and what we perceive as beautiful or pleasing to the eye. Design is everywhere, every day.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Chromatics and Colour Theory&lt;/strong&gt;&amp;nbsp;is how the eyes perceive colour. Colour can trigger emotions, feelings and memories that can influence what the viewer thinks about a layout or design before they even know the subject matter. This can obviously be either a positive or a negative reaction.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;img align="right" style="width: 99px; height: 136px;" alt="" src="http://new.factore.ca/system/images/images/38/original/grid.jpg?1268339097" /&gt;Grids&lt;/strong&gt;&amp;nbsp;are structures made up of a series of intersecting vertical and horizontal axes used to organize content. The grid serves as an framework in which a designer can organize text and images in a rational, easy to absorb manner.&lt;/p&gt;
&lt;p&gt;In the late 19th century in Europe, especially in the United Kingdom, this movement began to separate graphic design from fine art. Piet Mondrian is known as the father of graphic design. He was a fine artist, but his use of grids inspired the modern grid system used today in advertising, print and web layouts.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;&lt;img width="200" height="152" align="right" alt="" src="http://new.factore.ca/system/images/images/39/original/goldensection.jpg?1268339416" /&gt;The Golden Ratio&lt;/strong&gt; - Since the Renaissance (and even earlier), many artists and architects have proportioned their works to approximate the golden ratio - believing this proportion to be aesthetically pleasing. Other names frequently used for the golden ratio are the golden section (Latin: sectio aurea) and golden mean. This theory is said to even describe beauty in the human face.&lt;/p&gt;
&lt;p&gt;According to Jan Tschichold, &amp;quot;There was a time when deviations from the truly beautiful page proportions 2:3, 1:&amp;radic;3, and the Golden Section &lt;img width="150" height="222" align="right" alt="" src="http://new.factore.ca/system/images/images/40/original/Divina_proportione.jpg?1268339457" /&gt;were rare.&amp;quot; Many books produced between 1550 and 1770 show these proportions exactly, to within half a millimetre.&lt;br /&gt;
&lt;br /&gt;
These are only a few traditional ways of thinking that end up as second nature, and you begin to examine everything this way.&lt;/p&gt;
&lt;p&gt;This isn't to say that good design is solely based on these principles, but generally that feeling when you look at something and it just doesn't sit well is possibly because some of these theories were not taken into consideration.&lt;br /&gt;
&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/Fv8eadukyqk" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 11 Mar 2010 14:23:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/Fv8eadukyqk/35-chromatics-grids-and-the-golden-section</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/35-chromatics-grids-and-the-golden-section</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/35-chromatics-grids-and-the-golden-section</feedburner:origLink></item>
    <item>
      <title>Too many words, too little space</title>
      <description>&lt;p&gt;Recently one of our print clients had a dilemma. We had previously designed for them a standard 3 panel/2 fold brochure that was meant to be modified and reprinted several times throughout the year as the information changed. Their budget had already been approved by the powers that be. Then, as often happens in these situations, the content for then next brochure expanded significantly.&lt;/p&gt;
&lt;p&gt;&lt;img align="textTop" alt="Standard 3 Panel Brochure for Rodman Hall" style="width: 550px; height: 413px;" src="http://factore.ca/system/images/images/36/original/3panelBrochure_sm.jpg?1268169219" /&gt;&lt;br /&gt;
&lt;br /&gt;
There was no way we could fit all the text into the original layout without making the type unacceptably small and/or remove most of the images. We would need a larger piece.&lt;br /&gt;
&lt;br /&gt;
The challenge from a production standpoint is that when you stray from a very standard size and number of folds, the cost invariably goes up. And this was not an option.&lt;br /&gt;
&lt;br /&gt;
I quickly consulted my new favourite print production related website, &lt;a href="http://www.foldfactory.com"&gt;www.foldfactory.com&lt;/a&gt; for ideas.&lt;br /&gt;
&lt;br /&gt;
This site provides info on all things related to paper folding. Folding is a critical, yet often overlooked aspect of many printed pieces and, as the site states, getting it right at the planning phase can greatly improve the final outcome. The site&amp;rsquo;s primary offering is a piece of software; a plug-in for InDesign that helps the designer create a print file that mathematically compensates for the dimensionality of the paper when it is folded.&lt;br /&gt;
&lt;br /&gt;
Along with this great tool, foldfactory.com offers an &amp;ldquo;ideas&amp;rdquo; section where you will find videos that demonstrate a slew of various folding styles and options. One of my favourite features, and one that was particularly useful for our client&amp;rsquo;s problem, is that each print sample is identified by degree of difficulty, which helps when you are working within a budget.&lt;br /&gt;
&lt;br /&gt;
We soon found a solution that would not be too difficult for the bindery and would allow us to stay within the original design parameters and print budget. The solution was to increase the size of the piece, choose a lighter paper stock and reduce the quantity slightly. To maintain the design, which included a tear off registration panel, we chose a 3 panel, letter fold with short interior flap. The cost remained the same, even taking into account the increase in mailing costs for the larger size.&lt;br /&gt;
&lt;br /&gt;
In addition, the final size, 10&amp;rdquo; x 7&amp;rdquo;, made this piece stand out from the standard 3 panel brochure; an added bonus.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img align="middle" alt="3 Panel 10&amp;quot; x 7&amp;quot; Brochure with Short Flap for Rodman Hall" style="width: 552px; height: 375px;" src="http://factore.ca/system/images/images/37/original/large-brochure_sm.jpg?1268169299" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/hKHOliw8QW0" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 09 Mar 2010 16:21:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/hKHOliw8QW0/34-too-many-words-too-little-space</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/34-too-many-words-too-little-space</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/34-too-many-words-too-little-space</feedburner:origLink></item>
    <item>
      <title>Easy access control in Rails using CanCan</title>
      <description>&lt;p&gt;A common problem when developing a web application is access control.&amp;nbsp; A great, tidy solution I've found for this when building applications in Rails is &lt;a href="http://github.com/ryanb/cancan"&gt;CanCan&lt;/a&gt;.&amp;nbsp;&amp;nbsp; Rather than spreading permissions and access control logic throughout the application, CanCan centralizes permissions to a single class which gets initialized in the context of the current user and the item being accessed.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Installing CanCan&lt;/h2&gt;
&lt;p&gt;CanCan is available as a gem, so gem install cancan will do the trick. Be sure to include&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;script src="http://gist.github.com/326928.js?file=config.rb"&gt;&lt;/script&gt; &amp;nbsp; in your environment.rb.&amp;nbsp; You also need to have &lt;a href="http://github.com/binarylogic/authlogic"&gt;AuthLogic&lt;/a&gt; (or some other authentication scheme which gives you current_user) installed for this to work.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Defining your permissions Using Cancan&lt;/h2&gt;
&lt;p&gt;All of the permissions are stored in the Ability class -- you simply state which users can do what with what.&lt;/p&gt;
&lt;script src="http://gist.github.com/326926.js?file=ability.rb"&gt;&lt;/script&gt;
&lt;p&gt;You get a user object containing the current_user, which can have roles associated with it.&amp;nbsp; You can then do model specific tests to determine if the user has access to the item.&lt;br /&gt;
&lt;br /&gt;
You simply include load_and_authorize_resource in the controller of the model you want restricted.&amp;nbsp; In this case, my model is called Level.&lt;br /&gt;
&lt;script src="http://gist.github.com/326934.js?file=controller.rb"&gt;&lt;/script&gt;	&lt;br /&gt;
This method will automagically populate a @level variable for your methods (new, edit, show, etc..) which has been run through the Ability class testing for permissions.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Testing permissions in views&lt;/h2&gt;
&lt;p&gt;In your views, you can test access to a resource by simply:&lt;br /&gt;
&lt;script src="http://gist.github.com/326939.js?file=view.haml"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Potential Limitations&lt;/h2&gt;
&lt;p&gt;The only hiccup I've found in using CanCan to lock down access to resources is in the case when there is no model associated with a controller, such as a reports controller.&amp;nbsp; A simple workaround I&amp;nbsp;found was to create a dummy report.rb model in the models folder, which causes CanCan to pick up on it.&amp;nbsp; Does anyone have any other solutions/workarounds for this issue?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/C8HMgD7Lxkw" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 09 Mar 2010 09:34:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/C8HMgD7Lxkw/33-easy-access-control-in-rails-using-cancan</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/33-easy-access-control-in-rails-using-cancan</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/33-easy-access-control-in-rails-using-cancan</feedburner:origLink></item>
    <item>
      <title>Improve Usability by Tapping Into Your Own Experiences</title>
      <description>&lt;p&gt;&lt;img align="left" src="http://imgur.com/39nee.jpg" style="width: 245px; height: 169px; margin: 3px 5px 5px 0px;" alt="" /&gt;Last year, against my better judgement, I joined a ball hockey team.&amp;nbsp; I've always liked hockey, but as a small kid who couldn't skate well and hated mornings, playing it just seemed to be one of those things that wasn't for me.&amp;nbsp; Still, when my friend told me he was starting a team that played on Sunday afternoons and didn't require any skating I figured &amp;quot;why not&amp;quot; and signed up.&lt;br /&gt;
&lt;br /&gt;
I was nervous before my first game.&amp;nbsp; I'm still not a big guy, I hadn't done any meaningful cardiovascular exercise since grade 9 gym class, and despite being pretty much unstoppable at EA Sports NHL video games since 1993, I more or less had no idea how to actually play hockey.&amp;nbsp; Before the game I was told to play defense.&amp;nbsp; When I jumped on the floor for my first shift, heart pounding from nerves, I promptly let a few goals in, got in the way, and was generally terrible.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Play defense&amp;quot; may have been a meaningful instruction from a teammate who had been playing hockey since childhood, but for me it represented a general concept and not much else.&amp;nbsp; I had the idea that I was supposed to help keep the ball out of the net, but I didn't really know how.&lt;br /&gt;
&lt;br /&gt;
As web developers, it's important to remember that terms that are loaded with subtext for us don't always mean as much for our some of our users.&amp;nbsp; It's easy to think of less experienced users as stupid or ignorant, but when I'm working on an application that requires user input, I find the better path is to think back on times when I was out of my wheelhouse and needed a little more information before I knew what to do.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
If my teammates had told me to always stay between the opposing player and our net, lift their sticks to prevent them from receiving a pass, and shove them out of the way when they're parked in front of the net I would have been far more effective and confident from the start.&amp;nbsp; Because they're not very complex instructions, it was just assumed that I knew what I was doing.&amp;nbsp; I did not.&amp;nbsp; In the same way, if we take the time to add a little bit of explanatory text to our sites our users will have more confidence when they use them.&lt;br /&gt;
&lt;br /&gt;
For example, let's consider a signup form.&amp;nbsp; At its most basic, a signup form tends to have four fields:&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Username:&lt;br /&gt;
Email:&lt;br /&gt;
Password:&lt;br /&gt;
Password Confirmation:&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Simple, right?&amp;nbsp; If you're reading this blog post, there's probably nothing remotely challenging about this to you.&amp;nbsp; But imagine for a minute that you haven't signed up for hundreds of sites over the last 15 years and you're just getting starting to get comfortable with surfing.&amp;nbsp; You aren't going to get the implied expectations of those form fields.&amp;nbsp; Let's fix it up to be a little more helpful:&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Desired User Name:&lt;/strong&gt; (Choose a name or nickname to represent you on this site.)&lt;br /&gt;
&lt;strong&gt;Email:&lt;/strong&gt; (Enter your email address.&amp;nbsp; It won't be shared with anyone.)&lt;br /&gt;
&lt;strong&gt;Choose Password:&lt;/strong&gt; (Enter a password to use when you log in.)&lt;br /&gt;
&lt;strong&gt;Confirm Your Password: &lt;/strong&gt;(Type the same password again.)&lt;br /&gt;
&lt;br /&gt;
With a little bit of explanation we're able to make our sign up form much more approachable.&amp;nbsp; In turn, we'll probably see increased signups as we have fewer people being turned away by their fear of doing something &amp;quot;wrong.&amp;quot;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
When you're putting together a web application, don't think about you the web developer.&amp;nbsp; Think about you on your first day of Karate class, you the first time you tried to cook a proper meal, you the first time you home-brewed beer, you the first time you did anything that was outside your natural skill set.&amp;nbsp; You weren't stupid or ignorant, you just didn't have the experience to expand simple words or concepts into their full meaning.&amp;nbsp; Still, with a bit of helpful instruction from someone who knew that they were doing, you probably eventually found success.&amp;nbsp; I'm still no Sidney Crosby at ball hockey, and at this point I'd be happy just to be as good as the girls on the Slovakian women's Olympic team.&amp;nbsp; Still, armed with the knowledge of what I'm supposed to be doing, I can jump into the game with confidence instead of shying away from the experience.&lt;br /&gt;
&lt;br /&gt;
Help your users, and yourself, by taking the extra five seconds to say what you really mean.&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/joDAYgPbRWc" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 25 Feb 2010 10:27:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/joDAYgPbRWc/32-improve-usability-by-tapping-into-your-own-experiences</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/32-improve-usability-by-tapping-into-your-own-experiences</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/32-improve-usability-by-tapping-into-your-own-experiences</feedburner:origLink></item>
    <item>
      <title>Designer/Programmer Harmony: We're Not Always Right (Just Usually)</title>
      <description>&lt;p&gt;Of  paramount importance to designer-programmer harmony is an understanding  within each camp of the other's capabilities. It is not enough for a  designer to know what websites look like in order to design websites,  despite where the bar may appear to currently rest. The designer has to  know what capabilities the programmers have, what features are possible,  what is worth the time and effort and what isn't, and how all of this  can change overnight.&lt;br /&gt;
&lt;br /&gt;
One major area in which this is especially  pertinent is browser support. Countless hours have been spent and are  still spent by programmers squashing bugs and jury-rigging websites to  work in browsers like IE6. However, designers are also affected by  legacy support; newer browsers boast a raft of features that expand  support for everything from transparency to typography. In many  instances, though, especially where clients are using older browsers or  have less web-savvy audiences, these new features must often go unused.  Never mind going from print design to the web -- the real hassle is in  going from a static mockup to a live website. Web developers are  understandably averse to anything that is trivial to create in  Photoshop, but hard to implement in code. This often leads to  programmers making design decisions on their own in order to comply with  older standards.&lt;/p&gt;
&lt;div style="text-align: left;" id="dloi"&gt;
&lt;div style="text-align: left;" id="vpxy"&gt;&lt;img src="http://factore.ca/system/images/images/31/original/feb-post-tim-diagram1.gif?1267032733" alt="" /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To avoid this  nigh-apocalyptic nightmare scenario, designers must be informed not just  of their programmer colleagues' capabilities, but of the limitations  that are often placed on those capabilities. As designers, we expect, or  at least hope, programmers will come to us with design questions. This  is an unreasonable expectation unless we are also willing to make sure  our designs are not impossibly idealistic visions of an alternate  reality in which hard-boiled internet cops arrest browser developers for  refusing to comply with web standards.&lt;/p&gt;
&lt;br /&gt;
&lt;div style="text-align: left;" id="z6lf"&gt;
&lt;div style="text-align: left;" id="xtpb"&gt;&lt;img src="http://factore.ca/system/images/images/32/original/feb-post-tim-diagram2.gif?1267032786" alt="" /&gt;&lt;br /&gt;
It's not all about putting  ideas on the chopping block, though. Designers aren't just responsible  for how a website looks, but also for how it performs. The way things  highlight, react, move, expand and contract, and animate are all within  the designer's scope. New developments in programming often translate  into new features in the designer's toolbox. For example, our website  makes use of animated sliding elements and drop-shadows on text, two  features that are standard features now but would have been impossible  or represented an enormous effort in years past. However, designers can  only implement what they're aware of. Working within traditional  limitations often leads designers to behave conservatively.&lt;br /&gt;
&lt;div style="text-align: left;" id="dpyv"&gt;&lt;img src="http://factore.ca/system/images/images/33/original/feb-post-tim-diagram3.gif?1267032810" alt="" /&gt;&lt;br /&gt;
The best way to foster this  level of understanding is to communicate often and openly, to sit down  together and discuss why this decision was made and why that change was  necessary. Occasionally something may be thrown across the office,  exasperated remarks might be found in the code comments, and designers  may grumble about their layout not being exactly what they had in mind.  But just as designers appreciate a programmer who can slice layouts in  Photoshop and understands the use of leading and whitespace, programmers  respect a designer who can write a style sheet, kill an Actionscript  bug, and refrain, no matter how difficult it may be, from adding drop  shadows to elastic rounded-corner drag-able gradient boxes.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;For  a couple more months, at least.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/FgvRCdGBbNM" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 24 Feb 2010 12:30:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/FgvRCdGBbNM/31-designer-programmer-harmony-we-re-not-always-right-just-usually-</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/31-designer-programmer-harmony-we-re-not-always-right-just-usually-</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/31-designer-programmer-harmony-we-re-not-always-right-just-usually-</feedburner:origLink></item>
    <item>
      <title>Top 5 FREE Apps I Can't Live Without</title>
      <description>&lt;p&gt;&lt;strong&gt;Readability&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you're anything like me, you're easily distracted while reading on the web. I try to stay informed by reading a number of design blogs, cycling publications, music reviews and general news stories. However, I have a very hard time reading anything longer than about 140 characters without being distracted by a flashing ad, a compelling photograph, or another headline altogether (if you've made it this far, you're already more focused than I am). Then I stumbled upon a life-changing browser add-on (bookmarklet) called &lt;a href="http://lab.arc90.com/experiments/readability/"&gt;Readability&lt;/a&gt; which strips out everything but the text of the main content and re-styles it into a much more readable format. There are a number of preset styles to mimic the layout of a newspaper, a novel or an ebook, and you can adjust things like margin size and text size to suit your reading preferences. Once you've done this, simply drag the Readability badge to your browsers bookmark bar, load up any site, click the bookmark and voila! You're cluttered news article has been transformed into a refreshing page of text.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://new.factore.ca/system/images/images/26/original/readability.jpg?1266943233" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Dropbox&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I've tried many internet-based storage solutions over the years, but none has impressed me as much as &lt;a href="http://dropbox.com"&gt;Dropbox&lt;/a&gt;. Dropbox is different than so many others because it's also a filesharing and file sync app. Once installed, you're allowed up to 2GB of storage space which is easily accessible via a special folder on your computer. You can drop files or folders into it and it will instantly sync between any computers you've installed the app on, or access the folder via your own Dropbox URL. Perhaps the best feature of all is the ability to right-click on a file in your Dropbox folder to copy the public URL. You can now share this file or folder with anyone you like even when your computer is turned off. Best of all, each time you refer somebody to Dropbox and they sign up for an account, you receive another 250MB of storage space.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://new.factore.ca/system/images/images/27/original/dropbox.jpg?1266943294" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fave4&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This one is relatively new to me, but after only a week of using it, I don't see myself getting rid of it anytime soon. Instead of my browser opening up to a default Firefox/Google search page (I've never ever bothered to change this), it now opens to a simple screen showing four large buttons of my favourite web applications. Make sure you have cookies enabled, head to &lt;a href="http://fav4.org"&gt;fav4.org&lt;/a&gt;, pick your favourite four websites or services and make it your browser's home page. Simple, clever and beautiful.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://new.factore.ca/system/images/images/28/original/fav4.jpg?1266943333" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Digital Color Meter&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Even though this app's title is spelled incorrectly (here in Canada, we use the Queen's English!), it's an invaluable tool for web designers and developers alike. Instead of opening up an image in Photoshop and then using the eyedropper tool to discover a particular colour value, I find it best to leave this application open at all times, and then Apple+tab to it when you need it. Once running, you simply hover your cursor over the colour in question and you get instant values in Hex, Lab, or a number of other colour formats... accurate down to the pixel. Best of all, it's already installed on every Mac (sorry Windows faithful).&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://new.factore.ca/system/images/images/29/original/digicolour.jpg?1266943368" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adium&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Call me whatever you want, but I refuse to use Facebook. While I've come to accept the fact that the majority of communications among my friends happens through Facebook's instant messenger and email, I feel as though my life is better off without it. I do however still rely heavily upon instant messenger for both work-related and casual conversation, and over the years I've acquired many different chat accounts. &lt;a href="http://adium.im"&gt;Adium&lt;/a&gt; is a simple (Mac) application which brings all of those chat accounts under one application.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://new.factore.ca/system/images/images/30/original/adium.jpg?1266943392" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/053GOLp0k0A" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 23 Feb 2010 11:36:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/053GOLp0k0A/30-top-5-free-apps-i-can-t-live-without</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/30-top-5-free-apps-i-can-t-live-without</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/30-top-5-free-apps-i-can-t-live-without</feedburner:origLink></item>
    <item>
      <title>Going To The Source Of Open Source</title>
      <description>&lt;p&gt;One of the the best ways to improve your programming skills is to study other people's code.&amp;nbsp; When your work revolves around open-source technology, you can study the code you use every day.&lt;/p&gt;
&lt;p&gt;This has several advantages: you get to study code written by the very best programmers out there, you have an excellent idea of the problem it solves, and you gain a deeper understanding of your tools.&lt;/p&gt;
&lt;p&gt;One of those tools is &lt;a target="_blank" href="http://rack.rubyforge.org/"&gt;Rack&lt;/a&gt;, the interface, or middleware, between web servers and many popular Ruby frameworks, including our two favourites, Rails and Sinatra.&amp;nbsp; Rack is an incredible piece of software that has brought an enviable consistency to Ruby web development.&lt;/p&gt;
&lt;p&gt;Last night I was watching Olympic speed skating while sitting on the couch.&amp;nbsp; I took advantage of the interminable delays between races caused by technical issues, damaged ice, and so on, to browse Rack's source code, in particular &lt;a target="_blank" href="http://github.com/chneukirchen/rack/blob/master/lib/rack/request.rb"&gt;the code for Rack::Request&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It wasn't my intention to gain an understanding of the entire file, rather, I was just interested in seeing what I could learn from bits and pieces.&amp;nbsp; This method caught my eye:&lt;/p&gt;
&lt;p&gt;&lt;script src="http://gist.github.com/305855.js?file=a_bit_of_rack.rb"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;This looked like an interesting way of turning text like &amp;quot;text/plain;charset=utf-8&amp;quot; into a hash.&amp;nbsp; Problems like this arise pretty frequently when you're doing development, so I decided to hack this apart.&amp;nbsp; The easiest way to do this, I think, is to turn this bit into a stand-alone file, separate the method chains into new lines, and add a debugger line:&lt;/p&gt;
&lt;p&gt;&lt;script src="http://gist.github.com/305858.js?file=split_up.rb"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;This allows us to step through the code line-by-line to see how content_type is transformed throughout the method.&amp;nbsp; If you're interested, give it a try (just download the file and run it from the command line).&lt;/p&gt;
&lt;p&gt;What I think is especially interesting is line 9:&lt;/p&gt;
&lt;p&gt;&lt;script src="http://gist.github.com/305867.js?file=line_9.rb"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;This use of inject provides a simple and effective way of creating a hash from a pair of other values, in the process transforming them.&lt;/p&gt;
&lt;p&gt;Today as I worked on a project, I found some code I wrote recently that looked like this:&lt;/p&gt;
&lt;p&gt;&lt;script src="http://gist.github.com/305860.js?file=past_interval.rb"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;Given a hash (representing an interval) like {&amp;nbsp;:weeks =&amp;gt;&amp;nbsp;4 }, this will return {&amp;nbsp;:weeks =&amp;gt;&amp;nbsp;-4 }.&lt;/p&gt;
&lt;p&gt;The similarity between this and the code from Rack was pretty self-evident.&amp;nbsp; In both cases, we are creating a new collection containing transformed values from a previous collection.&amp;nbsp; New version of this:&lt;/p&gt;
&lt;p&gt;&lt;script src="http://gist.github.com/305864.js?file=shorter_past.rb"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;For me, this was a compelling example of the utility of reading open-source code: immediate applicability to one's own work, with the reward of better code - and better understanding.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/ctSgF1h57D0" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 16 Feb 2010 14:57:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/ctSgF1h57D0/29-going-to-the-source-of-open-source</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/29-going-to-the-source-of-open-source</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/29-going-to-the-source-of-open-source</feedburner:origLink></item>
    <item>
      <title>Office Awareness</title>
      <description>&lt;p&gt;&amp;nbsp;When it gets busy in the office (and it's always busy in the office) it's easy to lose track of what your fellow workers are working on. Forming ad-hoc teams to work on projects - a great way to get things done and promote project ownership - also causes isolation.&amp;nbsp;&lt;/p&gt;
&lt;div&gt;When you run into this situation, it's frustrating. Not all teams are prioritizing projects in the same way, and what's super-important to you might be bottom of the list for someone else. What's the best way to route around this kind of workflow block?&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;We use a number of methods to try to make sure everybody's on the same page; whether it's for scheduling, workload, current availability, and so on.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul&gt;
    &lt;li&gt;Once a week we have meetings with all high-level stakeholders: what's going on with your teams, trouble spots, etc. This is the time to talk about strategy and the basic business of keeping the company running. This is the high-level overview: it's good to take a step back from the work itself and look at the bigger picture.&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;Project teams meet multiple times over the course of the project - whether to discuss initial direction, clarification when the project moves from, say, static mockups to a functioning site, and more. This is mid-level management: making sure everyone involved with the project knows the details and shares the same overall vision.&lt;/li&gt;
    &lt;li&gt;Whiteboards: get them, love them. Each team within the office has their own big board to track projects, their status, who's responsible and other pertinent information. It's easy just by glancing across the office to see how busy each team is and what they're up to. This is the bottom-level organization - physically keeping tabs on what's going on.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Through a combination of these different levels of management, everybody in the office usually has a pretty good idea of what's up - they have office awareness. More than raw ability or skill, it's this awareness, of being embedded in a larger system, that truly makes an office work smoothly.&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/HkrJmNOZkDA" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 16 Feb 2010 12:32:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/HkrJmNOZkDA/28-office-awareness</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/28-office-awareness</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/28-office-awareness</feedburner:origLink></item>
    <item>
      <title>At Home in the Hammer</title>
      <description>&lt;p&gt;I didn't know what to write about when I realized it was my turn to write a post. I looked through my RSS subscriptions for ideas. I tried thinking about the various things I've learned in the past few months but random code samples didn't really seem interesting enough to warrent a post. While looking out the office window and watching a rented U-Haul moving truck trying to back up down Bold Street the wrong way it hit me. I should write about Hamilton.&lt;br /&gt;
&lt;br /&gt;
Going back two years, I have to admit my initial reaction at the prospect of moving to Hamilton was a negative one. Though, in retrospect, it was a bit of a knee-jerk reaction. I had been living in Toronto for a few years and I loved it. By the time I left I had finally started to settle and figure out how to live the Toronto lifestyle -- aka broke and creative. Hamilton meant I had to start again and I did not relish the prospect.&lt;br /&gt;
&lt;br /&gt;
I moved to Hamilton to take a job with &lt;a href="http://socialmediagroup.com/"&gt;Social Media Group&lt;/a&gt; in Dundas. A year later I found myself working here at factor[e] within walking distance of my Bay Street apartment. In that time I've been warming up to the thought of being here for a while. You might even say I've kind of been looking forward to it. The other day even changed my city on Facebook from Toronto to Hamilton. &lt;br /&gt;
&lt;br /&gt;
So to celebrate my admitting on Facebook that I live in Hamilton I've compiled a small list of things I like about my new city.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.hamilton.ca/ProjectsInitiatives/MarketandCentralLibraryRenos/]"&gt;&lt;strong&gt;Farmers Market&lt;/strong&gt;&lt;/a&gt;: This is one of my favourite parts of Hamilton. It's up the street from my house and open Tuesday, Thursday, Friday and Saturday until 6.&lt;br /&gt;
&lt;br /&gt;
Augusta Pubs: This is one of the great parts of living where I live. There are 5 pubs on Augusta, each of them offering their own charm and all of them within 7 minutes of my house. One night on my way out to watch the Leaf's lose at the &lt;a href="http://www.yelp.ca/biz/cat-nfiddle-hamilton"&gt;Cat 'n' Fiddle&lt;/a&gt; we walked past the &lt;a href="http://www.yelp.ca/biz/the-ship-hamilton"&gt;Ship&lt;/a&gt; where &lt;a href="http://brianborcherdt.net/"&gt;Brian Borcherdt&lt;/a&gt; (of &lt;a href="http://www.holyfuckmusic.com/"&gt;Holy F**k&lt;/a&gt; fame) and &lt;a href="http://www.myspace.com/juliefader"&gt;Julie Fader&lt;/a&gt; were playing that night. So after the game we caught a concert. I thought that kind of night only happened in Toronto.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.facebook.com/group.php?gid=5920392694"&gt;&lt;strong&gt;James St. Art Crawl&lt;/strong&gt;&lt;/a&gt;: I've only actually made it out a few times, but the art scene in Hamilton has some good stuff going on. The art scene isn't limited to one night a month either. I strongly encourage everyone seek out the art community in Hamiton. Just walking up James Street you'll find all kinds of galleries open for business. The &lt;a href="http://www.artgalleryofhamilton.on.ca/"&gt;Art Gallery of Hamilton&lt;/a&gt; always has a few awesome exhibitions as well. &lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://brucetrail.org"&gt;&lt;strong&gt;The Bruce Trail&lt;/strong&gt;&lt;/a&gt;: The valley Hamilton is sitting in is riddled with hiking trails. Having recently adopted a young dog I'm pretty excited about starting to explore the trails more extensively. Bruce Trail Conservancy is also one of &lt;a href="http://factore.ca/portfolio/21"&gt;our clients&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;HYPE:&lt;/strong&gt; HYPE stands for &lt;em&gt;Hamilton Young Professionals and Entrepreneurs&lt;/em&gt;. There seem to be a lot of us in this city. Kitestring is doing an awesome job pulling us all together every month or so for an after work unwinding without work talk. Here's the &lt;a href="http://www.kitestring.ca/holiday-hype-was-happenin/"&gt;video from the first one&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;The future:&lt;/strong&gt; There are a lot of interesting projects on the horizon in Hamilton such as the &lt;a href="http://thespec.com/article/717224"&gt;LRT system&lt;/a&gt; and an encouraging focus on &lt;a href="http://maps.google.ca/maps?f=q&amp;amp;source=embed&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=http:%2F%2Fmaps.google.ca%2Fmaps%2Fms%3Fie%3DUTF8%26hl%3Den%26vps%3D2%26jsv%3D191a%26oe%3DUTF8%26msa%3D0%26output%3Dnl%26msid%3D110606866639509831986.000479200a1ddc1bb2dc7&amp;amp;sll=43.194164,-79.813442&amp;amp;sspn=0.124147,0.308647&amp;amp;ie=UTF8&amp;amp;ll=43.238191,-79.839448&amp;amp;spn=0.46521,1.049194&amp;amp;z=10"&gt;bike routes&lt;/a&gt; in the city.&lt;br /&gt;
&lt;br /&gt;
All in all I'm happy in my new home and I look forward to discovering more of it. Any tips?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/ROn9pcAGK58" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 09 Feb 2010 12:03:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/ROn9pcAGK58/27-at-home-in-the-hammer</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/27-at-home-in-the-hammer</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/27-at-home-in-the-hammer</feedburner:origLink></item>
    <item>
      <title>Claw your way to the top (of search results)</title>
      <description>&lt;p&gt;&lt;img align="left" alt="" src="http://factore.ca/system/images/images/25/original/Picture_7.png?1264191602" style="padding: 0px 15px 5px 0px;" /&gt;I was chatting with a client yesterday and I was telling him about a script I'd written that returns your ranking in Google search engine results for various keywords.&amp;nbsp; Just give it a domain name and a list of keywords and the script takes care of the rest.&lt;/p&gt;
&lt;p&gt;For example, if you're the first result in Google for a keyword, the script will return 1.&amp;nbsp; If you're the fifth result on the second page, the script will return 15 (there are ten results on each page of results on Google by default - the script also ignores entries for Google maps and paid search results, this is purely about organic search).&lt;/p&gt;
&lt;p&gt;My client was intrigued, because he's investing a lot of money in SEO currently.&amp;nbsp; I told him I'd help him out.&lt;/p&gt;
&lt;p&gt;I started work on the project last night.&amp;nbsp; Few things are as satisfying as the rapid development of useful web tools, and that's especially true when you can leverage the strengths of a great programming language (Ruby).&amp;nbsp; I chose the minimal and elegant web framework &lt;a href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt; for handling the web side of things, along with Datamapper and SQLite for data storage.&lt;/p&gt;
&lt;p&gt;I dubbed it &lt;em&gt;Clamber&lt;/em&gt;, because it's not easy climbing in search engine rankings.&amp;nbsp; Brian Potstra whipped up a quick design and we had the app on our server at noon today.&amp;nbsp; I sent my client a link.&amp;nbsp; His response: &amp;quot;It&amp;rsquo;s a great tool - we&amp;rsquo;re always wondering if our efforts and spend is having any benefit and this helps quantify things for sure.&amp;quot;&lt;/p&gt;
&lt;p&gt;We'll be adding more features to the app in the days ahead and may provide access to the tool to our clients once it's a bit more polished.&amp;nbsp; In the meantime, however, if you're curious how you rank in search engine results for various keywords, feel free to contact me and I'll send you a CSV.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here's how:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1. Visit our &lt;a href="/contact"&gt;contact form&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;2. Enter your name and email address.&lt;/p&gt;
&lt;p&gt;3. Begin your message with:&amp;nbsp;&amp;quot;Attention Adrian - re. Clamber&amp;quot; or something similar.&lt;/p&gt;
&lt;p&gt;4. Provide the domain for which you wish to see rankings, and at least 10 keywords that you're trying to rank for, separated by line breaks (feel free to send me up to 100 keywords).&amp;nbsp; Note that the app does not retrieve results past the fifth page of results (rank 50) so please don't send in keywords for which you have no chance of ranking.&lt;/p&gt;
&lt;p&gt;E.g:&lt;/p&gt;
&lt;p&gt;Attention Adrian - re. Clamber&lt;/p&gt;
&lt;p&gt;Domain:&amp;nbsp;google.ca&lt;/p&gt;
&lt;p&gt;Keywords:&lt;/p&gt;
&lt;p&gt;search&lt;br /&gt;
search engine&lt;br /&gt;
local search&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/aDTt7snzt5M" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 22 Jan 2010 15:08:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/aDTt7snzt5M/26-claw-your-way-to-the-top-of-search-results-</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/26-claw-your-way-to-the-top-of-search-results-</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/26-claw-your-way-to-the-top-of-search-results-</feedburner:origLink></item>
    <item>
      <title>New site launch: carguidecanada.ca</title>
      <description>&lt;p&gt;&lt;a href="http://carguidecanada.ca"&gt;carguidecanada.ca&lt;/a&gt; is the online version of Carguide Magazine and a very powerful online resource for researching your next new car purchase. From &lt;a href="http://carguidecanada.ca/posts"&gt;reviews to industry news&lt;/a&gt;, all the latest automotive information can be found at at your fingertips.&lt;/p&gt;
&lt;p&gt;The most exciting element of the site is the &lt;a href="http://carguidecanada.ca/vehicles/compare"&gt;comparison tool&lt;/a&gt;. I wish I could have found one of these when I was looking for a car last spring. This tool allows you to directly compare up to three different cars and provides you with every little specification you could possibly be interested in. From head room to gear ratios, you can compare it all.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://carguidecanada.ca"&gt;carguidecanada.ca&lt;/a&gt; is the most recent in a series of websites we've designed and developed for &lt;a href="http://metroland.com"&gt;Metroland Media Group Ltd&lt;/a&gt;. Like the others,&lt;a href="http://carguidecanada.ca"&gt; carguidecanada.ca&lt;/a&gt; demonstrates Metroland's commitment to compelling content, online innovation and superior design.&lt;/p&gt;
&lt;p&gt;Check it out and let us know what you think!&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="Screenshot of carguidecanada.ca - the Canadian car buyer resource" src="http://factore.ca/system/images/images/23/original/carguide_screenshot.jpg?1264006870" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/Kqyy9ch_dQE" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 20 Jan 2010 13:20:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/Kqyy9ch_dQE/25-new-site-launch-carguidecanada-ca</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/25-new-site-launch-carguidecanada-ca</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/25-new-site-launch-carguidecanada-ca</feedburner:origLink></item>
    <item>
      <title>Useful Resource Sites for Designers</title>
      <description>&lt;p&gt;There are many great sites available that inspire, motivate and teach designers. The following is a list of design-related sites that are great for trend-spotting, design discussion, tutorials and new approaches to graphic design from professionals all over the world.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;Psdtuts+&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; &lt;/span&gt;offers numerous Photoshop tutorials and discussions.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;a href="http://psd.tutsplus.com"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;psd.tutsplus.com&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: rgb(255, 0, 0);"&gt;Abduzeedo&lt;/span&gt; provides inspiration through its tutorials and interview/discussions.&lt;br /&gt;
&lt;a href="http://abduzeedo.com"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;abduzeedo.com&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: rgb(255, 0, 0);"&gt;You the Designer&lt;/span&gt; offers freebies, articles and tutorials.&lt;br /&gt;
&lt;a href="http://www.youthedesigner.com"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;www.youthedesigner.com&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: rgb(255, 0, 0);"&gt;Six Revisions&lt;/span&gt; includes designer &amp;amp; web-based articles and tutorials.&lt;br /&gt;
&lt;a href="http://sixrevisions.com"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;sixrevisions.com&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: rgb(255, 0, 0);"&gt;Design Reviver&lt;/span&gt; offers inspirational articles and design showcases as well as tutorials and freebies.&lt;br /&gt;
&lt;a href="http://designreviver.com"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;designreviver.com&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: rgb(255, 0, 0);"&gt;Fudge Graphics&lt;/span&gt; displays inspirational works as well as tutorials and freebies.&lt;br /&gt;
&lt;a href="http://www.fudgegraphics.com"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;www.fudgegraphics.com&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: rgb(255, 0, 0);"&gt;Colorburned&lt;/span&gt; provides a variety of tutorials and freebies.&lt;br /&gt;
&lt;a href="http://colorburned.com"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;colorburned.com&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: rgb(255, 0, 0);"&gt;HOW Magazine&lt;/span&gt; offers design and business resources, as well as annual competitions.&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;a href="http://www.howdesign.com"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;www.howdesign.com&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;span style="color: rgb(255, 0, 0);"&gt;Smashing Magazine&lt;/span&gt; provides articles, tutorials, and inspiration to web designers and developers.&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;a href="http://www.smashingmagazine.com"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;www.smashingmagazine.com&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: rgb(255, 0, 0);"&gt;Inspired Magazine&lt;/span&gt; showcases tons of inspirational articles and design work.&lt;br /&gt;
&lt;a href="http://www.inspiredm.com"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;www.inspiredm.com&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/AYq71rkuS3g" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 11 Jan 2010 15:51:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/AYq71rkuS3g/24-useful-resource-sites-for-designers</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/24-useful-resource-sites-for-designers</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/24-useful-resource-sites-for-designers</feedburner:origLink></item>
    <item>
      <title>Contract Advertising Position</title>
      <description>&lt;p&gt;factor[e] is seeking an experienced advertising professional to propose, develop, and conduct a marketing campaign with a heavy online focus.&lt;/p&gt;
&lt;p&gt;The campaign will begin online as soon as possible, and will likely extend to traditional media, primarily radio, in the spring.&lt;/p&gt;
&lt;p&gt;Responsibilities include proposal development and estimation, campaign design and development, and campaign management.&amp;nbsp; factor[e] will be responsible for development of creative assets, including branding, logos, ads, websites, associated technologies such as monitoring tools, etc.&lt;/p&gt;
&lt;p&gt;Your hours, contract duration, and compensation will primarily be determined by you, in the proposal you develop.&amp;nbsp; Yes, that means you will be responsible, to a certain extent, for creating your own position.&amp;nbsp; Free-lancers and part-timers are welcome.&lt;/p&gt;
&lt;p&gt;The qualified candidate is experienced with:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;advertising and marketing proposal development&lt;/li&gt;
    &lt;li&gt;social media and viral marketing campaigns&lt;/li&gt;
    &lt;li&gt;messaging and copywriting&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;
To apply for the position, please &lt;a href="/contact"&gt;contact us using our email form&lt;/a&gt; and reference &amp;quot;advertising position&amp;quot;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/nMrdOR6yJVQ" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 05 Jan 2010 15:52:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/nMrdOR6yJVQ/23-contract-advertising-position</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/23-contract-advertising-position</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/23-contract-advertising-position</feedburner:origLink></item>
    <item>
      <title>Designer/Programmer Harmony: Not Just a Myth</title>
      <description>&lt;p&gt;Life in the web game is a lot like Law &amp;amp; Order.&amp;nbsp; Like the criminal justice system, the world of web development is split between two separate yet equally important groups: the designers who create the look and feel of a website, and the programmers who make it work.&amp;nbsp; Actually, that's pretty much the only way it's like Law &amp;amp; Order.&lt;br /&gt;
&lt;br /&gt;
As a web developer I've worked with a number of designers on dozens of websites.&amp;nbsp; Some designers, like my colleagues at factor[e], are experienced in providing everything I need to turn a design into a functioning website.&lt;/p&gt;
&lt;p&gt;However, as the popularity of the web grows and the design industry shifts jobs from the print department to the web department, a lot of designers may find themselves in over their heads as they make the switch from print to interactive design.&lt;/p&gt;
&lt;p&gt;This can be frustrating for members of both camps.&amp;nbsp; Programmers get annoyed when they receive a mockup that leaves a lot of its intention unclear or suggests functionality that doesn't exist or is needlessly complicated.&amp;nbsp; Designers get annoyed when they see their original vision destroyed by the harsh realities of browser compatibility, differing resolutions, and web-only fonts.&lt;br /&gt;
&lt;br /&gt;
In the interest of improving designer-developer relations and improving the quality of websites all around, I'm going to address a couple mistakes that I frequently see coming from less-experienced web designers.&lt;/p&gt;
&lt;h2&gt;Your designs are so edgy!&lt;/h2&gt;
&lt;p&gt;The number one issue I see with designers making the switch from print to web is having an 'edge' to their page.&lt;/p&gt;
&lt;p&gt;Unlike with print, you are designing for a page whose size you don't know.&amp;nbsp; &amp;quot;8 by 11 full bleed&amp;quot; is a fairly simple instruction, but when it comes to web design things get a little more complicated.&amp;nbsp; Your potential users are running a variety of resolutions on a variety of different monitors.&amp;nbsp; Some are widescreen, some are full screen, some are big, some are small.&amp;nbsp; Some are handheld and some are projected on to a wall in a board room.&lt;br /&gt;
&lt;br /&gt;
The background image you selected might just fit perfectly on your 960 pixel wide Photoshop file, but when it's uploaded to the web it will be viewed by people using resolutions much higher than that, and it will look sloppy on their screen.&amp;nbsp; (A quick aside, you should always use pixels as a measurement when you're designing for web.&amp;nbsp; There are no inches on the Internet - except for the ones promised in your spam folder).&lt;br /&gt;
&lt;br /&gt;
Luckily, there are a few easy solutions to this problem.&amp;nbsp; One popular method is to fade the left and right edges of your background picture into a solid colour.&amp;nbsp; This is a good approach if your background image is a single image and not a pattern.&lt;/p&gt;
&lt;p&gt;Another trick is to simply use a background image that can be &lt;a href="http://thedailytv.ca/" target="_blank"&gt;repeated indefinitely&lt;/a&gt; like &lt;a href="http://hamilton365.com/" target="_blank"&gt;a pattern&lt;/a&gt; or a &lt;a target="_blank" href="http://myholidayhomerental.com/"&gt;gradient&lt;/a&gt;.&amp;nbsp; You can even just use a solid colour background - like just &lt;a target="_blank" href="http://flatrockcellars.com/"&gt;using white for something elegant&lt;/a&gt;.&amp;nbsp; It's simple and effective.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="http://factore.ca/system/images/images/22/original/Screen-shot-2009-12-17-at-11.04.17-AM.png?1261066040" alt="" /&gt;&lt;br /&gt;
&lt;em&gt;Two examples of backgrounds - one a gradient, the other a repeating pattern - on sites we designed.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To sum up: &lt;strong&gt;the important thing is to consider what's going to happen with your site when someone resizes the browser window&lt;/strong&gt; well beyond the defined edges of your Photoshop file.&lt;/p&gt;
&lt;h2&gt;Dealing with Dynamic Content&lt;/h2&gt;
&lt;p&gt;It's been said (by me) that web designers live in a fantasy world where every asset has been uploaded, every user-provided image is the same aspect ratio, and all content magically fits into the space provided.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;When you're building a website that has dynamic or user-generated content, this is never, ever the case.&amp;nbsp; Ever.&amp;nbsp; That's why it's important to provide alternatives for when assets are omitted, or when they run long or short.&lt;/p&gt;
&lt;p&gt;A good example of this is the big question mark image that shows up if you haven't uploaded a profile picture on Facebook.&amp;nbsp; In any place where you expect a user to provide an image, you should provide a placeholder alternative as well.&amp;nbsp; A good way to do this is to put it on a separate layer (or layer set) and hide it.&amp;nbsp; (And while we're on the topic of layers and layer sets, I can't stress this enough: name them!&amp;nbsp; You might know exactly what Layer 132 is supposed to be, but the programmer that's slicing your file has no idea.)&lt;br /&gt;
&lt;br /&gt;
Another important thing to note when designing a website with dynamic or user-generated content is that you have little control over the amount of content a user is going to provide on a given page.&amp;nbsp; If you have a design that only works when the content container is a certain height, you can pretty much guarantee that the user or client is planning on entering War and Peace on one of their pages. &lt;br /&gt;
&lt;br /&gt;
A lot of designers that are new to the web game will overlook this issue during the design phase and then try to correct for it by adding interior scroll bars to the content area after the fact.&amp;nbsp; Interior scroll bars (pictured below) are not only woefully out of style, they're also a usability problem because they require the user to place their cursor inside the (often small) content area before their scroll-wheel will work.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="http://factore.ca/system/images/images/21/original/Screen_shot_2009-12-17_at_10.44.51_AM.png?1261065771" alt="" /&gt;&lt;br /&gt;
&lt;em&gt;Interior scrollbar example on a site we did not design.&lt;/em&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;During the design process, it's important to keep in mind that your website will have some very short pages, some very long pages, and some very medium-length pages.&amp;nbsp; If the design only fits for a certain number of paragraphs, you need to go back and make some changes.&lt;br /&gt;
&lt;br /&gt;
The problems I've outlined above are only the tip of the iceberg when it comes to Internet idiosyncrasies, but they are also probably the easiest to remember and rectify.&amp;nbsp; Ultimately, we've found that it's best to address potential problems with a site during the design phase.&amp;nbsp; A great way to ensure disappointment is to consider your design complete without running it by your programmer first to hammer out any issues.&lt;/p&gt;
&lt;p&gt;I realize this article places a lot of responsibility on designers, so stay tuned for our design department's response!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/VuvfVXiS0HU" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 17 Dec 2009 10:44:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/VuvfVXiS0HU/22-designer-programmer-harmony-not-just-a-myth</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/22-designer-programmer-harmony-not-just-a-myth</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/22-designer-programmer-harmony-not-just-a-myth</feedburner:origLink></item>
    <item>
      <title>Free Fonts That Don't Suck</title>
      <description>&lt;p&gt;We all know where to find free fonts on the web these days, but it's actually quite difficult to find &lt;em&gt;good quality&lt;/em&gt; fonts. While sites like www.dafont.com, www.fontriver.com and www.1001freefonts.com may actually end up offering you that unique or eccentric font you're looking for, as a self-professed type-nerd, I find that more than 95% of the fonts offered on these free font sites are quite terrible. And the time it takes to scrounge through all the rubbish hardly makes it worth the time. What's more, even if you do find a half-decent font, more often than not they're only licensed to be used for personal work.&lt;br /&gt;
&lt;br /&gt;
Enter &lt;a href="http://www.fontsquirrel.com/" target="_blank"&gt;Font Squirrel&lt;/a&gt;. Developed and curated by fellow type-nerds, this fairly new site aims to offer only high-quality (read: well-designed, by real type foundries and type designers) fonts for design professionals. From the Font Squirrel site: &amp;quot;Font Squirrel is your best resource for FREE hand-picked, high-quality, commercial-use fonts. Even if that means we send you somewhere else to get them.&amp;quot;&lt;/p&gt;
&lt;p&gt;While the site is still in it's infancy, already there are over 240 fonts. That may not seem like much compared to the 1,000+ fonts available on other free font websites, but remember these are high-quality fonts. I've been browsing through the many categories on offer for a couple weeks now, and overall I'm very impressed with what I see. Whereas the percentage of decent fonts on most of the other free font sites has been less than 5%, I'd say that percentage is higher than 80% on Font Squirrel. It's that good.&lt;br /&gt;
&lt;br /&gt;
Icing on the cake? Yes, there's that too. If you design for the web, you most certainly know what a giant pain-in-the-arse it can be to embed non-web fonts into your pages. There are many hacks, but no real solutions. With most of the fonts available on Font Squirrel, you also get an @font-face kit which includes 4 font formats, CSS and HTML code.&lt;/p&gt;
&lt;p&gt;@font-face is a simply a CSS rule that allows web designers and developers to reference fonts not installed on end user machines without finicky flash replacement or glitchy javascript. Read more about this cheery new tech &lt;a href="http://hacks.mozilla.org/2009/06/beautiful-fonts-with-font-face/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href="http://www.fontsquirrel.com/"&gt;Font Squirrel&lt;/a&gt; and be impressed. Very impressed. &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img width="580" height="442" alt="" src="http://factore.ca/system/images/images/19/original/Picture_1.png?1259614355" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/AFN52bxFGqY" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 30 Nov 2009 15:49:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/AFN52bxFGqY/21-free-fonts-that-don-t-suck</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/21-free-fonts-that-don-t-suck</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/21-free-fonts-that-don-t-suck</feedburner:origLink></item>
    <item>
      <title>Reflections on the Office Dog</title>
      <description>&lt;p&gt;In our office, we have a colleague who frequently falls asleep on the job, steals others' lunches and randomly yells at passers-by on the street.&amp;nbsp; While this type of behaviour would typically not be tolerated in a busy workplace such as ours, these antics have come to be accepted and almost expected of this individual. The colleague of whom I am speaking is our office dog, Shogo.&lt;br /&gt;
&lt;br /&gt;
Shogo is an enthusiastic, happy black lab mix who spends the majority of his days at work with his owner, Jenn. He's a very friendly animal, and aside from the occasional fit of hysterics when faced with an intruding courier, very quiet and well behaved.&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&lt;img alt="" src="http://factore.ca/system/images/images/17/original/shogo_trimmed.jpg?1259338557" style="margin-left: 45px;" /&gt;&lt;br /&gt;
&lt;br /&gt;
I've never worked in an office where a pet was present, but I've come to really enjoy the levity Shogo brings to the mood in our workplace.&amp;nbsp; When things get to be a bit much around the office, a quick game of keep-away with long dog (Shogo's stuffed friend) always puts things in perspective, and affords everyone a good laugh. &lt;br /&gt;
&lt;br /&gt;
This got me to wondering how commonplace animals in the workplace actually are.&amp;nbsp; I got used to seeing dogs in the workplace of smaller companies like ours when I was living in France.&amp;nbsp; Most every small business around us had a dog or two happily dozing away the workday.&amp;nbsp; A quick google brought back many examples of companies who are pet friendly and encourage their employees to bring to their pets to work.&amp;nbsp; &lt;a href="http://investor.google.com/conduct_dog.html#II"&gt;Google is one of them&lt;/a&gt; (although they discriminate against cats).&lt;br /&gt;
&lt;br /&gt;
Pets have long been known to have a positive impact health-wise on their owners, and it seems that many of the benefits also translate to the workplace.&amp;nbsp; In a recent survey conducted by the pet industry group (APPMA), 73 percent of the companies reported increased productivity thanks to their pets in the workplace.&lt;/p&gt;
&lt;p&gt;Remarkably, a further 27 percent of the participating companies also recorded a decreased absenteeism rate. 53 million Americans believe having pets in the workplace decreases absenteeism and 46 million people who bring their pets to the workplace work longer hours.&lt;/p&gt;
&lt;p&gt;&lt;img align="middle" alt="" src="http://factore.ca/system/images/images/18/original/shogo_cone.png?1259338595" style="margin-left: 45px;" /&gt;&lt;br /&gt;
&lt;br /&gt;
I don't know that Shogo is making any of us work longer hours, but he makes the time we do spend at the office more pleasant.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&lt;strong&gt;UPDATE: &lt;/strong&gt;We are very pleased to announce that Shogo has been promoted to management!&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="http://factore.ca/system/images/images/20/original/IMG_0035.jpg?1260386379" style="width: 345px; height: 276px;" alt="" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/97WrHTTFh7g" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 27 Nov 2009 11:12:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/97WrHTTFh7g/20-reflections-on-the-office-dog</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/20-reflections-on-the-office-dog</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/20-reflections-on-the-office-dog</feedburner:origLink></item>
    <item>
      <title>Design Local - 2</title>
      <description>&lt;p&gt;Our second page in the Design Local series is up!&amp;nbsp; This one looks at &lt;a href="/design-local/hamilton-web-design"&gt;Hamilton web design&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It would surprise many outsiders to learn that there is a strong and active creative community here in Hamilton.  This city produces more than its fair share of musicians, artists, and creative people of all kinds.&lt;/p&gt;
&lt;p&gt;We also have a well-established industrial and manufacturing base (which we are much better known for).  These two strengths - creative and artistic, and engineering and scientific - are the perfect combination for leading-edge web design, because developing for the Internet requires both creative and engineering skills.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Go take a look!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/SBI9z2HW-zM" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 23 Nov 2009 10:40:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/SBI9z2HW-zM/19-design-local-2</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/19-design-local-2</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/19-design-local-2</feedburner:origLink></item>
    <item>
      <title>Print Case Study - Muscari Atelier</title>
      <description>&lt;p&gt;&lt;strong&gt;Identity, Design and Printing of Business Cards, Note Cards, Event Invitations and Website&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When you step into Muscari Floral Atelier you are transported; your senses are subtly awakened. It's an exquisite space. To complement that feeling, the owners of Muscari wanted a distinct and sophisticated look for their new identity. We were excited to help our new Locke Street neighbour get off to a great start with their clientele. So we set to work getting all the particulars.&lt;/p&gt;
&lt;p&gt;First, our design studio created a logo to reflect the elegant, exotic feel of the shop and the beautiful floral designs within. The next step was to produce business cards and this brought the designers together with the print production team.&lt;/p&gt;
&lt;p&gt;We wanted to produce luxurious business cards and note cards that reflected the atmosphere of the shop and presented a stunning first impression to their clientele. This mandate gave us the opportunity to explore using a distinctive one colour ink and foil stamping treatment as a means to create a rich and mysterious look for their print materials.&lt;/p&gt;
&lt;p&gt;We worked closely with the printer to choose a high quality uncoated stock and by printing both the business cards and the notecards in the same print run, it was possible to make full use of a minimum order of paper from the mill and stay within their budget and without much paper waste.&lt;/p&gt;
&lt;p&gt;&lt;img width="341" height="229" alt="" style="float: left; padding-right: 15px; padding-bottom: 20px;" src="http://www.factore.ca/system/images/images/11/original/MuscariCards.jpg?1257202509" /&gt;What we came up with is a very simple card: a double hit of rich black ink on one side while the opposite side was left white, unprinted except for the contact info printed in black.&lt;/p&gt;
&lt;p&gt;On the black side the Muscari logo was hot foil stamped using a black metallic foil. The foil stamping gives the logo a slight debossed appearance on a creamy uncoated Strathmore Writing - Wove finish cover stock.&lt;/p&gt;
&lt;p&gt;In consultation with the printer we decided to use a spot dull varnish overall except where the foil stamping would be hit. This gives the black a very matte look and makes the foil &amp;ldquo;pop&amp;rdquo;, as well as increasing the longevity of the cards.&lt;/p&gt;
&lt;p&gt;The result is one of our favorite identity packages. Muscari was thrilled and so were we.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/1lmCXGd32kE" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 02 Nov 2009 17:26:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/1lmCXGd32kE/18-print-case-study-muscari-atelier</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/18-print-case-study-muscari-atelier</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/18-print-case-study-muscari-atelier</feedburner:origLink></item>
    <item>
      <title>Design Local</title>
      <description>&lt;p&gt;You've heard of the Eat Local movement, a movement that champions the enormous benefits to buying your food from local producers. Eat Local helps the environment, improves your personal health and the health of your community, and provides critical support to farmers and agricultural workers.&lt;br /&gt;
&lt;br /&gt;
factor[e] is proud to present &lt;a href="/design-local"&gt;&lt;strong&gt;Design Local&lt;/strong&gt;&lt;/a&gt;, Hamilton, Ontario's homegrown initiative to promote design from the Hammer.&lt;/p&gt;
&lt;p&gt;Over the weeks and months ahead we'll be featuring examples of homegrown design on our website, from print to web to video to logos and branding.&amp;nbsp; We've started by taking a look at &lt;a href="/design-local/hamilton-print-design"&gt;Hamilton print design&lt;/a&gt; and what that can offer you and your business.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/ST-qF8iV1xM" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 21 Oct 2009 10:24:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/ST-qF8iV1xM/17-design-local</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/17-design-local</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/17-design-local</feedburner:origLink></item>
    <item>
      <title>Thinking Functionally on the Web</title>
      <description>&lt;p&gt;&amp;nbsp;A large part of our business at factor[e] is designing and developing websites. Obviously, when we talk about web design, we have to consider the visual impact of the site - 'how it looks' is a large part of how it's received - and mostly, both clients and the public think of design this way. We always try to bring something else to the table: the design of how it works.&lt;/p&gt;
&lt;p&gt;Making sure the site performs as a cohesive whole is just, if not more, important than the appearance of the site. While working away in Photoshop, we always try to remain aware that we're not designing a page, we're designing one element of a larger entity.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This aspect of design is often glossed over. Ultimately, what we, as designers, should be thinking about is not designing a site, but designing a system to ensure smooth and fulfilling interaction with the end user.&lt;/p&gt;
&lt;p&gt;As we move forward in terms of internet technologies, especially with modern frameworks and extensions that drastically expand the functionality of the web, websites are moving from being simple pages to full-blown applications. Because of this, the focus on interaction has become more important. We have to consider the results of user actions (and reactions) to dialogs, asynchronous actions and more.&lt;/p&gt;
&lt;p&gt;This aspect of what we do is largely invisible to our clients and the end users of the sites we build, other than as a sense of a site 'working right'. How can we talk about the value of designing interactions as well as the look and feel of a site?&lt;/p&gt;
&lt;p&gt;An approach we use at factor[e] is one of the oldest forms of human interaction, storytelling. When we're talking to a client about their site, we describe complex functionality in terms what will happen, what the experience of the site will actually be for a user. This almost always excites a client much more than simply showing static comps - they're drawn in and made a participant. By understanding how the site will work, rather than simply how it will look, they understand operational decisions we've made and how the end result will shape user experience.&lt;/p&gt;
&lt;p&gt;Looking to the future, thinking functionally will only become more important to us as a company and to the industry as a whole. It's important to maintain our focus on this hidden side of web design.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/Pr7EoF7t4s0" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 19 Oct 2009 11:04:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/Pr7EoF7t4s0/16-thinking-functionally-on-the-web</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/16-thinking-functionally-on-the-web</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/16-thinking-functionally-on-the-web</feedburner:origLink></item>
    <item>
      <title>The Challenge of Creating Successful Web Applications</title>
      <description>&lt;p&gt;These days, everyone has an idea for a web application.  The stunning success (and stunning valuation) of simple services like Twitter has made a lot of people figure the social media website bandwagon is a pretty easy one to jump onto.&lt;/p&gt;
&lt;p&gt;We're a company that develops web applications, so we get approached with ideas for sites pretty frequently.  Personally, I love talking about business and website ideas, whether the ideas are properly fleshed out or not, and whether money exists to build them or not.  Some great projects I've worked on have been born that way.  However, sometimes I come across certain proposals which demonstrate an extraordinary level of unfounded optimism.&lt;/p&gt;
&lt;p&gt;These proposals confidently assert they will be as popular as Facebook, or Twitter, or some other super-popular site, or they claim some special characteristic or combination of features that will make them sure to catch on with a huge swathe of social media users.  They are &lt;em&gt;sure winners&lt;/em&gt;, great ideas that just need a technical team for execution.&lt;/p&gt;
&lt;p&gt;It's just not that easy.&lt;/p&gt;
&lt;p&gt;In &lt;em&gt;The Stuff of Thought&lt;/em&gt;, author Steven Pinker discusses the origin of new words (neologisms).  He talks about the difficult time word-inventors have when they try to popularize their inventions:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Even when a coiner pulls out all the stops to disseminate a new word to fill the lexical gap, an ungrateful populace will usually ignore him.  In the year 2000, the conceptual artist Miltos Manetos noticed that the English language lacks a word for the high-tech aesthetic in product design, as in &lt;em&gt;The new iPod Nano is really X&lt;/em&gt;, and a word for the genre of technologically driven artistic media such as video art, computer graphics, and digital animation, as in &lt;em&gt;Our gallery showcases new artists working in X&lt;/em&gt;. Manetos suggested that a single word, used as an adjective and as a noun, could fill both gaps.  In the spirit of the movement he was naming, he hired Lexicon Branding (the company that dreamed up &lt;em&gt;Pentium, Celeron, Zima, Vibrance, Optima,&lt;/em&gt; and &lt;em&gt;Alero&lt;/em&gt;) to generate candidates with their computer algorithm and staff of linguists.  From the list they provided him, Manetos chose &lt;em&gt;neen&lt;/em&gt;, which means &amp;quot;now&amp;quot; in old Greek.  He rolled out the word at a packed event in a major New York art gallery, complete with journalists, critics, and a panel of commentators, including me.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pinker predicted the word would fail, and it did.  This was an easy prediction to make, he writes, &amp;quot;because most conspicuous coinages fail no matter what.&amp;quot;&lt;/p&gt;
&lt;p&gt;The same goes for many new websites.  The combination of factors that lead to a super successful website are not easily duplicated.  The luck component is not capable of duplication at all.&lt;/p&gt;
&lt;p&gt;Facebook is the largest social networking site in the world, but it was not even close to the first social networking site invented: other large sites like Friendster and Myspace launched before it, and those are just the big ones.  No doubt there were countless other sites that were based on the same or similar ideas that launched before Facebook did but failed to catch on (a colleague here at factor[e] built something similar for his high school years ago).&lt;/p&gt;
&lt;p&gt;Many of the ideas behind these failed sites were just as good as the ideas behind the ones that succeeded.  The difference in outcomes can be boiled down to execution and luck.&lt;/p&gt;
&lt;p&gt;What does this mean for your web application idea?  I think it means three things:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1) Refine Your Model&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The book &lt;em&gt;The Opposable Mind: How Successful Leaders Win Through Integrative Thinking&lt;/em&gt; by Roger Martin is about the ability of great executives to examine multiple models for business strategy, and rather than choosing one of them and accepting the trade-offs that are inherent in choosing an existing model, go on to creatively synthesize a new model that becomes wildly successful.&lt;/p&gt;
&lt;p&gt;The book compellingly illustrates that any particular model we have of reality &lt;em&gt;cannot&lt;/em&gt; be an entirely accurate representation of what is really going on, since it is just a model.  Our brains are simply not capable of capturing reality precisely.  Martin demonstrates the point: close your eyes, he says, and try to picture the room you are sitting in down to the last detail.  When you open your eyes you will find that you have missed things.&lt;/p&gt;
&lt;p&gt;It takes a serious commitment to come up with a truly winning model for a website.  Most models that people have of what will make money and drive traffic online are not accurate.&lt;/p&gt;
&lt;p&gt;Talk to a knowledgeable web professional about your idea and take their advice seriously.  There's always a chance that your idea is very good but that they won't recognize it, in which case, talk to someone else.  In many cases, however, they'll be able to provide valuable guidance, such as whether a similar web application exists already, or what you should do next.  (Naturally, we think we'd be good people for you to talk to!)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2) Make Your Own Luck&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To a certain extent, you can make your own luck by executing well, iterating rapidly, and seizing on opportunities.  Unless you're already a top-notch web developer, good execution means partnering with a good team.  It doesn't matter how good your idea is, if it doesn't look good and perform admirably, people will move on and they won't come back.&lt;/p&gt;
&lt;p&gt;You're going to need a solid marketing plan, and you're going to have to stick with it.  It's not going to be easy convincing the many people who surf just a few of the same sites every day to start adding your site to the list of sites they visit.  A great site, based on a great model, will go a long way.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3) Be Realistic&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The combination of factors that lead to the skyrocketing success of a site like Facebook or Twitter are as rare as winning the lottery.  Buying lottery tickets is not an investment strategy.  Relying on the assumption that your web application is destined for superstar success is a good way to wind up disappointed.&lt;/p&gt;
&lt;p&gt;Instead, start by creating a plan to make you (and your employees) salaries that you can live on comfortably.  After all, if your site is making enough money to pay your mortgage and your bills, it is already more profitable than Twitter!&lt;/p&gt;
&lt;p&gt;By focusing on a realistic, manageable goal, you're less likely to face disappointment later.  You'll be able to show a return on investment sooner and the case for further investment will become easier to make.&lt;/p&gt;
&lt;p&gt;And if you develop the right product, who knows, you may find yourself at the helm of a skyrocketing success.  There is certainly plenty of room for innovative companies online &amp;ndash; perhaps more than ever before.  In fact, this is one of the best times for startups in years.  Good luck!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/EXr5-U4NVdo" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 06 Oct 2009 01:45:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/EXr5-U4NVdo/15-the-challenge-of-creating-successful-web-applications</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/15-the-challenge-of-creating-successful-web-applications</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/15-the-challenge-of-creating-successful-web-applications</feedburner:origLink></item>
    <item>
      <title>Comments are go!</title>
      <description>&lt;p&gt;I've been with factor[e] for almost five months and I'm now fully into the swing of things. When I arrived I was thrown head first into learning Rails, Ruby, Haml and jQuery and I have to say I'm loving it. I've also been working a lot with &lt;a href="/our-products/forge"&gt;Forge&lt;/a&gt;, our &lt;a href="/our-products/forge"&gt;content management system&lt;/a&gt;. Planning has already begun on Forge 3 and it's looking like it's going to be a powerful package.&lt;br /&gt;
&lt;br /&gt;
Shortly after my arrival here Adrian suggested that I look at creating a social media strategy for factor[e]. I wrote a few reports outlining some suggested uses and best practices for a number of platforms. This was followed up by a list of next steps. As we find time in our busy schedules we'll slowly be hacking away at those steps.&lt;/p&gt;
&lt;p&gt;Today's step is &lt;a href="http://feeds.feedburner.com/factore"&gt;RSS&lt;/a&gt; and comments on our blog as well as an update to the archive section. We're going to start posting a little more frequently too. Stay tuned for biweekly posts about some of the back room discussions, ideas, research and shenanigans. All filtered for public viewing of course.&lt;br /&gt;
&lt;br /&gt;
We'll also be keeping everyone in the loop as we launch projects. We've always got a pile of projects on the go and lately we've been launching some big ones. Check out our &lt;a href="http://factore.ca/portfolio"&gt;new portfolio&lt;/a&gt; to see some of the projects that are already out there.&lt;br /&gt;
&lt;br /&gt;
There will be lots more to come so stay in touch!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/roqaG46lAm0" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 21 Sep 2009 10:36:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/roqaG46lAm0/14-comments-are-go-</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/14-comments-are-go-</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/14-comments-are-go-</feedburner:origLink></item>
    <item>
      <title>ProfitnessProgram.com Launched</title>
      <description>&lt;p&gt;&lt;a class="forge-inserted-thumbnail" rel="zoom" title="Profitness Program" href="/images/0000/0029/Picture_3.png"&gt;&lt;img style="margin: 5px 15px 15px 0px; float: left;" src="/images/0000/0029/Picture_3_thumb.png" alt="" /&gt;&lt;/a&gt;  The &lt;a target="_blank" href="http://profitnessprogram.com"&gt;Profitness Program&lt;/a&gt; is an industry-leading personal training sales system and we're happy to have lent a hand getting the word out with their new look, logo and website.&lt;/p&gt;
&lt;p&gt;For this project, we provided a full suite of recommendations before getting started, covering everything from branding, look &amp;amp; feel, message presentation, and online marketing techniques.  Once the project was commenced, we worked carefully to ensure it met expectations at every step of the way.  The result is something the Profitness Program team is very happy with.&lt;/p&gt;
&lt;p&gt;Jeff Russo, CEO of The Edge Fitness Consulting, the company behind the Profitness Program, had this to say about what we created - as well as the collaborative, consultative process we're known for:&lt;/p&gt;
&lt;div class="spacer"&gt;&amp;nbsp;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;factor[e] design initiative did an outstanding job in recreating our company logo and web site.&lt;/p&gt;
&lt;p&gt;Their extensive questionnaire allowed me to get a better understanding of my brand and product and they were able to translate that information into a contemporary look and web site that thoroughly represents our company and services.&lt;/p&gt;
&lt;p&gt;What I appreciated most was their willingness to take into consideration my team's requests in the design process and to accommodate these changes to the point where we were truly pleased with the final version. A most pleasant and unexpected surprise is the increased confidence and excitement for the sales process amongst our team of fitness business professionals.&lt;/p&gt;
&lt;p&gt;The response from our clients has been so positive that it just reinforces that factor[e] design came through in a big way for us!&lt;/p&gt;
&lt;p&gt;Jeff Russo&lt;br /&gt;
President/Owner&lt;br /&gt;
Pro Fitness Program&lt;br /&gt;
The Edge Fitness Business Consulting&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thanks Jeff, we appreciate it!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/AQIR495Gz6k" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 15 Jun 2009 10:47:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/AQIR495Gz6k/13-profitnessprogram-com-launched</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/13-profitnessprogram-com-launched</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/13-profitnessprogram-com-launched</feedburner:origLink></item>
    <item>
      <title>Junior Web Developer Position Open</title>
      <description>&lt;p&gt;We are seeking a junior web developer to join our Web Division.&lt;/p&gt;
&lt;p&gt;The factor[e] Web Division is responsible for developing complex, cutting-edge web applications as well as building a constant stream of beautifully designed smaller websites.  You will be joining an agile development team that develops advanced software using the latest in open-source technologies and platforms, including Ruby, Rails, and jQuery.&lt;/p&gt;
&lt;p&gt;Our team is small, dedicated, passionate, and very talented.  We're also easy-going, and our office is gorgeous.  We are small, but we're on our way to making a name for ourselves.&lt;/p&gt;
&lt;h2&gt;Qualifications&lt;/h2&gt;
&lt;p&gt;Eventually, your role will be as a Ruby developer, however, we understand that there are very few Ruby programmers in our area.  For that reason, experience in any web programming language will qualify you for this position: ASP, .NET, Java, PHP, Perl, Python, etc.  Ruby experience, of course, will be a definite asset.&lt;/p&gt;
&lt;p&gt;In order to quickly attain productivity in our team, you also have web design skills: the ability to take an existing layout in Photoshop and create a (mostly) table-free HTML and CSS layout from it that is cross-browser compatible with minimal browser hacks.  Experience with Javascript and jQuery is also an asset.&lt;/p&gt;
&lt;p&gt;We are NOT interested in hiring a contractor OR a company for this position, you must be available to work in our Hamilton office as a full-time employee of factor[e].&lt;/p&gt;
&lt;h2&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;A passion for web development&lt;/li&gt;
    &lt;li&gt;Programming experience or education in at least one web programming language&lt;/li&gt;
    &lt;li&gt;Web design skills, including Photoshop, HTML and CSS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Compensation&lt;/h2&gt;
&lt;p&gt;Salary will be commensurate with education, experience, and the fact we are based in a small city, where the cost of living is low (houses here are a third of what they cost in Toronto) and the rates we can charge our clients are less than if we were based in New York or LA.  For that reason, candidates who are from our local area, or who are willing to relocate here, would be happiest.&lt;/p&gt;
&lt;p&gt;Send applications to &lt;a href="mailto:jobs@factore.ca"&gt;jobs@factore.ca&lt;/a&gt; with resume and portfolio.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/NSZHaGRQpPE" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 13 Mar 2009 11:33:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/NSZHaGRQpPE/12-junior-web-developer-position-open</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/12-junior-web-developer-position-open</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/12-junior-web-developer-position-open</feedburner:origLink></item>
    <item>
      <title>Introducing has_foreign_language: An Easy Database Internationalization Plugin</title>
      <description>&lt;p&gt;has_foreign_language is a Ruby on Rails plugin by factor[e] that makes it easy to internationalize your database without mucking up your views and controllers or having to write a bunch of YAML.   Just create fields for each locale you want to support in addition to your default field and has_foreign_language will automatically call the appropriate one based on the current locale.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Install it into your Rails application by running&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;script/plugin install git://github.com/factore/has_foreign_language.git&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;p&gt;First create your model:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;script/generate model books title:string title_fr:string title_de:string author:string&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then specify which fields need to be internationalized in your model:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Country &amp;lt; ActiveRecord::Base&lt;br /&gt; has_foreign_language :title&lt;br /&gt;end&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now let's create a book in the console and see how this works:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;I18n.default_locale = &amp;quot;en&amp;quot;&lt;br /&gt;b = Book.new(:title =&amp;gt; &amp;quot;Slaughterhouse Five&amp;quot;, :title_fr =&amp;gt; &amp;quot;Abattoir Cinq&amp;quot;, :title_de =&amp;gt; &amp;quot;Schlachthof F&amp;uuml;nf&amp;quot;)&lt;br /&gt;b.title # Slaughterhouse Five&lt;br /&gt;&lt;br /&gt;I18n.locale = &amp;quot;fr&amp;quot;&lt;br /&gt;b.title # Abattoir Cinq&lt;br /&gt;&lt;br /&gt;I18n.locale = &amp;quot;de&amp;quot;&lt;br /&gt;b.title # Schlachthof F&amp;uuml;nf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Calling title on the model returns the appropriate column depending on which locale we're in.  This also works when we change the attribute:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;I18n.locale = &amp;quot;de&amp;quot;&lt;br /&gt;b.title = &amp;quot;Etwas Anderes&amp;quot;&lt;br /&gt;b # Book id: nil, title: &amp;quot;Slaughterhouse Five&amp;quot;, title_fr: &amp;quot;Abattoir Cinq&amp;quot;, title_de: &amp;quot;Etwas Anderes&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you want to set or return the default language attribute while in a different locale, you can call it the way you would call any other. Assuming the default is &amp;quot;en&amp;quot;, you would run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;b.title_en # Slaughterhouse Five&lt;br /&gt;b.title_en = &amp;quot;Something Else&amp;quot; # Book id: nil, title: &amp;quot;Something Else&amp;quot;, title_fr: &amp;quot;Abattoir Cinq&amp;quot;, title_de: &amp;quot;Etwas Anderes&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Validations&lt;/h2&gt;
&lt;p&gt;Validations with has_foreign_language are easy.  Just run the validation on the default field name and it will apply to whatever locale you're in.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Country &amp;lt; ActiveRecord::Base&lt;br /&gt;  has_foreign_language :title&lt;br /&gt;  validates_presence_of :title&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;I18n.locale = &amp;quot;de&amp;quot;&lt;br /&gt;b = Book.new(:title =&amp;gt; &amp;quot;Etwas Anderes&amp;quot;) # Book id: nil, title: nil, title_fr: nil, title_de: &amp;quot;Etwas Anderes&amp;quot;&lt;br /&gt;b.valid? # true&lt;br /&gt;&lt;br /&gt;I18n.locale = &amp;quot;en&amp;quot;&lt;br /&gt;b.valid? # false&lt;br /&gt;&lt;br /&gt;b.title = &amp;quot;Slaughterhouse Five&amp;quot;&lt;br /&gt;b.valid? # true&lt;/code&gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/7nfph7cwNNs" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 21 Jan 2009 10:39:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/7nfph7cwNNs/11-introducing-has-foreign-language-an-easy-database-internationalization-plugin</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/11-introducing-has-foreign-language-an-easy-database-internationalization-plugin</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/11-introducing-has-foreign-language-an-easy-database-internationalization-plugin</feedburner:origLink></item>
    <item>
      <title>Our Internet Predictions for 2009</title>
      <description>&lt;p&gt;Here at factor[e], we're not just design and web professionals.&amp;nbsp; We're also futurists, always several steps ahead of the game when it comes to the technologies we so love.&amp;nbsp; With that in mind, here are our predictions for the Internet in 2009.&amp;nbsp; Happy New Year from all of us here at factor[e]!&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Facebook and MySpace expand into the antisocial-networking space, launching a new site where you start off as friends with everybody and have to get rid of them.&lt;/li&gt;
    &lt;li&gt;Upon its release, Internet Explorer 8 is fully standards compliant and passes the Acid3 test.&amp;nbsp; It is also completely incompatible with Windows Vista.&lt;/li&gt;
    &lt;li&gt;PHP is ported over to the JVM so that applications can be written in PHP which run using Java, similar to jRuby and Jython.&amp;nbsp; Enterprising PHP programmers jump on this new technology in order to write applications for mobile devices, causing many of them to lock up harder than a 30 GB Zune on New Year's Eve.&amp;nbsp; The technology, mockingly called jBug or Jamateur by professional programmers, is defunct by the end of the year.&lt;/li&gt;
    &lt;li&gt;David Heinemeier Hansson knee-drops Adrian Holovaty off the turnbuckle at the first and last 'Framework Smackdown' conference.&lt;/li&gt;
    &lt;li&gt;VRML will make a major comeback with the announcement of Facebook Telescreen, a new feature that allows partner sites to view virtual walk-throughs of your house, 24 hours a day.&lt;/li&gt;
    &lt;li&gt;Flickr, after the success of allowing people to upload 'long pictures', also allows users to upload short sounds. 2 months later this feature is removed as it is used mainly for fart noises.&lt;/li&gt;
    &lt;li&gt;The NSA releases a fleet of ultra advanced insect-size flying surveillance bots in order to keep a close eye on the activities of American citizens.&amp;nbsp; The bots become a favourite meal of crows, which soon start hanging out near falafel restaurants and Code Pink meetings.&lt;/li&gt;
    &lt;li&gt;The CSS3 advanced layout module to allow tighter control over column layouts is finalized. Microsoft introduces the Advanced Internet Layouts Professional Edition 2009 module, which opens 6 new security holes and only works in IE6.&lt;/li&gt;
    &lt;li&gt;Wordpress is edged out by Xanga as the number one blogging platform for web professionals and political analysts.&lt;/li&gt;
    &lt;li&gt;The MPAA files suit against a 3-year-old, a lumber yard and a dolphin for downloading Blu-Ray rips of &amp;quot;You Don't Mess with the Zohan&amp;quot;.&lt;/li&gt;
    &lt;li&gt;Gradients and drop shadows become a thing of the past in web design trends, being fully replaced by checkerboard and magic-eye backgrounds.&lt;/li&gt;
    &lt;li&gt;Yahoo! and Hotmail combine their webmail services to offer users the ability to store a whopping 12 gigabytes of CiALi$ spam.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/WMhHb73TLmM" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 31 Dec 2008 14:44:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/WMhHb73TLmM/9-our-internet-predictions-for-2009</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/9-our-internet-predictions-for-2009</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/9-our-internet-predictions-for-2009</feedburner:origLink></item>
    <item>
      <title>Reading List: Programmers</title>
      <description>&lt;p&gt;factor[e]'s programmers are not just master information manipulators.&amp;nbsp; We are also addicted information consumers.&amp;nbsp; Here's a small sampling of the sites on the factor[e] Programmer's reading list:&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" mce_href="http://www.rubyinside.com/" href="http://www.rubyinside.com/"&gt;Ruby Inside&lt;/a&gt; - Ruby and Rails News Site&lt;br /&gt;
&lt;a target="_blank" mce_href="http://olabini.com/blog/" href="http://olabini.com/blog/"&gt;Programming Language Synchronicity&lt;/a&gt; - the blog of Ola Bini, master programmer&lt;br /&gt;
&lt;a target="_blank" mce_href="http://ejohn.org/" href="http://ejohn.org/"&gt;John Resig&lt;/a&gt; - the man is insanely good at Javascript and writes about it here&lt;br /&gt;
&lt;a target="_blank" mce_href="http://ryandaigle.com/" href="http://ryandaigle.com/"&gt;Ryan's Scraps&lt;/a&gt; - Ryan Daigle keeps his blog updated with the latest in Ruby and Rails info&lt;br /&gt;
&lt;a target="_blank" mce_href="http://www.railsinside.com/" href="http://www.railsinside.com/"&gt;Rails Inside&lt;/a&gt; - All about Rails&lt;br /&gt;
&lt;a target="_blank" mce_href="http://giantrobots.thoughtbot.com/" href="http://giantrobots.thoughtbot.com/"&gt;Giant Robots Smashing Into Other Giant Robots&lt;/a&gt; - the blog of another fine company&lt;/p&gt;
&lt;p&gt;And of course the constant stream of developer info on &lt;a target="_blank" mce_href="http://www.reddit.com/" href="http://www.reddit.com/"&gt;Reddit&lt;/a&gt; and &lt;a target="_blank" mce_href="http://www.dzone.com" href="http://www.dzone.com"&gt;DZone&lt;/a&gt;...&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/rAha4Rm8PJ8" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 13 Nov 2008 16:53:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/rAha4Rm8PJ8/8-reading-list-programmers</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/8-reading-list-programmers</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/8-reading-list-programmers</feedburner:origLink></item>
    <item>
      <title>Reading List: Designers</title>
      <description>&lt;p&gt;Our designers are avid consumers of all things both fresh and designery. To that end, they like to keep their designer minds cooking by consuming the latest in design trends, news, and flavour. As a little glimpse inside what's going through our feed readers lately, we present the Designer edition of the factor[e] Reading List:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.qbn.com" mce_href="http://www.qbn.com" target="_blank"&gt;QBN&lt;/a&gt; - Design Industry News &amp;amp; Discussion&lt;br /&gt;
&lt;a href="http://www.design-feed.net" mce_href="http://www.design-feed.net" target="_blank"&gt;Design-Feed&lt;/a&gt; - An aggregated feed site featuring feeds from 281 design-related sites&lt;br /&gt;
&lt;a href="http://www.underconsideration.com/brandnew" mce_href="http://www.underconsideration.com/brandnew" target="_blank"&gt;Brand New&lt;/a&gt; - Opinions on Corporate and Brand Identity Work&lt;br /&gt;
&lt;a href="http://www.fontfeed.com" mce_href="http://www.fontfeed.com" target="_blank"&gt;FontFeed&lt;/a&gt; - FontShop's blog&lt;br /&gt;
&lt;a href="http://www.ilovetypography.com  " mce_href="http://www.ilovetypography.com  " target="_blank"&gt;ilovetypography&lt;/a&gt; - A blog devoted to fonts and typefaces&lt;br /&gt;
&lt;a href="http://ideas.veer.com/skinny" mce_href="http://ideas.veer.com/skinny" target="_blank"&gt;The Skinny&lt;/a&gt; - Veer's top-notch blog about creative goings-on&lt;br /&gt;
&lt;a href="http://www.37signals.com/svn/" mce_href="http://www.37signals.com/svn/" target="_blank"&gt;Signal vs. Noise&lt;/a&gt; - 37signals' ruminations about usability, design, pop culture and more&lt;br /&gt;
&lt;a href="http://ministryoftype.co.uk/" mce_href="http://ministryoftype.co.uk/" target="_blank"&gt;Ministry of Type&lt;/a&gt; - exploring the world of packaging, typography and more&lt;/p&gt;
&lt;p&gt;Join us next time when we bust out: Reading List: Programmers!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/5nCPoLtiUCg" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 12 Nov 2008 15:58:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/5nCPoLtiUCg/7-reading-list-designers</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/7-reading-list-designers</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/7-reading-list-designers</feedburner:origLink></item>
    <item>
      <title>Thanks for stopping by!</title>
      <description>&lt;p&gt;After a rainy start, we had a beautiful day at the Locke St. Festival and met a lot of great people. Quite of a number of Locke St. patrons have seen our &lt;a href="/contact" mce_href="/contact" title="Our Logo" target="_self"&gt;giant superhero-esque logo&lt;/a&gt; on the building but have no idea what we do - the Festival was great for getting the word out.&lt;/p&gt;
&lt;p&gt;To everyone who stopped to talk and pick up some of our literature (and a sweet factor[e] tote bag!) thanks very much!&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="/images/0000/0017/08.09.06.004sm.jpg" mce_href="/images/0000/0017/08.09.06.004sm.jpg" title="Tyler and Maggie" rel="zoom" class="forge-inserted-thumbnail"&gt;&lt;img alt="" src="/images/0000/0017/08.09.06.004sm_thumb.jpg" mce_src="/images/0000/0017/08.09.06.004sm_thumb.jpg" style="margin: 5px 15px 15px 0px; float: left;" mce_style="margin: 5px 15px 15px 0px; float: left;" /&gt;&lt;/a&gt;&lt;a href="/images/0000/0015/08.09.06.005sm.jpg" mce_href="/images/0000/0015/08.09.06.005sm.jpg" title="Adrian" rel="zoom" class="forge-inserted-thumbnail"&gt;&lt;img alt="" src="/images/0000/0015/08.09.06.005sm_thumb.jpg" mce_src="/images/0000/0015/08.09.06.005sm_thumb.jpg" style="margin: 5px 15px 15px 0px; float: left;" mce_style="margin: 5px 15px 15px 0px; float: left;" /&gt;&lt;/a&gt;&lt;a href="/images/0000/0019/08.09.06.010sm.jpg" mce_href="/images/0000/0019/08.09.06.010sm.jpg" title="The Crowd" rel="zoom" class="forge-inserted-thumbnail"&gt;&lt;img alt="" src="/images/0000/0019/08.09.06.010sm_thumb.jpg" mce_src="/images/0000/0019/08.09.06.010sm_thumb.jpg" style="margin: 5px 15px 15px 0px; float: left;" mce_style="margin: 5px 15px 15px 0px; float: left;" /&gt;&lt;/a&gt;&lt;a href="/images/0000/0021/08.09.06.011sm.jpg" mce_href="/images/0000/0021/08.09.06.011sm.jpg" title="Exotic Locke St. Wildlife" rel="zoom" class="forge-inserted-thumbnail"&gt;&lt;img alt="" src="/images/0000/0021/08.09.06.011sm_thumb.jpg" mce_src="/images/0000/0021/08.09.06.011sm_thumb.jpg" style="margin: 5px 15px 15px 0px; float: left;" mce_style="margin: 5px 15px 15px 0px; float: left;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(Thanks to &lt;a href="http://strungfoto.com" mce_href="http://strungfoto.com" target="_"&gt;Larry Strung&lt;/a&gt; for the great photography!)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/cFewkFLoIhI" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 08 Sep 2008 09:24:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/cFewkFLoIhI/5-thanks-for-stopping-by-</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/5-thanks-for-stopping-by-</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/5-thanks-for-stopping-by-</feedburner:origLink></item>
    <item>
      <title>We're At The Locke Street Festival</title>
      <description>&lt;p&gt;Come check out our booth at the Locke Street Festival on Saturday, September 6.&lt;/p&gt;
&lt;p&gt;The Locke Street Festival is Locke Street's biggest annual event, with local merchants, guest vendor stalls, live entertainment, food, and children's activities.&lt;/p&gt;
&lt;p&gt;We'll be there giving out balloons for the kids and swag for whoever wants some.&lt;/p&gt;
&lt;p&gt;This is your chance to come meet us face-to-face.&amp;nbsp; We're looking forward to seeing you there!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/zeSDOk4oJys" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 05 Sep 2008 02:10:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/zeSDOk4oJys/4-we-re-at-the-locke-street-festival</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/4-we-re-at-the-locke-street-festival</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/4-we-re-at-the-locke-street-festival</feedburner:origLink></item>
    <item>
      <title>Blast Off!</title>
      <description>&lt;p&gt;Hello! Welcome to the brand new &lt;span style="font-weight: bold;" mce_style="font-weight: bold;"&gt;factor[e] design initiative&lt;/span&gt; website. Our clients were keeping us pretty busy, but we pulled up our socks and burned some midnight oil. The result: our shiny new web presence.&lt;/p&gt;
&lt;p&gt;A large part of what we do is web-centric - it's definitely the fastest growing part of our business - and we felt our own site had to represent the message we're trying to send: A robust website is important to the health of any company! A website is more than design or information architecture - it's a way to connect directly with your customers and clients in your own voice. Our voice was a little quiet. This site is our megaphone.&lt;/p&gt;
&lt;p&gt;We've built this site on top of &lt;a title="Forge" href="/pages/products/forge" mce_href="/pages/products/forge"&gt;Forge&lt;/a&gt;, our content management system. Literally every part of the site is managed from within Forge, from portfolio to content editing to this blog.&lt;/p&gt;
&lt;p&gt;Over the last year we've re-invented ourselves as a company - new brand, new office, new outlook on how we work. This site was really the last piece of that particular puzzle and we're very happy to finally unveil it. Have a look around, see some of the things we've done and keep an eye on us - this is only the first step. &amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/factore/~4/U9VZetDsgiM" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 21 Aug 2008 12:45:00 -0400</pubDate>
      <link>http://feedproxy.google.com/~r/factore/~3/U9VZetDsgiM/3-blast-off-</link>
      <guid isPermaLink="false">http://factore.ca/on-the-floor/3-blast-off-</guid>
    <feedburner:origLink>http://factore.ca/on-the-floor/3-blast-off-</feedburner:origLink></item>
  </channel>
</rss>

