<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title>dominic dagradi</title>
  <link href="http://dominicdagradi.com/atom.xml" rel="self"/>
  <link href="http://dominicdagradi.com/"/>
  <updated>2012-01-16T11:10:14-05:00</updated>
  <id>http://dominicdagradi.com/</id>
  <author>
    <name>Dominic Dagradi</name>
    
  </author>

  
  <entry>
    <title>Your Site Doesn&#8217;t Know How Big It Is</title>
    <link href="http://dominicdagradi.com/2012/01/16/your-site-doesnt-know-how-big-it-is/"/>
    <updated>2012-01-16T11:10:00-05:00</updated>
    <id>http://dominicdagradi.com/2012/01/16/your-site-doesnt-know-how-big-it-is</id>
    <content type="html">&lt;p&gt;One of the most common mistakes I see in web development is not adequately testing sites for a variety of viewport sizes. It’s more than just incorrect rendering on mobile devices, or looking bad on large screens. Issues with small browser windows are often overlooked in the course of building a site.&lt;/p&gt;

&lt;p&gt;I notice this almost daily in my development environment, where I work with two 960px windows side-by-side. In so many sites I visit, I know if I see a scrollbar on the bottom of the page, I’m likely to see a min-width error when I scroll to the right.&lt;/p&gt;

&lt;!&#8211; more &#8211;&gt;

&lt;p&gt;Even &lt;a href=&quot;http://google.com&quot;&gt;Google Search&lt;/a&gt; gets it wrong. Here’s a screenshot of their search results&lt;sup id=&quot;fnref:note&quot;&gt;&lt;a href=&quot;#fn:note&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; displayed in a relatively small (720px) window:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://dominicdagradi.com/images/posts/min-width/google1.png&quot; alt=&quot;google.com: The viewport before scrolling&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So far so good (mostly, but I’ll get to that in a second). What happens when we scroll the page to see the off-screen content to the right?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://dominicdagradi.com/images/posts/min-width/google2.png&quot; alt=&quot;google.com: After scrolling&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Uh-oh.&lt;/p&gt;

&lt;h2 id=&quot;what-happened&quot;&gt;What Happened?&lt;/h2&gt;

&lt;p&gt;Google made the mistake of not defining the document’s minimum width. Throughout the site, multiple containing elements are given &lt;em&gt;width: 100%&lt;/em&gt;, with the intention of filling the entire width of the screen with their content. The common misconception at play here is that &lt;em&gt;width: 100%&lt;/em&gt; is the full width of the HTML document, when it actually represents the width of the window/viewport through which the user is experiencing your site&lt;sup id=&quot;fnref:or&quot;&gt;&lt;a href=&quot;#fn:or&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;. In the example window, any element defined with a width of 100% is really given a width of 720px. Elsewhere in the site, content is defined as wide as 980px, hence the appearance of overflowing its bounds.&lt;/p&gt;

&lt;p&gt;In this case, both the “Google” bar at the top of the page and the main search bar are affected. The Google+ navigation overlaps with the menu of Google services, and makes it impossible to reach certain elements. In the search bar, the background stops abruptly before the search button, appearing broken.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://dominicdagradi.com/images/posts/min-width/google2-annotated.png&quot; alt=&quot;google.com: After scrolling, annotated&quot; /&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;This isn’t an isolated mistake. In a few minutes of searching, I found the same problem on many popular sites, including &lt;a href=&quot;http://msnbc.com&quot;&gt;MSNBC&lt;/a&gt;, &lt;a href=&quot;http://penny-arcade.com&quot;&gt;Penny Arcade&lt;/a&gt;, &lt;a href=&quot;http://nfl.com&quot;&gt;NFL.com&lt;/a&gt;, and &lt;a href=&quot;http://codecademy.com&quot;&gt;Codecademy&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;simple-solutions&quot;&gt;Simple Solutions&lt;/h2&gt;

&lt;p&gt;These are obviously large and complex sites. Let’s look at a minimal example. The code below exhibits the same error:&lt;/p&gt;

&lt;div class=&quot;bogus-wrapper&quot;&gt;&lt;notextile&gt;&lt;figure class=&quot;code&quot;&gt;&lt;figcaption&gt;&lt;span&gt;test.html -  Example markup and styles&lt;/span&gt;&lt;/figcaption&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;11&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;12&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;13&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;14&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;15&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;16&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;17&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;18&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;nf&quot;&gt;#wrapper&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;k&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;k&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;red&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;nf&quot;&gt;#main&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;k&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;auto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;k&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;960px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;wrapper&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;main&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;      My example content
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/notextile&gt;&lt;/div&gt;

&lt;p&gt;Now, even though our #main div has a defined width of 960px, the background of #wrapper only extends to the width of the window (100% width). Any content in the #main div is visible outside of the wrapper due to the default overflow behavior, which allows  content to be seen beyond its container’s boundaries.&lt;/p&gt;

&lt;p&gt;All of this is trivially simple to fix though. Just tell the document’s root element what the smallest allowed width should be:&lt;/p&gt;

&lt;div class=&quot;bogus-wrapper&quot;&gt;&lt;notextile&gt;&lt;figure class=&quot;code&quot;&gt;&lt;figcaption&gt;&lt;span&gt;Simple fix&lt;/span&gt;&lt;/figcaption&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;k&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;960px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/notextile&gt;&lt;/div&gt;

&lt;p&gt;That’s it. The layout and display issues are neatly wrapped up.&lt;/p&gt;

&lt;p&gt;On the other side of the coin, sites that are built to be responsive or flexible don’t need to worry about minimum widths - they should scale down gracefully to phone-sized displays. But this presents an equally valid problem on a 2000-3000 pixel screen, where a site can be cumbersome to interact with if a maximum width is not specified (enabled by the aptly named &lt;em&gt;max-width&lt;/em&gt; property).&lt;/p&gt;

&lt;h2 id=&quot;what-about-browser-compatability&quot;&gt;What About Browser Compatability?&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://caniuse.com/#search=min-width&quot;&gt;You’re safe&lt;/a&gt; in all modern — and most vintage — browsers. If IE6 support is still important to you, you’ll need to take the usual steps and employ additional trickery.&lt;/p&gt;

&lt;p&gt;It’s safe to assume your work will be displayed on a screen with a reasonable resolution (&amp;gt;= 1024x768), but keep in mind that your users can and will find a way to view it in smaller windows. When you’re building your next site on a giant monitor, remember to drag your window smaller and larger than your comfortable width to make certain that everything is still usable.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:note&quot;&gt;
      &lt;p&gt;Will W3Schools.com ever not be the top hit for a CSS search? One can only dream.&lt;a href=&quot;#fnref:note&quot; rev=&quot;footnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:or&quot;&gt;
      &lt;p&gt;&lt;em&gt;width: 100%&lt;/em&gt; also works as a relative measure when used on an element contained by another with a set width, but we’re talking about root-level elements in this example.&lt;a href=&quot;#fnref:or&quot; rev=&quot;footnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
  </entry>
  
  <entry>
    <title>SOPAthetic</title>
    <link href="http://dominicdagradi.com/2011/12/16/sopathetic/"/>
    <updated>2011-12-16T19:00:00-05:00</updated>
    <id>http://dominicdagradi.com/2011/12/16/sopathetic</id>
    <content type="html">&lt;p&gt;During yesterday’s discussion of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Stop_Online_Piracy_Act&quot;&gt;Stop Online Piracy Act&lt;/a&gt;, House representative Steve King had this to tweet:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;We are debating the Stop Online Piracy Act and Shiela Jackson has so bored me that I&amp;#8217;m killing time by surfing the Internet.&lt;/p&gt;&lt;footer&gt;&lt;strong&gt;Steve King, R-Iowa&lt;/strong&gt;&lt;cite&gt;&lt;a href=&quot;https://twitter.com/stevekingia/status/147371129177255936&quot;&gt;twitter.com/stevekingia/status/&amp;hellip;&lt;/a&gt;&lt;/cite&gt;&lt;/footer&gt;&lt;/blockquote&gt;

&lt;p&gt;Heckuva job, Stevie.&lt;/p&gt;

&lt;!&#8211; more &#8211;&gt;

&lt;p&gt;Needless to say, this is abominable behavior from anyone, let alone an elected official. His response to constituents outraged by his sentiment was simply to say that people “need to get a sense of humor”. It’s nice to see our members of Congress taking their job so seriously.&lt;/p&gt;

&lt;p&gt;SOPA aims to provide tools that could be used to easily censor the internet, similar to China’s “Great Firewall”. This sweeping legislation, crafted with little understanding of the issues at hand, could be fatally damaging to the future of technological innovation in our country.&lt;/p&gt;

&lt;p&gt;Senator Ron Wyden (D-Oregon) is planning to filibuster the bill by reading the signatures of an &lt;a href=&quot;http://www.avaaz.org/en/save_the_internet/&quot;&gt;online petition&lt;/a&gt;. It’s already passed one million signatures, and every voice is important. It’s also not too late to call, email or otherwise get the attention of your representative; &lt;a href=&quot;http://americancensorship.org/&quot;&gt;Stop American Censorship&lt;/a&gt; makes contacting them as easy as filling out a form.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[Update]&lt;/strong&gt; It looks like the vote on SOPA &lt;a href=&quot;http://thehill.com/blogs/hillicon-valley/technology/199991-sopa-markup-adjourns-after-marathon-debate&quot;&gt;has been delayed&lt;/a&gt;, but that doesn’t mean it’s gone. Rep. Zoe Lofgren (D-California) has been &lt;a href=&quot;http://www.reddit.com/r/SOPA/comments/nfhhy/member_of_house_judiciary_committee_ama_on_sopa/&quot;&gt;answering questions&lt;/a&gt; today on Reddit, and stresses the importance of actually speaking to your representative instead of relying on digital media to get your message across. Both SOPA, and the equally disturbing Protect IP Act, will come to a vote in the near future.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>&#8220;Read It to Me&#8221;</title>
    <link href="http://dominicdagradi.com/2011/12/01/read-it-to-me/"/>
    <updated>2011-12-01T21:30:00-05:00</updated>
    <id>http://dominicdagradi.com/2011/12/01/read-it-to-me</id>
    <content type="html">&lt;p&gt;Peter-Paul Koch, of QuirksMode, posted earlier this week about Siri and its &lt;a href=&quot;http://www.quirksmode.org/blog/archives/2011/11/a_quick_siri_no.html&quot;&gt;potential to drive web accessibility&lt;/a&gt;. He envisions a horrible-but-possible future for the web, where digital assistants mindlessly reel off the contents of poorly constructed websites. Where I feel Koch misses the mark is in imagining that the future of interacting with the web will be limited by existing paradigms such as browsers and screen readers.&lt;/p&gt;

&lt;p&gt;I think that, with rare exception, having Siri read long-form streams of content to a user is a less-than-desirable interface&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. One of its greatest strengths is its conversational style of interaction, providing a back-and-forth dialog that proves exceptionally effective. If Siri is in the middle of reciting a long passage of text, there’s only one option for responding: interrupt it.&lt;/p&gt;

&lt;!&#8211; more &#8211;&gt;

&lt;h2 id=&quot;semantics&quot;&gt;Semantics&lt;/h2&gt;

&lt;p&gt;That’s not to say that there’s not a future for interacting with the web with voice. Rather, it requires constructing websites not only to be accessible for humans, but accessible for machines as well. There already are initiatives to make the web more machine readable, often falling under the umbrella of the &lt;a href=&quot;http://www.w3.org/2001/sw/&quot;&gt;semantic web&lt;/a&gt;. One of the most promising trends so far is the adoption of &lt;a href=&quot;http://microformats.org/wiki/Main_Page&quot;&gt;microformats&lt;/a&gt;, providing machine-readable chunks of data transparently within existing webpages.&lt;/p&gt;

&lt;p&gt;But how does that relate to voice? Let’s use Koch’s example of shopping for Christmas presents:&lt;/p&gt;

&lt;p&gt;Let’s imagine I’m the developer for QuickChristmasShop.com, and I want to make my product data available so customers can place last-minute orders as they’re frantically driving to the airport.&lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; I know that Siri can find products on webpages that implement the correct microformats, and I mark up the products on our homepage using the &lt;a href=&quot;http://microformats.org/wiki/hproduct&quot;&gt;hproduct&lt;/a&gt; format.&lt;/p&gt;

&lt;p&gt;Now, the following interaction is possible:&lt;/p&gt;

&lt;hr /&gt;

&lt;style&gt;
  table td.person {
    width: 100px;
    font-weight: bold;
  }

  tr {
    color: #333;
  }
  tr.siri {
    color: #888;
  }
&lt;/style&gt;

&lt;table class=&quot;conversation&quot;&gt;
&lt;tr&gt;
  &lt;td class=&quot;person&quot;&gt;Me&lt;/td&gt;
  &lt;td&gt;Siri, I want to buy something from QuickChristmasShop.com.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;siri&quot;&gt;
  &lt;td class=&quot;person&quot;&gt;Siri&lt;/td&gt;
  &lt;td&gt;Got it. I found 12 products on sale there.&lt;br /&gt;
  - &lt;em&gt;Siri displays a list of 12 products&lt;/em&gt; -&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;person&quot;&gt;Me&lt;/td&gt;
  &lt;td&gt;Siri, please read them to me.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;siri&quot;&gt;
  &lt;td class=&quot;person&quot;&gt;Siri&lt;/td&gt;
  &lt;td&gt;Red Widget&lt;br /&gt;
  Blue Widget&lt;br /&gt;
  Deluxe Widget&lt;br /&gt;
  - &lt;em&gt;Siri reads nine more widgets&lt;/em&gt; -
  &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;person&quot;&gt;Me&lt;/td&gt;
  &lt;td&gt;Great. Have 2 Deluxe Widgets sent to my house.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;siri&quot;&gt;
  &lt;td class=&quot;person&quot;&gt;Siri&lt;/td&gt;
  &lt;td&gt;I&amp;#8217;ve placed your order for you.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;hr /&gt;

&lt;p&gt;Obviously this is just a hypothetical example, but speaks to the power and potential of making data available in machine readable formats.&lt;/p&gt;

&lt;p&gt;To see microformats in action, try searching Google for &lt;a href=&quot;http://www.google.com/search?ix=aca&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8&amp;amp;q=choclate+cake&quot;&gt;“chocolate cake”&lt;/a&gt;, or any other recipe. Google is smart enough to know about microformats relating to recipes, and provides you extra interface elements to filter your searches (“I want a chocolate cake with pecans!”). The future of accessibility on the web isn’t based in making things easier for humans to read, but in providing machines with enough information to understand what we want.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;And it should be noted that iOS already has a best-in-class &lt;a href=&quot;http://www.apple.com/accessibility/iphone/vision.html&quot;&gt;screen reader&lt;/a&gt; built in for the visually impaired.&lt;a href=&quot;#fnref:1&quot; rev=&quot;footnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;I jest. Siri is a great hands-free interface, but really, pay attention to the damn road while driving.&lt;a href=&quot;#fnref:2&quot; rev=&quot;footnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
  </entry>
  
  <entry>
    <title>Flexibility</title>
    <link href="http://dominicdagradi.com/2011/11/14/flexibility/"/>
    <updated>2011-11-14T16:07:00-05:00</updated>
    <id>http://dominicdagradi.com/2011/11/14/flexibility</id>
    <content type="html">&lt;p&gt;Last Friday, Bearded celebrated its &lt;a href=&quot;http://beardedstudio.tumblr.com/post/12650267950/11-11-11-3-years-of-bearded&quot;&gt;third anniversary&lt;/a&gt;. It’s been a wild ride, and we’re all looking forward to what the future holds. To mark the occasion, we’ve launched a &lt;a href=&quot;http://bearded.com&quot;&gt;brand new website&lt;/a&gt; with a fabulous responsive design.&lt;/p&gt;

&lt;p&gt;Our previous site, launched in November 2009, served us well over the years. But the web has become a more diverse place since then, with screens coming in increasingly varied sizes and touch-based devices more prevalent than ever. Obviously, it was time for a new approach. Enter responsive web design, the idea that a single design can be made to meet the needs of all your users without removing content or building a second layout.&lt;/p&gt;

&lt;!&#8211; more &#8211;&gt;

&lt;p&gt;&lt;a href=&quot;http://ethanmarcotte.com/&quot;&gt;Ethan Marcotte&lt;/a&gt;, the champion of responsive practices, recently shared his knowledge in an excellent book: &lt;a href=&quot;http://www.abookapart.com/products/responsive-web-design&quot;&gt;Responsive Web Design&lt;/a&gt;. It’s an invaluable resource if you’re ready to get started with responsive designs. If a book is too long for your tastes, check out his &lt;a href=&quot;http://www.alistapart.com/articles/responsive-web-design/&quot;&gt;A List Apart article&lt;/a&gt; for a briefer overview of responsive concepts such as media queries.&lt;/p&gt;

&lt;h2 id=&quot;the-grid&quot;&gt;The Grid&lt;/h2&gt;

&lt;p&gt;In searching for a responsive grid system that met our needs, we came across Jonathan Clem’s excellent &lt;a href=&quot;http://jclem.net/2011/05/16/flexible-and-semantic-grids-with-compass/&quot;&gt;solution&lt;/a&gt; as a starting point for our own work. However, we felt it warranted some changes to better accommodate layouts with variable numbers of columns.&lt;/p&gt;

&lt;p&gt;CSS grid systems traditionally define columns with a fixed width for content and a gutter on the right side, then removing the gutter on the last element in a row (typically by adding a &lt;em&gt;“last”&lt;/em&gt; class to your HTML). This makes it difficult to allow for an elastic grid that can be easily reflowed. We instead opted for columns to split their gutter to both sides of the element, removing the need to track where any row begins or ends.&lt;/p&gt;

&lt;div class=&quot;bogus-wrapper&quot;&gt;&lt;notextile&gt;&lt;figure class=&quot;code&quot;&gt;&lt;figcaption&gt;&lt;span&gt;A simplified column mixin&lt;/span&gt;&lt;/figcaption&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;k&quot;&gt;@mixin&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;column&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;cols&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;nt&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;nt&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;cols&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;column&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;cols&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;gutter_width&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;container_width&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;%;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;nt&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;gutter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/notextile&gt;&lt;/div&gt;

&lt;h2 id=&quot;usage&quot;&gt;Usage&lt;/h2&gt;

&lt;p&gt;We chose the &lt;em&gt;section&lt;/em&gt; tag as our base unit of layout. Let’s see it in action with a simple example:&lt;/p&gt;

&lt;div class=&quot;bogus-wrapper&quot;&gt;&lt;notextile&gt;&lt;figure class=&quot;code&quot;&gt;&lt;figcaption&gt;&lt;span&gt;sample.html&lt;/span&gt;&lt;/figcaption&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;container&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;section&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    Some content
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;section&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    Some other content
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/notextile&gt;&lt;/div&gt;

&lt;div class=&quot;bogus-wrapper&quot;&gt;&lt;notextile&gt;&lt;figure class=&quot;code&quot;&gt;&lt;figcaption&gt;&lt;span&gt;sample.scss&lt;/span&gt;&lt;/figcaption&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nc&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nt&quot;&gt;section&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;column&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/notextile&gt;&lt;/div&gt;

&lt;p&gt;As you can see, it lets us build completely semantic HTML, while not having to worry about which element appears last in a row. Combined with media queries (which allow us to know the size of the browser’s viewport and apply styles accordingly), it made it exceedingly easy to perfect our layout across a variety of screen sizes.&lt;/p&gt;

&lt;h2 id=&quot;get-some-code&quot;&gt;Get Some Code&lt;/h2&gt;

&lt;p&gt;I’ve affectionately dubbed our system &lt;em&gt;YARG&lt;/em&gt; - Yet Another Responsive Grid, and you can &lt;a href=&quot;https://github.com/dominic/YARG&quot;&gt;grab it on Github&lt;/a&gt; to try it out today. It’s as bare-bones as possible and lacks proper examples and documentation, but it’s working great for us so far.&lt;/p&gt;

&lt;p&gt;Like most similar systems, &lt;em&gt;YARG&lt;/em&gt; is meant as a starting place for your responsive designs, to be taken apart and modified as you see fit. Go give it a download, and let me know what you think!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Google&#8217;s New Clothes</title>
    <link href="http://dominicdagradi.com/2011/11/05/googles-new-clothes/"/>
    <updated>2011-11-05T14:03:00-04:00</updated>
    <id>http://dominicdagradi.com/2011/11/05/googles-new-clothes</id>
    <content type="html">&lt;p&gt;Google’s recent focus on bringing a clean, uniform appearance to their web platform was a breath of fresh air from a company that has previously ignored design. Google+ was the first volley, with the rest of the product family being gradually updated to match. This was all great news: the most widely used web products were going to get better with a renewed focus on usable, beautiful experiences.&lt;/p&gt;

&lt;p&gt;Clearly beggars can’t be choosers. What Google has finally given us is a mess. Rather than re-imagine how users interact with Gmail or Reader, the entire suite of applications has simply been whitewashed with a muddled skin of black, grey and red.&lt;/p&gt;

&lt;!&#8211;more&#8211;&gt;

&lt;h3 id=&quot;sundry-unification&quot;&gt;Sundry Unification&lt;/h3&gt;

&lt;p&gt;Integrating styles across a platform of previously disjoint applications is a huge challenge. Considering the number of people that had to work together, it’s admirable that all the apps now look like they belong to the same family.&lt;/p&gt;

&lt;p&gt;But let’s sweat the small stuff. Attention to detail distinguishes the mediocre from the good from the great.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://dominicdagradi.com/images/posts/googles-new-clothes/header.png&quot; alt=&quot;Three different headers&quot; /&gt;&lt;br /&gt;
&lt;em&gt;Three different headers (Google+, Reader, and Gmail)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Did anyone at Google look at the new site designs side-by-side before they were launched? Not only are there two distinct heading styles (white versus grey), but no header or toolbar shares a height between any app.&lt;/p&gt;

&lt;p&gt;Lists are even more inconsistent in their appearance and functionality.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://dominicdagradi.com/images/posts/googles-new-clothes/lists.png&quot; alt=&quot;Many styles, none the same&quot; /&gt;&lt;br /&gt;
&lt;em&gt;Many styles, none the same (Google Docs, Reader, and Gmail)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Pick a list style. Just pick one. Do columns get headings? Do we need the section of the site we’re on? The sidebar can’t decide what width it wants to be, and items that have been viewed aren’t the same color between apps. Even small details like shadows are completely jumbled: Docs shades the items below the heading only, Reader shades the sidebar only, and Gmail puts a shade above the entire page.&lt;/p&gt;

&lt;p&gt;I know I’m picking nits here, but for a massive, cross-application UI rollout, I would expect consistency to be a priority. I want to be impressed by how seamless moving between Google apps is; instead I’m stuck wondering what’s going to work differently with this particular app.&lt;/p&gt;

&lt;h3 id=&quot;unreadability&quot;&gt;Unreadability&lt;/h3&gt;

&lt;p&gt;Let’s take a look at Reader, the object of the greatest criticism in the last few days. It’s not unfounded: I use Google Reader to read things, and the recent changes have only hurt legibility. &lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://dominicdagradi.com/images/posts/googles-new-clothes/3-up.jpg&quot; alt=&quot;Home page, Article view, and Fullscreen&quot; /&gt;&lt;br /&gt;
&lt;em&gt;Home page, Article view, and Fullscreen&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Google clearly sees the future of the web as black and white. The only color used on the site is red (excluding the homepage title and search button for some reason), leaving content feeling stark. Adding a feed is certainly something I do occasionally, but it doesn’t deserve the same giant red button given to a frequent action such as composing an email. Further down the page, there is little to distinguish one section of content from another, with sidebars blending into both lists of articles and primary content.&lt;/p&gt;

&lt;strike&gt;Breaking with years of convention, links aren&amp;#8217;t highlighted with anything but an underline. I never thought I&amp;#8217;d miss a blue link so much, but the endless sea of black text quickly gets difficult to read.&lt;/strike&gt;
&lt;p&gt;&lt;em&gt;Google has since made the links blue again. Good job guys! It’s a huge improvement, but the problem shouldn’t have made it out the door in the first place.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Previous designs focused on the article by isolating it and deemphasizing everything else with shades of pale blue. Now, an article’s reading area is loosely defined only by the content around it. Even short articles aren’t fully visible on laptop screens, due in no small part to the now substantial site header. Brian Shih, a former Google Reader PM, highlights the difference in height &lt;a href=&quot;http://brianshih.com/old-vs-new&quot;&gt;here&lt;/a&gt;. According to his measurements, the content area has been reduced by ~100px — 1/8th of my laptop’s total screen height. His &lt;a href=&quot;http://brianshih.com/78073742&quot;&gt;full article on the Reader redesign&lt;/a&gt; is a deeper look at all the recent design and feature changes. &lt;/p&gt;

&lt;p&gt;Switching to fullscreen (keyboard shortcut: F) just gives you the same small block of text extended to an illegible line length, instead of adopting the vastly superior paradigm of &lt;a href=&quot;http://www.readability.com/&quot;&gt;Readability&lt;/a&gt; or &lt;a href=&quot;http://www.webmonkey.com/2010/06/safari-5s-reader-simplifies-the-web/&quot;&gt;Safari Reader&lt;/a&gt;. &lt;/p&gt;

&lt;h3 id=&quot;a-little-lagniappe-gmail-for-ios&quot;&gt;A Little Lagniappe: Gmail for iOS&lt;/h3&gt;

&lt;p&gt;Google also released an official Gmail app for the iPhone this week. It would be difficult to find a better example of putting lipstick on a pig without actually going to a farm and doing it myself. It’s literally just the existing mobile web app, wrapped in an App Store download.&lt;/p&gt;

&lt;p&gt;MG Siegler takes care of the &lt;a href=&quot;http://parislemon.com/post/12263286304/faith-no-more&quot;&gt;criticism here&lt;/a&gt;. It’s almost too easy. Google ships a native app, for one of their flagship products, on the largest mobile platform, and they can’t be bothered to test it? Or even write an app that has native scrolling? It’s sloppy and embarrassing. At least it was quickly pulled to fix the bugs with notifications, the only native feature it included.&lt;/p&gt;

&lt;h3 id=&quot;a-way-out&quot;&gt;A Way Out&lt;/h3&gt;

&lt;p&gt;My trust in Google’s platform has been eroded bit by bit with each successive botched launch and ill-conceived redesign. I don’t have much left. It’s clear I’m not alone in that feeling - it’s a core theme of MG Siegler’s article above, and I’ve seen it echoed by many other voices across the internet. I appreciate that Google is trying new things, especially with design. Their constant see-what-sticks approach, however, burns far more confidence than it creates. I think it’s time for them to take a step back and reevaluate their decisions before blindly charging forward again. There are already &lt;a href=&quot;http://fury.com/2011/11/my-offer-to-google-reader/&quot;&gt;genuine offers&lt;/a&gt; from former Google designers to come back and help fix problems with Reader et al. Let’s hope they take them seriously.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Beam Me Up, Siri</title>
    <link href="http://dominicdagradi.com/2011/10/14/beam-me-up-siri/"/>
    <updated>2011-10-14T17:38:00-04:00</updated>
    <id>http://dominicdagradi.com/2011/10/14/beam-me-up-siri</id>
    <content type="html">&lt;p&gt;As the new iPhone starts landing in customers’ lucky hands, everyone is making the connection between &lt;a href=&quot;http://www.apple.com/iphone/features/siri.html&quot;&gt;Siri&lt;/a&gt; and the 1987 &lt;a href=&quot;http://www.youtube.com/embed/3WdS4TscWH8&quot;&gt;Knowledge Navigator&lt;/a&gt; concept. It’s the stuff of science fiction, teasing us with the possibility that we could create a world smart enough to understand our needs. I can’t begin to express how delightful it is to watch technology catch up to our dreams, one step at a time: we now live on the Starship Enterprise.&lt;/p&gt;

&lt;iframe width=&quot;420&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/xHSD0tR2IOU&quot;&gt;Tea. Earl Grey. Hot.&lt;/iframe&gt;

&lt;p&gt;Kyle Baxter calls Siri the &lt;a href=&quot;http://tightwind.net/2011/10/siri/&quot;&gt;future of the web&lt;/a&gt;, and I’m pretty sure he’s right. Rather than teaching ourselves to think like a computer, we’re beginning to teach the computer to respond to the way we think. Making information easily available from recognized sources&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; and returning definitive answers democratizes knowledge in a whole new way.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;Well, Wolfram Alpha and Yelp. It’s a great start, but I’m looking forward to a proper API. More on that in the future…&lt;a href=&quot;#fnref:1&quot; rev=&quot;footnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
  </entry>
  
  <entry>
    <title>Designers and Developers Can Be Best Friends</title>
    <link href="http://dominicdagradi.com/2011/10/11/designers-and-developers-can-be-best-friends/"/>
    <updated>2011-10-11T10:59:00-04:00</updated>
    <id>http://dominicdagradi.com/2011/10/11/designers-and-developers-can-be-best-friends</id>
    <content type="html">&lt;p&gt;I was recently asked how great open source projects can have great design. It sounds like a complicated problem: designers and developers live in two worlds that rarely meet. What can we do to bring better design to our ideas? &lt;/p&gt;

&lt;p&gt;As a developer, the desire to work on open source projects comes from a drive to share a particular idea or do some good via code. In doing so, I’m achieving my personal goals, and it feels great. &lt;/p&gt;

&lt;p&gt;But how do I convince someone else to work towards my lofty and worthwhile dreams? For free? The same way we convince other developers to work on open source with us: ask for help.  There’s a perception that designers aren’t interested in contributing to open software projects, which is wholly false. Any time I’ve wanted help with a project, I’ve had no trouble finding great designers ready to step up for a good cause.&lt;/p&gt;

&lt;!&#8211;more&#8211;&gt;

&lt;h3 id=&quot;dont-be-afraid-of-expertise&quot;&gt;Don’t Be Afraid of Expertise&lt;/h3&gt;

&lt;p&gt;As much as we like to believe we’re all superheroes, we can’t do everything. Just like you wouldn’t ask a great designer to build a complex Rails app, you’re probably not the one best suited to create a user experience masterpiece. It’s only natural to have multiple participants who are masters of various disciplines. &lt;/p&gt;

&lt;p&gt;The process by which we all contribute to open source projects has been normalized over time: find something we can fix, fix it, and send along our changes. Unless you’re a project owner or core contributor, you follow this pattern 99% of the time. Why not just have designers drop a Photoshop file in our mailbox and call it a day, right? Designers aren’t Photoshop factories, wanting to merely spit out static images all day long. They don’t want to do that any more than we want to churn out code and never see it again. The process of creating a design that fully meets the needs of a project requires more than just telling a designer what you want, and handing off completed files.&lt;/p&gt;

&lt;h3 id=&quot;stop-collaborate&quot;&gt;Stop: Collaborate&lt;/h3&gt;

&lt;p&gt;Instead of asking for a homepage or a few mockups, invite them to become a core member of your team. Explain the concept of your project and use it as an excuse to get feedback from someone who knows nothing about what you’re doing. Then let them help you make it better. In a recent &lt;a href=&quot;http://rethrick.com/#mmm&quot;&gt;article&lt;/a&gt; reflecting on Google Wave’s rocky conception, Dhanji Prasanna, a former Google engineer, related his experience on the necessity of involving designers: &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;You need the same mix of experienced talent working in the UI as you do with traditional “serious” stuff. …taking design seriously is not about having a dictator fuss over seams and pixels. It’s about giving it the same consideration that you give any other critical part of the system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At &lt;a href=&quot;http://bearded.com&quot;&gt;Bearded&lt;/a&gt;, our process revolves around designers and developers working in concert for the duration of building a product. Rather than one party handing off to the other with no feedback, developers offer feedback on project specs and initial design concepts, and designers are able to constantly review, respond to the project in progress, and offer new ideas and suggestions after seeing a concept implemented. Some features from the original designs don’t make it to the final product, and new features proposed by developers get added and designed along the way.&lt;/p&gt;

&lt;p&gt;Every project we make is stronger for having feedback from all parties throughout the process. Find help early, and make having a designer the standard going forward.&lt;/p&gt;

&lt;h3 id=&quot;designers-youre-not-off-the-hook&quot;&gt;Designers, You’re Not Off the Hook&lt;/h3&gt;

&lt;p&gt;Convincing developers to collaborate is only half of the battle. One important aspect of working with open source software is version control. The good news is that it’s not that hard! There’s some great articles targeted at teaching a designer-centric workflow involving &lt;a href=&quot;http://git-scm.com/&quot;&gt;git&lt;/a&gt;, a simple and popular version control system:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://hoth.entp.com/output/git_for_designers.html&quot;&gt;Version Control for Designers&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.webdesignerdepot.com/2009/03/intro-to-git-for-web-designers/&quot;&gt;Intro to Git for Web Designers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s a lot to take in, but it gets better. You don’t have to use the command line; there are great GUI utilities for all the major platforms to make using git easier. If you’re on a Mac, give &lt;a href=&quot;http://www.git-tower.com/&quot;&gt;Tower&lt;/a&gt; a shot, or try one of the many other git client available. Windows users, check out &lt;a href=&quot;http://kylecordes.com/2010/git-gui-client-windows&quot;&gt;this list&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;its-dangerous-to-go-alone-take-these&quot;&gt;It’s Dangerous to Go Alone! Take these.&lt;/h3&gt;

&lt;p&gt;Some days, you won’t be able to find a designer. But all is not lost!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Start with a Good Foundation&lt;/em&gt;&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;http://twitter.github.com/bootstrap&quot;&gt;Twitter Bootstrap&lt;/a&gt; is great. Really, really great. It provides a solid visual foundation that is a suitable starting place for most web projects.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Get Inside Their Head&lt;/em&gt;&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Non-Designers-Design-Book-Robin-Williams/dp/0321534042/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1318369240&amp;amp;sr=1-1&quot;&gt;The Non-Designers Design Book&lt;/a&gt; comes highly recommended as a resource for the technically minded to get a handle on the thought process that goes into a design. &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Learn the Language&lt;/em&gt;&lt;/p&gt;

    &lt;p&gt;Use &lt;a href=&quot;http://www.lynda.com/&quot;&gt;lynda.com&lt;/a&gt; (and, you know, Google) to strengthen your HTML and CSS skills. In order to facilitate communication, both designers and developers need to have a common language to speak. The combination of HTML and CSS does an adequate job of bridging that gap.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;make-new-friends&quot;&gt;Make New Friends&lt;/h3&gt;

&lt;p&gt;The benefits of great design are too numerous to expound on. A poorly designed project will turn away new users left and right, while great design will draw in larger crowds. Seek out help from designers among your friends and acquaintances, or look online&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; for willing partners in crime.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;There are some great social networks targeted at designers, such as &lt;a href=&quot;http://dribbble.com&quot;&gt;Dribbble&lt;/a&gt; and &lt;a href=&quot;https://forrst.com/&quot;&gt;Forrst&lt;/a&gt;.&lt;a href=&quot;#fnref:1&quot; rev=&quot;footnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
  </entry>
  
  <entry>
    <title>Hacking Hacker Culture</title>
    <link href="http://dominicdagradi.com/blog/2011/10/07/hacking-hacker-culture/"/>
    <updated>2011-10-07T17:55:00-04:00</updated>
    <id>http://dominicdagradi.com/blog/2011/10/07/hacking-hacker-culture</id>
    <content type="html">&lt;p&gt;There’s a funny contradiction amongst developers. It’s a mark of pride to work the longest hours, drink the most caffeine, eat at your desk and sleep the least. Essentially, whoever can endure the most punishment gets to be king of the hill. Obviously I’m being hyperbolic, but it’s fascinating that we respect each other’s ability to disregard personal wellness.&lt;/p&gt;

&lt;!&#8211;more&#8211;&gt;

&lt;p&gt;In reality, all of these behaviors detract from the quality of work that we produce. The New York Times recently published an &lt;a href=&quot;http://www.nytimes.com/2011/08/21/magazine/do-you-suffer-from-decision-fatigue.html?_r=1&quot;&gt;article&lt;/a&gt; about decision fatigue, explaining why we make poorer choices when exhausted:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;It’s different from ordinary physical fatigue — you’re not consciously aware of being tired — but you’re low on mental energy. The more choices you make throughout the day, the harder each one becomes for your brain, and eventually it looks for shortcuts. […] Ducking a decision often creates bigger problems in the long run, but for the moment, it eases the mental strain. You start to resist any change, any potentially risky move.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The notion that, if you stay up just one more hour and have one more Red Bull, you’ll be able to solve that one nagging problem ends up being false more often than not. The deadlines are rarely important enough to risk the bad choices, and a fresh set of eyes in the morning usually solves all conundrums.&lt;/p&gt;

&lt;p&gt;The other half of the problem revolves around taking care of our bodies. In &lt;a href=&quot;http://www.fastcompany.com/1783263/the-creative-brain-on-exercise&quot;&gt;The Creative Brain on Exercise&lt;/a&gt;, the author relates numerous studies that link exercise and physical activity with increased neuroplasticity, or “the ability of the brain to literally rewire itself”, which relates to  both mood and the ability to think creatively. In the same article, he touches on the cultural tropes that may steer so many of us away from exercise:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;A large number of artists and entrepreneurs resist exercise as a key element in their ability to do what they most want to do–make cool stuff that speaks to a lot of people. In the case of artists, I often wonder if that resistance is born of a cultural chasm that many artists grew up with, where jocks were jocks, artists were artists, hackers were hackers, and never the twain would meet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Can we, as a community, dispel the perception that we’ll be better programmers at the expense of our health? Encourage yourself and others to make small changes throughout the day. Instead of having a second or third coffee, take a walk around the block. Instead of doing a ninth straight hour of work, go home and give yourself a break. Or go to sleep, because it’s 4 in the morning. Drink water instead of soda. Eat a salad — it’s tasty.&lt;/p&gt;

&lt;h3 id=&quot;but-i-really-like-red-bull&quot;&gt;But I Really Like Red Bull&lt;/h3&gt;

&lt;p&gt;That’s cool. I really like coffee; it’s delicious, but it’s never helped me solve a problem late at night. When you’re mentally fatigued, there are few alternatives other than rest. Programming&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; is an active and engaging intellectual activity, and once fatigue sets in, you just can’t be your best.&lt;/p&gt;

&lt;p&gt;I’ve been eating simpler, healthier foods and making myself get to bed before midnight during the week. My partner and I have been doing yoga as regularly as possible since this spring, and have just started the Couch-to-5k program together. My overall energy levels have significantly increased. I feel less stressed, happier at work, and more full of ideas than any time in recent memory. Eventually, the process becomes more refreshing than painful.&lt;/p&gt;

&lt;p&gt;Sometimes it’s hard to make changes on your own. Find someone who also wants to exercise, or who’s interested in sharing the work of cooking healthier meals together. If none of your friends are interested in working out, go to the gym and make some new friends&lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;. (If you know me personally, I would love to work out with you!)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://twitter.com/rsanheim&quot;&gt;Rob Sanheim&lt;/a&gt; gave a great presentation about this at RubyConf 2011, inspiring many of my points. The more people working to destroy the myths surrounding hacker culture, the better. His slides are available &lt;a href=&quot;http://t.co/yzbBsT5b&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;Also true of designing. And writing. And so many other professions.&lt;a href=&quot;#fnref:1&quot; rev=&quot;footnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;Every person I’ve ever met at a gym has been kind, courteous and willing to teach. A lot like programmers.&lt;a href=&quot;#fnref:2&quot; rev=&quot;footnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
  </entry>
  
  <entry>
    <title>Insanely Great</title>
    <link href="http://dominicdagradi.com/blog/2011/10/05/insanely-great/"/>
    <updated>2011-10-05T21:00:00-04:00</updated>
    <id>http://dominicdagradi.com/blog/2011/10/05/insanely-great</id>
    <content type="html">&lt;p&gt;My first computer was a Macintosh Plus. My father, a musician, bought it to use as a digital sequencer for creating new compositions. Sitting in his lap at just two years old, I watched in awe as he created incredible new sounds from a plastic keyboard. Playing games on it, I desperately wanted to create new and exciting adventures of my own. That small, gray box with a small, gray screen inspired a sense of wonder and joy that remains with me every time I touch a computer to this day.&lt;/p&gt;

&lt;p&gt;Steve Jobs changed my life. He changed the way we interact with the world, and nearly every computer, phone and device today bears his mark in some way, large or small. President Obama expressed it powerfully in his &lt;a href=&quot;http://www.whitehouse.gov/blog/2011/10/05/president-obama-passing-steve-jobs-he-changed-way-each-us-sees-world&quot;&gt;statement&lt;/a&gt; this evening:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Steve was fond of saying that he lived every day like it was his last.  Because he did, he transformed our lives, redefined entire industries, and achieved one of the rarest feats in human history: he changed the way each of us sees the world.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thank you, Steve. For inspiring us all to think differently, and create insanely great things every day.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>MacRuby Ups and Downs</title>
    <link href="http://dominicdagradi.com/blog/2011/10/04/macruby-ups-and-downs/"/>
    <updated>2011-10-04T14:00:00-04:00</updated>
    <id>http://dominicdagradi.com/blog/2011/10/04/macruby-ups-and-downs</id>
    <content type="html">&lt;p&gt;We’ve been building &lt;a href=&quot;http://briquetteapp.com/&quot;&gt;Briquette&lt;/a&gt; at Bearded&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; on and off since December 2010. When beginning the project, we chose to use &lt;a href=&quot;http://macruby.org&quot;&gt;MacRuby&lt;/a&gt; as a way to make the project more accessible to our developers that weren’t familiar with Objective-C, and to explore a possible future of native Mac OS X (and iOS) development. &lt;/p&gt;

&lt;p&gt;For building new Mac apps, I would recommend MacRuby without hesitation. It delivers on the promise of bringing the best aspects of Ruby to native, desktop app development. Abstracting away from Objective-C’s sometimes-too-verbose syntax is often a joy, and it’s useful to have access to the complete library of both Cocoa frameworks and Ruby gems&lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;. It’s a young framework that’s getting better by the day, and the good has consistently outweighed the bad.&lt;/p&gt;

&lt;p&gt;But there are drawbacks, especially when using Xcode heavily. I want to touch on some areas that I feel have often been ignored, or covered inadequately, and pour a little cold water on the heads of anyone starting a MacRuby project. But just a little.&lt;/p&gt;

&lt;!&#8211;more&#8211;&gt;

&lt;h3 id=&quot;objective-c-its-not-optional&quot;&gt;Objective-C: It’s Not Optional&lt;/h3&gt;

&lt;p&gt;One of our goals in choosing MacRuby was to simplify the learning process for developers with minimal experience with Objective-C and Apple’s frameworks. In practice, though, one can’t get by with zero knowledge of Cocoa APIs before diving into the Ruby wrapper. &lt;/p&gt;

&lt;p&gt;Cocoa is a verbose framework. It’s actually one of the things I find most attractive about it. Xcode does everything it can to enhance the experience of coding with excellent method suggestions and code completion for Objective-C, but is unable to help in Ruby files. This lack of help, coupled with the need to have a grasp of delegates, actions, outlets, and XIBs/Interface Builder, makes MacRuby more difficult for someone coming from a purely Ruby background.&lt;/p&gt;

&lt;h3 id=&quot;deployment-in-the-walled-garden&quot;&gt;Deployment in the Walled Garden&lt;/h3&gt;

&lt;p&gt;Submitting to the Mac App Store can be a complicated process, even when using only vanilla frameworks. MacRuby (and Apple) have made this a moving target, whether it’s Xcode’s failure to sign binaries, MacRuby embedding itself incorrectly, or other build inconsistencies.&lt;/p&gt;

&lt;p&gt;With Xcode 4.1, our current process is this:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Archive project with Xcode&lt;/li&gt;
  &lt;li&gt;Export archive from Xcode’s organizer&lt;/li&gt;
  &lt;li&gt;Embed MacRuby’s framework and compile the Ruby code from the command line&lt;/li&gt;
  &lt;li&gt;Manually code-sign app&lt;/li&gt;
  &lt;li&gt;Manually build installer package and submit with Application Loader&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This process has actually gotten more complex over time, and it’s unclear where the fault lies in that. Initially, all building, embedding and compiling took place via Xcode actions, but over time, each step has broken down. &lt;/p&gt;

&lt;p&gt;If you’re having any issues deploying, feel free to ping me on Twitter. It might be the subject of an upcoming blog post.&lt;/p&gt;

&lt;h3 id=&quot;blindly-debugging&quot;&gt;Blindly Debugging&lt;/h3&gt;

&lt;p&gt;Let’s look at an issue I just had to track down in the production build of Briquette. &lt;/p&gt;

&lt;div class=&quot;bogus-wrapper&quot;&gt;&lt;notextile&gt;&lt;figure class=&quot;code&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;&quot;&gt;&lt;span class=&quot;line&quot;&gt;10/3/11 1:03:54.260 PM Briquette: /Applications/Briquette.app/Contents/Resources/rb_main.rb:25:in `&amp;lt;main&amp;gt;&#8217;: undefined method `[]&#8217; for nil:NilClass (NoMethodError)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/notextile&gt;&lt;/div&gt;

&lt;p&gt;That’s not a great error message: &lt;em&gt;rb_main.rb&lt;/em&gt; is the root Ruby file of a MacRuby application, and the interpreter (in)correctly catches errors there. Maybe the stack trace will help more…&lt;/p&gt;

&lt;div class=&quot;bogus-wrapper&quot;&gt;&lt;notextile&gt;&lt;figure class=&quot;code&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;11&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;12&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;13&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;14&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;15&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;16&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;17&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;18&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;19&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;20&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;21&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;22&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;23&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;24&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;25&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;26&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;27&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;28&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;29&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;30&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;31&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;32&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;33&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;34&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;35&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;36&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;37&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;&quot;&gt;&lt;span class=&quot;line&quot;&gt;10/3/11 1:03:54.277 PM Briquette: (
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	0   CoreFoundation                      0x00007fff8f78f986 __exceptionPreprocess + 198
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	1   libobjc.A.dylib                     0x00007fff920c3d5e objc_exception_throw + 43
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	2   libmacruby.dylib                    0x00000001001ec2ee rb_vm_raise + 430
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	3   libmacruby.dylib                    0x00000001000cc6b9 rb_exc_raise + 9
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	4   libmacruby.dylib                    0x00000001001f0c82 rb_vm_method_missing + 562
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	5   libmacruby.dylib                    0x00000001001dc3d4 rb_vm_dispatch + 7828
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	6   libmacruby.dylib                    0x00000001001df640 rb_vm_respond_to2 + 736
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	7   libmacruby.dylib                    0x00000001001dab48 rb_vm_dispatch + 1544
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	8   Room.rbo                            0x000000010898c8d4 Room.rbo + 6356
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	9   Room.rbo                            0x000000010898cc65 Room.rbo + 7269
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	10  Room.rbo                            0x0000000108995de6 MREP_81CDDE71AED14C6D8C5A0685717E5E9E + 35574
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	11  libmacruby.dylib                    0x00000001001dc919 rb_vm_dispatch + 9177
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	12  libmacruby.dylib                    0x0000000100181d02 rb_objc_isEqual + 1842
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	13  Briquette                           0x0000000100019d6e Briquette + 105838
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	14  CoreFoundation                      0x00007fff8f77f11d -[NSObject performSelector:withObject:] + 61
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	15  Foundation                          0x00007fff88ed9830 __NSThreadPerformPerform + 214
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	16  CoreFoundation                      0x00007fff8f6fe241 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	17  CoreFoundation                      0x00007fff8f6fdaad __CFRunLoopDoSources0 + 253
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	18  CoreFoundation                      0x00007fff8f7248d9 __CFRunLoopRun + 905
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	19  CoreFoundation                      0x00007fff8f724216 CFRunLoopRunSpecific + 230
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	20  HIToolbox                           0x00007fff8e9a84ff RunCurrentEventLoopInMode + 277
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	21  HIToolbox                           0x00007fff8e9afc21 ReceiveNextEventCommon + 355
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	22  HIToolbox                           0x00007fff8e9afaae BlockUntilNextEventMatchingListInMode + 62
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	23  AppKit                              0x00007fff8b4abfc5 _DPSNextEvent + 659
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	24  AppKit                              0x00007fff8b4ab8c9 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 135
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	25  AppKit                              0x00007fff8b4a820a -[NSApplication run] + 463
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	26  AppKit                              0x00007fff8b72635e NSApplicationMain + 867
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	27  ???                                 0x000000010462a5ad 0x0 + 4368541101
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	28  libmacruby.dylib                    0x00000001001da979 rb_vm_dispatch + 1081
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	29  ???                                 0x0000000104600c34 0x0 + 4368370740
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	30  ???                                 0x000000010460059d 0x0 + 4368369053
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	31  libmacruby.dylib                    0x00000001001f55f6 rb_vm_run + 470
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	32  libmacruby.dylib                    0x00000001000ccd00 ruby_run_node + 80
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	33  libmacruby.dylib                    0x00000001001ec021 macruby_main + 385
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;	34  Briquette                           0x000000010000180c Briquette + 6156
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/notextile&gt;&lt;/div&gt;

&lt;p&gt;That narrows it down a little more. I can at least identify that it’s coming from my &lt;em&gt;Room.rb&lt;/em&gt; model (lines 8-10). Better, but not great. The &lt;em&gt;.rbo&lt;/em&gt; file extension is a compiled Ruby file, and as expected, being compiled wasn’t its life goal. It’s currently difficult to get good debugging symbols out of compiled Ruby, and the alternative — shipping uncompiled code — is a scary prospect&lt;sup id=&quot;fnref:3&quot;&gt;&lt;a href=&quot;#fn:3&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;Even while developing, your tools will be limited. You can’t pause your application and step through Ruby code, since the built-in debugger isn’t designed to work with an interpreted language. The working solution is to use the tried-and-true print statement to query application state: effective, but far less valuable than Xcode’s advanced debugging (and profiling) tools.&lt;/p&gt;

&lt;p&gt;At &lt;a href=&quot;http://rubyconf.org&quot;&gt;RubyConf&lt;/a&gt; this past weekend, @brixen’s talk about Nikita and Ruby tools included a great quip:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Ruby has the best tools&lt;/p&gt;&lt;footer&gt;&lt;strong&gt;No One&lt;/strong&gt;&lt;cite&gt;Ever&lt;/cite&gt;&lt;/footer&gt;&lt;/blockquote&gt;

&lt;p&gt;Debugging Ruby has never been a pleasurable experience, and it’s no different here. Hopefully future updates to MacRuby can address this with better Xcode integration.&lt;/p&gt;

&lt;h3 id=&quot;memory-or-a-lack-thereof&quot;&gt;Memory, or a Lack Thereof&lt;/h3&gt;

&lt;blockquote&gt;&lt;p&gt;@briquetteapp I like you but are you sure you need this much memory? d.pr/tggu&lt;/p&gt;&lt;footer&gt;&lt;strong&gt;markoa&lt;/strong&gt;&lt;cite&gt;&lt;a href=&quot;http://twitter.com/#!/markoa/status/116494092350930944&quot;&gt;twitter.com/#!/markoa/status/&amp;hellip;&lt;/a&gt;&lt;/cite&gt;&lt;/footer&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;p&gt;@briquetteapp Any upcoming changes around the memory consumption issue? It&amp;#8217;s bad here: http://t.co/ay015aI&lt;/p&gt;&lt;footer&gt;&lt;strong&gt;seeflanigan&lt;/strong&gt;&lt;cite&gt;&lt;a href=&quot;https://twitter.com/seeflanigan/status/90925279182209024&quot;&gt;twitter.com/seeflanigan/status/&amp;hellip;&lt;/a&gt;&lt;/cite&gt;&lt;/footer&gt;&lt;/blockquote&gt;

&lt;p&gt;Tell me about it, guys. No, we certainly don’t need all that memory. Honestly, we’re still trying to track this one down, though we’ve squashed quite a few bugs recently. The crux of the issue is that when profiling, as with debugging, we can’t use standard tools to examine what objects our application is leaking. Instruments, Apple’s profiling tool, isn’t aware of Ruby objects and considers them all leaks, making it difficult to extract real data.&lt;/p&gt;

&lt;p&gt;The other potential snag is that using MacRuby forces you to require garbage collection in your application. Apple’s garbage collector is lacking, and not all Cocoa frameworks are garbage collection safe. Xcode 4.1, with the new LLVM compiler, does an excellent job of tracking down the latter issue in Cocoa libraries, but determining the source of leaks otherwise is nearly impossible.&lt;/p&gt;

&lt;p&gt;Our memory issues could be due to our use of Webkit&lt;sup id=&quot;fnref:4&quot;&gt;&lt;a href=&quot;#fn:4&quot; rel=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;, bugs in Apple’s garbage collector, leaks in MacRuby itself, or bad design in our Ruby code. There’s just no easy way to find out. I can say with certainty that MacRuby claims ~70-100MB of RAM per process. Where does the rest of it go? We’ll let you know.&lt;/p&gt;

&lt;h3 id=&quot;well-that-sounds-awful&quot;&gt;Well That Sounds Awful&lt;/h3&gt;

&lt;p&gt;It’s not.&lt;/p&gt;

&lt;p&gt;No really, it isn’t. &lt;/p&gt;

&lt;p&gt;This isn’t a condemnation of MacRuby or its effectiveness as a framework. As a developer mapping my Ruby knowledge onto my Objective-C and Cocoa experience, I found some surprises along the way. I do want new MacRuby developers to be informed about potential pitfalls, and be ready for whatever challenges come their way. Despite the setbacks, MacRuby enabled us to rapidly prototype and iterate on an idea, and easily build and submit it to the App Store.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;Bearded is where I work. It’ll be on the “About” page once that’s live, but if you’re impatient, check out the great work of all the Beardeds at &lt;a href=&quot;http://bearded.com&quot;&gt;http://bearded.com&lt;/a&gt;.&lt;a href=&quot;#fnref:1&quot; rev=&quot;footnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;Some gems won’t work quite right. As MacRuby is an implementation distinct from the standard MRI Ruby, compatability issues can arise.&lt;a href=&quot;#fnref:2&quot; rev=&quot;footnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot;&gt;
      &lt;p&gt;You can certainly ship a MacRuby app with uncompiled Ruby files, but it exposes any Ruby source code used by your application. See? Petrifying!&lt;a href=&quot;#fnref:3&quot; rev=&quot;footnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:4&quot;&gt;
      &lt;p&gt;Seriously, Webkit is a bad citizen. Have you used Safari lately?&lt;a href=&quot;#fnref:4&quot; rev=&quot;footnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
  </entry>
  
  <entry>
    <title>1.0</title>
    <link href="http://dominicdagradi.com/blog/2011/10/03/one-point-oh/"/>
    <updated>2011-10-03T11:46:00-04:00</updated>
    <id>http://dominicdagradi.com/blog/2011/10/03/one-point-oh</id>
    <content type="html">&lt;blockquote&gt;&lt;p&gt;Many painters are afraid of the blank canvas, but the blank canvas is afraid of the truly passionate painter who dares – and who has once broken the spell of &amp;#8220;you can’t&amp;#8221; once and for all.&lt;/p&gt;&lt;footer&gt;&lt;strong&gt;Vincent Van Gogh&lt;/strong&gt;&lt;cite&gt;Letter to Theo Van Gogh&lt;/cite&gt;&lt;/footer&gt;&lt;/blockquote&gt;

&lt;p&gt;It’s time to scratch an itch I’ve had for a while. &lt;/p&gt;

&lt;p&gt;Writing is a challenge to me. Just like in software development, it’s easy to fall into the trap of not being satisfied until something is perfect. More often than not, that leads to never releasing anything.&lt;/p&gt;

&lt;p&gt;Seth Godin had a &lt;a href=&quot;http://sethgodin.typepad.com/seths_blog/2011/09/talkers-block.html&quot;&gt;great post&lt;/a&gt; recently about barriers to writing, and hitting home the need to practice publicly. Rather than constantly revising until a product reaches an imaginary level of quality, release early, release often, and learn from mistakes and missteps.&lt;/p&gt;

&lt;p&gt;So here we are at 1.0 - every post is a new project released to the public, and there will be a new post every (week)day for the next two weeks to get things started. I’m looking forward to talking about technology, code, and the inherent creative processes involved. Watch this space.&lt;/p&gt;

&lt;p&gt;:)&lt;/p&gt;
</content>
  </entry>
  
</feed>

