<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Skull Jackpot</title>
	<atom:link href="http://skulljackpot.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://skulljackpot.com</link>
	<description>Various thoughts of minimal interest to others</description>
	<lastBuildDate>Thu, 10 Dec 2009 21:29:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Process Peek: Community Almanac</title>
		<link>http://skulljackpot.com/2009/06/29/process-peek-community-almanac/</link>
		<comments>http://skulljackpot.com/2009/06/29/process-peek-community-almanac/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 20:45:50 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Process Peek]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[project]]></category>

		<guid isPermaLink="false">http://skulljackpot.com/?p=89</guid>
		<description><![CDATA[One of our current projects is a redesign for the Orton Family Foundation's <a href="http://communityalmanac.org">Community Almanac</a> site (I've mentioned it <a href="http://skulljackpot.com/2009/04/01/planting-carrots/">before</a>). The Orton Family Foundation was started by the folks who run the Vermont Country Store, and is particularly interested in preserving the stories and traditions of small-town America - something rapidly disappearing in the crush of homogenized, retail-franchise colonization efforts. I wanted to share a couple of peeks into the process for our upcoming redesign.]]></description>
			<content:encoded><![CDATA[<p>One of our current projects is a redesign for the Orton Family Foundation&#8217;s <a href="http://communityalmanac.org">Community Almanac</a> site. The Orton Family Foundation was started by the folks who run the Vermont Country Store, and is particularly interested in preserving the stories and traditions of small-town America &#8211; something rapidly disappearing in the crush of homogenized, retail-franchise colonization efforts. It&#8217;s a cool project, and <a href="http://theopenplanningproject.org">TOPP</a> had paired with them last year on launching a website to help gather and preserve the stories and information about a town&#8217;s distinctive character.</p>
<p>This spring, the Orton Family Foundation decided to have us revise the site, to help address some functional concerns, adapt to feedback from users, and refresh the look and feel. (Under-the-hood, we also migrated from Zope to Pylons). A key part of the aesthetic for the new design was really pushing the book metaphor as much as possible. I wanted to share a couple of peeks into how we incorporated that mandate into the new design. (For another take on this project, check out <a href="http://www.coactivate.org/projects/topp-engineering/blog/2009/06/26/almanac-update/">this writeup</a>).</p>
<p>For most pages, we ended up going with a very literal book metaphor:</p>
<div class="thumbnail"><a href="http://img.skitch.com/20090629-1e5dwsuqyynxxgrhm7q55ahwj1.jpg"><img src="http://img.skitch.com/20090629-1e5dwsuqyynxxgrhm7q55ahwj1.preview.jpg" alt="NewAlmanacStarksboro" /></a></div>
<p>For comparison, I&#8217;ve taken a shot of <a href="http://img.skitch.com/20090629-k34pbbrgm4t5531s6194aequuj.jpg">the original version</a>.</p>
<p>We had a hard time making the homepage fit the open-book design, and ultimately opted for a very different layout:</p>
<div class="thumbnail"><a href="http://img.skitch.com/20090629-pkbbrg1cuw9mm96eshf1m1f7ur.jpg"><img src="http://img.skitch.com/20090629-pkbbrg1cuw9mm96eshf1m1f7ur.preview.jpg" alt="NewAlmanacHome" /></a></div>
<p>The book metaphor carries over to the &#8220;stack&#8221; of almanacs, which are displayed edgewise. (For the sake of thoroughness, I&#8217;ve also posted <a href="http://img.skitch.com/20090629-px2ict4ykicqwrnbj59krdgbky.jpg">the previous Community Almanac homepage</a>).</p>
<h2>Fun with Error Pages</h2>
<p>Some of the most fun aspects of this project involved finding small ways to reinforce the book metaphor without being totally over the top, or working against the needs of an online application. Two of the pieces I&#8217;m particularly happy with are the error pages.</p>
<p>For the 404 (Not Found) page, we kicked around a couple of ideas, before hitting upon the idea of using the book image but with several pages torn out:</p>
<div class="thumbnail"><a href="http://img.skitch.com/20090629-d9khk7xxmasn39suki7u1kyfyy.jpg"><img src="http://img.skitch.com/20090629-d9khk7xxmasn39suki7u1kyfyy.preview.jpg" alt="NewAlmanac404" /></a></div>
<p>Once we&#8217;d come up with the design for the 404 page, the 500 (application error) page was a no-brainer:</p>
<div class="thumbnail"><a href="http://img.skitch.com/20090629-me6upa8kq7xk8bik4ftay3229.jpg"><img src="http://img.skitch.com/20090629-me6upa8kq7xk8bik4ftay3229.preview.jpg" alt="NewAlmanac500" /></a></div>
<p>Error pages in general don&#8217;t get a lot of design thought or attention, and these are probably the best error pages of any website I&#8217;ve gotten to work on. That&#8217;s not to say they&#8217;re the only interesting or cool element we&#8217;ve added to this relaunch &#8211; for bonus points, once the site launches this week, check out what happens when you turn the page.</p>
<p>In themselves, pieces like these are fairly minor. But nailing the details can help a good design become really great. We may not have been able to add every <a href="http://skulljackpot.com/2009/04/01/planting-carrots/">cool idea</a> in this iteration, but I&#8217;m pretty proud of the work our team has done, and am excited to see it go live this week.</p>
]]></content:encoded>
			<wfw:commentRss>http://skulljackpot.com/2009/06/29/process-peek-community-almanac/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Safari crashes caused by corrupt SafeBrowsing.db file</title>
		<link>http://skulljackpot.com/2009/05/26/safari-crashes-caused-by-corrupt-safebrowsingdb-file/</link>
		<comments>http://skulljackpot.com/2009/05/26/safari-crashes-caused-by-corrupt-safebrowsingdb-file/#comments</comments>
		<pubDate>Tue, 26 May 2009 19:58:49 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Braindump]]></category>
		<category><![CDATA[crash]]></category>
		<category><![CDATA[fix]]></category>
		<category><![CDATA[leopard]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[SafeBrowsing.db]]></category>

		<guid isPermaLink="false">http://skulljackpot.com/?p=83</guid>
		<description><![CDATA[Shortly after I updated my MacBook Pro to 10.5.7, Safari began constantly crashing - refusing to stay open for more than a minute or two, even when I only had an empty tab open and wasn't interacting with the browser at all.]]></description>
			<content:encoded><![CDATA[<p>Shortly after I updated my MacBook Pro to 10.5.7, Safari began constantly crashing &#8211; refusing to stay open for more than a minute or two, even when I only had an empty tab open and wasn&#8217;t interacting with the browser at all.</p>
<p>The crash reports looked like this:</p>
<pre>Process:         Safari [700]
Path:            /Applications/Safari.app/Contents/MacOS/Safari
Identifier:      com.apple.Safari
Version:         3.2.3 (5525.28.3)
Build Info:      WebBrowser-55252803~5
Code Type:       X86 (Native)
Parent Process:  launchd [205]

Interval Since Last Report:          311 sec
Crashes Since Last Report:           1
Per-App Interval Since Last Report:  284 sec
Per-App Crashes Since Last Report:   1

Date/Time:       2009-05-26 09:04:32.111 -0500
OS Version:      Mac OS X 10.5.7 (9J61)
Report Version:  6
Anonymous UUID:  92C09E73-C6B0-4A8B-AA5F-46F13FF83479

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000000000000
Crashed Thread:  4</pre>
<p>I tried everything I could find, including trashing my Safari .plist file, and multiple runs at repairing permissions with the Disk Utility.</p>
<p>I eventually noticed that there was an alert message on the Safari preferences pane below the <code>[ ] Warn when visiting a fraudulent website option</code> option, indicating a problem pulling updated data from Google. Unchecking this option immediately resolved the Safari crashes.</p>
<p>Additional digging after the fact turned up <a href="http://discussions.apple.com/thread.jspa?messageID=9406043">this thread</a> on Apple&#8217;s forums. I was able to confirm that this was also my problem. I was able to cause Safari to crash again by re-enabling the fraudulent website option. However, once I deleted the SafeBrowsing.db file (mine was in <code>/private/var/folders/Gh/Ghnj4FQ2EjeLtxPyNkIUVU+++TM/-Caches-/com.apple.Safari/</code>), Safari would run without any problems.</p>
<p>So, if Safari starts crashing with <code>EXC_BAD_ACCESS</code> errors, your SafeBrowsing.db file may have gotten corrupted. Fortunately, the fix is just to delete the existing one &#8211; Safari will create a new one the next time it&#8217;s opened (though it&#8217;s always prudent to create a backup first, just in case).</p>
<p>Hope this saves someone else from tearing their hair out.</p>
]]></content:encoded>
			<wfw:commentRss>http://skulljackpot.com/2009/05/26/safari-crashes-caused-by-corrupt-safebrowsingdb-file/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Review: The Whuffie Factor</title>
		<link>http://skulljackpot.com/2009/04/26/review-the-whuffie-factor/</link>
		<comments>http://skulljackpot.com/2009/04/26/review-the-whuffie-factor/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 01:39:53 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Review]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[media]]></category>
		<category><![CDATA[social]]></category>
		<category><![CDATA[whuffie]]></category>

		<guid isPermaLink="false">http://skulljackpot.com/?p=80</guid>
		<description><![CDATA[Tara's first book, the Whuffie Factor, was published this past week. It's focused on social marketing, more participatory and conversational than traditional mass marketing (which by its nature tends more toward monologue than conversation). She was kind enough to send me a copy to review. The short version is: it's the best business book I've read.]]></description>
			<content:encoded><![CDATA[<p>I first saw Tara Hunt at SXSW last month. She was giving a talk on &#8220;Making Whuffie&#8221;, and setting a land-speed record for number of slides during a single session. It was a great presentation, and was so well-attended that the Austin fire marshall threatened to shut it down unless all the people who weren&#8217;t seated in chairs cleared out (I managed to find an unoccupied seat, and catch the rest of the talk).</p>
<p>Tara&#8217;s first book, the Whuffie Factor, was published this past week. It&#8217;s focused on social marketing, more participatory and conversational than traditional mass marketing (which by its nature tends more toward monologue than conversation).</p>
<p>Cory Doctorow coined the word &#8220;Whuffie&#8221; as a term for social capital in his excellent sci-fi novel <em>Down and Out in the Magic Kingdom</em>. In Cory&#8217;s book, social capital has completely replaced traditional currency, and people who are well-esteemed by others have privileged access to material goods. The Whuffie Factor takes this concept and grounds it in contemporary reality. Social and traditional capital aren&#8217;t interchangeable (at least, not yet), but they are strongly correlated, and businesses ignore this fact at their own peril.</p>
<p>At its core, the Whuffie Factor is a guide to social media for businesspeople, walking the reader through some of the more interesting highlights and opportunities, while helping them avoid missteps like the recent Pizza Hut <a href="http://news.cnet.com/8301-17852_3-10223100-71.html">Twitter intern</a> ruckus. The tone is friendly and helpful throughout, without being condescending &#8211; if you think of it as a Lonely Planet guide for Web 2.0, you wouldn&#8217;t be far off.</p>
<p>Tara provides clear steps and caveats for companies wishing to engage their customers (and potential customers) online. She also does a good job articulating the rationale behind different practices. There is <strong>never</strong> a point where the justification for something is reduced to blindly following what other companies have done or hand-waving generalizations. Even admonitions to &#8220;embrace the chaos&#8221; are carefully illustrated by numerous examples. For embracing chaos, examples include the Library of Congress opening up their photo archives to Flickr, JetBlue having an active and honest dialog with passengers via Twitter, and Tara&#8217;s own experiences facilitating a sometimes-contentious conference on Bay Area transportation issues.</p>
<p>We may have fallen a little off the scorchingly-fast &#8220;internet time&#8221; pace of the early internet, but things still move quickly enough that the challenges of creating a paper product relating to an online medium intrude, as with the discussion of ma.gnolia.com, which had a <a href="http://en.wikipedia.org/wiki/Ma.gnolia#January_2009_total_data_loss">high-profile collapse</a> earlier this year.</p>
<p>What we think of as traditional mass marketing may turn out to be a minor blip  &#8211; an artifact of the interval where media had progressed far enough to have wide reach, but not far enough to provide feedback channels for people to become co-equal participants, rather than simple consumers.</p>
<p>When Tara <a href="http://twitter.com/missrogue/status/1479475355">tweeted</a> offering to send folks an advance copy of her book the Whuffie Factor to review I responded right away, though I didn&#8217;t expect to be chosen.</p>
<ul>
<li>I&#8217;m not a business person</li>
<li>Virtually nobody reads this site</li>
<li>I&#8217;m strongly introverted an not an &#8220;influencer&#8221; offline, either</li>
</ul>
<p>The fact that she sent me a copy in spite of those considerations shows me that Tara definitely practices what she preaches. That earns her a ton of Whuffie in my book.</p>
]]></content:encoded>
			<wfw:commentRss>http://skulljackpot.com/2009/04/26/review-the-whuffie-factor/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Super CSS Selector Support with jQuery</title>
		<link>http://skulljackpot.com/2009/04/19/super-css-selector-support-with-jquery/</link>
		<comments>http://skulljackpot.com/2009/04/19/super-css-selector-support-with-jquery/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 22:18:47 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Under the hood]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[selector]]></category>

		<guid isPermaLink="false">http://skulljackpot.com/?p=61</guid>
		<description><![CDATA[Tired of having to add classes in your markup to work around lousy CSS selector support in legacy browsers? Try SuperSelectors - a jQuery plugin enabling great CSS selector support, even in IE6.]]></description>
			<content:encoded><![CDATA[<p>CSS provides a wide array of selectors to specify which elements should be subject to a particular style. CSS 2.1 gives web designers even more granularity when targeting specific elements. This is great in theory. But browser support for these selectors has lagged behind, and IE6 support is limited to only the most basic selectors. This has led to most folks working in the real world stashing the more advanced selectors away for rainy-day experimentation, or idle dreams about the eventual time when we can <em>use</em> these tools.</p>
<h2>Current State of Affairs</h2>
<p>Web folks are a clever bunch, though. If browser support for CSS won&#8217;t give us a way to target a particular element, a common solution is to make classes do the heavy lifting for us. Going through files to add <code>class="text"</code> to <strong>every</strong> text input is an all-too-common experience for web designers.</p>
<p>Adding the classes allows us to target elements on all browsers, but is labor-intensive and potentially error-prone. Moreover, if your site includes content (like comments or blog posts) which will entered by users, you have no easy way to ensure those classes are added appropriately.</p>
<h2>A Glimmer of Hope</h2>
<p>jQuery is one of several great javascript frameworks which have burst onto the scene in the past year or so. One of the reasons jQuery has gotten a lot of attention from web designers is the way it allows you to select elements &#8211; in many cases, jQuery selectors are <em>identical</em> to CSS selectors. jQuery is also extremely extensible. If there&#8217;s functionality you need which isn&#8217;t provided by the core framework, you can easily add it via a plugin (or by extending jQuery directly).</p>
<p>In the course of a recent project, I used jQuery to add a <code>first-child</code> class to some <code>&lt;li&gt;</code> elements in our top navigation, to shore up IE6 CSS support without having to alter the markup. After seeing how easy jQuery made that, I realized it&#8217;s be possible to write a plugin allowing <em>any</em> browser supported by jQuery capable of supporting <strong>all</strong> CSS 2.1 selectors. So I wrote SuperSelectors. It goes through your site&#8217;s stylesheets, dynamically adding classes to elements so that even IE6 can bask in the glow of properly supporting CSS selectors like <code>ul li:first-child li:nth-child(odd) a:hover</code>.</p>
<h2>Pencils out</h2>
<p>Before we can start to determine which elements ought to have classes added, we&#8217;ll need a way to access each stylesheet being used by a given page. Fortunately, the <code>document.styleSheets</code> array does exactly what we want. Unfortunately, we have to incur a little bit of overhead here. Since browsers will silently excise rules they don&#8217;t understand, we have to re-request the CSS files via javascript, and parse <em>those</em> for matches.</p>
<p>Now, the fact that jQuery supports CSS selector syntax comes in really handy. We can pass the matching CSS rules directly to jQuery, and add classes appropriately. Then, any browser supported by jQuery can properly target elements, even useful-but-not-broadly-supported CSS rules like <code>ul li:first</code>. All we need to do to have classes added to match any of the rules in our CSS is include jQuery and the SuperSelectors plugin, and add the following javascript:</p>
<pre>$(document).ready(function() {
  $(document).superSelectify();
});</pre>
<p>This is a great start, but some of us are maintaining sites with established conventions for element classnames. Maybe you&#8217;re working on an educational site, and the <code>child</code> is already reserved for another context. No problem. SuperSelectors will allow custom classes to be passed in, while still providing sensible defaults. You can override any (or all) of the default classnames. If you need to alter the class attached to child elements to be <code>child-element</code>, your javascript would just change to be:</p>
<pre>$(document).ready(function() {
  $(document).superSelectify({childClass: "child-element"});
});</pre>
<h2>Attribution needed</h2>
<p>What about special cases which fall outside the normal advanced selectors? Maybe we need to have styles applied conditionally, based on attributes. For example, maybe the links in your file download list should have an icon based on the extension of the file they&#8217;re pointing to. CSS 2.1 allows us to target elements based on attribute values &#8211; we can even match against substrings within the attribute value, which is a perfect fit for finding the file extensions of our links. The number of potential choices for attribute selectors alone is more than we can reasonably build into a single plugin, but fortunately SuperSelectors supports arbitrary selectors through the <code>additionalElementHash</code> attribute. This can be done with or without overriding the default classnames. A setup which addressed the file-type requirement mentioned above would look like this:</p>
<pre>$(document).ready(function() {
  $(document).superSelectify({additionalElementHash: {jpeg: 'a[href$=".jpg"]', pdf: 'a[href$=".pdf"]', doc: 'a[href$=".doc"]', gif: 'a[href$=".gif"]', xls: 'a[href$=".xls"]', png: 'a[href$=".png"]'}});
});</pre>
<p>A little more effort than the no-argument invocation, but that will enable matching almost any elements you can think of &#8211; you&#8217;re only limited by jQuery&#8217;s selector support, which is one of the best out there.</p>
<h2>Hovercraftiness</h2>
<p>It&#8217;s probably time to acknowledge the elephant in the room &#8211; specifically, the fact that IE6 only supports the <code>:hover</code> pseudo-selector for anchor tags. Through the years, there have been a variety of approaches to add this in, including Peter Nederlof&#8217;s <a href="http://www.xs4all.nl/~peterned/csshover.html">whatever:hover</a>. This is all well and good, but it&#8217;d be nice to be able to have one-stop shopping for all our CSS needs. Fortunately, jQuery makes it easy for us to add this functionality into Super Selectors. Declare your <code>:hover</code> rules normally, add an equivalent rule using the <code>hover</code> class, and SuperSelectors will take care of adding / removing the classnames from elements on mouseover.</p>
<h2>Faster, faster</h2>
<p>Things are really shaping up nicely. Any browser which jQuery supports can now use virtually any legitimate CSS selector, but we can still do better. If we know which advanced selectors our site will need to support, it seems wasteful to have to re-request all those CSS files, and then scan them for matches. In fact, on slow connections, or with sufficiently-large amount of CSS, users could see a page without the added classes for a fraction of a second, similar to the old <a href="http://en.wikipedia.org/wiki/Flash_of_unstyled_content">Flash of Unstyled Content</a> bug.</p>
<p>SuperSelectors makes it simple to avoid the unnecessary request/parsing overhead and display properly-classed markup right away. You just need to pass in all your selectors via the <code>manualSelectors</code> attribute, as a comma-delimited list. As with everything else, it can be used solo or in combination with any other arguments.:</p>
<pre>$(document).ready(function() {
  $(document).superSelectify({childClass: "child-element", manualSelectors: 'div.example > ul, ul.sample li:first, input[type="text"], input[type="password"]'}});
});</pre>
<p>For complex CSS needs, this may require a fair amount of work. However, this approach saves us from having to re-request and parse all the CSS files in use. Consequently, it will be <em>much</em> faster &#8211; especially for sites with large (or large numbers of) CSS files. <a href="http://sandbox.skulljackpot.com/superselectors/demo/">Check out the example</a>.</p>
<h2>One caveat</h2>
<p>SuperSelectors does a lot to help enable better CSS selector support across browsers, but it can&#8217;t do everything for us. We still need rules in our CSS which use the classes SuperSelectors will add.</p>
<p>Because Internet Explorer will discard the entire rule if it doesn&#8217;t understand one of the selectors, we do have to do a little duplication in our CSS. That means that, instead of</p>
<pre>div.example > ul,
div.example ul.child {
background: #0f0;
color: #f0f;
}</pre>
<p>You should write:</p>
<pre>div.example > ul {
background: #0f0;
color: #f0f;
}

div.example ul.child {
background: #0f0;
color: #f0f;
}</pre>
<h2>In Closing</h2>
<p>The goal of SuperSelectors is to make it possible for all of us to start using CSS 2.1 selectors in our everyday work. It doesn&#8217;t have CSS3 support (yet), but SuperSelectors will automatically benefit as jQuery adds support for CSS3 selectors.</p>
<p>You can download SuperSelectors as a <a href="http://github.com/chrispatterson/jquery-super-selectors/zipball/master">zip</a> or <a href="http://github.com/chrispatterson/jquery-super-selectors/tarball/master">tarball</a>. Github also hosts <a href="http://github.com/chrispatterson/jquery-super-selectors/tree/master">the official SuperSelectors repository</a>, if you&#8217;re interested in helping make SuperSelectors even better.</p>
]]></content:encoded>
			<wfw:commentRss>http://skulljackpot.com/2009/04/19/super-css-selector-support-with-jquery/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Planting carrots</title>
		<link>http://skulljackpot.com/2009/04/01/planting-carrots/</link>
		<comments>http://skulljackpot.com/2009/04/01/planting-carrots/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 01:51:11 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Braindump]]></category>
		<category><![CDATA[achievements]]></category>
		<category><![CDATA[gaming]]></category>
		<category><![CDATA[social history]]></category>

		<guid isPermaLink="false">http://skulljackpot.com/?p=58</guid>
		<description><![CDATA[I'd mentioned <a href="http://skulljackpot.com/2009/03/09/all-carrot-no-stick/">earlier</a> that I was hoping to incorporate the "achievement" reward model from videogames for our Community Almanac project at work. I think I made a good case, but it's looking likely that the concept of Deeds is on the chopping block (for now).</p>
<p>The discovery this week that <a href="http://hunch.com">Hunch</a> has a variation of this approach (to say nothing of <a href="http://news.slashdot.org/article.pl?sid=09/03/31/1610228">Slashdot's announcement</a> today) convinced me to go ahead and write down the list I'd pitched, in the event that it's interesting to anyone else.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;d mentioned <a href="http://skulljackpot.com/2009/03/09/all-carrot-no-stick/">earlier</a> that I was hoping to incorporate the &#8220;achievement&#8221; reward model from videogames for our Community Almanac project at work. I think I made a good case, but it&#8217;s looking likely that the concept of Deeds is on the chopping block (for now).</p>
<p>The discovery this week that <a href="http://hunch.com">Hunch</a> has a variation of this approach (to say nothing of <a href="http://news.slashdot.org/article.pl?sid=09/03/31/1610228">Slashdot&#8217;s announcement</a> today) convinced me to go ahead and write down the list I&#8217;d pitched, in the event that it&#8217;s interesting to anyone else.</p>
<h2>Tentative Community Almanac Deed List</h2>
<ul>
<li><strong>&#8230;and I approve this message</strong>: Give positive feedback on 5 pages</li>
<li><strong>Voracious reader</strong>: Read 20 pages</li>
<li><strong>Social Butterfly</strong>: View 10 user profiles</li>
<li><strong>You&#8217;re it</strong>: Tag 5 pages</li>
<li><strong>I&#8217;ve said my piece</strong>: Comment on an existing page</li>
<li><strong>Read all about it</strong>: Email an existing page to a friend</li>
<li><strong>Community Klaxon</strong>: Flag a page which ultimately gets removed</li>
<li><strong>Hello, my name is</strong>: Create an account</li>
<li><strong>Wherever you may go</strong>: Follow a page</li>
<li><strong>These are my people</strong>: Follow an almanac</li>
<li><strong>And furthermore</strong>: Add a new page responding to an existing page</li>
<li><strong>Allow me to introduce myself</strong>: Complete your account (add location, image, etc)</li>
<li><strong>Red rover</strong>: Invite a friend to contribute</li>
<li><strong>Sounding board</strong>: Comment on 10 existing pages</li>
<li><strong>Scribe</strong>: Create a page</li>
<li><strong>Poet Laureate</strong>: Have a page you&#8217;ve created get at least 10 thumbs-up responses</li>
<li><strong>Allow me to retort</strong>: Respond to a comment someone makes on a page you created</li>
<li><strong>Whisper well</strong>: Private-message someone</li>
<li><strong>Gazeteer</strong>: Create 5 pages</li>
<li><strong>Welcome wagon</strong>: Have a friend you&#8217;ve invited create an account</li>
<li><strong>Comrades-in-arms</strong>: Have a friend you&#8217;ve invited create a page</li>
<li><strong>Community Historian</strong>: Create 10 pages</li>
<li><strong>Community Archivist</strong>: Create 20 pages</li>
</ul>
<p>I think we&#8217;re going to see a lot more of this kind of cross-pollination in the near future, and hope I manage to find a project to use it on.</p>
]]></content:encoded>
			<wfw:commentRss>http://skulljackpot.com/2009/04/01/planting-carrots/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Quick and dirty (but useful) jQuery accordion pattern</title>
		<link>http://skulljackpot.com/2009/03/30/quick-and-dirty-but-useful-jquery-accordion-pattern/</link>
		<comments>http://skulljackpot.com/2009/03/30/quick-and-dirty-but-useful-jquery-accordion-pattern/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 22:42:05 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Quick and Dirty]]></category>
		<category><![CDATA[accordion]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://skulljackpot.com/?p=45</guid>
		<description><![CDATA[It's fairly common to want to have multiple panels on a page, only one of which should be visible at any given moment. There are too many jQuery accordion examples to count. I recently knocked together a handy general case, which includes a novel piece of functionality. What makes this one different? You can specify an arbitrary panel to be expanded upon page load, without any server-side code.]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s fairly common to want to have multiple panels on a page, only one of which should be visible at any given moment. There are too many jQuery accordion examples to count. I recently knocked together a handy general case, which includes a novel piece of functionality. What makes this one different? You can specify an arbitrary panel to be expanded upon page load, without any server-side code.</p>
<h2>The HTML</h2>
<pre>
&lt;div class="expand"&gt;
&lt;h2 id="expand-an-element" class="toggler"&gt;This will be clickable, once the javascript runs&lt;/h2&gt;
&lt;div class="togglee"&gt;
  &lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sapien. Phasellus nunc. Vestibulum consectetur tortor eu urna. Donec quam. Vivamus id neque a nisl iaculis vulputate.&lt;/p&gt;
  &lt;p&gt;Multiple elements can be contained within the &lt;code&gt;togglee&lt;/code&gt; parent.&lt;/p&gt;
&lt;/div&gt;&lt;!-- /.togglee --&gt;
&lt;h2 id="expand-this-element" class="toggler"&gt;Another toggler element&lt;/h2&gt;
&lt;div class="togglee"&gt;
  &lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sapien. Phasellus nunc. Vestibulum consectetur tortor eu urna. Donec quam. Vivamus id neque a nisl iaculis vulputate.&lt;/p&gt;
&lt;/div&gt;&lt;!-- /.togglee --&gt;
&lt;/div&gt;&lt;!-- /.expand --&gt;
</pre>
<p><strong>Note</strong>: the <code>expand</code>, <code>toggler</code>, and <code>togglee</code> elements aren&#8217;t limited to the example above &#8211; they can be any valid HTML element. The only assumptions are that the <code>expand</code> will be a parent, and that each <code>toggler</code> immediately precedes the associated <code>togglee</code> element.</p>
<h2>The CSS</h2>
<pre>.expandable .toggler {
cursor: pointer;
}

.expandable .togglee {
display: none;
}</pre>
<p>You can also apply styles to the toggler element by targeting the <code>expanded</code> class. This will only be added to togglers which are currently expanded, which allows you to provide visual cues about the fact that it&#8217;s an active interface element.</p>
<h2>The javascript</h2>
<pre>$(document).ready(function(){
  $('.expand').addClass('expandable');
  $('.expandable .toggler').click(function() {
    var target =  $(this).next('.togglee');
    if (target.is(':hidden')) {
      var togglees = $('.togglee');
      for (i=0;i&lt;togglees.length;i++){
        $(togglees[i]).slideUp().prev('.toggler').removeClass('expanded');
      }
      $(target).slideDown().prev('.toggler').addClass('expanded');
    }
  });
  var initialExpansion = "";
  if(document.location.hash) initialExpansion = $(unescape(document.location.hash));
  if(!(initialExpansion.length)) initialExpansion = $('.expandable .toggler:first');
  initialExpansion.addClass('expanded').next('.togglee').css("display","block");
});</pre>
<p>We use <code>document.location.hash</code> to access the portion of the URL beginning at the hash sign (#). Then, if there are any elements with a corresponding <code>id</code>, we apply our expand logic there (falling through to showing the first panel if there isn&#8217;t a match).</p>
<p>This allows us to construct links like <code>http://example.com/path/to/page#expand-this-element</code>, and have that panel begin in an expanded state.</p>
<p>Use and enjoy. If you have feedback or improvements you&#8217;d like to see, note &#8216;em in the comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://skulljackpot.com/2009/03/30/quick-and-dirty-but-useful-jquery-accordion-pattern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>All carrot, no stick</title>
		<link>http://skulljackpot.com/2009/03/09/all-carrot-no-stick/</link>
		<comments>http://skulljackpot.com/2009/03/09/all-carrot-no-stick/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 04:00:40 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Braindump]]></category>
		<category><![CDATA[achievements]]></category>
		<category><![CDATA[gaming]]></category>
		<category><![CDATA[social history]]></category>

		<guid isPermaLink="false">http://skulljackpot.com/?p=37</guid>
		<description><![CDATA[<p>We're currently working through speccing out the next round of changes for the <a href="http://www.communityalmanac.org/">Community Almanac</a>, a site we've produced in conjunction with the Orton Family Foundation.</p>

<p>One of the challenges we're working through is how to provide better ways to guide users through the ladder of engagement: to move from passively viewing the site, through providing feedback on content, all the way to being a leading participant and real resource for the Community Almanac.</p>]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re currently working through speccing out the next round of changes for the <a href="http://www.communityalmanac.org/">Community Almanac</a>, a site we&#8217;ve produced in conjunction with the Orton Family Foundation.</p>
<p>One of the challenges we&#8217;re working through is how to provide better ways to guide users through the ladder of engagement: to move from passively viewing the site, through providing feedback on content, all the way to being a leading participant and real resource for the Community Almanac.</p>
<p>It is difficult to hit that sweet spot, where the site manages foster the kind of behavior and interactions it wants to encourage, without making users feel like they&#8217;re being herded like cattle, or that they don&#8217;t have meaningful choices. LinkedIn does a good job of this with their progress bar, but that didn&#8217;t feel like a great fit for a more collaborative project like the Community Almanac. Earlier today I had an idea which seemed promising &#8211; since I&#8217;m not sure whether my idea is too radical for this project, I wanted to braindump it here.</p>
<p>In short, I wanted to hijack the metaphor of achievements used in the gaming arena (<a href="http://www.xbox.com/en-US/live/">XBox Live</a> and <a href="http://store.steampowered.com/">Steam</a> are two of the best-known implementations). Here&#8217;s a screenshot of an achievement list for Team Fortress 2, a recent game available on Steam:</p>
<div class="thumbnail"><a href="http://skitch.com/dimmerswitch/b8qyc/steam-tf2-achievements"><img src="http://img.skitch.com/20090310-bhwmr7aisjbny22w9dnr7dwuf2.preview.jpg" alt="steam-tf2-achievements" /></a></div>
<p>The unattained achievements scroll down off the page. This provides clear guidance to users about what they need to do to &#8216;advance&#8217;.</p>
<p>In the context of gaming, achievements are bound to behavior which the games want to foster, or which is challenging to complete &#8211; or in some cases, both. Achievements are a way for gamers to be rewarded for good gameplay, and to show off their accomplishments to others (for example, I know anyone who has attained the <a href="http://crackedrabbitgaming.com/2007/12/27/half-life-2-episode-2-little-rocket-man-gnome-achievement-tips/">Little Rocket Man</a> achievement in Half-Life 2 is far more patient than I am, for example.</p>
<p>Now, there&#8217;s nothing <em>inherent</em> in this approach which is bound to video games, which is why I think it has promise for the Community Almanac.</p>
<p>I could easily see us having achievements created for behavior we want to encourage in the almanac, like:</p>
<ul>
<li>Add a new page</li>
<li>Give feedback on ten existing pages</li>
<li>Email a page to a friend</li>
</ul>
<p>The titles probably ought to be more playful, but the tasks are the sorts of ones I think are good candidates. We could even have achievements be based on helping others become involved, like &#8220;have someone you&#8217;ve invited to contribute add a new page&#8221;. In the longer term, it would also be nice tie a reputation system to these achievements &#8211; and if we highlight that reputation in the interface, it provides a nice way to give regular contributors warm fuzzies and recognition, as well as help orient new users and steer them in a positive direction.</p>
<p>If we tracked task completion within a session (even for not-logged-in users), this could be a way to draw users into creating an account. Presenting messaging to users indicating that by doing <var>X</var> they just earned achievement <var>Y</var>, congratulating them and presenting the option to save this progress by creating an account (or by logging in to their existing account), would be a friendly way to help users move up the ladder of engagement.</p>
<p>Hopefully I&#8217;ll manage to make a compelling case, and you&#8217;ll see achievements coming to the Community Almanac soon. If not, look for me trying to fit this in to other projects &#8211; I think there&#8217;s some real potential here.</p>
]]></content:encoded>
			<wfw:commentRss>http://skulljackpot.com/2009/03/09/all-carrot-no-stick/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Right makes (Opera) wrong</title>
		<link>http://skulljackpot.com/2009/01/23/right-makes-opera-wrong/</link>
		<comments>http://skulljackpot.com/2009/01/23/right-makes-opera-wrong/#comments</comments>
		<pubDate>Sat, 24 Jan 2009 03:51:21 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Under the hood]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[redraw]]></category>
		<category><![CDATA[renderbug]]></category>

		<guid isPermaLink="false">http://skulljackpot.com/?p=34</guid>
		<description><![CDATA[<p>In the course of redesigning <a href="http://theopenplanningproject.org/">the new TOPP website</a>, I ran into another odd renderbug which I wanted to document.</p>

<p>The design for the new site includes two drop-down menus (for "About Us" and "Our Work"), and we went with an approach based on the classic <a href="http://www.alistapart.com/articles/dropdowns">Suckerfish</a> menus. Pretty easy to implement, and looked great in our initial design passes. When I went to do some regression testing, I found that Opera was was badly misrendering the menus.</p>]]></description>
			<content:encoded><![CDATA[<p>In the course of redesigning <a href="http://theopenplanningproject.org/">the new TOPP website</a>, I ran into another odd renderbug which I wanted to document.</p>
<p>The design for the new site includes two drop-down menus (for &#8220;About Us&#8221; and &#8220;Our Work&#8221;), and we went with an approach based on the classic <a href="http://www.alistapart.com/articles/dropdowns">Suckerfish</a> menus. Pretty easy to implement, and looked great in our initial design passes. When I went to do some regression testing, I found that Opera was was badly misrendering the menus:</p>
<div class="thumbnail"><a href="http://skitch.com/dimmerswitch/67fd/opera-topp-menus-misrender"><img src="http://img.skitch.com/20090105-d7mnt8g3dyg2ewxuqrqf934g1c.preview.jpg" alt="opera-topp-menus-misrender" /></a></div>
<p>All other browsers were displaying the menus as-intended (even IE6, due to a quick little jQuery function to add the relevant classes on mouseover).</p>
<p>As I was playing with possible resolutions to the problem, I stumbled onto an odd fact. The problem <strong>only</strong> appeared when the nav was aligned to the right. Floating the nav to the right triggered the renderbug, as did positioning it to the right. Unfloated navs behaved correctly, as did ones which were floated or positioned left.</p>
<p>For launch, we went with a left-floated nav, but that prevents the nav from reliably being aligned with the right edge of the parent container (since font sizes can be adjusted independently of page zoom).</p>
<p>After launch, I did some digging to isolate the problem, and to write up a bug report for Opera. I also came up with a <a href="http://sandbox.skulljackpot.com/opera-redraw-renderbug/">test case</a> illustrating the issue.</p>
<p>The problem <strong>only</strong> manifests when the dropdown menus extend below the calculated bottom of the content within the <code>&lt;body&gt;</code> element. Since all the content on the TOPP site was floated, and floated elements are removed from the normal document flow, Opera effectively thought the pages were zero-height.</p>
<p>Somehow, floating or positioning the nav to the right is tripping up Opera&#8217;s redraw logic for the dropdown menus, if those dropdowns extend below the calculated bottom. <strong><em>Why</em></strong> right-floated or right-positioned elements trigger this renderbug, while left-floated or left-positioned elements behave correctly is still a bit of a mystery.</p>
<p>I&#8217;ve written up my test case and submitted a bug report to Opera. Opera unfortunately doesn&#8217;t have good transparency into their bug-tracking process, so I can&#8217;t link to my report, and folks can&#8217;t upvote the bug, but hopefully it&#8217;ll be fixed before too long.</p>
]]></content:encoded>
			<wfw:commentRss>http://skulljackpot.com/2009/01/23/right-makes-opera-wrong/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Design Pattern: Alpha transparency in IE without javascript</title>
		<link>http://skulljackpot.com/2009/01/22/design-pattern-alpha-transparency-in-ie-without-javascript/</link>
		<comments>http://skulljackpot.com/2009/01/22/design-pattern-alpha-transparency-in-ie-without-javascript/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 20:34:28 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Under the hood]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[pattern]]></category>

		<guid isPermaLink="false">http://skulljackpot.com/?p=75</guid>
		<description><![CDATA[Need to support alpha transparency in IE6? Try this CSS-only fix on for size.]]></description>
			<content:encoded><![CDATA[<p><em>Originally published on the <a href="http://www.openplans.org/projects/topp-design/blog/">TOPP Design Blog</a></em></p>
<h2>­Problem Summary</h2>
<p>An element needs to support partial transparency &#8211; either an <code>img</code> tag, or an element with the <code>background-image</code> property set via CSS.
</p>
<h3>Use When</h3>
<p>The page still needs to support IE6, and has elements which should be transparent.</p>
<h3>Solution</h3>
<p>Use CSS transparency, with appropriate selectors.</p>
<h3>Example</h3>
<div><a href="http://skitch.com/dimmerswitch/byst4/ie6-alpha-transparency"><img src="http://img.skitch.com/20090109-fubpcwp1gew5bd33s5r4968qgy.preview.jpg" alt="ie6-alpha-transparency" /></a>
</div>
<div><a href="http://skitch.com/dimmerswitch/bysu8/ie6-transparency-fix"><img src="http://img.skitch.com/20090109-ffsa1349jwpy63exywbm7gxcb7.preview.jpg" alt="ie6-transparency-fix" /></a>
</div>
<h4>CSS</h4>
<pre>* html .pngfix {
zoom: 1;
behavior: expression((this.runtimeStyle.behavior="none")&amp;&amp;(this.pngSet?this.pngSet=true:(this.nodeName == "IMG" &amp;&amp; this.src.toLowerCase().indexOf('.png')&gt;-1 ? (this.runtimeStyle.backgroundImage = "none", this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.src + "', sizingMethod='image')", this.src = "transparent.gif") : (this.origBg = this.origBg ? this.origBg : this.currentStyle.backgroundImage.toString().replace('url("','').replace('")',''), this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.origBg + "', sizingMethod='" + (this.currentStyle.backgroundRepeat=='no-repeat' ? 'crop' : 'scale') +"')", this.runtimeStyle.backgroundImage = "none")),this.pngSet=true));
}</pre>
<p><strong>Note</strong>: this method is adapted from the approach documented at <a href="http://www.komodomedia.com/blog/2007/11/css-png-image-fix-for-ie/">http://www.komodomedia.com/blog/2007/11/css-png-image-fix-for-ie/</a>. It improves upon it by using <code>zoom</code> to trigger HasLayout in IE6, rather than relying on <code>position: relative</code>.</p>
<p>You can either add the &#8220;pngfix&#8221; class to all elements which need to support transparency, or add selectors in your CSS file to target your desired elements. Prefixing the selectors with <code>* html</code> ensures that only IE6 will process the rule, preventing more-capable browsers from trying to parse IE AlphaImageLoader idiosyncrasies.</p>
<h4>Limitations</h4>
<p>This approach will not support repeated background-images &#8211; Internet Explorer will stretch the background image to fit. This can still be useful if your background is a solid color and you&#8217;re just using transparency for an overlay effect. It will also still be suitable if your background-image is full-width and has no vertical variation (for example, if you&#8217;re using a background image to fake columns).</p>
<p>Due to limitations with the AlphaImageLoader functionality, this approach will not work at all for elements which need to have the background image positioned. If that&#8217;s behavior you need (and you have to support transparency for IE6), you should consider adding an extra element and positioning <em>that</em> instead.</p>
]]></content:encoded>
			<wfw:commentRss>http://skulljackpot.com/2009/01/22/design-pattern-alpha-transparency-in-ie-without-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Design Pattern: Self-clearing floats</title>
		<link>http://skulljackpot.com/2009/01/08/design-pattern-self-clearing-floats/</link>
		<comments>http://skulljackpot.com/2009/01/08/design-pattern-self-clearing-floats/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 21:12:54 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Under the hood]]></category>
		<category><![CDATA[clear]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[float]]></category>
		<category><![CDATA[pattern]]></category>

		<guid isPermaLink="false">http://skulljackpot.com/?p=71</guid>
		<description><![CDATA[An all-CSS solution for clearing floated elements without extraneous markup.]]></description>
			<content:encoded><![CDATA[<p><em>Originally published on the <a href="http://www.openplans.org/projects/topp-design/blog/">TOPP Design Blog</a></em></p>
<h2>Problem Summary</h2>
<p>An element needs to be expanded to contain all child elements, one or more of which may be floated (and thus removed from the normal document flow). ­</p>
<h3>Use When</h3>
<p>The page contains floated elements w­hich should not extend beyond their parent element.</p>
<h3>Solution</h3>
<p>Use self-clearing floats.</p>
<h3>Rationale</h3>
<p>While the &#8220;use a float to contain a float&#8221; approach will ensure that all elements are appropriately contained, it can trigger other renderbugs which this approach avoids.</p>
<h3>Example</h3>
<div> <a href="http://skitch.com/dimmerswitch/bysyi/self-clearing-floats"><img src="http://img.skitch.com/20090109-t87ic6gce86xnudhd8f97che4p.preview.jpg" alt="self-clearing-floats" /></a>
</div>
<h4>CSS</h4>
<pre>.selfclear:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}

.selfclear {
display: inline-block; /* IE 7 */
}

.selfclear {
display: block;
}

* html .selfclear {
height: 1px; /* IE &lt; 7 */
}</pre>
<p><strong>Note</strong>: this method builds upon the approach documented at <a href="http://positioniseverything.net/easyclearing.html">http://positioniseverything.net/easyclearing.html</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://skulljackpot.com/2009/01/08/design-pattern-self-clearing-floats/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.301 seconds -->
<!-- Cached page served by WP-Cache -->
