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

  <title><![CDATA[Acko.net]]></title>
  <link href="http://acko.net/atom.xml" rel="self"/>
  <link href="http://acko.net/"/>
  <updated>2012-05-17T01:12:29-07:00</updated>
  <id>http://acko.net/</id>
  <author>
    <name><![CDATA[Steven Wittens]]></name>
    
  </author>

  
  <entry>
    <title type="html"><![CDATA[Introducing Facing.me]]></title>
    <link href="http://acko.net/blog/introducing-facing-me/"/>
    <updated>2012-04-25T00:00:00-07:00</updated>
    <id>http://acko.net/blog/introducing-facing-me</id>
    <content type="html"><![CDATA[<div class='g8 i2 first'><div class='pad'>

  <h1>Introducing Facing.me</h1>
  <h2>A unique way to meet people</h2>

</div></div><div class='c' /><aside class='g5'>
  <p class='tc'>
    <img alt='Facing.me' src='/files/fme/facing.me.face.jpg' style='top: 0' />
  </p>
</aside><div class='g7'><div class='pad'>

<p>
We've been sending out whispers for a while now, but it's finally out: a new web site called <a href='http://facing.me'>Facing.me</a>. Coded and designed by <a href='http://mikejholly.com'>Michael Holly</a>, <a href='http://rosshj.com/'>Ross Howard-Jones</a> and myself, it promises a <em>unique way to meet people online</em>. This would be the point where the obvious question is dropped: wait, what… you built a <em>dating site</em>?</p>

<p>Sort of. Let me explain.</p>

<p>Having spent many years in the web world, we'd all gotten a bit complacent. The web has settled into its comfortable rhythms. Sites and applications can be modelled quickly and coded on your framework of choice. And nowadays, Web 2.0 cred comes baked in: clean URLs, semantic HTML, AJAX, data feeds, APIs, etc. Isn't this what we all wanted?</p>

<p>But the web continues to evolve, and giants are roaming the playground. Sites like Facebook and Twitter hold people's attention with surgical precision, while engines like Google answer your queries with lightning speed. Given that we've all slotted such services into our workflows and indeed lives, it seems only natural that 'indie' developers should keep up. We can't pretend that a 2000-era style web-page-with-ajax-sprinkles is the pinnacle of modern interactive design.</p>

<p>So we set out to try something different.</p>

</div></div><div class='img12'>
  <a href='http://facing.me'><img alt='Facing.me website' src='/files/fme/facing.me.site.jpg' /></a>
</div><!--
<div class="g8 i2 first"><div class="pad">  

</div></div>
--><div class='g6'><div class='pad'>

<h2>A Guy Walks into a Bar...</h2>

<p>If you've managed to score an invite, the first thing you'll see is the wall of faces that loads and fills the screen. The second thing you'll notice—we hope at least—is the lack of everything else.</p>

<p>The metaphor we kept in mind was the idea of walking into a bar, and looking around. If you see someone you like, you can go up to them and strike up a conversation. So that's exactly what the app lets you do, through video chat. You can pan around to see more people, and just keep going. If you're looking for something specific, you can filter your view with a simple "I'm looking for…" dialog.</p>

<p>As you mouse around, you can see who's online, and flip open their profile. If you want to strike up a video chat, it happens right there too. If the person is online, they'll see your request immediately in a popup and can choose to accept or decline after reviewing your profile. If they're offline, they'll see your request next time they visit.</p>

<p>To avoid missed connections, you can 'like' people you're interested in. You'll see (and hear) a notification pop up the moment they're online. You can keep the app open in a background tab and never miss a thing.</p>

<p>Aside from some minor social glue and a few fun little extras for you to discover, that's it. It's our twist on a <em>minimally viable product</em> if you will. Studies have shown that online matching algorithms are a poor predictor for how well people mesh in person. Until you meet face-to-face, you just don't know. We think direct, spontaneous video chat is a better first step rather than endless profile matching and messaging.</p>

</div></div><aside class='g6 m1'>
  <p class='p0'><img alt='Facing.me welcome screen' src='/files/fme/facing.me.start.jpg' /></p>

  <p class='p0'><img alt='Facing.me welcome screen' src='/files/fme/facing.me.profile.jpg' /></p>

  <p class='p0'><img alt='Facing.me notification' src='/files/fme/facing.me.growl.jpg' /></p>

  <p class='p0'><img alt='Facing.me liking' src='/files/fme/facing.me.like.jpg' /></p>
</aside><div class='g8 i2'><div class='pad'>

<h2>Polishing Bacon</h2>

<p>But despite its minimalism, a big aspect of Facing.me is the effort and care we put into it. Our goal was to achieve a level of polish typically reserved for premium iPhone apps and bring it into the browser. We wrapped the whole thing in a crisp design, enhanced with tasteful web fonts. But most importantly, we sought to expose the app's functionality with as little interruption as possible. To do that, we layered on plenty of transitions driven by CSS3 and JavaScript, and stream in data and content as needed.</p>

<p>Based on previous work in custom animations—and <a href='/blog/abusing-jquery-animate-for-fun-and-profit-and-bacon'>bacon</a>—we refined the approach of using jQuery as an animation helper for completely custom transitions. We tell jQuery to animate placeholder properties on orphaned proxy divs, and key off those animations with per-frame code to drive the fancy stuff.</p>

</div></div><div class='img12'>
  <img alt='facing.me animation example' src='/files/fme/transition.jpg' />
</div><div class='g8 i2'><div class='pad'>
<p>As a result, we can have a photo grow a picture frame as you pick it up, and then flip it around to show a person's full profile. This careful choreography involves animating about a dozen CSS properties, including borders, shadows, margins and 3D transforms, all with custom expressions and hand-tuned animation curves. Similar transitions are used for lightbox dialogs.</p>

<p>Throughout all of this, the animations remain eminently manageable. We can interrupt and reverse them at any point, and run multiple copies at the same time, thanks to pervasive use of view controllers. Far from being a useless tech demo, it actually enables us to craft the user experience exactly the way we like it: being able to acknowledge user intentions with intuitive feedback no matter what's going on, and firing off new events and requests without worrying about the internal state. Gone are the fragile jQuery behavior soups of old.</p>

<p>The one downside is that only the newer browsers—i.e. Chrome, Safari and Firefox—get to see everything the way it was intended. And actually the performance in Firefox is still a bit disappointing. IE9 users will have to be satisfied with a crude 2D approximation until IE10 comes out.</p>

</div></div><div class='g8 first'><div class='pad'>

<h2>Rapid Rails and Real-Time Node</h2>

<p>To make all this work effectively on the server-side, we used a dual-mode stack of Rails and Node.js.</p>

<p>The Rails side houses the app's models and controllers, and provides an API for all the client-side JavaScript to do its job. Video chats are handled through Flash and routed through its built-in peer-to-peer functionality.</p>

<p>The node.js component acts as a real-time presence daemon which users connect to over socket.io. It's used to drive the status notifications and to coordinate the video chats. We can exchange any sort of notifications between users with a publish-subscribe model, opening up many interesting avenues for future development.</p>

<p>Overall, this approach has worked out great. Rails' ActiveRecord and the stack around it allowed us to build out functionality quickly and with just the right amount of necessary baggage. We made generous use of Ruby Gems to save time while still maintaining full control.</p>

<p>Node.js's event-driven model adds real-time signalling with no hassle. For the few cases where node.js needs to interface with the Rails database directly, we slot in some manual SQL to take care of that. For everything else, Rails and node.js exchange signed data through the browser.</p>

</div></div><aside class='g4 m1'><div class='pad'>
  <p><img alt='Node.js' src='/files/fme/nodejs.png' /></p>

  <p><img alt='Rails' src='/files/fme/rails.jpg' /></p>
</div></aside><div class='g8 i2 first'><div class='pad'>

<h2>Come Take it for a Spin</h2>

<p>Finally, we also put our heads together and made a promo video, voiced by the lovely <a href='https://twitter.com/t1nah'>Tina Hoang</a>:</p>

</div></div><pre class='markdown-html-error' style='border: solid 3px red; background-color: pink'>REXML could not parse this XML/HTML: 
&lt;div style=&quot;max-width: 854px; width: 100%; margin: 0 auto&quot;&gt;

&lt;!--
&lt;iframe width=&quot;854&quot; height=&quot;480&quot; src=&quot;http://www.youtube.com/embed/Ua67Hf1T7yI?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
--&gt;
&lt;iframe src=&quot;http://player.vimeo.com/video/41056588?title=0&amp;amp;byline=0&amp;amp;portrait=0&quot; width=&quot;854&quot; height=&quot;480&quot; frameborder=&quot;0&quot; webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;

&lt;/div&gt;</pre><div class='g8 i2'><div class='pad'>

<p>Built in our spare time by just 3 guys in a virtual garage, we're pretty proud of the end result. We'd love for you to take it for a spin, so <a href='http://facing.me'>head over to facing.me</a> and grab yourself an invite. There's a feedback form built-in, and any suggestions are welcome.</p>

<p>Discuss on <a href='https://plus.google.com/112457107445031703644/posts/efHMJE1Wxx2'>Google Plus</a>.</p>

</div></div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Abusing jQuery.animate for fun and profit (and bacon)]]></title>
    <link href="http://acko.net/blog/abusing-jquery-animate-for-fun-and-profit-and-bacon/"/>
    <updated>2008-09-22T00:00:00-07:00</updated>
    <id>http://acko.net/blog/abusing-jquery-animate-for-fun-and-profit-and-bacon</id>
    <content type="html"><![CDATA[<div class='g8 i2 first'><div class='pad'><h1>Abusing jQuery.animate for fun and profit (and bacon)</h1><p>The days of static UIs that only have jarring transitions between pages are pretty much over. With frameworks like <a href='http://developer.apple.com/documentation/Cocoa/Conceptual/CoreAnimation_guide/Introduction/Introduction.html'>CoreAnimation</a> or <a href='http://jquery.com'>jQuery</a>, it's easy to add useful animations to applications and webpages. In the case of jQuery, you can easily animate any CSS property, and you get free work-arounds for browser bugs to boot. You can run multiple animations (of arbitrary duration) at the same time, queue animations and even animate complex properties like colors or clipping rectangles.
</p>


<aside class='r m1'><img alt='Strip of bacon' src='/files/bacon/bacon1.png' style='width: 100px' /></aside>

<p>But what if you want to go beyond mere CSS? You might have a custom widget that is drawn using <code>&lt;canvas&gt;</code>, whose contents are controlled by internal variables; maybe you're using 3D transformations to scale and position images on a page, and simple 2D tweening just doesn't cut it.
</p>

<p>
In that case, it would seem you are out of luck: jQuery's .animate() method can only be applied to a collection of DOM elements, and relies heavily on the browser's own semantics for processing CSS values and their units. However thanks to JavaScript's flexibility and jQuery's architecture, we can work around this, and re-use jQuery's excellent animation core for our own nefarious purposes.
</p>

<h2>Hackity hack hack</h2>

<p>
First, we need an object to store all the variables we wish to animate. We use an anonymous <code>&lt;div&gt;</code> outside of the main document, so that jQuery's DOM calls still work on it. We simply add our own properties to it:
</p>

<p class='codeblock'>
<code>var&nbsp;vars&nbsp;=&nbsp;$.extend($('&lt;div&gt;')[0],&nbsp;{<br />
&nbsp;&nbsp;foo:&nbsp;1,<br />
&nbsp;&nbsp;bar:&nbsp;2,<br />
<br />
&nbsp;&nbsp;customAnimate:&nbsp;true,<br />
&nbsp;&nbsp;updated:&nbsp;true<br />
});<br />
</code>
</p>

<p>
In this case, our properties are <code>foo</code> and <code>bar</code>. We also set <code>customAnimate</code> and <code>updated</code> to identify this object (see below).
</p>

<p>
Next we need to override jQuery's default step function, which gets called for every step of an animation, and applies new values to an element's CSS properties.
</p>

<p class='codeblock'>
<code>&nbsp;&nbsp;&nbsp;//&nbsp;jQuery.fx.step._default<br />
&nbsp;&nbsp;&nbsp;&nbsp;_default:&nbsp;function(fx)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fx.elem.style[fx.prop]&nbsp;=&nbsp;fx.now&nbsp;+&nbsp;fx.unit;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</code>
</p>

<p>
We can replace it using the following snippet:
</p>

<p class='codeblock'>
<code>var&nbsp;$_fx_step_default&nbsp;=&nbsp;$.fx.step._default;<br />
$.fx.step._default&nbsp;=&nbsp;function&nbsp;(fx)&nbsp;{<br />
&nbsp;&nbsp;if&nbsp;(!fx.elem.customAnimate)&nbsp;return&nbsp;$_fx_step_default(fx);<br />
&nbsp;&nbsp;fx.elem[fx.prop]&nbsp;=&nbsp;fx.now;<br />
&nbsp;&nbsp;fx.elem.updated&nbsp;=&nbsp;true;<br />
};<br />
</code>
</p>

<p>
With the new step function, jQuery will check for the presence of a <code>customAnimate</code> property on any element it is animating. If present, it will assign the (unit-less) value to <code>element.property</code> rather than <code>element.style.property</code> and mark the element by setting <code>element.updated</code> to true.
</p>

<p>
Now we're ready to animate, using the normal <code>$.animate</code> syntax:
</p>

<p class='codeblock'>
<code>$(vars).animate({&nbsp;foo:&nbsp;5,&nbsp;bar:&nbsp;10&nbsp;},&nbsp;{&nbsp;duration:&nbsp;1000&nbsp;});<br />
</code>
</p>

<p>
The values <code>vars.foo</code> and <code>vars.bar</code> will now smoothly change over time. You can use any of <a href='http://docs.jquery.com/Effects/animate'>jQuery's animation abilities</a> as usual.
</p>

<p>
Now what about that <code>updated</code> variable? Well to actually use these animated values, you will need some kind of timer or step callback to read them back and draw them on the page. If you're using <code>&lt;canvas&gt;</code>, you need to redraw your entire widget for every change, but you don't want to be wasting CPU time by constantly refreshing it. Furthermore, if you're running multiple animations at the same time, you'll want to aggregate all your property changes into a single redraw per frame. This is easy with the <code>updated</code> property and a simple timer:
</p>

<p class='codeblock'>
<code>setInterval(function&nbsp;()&nbsp;{<br />
&nbsp;&nbsp;if&nbsp;(!vars.updated)&nbsp;return;<br />
&nbsp;&nbsp;vars.updated&nbsp;=&nbsp;false;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;drawWidget();<br />
},&nbsp;30);<br />
</code>
</p>

<p>
Now your widget will only refresh itself when its values are changed by the animation step function we defined earlier, and very few CPU cycles are wasted. As a plus, you can render updates as fast or as slow as you want, without affecting the duration of your animations.
</p>

<h2>Demo</h2>

<p>
I whipped up a quick demo which renders a <a href='/files/bacon/animation-demo.html'>cloud of bacon</a> using <code>&lt;canvas&gt;</code>. All the motion in the demo is created through <code>$.animate()</code>, with a bunch of animations running at once.
</p>

<p>
<small><em>This demo will not work in Internet Explorer, and has only been tested in Firefox 3 and Safari 3.</em></small>
</p>

<p>
This is a rather esoteric example, but there are plenty of useful ways to apply this technique. I've used it to implement <a href='/files/bacon/omgpizza.mov'>smooth, beautiful, usable widgets</a>. You can combine multiple motion and opacity animations triggered by clicks and hovers without issues.
</p>
 
<h2>Final notes</h2>

<p>
While this technique works great, there is one big caveat. You should avoid animating any property that exists in CSS ('float', 'display', 'opacity', ...) because these have unexpected side effects depending on the browser.
</p>

<p>
There are also a couple of weaknesses:
</p>

<ul>
  <li>jQuery does not support continued easing. That is, when you override an animation that is already in progress, the variable being animated will instantly stop and restart from its current position. The rate of change is not continuous between the two animations.</li>
  <li>Animating angles is tricky. E.g. when animating from 350˚ to 0˚, you want it to animate across 10˚ and not the long way around. This requires manual correction.</li>
</ul>

<p>
And obviously, it would be cleaner if jQuery's animation core was refactored to separate out the CSS-specific code instead...
</p>

</div></div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Nokia N73 Review]]></title>
    <link href="http://acko.net/blog/nokia-n73-review/"/>
    <updated>2007-01-31T00:00:00-08:00</updated>
    <id>http://acko.net/blog/nokia-n73-review</id>
    <content type="html"><![CDATA[<div class='g8 i2 first'><div class='pad'><h1>Nokia N73 Review</h1><p>Two months ago I got a Nokia N73 hand-me-down from <a href='http://www.rolandtanglao.com/tags/nokia-blogger-relations'>Roland</a> thanks to Nokia's Blogger Relations Program. It's a 'smart phone' with a large 320x240 screen, a 3 megapixel camera and more. Before this, I'd been using an old Nokia 3310 brick (monochrome screen) so this was quite a step up. Still, I wasn't particularly unhappy with my old phone because all I really needed was voice calls and SMS. So I was curious myself to see if I'd actually use all the bells and whistles.
</p>

<p>
<div style='text-align: center;'><img alt='Nokia N73' src='/files/n73/n73.jpg' /></div>
</p>

<p>
The good news is that making calls and sending text messages has become easier. The default interface has a quick launch bar to access contacts, text messages and other features. Selecting a contact by typing some letters is fast and accurate, and the big screen is easy to read. I also have no problems using predictive text input thanks to years of SMS'ing, while the improved controls (such as the 4-way stick) make entering symbols easier.
</p>

<p>
Managing my contacts is now a non-issue. I edit my entire address book in Mac OS X and just sync it to the phone, including everyone's pictures. Plus, with <a href='http://www.adiumx.com/'>Adium</a> address book syncing, this means that it automatically imports IM icons for contacts that don't yet have a picture. However, I did try editing contacts on the phone itself, and it was way too complicated.
</p>

<p>
Now, the first phone feature I really enjoyed was the built-in camera. Unlike most camera phones, the N73 has a pretty good camera and lens, with auto-focus and all the works. The phone also has a flip cover, so to take a picture, you just slide open the cover on the back and hold it like a real camera (including holding down the snap button half-way for focus). There is even a button to go straight to your pictures.
</p>

<p>
However, there is a big annoyance here: it takes 5-7 seconds to open the camera application. This is way too long and makes it impossible to snap spontaneous pictures. Also, in spite of all the technical wizardry, pictures in low-light conditions and at night look very bad and washed out. The pictures it takes are also compressed too much. There's a 1GB memory card in mine, so I really wish I could save images to (near-)lossless JPEG.
</p>

<p>
<div style='text-align: center;'><a href='http://www.flickr.com/photos/unconed/315186883/' title='Photo Sharing'><img alt='View from the office' height='375' src='http://farm1.static.flickr.com/120/315186883_1c40e05ee2.jpg' width='500' /></a></div>
</p>

<p>
The second interesting feature was the MP3 player, especially in light of the 1GB of storage which would fit a lot of music. I even found a nice OS X app iTuneMyWalkman that automatically syncs iTunes playlists for me.
</p>

<p>
However, the phone's music player is simply horrible. The UI makes no use of the N73's buttons: I'd expect to be able to fast forward or backward by holding the stick left/right, and clicking it left/right to go to another song. Instead, you have to press up/down to reach the right on-screen button and then press the stick to push it.
</p>

<p>
Even more annoying is that leaving the music player stops all playback. If you wish to use the N73 like a real MP3 player, you have to go into a context-menu, scroll down and select "Play in background", then lock the keypad from the main screen every single time. The current behaviour only makes sense if you wish to listen to random audio clips at random moments, which I really don't see myself doing.
</p>

<p>
To top it all off, there's the fact that you can only use the official Nokia headphones with the N73, because they have a proprietary connector. I already have headphones for my laptop and I don't want to carry another set around.
</p>

<p>
Next, I've gotten to really like the calendar and the alerts it can provide. However, here I also stick to iCal on OS X and simply sync all my events to the phone. The phone's own calendar input is, again, clunky and cumbersome to use.
</p>

<p>
After this, I looked at the other capabilities of the phone. A highlight is the included Snakes game, which is in full 3D and features whacky snake action on square and hexagonal grids, even on curved surfaces. I've played it several times while queueing up for various things, and it's fun and easy to pick up. Bonus points for the automatic checkpointing of your progress in the game.
</p>

<p>
For playing video, the phone uses RealPlayer. Now, I realize this might sound a bit irrational, but I for one don't want anything to do with Real. They have screwed over their users for years on end producing ridiculously crappy players bundled with some of the most insidious spyware and adware seen. But even disregarding that, RealPlayer is a horrible choice as it doesn't play any of the most popular video formats, like DivX or QuickTime. With open-source players like VLC being able to play every format under the sun, there is really no excuse for this.
</p>

<p>
As for the internet features, I can't try them out because I have no data plan. It's apparently impossible to get an unlimited data plan in Vancouver, unless you get a Hiptop or have connections.
</p>

<p>
Finally, more small annoyances:
</p>

<ul>
  <li>The Nokia proprietary connector is almost-symmetrical, which means half of the time I'm trying to plug it in the wrong way.</li>
  <li>The default setup and some of the applications (like the photo browser) contain annoying plugs for online services and various lame ideas (like Nokia Lifeblog). Most cannot be removed and just get in the way.</li>
  <li>The phone always complains I unplugged it incorrectly after using the USB data cable. I haven't found any 'right' way to unplug it (and yes, I do unmount/eject the drive in OS X).</li>
  <li>The phone automatically formats the memory card in an obscure directory tree that mixes user-owned content with system libraries and applications. Images and video are saved in nested subdirectories with a weird numerical format that includes a sequence number and date, but not a single separator character. When was 28012007240.jpg taken?</li>
  <li>There is an utterly useless second "Quick launch" button that pops up an elaborate directional menu where you can choose up/left/right to pick a command. Of course, all that window dressing means it's actually terribly slow to use. It's an embarrasingly bad waste of a button and cannot be replaced or disabled.</li>
  <li>The data cable's connector is flaky and will disconnect momentarily if you fiddle with the phone while it's plugged in.</li>
  <li>The default menu setup is bizzare. Some features are located at the top level, some are inside "Tools", some are inside "Applications", some are inside "Downloads!" (yes, with exclamation mark). Luckily you can rearrange this to your liking.</li>
  <li>The keyboard is really small vertically, yet there is a lot of wasted space. Bigger buttons would be nice.</li>
</ul>
  
<p>
  After two months, the only thing I've consistently used other than voice calls and SMS is the camera, because it is really good for a phone. All the pictures on my <a href='http://flickr.com/photos/unconed/'>Flickr page</a> since December 1st were taken with the N73. I also listen to music whenever I can, but the MP3 player and proprietary headphones are too cumbersome.
</p>

<p>
The only part of the N73 that really stands out for me is the phone's form factor. I love that in spite of all its features, it's only as big as a typical phone. It's clearly designed for snapping pictures with and the screen is large and gorgeous. If the data-cable and file system didn't suck so much, I'd probably use it as a USB stick too (or better, if you could mount Bluetooth storage as local, ejectable drives).
</p>

<p>
Having used this phone, I can clearly see why traditional cellphone makers should fear Apple's iPhone. I've consistenty avoided using the phone's built-in tools like address book and calendar editing, because doing it on my Mac is orders of magnitude easier and faster. From what I've seen, the iPhone changes that. I really wish the iPhone will bring a fresh wave of usability improvements for mobile devices. But, if usability was all that mattered, we wouldn't be seeing so many Windows installs out there either...</p></div></div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Making Drupal smarter]]></title>
    <link href="http://acko.net/blog/making-drupal-smarter/"/>
    <updated>2007-01-19T00:00:00-08:00</updated>
    <id>http://acko.net/blog/making-drupal-smarter</id>
    <content type="html"><![CDATA[<div class='g8 i2 first'><div class='pad'><h1>Making Drupal smarter</h1><p>One of the things I worked on for Drupal 5 was to make Drupal smarter about itself. For example, the new status report tells you about security or maintenance problems, and can alert you if you need to run update.php after updating a module. These warnings are also pushed out to the main administration page.
</p>

<p>
This is a significant improvement in usability, as we try to make site set up and maintenance as painless as possible. The user can focus on the things they care about. If there is something that needs the admin's attention, it is clearly indicated.
</p>

<p>
The inspiration for this came from OS X. There are some really great examples of this in both Apple and third-party applications.
<!--break-->
For example, Mail.app automatically figures out if your mail server requires SSL or not: it simply tries both and sees which works when you set up the account. It happens transparently.
</p>

<p>
NewsFire does something similar. When you click the "Add feed" button, it automatically takes any URL on the clipboard, pings it and fetches the feed title (provided it points to a valid feed). All you need to do is press ok on the pre-filled form. If there is no URL on the clipboard, you get a blank form.
</p>

<p>
With our new _install and _enable hooks, and _requirements to examine the server environment, Drupal 5 modules have a lot of more opportunities to 'do the right thing' transparently. 
</p>

<p>
We should encourage this practice as much as possible. Modules that require Drupal's configuration to match certain settings should make sure they are set correctly. If the setting is relatively benign and related to the module's purpose, it can be set automatically. Otherwise, it can be a requirement for the module to be installed/enabled.
</p>

<p>
We do need to walk a fine line between information overload and too much magic. But I think we've managed to do fine so far.
</p></div></div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[jQuery Menu Scout]]></title>
    <link href="http://acko.net/blog/jquery-menu-scout/"/>
    <updated>2006-12-07T00:00:00-08:00</updated>
    <id>http://acko.net/blog/jquery-menu-scout</id>
    <content type="html"><![CDATA[<div class='g8 i2 first'><div class='pad'><h1>jQuery Menu Scout</h1><p><em><strong>Updated video</strong>: now also highlights deep links (though gray, not white), bubbles are prettier and aligned better and video capture is smoother. I also changed the music to please termie.</em>
</p>

<p>
Out of a whacky conversation on IRC comes the latest treat for <a href='http://drupal.org/'>Drupal 5.0</a>.
</p>

<p>
The new administration section is nice, but it's a big adjustment for 4.7 users. It's not immediately obvious where to go to find a certain option. Wouldn't it be handy if you could find any administration page with a couple of keystrokes? Something like Apple Spotlight?
</p>

<p>
Today's usability special: a nice slice of jQuery with some search module on the side, sprinkled with menu magic and topped off with some sexy CSS. Feast your eyes on this:
</p>

<p>
<div style='text-align: center;'>
<a href='/files/drupal-menu-scout/Drupal%20Menu%20Scout.mp4'><img alt='jQuery/Search module powered menu scout.' src='/files/drupal-menu-scout/help_guide.png' /></a><br />(MPEG-4 movie)
</div>
</p>

<p>
Patch is <a href='http://drupal.org/node/102254'>available on drupal.org</a>.</p></div></div>]]></content>
  </entry>
  
</feed>

