<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>IAmTheRockstar</title><link>http://iamtherockstar.com/blog/</link><description>Latest entries</description><language>en-us</language><lastBuildDate>Tue, 13 Mar 2012 11:32:42 -0600</lastBuildDate><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/IAmTheRockstar" /><feedburner:info uri="iamtherockstar" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>Achievement Unlocked: Contribute to Twisted
</title><link>http://feedproxy.google.com/~r/IAmTheRockstar/~3/NwR35kNoml4/</link><description>&lt;p&gt;That is all.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmTheRockstar/~4/NwR35kNoml4" height="1" width="1"/&gt;</description><pubDate>Tue, 13 Mar 2012 11:32:42 -0600</pubDate><guid isPermaLink="false">http://iamtherockstar.com/blog/2012/03/13/achievement-unlocked-contribute-twisted/</guid><category>python</category><feedburner:origLink>http://iamtherockstar.com/blog/2012/03/13/achievement-unlocked-contribute-twisted/</feedburner:origLink></item><item><title>Juju on OS X
</title><link>http://feedproxy.google.com/~r/IAmTheRockstar/~3/8OtGE6kXwnc/</link><description>&lt;p&gt;I've been playing with &lt;a href="http://juju.ubuntu.com"&gt;Juju&lt;/a&gt; to deploy servers in the cloud.  This means that Juju has come up in regular conversations with my devops friends (admittedly, I'm more dev than ops...).  I had lunch with some devops folks from an unnamed startup while at PyCon, and I mentioned it to them.  They use Ubuntu in the cloud very heavily, but the systems they use for deployments, etc. were running OS X (as glorified ssh terminals)&lt;super&gt;&lt;a href="#1"&gt;1&lt;/a&gt;&lt;/super&gt;.&lt;/p&gt;
&lt;p&gt;This wasn't the first time I'd had a conversation about Juju result in questions about its compatibility with OS X.  After that lunch discussion, I decided it'd be my last.  I sat down with two devops guys with those &lt;strike&gt;super expensive netbooks&lt;/strike&gt;Macbook Air laptops and sorted out how to get Juju working on OS X.&lt;/p&gt;
&lt;p&gt;First, install Zookeeper.  The devops guys used Homebrew to do that.  It looks like there's also a source distribution at the Zookeeper site, but I'm not familiar enough with OS X to know about anything outside of Homebrew.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install zookeeper
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once Zookeeper is installed, download Juju and go into the new branch.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bzr branch lp:juju
cd juju
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Install juju dependencies&lt;super&gt;&lt;a href="#2"&gt;2&lt;/a&gt;&lt;/super&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install pyOpenSSL pyyaml twisted txaws txzookeeper zkpython
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once that's complete, install juju.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python setup.py install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now you've got Juju running on OS X.  I suggest starting with &lt;a href="https://juju.ubuntu.com/docs/user-tutorial.html"&gt;the tutorial&lt;/a&gt;, and then moving on to &lt;a href="https://juju.ubuntu.com/docs/write-charm.html"&gt;writing your own charms&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;super&gt;&lt;a name="1"&gt;&lt;/a&gt;1&lt;/super&gt; The &lt;a href="http://cdimage.ubuntu.com/daily-live/current/"&gt;Mac builds of Precise nightly&lt;/a&gt; are most excellent, so if you've got a Mac, running Ubuntu on it without all the pain that usually comes with running Linux on a Mac. I &lt;strong&gt;&lt;em&gt;highly&lt;/em&gt;&lt;/strong&gt; recommend it.&lt;/p&gt;
&lt;p&gt;&lt;super&gt;&lt;a name="2"&gt;&lt;/a&gt;2&lt;/super&gt; I've submitted &lt;a href="https://code.launchpad.net/~rockstar/juju/setuppy-fixes/+merge/96902"&gt;a patch to Juju&lt;/a&gt; so that juju knows about its own dependencies. As soon as that lands, this step can be skipped.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmTheRockstar/~4/8OtGE6kXwnc" height="1" width="1"/&gt;</description><pubDate>Sun, 11 Mar 2012 01:07:19 -0600</pubDate><guid isPermaLink="false">http://iamtherockstar.com/blog/2012/03/11/juju-os-x/</guid><category>juju</category><feedburner:origLink>http://iamtherockstar.com/blog/2012/03/11/juju-os-x/</feedburner:origLink></item><item><title>Ubuntu One: Cloud Storage for Human Beings
</title><link>http://feedproxy.google.com/~r/IAmTheRockstar/~3/ZEP4834q770/</link><description>&lt;p&gt;While on my weekly phone call with the rest of the Ubuntu One Web and Mobile team, my wife walked into my office and gestured for me to mute the phone so she could talk to me.&lt;/p&gt;
&lt;p&gt;"Hey, I'm uploading my portfolio to Ubuntu One and it's taking a long time.  It's a lot of files. Ubuntu One can handle a lot of files, right?"&lt;/p&gt;
&lt;p&gt;"Wait, what?"&lt;/p&gt;
&lt;p&gt;"I'm meeting someone today to talk about doing some art, and I need to send my portfolio to her.  I'm putting it in Ubuntu One.  Is that okay?"&lt;/p&gt;
&lt;p&gt;"Absolutely!  If you want, you can then put it on your tablet too, so you can have it mobile.  Just install the app"&lt;/p&gt;
&lt;p&gt;...an hour goes by...&lt;/p&gt;
&lt;p&gt;"My tablet can't read my portfolio, so I uploaded the individual pictures, and now I have my portfolio on my tablet."&lt;/p&gt;
&lt;p&gt;The original "portfolio" was a zip file, and her tablet didn't know how to open zip files.  She soon had her phone and tablet syncing their pictures to Ubuntu One.&lt;/p&gt;
&lt;p&gt;Sometimes I spend so much time working on Ubuntu One that I forget that I'm contributing to making cloud storage accessible to "normal people".&lt;super&gt;&lt;a href="#1"&gt;1&lt;/a&gt;&lt;/super&gt;  Moriah doesn't care about filesystems and protocols and desktop environments.  She just wants the artwork she did on the computer to be available to her on her tablet when she goes to meet someone at a coffee shop.  She wants to be able to easily get to her phone's pictures on her computer (she's always taking pictures of things that she finds inspiring, to refer to later).  I'm glad to be part of the movement to help facilitate that.&lt;/p&gt;
&lt;p&gt;The Ubuntu One team has a lot of work ahead of us, but little encouragements like this go a long way.  I'm now being accosted with feature requests from my wife, which is a good problem to have.&lt;/p&gt;
&lt;p&gt;As a final note, sure, there's Dropbox and iCloud and all sorts of things.  Moriah was familiar with Ubuntu, so Ubuntu One became the obvious choice for her.  In fact, she had iCloud enabled on her iPhone and they were causing side-effects that caused her to curse profusely on a regular basis.&lt;/p&gt;
&lt;p&gt;&lt;super&gt;&lt;a name="1"&gt;1&lt;/a&gt;&lt;/super&gt; I use the term "normal people" because it's a running joke in our house that geeks are not normal.  We do very peculiar things.  This has become the subject of her weekly webcomic &lt;a href="http://citationneededcomic.com/"&gt;Citation Neeeded&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmTheRockstar/~4/ZEP4834q770" height="1" width="1"/&gt;</description><pubDate>Tue, 06 Mar 2012 12:55:56 -0600</pubDate><guid isPermaLink="false">http://iamtherockstar.com/blog/2012/03/06/ubuntu-one-cloud-storage-human-beings/</guid><category>ubuntuone</category><feedburner:origLink>http://iamtherockstar.com/blog/2012/03/06/ubuntu-one-cloud-storage-human-beings/</feedburner:origLink></item><item><title>Announcing Pariah: Web comics for Django
</title><link>http://feedproxy.google.com/~r/IAmTheRockstar/~3/NpxYa171K4Y/</link><description>&lt;p&gt;I've just cut and released Pariah 0.2, a reusable Django app for working with web comics.  It's a small piece of code, but focuses on doing one thing and doing it well.  You can &lt;a href="https://github.com/rockstar/django-pariah"&gt;download the source on Github&lt;/a&gt;, or you can install it from pypi with &lt;code&gt;pip install django-pariah&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It's still a very early-stage release, but is now in production use on &lt;a href="http://citationneededcomic.com/"&gt;Citation Needed&lt;/a&gt;, which was previously using Comicpress, which is both terrible software and also apparently no longer maintained.&lt;/p&gt;
&lt;p&gt;Why call it Pariah? Because my wife, for whom this software was written (the author of Citation Needed), is named Moriah.  My name is Paul.  If we were a celebrities, the tabloids would refer to us as "Pariah", which I find pretty fitting.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmTheRockstar/~4/NpxYa171K4Y" height="1" width="1"/&gt;</description><pubDate>Sun, 04 Mar 2012 18:29:21 -0600</pubDate><guid isPermaLink="false">http://iamtherockstar.com/blog/2012/03/04/announcing-pariah-web-comics-django/</guid><category>python,</category><category>announcements</category><feedburner:origLink>http://iamtherockstar.com/blog/2012/03/04/announcing-pariah-web-comics-django/</feedburner:origLink></item><item><title>My Love Affair with ChromeOS
</title><link>http://feedproxy.google.com/~r/IAmTheRockstar/~3/66t9o_9JTHg/</link><description>&lt;p&gt;A few months ago, I traded my XO laptop for a CR-48 laptop.  I've fallen in love with this little gadget.  It's simplicity is what appealed most to me originally.  It's just a browser.  That's it.  If it's not a webapp, it doesn't matter.  What hooked me, however, is the new perspective on computing that I wouldn't have gotten had I kept working with the same tools that I always work with.&lt;/p&gt;
&lt;p&gt;I've been an Ubuntu user for a long time.  I've recently also started using OS X for tasks that require a Mac.  I've always considered myself a pretty forward thinking guy.  I like the direction that Ubuntu is going, including the polarizing Unity project&lt;sup&gt;1&lt;/sup&gt;. Using ChromeOS on the CR-48 showed me that I'm not forward-thinking enough.&lt;/p&gt;
&lt;p&gt;Before ChromeOS, webapps were this cute thing that I could use when I didn't have a native app that did the job much better.  Now I look at webapps as the default, and see my usage of native applications as a failure of the internet-makers to fill the need (this failure has sparked quite a fun little side project that I hope to do something with soon).&lt;/p&gt;
&lt;p&gt;Sure, webapp performance will never beat native performance, but there's more to a User Experience than performance.  They may not cover all cases.  I suspect, though, that all those edge cases are usually people that want to "use computers" rather than just get things done.&lt;/p&gt;
&lt;p&gt;Screw Android. When can I have a ChromeOS phone?&lt;/p&gt;
&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt;Unfortunately, I've recently "outgrown" Unity, which I think is okay.  The addition of the second launcher on dual monitor screens did it.  I have no desire to have a second launcher right at the seams of my two monitors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (6 Mar 2012):&lt;/strong&gt; &lt;a href="http://how-bazaar.blogspot.com/"&gt;thumper&lt;/a&gt; and I chatted about the Unity problem I was having on my dual monitor setup, and we've come to a solution that will work for both of us.  I'm looking forward to going back to Unity, because Xfce and LXDE and all the other minimalist environments don't have &lt;strong&gt;&lt;em&gt;nearly&lt;/em&gt;&lt;/strong&gt; the polish that Unity has, and Ubuntu has spoiled my for so long that I don't feel like polishing anything myself.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmTheRockstar/~4/66t9o_9JTHg" height="1" width="1"/&gt;</description><pubDate>Sat, 03 Mar 2012 23:29:12 -0600</pubDate><guid isPermaLink="false">http://iamtherockstar.com/blog/2012/03/03/my-love-affair-chromeos/</guid><category>html5,</category><category>musings</category><feedburner:origLink>http://iamtherockstar.com/blog/2012/03/03/my-love-affair-chromeos/</feedburner:origLink></item><item><title>Pretty URLs and HTML5 pushState
</title><link>http://feedproxy.google.com/~r/IAmTheRockstar/~3/sIjtEAYKM50/</link><description>&lt;p&gt;When the Django/Rails revolution hit the scene years ago, I was working for a small development shop building something similar to the Ellington product that Django came from (or something like that).  We were building a CMS using PHP for a small newspaper in California&lt;sup&gt;1&lt;/sup&gt;.  The day we rolled out prettified URLs in our completely re-written version was the day we started to see our sites climb the Google ladder.&lt;/p&gt;
&lt;p&gt;Django and Rails and CakePHP and all those other has-been-hipster frameworks all adopted prettified URLs and everyone rejoiced.  Now you could guess URLs like twitter.com/rockstar_ or facebook.com/yourmom; you could actually read a URL out loud to someone and it wouldn't be that hard to replicate by hand somewhere else (I witnessed this happen in a college dorm a few years ago).&lt;/p&gt;
&lt;p&gt;There's only one problem: Those URLs don't really match with the HTML5 APIs.&lt;/p&gt;
&lt;p&gt;HTML5's &lt;a href="http://slides.html5rocks.com/#history-api"&gt;History&lt;/a&gt; keeps track of state (and if you're not using it while building web apps, I hate you).  The mismatch comes from the fact that History keeps track of state in key/value pairs.  So, if you were looking at a Contacts app, and you clicked on a Contact, it might do something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;history.pushState(
    {contact: 'ipfreehly', view: 'contact'},
    'I.P. Freehly', '/contact/ipfreehly');
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The third argument to pushState is a new url (with the same origin).  How do you take those two key/value pairs and update a pretty URL accordingly?  If you can use querystrings, it's easy, since querystrings are just key/value pairs as well.&lt;/p&gt;
&lt;p&gt;The only sane solution (because reproducing URL building logic in the client-side is not sane) that I've been able to come up with is to make sure the href attributes of anchor tags are set correctly, and to just update the url to be the same as the href of the link.  But what about actions that are not a:link, like buttons?  In that case, we use any number of other attrs, or create our own &lt;a href="http://html5-demos.appspot.com/static/html5-whats-new/template/index.html#12"&gt;data attribute&lt;/a&gt; for it.&lt;/p&gt;
&lt;p&gt;I'd be curious to know if there are any cleaner solutions for the mismatch between pretty URLs and History.&lt;/p&gt;
&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; The software was called "Bakomatic" and from what I hear, it is no longer being maintained or implemented.  It was funded by the Bakersfield Californian (thus the 'bako' name).  It was a good experience to work in publishing, even if it was only for about 18 months.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmTheRockstar/~4/sIjtEAYKM50" height="1" width="1"/&gt;</description><pubDate>Tue, 28 Feb 2012 23:42:04 -0600</pubDate><guid isPermaLink="false">http://iamtherockstar.com/blog/2012/02/28/pretty-urls-and-html5-pushstate/</guid><category>javascript,</category><category>html5</category><feedburner:origLink>http://iamtherockstar.com/blog/2012/02/28/pretty-urls-and-html5-pushstate/</feedburner:origLink></item><item><title>The Death of Ubuntu One Notes on the Web
</title><link>http://feedproxy.google.com/~r/IAmTheRockstar/~3/PwLKTpLGlXo/</link><description>&lt;p&gt;Pre-cursor note (just in case): This isn't an official Ubuntu One post.  For those, go to the &lt;a href="https://one.ubuntu.com/blog/"&gt;Ubuntu One blog&lt;/a&gt;. I just work for them, and I have my own opinions.&lt;/p&gt;
&lt;p&gt;Today I submitted and landed the branch that will kill the web UI for Ubuntu One notes.  Users can still use Tomboy to sync, but you won't be able to access them from the web.  I know a vocal minority is upset about this.  To those, it's unfortunate.  I'm sorry.  However, I think the decision was a great one.&lt;/p&gt;
&lt;p&gt;The work was done in two branches.  The first removed the links on the website and python views and entries in urls.py (it's no secret that our web app uses Django).  The second one removes everything else: css, javascript, javascript dependencies, and the rest of the python files.  Here's the diffstat of that second branch: &lt;code&gt;103735 lines (+3/-103093) 92 files modified&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Think about that: more than 100k lines of code removed there.  Sure, we didn't write some of that, but we sure as hell needed to maintain it (it's our attitude that we own the stack).  Think about all the hidden bugs in there.  Speaking as someone who knew that code intimately (it was one of my first tasks to re-factor it when &lt;a href="http://iamtherockstar.com/blog/2011/02/08/changing-jobs-launchpad-ubuntu-one/"&gt;I first came to Ubuntu One&lt;/a&gt;), there's also a lot of technical debt there&lt;sup&gt;1&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;If code is liability, that's a lot of liability.&lt;/p&gt;
&lt;p&gt;We didn't see that much usage of the Web UI for Notes.  One of the reasons I was re-factoring it a year ago was so that we could make it less fragile.  It broke a lot.  Automated tests probably would have caught that, but the fact that users didn't notice when it broke is indicative of a feature that isn't being used.  Even after it was refactored, there were browser bugs that would occasionally surface, but no one seemed to notice.&lt;/p&gt;
&lt;p&gt;If features are an asset, Notes on the web were an asset that few people valued.&lt;/p&gt;
&lt;p&gt;I'm not a business guy, but it makes total sense for us to reduce the liability with little real cost.  Our team is small (but quick and amazing), so the less time we spend maintaining unused features, the more time we can spend making things that are awesome (and we are doing amazing things; stay tuned).&lt;/p&gt;
&lt;p&gt;The last thing that I want to address is this question that keeps getting asked in some form or another: &lt;strong&gt;&lt;em&gt;Why not make it open source and have the community maintain it?&lt;/em&gt;&lt;/strong&gt;  Here's how I respond to that: You don't get bored of a piece of software and punt it to open source.  You also can't think "Oh, the community will pick this up."  They won't.  You can't just assume there will be a "community" for it.  If you can't hold someone responsible for its maintenance, you can't expect it to be maintained.&lt;/p&gt;
&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; Technical debt is a fact of life on any development team, and specifically one a team that moves as quickly and kicks as much ass as the Ubuntu One team.  We try to mitigate it where we can, but it's a balancing act.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmTheRockstar/~4/PwLKTpLGlXo" height="1" width="1"/&gt;</description><pubDate>Mon, 27 Feb 2012 15:40:37 -0600</pubDate><guid isPermaLink="false">http://iamtherockstar.com/blog/2012/02/27/death-ubuntu-one-notes-web/</guid><category>ubuntuone</category><feedburner:origLink>http://iamtherockstar.com/blog/2012/02/27/death-ubuntu-one-notes-web/</feedburner:origLink></item><item><title>Node.js and Socket.io: Authentication All The Way Down
</title><link>http://feedproxy.google.com/~r/IAmTheRockstar/~3/GqJsWkcpfgw/</link><description>&lt;p&gt;I have a little weekend-project that I've been working on since December. It started as tinkering, got really ambitious, and then settled down into something I was just playing with to learn some new things.  Learn new things I have.  This new project is built on Node.js using the &lt;a href="http://expressjs.com/"&gt;Express&lt;/a&gt; and &lt;a href="http://socket.io/"&gt;Socket.io&lt;/a&gt; libraries to make things a little easier.  I wrote the account creation/authentication code, and backed it with MongoDB.  However, when it got to honoring that login, things got a little tricky.&lt;/p&gt;
&lt;p&gt;The first thing you'll read about is the MemoryStore object in Express.  It's used to store sessions.  Take that MemoryStore object and throw it out the window.  Let's use Redis instead (separation of concerns FTW).  First, install the &lt;code&gt;connect-redis&lt;/code&gt; library.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install connect-redis
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;...and stick it in your app.js...&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var express = require('express')
    ...
  , RedisStore = require('connect-redis')(express)
  , sessionStore = new RedisStore()

...

app.configure(function() {
    &amp;lt;snip&amp;gt;
    app.use(express.cookieParser());
    app.use(express.session({
        secret: 'YOURSOOPERSEKRITKEY',
        store: sessionStore
    }));
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now you should have a &lt;code&gt;session&lt;/code&gt; property on each routes' request object.  I only stick the user id in the session and then just look it up when I need it.  Here's the rub: if you're using Socket.io, your socket doesn't have access to that cookie by default.  That's a real bummer.  The Socket.io wiki talks about this a bit, but it's not entirely clear on how to hook it to the existing session store, and who wants to re-implement code.&lt;/p&gt;
&lt;p&gt;One that I really like about Node is that basically everything is middleware.  All we do is set the authorization function to add the session object to the socket's handshakeData.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var app = express.createServer()
  , io = require('socket.io').listen(app)

io.configure(function() {
    io.set('authorization', function(data, callback) {
        if (data.headers.cookie) {
            var cookie = parseCookie(data.headers.cookie);
            sessionStore.get(cookie['connect.sid'], function(err, session) {
                if (err || !session) {
                    callback('Error', false);
                } else {
                    data.session = session;
                    callback(null, true);
                }
            });
        } else {
            callback('No cookie', false);
        }
    });
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, when you add your socket connection handler, you can do this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;io.sockets.on('connection', function(socket) {
    var session = socket.handshake.session;
    ...
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hooray, now you can fetch session data in the web socket.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmTheRockstar/~4/GqJsWkcpfgw" height="1" width="1"/&gt;</description><pubDate>Tue, 14 Feb 2012 21:01:55 -0600</pubDate><guid isPermaLink="false">http://iamtherockstar.com/blog/2012/02/14/nodejs-and-socketio-authentication-all-way-down/</guid><category>javascript,</category><category>node,</category><category>redis</category><feedburner:origLink>http://iamtherockstar.com/blog/2012/02/14/nodejs-and-socketio-authentication-all-way-down/</feedburner:origLink></item><item><title>Tech Tasks for a High School Intern
</title><link>http://feedproxy.google.com/~r/IAmTheRockstar/~3/keHUGgHU1Y8/</link><description>&lt;p&gt;I'm planning on "hiring" my younger brother to do some work for me during his Spring Break in a few months.  He's 16, and has some tech skills, but his school is not very technical and so he could use more opportunities to learn from folks.  I thought I'd have him do some QA and some light programming (he's a fairly new but competent pythonista).  I say "hire" because I want to add some incentive to learning enough to get a summer job.&lt;/p&gt;
&lt;p&gt;Can you think of tasks that might be good for him to do?  Maybe you have an open source project that you could mentor him on, and in so doing, gain a contributor.  If you can think of something that you wished you had known when you started hacking, I'd appreciate if you'd please leave me a comment.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmTheRockstar/~4/keHUGgHU1Y8" height="1" width="1"/&gt;</description><pubDate>Mon, 13 Feb 2012 11:53:46 -0600</pubDate><guid isPermaLink="false">http://iamtherockstar.com/blog/2012/02/13/tech-tasks-high-school-intern/</guid><category>ubuntu,</category><category>free-software</category><feedburner:origLink>http://iamtherockstar.com/blog/2012/02/13/tech-tasks-high-school-intern/</feedburner:origLink></item><item><title>Announcement: YUI 3 Nightlies
</title><link>http://feedproxy.google.com/~r/IAmTheRockstar/~3/xlTcVuASBiQ/</link><description>&lt;p&gt;I'd like to announce the general availability of a YUI 3 Nightly combo server.  Each night, it will check out and create a new build of the YUI 3 source code, and serve it via a combo handler.  In order to use it, just point your YUI_config to the new combo loader.  Information about it can be found at the main page at &lt;a href="http://yuinightly.com"&gt;YUI Nightly Doc Page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Why did I do this? There are a few reasons.  First, &lt;a href="http://one.ubuntu.com"&gt;Ubuntu One&lt;/a&gt; can't use the Yahoo! CDN because we're using SSL.  This means we have to run our own combo loader.  The problem with this is that it's a pain to go out and get new YUI and plug it into my dev environment just to get surprised by something that broke or something that changed, etc.  With the nightlies, I can regularly just point YUI to this combo loader and let it run.&lt;/p&gt;
&lt;p&gt;I'm using this in "production" for a small personal site, but I wouldn't recommend it be used it any production site that actually has uptime requirements.&lt;/p&gt;
&lt;p&gt;Comments, questions, and &lt;a href="https://github.com/rockstar/yui3-nightly-tools"&gt;pull requests&lt;/a&gt; welcome.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; The URL has now been changed to &lt;a href="http://yuinightly.com"&gt;http://yuinightly.com/&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmTheRockstar/~4/xlTcVuASBiQ" height="1" width="1"/&gt;</description><pubDate>Tue, 13 Dec 2011 11:19:06 -0600</pubDate><guid isPermaLink="false">http://iamtherockstar.com/blog/2011/12/13/announcement-yui-3-nightlies/</guid><category>yuiandyou,</category><category>ubuntuone</category><feedburner:origLink>http://iamtherockstar.com/blog/2011/12/13/announcement-yui-3-nightlies/</feedburner:origLink></item><item><title>YUI and PhoneGap Sitting in a Tree
</title><link>http://feedproxy.google.com/~r/IAmTheRockstar/~3/LDjGY5ROtGM/</link><description>&lt;p&gt;...K-I-S-S-I-N-G&lt;/p&gt;
&lt;p&gt;The Web and Mobile &lt;a href="http://one.ubuntu.com"&gt;Ubuntu One&lt;/a&gt; team is in Buenos Aires, Argentina (along with most of the rest of the Ubuntu One teams) exploring the boundaries we may experience merging the Web and Native App experiences.  I realized very quickly in this exploration project that I needed an end goal.  Since we are already using YUI on the web part of Ubuntu One, I figured that I needed to figure out where the limitations of YUI would be there.&lt;/p&gt;
&lt;p&gt;Enter &lt;a href="http://phonegap.com/"&gt;PhoneGap&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It became very clear that it'd be much better to use one of these "glue" frameworks than to roll our own (the &lt;strong&gt;&lt;em&gt;important&lt;/em&gt;&lt;/strong&gt; reason being that we'd rather do more fun things).  One of the first things I noticed is that the default PhoneGap doesn't really "compile" out of the box, which annoys me.  Once I linked in the &lt;code&gt;www&lt;/code&gt; folder properly, I had a good stub.&lt;/p&gt;
&lt;p&gt;Using the YUI Loader in PhoneGap is not impossible, but it's relatively impractical.  It stores a whitelist of URLs that you can get to, and even then, javascript is so required on the site that we can't afford to &lt;strong&gt;&lt;em&gt;not&lt;/em&gt;&lt;/strong&gt; have javascript.  At this point, I realized that all the front-end tweaking/ricing I've been doing for the last year or so gets thrown out the window.  I broke down and made giant rollup files for yui.js and yui.css.&lt;/p&gt;
&lt;p&gt;As a sidenote, I also took the time to actually explore the &lt;a href="http://yuilibrary.com/yui/docs/app/"&gt;YUI App Framework&lt;/a&gt; by coding rather than reading about it (which I've done a lot).  There is an &lt;a href="http://yuilibrary.com/yui/docs/app/app-todo.html"&gt;example Todo app&lt;/a&gt; (thus, the reason why I made a todo app).  So I essentially cargo-culted that code.&lt;/p&gt;
&lt;p&gt;Sometime during this cargo-culting, I realized one very important thing: &lt;strong&gt;Debugging PhoneGap apps is a pain in the ass&lt;/strong&gt;.  It really is.  It resulted in &lt;a href="https://twitter.com/#!/rockstar_/status/144973244640931840"&gt;this late night tweet&lt;/a&gt; (which I was at least half serious about).  Unless you're a human jslint machine (and if your name is not Doug Crockford, I assert that you are &lt;strong&gt;&lt;em&gt;not&lt;/em&gt;&lt;/strong&gt; a human jslint machine), you're bound to make typos and syntax errors and such.  You don't really get a decent access to the console&lt;super&gt;1&lt;/super&gt;.  I tried running the app in a normal desktop browser but I found that events I was expecting either weren't firing or weren't being handled (without a console, I don't know).  I eventually went digging into the PhoneGap js that comes with the default template, and realized that I needed to just kill the PhoneGap js when testing in my browser.  The browser only takes you so far, but it at least helped me to get the YUI toolchain sorted out.&lt;/p&gt;
&lt;p&gt;I then took a bit of time sorting through the touch-specific interface and adapting the App example to that interface.  For instance, hover events are useless on mobile. I also found that the "keypress" event for the Enter key in an input wasn't firing with the keyboard "return".  Apparently, the iPhone wants the form input wrapped in a form itself, and then it'll show the "Done" button in the on-screen keyboard, which will send the right event (make sure that the form doesn't actually submit).&lt;/p&gt;
&lt;p&gt;The end result is &lt;a href="https://github.com/rockstar/MoarTodo"&gt;MoarTodo&lt;/a&gt;&lt;super&gt;2&lt;/super&gt;.  It's a really ugly app, but it's academic and I just wanted to learn about the toolchain.  I can't imagine &lt;strong&gt;&lt;em&gt;not&lt;/em&gt;&lt;/strong&gt; using something like PhoneGap (it doesn't have to actually &lt;strong&gt;&lt;em&gt;be&lt;/em&gt;&lt;/strong&gt; PhoneGap) to build a mobile web app to be distributed through the various app stores.  I expect there will be more to the debugging story, but it's still a learning curve.&lt;/p&gt;
&lt;p&gt;I still feel pretty strongly that the Native vs. Web argument will continue, and that they'll still have their various places.  I look forward to a day when that argument is settled, but I also look forward to the Year of the Linux Desktop, the rapture, and Santa Claus.&lt;/p&gt;
&lt;p&gt;&lt;super&gt;1&lt;/super&gt; I didn't try Weinre because I had switched to using iWebInspector a few weeks ago (when I wasn't using a PhoneGap container), and so didn't have it immediately on my system.  I'll probably have to go back and try it out in a PhoneGap context.&lt;/p&gt;
&lt;p&gt;&lt;super&gt;2&lt;/super&gt; Xcode creates new projects with Git. I'm not making a political statement here.  I just pushed it where it was easiest. Don't hate.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmTheRockstar/~4/LDjGY5ROtGM" height="1" width="1"/&gt;</description><pubDate>Fri, 09 Dec 2011 12:05:56 -0600</pubDate><guid isPermaLink="false">http://iamtherockstar.com/blog/2011/12/09/yui-and-phonegap-sitting-tree/</guid><category>javascript,</category><category>yuiandyou,</category><category>mobile,</category><category>ubuntuone</category><feedburner:origLink>http://iamtherockstar.com/blog/2011/12/09/yui-and-phonegap-sitting-tree/</feedburner:origLink></item><item><title>THE Ubuntu Success Story
</title><link>http://feedproxy.google.com/~r/IAmTheRockstar/~3/NYY5jhHNuGQ/</link><description>&lt;p&gt;Last night, I came home from a meeting, kissed my wife, and was walking back upstairs when my coat started vibrating.  I pulled my phone out to see that I was too late, and wasn't able to answer a phone call from my dad.  I called him back, and here's a summary of the beginning of that conversation.&lt;/p&gt;
&lt;p&gt;Me: "Hi dad."&lt;/p&gt;
&lt;p&gt;Dad: "Hi"&lt;/p&gt;
&lt;p&gt;Me: "Did you call? What did you need?"&lt;/p&gt;
&lt;p&gt;Dad: "I did.  I installed Ubuntu and now I'm trying to figure out how to install the driver for my video card."&lt;/p&gt;
&lt;p&gt;Me: "Waaaaaaaaaaitaminute. There's a backstory here that I have to know before we go any further."&lt;/p&gt;
&lt;p&gt;My dad is "technical".  I remember as a little kid realizing how excited my dad was when he was installing Windows 95 the day it came out.  I spent summers and school holidays making money at the company he worked for by being the floppy swapper when installing software.  He was also the person who introduced me to the term "freetard".  He's always been pretty resistant to free software, and sometimes for good reason (ever tried sending a document back and forth between on OpenOffice environment and a MS Office environment multiple times?). Last year for Christmas, my little brother Matt received a netbook that got infected before Christmas Day was over. I offered to put Ubuntu on it (something he wanted) but my dad was so resistant that he went out and bought a USB CD-ROM drive just so he could make sure Windows stayed on the machine.&lt;/p&gt;
&lt;p&gt;For me, Ubuntu has never been about "So easy my mom can use it", but "So simple my dad doesn't have a reason not to use it".&lt;super&gt;1&lt;/super&gt;&lt;/p&gt;
&lt;p&gt;As the story unfolded, my dad had been exploring the idea of virtual machines for a client, and had installed Ubuntu in a Virtual PC environment on Windows 7 host.  Unfortunately, his video would only give him 800x600, when his Windows XP guest would fill his dual-monitor setup easily.  He expected this to be a driver issue (Virtual PC apparently doesn't have a driver pack for guests like VirtualBox and VMWare do).  I found &lt;a href="https://help.ubuntu.com/community/HowToConfigureUbuntuForMicrosoftVirtualPC2004"&gt;this article&lt;/a&gt;, but as I looked at the instructions, I thought "Holy crap. I wouldn't even do this."  It became pretty clear that Microsoft Virtual PC was a pretty hostile environment to anything non-Windows.&lt;/p&gt;
&lt;p&gt;At this point, my dad starts asking about the Windows installer he saw for Ubuntu (Wubi).  Most of his concern centered around whether or not it was going to screw up his Windows partition (it doesn't).  After a bit of talk about Wubi, we ended the phone call.&lt;/p&gt;
&lt;p&gt;This morning, I get an email from him that says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Installed 32-bit Ubuntu on my system last night (Wubi).
   Booted this morning and found that my USB keyboard/mouse
   combo is not recognized at Ubuntu login screen.  No time to
   troubleshoot this morning before work and probably won’t
   spend a great deal of time on it, but wondered if you had any
   ideas of things I could try this evening.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sounds like he's got a bluetooth keyboard/mouse combo that is having problems.  It's not a happy ending just yet, but it's a giant step in the right direction.&lt;/p&gt;
&lt;p&gt;The Chasm. Ubuntu is crossing it.&lt;/p&gt;
&lt;p&gt;&lt;super&gt;1&lt;/super&gt; I gave my mom my old laptop, running Ubuntu, and connected to &lt;a href="http://www.canonical.com/enterprise-services/ubuntu-advantage/landscape"&gt;Landscape&lt;/a&gt; so I can manage it for her.  She's not technical, and Ubuntu satisfies most of her computer needs (the only one that it doesn't satisfy is that she has no genealogy software that's compatible with the other software she uses).&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmTheRockstar/~4/NYY5jhHNuGQ" height="1" width="1"/&gt;</description><pubDate>Wed, 30 Nov 2011 12:50:21 -0600</pubDate><guid isPermaLink="false">http://iamtherockstar.com/blog/2011/11/30/ubuntu-success-story/</guid><category>ubuntu</category><feedburner:origLink>http://iamtherockstar.com/blog/2011/11/30/ubuntu-success-story/</feedburner:origLink></item><item><title>Using Mustache templates in Express Apps
</title><link>http://feedproxy.google.com/~r/IAmTheRockstar/~3/ZX4V-SSJEOc/</link><description>&lt;p&gt;Tonight I decided to hack on a quick little webapp and use the opportunity to explore some tech that I've only gotten to tinker with so far.  I wanted to build a small webapp with &lt;a href="http://expressjs.com/"&gt;express&lt;/a&gt;, but I &lt;strong&gt;hate&lt;/strong&gt; &lt;a href="http://jade-lang.com/"&gt;jade&lt;/a&gt; templating (I realize this may make me a javascript heretic).  Since I'd rather just write HTML, I decided to use &lt;a href="http://mustache.github.com/"&gt;Mustache&lt;/a&gt; (plus, I have previous experience with Mustache).&lt;/p&gt;
&lt;p&gt;The biggest problem with Node.js in general is that development is too fast.  Blog posts get out of date really quick.  I found a few blogs that show how to do it, but they're more than a year old, and at that point, it's almost worthless.  Then I found &lt;a href="https://github.com/fat/stache"&gt;stache&lt;/a&gt;.  The docs there helped out to get me most of the way there.  Here's what I did to get a basic express app using mustache.&lt;/p&gt;
&lt;p&gt;First, install express and stache, and then create a new express app named myApp:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo npm install -g express stache
express myApp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now change into the myApp directory.  Edit app.js.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var stache = require('stache');
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;...import stache and then configure the app to use stache (you'll replace the existing jade config)...&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;app.set('view engine', 'mustache');
app.register('.mustache', stache);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this case, I'm using a .mustache extension for my templates, and then passing stache to it as the handler for mustache templates.&lt;/p&gt;
&lt;p&gt;In your views/ folder, you should see two files that the &lt;code&gt;express&lt;/code&gt; command created by default: &lt;code&gt;layout.jade&lt;/code&gt; and &lt;code&gt;index.jade&lt;/code&gt;.  We want to replace these with mustache stubs similar to these files.  Let's start with &lt;code&gt;layout.mustache&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;title&amp;gt;{{title}}&amp;lt;/title&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        {{{yield}}}
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In stache, {{{yield}}} seems to be a special keyword for using the subtemplate.  Make sure you remember all three suspenders around it, or you'll spend 20 minutes scratching your head and wondering why the HTML is being escaped (a behavior I hadn't ever used in mustache).&lt;/p&gt;
&lt;p&gt;Now in &lt;code&gt;index.mustache&lt;/code&gt;, we add the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;h1&amp;gt;{{title}}&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;Welcome to {{title}}&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At this point, we've got a similar layout and template to the jade templates.  The last thing left to do is change the data structure of the context we pass (since mustache wants the template context in a different format).  Crack open routes/index.js and change the res.render call to look like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;res.render('index', {
    locals: {
        title: 'Express'
    }
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now fire up the app with &lt;code&gt;node app.js&lt;/code&gt; and hit /.  Does everything work?  Hooray! If not, uh, sorry.  I'd be interested to know what didn't work, so I can fix the post.&lt;/p&gt;
&lt;p&gt;In fact, since Node.js posts tend to get out of date, if this one does, please let me know and I'll update it accordingly.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmTheRockstar/~4/ZX4V-SSJEOc" height="1" width="1"/&gt;</description><pubDate>Mon, 21 Nov 2011 20:41:54 -0600</pubDate><guid isPermaLink="false">http://iamtherockstar.com/blog/2011/11/21/using-mustache-templates-express-apps/</guid><category>nodejs,</category><category>javascript</category><feedburner:origLink>http://iamtherockstar.com/blog/2011/11/21/using-mustache-templates-express-apps/</feedburner:origLink></item><item><title>YUIConf 2011 Day 2
</title><link>http://feedproxy.google.com/~r/IAmTheRockstar/~3/XPrhb2wy4Ps/</link><description>&lt;p&gt;A few days late, sure...&lt;/p&gt;
&lt;p&gt;Once again, I pity the fool who looks at my notes expecting them to be coherent.  They make sense to me, and that's why I took the notes.  Here's the highlights:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew Wooldridge - YUI Hidden Gems&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I didn't expect to take many notes here, since I'd taken my fair share of dives into the YUI source code (I generally no longer care to read the online docs), but Andrew pointed out a few things I had glanced over and missed the value of.  Among them, he mentioned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Y.Frame - this is a wrapper for using the IFRAME element.  It creates a YUI  instance inside the IFRAME, so there's sandboxing, etc. but without the complications that come from IFRAME communication.  There are quite a few places that we could use this in Ubuntu One.  In particular, I think we could use it for the multi-file upload that we've been wanting to do for a long time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Y.DOM.inViewPortRegion - The previous day, I went looking into the ImageLoader source to see how it worked, since the NFL talk mentioned a WidgetFold that only rendered the widget when it came into the viewport, and I was curious how it did it.  Even though I had found this hidden gem the day before, it's worth noting its value in all sorts of cases.  What I'd like to do is make a synthetic event for Node such that we can hook eventHandlers into "enterViewPortRegion" and "exitViewPortRegion" or something similar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Y.on('hover') - How did I miss this?  It's a synthetic event that YUI provides, since mouseOver and mouseOut can be a bit of a fun house of edge cases.  Quite useful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Y.on('clickoutside') - I use this in my little phazr library to close on Overlay or Dialog.  It's fantastic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Y.Later - A wrapper for setTimeout and setInterval.  I made specific notes to play with this in some of the U1 things that I'm working on right now.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Eric ForRealYo - The App Framework&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This talk Melted. My. Brain.  A common theme that I heard repeatedly was that people tend to implement things in YUI, and right when they're finished, the YUI team announces the exact same thing in YUI.  I did this recently with the App Framework.&lt;/p&gt;
&lt;p&gt;The App Framework in YUI 3.4 leaves just a bit to be desired, but Eric's talk made it clear in his talk that all those desires will be available in YUI 3.5 (with a promised pr release in December).  Eric had mentioned earlier in the week that he kind of looked at the iOS UI framework API when designing the App Framework, and I can see that connection.  It's got a pretty good disconnect between data and presentation, which can often be kind of painful if you don't give it some thought.  A nice API like the one the YUI team has designed makes it easy to design things correctly without putting too much thought into it.&lt;/p&gt;
&lt;p&gt;One of the things I'm looking forward to the most in YUI 3.5 is the addition of support for Handlebars templating.  This templating will be directly connected into Y.View, but won't be compulsory, so you can use any template system you'd like, and aren't forced in to Handlerbars.&lt;/p&gt;
&lt;p&gt;As it stands now, YUI 3.4 has some of the App Framework stuff, and in particular, it has Model and ModelList, which have events that can be hooked into.  To me, that's the best way to start using the App framework.  Create widgets that handle events in your Model and ModelList instances.  At the very least, that means that I have a clear upgrade path from my app framework to YUI's (so I don't have to maintain code, I can just file a bug and complain...  :)&lt;/p&gt;
&lt;p&gt;After all of this, it became clear that I've been neglecting the YUI Gallery, both in contributing to it and using it.  I need to remedy that.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmTheRockstar/~4/XPrhb2wy4Ps" height="1" width="1"/&gt;</description><pubDate>Tue, 08 Nov 2011 10:48:55 -0600</pubDate><guid isPermaLink="false">http://iamtherockstar.com/blog/2011/11/08/yuiconf-2011-day-2/</guid><category>javascript,</category><category>yuiandyou,</category><category>ubuntuone</category><feedburner:origLink>http://iamtherockstar.com/blog/2011/11/08/yuiconf-2011-day-2/</feedburner:origLink></item><item><title>YUIConf 2011 Day 1
</title><link>http://feedproxy.google.com/~r/IAmTheRockstar/~3/H63wcJd1kb4/</link><description>&lt;p&gt;Day 1 of YUIConf 2011 is over.  I didn't keep copious notes that are coherent to anyone but myself.  Here is a congealed version of my notes (hopefully they aren't too hard to follow).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dav Glass - Keynote&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dav said something that seemed to ring very true to me about the "Graded Browser Scale".  Instead of talking about browser support, he started referring to it as a list of platforms to test on.  If everything works on that list of platforms, it &lt;strong&gt;&lt;em&gt;should&lt;/em&gt;&lt;/strong&gt; work on everything.  This is usually the way that I think about testing my own projects, and probably the way we should start thinking about Ubuntu One (granted that we don't see too much IE 6/7 on Ubuntu One currently).&lt;/p&gt;
&lt;p&gt;The YUI team is starting to think more about time based releases.  Having worked for Canonical for so long, I love the "cadence" that time-based releases bring.  I hope this means new YUI features are available in a faster manner, but mostly I'm looking forward to the promise of being more open with what features are being worked on.  It seems that we at Ubuntu One aren't the only ones implementing things that the YUI team end up releasing right after we finish writing it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Luke Smith - From one, many; From many, one&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One of the hardest and most overwhelming things about YUI is figuring out how to implement features.  Should I use a Plugin, a Widget, or an Extension.  Along with that, if you're used to class-based inheritance, inheritance (or the oddities thereof) of javascript is a little awkward.  In general, for what I'm building, I don't need to worry about how the constructors link together, so I usually just build off of Y.Base and everything is fine.&lt;/p&gt;
&lt;p&gt;One &lt;strong&gt;&lt;em&gt;really&lt;/em&gt;&lt;/strong&gt; important thing I had previously personally asserted and Luke confirmed to me is this: Unless you have a valid reason, &lt;strong&gt;use Y.Base.create&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jeff Craig - Demystifying Loader&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This was easily the best talk I went to today.  The YUI Loader is a fantastic little piece of YUI, but it's also a black hole for documentation and isn't something most people grok.  At Ubuntu One, we use &lt;a href="https://launchpad.net/convoy"&gt;convoy&lt;/a&gt; for combo loading YUI, and our configuration is a bit complicated.  I've known about some of the things we could do to make it less complicated, but this was pretty beneficial for me.  Particularly, the Loader can conditionally load modules, which should help in cases where we use modules to "monkey-patch" other modules in certain cases &lt;em&gt;cough&lt;/em&gt;IO&lt;em&gt;cough&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ryan Cannon - There is no off-season.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ryan talked about implementing YUI on NFL.com.  This is very similar to a talk I proposed for YUIConf this year as well.  Essentially, I like the stories of "This is how we got our site all working in YUI".  They wrote a really neat sounding widget they called WidgetFold that only rendered the widget once the user scrolled down to see the widget.  I can think of all kinds of uses for that kind of widget.&lt;/p&gt;
&lt;p&gt;The highlight of Ryan's talk was "Are you writing scripts or building applications?"  He used it in the context of picking the right tool for the job.  I often bring up this theme when people ask "Why not just use jQuery?", but the way Ryan phrased it is pretty excellent.&lt;/p&gt;
&lt;p&gt;I bypassed taking notes for the last two talks of the day.  After dinner, Douglas Crockford spoke.  My notes would make absolutely no sense, in that they are all over the place.  The talk was about jslint (which Doug wrote). As a summarizing quote (although it doesn't nearly do the talk justice), I noted "use of good style can help reduce errors".&lt;/p&gt;
&lt;p&gt;Afterwards, someone pointed me to the &lt;a href="https://github.com/douglascrockford/JSLint/issues?sort=created&amp;amp;direction=desc&amp;amp;state=closed&amp;amp;page=1"&gt;github issues page for jslint&lt;/a&gt;.  Doug's responses are &lt;strong&gt;&lt;em&gt;pure&lt;/em&gt;&lt;/strong&gt; comedy.  Next time I'm having a bad day, instead of going to laugh at bad Craigslist personals, I'm going to laugh at jslint issues on Github.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmTheRockstar/~4/H63wcJd1kb4" height="1" width="1"/&gt;</description><pubDate>Fri, 04 Nov 2011 00:56:37 -0600</pubDate><guid isPermaLink="false">http://iamtherockstar.com/blog/2011/11/04/yuiconf-2011-day-1/</guid><category>javascript,</category><category>yuiandyou</category><feedburner:origLink>http://iamtherockstar.com/blog/2011/11/04/yuiconf-2011-day-1/</feedburner:origLink></item></channel></rss>
