<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns: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/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>yergler.net</title>
	
	<link>http://yergler.net</link>
	<description>Because eventually I'll be right. Theoretically.</description>
	<lastBuildDate>Tue, 31 Jan 2012 05:43:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<feedburner:info uri="yerglernet-tloa" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://yergler.net/blog/feed/" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://yergler.net/blog/feed/" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
		<title>The OOT Killer</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/m_vsBDduCAg/</link>
		<comments>http://yergler.net/blog/2011/12/04/the-oot-killer/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 05:43:00 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[commitment]]></category>
		<category><![CDATA[practice]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=2020</guid>
		<description><![CDATA[Recently I have been suffering from the delusion that making more commitments will make me more able to achieve them. My first reaction to reading Asheeh&#8217;s reflections on commitments: &#8220;Yes, and I wish I&#8217;d learned that about ten years earlier than I did.&#8221; And then I remember that it&#8217;s not something you learn once; tending [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Recently I have been suffering from the delusion that making more commitments will make me more able to achieve them.
</p></blockquote>
<p>My first reaction to reading <a href="http://www.asheesh.org/note/debian/oot-killer.html">Asheeh&#8217;s reflections on commitments</a>: &#8220;Yes, and I wish I&#8217;d learned that about ten years earlier than I did.&#8221; And then I remember that it&#8217;s not something you learn once; tending to your committments &#8212; and making them with care &#8212; is a life-long practice. Practicing is hard, but it&#8217;s preferrable to encountering the OOT killer.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/m_vsBDduCAg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2011/12/04/the-oot-killer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2011/12/04/the-oot-killer/</feedburner:origLink></item>
		<item>
		<title>Updating el-get and getelget.el</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/LMMmK-EbsNA/</link>
		<comments>http://yergler.net/blog/2011/09/26/getelget-update/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 16:59:24 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[emacs el-get getelget]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1989</guid>
		<description><![CDATA[Last week one of my Emacs using colleagues asked me how I managed my Emacs packages and configuration. Naturally I pointed him to el-get and my getelget.el bootstrap script. I&#8217;ve been happily managing my Emacs installation over the past five months using el-get and a private git repository for my configuration. However when I tried [...]]]></description>
			<content:encoded><![CDATA[<p>Last week one of my Emacs using colleagues asked me how I managed my Emacs packages and configuration. Naturally I pointed him to <a title="el-get at github.com" href="https://github.com/dimitri/el-get">el-get</a> and my <a title="Managing my Emacs packages with el-get" href="http://yergler.net/blog/2011/04/19/managing-my-emacs-packages-with-el-get/">getelget.el bootstrap script</a>. I&#8217;ve been happily managing my Emacs installation over the past five months using el-get and a private git repository for my configuration. However when I tried to square my <code>.emacs.d/init.el</code> with the current el-get documentation, I got a little confused; el-get is now better at bootstrapping itself from within your Emacs configuration. When my colleague read this and asked why he might want <code>getelget.el</code>, my response was&#8230; well, lackluster; this is an attempt to document that a littler better.)</p>
<p>Last night I decided to do a little clean-up on my Emacs configuration, and see if I could get rid of getelget.el. The <a href="https://github.com/dimitri/el-get/blob/master/README.asciidoc">documentation for el-get</a> is great, so I started there. What I quickly realized is that the included el-get bootstrap mechanism is great if you want to ensure el-get is installed and then use <code>el-get-install</code>, <code>el-get-remove</code>, etc to manage your packages. But if you define your package list in you config file, it&#8217;s not quite enough. Specifically, when you first bootstrap your configuration, you want to defer calling <code>(elget 'sync)</code> until you&#8217;ve bootstrapped el-get. And on future runs, you want to go ahead and install any new packages that have been added to your list.</p>
<p>Luckily el-get has added support for hooks, which makes life a little easier. The new <code>getelget.el</code> (available <a href="http://yergler.net/projects/2011/getelget-201109.el" title="getelget.el source code">here</a>) looks something like this:</p>
<pre><code>
;; getelget - el-get boostrap script
;;
;; Checks to see if el-get has been checked out, and bootstraps it if
;; it has not. After bootstrapping, calls el-get to load specified
;; packages.
;;
;; el-get-packages should be defined before including this file. Any
;; definitions from el-get-sources will be appended to el-get-packages.
;;
;; Written in 2011 by Nathan R. Yergler <nathan@yergler.net>
;;
;; To the extent possible under law, the person who associated CC0 with
;; getelget has waived all copyright and related or neighboring rights
;; to getelget.
;;
;; You should have received a copy of the CC0 legalcode along with this
;; work.  If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.

;; add a hook listener for post-install el-get
(defun post-install-hook (pkg)
  ;; after installing el-get, load the local package list
  (if (string-equal pkg "el-get")
      (el-get 'sync
              (append el-get-packages
                      (mapcar 'el-get-source-name el-get-sources)))))
(add-hook 'el-get-post-install-hooks 'post-install-hook)

;; add the el-get directory to the load path
(add-to-list 'load-path
             (concat (file-name-as-directory user-emacs-directory)
                     (file-name-as-directory "el-get")
                     "el-get"))

;; try to require el-get
(if (eq (require 'el-get nil t) nil)

    ;; urp, need to bootstrap
    (url-retrieve
     "https://raw.github.com/dimitri/el-get/master/el-get-install.el"
     (lambda (s)
         (end-of-buffer)
         (eval-print-last-sexp)))

    ;; successfully required el-get, load the packages!
    (post-install-hook "el-get")
</code></pre>
<p>el-get also <a href="http://tapoueh.org/blog/2011/09/16-el-get-3.1.html">recommends</a> splitting your package definitions from your local source recipes (which can themselves extend an included recipe). So getelget.el now expects you&#8217;ve defined two lists: <code>el-get-packages</code>, a list of packages to install from recipes, and <code>el-get-sources</code>, your local source list. </p>
<p>For example, I define a local recipe for <a href="https://github.com/magit/magit">magit</a> that binds a key to <code>magit-status</code> and enables spell checking and fill mode for commit message editing:</p>
<pre><code>
(setq el-get-sources
      '((:name magit
               :after (lambda ()
                        (global-set-key "\C-x\r\r" 'magit-status)

                        ;; Enable spell checking, fill for log editing
                        (add-hook 'magit-log-edit-mode-hook
                                  (lambda()
                                    (auto-fill-mode 1)
                                    (flyspell-mode 1)))))
        ))
</code></pre>
<p>And my <code>el-get-packages</code> list is just a list of packages I&#8217;m installing from the included el-get recipes.</p>
<pre><code>
(setq el-get-packages
       '(el-get
         google-maps
         color-theme
         python-mode
         virtualenv
         php-mode-improved
         xml-rpc-el
         js2-mode
         org2blog))
</code></pre>
<p>Everything listed in both lists will be installed.</p>
<p>YMMV, FWIW, ZOMG, BBQ, etc.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/LMMmK-EbsNA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2011/09/26/getelget-update/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2011/09/26/getelget-update/</feedburner:origLink></item>
		<item>
		<title>super(self.__class__, self) # end of the line for subclassing</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/D0gyLwkSYTU/</link>
		<comments>http://yergler.net/blog/2011/07/04/super-self/#comments</comments>
		<pubDate>Tue, 05 Jul 2011 03:44:23 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[super]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1990</guid>
		<description><![CDATA[I&#8217;ve learned (and remembered) a lot in the past two months as I&#8217;ve gotten back to coding as my primary job. One thing that I guess I never quite internalized before is how super works. I have been bitten by code that looks something like the following a few times in the past month: class [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve learned (and remembered) a lot in the past two months as I&#8217;ve gotten back to coding as my primary job. One thing that I guess I never quite internalized before is how <code>super</code> works. I have been bitten by code that looks something like the following a few times in the past month:</p>
<pre><code>
class A(object):
    def __init__(self):
        super(self.__class__, self).__init__()

class B(A):
    def __init__(self):
        super(B, self).__init__()
</code></pre>
<p>The surprise comes when I try to use my sub-class, <code>B</code>. Instantiating <code>B()</code> blows up the stack with: </p>
<p><code>RuntimeError: maximum recursion depth exceeded while calling a Python object</code>.</p>
<p>What? </p>
<p>According to the <a href="http://docs.python.org/library/functions.html#super">Python 2.7.2 standard library documentation</a>, <code>super</code> &#8220;return[s] a proxy object that delegates method calls to a parent or sibling class of type.&#8221; So in the case of single inheritance, it delegates access to the super class, it does not return an instance of the super class. In the example above, this means that when you instantiate B, the follow happens:</p>
<ol>
<li>enter <code>B.__init__()</code></li>
<li>call <code>super</code> on B and call <code>__init__</code> on the proxy object</li>
<li>enter <code>A.__init__()</code></li>
<li>call <code>super</code> on <code>self.__class__</code> and call <code>__init__</code> on the proxy object</li>
</ol>
<p>The problem is that when we get to step four, <code>self</code> still refers to our instance of <code>B</code>, so calling <code>super</code> points back to <code>A</code> again. In technical terms: Ka-bloom.</p>
<p><strong>TL;DR:</strong> <code>super(self.__class__, self)</code> may look like a neat trick, but it&#8217;s the end of the line for sub-classing.</p>
<p><strong>Further reading:</strong> Raymond Hettinger&#8217;s excellent <a href="http://rhettinger.wordpress.com/2011/05/26/super-considered-super/">blog post on super</a> provides a great overview of <code>super</code> and shows off the improved Python 3 syntax, which removes the need to write the class name as part of the <code>super</code> statement. I was really pleased to find the Python standard library documentation links directly to it.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/D0gyLwkSYTU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2011/07/04/super-self/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2011/07/04/super-self/</feedburner:origLink></item>
		<item>
		<title>Debugging my Creative Process</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/u2HEFpZjuA4/</link>
		<comments>http://yergler.net/blog/2011/04/24/debugging-my-creative-process/#comments</comments>
		<pubDate>Sun, 24 Apr 2011 17:22:00 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[printing]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[iteration]]></category>
		<category><![CDATA[linocut]]></category>
		<category><![CDATA[meta]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1985</guid>
		<description><![CDATA[I&#8217;ve been taking print making classes this year, and have really enjoyed exploring something new. What&#8217;s been particularly interesting for me is seeing parallels between what I think of as a creative hobby &#8211; print making &#8211; and what I think of as creative work &#8211; writing software. I showed my work publicly for the [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been taking print making classes this year, and have really enjoyed exploring something new. What&#8217;s been particularly interesting for me is seeing parallels between what I think of as a creative hobby &ndash; print making &ndash; and what I think of as creative work &ndash; writing software. </p>
<p> I showed my work publicly for the first time two weeks ago. The day after the show I had booked time in the studio. I showed up after work that day with my tools, anxious to get back to printing. It had been a couple weeks since I&#8217;d been in the studio, and last time I was there had been very productive: I&#8217;d spent the entire day working with the same image, producing <a href="http://www.flickr.com/photos/nathan_y/sets/72157626087471661/">six unique prints</a> as I tried to add more texture and depth to the precise lines of the stencils I&#8217;d been creating. The result was a set of prints which were somewhat uneven in quality, but which showed a progression of control and vision. With each one I tried something a little different, until I felt like I had a good understanding of what I really wanted. Going into the studio that evening, I had about three hours of printing time, and hoped to bring that same exploration to another image. </p>
<p> I did wind up with five prints that evening, but none of them resonated for me like the Golden Gate Bridge prints did. As I pulled each print, I&#8217;d look at it, realize it wasn&#8217;t what I&#8217;d had in mind, and try to think about what to do next. Time in the studio usually passes quickly, and I feel like I&#8217;m racing the clock to do everthing that comes to mind. But that evening felt disjointed and choppy, and when it came time to clean up, I was ready to go home. I&#8217;d tried serious, whimsical, and abstract, and none of them felt like they worked for me that night. As I rode home from the studio, I felt disappointment. The experience wasn&#8217;t the effortless expression of creativity I was used to, and the work I had produced didn&#8217;t speak to me as I hoped and had come to expect. </p>
<p> The next morning I looked over the pieces again, and I realized that in each case there was one or two things that I didn&#8217;t like, which overwhelmed the rest of the piece. In one case I made a choice about negative space that turned out to be the wrong one. In another I tried to do too much at once, and my vision hadn&#8217;t translated well onto paper. As I stood there looking at each piece, I thought to myself, &#8220;Why didn&#8217;t you just do this exact same image again, but change the aspect you didn&#8217;t like?&#8221; Somehow I&#8217;d forgotten that it was OK to repeat yourself, to try again if the result wasn&#8217;t what I was looking for. I&#8217;d fallen into the trap that creativity is all about the flash, the spark, and that it just magically happens. </p>
<p> If I think about writing software, I&#8217;m well aware that getting the result I want is real work: we have test suites, debuggers, and continuous integration tools for a reason. We often don&#8217;t get it right on the first try. Just because the &#8220;test suite&#8221; for print making is personal and subjective doesn&#8217;t make iteration any less important. </p>
<hr noshade />
<p> I had my first linocut class Wednesday evening. Linocut involves carving a linoleum plate with an image, which you can then use to make a print. Our instructor asked us to bring a simple image to use for our first plate, and to get some experience with carving. I spent some time searching for the &#8220;perfect&#8221; image to use, something that I would be new and different and push the boundaries of my print making. In the end I wound up taking one of my monotype stencils and generated a scaled down version of it. And I couldn&#8217;t be happier with how it turned out. </p>
<p> <img src="/media/2011/04/wpid-marten-linocut.jpg"  alt="/media/2011/04/wpid-marten-linocut.jpg" /> </p>
<p> Yes, it&#8217;s the same cat that I&#8217;ve been working with for the past couple months. But that doesn&#8217;t mean I&#8217;m not expanding my skill set, trying different techniques, and iterating. I have plenty of time to try new images out, and if I spend the time now, debugging my technique and learning how to iterate (just like I do with software), I think my ability to tackle more complex and involved work will grow, just like it has with software. </p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/u2HEFpZjuA4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2011/04/24/debugging-my-creative-process/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2011/04/24/debugging-my-creative-process/</feedburner:origLink></item>
		<item>
		<title>Managing my Emacs packages with el-get</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/z3zquVQ5Eh4/</link>
		<comments>http://yergler.net/blog/2011/04/19/managing-my-emacs-packages-with-el-get/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 05:17:05 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[el-get]]></category>
		<category><![CDATA[emacs]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1944</guid>
		<description><![CDATA[Update (20 April 2011): I&#8217;ve now tried this on my old MacBook running OS X 10.5. The bootstrap script initially threw an error, which I tracked down to an outdated version of git. Once I upgraded git and installed bzr (used by the python-mode recipe), I started Emacs and was rewarded with a fully functioning [...]]]></description>
			<content:encoded><![CDATA[<p class="update"><strong>Update (20 April 2011):</strong> I&#8217;ve now tried this on my old MacBook running OS X 10.5. The bootstrap script initially threw an error, which I tracked down to an outdated version of <code>git</code>. Once I upgraded <code>git</code> and installed <code>bzr (</code>used by the <code>python-mode</code> recipe), I started Emacs and was rewarded with a fully functioning installation, complete with the extensions I want.</p>
<p>I&#8217;m on vacation for two weeks between jobs, so of course this means it&#8217;s time to sharpen the tools (because writing programs to help you write programs is almost always more fun than actually writing programs). I&#8217;ve been an <a href="http://www.gnu.org/software/emacs/">Emacs</a> user for many years, and of course I&#8217;ve customized my installation with additional modes and extensions. Previously I would check out code that I needed into a <code>vendor</code> directory, and then load it manually in <code>init.el</code>. And this worked fine, but that doesn&#8217;t mean I <del datetime="2011-04-19T23:14:20+00:00">can&#8217;t</del> won&#8217;t spend a chunk of my day making it better.</p>
<p>A <a href="http://dustycloud.org/">friend</a> mentioned <a href="https://github.com/dimitri/el-get">el-get</a> to me, and I decided to give it a try. I like the combination of <a href="https://github.com/dimitri/el-get/tree/master/recipes">recipes</a> for installing common things, and the fact that your list of packages is very explicit in <code>init.el</code> (so if I need to dig into one of them, I know exactly where to begin). Additionally, since I&#8217;ll have a new computer issued for the new job, I also wanted to get things into shape so that I could easily replicate my preferred editing environment. I wound up creating a small bootstrap file to help things along, <strong><code>getelget.el</code></strong>. </p>
<p><strong><code>getelget.el</code></strong> checks to see if el-get has been previously bootstrapped, and if not, performs the lazy installation procedure. After it makes sure el-get is available, it loads and executes el-get. So if you need to get a new machine up and going with Emacs and any extensions, you can drop in your <code>init.el</code> and <strong><code>getelget.el</code></strong>, and Emacs will take care of the rest. </p>
<p>To use <strong>getelget</strong>, define your <code>el-get-sources</code> like you normally would in <code>init.el</code>:</p>
<p><code>
<pre>(setq el-get-sources
      '(el-get
        python-mode
        ;; etc...
      )
 )
</pre>
<p></code> </p>
<p>Then load <strong>getelget</strong> (the following assumes you have getelget.el in your user emacs directory along with <code>init.el</code>):</p>
<p><code>
<pre>
;; getelget -- bootstrap el-get if necessary and load the specified packages
(load-file
 (concat (file-name-as-directory user-emacs-directory) "getelget.el"))
</pre>
<p></code></p>
<p><strong>getelget</strong> will handle bootstrapping, loading, and executing el-get.</p>
<p><strong>getelget</strong> is pretty trivial; you can <a href="http://yergler.net/projects/2011/getelget.el">download it here</a>, and I&#8217;ve waived any rights I may hold on the code using the <a href="http://creativecommons.org/publicdomain/zero/1.0/">CC0 Public Domain Dedication</a>.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/z3zquVQ5Eh4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2011/04/19/managing-my-emacs-packages-with-el-get/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2011/04/19/managing-my-emacs-packages-with-el-get/</feedburner:origLink></item>
		<item>
		<title>The New Thing</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/ru0L1siwyu0/</link>
		<comments>http://yergler.net/blog/2011/04/18/the-new-thing/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 05:44:05 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[my life]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1935</guid>
		<description><![CDATA[There&#8217;s lots of change going on in my life right now, and the most visible external indication of that is my job: April 15 was my last day at Creative Commons. I&#8217;ll be joining the engineering team at Eventbrite in early May. I&#8217;m really excited to be joining Eventbrite, and am really looking forward to [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s lots of change going on in my life right now, and the most visible external indication of that is my job: April 15 was my last day at <a href="http://creativecommons.org/">Creative Commons</a>. I&#8217;ll be joining the engineering team at <a href="http://eventbrite.com">Eventbrite</a> in early May. I&#8217;m really excited to be joining Eventbrite, and am really looking forward to seeing what it&#8217;s like to work on a consumer web product.</p>
<p>Someday I&#8217;ll figure out how to write about why I&#8217;m making the move, and why now; for now, it&#8217;s the new thing in my life, and I&#8217;m looking forward to seeing how it goes.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/ru0L1siwyu0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2011/04/18/the-new-thing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2011/04/18/the-new-thing/</feedburner:origLink></item>
		<item>
		<title>Learning from the Web for Learning on the Web</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/NpW57I6FDdQ/</link>
		<comments>http://yergler.net/blog/2011/04/08/learning-from-the-web-for-learning-on-the-web/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 22:45:10 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[cc]]></category>
		<category><![CDATA[openn11]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1895</guid>
		<description><![CDATA[Earlier this year Steven Stapleton from University of Nottingham emailed me and asked if I&#8217;d like to be a keynote speaker at OpenNottingham. I accepted, and was very excited to be part of the day. More recently, an opportunity unexpectedly presented itself, and I decided that after seven years, it was time to move on [...]]]></description>
			<content:encoded><![CDATA[<p>Earlier this year Steven Stapleton from University of Nottingham emailed me and asked if I&#8217;d like to be a keynote speaker at <a href="http://www.nottingham.ac.uk/open/opennottinghamseminar/opennottinghamseminar.aspx">OpenNottingham</a>. I accepted, and was very excited to be part of the day. More recently, an opportunity unexpectedly presented itself, and I decided that after seven years, it was time to move on from Creative Commons. As a result of the timing of my departure, I was unable to travel to the UK this past week. What follows are the remarks I delivered via Skype for the event. </p>
<p class="update"><strong>Update (16 April 2011):</strong> <a href="http://www.youtube.com/watch?v=r47dFYm-nRA">Video of my presentation</a> via Skype is up on YouTube.</p>
<hr noshade />
<p>This is actually my last presentation as CTO of Creative Commons, and as I was preparing for it this week, I spent some time thinking about what questions are on my mind about open education, and where I look for answers. CC is a little different from a lot of organizations working in this space: we develop legal and technical infrastructure as much as anything, and as such we wind up with visibility into many different domains. I hope this perspective can help us think about the future of open education, and what’s next.</p>
<p>Let me begin by stating what I believe to be true, and what I hope you agree with going into this. First, there has been an amazing explosion in activity surrounding eduction and learning on the web. In less than ten years we’ve seen words and acronyms like OER, OCW, metadata, and repository enter our collective consciousness, and seen myriad exciting projects launch to support open education.</p>
<p>Second, there is a feeling that the web, the internet, can help us deliver educational materials to audiences that are exponentially larger, with only incremental increases in cost. This broadening of delivery puts us in a position to reach and empower people in ways that they have not been before: life long learners, remedial learners, and others who may be under served by traditional models.</p>
<p>And third, we aren’t there yet. There are still challenging questions that we haven’t quite figured out how to answer, or that we’re just beginning to explore. For example: How do users discover open educational resources on the web? How do we determine what our impact and reach is? And what do we call success? I want to spend the next 10 to 15 minutes talking about some possible answers and things that I’ve been thinking about over the past year. What can a very selective history of the web tell us about where we are and what the future holds for online education.</p>
<p>The first two statements I made about learning on the web &#8212; that there has been a massive surge in interest and activity, and that there is a potential to reach vast audiences with only incremental additional cost &#8212; could very well have been made about the web itself in its early days. People were fascinated by the potential of this new technology, and rushed to stake their claim by publishing their own documents, sharing their knowledge. Now if I were you I’d be thinking, “Right, but I think we’re doing something a little more important than uploading scans of our favorite unicorn photos to GeoCities.” True enough, but the point is this: people were publishing, and they weren’t sure what came next.</p>
<p>As people began uploading and creating content and we saw this rise in the creative output of people on the web, there was an increasing need to capture this and organize it in an approachable form. You might have been able to draw a diagram of the early web on a sheet of A4 paper, but that rapidly became inadequate. The question of how you approach and understand this network of content became critical to answer. And the first answers were decidedly hands on processes. Yahoo did not start as an index of text on the web: it started as a way to search a hand curated set of resources, classified by human beings into categories and topics. DMoz, another directory of the web, took a similar approach: organizing resources into a hierarchy, bringing order where there was none. In both cases this was fundamentally a task of curation: what belongs in the list, and what does not. These were the web’s librarians, trying to provides an ontology that was flexible enough to handle the growing amount of content, and rigid enough that people could understand it.</p>
<p>Now there were definitely issues with this approach when applied to the early web, not the least of which was that they did a poor job of coping with different languages and cultures. Additionally, these directories didn&#8217;t leverage the fundamental relational nature of the web. Cross-referencing the list of resources categorized under different facets, such as language and subject, wasn&#8217;t an easy task.</p>
<p>As the web continued to grow, people began to realize that they could exploit the natural structure of the web &#8212; documents and links &#8212; to build a better index. Instead of searching the terms that a human used to label a resource, we could write software that followed links and created an index of the resources. So instead of hand curating a list of documents, we could trust that things linking to a document probably had a similar topic, or described the topic of what they were linking to. And eventually that “good” resources would have more links than those that did not.</p>
<p>It’s interesting to note that even as this transition from searching a curated list to searching a text index was taking place, the curated list still served an important purpose. Both the Yahoo index and DMoz were useful as the seeds for initial crawls. By starting with those pages, and following the links on them to other pages, software was able to being building a graph of content on the web. Curation was an important activity on its own, but it also enabled bigger and better innovations that weren’t obvious at the beginning.</p>
<p>So we look at the evolution of the web and see the move from curation as the primary means of discovery to curation and links as the seeds for larger and more complex discovery.Learning on the web has done a lot of this basic curation, both on a de facto and explicit basis. OCWC members publishing lists of open courseware, Connexions publishing modules and composite works, and OER Commons aggregating lists of resources from multiple sources are all acting as curators.</p>
<p>It’s this evolutionary question that we’re starting to face now: what is a link in online learning, and how do we compose larger works out of component pieces while giving credit and identifying what’s new or changed? Creative Commons licenses and our supporting technology provide a framework for marking what license a work is offered under, and how the creator wishes to be attributed. There seems to be wide-spread acknowledgement that linking as attribution is reasonable, but what about linking to create a larger work, or linking to cite a source work? Too often it is not obvious what components went into a work, or how to find them in a useful format for deriving your own work.</p>
<p>Last week I came across a website developing a free college curriculum for math, computer science, business, and liberal arts. At first I was really excited: the footer of the pages contained a link to Creative Commons Attribution license, and a full curriculum for things like computer science under a very liberal license is the sort of thing that gets me excited. But as I dug deeper, I found that the curriculum was actually more like a reading list: links to PDFs and web pages with instructions to read specific sections, pages, or chapters. Now it&#8217;s really exciting that the web and educational publishing on the web has progressed to the point where someone can act as a curator and assemble such a reading list, where all the resources are accessible.</p>
<p>What&#8217;s frustrating &#8212;  and illustrative of this question of what a link means in education and how we create largely, composite documents, I think &#8212; is the information that&#8217;s missing. Links to PDF files and other sites are a start, but they don’t capture the actual relationship that exists between the component pieces. By exploring what the graph of educational works looks like, we can enable applications and tools that help answer the question of discovery, like the search engines that grew out of exploring the graph of documents on the web at large.</p>
<p>So with a multitude of ways to discover content on the web, publishers began asking the question: who is finding me, how, and what are they actually looking for? Am I reaching the individuals that I think I am, and how are they interacting with my site. In other words, what is success, and how do I measure it? The web as a whole answered this question through the development of tools like Google Analytics, Piwik, and others. For many publishers, success is defined as more visitors who spend more time on the site. I&#8217;m not actually sure that&#8217;s true for education on the web, or at least I don’t think it’s the entire story.</p>
<p>When I think about success for open education and education on the web, I think about both web metrics and education metrics. Web metrics look a lot like everyday web publishing metrics: visitors, time on site, bounce rate, etc. If you’re trying to drive visitors to a particular site or service, you might also measure conversions as part of your success metrics. Education metrics, however, are a lot tougher to work with on the open web. We may want to determine whether a particular resource helps people pass an assessment, but where does that assessment come from? And how do I even find alternative resource to compare results with?</p>
<p>As we continue to curate a pool of educational resources online, one of the facets that I’ve encountered frequently of late is how OER align to curricular standards or quality metrics. This is an example of curating for something other than the subject. That is, while early curation systems classified web pages based on their topic, there’s no reason they couldn’t classify based on what curricular standard they address instead. Embracing curation has the potential to enable new assessments and metrics that build on the nature of the web and are more broadly applicable. For example, if online education embraces a culture of linking and composition using links, it&#8217;s possible to imagine a measure of reach and impact based on links and referrers, instead of just visitors.</p>
<p>As we begin to explore these questions, there&#8217;s also the opportunity for this community to lead developments on the web instead of just following past trends. As this community of practice continues to develop, we can learn from the past and iterate to increase our impact and reach. While search engines initially just leveraged links to determine where a resource fits in the web, there is increasing recognition that structured data can help us develop tools that provide better results and user experiences. Web scale search providers are beginning to leverage this information to improve search results to include information like the number of stars a restaurant is reviewed at, or the cost of a product you searched for. Creative Commons uses structured data to indicate that the link to our license isn&#8217;t just another link, it actually has some meaning. By annotating links with information about their meaning, we can enable tools which give weight to different relationships based on context.</p>
<p>There is a great opportunity to develop rough consensus and working code around how structured data can be used to indicate the relationship between parts of a curriculum, alignment of resources to a curricular standard, or the sources a work uses. This is the next reasonable step for the use of structured data and curation on the web, and the open education community has a real opportunity to lead. As we publish resources online, we can develop a practice of linking, annotation, and curation.</p>
<p>This high level, incredibly vague, and very, very selective history of the web shows that there are many lessons education on the web can learn, and at least an equal number of areas where it can lead. There is excitement and passion, but we need to ask ourselves some hard questions as we move forward. What does success look like, how do we measure our impact and reach, and what can we learn from those who have gone before.</p>
<p>Thank you.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/NpW57I6FDdQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2011/04/08/learning-from-the-web-for-learning-on-the-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2011/04/08/learning-from-the-web-for-learning-on-the-web/</feedburner:origLink></item>
		<item>
		<title>Web Progress Notifications in Fennec</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/r5XKJNEsVK0/</link>
		<comments>http://yergler.net/blog/2011/04/04/web-progress-notifications-in-fennec/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 03:41:18 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[mozCC]]></category>
		<category><![CDATA[fennec]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[mozcc]]></category>
		<category><![CDATA[OpenAttribute]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1889</guid>
		<description><![CDATA[Working on OpenAttribute for Firefox Mobile (Fennec) yesterday, one of the first challenges I faced was how to get notification that a page had finished loading. In the desktop version, I attach a listener for all tabs using gBrowser.addTabsProgressListener. Unfortunately with browsers running in their own processes, this approach doesn&#8217;t work on Fennec. I spent [...]]]></description>
			<content:encoded><![CDATA[<p>Working on <a href="http://openattribute.com/">OpenAttribute</a> for Firefox Mobile (Fennec) yesterday, one of the first challenges I faced was how to get notification that a page had finished loading. In the desktop version, I attach a listener for all tabs using <code>gBrowser.addTabsProgressListener</code>. Unfortunately with browsers running in their own processes, this approach doesn&#8217;t work on Fennec. I spent quite a bit of time trying different approaches, all with the intent of creating a progress listener and attaching it myself. The <a href="https://wiki.mozilla.org/Mobile/Fennec/Extensions/Electrolysis">Electrolysis wiki page</a> says that one of the nice side effects of the message passing model is that <a href="https://wiki.mozilla.org/Mobile/Fennec/Extensions/Electrolysis#Good_News">this problem is easy to solve</a>, but it sure didn&#8217;t feel easy.</p>
<p>I don&#8217;t remember why I eventually started looking at the <a href="https://hg.mozilla.org/mobile-browser/file/8167d57cab8e/chrome/content/">mobile-browser source tree</a>, but as I looked through <a href="https://hg.mozilla.org/mobile-browser/file/8167d57cab8e/chrome/content/browser.js">browser.js</a>, <a href="https://hg.mozilla.org/mobile-browser/file/8167d57cab8e/chrome/content/browser.js#l1327">there it was</a>:</p>
<p><code>  messageManager.addMessageListener("Content:StateChange", this);</code></p>
<p>It turns out it <em>is</em> really easy: you can listen for <code>Content:StateChange</code> or <code>Content:LocationChange</code>, and get access to the same details you&#8217;d normally have in the <code>WebProgressListener</code> implementation.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/r5XKJNEsVK0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2011/04/04/web-progress-notifications-in-fennec/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2011/04/04/web-progress-notifications-in-fennec/</feedburner:origLink></item>
		<item>
		<title>Unexpected Attribution</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/AgkvwFsfOuE/</link>
		<comments>http://yergler.net/blog/2011/04/03/unexpected-attribution/#comments</comments>
		<pubDate>Sun, 03 Apr 2011 17:53:00 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[mozCC]]></category>
		<category><![CDATA[fennec]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[mozcc]]></category>
		<category><![CDATA[OpenAttribute]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1881</guid>
		<description><![CDATA[I&#8217;m working on adding support for Firefox Mobile to OpenAttribute this weekend. I&#8217;d hoped to get that done in time for the official launch, but, well, things have been a little busy. Firefox Mobile (Fennec) uses Electrolysis, a multi-process architecture that&#8217;s a little different from what I&#8217;m used to. Looking at the documentation and APIs, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m working on adding support for <a href="https://www.mozilla.com/en-US/mobile/">Firefox Mobile</a> to <a href="http://openattribute.com/">OpenAttribute</a> this weekend. I&#8217;d hoped to get that done in time for the official launch, but, well, <a href="https://identi.ca/notice/68556261">things have been a little busy</a>. Firefox Mobile (Fennec) uses <a href="https://wiki.mozilla.org/Mobile/Fennec/Extensions/Electrolysis">Electrolysis</a>, a multi-process architecture that&#8217;s a little different from what I&#8217;m used to. Looking at the documentation and APIs, it actually looks a little closer to Chrome&#8217;s extension architecture. I was looking at <a href="https://people.mozilla.com/~mfinkle/tutorials/">tutorial videos</a> yesterday, and downloaded Mark Finkle&#8217;s <a href="https://people.mozilla.com/~mfinkle/tutorials/blank-addon.zip">boilerplate addon</a> to get a better look at the overlays. </p>
<p>As I explored the boilerplate, I opened the build script. Imagine my surprise when I read this comment at the top of the script:</p>
<p><code><br />
#!/bin/bash<br />
# build.sh -- builds JAR and XPI files for mozilla extensions<br />
#   by Nickolay Ponomarev <asqueella@gmail.com><br />
#   (original version based on Nathan Yergler's build script)<br />
# Most recent version is at &lt;http://kb.mozillazine.org/Bash_build_script&gt;<br />
</code></p>
<p>I have to assume this is based on the build script I developed for MozCC in 2004. I doubt anything from the original still survives (or at least I hope not), but appreciate the credit.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/AgkvwFsfOuE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2011/04/03/unexpected-attribution/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2011/04/03/unexpected-attribution/</feedburner:origLink></item>
		<item>
		<title>Visualizing CC Licenses with CSS3 Transitions &amp; Transforms</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/S8k0biZK83M/</link>
		<comments>http://yergler.net/blog/2011/01/07/css3-license-layers/#comments</comments>
		<pubDate>Sat, 08 Jan 2011 06:54:20 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[experiments]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[experiment]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1846</guid>
		<description><![CDATA[TL;DR: Go check out the CSS3-based visualization of the CC license model (Chrome, Safari, or Firefox 4). Read below for details of why and how I built it. We launched a refresh of the Creative Commons&#8217; site design on Thursday. Part of that refresh was updating the content of some key pages, based on user [...]]]></description>
			<content:encoded><![CDATA[<p class="update"><strong>TL;DR:</strong> Go check out the <a href="http://labs.creativecommons.org/2011/demos/license-layers/">CSS3-based visualization of the CC license model</a> (Chrome, Safari, or Firefox 4). Read below for details of why and how I built it.</p>
<p>We launched a refresh of the Creative Commons&#8217; site design on Thursday. Part of that refresh was updating the content of some key pages, based on user feedback. We heard from users that the pages could be clearer, and could give better examples of what Creative Commons licensees are, how they&#8217;re used, and who&#8217;s using them. One of the pages we updated was the <a href="http://creativecommons.org/licenses/">Licenses</a> page, which provides an overview of the CC licenses.</p>
<p><img src="/media/2011/01/license-layers.png" alt="" title="License Layers" width="296" height="383" class="alignleft size-full wp-image-1847" />When I was looking at the page on Thursday, I was particularly taken by the graphic <a href="http://redprocess.com/">Alex</a> put together to show the three conceptual layers of a CC license: machine readable, human readable, and legal code. This concept is part of CC&#8217;s unique approach to public licenses since day one, but it&#8217;s something I&#8217;ve always struggled to describe in a way other than a lawyer joke (&#8220;get it? lawyers aren&#8217;t humans!&#8221;). Alex&#8217;s graphic seemed like a great, simple illustration of how the layers stack and complement one another. It also seemed like it was begging for an interaction implementation.</p>
<p>I was immediately reminded of the <a href="http://hacks.mozilla.org/">Mozilla Hacks</a> <a href="http://hacks.mozilla.org/2010/07/firefox4-beta2/">columns</a> about using <a href="http://www.w3.org/TR/css3-transitions/">CSS3 Transitions</a> to add interactivity to HTML content. Transitions effectively let you say, &#8220;when this CSS property changes, don&#8217;t make the change immediately; apply this function from the previous value to the new one, and make the change take this long.&#8221; The result is the ability make elements fade in or out, move, etc, without the use of Javascript (except, perhaps, applying the new CSS class). CSS Transitions are still in development, so you wind up using the vendor prefixed versions: <code>-moz-transition</code>, <code>-webkit-transition</code>, and <code>-o-transition</code>. Coupled with <a href="http://www.w3.org/TR/css3-2d-transforms/">CSS3 Transformations</a> (which let you move, skew, and rotate objects), you can achieve some really interesting effects.</p>
<p>Thursday afternoon at the end of the work day I sat down to read up on Transitions and Transformations, and to see if I could make three isometric squares stack on top of one another, like Alex&#8217;s graphic. (I found <a href="http://robertnyman.com/2010/04/27/using-css3-transitions-to-create-rich-effects/">this article</a> particularly helpful in its clarity and directness.) Within about 30 minutes I had a working transformation and transition, using <a href="http://jquery.com/">jQuery</a> to listen for click events, and applying a different CSS class on click. Alex converted the graphic elements to an SVG I could pull apart, and Thursday evening I started hacking, applying the SVG elements as the background on <code>&lt;div&gt;</code>s, and writing additional CSS classes to show details about each layer.</p>
<p><a href="http://yergler.net/media/2011/01/3layers.png"><img src="/media/2011/01/3layers-300x164.png" alt="" title="Three Layers" width="300" height="164" class="aligncenter size-medium wp-image-1851" /></a></p>
<p>After a couple hours Thursday night, and a little more tweaking this morning, I had a functioning <a href="http://labs.creativecommons.org/2011/demos/license-layers/">interactive layer visualization</a>. It&#8217;s about 100 lines of Javascript, and roughly twice that many lines of CSS. The source and assets are in the <code><a href="http://code.creativecommons.org/viewgit/labs/license-layers.git/">labs/license-layers</a></code> git repository on <a href="http://code.creativecommons.org/">code.creativecommons.org</a>. I&#8217;m sure there are ways that both the Javascript and CSS could be improved, but am pretty proud of this as a first outing. </p>
<p>One of the interesting challenges of putting this together was how to chain transitions. In particular, when you first click the CC logo, we wanted it to shift to an isometric projection, and then expand. While it was clear that we needed to apply two different classes in sequence with a delay, we found the jQuery&#8217;s <code><a href="http://api.jquery.com/delay/">.delay()</a></code> call didn&#8217;t seem to work. In fact, using <code>.delay()</code> seemed to cause the browser to skip the transition, and apply the new class right away. <code>window.setTimeout</code> did work. </p>
<p>I also ran into some issues with my SVG graphics. The first iteration apparently had some issues in the SVG exported from Illustrator. While they worked adequately in Firefox 4.0 beta 8, Chrome rendered them in a pixelated fashion, and Opera rendered them in a spectacularly broken manner. Removing the offending elements from the SVG and regenerating the individual images made them render smoothly in Firefox and Chome, and Opera also improved from broken to pixelated.</p>
<p>Overall this was a really fun experiment, and it was gratifying to see how support for these new specifications makes visually engaging pages really straightforward.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/S8k0biZK83M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2011/01/07/css3-license-layers/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2011/01/07/css3-license-layers/</feedburner:origLink></item>
	</channel>
</rss>

