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

 <title>X⊕R | Chris Lonnen</title>
 <link href="http://xor.lonnen.com/atom.xml" rel="self"/>
 <link href="http://xor.lonnen.com/"/>
 <updated>2016-02-16T07:56:32+00:00</updated>
 <id>http://xor.lonnen.com/</id>
 <author>
   <name>Chris Lonnen</name>
   <email>chris.lonnen@gmail.com</email>
 </author>

 
 <entry>
   <title>My Community Boxen Setup</title>
   <link href="http://xor.lonnen.com/2013/11/12/mozboxen.html"/>
   <updated>2013-11-12T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2013/11/12/mozboxen</id>
   <content type="html">&lt;p&gt;Back in April I got a shiny new MBP and decided I wouldn’t transfer anything over by hand. I had spent too long bootstrapping development environments, for myself and others. “Restoring” the fresh machine from an old backup was an option, but it lacked nuance. My team had used &lt;a href=&quot;http://puppetlabs.com/&quot;&gt;Puppet&lt;/a&gt; to bring the setup time of &lt;a href=&quot;https://github.com/mozilla/socorro&quot;&gt;Mozilla’s crash reporter&lt;/a&gt; down from one week to an hour, and I was looking for similar gains for dev machine setup. After a survey of the field I chose GitHub’s &lt;a href=&quot;http://boxen.github.com/&quot;&gt;Boxen&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Boxen is a framework for creating automated, repeatable laptop setups. I created a Boxen for &lt;a href=&quot;https://github.com/mozilla-boxen/base-boxen&quot;&gt;Mozilla WebDev&lt;/a&gt;, and have been slowly building our install base since April. After installing xcode and enabling full disk encryption, a single command will install Boxen and set up:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;git + hub&lt;/li&gt;
  &lt;li&gt;homebrew&lt;/li&gt;
  &lt;li&gt;iterm2&lt;/li&gt;
  &lt;li&gt;nginx&lt;/li&gt;
  &lt;li&gt;node&lt;/li&gt;
  &lt;li&gt;python&lt;/li&gt;
  &lt;li&gt;ruby&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these and a few more useful utilities are installed into &lt;code class=&quot;highlighter-rouge&quot;&gt;/opt/boxen&lt;/code&gt; and set up for the machine – no more fussing with the difference between Apple supplied libs and the ones you Homebrew’d. Because I defined my own &lt;a href=&quot;https://github.com/mozilla-boxen/base-boxen/blob/master/modules/people/manifests/lonnen.pp&quot;&gt;manifest&lt;/a&gt;, which was entirely optional, Boxen will install (just for me) my preferred chat clients, web browsers, editor, music player, and some other utilities. I’ve even set it up to install and update my public dotfiles. Once that is finished, &lt;a href=&quot;http://www.bittorrent.com/sync&quot;&gt;BitTorrent Sync&lt;/a&gt; copies over my private files (unique to me) and in a few minutes my machine is ready to go.&lt;/p&gt;

&lt;p&gt;I’ve been slowly evangelizing this way and growing the install base inside Mozilla. Some have used it as a foundation, customizing the rest of their machine manually. A few have contributed back their own manifests and modules. &lt;a href=&quot;https://github.com/mattbasta&quot;&gt;Matt Basta&lt;/a&gt; went so far as to set up project modules to make it easy to hack on Firefox Marketplace and Addons related projects.&lt;/p&gt;

&lt;p&gt;Anyone meeting Boxen’s minimum requirements can run our flavor of Boxen, and I invite any curious parties to try. At the time of publishing, this means running OSX 10.8 or later – though support for other operating systems is slowly spreading through Boxen’s core modules. It works great for bootstrapping a fresh machine, and we’ve had no problems reported from installing it on already configured hardware either. You can read more about customizing it in the &lt;a href=&quot;https://github.com/mozilla-boxen/base-boxen&quot;&gt;README&lt;/a&gt;, or jump right in via our new &lt;a href=&quot;http://mozilla-boxen.github.io/base-boxen/&quot;&gt;install page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Boxen has already saved us a bunch of time bootstrapping new hires and recovering from hardware upgrades, component failures, and laptop theft. Many thanks are due to the community, at GitHub and elsewhere, that maintain the various modules that make our custom Boxen easy to maintain. We just pushed GitHub two-factor auth and improved OSX Mavericks support. For a sneak peak of what will be included in the future, check out &lt;a href=&quot;https://github.com/wfarr&quot;&gt;Will Farrington&lt;/a&gt;’s &lt;a href=&quot;https://speakerdeck.com/wfarr/boxen-puppetconf-2013&quot;&gt;PuppetConf 2013 talk&lt;/a&gt; about where the framework is heading or come hack on either &lt;a href=&quot;https://github.com/boxen/&quot;&gt;Boxen&lt;/a&gt; modules or &lt;a href=&quot;https://github.com/mozilla-boxen/&quot;&gt;our boxen setup&lt;/a&gt; and build the features you want to have.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>2013 Web Dev Intern Recap</title>
   <link href="http://xor.lonnen.com/2013/09/17/interns.html"/>
   <updated>2013-09-17T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2013/09/17/interns</id>
   <content type="html">&lt;p&gt;With the 2013 intern season winding down, we’d like to highlight some of the intern contributions to Mozilla Web Dev projects. This year five interns from four countries spent a few months at our Mountain View office building amazing things:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/dash1291&quot;&gt;Ashish Dubey&lt;/a&gt; created a communication dashboard in the Firefox Markeplace for archiving communications between app developers and reviewers. The dashboard uses email notifications and syncs email responses, providing some flexibility for users. Ashish also created MarketPlay, an interactive sandbox for exploring the Firefox Marketplace API.
* &lt;a href=&quot;https://air.mozilla.org/2013-intern-dubey/&quot;&gt;“Better Communication Flow in Firefox Marketplace”&lt;/a&gt;
* &lt;a href=&quot;https://github.com/mozilla/commbadge&quot;&gt;“Communication Dashboard on Github”&lt;/a&gt;
* &lt;a href=&quot;http://marketplay.paas.allizom.org/&quot;&gt;MarketPlay Staging Server&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/DerekRies&quot;&gt;Derek Ries&lt;/a&gt; created Kanbanzilla, a stand-alone app that uses the Bugzilla API to provide a Kanban interface to Mozilla’s bug tracker. This allows Mozilla teams to use Kanban without having to keep an external system in sync with Bugzilla.
* &lt;a href=&quot;https://air.mozilla.org/intern-presentations-reis/&quot;&gt;“Cards and Columns, a Kanban process for Bugzilla”&lt;/a&gt;
* &lt;a href=&quot;http://kanbanzilla.paas.allizom.org/&quot;&gt;Kanbanzilla Demo Site&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/shuhaowu&quot;&gt;Shu Hao Wu&lt;/a&gt; created a webapp for Mozilla’s support website (SUMO). The app provides offline access to the SUMO troubleshooting wiki for FFOS with fast, full text search that works well across SUMO’s localizations. Shu Hao also contributed to Mozilla’s crash reporter, where he added automated identification of rapidly growing (“explosive”) crash signatures.
* &lt;a href=&quot;https://air.mozilla.org/intern-presentation-wu/&quot;&gt;“Building apps and doing math”&lt;/a&gt;
* &lt;a href=&quot;osumo.paas.allizom.org&quot;&gt;Offline Sumo Staging Server&lt;/a&gt;
* &lt;a href=&quot;https://crash-stats.mozilla.com/explosive/&quot;&gt;Explosive Crash Report&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/ldoubleuz&quot;&gt;Leon Zhang&lt;/a&gt; built the first iteration of the Brick web components library. Brick is a javascript library that provides common UI components for web development. Brick builds on the x-tags polyfill to offer the benefits of the emerging Web Components standard today across browser platforms.
* &lt;a href=&quot;https://air.mozilla.org/intern-presentations-zhang/&quot;&gt;“Building Bricks: An Introduction to the Brick Web Components Library”&lt;/a&gt;
* &lt;a href=&quot;http://mozilla.github.io/brick/&quot;&gt;Brick Website&lt;/a&gt;
* &lt;a href=&quot;https://hacks.mozilla.org/2013/08/introducing-brick-minimal-markup-web-components-for-faster-app-development/&quot;&gt;Hacks Blog Post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/rfw&quot;&gt;Tony Young&lt;/a&gt; was a spring intern who refactored several modules of the distributed system powering Mozilla’s crash reporter. He wrote a faster filesystem module, brought consistency to the hbase module, and made storage modules composable to make Socorro easier to install and enable quicker development of new features and components in the future.
* &lt;a href=&quot;https://air.mozilla.org/refactorring-socorro/&quot;&gt;“Refactoring Socorro”&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Many thanks and well wishes to our interns as they return to school! Also, a great big thank you to Mozilla &lt;a href=&quot;https://blog.mozilla.org/university/&quot;&gt;University Recruiting&lt;/a&gt;, for furnishing us with such an excellent group this year!&lt;/p&gt;

&lt;p&gt;All of this year’s intern presentations are available on &lt;a href=&quot;https://air.mozilla.org/channels/interns-2013/&quot;&gt;Air Mozilla&lt;/a&gt;. If you’re interested in a Mozilla internship, you can get more information from &lt;a href=&quot;https://blog.mozilla.org/university/&quot;&gt;university recruiting&lt;/a&gt;, see open positions on &lt;a href=&quot;https://careers.mozilla.org/en-US/&quot;&gt;our careers page&lt;/a&gt; or meet with some Mozillians at a &lt;a href=&quot;https://blog.mozilla.org/university/#events&quot;&gt;campus near you&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post &lt;a href=&quot;https://blog.mozilla.org/webdev/2013/09/17/2013-web-dev-intern-recap/&quot;&gt;previously appeared&lt;/a&gt; on the Mozilla Webdev Blog.&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Applied Matching Algorithms</title>
   <link href="http://xor.lonnen.com/2013/05/04/gale-shapley.html"/>
   <updated>2013-05-04T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2013/05/04/gale-shapley</id>
   <content type="html">&lt;p&gt;Matching problems concern themselves with pairing things up. There are many variations across graph theory, economics, and operations research where the goal is to seek some set of matches with a particular set of properties.&lt;/p&gt;

&lt;p&gt;One of the best known variants is the stable marriage problem, explored in 1962 by D. Gale and L. S. Shapley in &lt;a href=&quot;http://www.econ.ucsb.edu/~tedb/Courses/Ec100C/galeshapley.pdf&quot;&gt;College Admissions and the Stability of Marriage&lt;/a&gt;. They describe an algorithm (now named after them) to solve the stability of marriage problem and the related college admissions problem.&lt;/p&gt;

&lt;h2 id=&quot;of-stable-marriages-and-college-admissions&quot;&gt;Of Stable Marriages and College Admissions&lt;/h2&gt;

&lt;p&gt;In the stable marriage problem there are two groups: suitors and suitees. Each person ranks every member of the other group according to individual preference. Gale and Shapley demonstrate that for any set of preferences there is a &lt;em&gt;stable&lt;/em&gt; arrangement, and as long as no ties are allowed in personal rankings the Gale-Shapley algorithm yields the &lt;em&gt;optimal&lt;/em&gt; matching for the suitors.&lt;/p&gt;

&lt;p&gt;By stable, we mean no pair would be willing to abandon their current partners for each other. Any individual may prefer someone else to their current betrothed, but the object of their affections will not reciprocate by virtue of already having a partner preferable to the aspiring adulterer. By optimal, we mean that every individual is at least as well off under the current assignment as they would be under any other stable assignment. In this algorithm, whoever is proposing has the upper hand and will receive a stable assignment. If only a single stable matching is possible, the solution is globally stable.&lt;/p&gt;

&lt;p&gt;It works like this – unmatched suitors form a queue. One at a time they propose to the most desirable person who has yet to reject them. If the suitor has been rejected by everyone interesting the suitor simply leaves, unmatched.  When a suitee is asked, the suitor is compared to any current beau. If the suitor is preferable a new engagement is made. Any scorned former partner is now unmatched and heads to the back of the queue. When one pool or the other is empty no more matches can be made, and all engagements are finalized into marriages.&lt;/p&gt;

&lt;p&gt;The algorithm is robust to unequal populations. It is even robust to individuals having limited preferences that don’t rank all potential partners. Of course, this means that some people may end up unmatched &lt;em&gt;even in an optimal matching&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The resulting arrangement must be stable because every suitor asks in order of their personal preference. Rejections only occur when the suitee already has a preferable partner, and engagements only break so that the suitee can trade up to someone strictly preferred to all previous partners. This way, no prior objections could possibly overturn under a new engagement.&lt;/p&gt;

&lt;p&gt;The proof of optimality is left as an exercise to the reader [1].&lt;/p&gt;

&lt;h2 id=&quot;open-enrollment-stability-and-suboptimal-results&quot;&gt;Open Enrollment, Stability, and Suboptimal Results&lt;/h2&gt;

&lt;p&gt;Variants of this problem have practical applications. Combining the suitors and suitees into a single group yields the stable roommates problem. Allowing one group to accept multiple partners becomes analogous to the problem of college admissions, where each school has a fixed number of slots and a preference over the applicants. As with the stable marriage problem, there is an asymmetric advantage to the initiator. This particular problem has provided practical insight for the &lt;a href=&quot;http://www.nrmp.org/&quot;&gt;National Resident Matching Program&lt;/a&gt;, which seeks to optimally match medical students with residency programs. The NRMP has a slightly harder task, as since 1998 it has been accommodating joint submissions for couples seeking to be placed in the same geographic region. This particular variant has been &lt;a href=&quot;https://www.sciencedirect.com/science/article/pii/0196677490900072&quot;&gt;shown to be NP-Complete&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So let’s examine a novel variant for a moment, which is set up like the college admissions problem except that the college has equal (no) preferences over the applicants. This resembles community college admissions with open enrollment, and it is isomorphic to dividing up a mixed bag of candy or a list of chores. The variations on the problem necessitate small changes to the algorithm and result in a change in the properties of the outcome. Here I present the Greendale algorithm for finding a stable matching in the community college problem:&lt;/p&gt;

&lt;p&gt;People act as the suitors, as in Gale-Shapley, asking for their top choice and receiving it or moving to the end of the line. People who have exhausted their list will exit the process as unmatchable. Since the resources being matched have no preference there will be no trading up – the first person to ask for the resource will receive it and keep it. The process repeats until the line of people or the supply is empty.&lt;/p&gt;

&lt;p&gt;The resulting matching is stable. Every item a person prefers to what he or she received &lt;em&gt;must&lt;/em&gt; have been asked for first, and everyone asks in waves. This means anyone who gets an item must rank it at least as highly as anyone who asks later and finds it out-of-stock. Whatever those latecomers end up with will be considered strictly inferior by everyone who managed to get the out of stock item. If it was not, they would have asked for the inferior item earlier and received that instead. Thus, the result is stable and no one will be willing to trade.&lt;/p&gt;

&lt;p&gt;Optimality usually cannot be achieved in this variation of the problem because the pool of resources effectively has an equal preference for any matching. Equal preferences are disallowed in Gale-Shapley’s construction of the problem, which is crucial to establishing optimality. In this construction, whenever a resource falls short of demand some people will end up with an inferior choice. Who ends up with what is determined by the initial order in which people interrogate the supply, since items have no way of re-entering the supply. Different orderings will all yield stable results, but individuals coveting the under-supplied resource will end up faring differently in different orderings. Thus optimality can not be achieved in any but the trivial scenario where resources outstrip individual preference. In this case the optimal matching is a global optimum because there is only one stable matching.&lt;/p&gt;

&lt;h2 id=&quot;inspiration-and-application&quot;&gt;Inspiration and Application&lt;/h2&gt;

&lt;p&gt;I became interested in the community college problem because this year &lt;a href=&quot;https://blog.lizardwrangler.com/2013/03/31/mozilla-summit/&quot;&gt;Mozilla Summit&lt;/a&gt; is being held simultaneously in three locations. &lt;a href=&quot;https://blog.mozilla.org/webdev/about/&quot;&gt;Mozilla WebDev&lt;/a&gt; has a fixed number of spots at each location, and we need a means of splitting up the group. Studying these matching problems has lent some insight into how to achieve an equitable matching of Pro Mozillians [2] to locations.&lt;/p&gt;

&lt;p&gt;I now know that having to keep small groups together greatly increases the difficulty of the problem. This isn’t a major problem, because we interpret one of the goals of Summit to be mixing up our usual groups and meeting Mozillians from other parts of the organization.&lt;/p&gt;

&lt;p&gt;I also know that we cannot create a matching where everyone gets their top choice, but we can at least match people in a stable way. Of course, stability assumes that preferences are immutable, and many preferences may change when people find out where their friends will be going. This can be partly mitigated by putting everyone’s preferences in the open and being transparent about assignment. This can also be mitigated by reinforcing Summit as an opportunity to mix up our social structures.&lt;/p&gt;

&lt;p&gt;The initial order of the queue is incredibly important, acting as an implicit ordering for the resource pool. Often it can be determined by the context of the problem – some problems may naturally order according to when preferences are submitted. Other situations may offer no useful clues, in which case you could certainly do worse than randomly ordering people in the queue.&lt;/p&gt;

&lt;p&gt;Lastly, the algorithm may not acceptably accommodate extreme positions for real world applications. Extreme positions, in this case, means either not having any preferences, or abbreviating a preference list to reduce the possible matchings. The former is remedied by leaving them out of the matching and arbitrarily assigning them to whatever resources remain at the end. In case of the latter the individual risks not get matched at all. This risk is proportional to the number of people taking this extreme position. While stable, the global matching is presumably unacceptable if some people are unmatched. Possible mitigations are manual matchings, which will be easier before the algorithm is run, or preferential placement in the queue. It’s notable that all possible mitigations afford the extremophile advantages, and extreme positions should be examined or disallowed to prevent gaming the system.&lt;/p&gt;

&lt;p&gt;Despite its imperfections, I believe the Greendale algorithm, above, could be useful for solving real matching problems. It is simple and robust, runs in polynomial time [3], and it has well understood weaknesses that can often be limited or mitigated. It is similar to algorithms that have solved other real matching problems for 45 years. For matching large groups it certainly provides an attractive alternative to hand calculations that will unavoidably be biased, time consuming, and may not reflect the actual market of preferences. The study of these algorithms also helps inform the trade offs made when considering different features, such as group matchings or allowing extreme positions.&lt;/p&gt;

&lt;p&gt;I hope this work can be of use finding an agreeable MozSummit matching for my team.&lt;/p&gt;

&lt;h3 id=&quot;further-reading&quot;&gt;Further Reading&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;The proof relies on induction and can be found in the original Gale-Shapley paper, linked above.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;I interpret all Mozilla employees as community members with pro sponsorships.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;In the worst case N people have identical preferences over N individual items, causing &lt;code class=&quot;highlighter-rouge&quot;&gt;sum(n..0)&lt;/code&gt; iterations, which is bounded by &lt;code class=&quot;highlighter-rouge&quot;&gt;O(n**2)&lt;/code&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;
</content>
 </entry>
 
 <entry>
   <title>Webapp Error Reporting</title>
   <link href="http://xor.lonnen.com/2013/04/11/error-reporting.html"/>
   <updated>2013-04-11T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2013/04/11/error-reporting</id>
   <content type="html">&lt;p&gt;I’ve been playing around with JavaScript error reporting, lately. It started last September, when my team started thinking about &lt;a href=&quot;http://www.twobraids.com/2012/11/socorro-as-service.html&quot;&gt;ways to offer Socorro as a Service&lt;/a&gt;. A month later I found myself at the Mozilla Festival, where Popcorn Maker 1.0 had just launched, complete with a client-side error reporter. I got to spend some time chatting with &lt;a href=&quot;http://vocamus.net/dave/?p=1532&quot;&gt;Dave Humphrey&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/DavidBruant&quot;&gt;David Bruant&lt;/a&gt; about the challenges and rewards of web app error reporting, and brought those discussions back to the WebTools team.&lt;/p&gt;

&lt;p&gt;In February, WebTools got together in Mountain View to build some prototypes. I had spent some time investigating the modern ecosystem, and found heavy active development error reporters and aggregation software – including the open source Sentry + Raven.js combo – across platforms. I also noted some undeveloped areas for FFOS, and set about investigating. I created a simple client library, Ripcord.js, that provided an interface like Raven.js, but with drastically simplified internals. There was also Cypress, a simple web app that created JS errors in a variety of circumstances. On a Firefox OS phone I eventually supplemented my client library with a local web app for queuing and submitting errors. A custom &lt;a href=&quot;https://hacks.mozilla.org/2013/01/introducing-web-activities/&quot;&gt;web activity&lt;/a&gt; sent the error data to the app, which could then act on the errors intelligently.&lt;/p&gt;

&lt;p&gt;Through these experiments we’ve learned a lot.&lt;/p&gt;

&lt;p&gt;With FFOS it can be useful to have additional information about the state of the device. As you pile on information about the hardware, in addition to any information about the crash itself, reports can get large and quickly eat up a capped data plan. It can also impact network performance and extend the time a user spends dealing with each error.&lt;/p&gt;

&lt;p&gt;Ripcord.js can use information about the device APIs with a local queue to bulk submit errors, conditionally submit based on &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/DOM/window.navigator.connection&quot;&gt;Internet connectivity&lt;/a&gt;, present a unified user experience for handling errors, and locally aggregate common errors between submissions. However, any app wanting to use this library would have to go through extra certification steps and a potential reorganization to accommodate. By centralizing error submission in a separate app we can extend these features to the simplest web apps and provide a central location for historic information about errors on your device. Only the local submitter would have to go through extra certification steps. In order to ensure its ubiquity, it would have to come packaged with the OS, meaning it will have to undergo the extra certification anyway. Ripcord.js can then detect the presence of a submitter, and in its absence fall back to a simpler behavior based on the developers presence. This has the added benefit of reducing the size of the client library.&lt;/p&gt;

&lt;p&gt;The experience of handling an error can be significantly improved by an error reporter. Uncaught errors can cause the UI to stop responding to the user with no warning or notification, which is frustrating. By capturing the error and triggering a MozActivity, we gain some control over the user experience when an app enters a bad state. I did not get to investigate this very thoroughly, but there’s opportunity here.&lt;/p&gt;

&lt;p&gt;There’s lot’s of potential for improving error reporting in FFOS, but there are more fundamental challenges to error reporting from web apps in general. The top level &lt;code class=&quot;highlighter-rouge&quot;&gt;window.onerror&lt;/code&gt; is supposed to catch unhandled errors, but it doesn’t fire when errors originate in certain event listeners, or in web workers. When it does catch the error, it provides only line number, file of origin, and the error message. There’s no access to the error object itself – for that you have to instrument &lt;code class=&quot;highlighter-rouge&quot;&gt;try&lt;/code&gt; &lt;code class=&quot;highlighter-rouge&quot;&gt;catch&lt;/code&gt; blocks throughout your code, and possibly add event listeners. Even when you manage to catch an error, you don’t get much more information. In the Firefox family of browsers the stack trace remains a mystery, though we’ve been able to revive a &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=355430&quot;&gt;longstanding bug&lt;/a&gt; to improve this behavior that is now seeing a flurry of activity.&lt;/p&gt;

&lt;p&gt;The few values you do get are nearly useless, because production JavaScript is compacted to minimize the number of lines and files. In practice, this means that most errors occur on the same line and file, making it difficult or impossible to differentiate between multiple errors of the same type, or isolate where a single error came from. In Webkit based browsers you can access a trace. In nightly Webkit and Chrome Canary you can even use &lt;a href=&quot;http://www.html5rocks.com/en/tutorials/developertools/sourcemaps&quot;&gt;source maps&lt;/a&gt;, which can map compressed JavaScript back to it’s source. The &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=771597&quot;&gt;Firefox&lt;/a&gt; &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=827639&quot;&gt;implementation&lt;/a&gt; will likely yield column number before a full browser source maps implementation, but column is enough for an external program to use, given the map and original files. When that is complete, error reporters will be able to usefully trace an error’s origin to the source – even if the source is a transpiled language like CoffeeScript or Fey. With full source maps support in the browser, error reporters will be able to skip the intermediate step and get the error against the original source.&lt;/p&gt;

&lt;p&gt;A lot of the information that an error reporter could want is already fully or partially implemented in browser developer tools, which is encouraging. Not only does it make providing similar info in the browser window easier, but it hints at a possible future where a client-side error reporter could hook into the browsers developer tools directly.&lt;/p&gt;

&lt;p&gt;The group within Webtools exploring this issue will be formalizing our efforts a bit more in the next few months, in a new project we’re calling &lt;a href=&quot;https://en.wikipedia.org/wiki/Bixie&quot;&gt;Bixie&lt;/a&gt;. We will work towards a v1 with a minimal feature set. It will accept JavaScript errors, store them, and present them to users through a web app. To achieve this quickly we will build on other open source projects – leveraging what we can from the modular infrastructure of the &lt;a href=&quot;https://github.com/mozilla/socorro&quot;&gt;Socorro&lt;/a&gt; crash reporter and relying on &lt;a href=&quot;https://github.com/getsentry/raven-js&quot;&gt;Raven.js&lt;/a&gt; as our client library. Subsequent iterations may introduce additional features like custom reports derived from raw errors, the client library improvements discussed above, and improved integration with other parts of the developer’s ecosystem.&lt;/p&gt;

&lt;p&gt;Moving forward we will also work closely with other teams inside Mozilla to tackle the aforementioned bugs and more, in order to bring improvements to the web platform. The &lt;code class=&quot;highlighter-rouge&quot;&gt;tools-bixie&lt;/code&gt; mailing list is pending, but until then we’ll be coordinating in &lt;code class=&quot;highlighter-rouge&quot;&gt;irc://irc.mozilla.org#bixie&lt;/code&gt;. More details about the Bixie prototype and how you can get involved will follow as we ramp up.&lt;/p&gt;

&lt;p&gt;UPDATE: the mailing list is available at https://mail.mozilla.org/listinfo/tools-bixie&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Custom Error Responses in Flask: Revisited</title>
   <link href="http://xor.lonnen.com/2013/04/08/custom-flask-error-revisited.html"/>
   <updated>2013-04-08T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2013/04/08/custom-flask-error-revisited</id>
   <content type="html">&lt;p&gt;In &lt;a href=&quot;http://xor.lonnen.com/2012/12/30/custom-flask-error.html&quot;&gt;an earlier post&lt;/a&gt; I wrote up a method of returning unimplemented status codes in Flask based on subclassing &lt;code class=&quot;highlighter-rouge&quot;&gt;werkzeug.exceptions.HTTPException&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;As it turns out, the output of Flask view functions are run through a &lt;a href=&quot;http://flask.pocoo.org/docs/api/#flask.Flask.make_response&quot;&gt;liberal factory function&lt;/a&gt; that converts the return value into a response object. This makes it easy to output an otherwise unimplemented status code by returning a simple tuple from your view function.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/lonnen/5338856.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;This way there’s no need to subclass anything from Werkzeug.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Setting up OSX and iTerm2 for Emacs</title>
   <link href="http://xor.lonnen.com/2013/01/04/emacs-on-osx.html"/>
   <updated>2013-01-04T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2013/01/04/emacs-on-osx</id>
   <content type="html">&lt;p&gt;I’ve decided to give Emacs a spin as my primary editor in January. Learning a new editor has been refreshing, but OSX got in my way a few times when I was setting things up. Many thanks are owed to &lt;a href=&quot;http://jlongster.com/&quot;&gt;James Long&lt;/a&gt; for helping me with that. I wanted to share some of my experience for other curious parties encountering similar problems.&lt;/p&gt;

&lt;p&gt;First: a note on my environment. I use &lt;a href=&quot;http://www.iterm2.com&quot;&gt;iTerm2&lt;/a&gt; instead of the native Terminal.app and I highly recommend you install it right now if you haven’t already. There is an older Emacs preinstalled on OSX, but since I’ve universally had trouble with other preinstalled dev tools I installed Emacs 24 via Homebrew. I used the optional &lt;code class=&quot;highlighter-rouge&quot;&gt;--cocoa&lt;/code&gt; flag, though I run it exclusively in the terminal.&lt;/p&gt;

&lt;p&gt;Emacs has two modifier keys used for issuing commands to the editor, referred to in the documentation as &lt;code class=&quot;highlighter-rouge&quot;&gt;C-&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;M-&lt;/code&gt;, short for &lt;code class=&quot;highlighter-rouge&quot;&gt;Command&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;Meta&lt;/code&gt;. By default these are &lt;code class=&quot;highlighter-rouge&quot;&gt;control&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;option&lt;/code&gt; on an Apple keyboard, respectively. This presents two problems: first, control is awkwardly placed and uncomfortable to use frequently; second, the &lt;code class=&quot;highlighter-rouge&quot;&gt;option&lt;/code&gt; key already has OSX-level functionality.&lt;/p&gt;

&lt;p&gt;To help save my pinky, I opened up &lt;code class=&quot;highlighter-rouge&quot;&gt;System Preferences -&amp;gt; Keyboard&lt;/code&gt; and hit the &lt;code class=&quot;highlighter-rouge&quot;&gt;Modifier Keys&lt;/code&gt; button. From this preference pane I remapped &lt;code class=&quot;highlighter-rouge&quot;&gt;caps lock&lt;/code&gt; to &lt;code class=&quot;highlighter-rouge&quot;&gt;^ Control&lt;/code&gt;, which changes the functionality throughout the OS. Now &lt;code class=&quot;highlighter-rouge&quot;&gt;C-&lt;/code&gt; is comfortably within reach of my hands from the home row.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;highlighter-rouge&quot;&gt;M-&lt;/code&gt; char still presented a problem though, as &lt;code class=&quot;highlighter-rouge&quot;&gt;option + [other key]&lt;/code&gt; is interpreted into special characters. To fix this, I used an iTerm2 feature. In &lt;code class=&quot;highlighter-rouge&quot;&gt;preferences&lt;/code&gt;, under &lt;code class=&quot;highlighter-rouge&quot;&gt;profiles&lt;/code&gt; and in the &lt;code class=&quot;highlighter-rouge&quot;&gt;keys&lt;/code&gt; tab you can specify either the right or left &lt;code class=&quot;highlighter-rouge&quot;&gt;option&lt;/code&gt; keys to send &lt;code class=&quot;highlighter-rouge&quot;&gt;+Esc&lt;/code&gt; instead, which Emacs will treat as &lt;code class=&quot;highlighter-rouge&quot;&gt;M-&lt;/code&gt;. I chose to alter only my right &lt;code class=&quot;highlighter-rouge&quot;&gt;control&lt;/code&gt; so that I could still use the left if I needed default behavior.&lt;/p&gt;

&lt;p&gt;At that point I had both &lt;code class=&quot;highlighter-rouge&quot;&gt;C-&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;M-&lt;/code&gt; working, but I found &lt;code class=&quot;highlighter-rouge&quot;&gt;option&lt;/code&gt; uncomfortable to reach for all the time. Another iTerm2 preference, this one under &lt;code class=&quot;highlighter-rouge&quot;&gt;keys&lt;/code&gt;, allowed me to swap right &lt;code class=&quot;highlighter-rouge&quot;&gt;command&lt;/code&gt; and right &lt;code class=&quot;highlighter-rouge&quot;&gt;option&lt;/code&gt; keys. This is a little more comfortable to use frequently.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Custom Error Responses in Flask</title>
   <link href="http://xor.lonnen.com/2012/12/30/custom-flask-error.html"/>
   <updated>2012-12-30T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2012/12/30/custom-flask-error</id>
   <content type="html">&lt;p&gt;Update 2012-04-08: &lt;a href=&quot;http://xor.lonnen.com/2013/04/08/custom-flask-error-revisited.html&quot;&gt;there’s a simpler way&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Python’s &lt;a href=&quot;http://flask.pocoo.org/&quot;&gt;Flask framework&lt;/a&gt; leverages Werkzeug’s HTTP exceptions module to make it easy to report error states in requests. The &lt;code class=&quot;highlighter-rouge&quot;&gt;abort&lt;/code&gt; method works with most common HTTP status codes, but sometimes you may want to return a code that isn’t implemented by Werkzeug.&lt;/p&gt;

&lt;p&gt;When I’m building services on services I like to use &lt;code class=&quot;highlighter-rouge&quot;&gt;424 - Failed Dependency&lt;/code&gt; to indicate that an unhandleable error occured in a dependent service. By subclassing Werkzeug’s &lt;code class=&quot;highlighter-rouge&quot;&gt;HTTPException&lt;/code&gt; I can respond with that exception even though Werkzeug itself doesn’t implement it.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/4423380.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;In this example it doesn’t matter if Github is down or if the application is running up against the rate limit – the app will indicate that through no fault of it’s own it cannot fulfill the request.&lt;/p&gt;

&lt;p&gt;Through a similar subclass you’ll be able to implement &lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#420&quot;&gt;custom&lt;/a&gt;, &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc6585.txt&quot;&gt;newly proposed&lt;/a&gt;, and &lt;a href=&quot;https://github.com/mitsuhiko/werkzeug/blob/master/werkzeug/exceptions.py&quot;&gt;otherwise unimplemented&lt;/a&gt; status codes.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Building a Shanty Town</title>
   <link href="http://xor.lonnen.com/2012/12/25/vagrant-development.html"/>
   <updated>2012-12-25T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2012/12/25/vagrant-development</id>
   <content type="html">&lt;p&gt;November and December have been a period of heavy investment in creating or enhancing the &lt;a href=&quot;http://vagrantup.com/&quot;&gt;Vagrant&lt;/a&gt; infrastructure on Mozilla’s &lt;a href=&quot;https://github.com/mozilla/socorro&quot;&gt;Socorro&lt;/a&gt; and &lt;a href=&quot;https://github.com/mozilla/dxr/&quot;&gt;DXR&lt;/a&gt; projects. Vagrant is a lightweight VM management tool for Virtual Box VMs. Coupled with Puppet or Chef it provides a reproducible sandbox for locally deploying projects in a production-like environment. You can store the scripts in your project’s repository and share the folder from your host machine into the VM. Develop your files locally, and changes are automatically mirrored into the VM without needing &lt;code class=&quot;highlighter-rouge&quot;&gt;scp&lt;/code&gt; or external synchronization.&lt;/p&gt;

&lt;p&gt;The Mozilla Ops group uses &lt;a href=&quot;http://puppetlabs.com/&quot;&gt;Puppet&lt;/a&gt; to automate large portions of our architecture, so it seemed the natural choice for our Vagrant VMs. Puppet is a declarative, object-oriented DSL with many built-in resource types. There are primitives for installing packages, running services, and copying whole files onto the VM. Declare the resources you need along with their dependencies and Puppet figures out the application order. Take a look at a basic manifest taken from the DXR project, containing a single class:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/4378100.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;This manifest will install the apache2-dev package, then copy an apache conf file from the DXR repository and set some permissions on it. Then it will start apache running as a service. Iff mod_rewrite and mod_proxy are present they will be enabled, though when those commands execute is not known. It is, however, consistent – on multiple executions of Puppet the commands will execute in the same order.&lt;/p&gt;

&lt;p&gt;Inheritance works classically, which can be used to great effect if you’re working with a distributed system. For example: the Socorro project has a number of small web components that talk to each other over HTTP. Socorro’s Puppet manifests declare a base class that installs common packages and starts process monitoring, logging. The base class is extended into a web service class, which starts an Apache service with associated configuration and mods. Individual components then extend the generic webservice and override just the resources that differ between them. The resulting code contains minimal boilerplate.&lt;/p&gt;

&lt;p&gt;Puppet ensures that necessary environment changes are not passed around in IRC or just on one dev’s machine, but written down in a testable, executable fashion and shared throughout the team. It also minimizes the onboarding cost of new community and new fulltime developers.&lt;/p&gt;

&lt;p&gt;Switching to a Vagrant+Puppet set up for local development brought the cost of setting up Socorro down from a day to an hour. DXR saw a proportional time savings. A scriptable set up lowers the risks and costs of major changes to the software stack, and bounds the worst case at destroying and recreating the VM. There’s plenty of room for improvement, though, especially when bootstrapping the initial Vagrant+Puppet set up. If you’re considering a similar set up for your own project, here are some of the pain points:&lt;/p&gt;

&lt;p&gt;Changing the Puppet manifests usually involves destroying and recreating your VM to ensure some old state isn’t covering your mistakes. Even if you’ve cached the base VM locally this can mean between 10 and 45 minutes to test any change to Puppet code, which is painful to a web developer used to speedy interpreters and REPLs.&lt;/p&gt;

&lt;p&gt;Furthermore, some of the design decisions in Puppet favor its primary use case – large, daemonizaed deployments on production hardware – to the detriment of single boxes. Errors tend to pass quietly. Puppet won’t abort or even log information beyond that something failed without an explicit directive. To help with this, we include the following in our initialization manifest:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/4378109.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;The capital &lt;code class=&quot;highlighter-rouge&quot;&gt;Exec&lt;/code&gt; will set the option for the &lt;code class=&quot;highlighter-rouge&quot;&gt;exec&lt;/code&gt; statements that follow. You’ll still have to carefully read Vagrant’s debug output, though.&lt;/p&gt;

&lt;p&gt;Lastly, but maybe most noticably, it can be difficult to translate shell scripts into Puppet code. A direct translation would have a series of &lt;code class=&quot;highlighter-rouge&quot;&gt;exec&lt;/code&gt; statements &lt;code class=&quot;highlighter-rouge&quot;&gt;requiring&lt;/code&gt; each other in a linear chain of spaghetti code. Puppet can be more expressive, but at times there isn’t a clear way to translate a bash script. When faced with this in a Vagrant+Puppet setup, it’s ok to just use the bash (or fab, Make, etc) script if that’s really the best way to describe what you’re after. A clean, consistent, reproducible environment is the goal, and fiddling with little changes can be extremely expensive on your time. You’ve got code to ship.&lt;/p&gt;

&lt;p&gt;Despite these issues, Vagrant+Puppet have vastly improved our development processes wherever we’ve introduced them. If you’re thinking about tackling this for your own projects, there are some great resources to help. &lt;a href=&quot;http://rcrowley.org/talks/pycon-2011/#1&quot;&gt;Richard Crowley’s excellent PyCon 2011 talk&lt;/a&gt; is a more thorough overview of why and how to use Puppet, targeted at beginners. &lt;a href=&quot;https://github.com/mozilla/playdoh&quot;&gt;Several&lt;/a&gt; &lt;a href=&quot;https://github.com/mozilla/dxr/tree/testing&quot;&gt;Mozilla&lt;/a&gt; &lt;a href=&quot;https://github.com/mozilla/socorro&quot;&gt;projects&lt;/a&gt; have Vagrant files and puppet folders to check out for &lt;a href=&quot;https://github.com/mozilla/popcorn_maker/&quot;&gt;real examples&lt;/a&gt; of how we use it for local development. Lastly, &lt;a href=&quot;http://docs.puppetlabs.com/references/latest/&quot;&gt;Puppet’s documentation&lt;/a&gt; is sometimes overwhelming, but cannonical.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Feedback and Interaction</title>
   <link href="http://xor.lonnen.com/2012/10/22/interaction.html"/>
   <updated>2012-10-22T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2012/10/22/interaction</id>
   <content type="html">&lt;p&gt;As an additional channel of communication I’ve cribbed
&lt;a href=&quot;https://github.com/holman/feedback&quot;&gt;Holman&lt;/a&gt; and opened up a
&lt;a href=&quot;https://github.com/lonnen/feedback#readme&quot;&gt;feedback repo&lt;/a&gt; on GitHub.
Questions, comments, requests, etc. can be filed there as issues; the
&lt;code class=&quot;highlighter-rouge&quot;&gt;README&lt;/code&gt; has details.&lt;/p&gt;

&lt;p&gt;If it’s unused or unhelpful, I may close it in a few months. Other
communication channels still work, but I check GitHub more often than
email, or any other social network. Plus it’s public.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Pre-Integration Testing</title>
   <link href="http://xor.lonnen.com/2012/10/18/leeroy-jenkins.html"/>
   <updated>2012-10-18T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2012/10/18/leeroy-jenkins</id>
   <content type="html">&lt;p&gt;Reviewing a pull request to &lt;a href=&quot;https://github.com/mozilla/socorro&quot;&gt;Socorro&lt;/a&gt; involves a series of filtering steps up front before the reviewer even considers the substance of the proposed change – does it violate the style guide? Does it pass our test suite? Most of these are checked by our CI server runs &lt;em&gt;after&lt;/em&gt; an SCM change. It’s always embarrassing when you’ve thoroughly reviewed and merged a commit to find that it broke the build; and it effectively blocks the rest of the team from working while you sort out the failure.&lt;/p&gt;

&lt;p&gt;But the preliminary steps get tedious, and that green merge button is so easy to click, and even when the reviewers do everything by the book differences in our developer environments and the servers we build and deploy from can lead to unexpected breakage.&lt;/p&gt;

&lt;p&gt;If we run tests after code is integrated to master, why can’t we run them before?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://travis-ci.org/&quot;&gt;Travis-CI&lt;/a&gt; does this, and it’s awesome. I’ve set up libraries to run there and pre-integration testing has been immediately useful. Especially when new contributors drop by with patches. Unfortunately, Socorro’s build process is a little more complicated and Jenkins is our CI of choice. Rather than maintain two separate build systems, I went looking for ways to get Travis-CI style testing from Jenkins. It needed to post the status of the build job back to the pull request, run automatically, and appropriately handle pull requests from other forks of the repo.&lt;/p&gt;

&lt;h2 id=&quot;introducing-leeroy&quot;&gt;Introducing Leeroy&lt;/h2&gt;

&lt;p&gt;I found &lt;a href=&quot;https://github.com/litl/leeroy&quot;&gt;Leeroy&lt;/a&gt;, a small Flask app that listens to GitHub pull request events, parses them, and triggers a parameterized Jenkins build to test proposed changes before your merge them. As the job runs, Leeroy keeps the GitHub status API updated so the curious can follow along.&lt;/p&gt;

&lt;p&gt;The project readme thoroughly covers installation. Leeroy requires accounts with access to your Jenkins server and your GitHub repo. You have to install a few plug-ins from the Jenkins UI, and then create a parameterized Jenkins job. I was able to clone our existing job and make a few tweaks to save space. Leeroy happily runs on a single Heroku dyno if you specify a port in your procfile (&lt;code class=&quot;highlighter-rouge&quot;&gt;leeroy -p $PORT&lt;/code&gt;) and specify your own settings file with a &lt;code class=&quot;highlighter-rouge&quot;&gt;heroku config&lt;/code&gt; variable. Once it’s running, newly opened or updated pull requests will have some additional UI to show their status.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/media/leeroy/leeroy-running.png&quot; alt=&quot;a screenshot of a running job&quot; /&gt;&lt;/p&gt;

&lt;p&gt;No developer is prevented from merging, but the UI does encourage smart behaviors by default. While a job is running or after it fails, the merge button is still present but no longer an inviting green. Instead it comes with a cautionary message.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/media/leeroy/leeroy-failed.png&quot; alt=&quot;a screenshot of a failed job&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A status dot appears next to each commit that was run as a build. I’ve configured ours to build only the tip of the branch when multiple commits are pushed. The dot is a permalink to the Jenkins job testing that commit, and on hover it displays the job number and status. As a feature develops in Socorro it will have multiple builds in the history to look back on, which can be helpful for the reviewer.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/media/leeroy/leeroy-success.png&quot; alt=&quot;a screenshot of a running job&quot; /&gt;&lt;/p&gt;

&lt;p&gt;On build success, there’s extra green on the screen confirming this change passed the CI tests. At this point, it’s ready for a person to come along and examine the substance of the change, knowing that Leeroy/Jenkins has caught any style guide violations and obviously broken tests.&lt;/p&gt;

&lt;h2 id=&quot;hows-that-new-robot-working-out&quot;&gt;How’s that new robot working out?&lt;/h2&gt;

&lt;p&gt;Our LeeroyBot is only set up for Socorro components, but it is nearing 150 build jobs for its first week. About one-third of those were failures. At 25 minutes of time to discover each failure manually, the back-of-the-envelope has LeeroyBot saving our team about 20 hours, or 2.5 work days this week.&lt;/p&gt;

&lt;p&gt;Furthermore, it’s actually changed the way we review and develop code. Nobody is trying to be a wetware pep8, or checking every line for trailing spaces; the focus is shifted away from nits and onto the implementation. Quick fixes are much quicker, and feature branches have become more discussion like.&lt;/p&gt;

&lt;p&gt;It’s not a perfect system. Builds break on external dependencies sometimes. Network traffic occasionally times out. Updates to master don’t cause existing pull requests to be re-run, so two commits that green light independently may have a poor interaction. All of these could be helped by manually triggering a build, but for the time being you need to modify the pull request commits to trigger a new build. I’ve filed the &lt;a href=&quot;https://github.com/litl/leeroy/issues/9&quot;&gt;issue 9&lt;/a&gt; to figure out a means of resolving this.&lt;/p&gt;

&lt;p&gt;On balance, LeeroyBot has had an overwhelmingly positive response from the other devs, and, having survived his first week, will see only expanded use in the future. Many thanks are due to Joe Shaw and Charles-Axel Dein for their excellent work on Leeroy. I recommend it to anyone using Jenkins and GitHub in their day-to-day development.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Socorro Project History</title>
   <link href="http://xor.lonnen.com/2012/10/16/socorro-history.html"/>
   <updated>2012-10-16T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2012/10/16/socorro-history</id>
   <content type="html">&lt;p&gt;At Mozilla, I spend most of my time contributing to the &lt;a href=&quot;https://github.com/mozilla/socorro&quot;&gt;Socorro Project&lt;/a&gt;. For the curious, I ran the repository history through Andrew Caudwell’s &lt;a href=&quot;https://github.com/acaudwell/Gource&quot;&gt;Gource&lt;/a&gt;. The result is a nearly two hour silent visualization of the project’s five year history.&lt;/p&gt;

&lt;p&gt;&amp;lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;http://www.youtube.com/embed/LftK8SR5Dv8&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;
&amp;lt;/iframe&amp;gt;&lt;/p&gt;

&lt;p&gt;My favorite moment is at ~1:18:00, where we landed a &lt;a href=&quot;https://github.com/mozilla/socorro/pull/29&quot;&gt;74,000 line commit&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>DNS Record Bankruptcy</title>
   <link href="http://xor.lonnen.com/2012/10/15/mucked-up.html"/>
   <updated>2012-10-15T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2012/10/15/mucked-up</id>
   <content type="html">&lt;p&gt;XOR has finished its move to a new domain: xor.lonnen.com&lt;/p&gt;

&lt;p&gt;I’ve established a permanent redirect from its old home at &lt;code class=&quot;highlighter-rouge&quot;&gt;xor.chrislonnen.com/(\S*) -&amp;gt; xor.lonnen.com&lt;/code&gt;. Ideally, I would like to map &lt;code class=&quot;highlighter-rouge&quot;&gt;xor.chrislonnen.com/(\S*) -&amp;gt; xor.lonnen.com/(\S*)&lt;/code&gt;, but my DNS host does not give me that level of control over the redirect. Shy of renting a server and using nginx or &lt;code class=&quot;highlighter-rouge&quot;&gt;mod_rewrite&lt;/code&gt;, I’m not sure I can provide a better solution. My apologies for the inconvenience.&lt;/p&gt;

&lt;p&gt;Other URLs related to the primary domain may have stopped working. Cool URIs don’t change, but everything 400’s sooner or later. Get in touch if you’re after something specific; I may have back ups.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Some things... are talking monkey work.</title>
   <link href="http://xor.lonnen.com/2012/10/10/talking-monkey-work.html"/>
   <updated>2012-10-10T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2012/10/10/talking-monkey-work</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;“It’s a big universe Jerry, and some things in it are talking monkey work”&lt;/p&gt;

  &lt;p&gt;Gabriel, The Prophecy&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;During the 2009 H1N1 flu pandemic I was working as a research assistant in a computational epidemiology lab. Early on in the epidemic data sets were scarce, but the CDC was publishing what they had online in HTML tables. The dozen or so assistants in my lab were tasked with hand-scraping all of the CDC data and compiling it into CSV files for analysis. Our task was tedious, but required focus and attention, and so it kept me from even listening to a lecture while I copied and pasted and removed markup.&lt;/p&gt;

&lt;p&gt;I put up with it the first time we had to collect a small sample. When the professors decided we’d be aggregating the entire data set, and potentially others, I wrote a script to do my part. After finding out what I was up to, they pitted me against my cohort in a race to complete our current data set. It was a modern twist on the steel drivers’ ballad, only I was running the steam engine, and racing a whole team of John Henrys.&lt;/p&gt;

&lt;p&gt;Within 15 minutes I had a python script and my data set. In 20 minutes, the whole lab’s data scraping for the week was done. Totaling it all up, what would have been 100 man-hours or more was finished in half an hour. The machine had won.&lt;/p&gt;

&lt;p&gt;Unlike John Henry’s story, though, no one died trying to beat my machine. No one even lost their job. Instead, everyone got to spend the reclaimed time on the important stuff – constructing and validating models of the disease.&lt;/p&gt;

&lt;p&gt;That was a powerful experience, and it drove home a lesson that I’ve read about a dozen times since in one form or another: There’s so much interesting stuff in the world that sits firmly in the domain of talking monkeys. There’s so much time lost to work that could be better accomplished by transistors.&lt;/p&gt;

&lt;p&gt;Embrace your talking monkey work. Leave the transistor work to the transistors.&lt;/p&gt;

&lt;p&gt;Automate all the things.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Static methods and inheritance</title>
   <link href="http://xor.lonnen.com/2012/07/02/staticmethods.html"/>
   <updated>2012-07-02T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2012/07/02/staticmethods</id>
   <content type="html">&lt;p&gt;My colleague Peter Bengtsson recently published a blog post about the &lt;code class=&quot;highlighter-rouge&quot;&gt;@staticmethod&lt;/code&gt; decorator introduced in Python 2.2. Specifically, he argues that &lt;code class=&quot;highlighter-rouge&quot;&gt;@staticmethod&lt;/code&gt; is useful for functions called exclusively from object methods, where a developer may want to change the object’s behavior by overriding that static method in a subclass. Take a minute to skim his &lt;a href=&quot;http://www.peterbe.com/plog/newfound-love-of-staticmethod&quot;&gt;short post&lt;/a&gt; and familiarize yourself with the context.&lt;/p&gt;

&lt;p&gt;If, like me, you’re are not a fan of &lt;code class=&quot;highlighter-rouge&quot;&gt;@staticmethod&lt;/code&gt; you’d be tempted to define &lt;code class=&quot;highlighter-rouge&quot;&gt;newlines&lt;/code&gt; as a function outside the class as Peter did in the second example. Naively then, to change the behavior of the subclass you might try:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/3037143.js&quot;&gt; &lt;/script&gt;

&lt;p&gt;Which results in an extra line of code and an extra method over the &lt;code class=&quot;highlighter-rouge&quot;&gt;@staticmethod&lt;/code&gt; solution. This extra method can be an annoying indirection, and if you have many of these subclasses you might resent the growing number of &lt;code class=&quot;highlighter-rouge&quot;&gt;*_newlines&lt;/code&gt; variants cluttering up your source tree.&lt;/p&gt;

&lt;p&gt;As you write all this clutter, though, you might pick up on the similarity of all that copy-pasta. The differences between these functions boil down to the strings provided as arguments to the &lt;code class=&quot;highlighter-rouge&quot;&gt;s.replace&lt;/code&gt; method. On examination, the strings start to stand out as strongly tied to the objects using the function and suddenly it becomes apparent: they are actually implicit properties of the object.&lt;/p&gt;

&lt;p&gt;It might seem unfair; the example is intentionally simple, and there could be a dozen lines of business logic there instead of a quick one-line replacement. However, I conjecture that any time you see a subclass overriding a static method you are dealing with implicit state that could use some refactoring into the object proper. For our example it would look like this:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/3037146.js&quot;&gt; &lt;/script&gt;

&lt;p&gt;Which represents a three line improvement over the &lt;code class=&quot;highlighter-rouge&quot;&gt;@staticmethod&lt;/code&gt; version given in the original post. The variable names could be improved, but the structure is explicit and clean. Depending on how often these subclasses are instantiated you could go further and pass in the line endings as arguments to the constructor, or create a class factory and use partial application to create the equivalent of the subclasses – but I’ll leave these ideas as an exercise for the reader.&lt;/p&gt;

&lt;p&gt;Something still nags me about the example, though – with the static method gone it’s clear that we’re dealing classes having &lt;a href=&quot;http://pyvideo.org/video/880/stop-writing-classes&quot;&gt;two methods, one of which is init&lt;/a&gt;. This is strong evidence that we should rewrite these as functions:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/3037147.js&quot;&gt; &lt;/script&gt;

&lt;p&gt;This cuts down the examples to 4 lines of code and increases readability by removing the object abstraction. It still suffers from the copy-pasta problem we had above, which can be overcome with a short factory method:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/3037148.js&quot;&gt; &lt;/script&gt;

&lt;p&gt;The more printers you require, the more this method pays off. The factory method is one-fourth the size of the above base class, and each new printer function is defined in one-third the size of a subclass, with equivalent functionality; which answers Peter’s challenge toward the end of the article: “How would you do this neatly without OO?”&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Using GPG + Git</title>
   <link href="http://xor.lonnen.com/2012/06/01/git+gpg.html"/>
   <updated>2012-06-01T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2012/06/01/git+gpg</id>
   <content type="html">&lt;p&gt;Several weeks ago at the &lt;a href=&quot;https://blog.mozilla.org/webdev/&quot;&gt;Mozilla Webdev&lt;/a&gt; offsite I gave a short presentation on using GPG with git. It aims to cover the basics without requiring a deep knowledge of either subject. Included are hints from my experience using it on the &lt;a href=&quot;https://github.com/mozilla/socorro&quot;&gt;Socorro&lt;/a&gt; team, and command-line level examples to get you started.
&lt;br /&gt;
&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;4fa15e5c843f270021007187&quot; data-ratio=&quot;1.3333333333333333&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Quarterly Stats</title>
   <link href="http://xor.lonnen.com/2011/12/28/quarterly-stats.html"/>
   <updated>2011-12-28T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2011/12/28/quarterly-stats</id>
   <content type="html">&lt;p&gt;The quarter (and year) are winding down, and on the &lt;a href=&quot;https://github.com/mozilla/socorro&quot;&gt;Socorro&lt;/a&gt; team we’re looking back at what we’ve accomplished. In addition to stats from our bugtracker and quarterly goals lists, we use the following scripts to derive additional data points from our source control. These give us an idea of what we’ve done well, where we can improve, and what kind of performance we can expect for the upcoming quarter.&lt;/p&gt;

&lt;p&gt;These tools rely on &lt;code class=&quot;highlighter-rouge&quot;&gt;git log&lt;/code&gt; to do a bit of heavy lifting. You can manipulate the flags to drill deeper into the data set. Try filtering commits by author, date range, or use the built in &lt;code class=&quot;highlighter-rouge&quot;&gt;--grep=&lt;/code&gt; for really powerful filtering. Read more with &lt;code class=&quot;highlighter-rouge&quot;&gt;man git-log&lt;/code&gt;.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/1528883.js&quot;&gt;&lt;/script&gt;

</content>
 </entry>
 
 <entry>
   <title>Building Vim</title>
   <link href="http://xor.lonnen.com/2011/07/17/building-vim.html"/>
   <updated>2011-07-17T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2011/07/17/building-vim</id>
   <content type="html">&lt;p&gt;OSX’s included version of Vim has done well by me for a while, but I’ve hit the point where I desire some features from newer versions. MacVim is popular among my colleagues, but I like staying in my terminal. It helps to keep my development environment consistent when I’m SSH’d into a dev box, or a virtual machine, or working on a non-Mac.&lt;/p&gt;

&lt;p&gt;Updating Vim requires compiling from source, which goes beyond sharing dotfiles. I can’t just slap the binary in my dotfile repo and pull it down, because my environments are not homogeneous enough. Instead, I’ve put together a little compile script that will let me build a better Vim without requiring elevated privileges.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/1088069.js&quot;&gt;&lt;/script&gt;

</content>
 </entry>
 
 <entry>
   <title>Introducing Introspecting</title>
   <link href="http://xor.lonnen.com/2011/02/28/introducing-introspecting.html"/>
   <updated>2011-02-28T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2011/02/28/introducing-introspecting</id>
   <content type="html">&lt;p&gt;Coincident with the release of &lt;a href=&quot;http://processingjs.org/&quot;&gt;Processing.js 1.1&lt;/a&gt;, I’d like to announce &lt;a href=&quot;https://github.com/Lonnen/Introspecting&amp;quot;&amp;gt;Introspecting 0.1&quot;&gt;Introspecting&lt;/a&gt; – an add-on for Firefox 4+ to assist in Processing.js development. At this time, it provides a command-line-like-interface for interacting with Processing.js sketches embedded in webpages.&lt;/p&gt;

&lt;p&gt;To install, visit the project’s &lt;a href=&quot;https://github.com/Lonnen/Introspecting&quot;&gt;github page&lt;/a&gt;, hit the ‘Downloads’ button, select ‘introspecting.xpi’ and drag the file onto your Firefox window. No restart is required.&lt;/p&gt;

&lt;p&gt;When installed and active the add-on checks each page loaded into the browser for the Processing object. When a page has Processing, it will load a pseudo-command line at the top of the page that allows you to interact with various Processing instances on the page. If multiple sketches are listed in Processing.instances, it will also present a selector box that allows you to choose the sketch in which your commands are executed.&lt;/p&gt;

&lt;p&gt;Most commands work as they would in Processing. For example, &lt;code class=&quot;highlighter-rouge&quot;&gt;noLoop()&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;loop()&lt;/code&gt; will disable and re-enable looping. To be clear, though, the code is interpreted as JavaScript. In order to overwrite &lt;code class=&quot;highlighter-rouge&quot;&gt;void draw()&lt;/code&gt;, then, you would write something like &lt;code class=&quot;highlighter-rouge&quot;&gt;draw = function(){background(0);ellipse(mouseX,mouseY,pmouseX,pmouseY);}&lt;/code&gt; Undo and Redo will move you through the command history.&lt;/p&gt;

&lt;p&gt;This project was conceived of as an intermediary step between &lt;code class=&quot;highlighter-rouge&quot;&gt;println()&lt;/code&gt; and FireBug for new Processing.js developers during a discussion with &lt;a href=&quot;http://vocamus.net/dave/&quot;&gt;Humph&lt;/a&gt; in the Processing.js irc channel. It was based on some earlier ideas for Processing REPL environments. Problems can be filed on Github and non-problem comments or suggestions can be e-mailed to me.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Homebrewing autoconf213</title>
   <link href="http://xor.lonnen.com/2011/01/04/homebrewing-autoconf213.html"/>
   <updated>2011-01-04T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2011/01/04/homebrewing-autoconf213</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://mxcl.github.com/homebrew/&quot;&gt;Homebrew&lt;/a&gt; is an excellent package manager for OS X. When I went to build Firefox earlier today it had most of the required packages available for me, but was missing autoconf213.&lt;/p&gt;

&lt;p&gt;A little digging revealed that there used to be an autoconf213 formula, but it was folded into the spidermonkey formula. In the ticket for &lt;a href=&quot;http://github.com/mxcl/homebrew/issues/issue/3523?authenticity_token=f3dfc83f12144ace1bc32509e7dd768822700444&quot;&gt;Issue 3523&lt;/a&gt; it was decided that this decision should be reversed, but the formula hasn’t reappeared yet.&lt;/p&gt;

&lt;p&gt;I dug up the old formula from a prior version of the repo (version control seems magical, sometimes) and dropped it in my &lt;code class=&quot;highlighter-rouge&quot;&gt;/Library/Formula&lt;/code&gt; folder, after which I ran &lt;code class=&quot;highlighter-rouge&quot;&gt;brew install autoconf&lt;/code&gt;. The formula is ‘keg-only’, meaning it doesn’t get linked for general use. Running &lt;code class=&quot;highlighter-rouge&quot;&gt;brew link autoconf&lt;/code&gt; created the appropriate symlinks and the Firefox build ran smoothly.&lt;/p&gt;

&lt;p&gt;NOTE: instead of storing it locally, you can install using &lt;code class=&quot;highlighter-rouge&quot;&gt;brew install http://bit.ly/autoconf213&lt;/code&gt;. Afterwards you will still need to link it.&lt;/p&gt;

&lt;p&gt;Until the formula comes back, feel free to use the attached copy of the old one. After it reappears, I would use the more current version in the main repository.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/765545.js&quot;&gt; &lt;/script&gt;

</content>
 </entry>
 
 <entry>
   <title>Processing.py</title>
   <link href="http://xor.lonnen.com/2010/12/12/processingpy.html"/>
   <updated>2010-12-12T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2010/12/12/processingpy</id>
   <content type="html">&lt;p&gt;While Processing is a Java-based language, there have been implementations of it (with varying degrees of fidelity) in a few other languages. The best known of these is probably &lt;a href=&quot;http://processingjs.org/&quot;&gt;Processing.js&lt;/a&gt;, a brilliant bit of JavaScript that enables many Processing sketches to run &lt;em&gt;unmodified&lt;/em&gt; in web browsers. There are other implementations that hybridize Processing with &lt;a href=&quot;https://github.com/jashkenas/ruby-processing/blob/master/README&quot;&gt;Ruby&lt;/a&gt;, &lt;a href=&quot;http://technically.us/spde/About&quot;&gt;Scala&lt;/a&gt;, &lt;a href=&quot;http://code.google.com/p/pyprocessing/&quot;&gt;CPython&lt;/a&gt;, and more. &lt;a href=&quot;http://mrfeinberg.com/&quot;&gt;J. Feinberg&lt;/a&gt;’s &lt;a href=&quot;https://github.com/jdf/processing.py&quot;&gt;Processing.py&lt;/a&gt; project is relatively new to this group, and I really like what he’s done with it so far.&lt;/p&gt;

&lt;p&gt;Processing.py is built on Jython, a Python implementation running on the JVM, and it enables Processing functionality with Python’s sugary syntax. It supports both “static” and “active” sketches, sketch-specific global variables and methods, and all included Processing renderers. It is distributed as a .jar and to play with it you do not need Jython. Below is a toy syntax comparison:&lt;/p&gt;

&lt;h2 id=&quot;processing&quot;&gt;Processing&lt;/h2&gt;
&lt;script src=&quot;https://gist.github.com/738650.js&quot;&gt; &lt;/script&gt;

&lt;h2 id=&quot;processingpy&quot;&gt;Processing.py&lt;/h2&gt;
&lt;script src=&quot;https://gist.github.com/738651.js&quot;&gt; &lt;/script&gt;

&lt;p&gt;These sketches produce the same result when run, but the Processing.py version doesn’t have brackets, semicolons, or return types. This is exciting in itself, but it does more. I’ve rewritten Daniel Shiffman’s &lt;a href=&quot;http://processing.org/learning/topics/wolfram.html&quot;&gt;Wolfram CA example&lt;/a&gt; to show off some of the differences you’ll encounter between Processing.py and pure Processing. Some of the examples are contrived, some are more practical.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/738622.js&quot;&gt; &lt;/script&gt;

&lt;h2 id=&quot;more-information&quot;&gt;More information&lt;/h2&gt;

&lt;p&gt;Full instructions and a quick start guide are available in the project’s &lt;a href=&quot;https://github.com/jdf/processing.py/blob/master/README.markdown&quot;&gt;readme&lt;/a&gt;. You can run my gist, try the included examples, and write your own. Additional information about the details of the implementation itself are available in a Google Docs presentation &lt;a href=&quot;http://goo.gl/hEWX&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Algorithm P(ython)</title>
   <link href="http://xor.lonnen.com/2010/12/05/algorithm-python.html"/>
   <updated>2010-12-05T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2010/12/05/algorithm-python</id>
   <content type="html">&lt;p&gt;A while ago a friend sent me a simple puzzle: write a program that enumerates all sets of nested parenthesis. I started with an intractable, naive solution and after some discussion and a dead end or two I wound up with a decent dynamic programming solution.&lt;/p&gt;

&lt;p&gt;In Knuth’s &lt;em&gt;The Art of Computer Programming&lt;/em&gt;: volume 4 section 7.2.1.6 he describes Algorithm P, which is much more clever than the one I came up with. It prints the nested parentheses in lexicographic order. I implemented it in Python and figured I would post it for folks put off by Knuth’s notation.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/706687.js&quot;&gt; &lt;/script&gt;

</content>
 </entry>
 
 <entry>
   <title>Undirected Graphs in Python</title>
   <link href="http://xor.lonnen.com/2010/11/13/Undirected-Graphs-In-Python.html"/>
   <updated>2010-11-13T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2010/11/13/Undirected-Graphs-In-Python</id>
   <content type="html">&lt;p&gt;A straightforward way to implement undirected graphs in python.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/675407.js&quot;&gt; &lt;/script&gt;

&lt;p&gt;For more on implementing graphs in Python, see: &lt;a href=&quot;http://www.python.org/doc/essays/graphs/&quot;&gt;Python Patterns - Implementing Graphs&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Processing &amp;&amp; Eclipse</title>
   <link href="http://xor.lonnen.com/2010/10/19/Processing-Eclipse.html"/>
   <updated>2010-10-19T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2010/10/19/Processing-Eclipse</id>
   <content type="html">&lt;p&gt;For the last several months I’ve been able to work full time on &lt;a href=&quot;http://processing.org/&quot;&gt;Processing&lt;/a&gt; thanks to generous support from the good folks at &lt;a href=&quot;http://fathom.info/&quot;&gt;Fathom&lt;/a&gt;. Most of my efforts in that time have been devoted to developing a Processing Plug-in for &lt;a href=&quot;http://www.eclipse.org/&quot;&gt;Eclipse&lt;/a&gt;. Unlike p5exporter or some of the tutorials for using Processing Java libraries in Eclipse Java projects, this plug-in aspires to provide support for the language proper.&lt;/p&gt;

&lt;p&gt;Right now the plug-in has many, but not all, of the features offered by the Processing Development Environment (PDE) that ships with the language. Syntax highlighting, creating, importing, and running sketches are all there. Additionally, it provides some error checking as you work. In the file system it stores some extra files, but efforts have been made to ensure that it works well with the PDE. Sketches created in one can be worked on in the other. It still has some rough edges and construction warnings, but it is fairly stable and functional.&lt;/p&gt;

&lt;p&gt;As this is part of an open-source project, I am looking for community feedback and involvement. If you’re interested in playing with it, installation and getting started instructions are posted in the &lt;a href=&quot;http://wiki.processing.org/w/Eclipse_Plug_In&quot;&gt;Processing Wiki&lt;/a&gt; and the &lt;a href=&quot;http://code.google.com/p/processing/issues/list&quot;&gt;Issue Tracker&lt;/a&gt; for Processing has been modified to include the “Component-Eclipse” label. Bugs and feature requests should be directed there.&lt;/p&gt;

&lt;p&gt;I have tested and verified it as working on OSX 10.6.4 and Windows XP (SP3) in fresh installations of the Eclipse IDE for Java Developers. I’ve also verified it works on Ubuntu 10.04 LTS, using apt-get to install Eclipse 3.5 with JDT.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>We can't keep it a secret any longer</title>
   <link href="http://xor.lonnen.com/2010/09/12/xor.html"/>
   <updated>2010-09-12T00:00:00+00:00</updated>
   <id>http://xor.lonnen.com/2010/09/12/xor</id>
   <content type="html">&lt;p&gt;Donal Knuth:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;[XOR] in fact, at one point, was a classified thing. I mean it was used so often in code breaking. I went to a conference in Los Alamos in 1976 where somebody wrote the truth table for XOR on the blackboard and the security man erased it immediately.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;from his 2006 lecture titled “Platologic Computation”&lt;/p&gt;
</content>
 </entry>
 

</feed>
