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

	<title>Planet Twisted</title>
	<!--<link rel="self" type="text/atom" href=""/>-->
	<link rel="alternate" type="text/html" href="http://planet.twistedmatrix.com/"/>
	<id></id>
	<updated>2012-02-04T05:41:24+00:00</updated>
	<generator uri="http://www.planetplanet.org/">http://intertwingly.net/code/venus/</generator>

	<entry>
		<title>Jonathan Lange: Simple made easy</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2012/02/simple-made-easy.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-4903070032423248361</id>
		<updated>2012-02-01T13:50:38+00:00</updated>
		<content type="html">Rich Hickey did a great talk at Strange Loop called &quot;&lt;a href=&quot;http://www.infoq.com/presentations/Simple-Made-Easy&quot;&gt;Simple Made Easy&lt;/a&gt;&quot;. You should watch it.&lt;br /&gt;&lt;br /&gt;When I tried to explain the talk to someone, I stumbled a lot and it was obvious to me that I didn't really understand it. So I'm going through it again and turning it into a blog post, purely for my own gain.&lt;br /&gt;&lt;br /&gt;This is roughly the first half of the talk. Not much of my own analysis or opinion is inserted, and I've pretty much stuck with Hickey's illustrations and phrasings. Thus this post is pretty derivative. Oops.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Simple vs Easy&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&quot;Simple&quot; means one thing, &quot;easy&quot; another. Simple is the opposite of complex. A thing is simple if it has no interleaving, if it has one purpose, one concept, one dimension, one task. Being simple does not imply one instance or one operation: it's about interleaving, not cardinality. Importantly, this means that simplicity is &lt;i&gt;objective&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Easy is the opposite of hard, or difficult. A thing is easy if it's near to hand, if it's easy to get at (location), if it's near to our understanding (familiarity) or skill set or if it's within our capabilities. This means that ease is&lt;i&gt; relative&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Speaking English is dead easy for me, but that doesn't mean that speaking English is intrinsically simple. I find French quite difficult. Little French children speak French all the time, and there's always a part of me that thinks, &quot;Boy, those kids are clever, being able to speak a foreign language at that age&quot;, but that's silly. It's easy for them, it lies near to them.&lt;br /&gt;&lt;br /&gt;This distinction between simple &amp;amp; easy is good one, and is useful in all sorts of areas. But how does it relate to software?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Constructs vs Artefacts&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As programmers, when we make software we are working on &lt;i&gt;constructs&lt;/i&gt;: source code, libraries, language concepts and so forth. Rich contends that we focus on the ease of use of those constructs: How many lines of code? How much boilerplate? Will new developers be familiar with our technology?&lt;br /&gt;&lt;br /&gt;But all of this is secondary. What actually matters is the &lt;i&gt;artefact&lt;/i&gt;, the running programs that users actually use. Does it do what it's supposed to do? Does it do it well? Can we rely on it working well? Can we fix problems when they occur? Can we change it? You know, the interesting problems.&lt;br /&gt;&lt;br /&gt;Thus we need to be assessing our constructs – our code, our technology choices – based on the attributes of the artefacts that we'll create, not based on the experience of typing code in.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Limits&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We can't make something reliable if we don't understand it. And, actually, everyone's understanding is pretty limited. We can all only hold a small number of things in our head at once.&lt;br /&gt;&lt;br /&gt;When things are complex, many parts are tied together by definition. You can't pull out just one piece and consider it because it's intertwined with other pieces. This creates an extra burden to understanding a system and thus makes it difficult to reason about the system.&lt;br /&gt;&lt;br /&gt;You do need to reason about a system, both to know what to change and to be able to do so without introducing defects. Tests, refactoring, rapid deployment and all that are great, but to make a change to the system safely &amp;amp; without fear still requires you to be able to reason about it. Every bug in your product that was found in the field passed the type checker and passed all of the tests.  Your type system doesn't tell you what change to make next in order to get the software you want any more than guard rails on a highway tell you how to get to Grandma's.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Speed&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Focusing on ease and ignoring simplicity means that you'll go really fast in the beginning, but will become slower and slower as the complexity builds.&lt;br /&gt;&lt;br /&gt;Focusing on simplicity will mean that you'll go slower in the beginning, because you'll have to do some work to simplify the problem space, but making sure that you only have intrinsic complexity means that your rate of development will remain at a high constant.&lt;br /&gt;&lt;br /&gt;There are no actual numbers for this.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Complicating constructs&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Many complicating constructs are available, familiar, succinctly described and easy to use. But none of that matters to end users. What matters is the complexity they yield. This complexity is &lt;i&gt;incidental&lt;/i&gt;, it's not intrinsic to the problem.&lt;br /&gt;&lt;br /&gt;If we build things simply, then the resulting system is easier to debug, easier to change and easier to understand.&lt;br /&gt;&lt;br /&gt;Compare a knitted castle to a castle made of Lego. The knitted castle might have been great fun to make, and might have been really easy if knitted using a loom and cutting edge knitting tools, but there's no way that it's easier to change than a Lego castle. It's not about the &lt;i&gt;ease of construction&lt;/i&gt;, it's about the &lt;i&gt;simplicity of the artefact&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How can we make software easier?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Well, we can install it to make it easier by location. We can learn it and try it to make it easier by familiarity. We can't do much about our capabilities though. If we want software to be easier to comprehend, we are going to have to bring it down to our level. We have to make it simpler.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Take Lisp as an example. It's hard for many people because they don't have a Lisp installed, or their editor doesn't support paren matching, but they can make it easier by installing a Lisp and getting a plugin for their editor. It's also hard because it's unfamiliar. Who'd have thought that parens could go on that side of the function? But you can gain that familiarity quickly enough.&lt;br /&gt;&lt;br /&gt;But parens in Lisp are used for functions and for grouping data. That's hard to get your head around, and that's because it's complex. It braids together two distinct notions.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-4903070032423248361?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jack Moffitt: The Numbers Behind the Twitter Data Silo</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/metajack/~3/cAqUYaY36M8/"/>
		<id>tag:metajack.im:/2012/01/30/the-numbers-behind-the-twitter-data-silo/</id>
		<updated>2012-01-30T20:47:00+00:00</updated>
		<content type="html">&lt;p&gt;The
&lt;a href=&quot;http://metajack.im/2012/01/12/the-potentially-dark-future-of-search/&quot;&gt;dark future of search&lt;/a&gt;
is being foreshadowed by this Twitter vs. Google fight. The latest
Twitter volley at Google is this quote (seen on
&lt;a href=&quot;http://gigaom.com/2012/01/30/costolo-twitter-google/&quot;&gt;GigaOm&lt;/a&gt;) from
Twitter CEO Dick Costolo:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;&quot;Google crawls us at a rate of 1300 hits per second... They've indexed
    3 billion of our pages,&quot; Costolo said. &quot;They have all the data they
    need.&quot;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There's no doubt that 1,300 hits per second is a large number, but
let's put that in perspective:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In
&lt;a href=&quot;http://mashable.com/2010/02/22/twitter-50-million-tweets/&quot;&gt;February 2010&lt;/a&gt;,
Twitter was at 50 million tweets per day. This is just under 600
tweets per second.&lt;/li&gt;
&lt;li&gt;In &lt;a href=&quot;http://blog.twitter.com/2011/06/200-million-tweets-per-day.html&quot;&gt;June 2011&lt;/a&gt;, Twitter was at 200 million tweets per day. This is
over 2,300 per second.&lt;/li&gt;
&lt;li&gt;In &lt;a href=&quot;http://techcrunch.com/2011/10/17/twitter-is-at-250-million-tweets-per-day/&quot;&gt;October 2011&lt;/a&gt;, Twitter hit 250 million tweets per day or just
under 3,000 per second.  &lt;/li&gt;
&lt;li&gt;They have &lt;a href=&quot;http://blog.twitter.com/2011/12/yearinreview-tweets-per-second.html&quot;&gt;spikes&lt;/a&gt; of over 7,000 tweets per second, with the
&lt;a href=&quot;https://twitter.com/#!/twittercomms/status/146751974904311808&quot;&gt;largest&lt;/a&gt; (so far) being just over 25,000 tweets per second.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For part of 2010, Google was perhaps able to keep up with the stream
at 1,300 requests per second. Somewhere between February and June, the
average volume of tweets outpaced them.&lt;/p&gt;

&lt;p&gt;Let's assume that they kept pace until June 2011, and that on June 1,
Twitter went from somewhere in the range of 1,300 tweets per second to
their reported 2,300 tweets per second. Google is 1,000 tweets behind
per second.&lt;/p&gt;

&lt;p&gt;By the end of the year, Google missed 15.5 billion tweets. They are
two months behind if they didn't skip any, and the tweet volume did
not increase. But it did increase by 25% or so by October, and surely
it has grown more since then.&lt;/p&gt;

&lt;p&gt;If Google has only indexed 3 billion pages so far, they have
approximately 12 days of tweets at current volume. It's pretty hard to
rationalize the 3 billion pages number against the 1,300 per second
number. Was Google indexing at a much slower rate before? Did they not
start until a few months ago?&lt;/p&gt;

&lt;p&gt;Of course Google may be getting multiple tweets per request, perhaps
by crawling the timelines of important users. But this means that they
probably get a lot of requests that don't give them any new tweets, or
else the timeliness of the data is poor.&lt;/p&gt;

&lt;p&gt;No matter how you slice it, it appears Google would be unable to keep
up. Even if they were keeping up now, Twitter's growth probably sets a
time limit for which keeping up remains possible.&lt;/p&gt;

&lt;p&gt;Perhaps Google is super clever, and can index only the right
tweets. I think that it's more probable they have &quot;enough&quot; data to
surface results for the super popular topics, and miss nearly
everything in the long tail of the distribution. I expect that this
adversely affects search quality, which one suspects is a high
priority for the world's best search engine.&lt;/p&gt;

&lt;p&gt;Google is no saint. They are just as guilty of the same data
hoarding. If you ran these numbers for YouTube indexing, I think you
will find the situation is much worse. I imagine that most of these
data silo companies purposefully set their crawl rates too low for
anyone to achieve high quality search results.&lt;/p&gt;

&lt;p&gt;In the case of Twitter, the end result for users is even worse because
Twitter's own attempts at search are terrible and are getting worse
over time. At least Google makes a decent YouTube search, even if no
one else can.&lt;/p&gt;

&lt;p&gt;Even if Google could get all the tweets, they still would have very
little to no Facebook data. I still think the best strategy in this
situation for them is to create their own social data and use that
instead. It's a tough road, but they seem to have little choice.&lt;/p&gt;

&lt;p&gt;In the end, it's not about Google or Twitter or Facebook, but the
stifling of innovation and competition around data. We can only hope
that some federated solution or some data-liberal company wins out in
the end.&lt;/p&gt;
    &lt;img src=&quot;http://feeds.feedburner.com/~r/metajack/~4/cAqUYaY36M8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Jack Moffitt (jack@metajack.im)</name>
			<uri>http://metajack.im/</uri>
		</author>
	</entry>

	<entry>
		<title>Moshe Zadka: Why programmers are concerned about copyright law [Addendum]</title>
		<link rel="alternate" type="text/html" href="http://moshez.wordpress.com/2012/01/26/why-programmers-are-concerned-about-copyright-law-addendum/"/>
		<id>http://moshez.wordpress.com/?p=697</id>
		<updated>2012-01-26T17:48:35+00:00</updated>
		<content type="html">&lt;p&gt;As we saw in the last edition, programmers are concerned about copyright law because the only way to universally enforce copyright law would be to take away all universal Turing machines and make sure that we cannot control them. How bad would that be?&lt;/p&gt;
&lt;p&gt;The previous episodes focused on laws of math (generality of computation) and physics (quantum mechanics makes it easy to build general purpose computers). Now we concentrate on laws of economics in the industrial age. In the beginning of the industrial age, factories lowered the cost of goods dramatically from before — a textile factory is much more efficient than a tailor making suits, and so it is much cheaper to clothe ourselves. However, as factories evolved, it became more and more important to drive the cost even lower — whereas before the competition was with other tailors, now the competition was with other factories. So, economies of scale and efficient production lines developed. Soon after that, supply chain management and moving factories to the most cost-efficient places were developed.&lt;/p&gt;
&lt;p&gt;Let’s say that you want to make T-shirts with political slogans. You’ve got your slogan writers, huddled and coming up with good slogans. They’re a sunk cost — you’ll pay them the same no matter how many T-shirts you make, or how much they cost. Now you build a big factory to make T-shirts, and print slogans on them. The company next door specializes in T-shirts with band logos. They build a big factory to make T-shirts and print logos on them. Someone realizes there is money to be made in this scenario — build a factory to manufacture T-shirts, and send them in large crates to places that will print stuff on them. Because their factory is bigger, their cost for making T-shirts are lower, and they pass some of the savings onto you, the political slogan company. In turn, you pass some of the savings onto your customers, and everyone is happier.&lt;/p&gt;
&lt;p&gt;Lesson: When economies of scale hit, you want to try and buy standard components for the product you manufacture.&lt;/p&gt;
&lt;p&gt;Now suppose you build a car. The anti-lock brake system need to figure out when the car is sliding, and start “pumping” the brake. You can build a system that will contain gyroscopes that attach to some handle that pulls a wire that pumps the brake. Or, you can&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Buy an accelerorometer&lt;/li&gt;
&lt;li&gt;Buy a general purpose chip&lt;/li&gt;
&lt;li&gt;Write software for this chip, based on input from the accelorometer&lt;/li&gt;
&lt;li&gt;Connect this software to a motor that controls the brake&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that in this scenario, we source some standard parts. Even though the parts are more complicated, it turns out that we save a lot of money by using standard chips and accelerometers. Note that putting the software on the chip is just copying it to some standard storage device — extremely cheap. ABS brakes become cheaper, and people die less. Overall, a good thing.&lt;/p&gt;
&lt;p&gt;The same sort of logic causes a lot of things that used to be done with handles, levers and pulleys to be done with a general purpose chip and some software. Your car is full of them. Your microwave has some. Your television has some. Each of those devices is basically a computer connected to some strange peripherals (brakes, microwave-rays or screens). In a world with strong copyright regulations, those devices’ software are locked to us, &lt;em&gt;even though we own the device&lt;/em&gt;. Where darkness goes, evil deeds covered by the darkness soon follow. The police in Evil Regime Country wants to make sure nobody can run from them. They mandate all cars sold in ERC must have, in their software, a special switch that when a certain bluetooth signal is sent (many cars nowadays have computers connected to bluetooth receptors), the software controlling the automatic gear system makes sure the car will not go over second gear. If the ERC police are smart about using this signal, nobody will ever know.&lt;/p&gt;
&lt;p&gt;In a world with strong copyright protection, big corporations control your life — and they are corruptible, and if darkness holds, corrupt.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/moshez.wordpress.com/697/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/moshez.wordpress.com/697/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/moshez.wordpress.com/697/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/moshez.wordpress.com/697/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/moshez.wordpress.com/697/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/facebook/moshez.wordpress.com/697/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/moshez.wordpress.com/697/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/twitter/moshez.wordpress.com/697/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/moshez.wordpress.com/697/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/moshez.wordpress.com/697/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/moshez.wordpress.com/697/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/moshez.wordpress.com/697/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/moshez.wordpress.com/697/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/moshez.wordpress.com/697/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=moshez.wordpress.com&amp;amp;blog=2210753&amp;amp;post=697&amp;amp;subd=moshez&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>moshez</name>
			<uri>http://moshez.wordpress.com</uri>
		</author>
	</entry>

	<entry>
		<title>Thomas Vander Stichele: GStreamer 0.11 Application Porting Hackfest</title>
		<link rel="alternate" type="text/html" href="http://thomas.apestaart.org/log/?p=1429"/>
		<id>http://thomas.apestaart.org/log/?p=1429</id>
		<updated>2012-01-26T10:16:27+00:00</updated>
		<content type="html">&lt;p&gt;I’m in the quiet town of Malaga these three days to attend the GStreamer hackfest.  The goal is to port applications over to the 0.11 API which will eventually be 1.0  There’s about 18 people here, which is a good number for a hackfest.&lt;/p&gt;
&lt;p&gt;The goal for me is to figure out everything that needs to be done to have Flumotion working with GStreamer 0.11.  It looks like there is more work than expected, since some of the things we rely on haven’t been ported successfully.&lt;/p&gt;
&lt;p&gt;Luckily back in the day we spent quite a bit of time to layer parts as best as possible so they don’t depend too much on each other.  Essentially, Flumotion adds a layer on top of GStreamer where GStreamer pipelines can be run in different processes and on different machines, and be connected to each other over the network.  To that end, the essential communication between elements is abstracted and wrapped inside a data protocol, so that raw bytes can be transferred from one process to another, and the other end ends up receiving those same GStreamer buffers and events.&lt;/p&gt;
&lt;p&gt;First up, there is the GStreamer Data protocol.  Its job is to serialize buffers and events into a byte stream.&lt;/p&gt;
&lt;p&gt;Second, there is the concept of streamheaders (which is related to the DELTA_UNIT flag in GStreamer).  These are buffers that always need to be send at the beginning of a new stream to be able to interpret the buffers coming after it.  In 0.10, that meant that at least a GDP version of the caps needed to be in the streamheader (because the other side cannot interpret a running stream without its caps), and in more recent versions a new-segment event.  These streamheaders are analogous to the new sticky event concept in 0.11 – some events, like CAPS and TAG and SEGMENT are now sticky to the pad, which means that a new element connected to that pad will always see those events to make sense of the new data it’s getting.&lt;/p&gt;
&lt;p&gt;Third, the actual network communication is done using the multifdsink element (and an fdsrc element on the other side).  This element just receives incoming buffers, keeps them on a global buffer list, and sends all of them to the various clients added to it by file descriptor.  It understands about streamheaders, and makes sure clients get the right ones for wherever they end up in the buffer list.  It manages the buffers, the speed of clients, the bursting behaviour, … It doesn’t require GDP at all to work – Flumotion uses this element to stream Ogg, mp3, asf, flv, webm, … to the outside world.  But to send GStreamer buffers, it’s as simple as adding a gdppay before multifdsink, and a gdpdepay after fdsrc.  Also, at the same level, there are tcpserversink/tcpclientsrc and tcpclientsink/tcpserversrc elements that do the same thing over a simple TCP connection.&lt;/p&gt;
&lt;p&gt;Fourth, there is an interface between multifdsink/fdsrc and Python.  We let Twisted set up the connections, and then steal the file descriptor and hand those off to multifdsink and fdsrc.  This makes it very easy to set up all sorts of connections (like, say, in SSL, or just pipes) and do things to them before streaming (like, for example, authentication).  But by passing the actual file descriptor, we don’t lose any performance – the low-level streaming is still done completely in C.  This is a general design principle of Flumotion: use Python and Twisted for setup, teardown, and changes to the system, and where we need a lot of functionality and can sacrifice performance; but use C and GStreamer for the lower-level processor-intensive stuff, the things that happen in steady state, processing the signal.&lt;/p&gt;
&lt;p&gt;So, there is work to do in GStreamer 0.11:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The GStreamer data protocol has not really been ported.  gdppay/depay are still there, but don’t entirely work.&lt;/li&gt;
&lt;li&gt;streamheaders in those elements will need adapting to handle sticky events.&lt;/li&gt;
&lt;li&gt;multifdsink was moved to -bad and left with broken unit tests.  There is now multisocketsink.  But sadly it looks like GSocket isn’t meant to handle pure file descriptors (which we use in our component that records streams to disk for example)&lt;/li&gt;
&lt;li&gt;0.11 doesn’t have the traditional Python bindings.  It uses gobject-introspection instead.  That will need a lot of work on the Flumotion side, and ideally we would want to keep the codebase working against both 0.10 and 0.11 as we did for the 0.8-&amp;gt;0.10 move.  Apparently these days you cannot mix gi-style binding with old-style binding anymore, because they create separate class trees.  I assume this also means we need to port the glib2/gtk2 reactors in Twisted to using gobject-introspection.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, there is a lot of work to be done it looks like.  Luckily &lt;a href=&quot;http://www.ylatuya.es/&quot;&gt;Andoni&lt;/a&gt; arrived today too, so we can share some work.&lt;/p&gt;
&lt;p&gt;After discussing with Wim, Tim, and Sebastien, my plan is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;create a common base class for multihandlesink, and refactor multisocketsink and multifdsink as subclasses of it&lt;/li&gt;
&lt;li&gt;create g_value_transform functions to bytestreams for basic objects like Buffers and Events&lt;/li&gt;
&lt;li&gt;use these transform functions as the basis for a new version of GDP, which we’ll make typefindable this time around&lt;/li&gt;
&lt;li&gt;support sticky events&lt;/li&gt;
&lt;li&gt;ignore metadata for now, as it is not mandatory; although in the future we could let gdppay decide which metadata it wants to serialize, so the application can request to do so&lt;/li&gt;
&lt;li&gt;try multisocketsink as a transport for inside Flumotion and/or for the streaming components.&lt;/li&gt;
&lt;li&gt;In the latter case, do some stress testing – on our platform, we have pipelines with multifdsink running for months on end without crashing or leaking, sometimes going up to 10000 connections open.&lt;/li&gt;
&lt;li&gt;Make twisted reactors&lt;/li&gt;
&lt;li&gt;prototype flumotion-launch with 0.11 code by using gir&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That’s probably not going to be finished over this week, but it’s a good start.  Last night I started by fixing the unit tests for multifdsink, and now I started refactoring multisocketsink and multifdsink with that.  I’ll first try and make unit tests for multisocketsink though, to verify that I’m refactoring properly.&lt;/p&gt;</content>
		<author>
			<name>Thomas</name>
			<uri>http://thomas.apestaart.org/log</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: Undistract me</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2012/01/undistract-me.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-7007235897083396697</id>
		<updated>2012-01-23T17:44:37+00:00</updated>
		<content type="html">Here's a thing that happens a lot to me: I'm doing some work, and as part of that work I need to run a command in my terminal that takes a little while. I run the command, look at it for about a second and then switch to doing something else – checking email, perhaps. I get deeply involved in my email checking, and then about twenty minutes later I switch back to the terminal and see the command has finished. For all I know, it finished nineteen minutes ago, and I was just too engrossed to notice it.&lt;br /&gt;&lt;br /&gt;This is a big productivity sink for me, especially if the command happened to fail and need retrying. I'm not disciplined enough to just sit and watch the command, and I'm not prescient enough to add something to each invocation telling me when a command is done. What I want is something that alerts me whenever long running commands finish.&lt;br /&gt;&lt;br /&gt;Well, that thing now exists, thanks to &lt;a href=&quot;http://glyph.twistedmatrix.com/&quot;&gt;glyph&lt;/a&gt;'s &lt;a href=&quot;http://glyph.twistedmatrix.com/2006/11/bash-shell-is-now-fully-operational.html&quot;&gt;script that provides precmd and postcmd support to bash&lt;/a&gt; and a lot of help from &lt;a href=&quot;http://www.tenshu.net/&quot;&gt;Chris Jones&lt;/a&gt; of &lt;a href=&quot;http://www.tenshu.net/p/terminator.html&quot;&gt;Terminator&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To use it right now:&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt; $ bzr co lp:~jml/+junk/shell-tools&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt; $ . shell-tools/long-running.bash&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt; $ notify_when_long_running_commands_finish_install&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;You'll see that if you run a command that takes over 30 seconds to complete, it will pop up a notification, which should hopefully take you away from whatever it was you are doing and back to the task at hand.&lt;br /&gt;&lt;br /&gt;If you &lt;a href=&quot;http://bazaar.launchpad.net/~jml/+junk/shell-tools/view/head:/long-running.bash&quot;&gt;look at the code&lt;/a&gt;, you'll see that it installs two hooks: &lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt;precmd&lt;/span&gt; and &lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt;preexec&lt;/span&gt;. &lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt;preexec&lt;/span&gt; runs just before the shell launches a command, and &lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt;precmd&lt;/span&gt; runs just before it prompts for the next command. Our &lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt;preexec&lt;/span&gt; stores when the command was launched and the &lt;span style=&quot;font-family: 'Courier New', Courier, monospace;&quot;&gt;precmd&lt;/span&gt; checks to see if it finished within a certain time frame. If not, it sends out a notification.&lt;br /&gt;&lt;br /&gt;Currently, you'll get a notification when you finish reading a long document, since the command finishes a long time after the command starts. Obviously this isn't ideal. I think the fix is to only send notifications when the shell doesn't have focus. Unfortunately, that's a little tricky and I think is going to be highly terminal specific.&lt;br /&gt;&lt;br /&gt;Anyway, I'm a total shell newbie, so I'd love to know if there's any way this could be done better.  Also let me know if you find this useful, or you know of someone who has already done this.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-7007235897083396697?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jp Calderone: Cleaning Up Branch Checkouts</title>
		<link rel="alternate" type="text/html" href="http://as.ynchrono.us/2012/01/cleaning-up-branch-checkouts.html"/>
		<id>tag:blogger.com,1999:blog-4350363846291077818.post-9091899279230877500</id>
		<updated>2012-01-21T19:29:35+00:00</updated>
		<content type="html">Since Twisted development typically involves at least one branch per ticket, a Twisted developer can end up with a lot of branches checked out.  For example, this morning I had 177 Twisted branches checked out on my laptop.  Many of these were branches that I contributed code to, and perhaps even merged into trunk myself when they were complete.  I could probably have deleted them at that point, but I usually can't be bothered.  Besides, I put everything I have into the branch itself, by the time I'm merging it I'm &lt;i&gt;done&lt;/i&gt;.  Other branches are ones I've done code reviews on for other developers.  I don't keep track of when these get merged into trunk as closely, since typically someone else is going to do those merges.&lt;br /&gt;&lt;br /&gt;The incremental cost of another Twisted branch is pretty minimal.  A few more megs used on my hard drive is barely noticable.  The &lt;i&gt;aggregate&lt;/i&gt; cost can get pretty high though (Seven GB for the 177 branches I had this morning).  At some point this can cause problems.&lt;br /&gt;&lt;br /&gt;Not all of these branches have been merged to into trunk, either, or I could just wipe them all out with ease.  And while I try never to leave uncommitted changes in a branch checkout, nobody's perfect...  What I really want to do is just get rid of the branches that just aren't relevant anymore.&lt;br /&gt;&lt;br /&gt;So I use &lt;a href=&quot;http://bazaar.launchpad.net/%7Eexarkun/twisted-trac-integration/trunk/view/head:/tools/cleanup-local.py&quot;&gt;cleanup-local.py&lt;/a&gt; to deal with the mess.  It looks at my branch checkouts, talks to the Twisted issue tracker to learn the state of the associated ticket (due to the naming convention for Twisted branches, it is easy to determine which ticket is associated with a branch, given just the branch name).  Then it deletes all the checkouts associated with closed tickets (due to the Twisted workflow, if a ticket is closed, it is a very safe bet that you won't need its branch anymore).&lt;br /&gt;&lt;br /&gt;The net result is that in (far) less time than it took to write this post, my laptop went from having 177 Twisted branches to having just 34.  To save even more time, I could probably set this up as a weekly cron job or something similar.  It's easy enough to run now, though, that I just do so manually once every couple of months to keep things tidy.&lt;br /&gt;&lt;br /&gt;Here's a brief snippet from today's run:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;Found password-comparison-4536-2 for ticket(s): 4536&lt;br /&gt;Status of 4536 is assigned&lt;br /&gt;Found pb-chat-example-4459 for ticket(s): 4459&lt;br /&gt;Status of 4459 is closed&lt;br /&gt;Removing closed: pb-chat-example-4459&lt;br /&gt;Found plugin-cache-2409 for ticket(s): 2409&lt;br /&gt;Status of 2409 is closed&lt;br /&gt;Removing closed: plugin-cache-2409&lt;br /&gt;Found poll-default-2234-2 for ticket(s): 2234&lt;br /&gt;Status of 2234 is closed&lt;br /&gt;Removing closed: poll-default-2234-2&lt;/blockquote&gt;&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/4350363846291077818-9091899279230877500?l=as.ynchrono.us&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Jean-Paul Calderone (noreply@blogger.com)</name>
			<uri>http://as.ynchrono.us/</uri>
		</author>
	</entry>

	<entry>
		<title>Moshe Zadka: Why programmers are concerned about copyright law [Part 1 of 2]</title>
		<link rel="alternate" type="text/html" href="http://moshez.wordpress.com/2012/01/13/why-programmers-are-concerned-about-copyright-law-part-1-of/"/>
		<id>http://moshez.wordpress.com/?p=687</id>
		<updated>2012-01-20T17:37:25+00:00</updated>
		<content type="html">&lt;p&gt;Welcome to a new experiment. I am going to try and explain why programmers tend to be concerned (one way or another) about copyright law, to the level where we compare it to slavery or tyranny. This is not going to be easy, since I intend this to be readable by people who are not programmers, and who never programmed. I am going to start from the very beginning, and it’s going to take a while.&lt;/p&gt;
&lt;p&gt;Before we even start, I would like to point out &lt;a href=&quot;http://lesswrong.com/lw/kg/expecting_short_inferential_distances&quot;&gt;an excellent description for why we usually expect explanations to be simpler&lt;/a&gt; then they really are. Please do read this. I’ll wait, really. If you think you do not need to read it, that’s actually evidence that you do — you expect my explanation to be simpler than it is, and that you do not need that bit of background knowledge…&lt;/p&gt;
&lt;p&gt;Welcome back! One important concept introduced in the article linked above is “Word of Power”. (If you didn’t read it, now is the time to fix that issue…) I will try to introduce the new concepts using Words of Power, saying the word, and then linking it to the power behind it.&lt;/p&gt;
&lt;p&gt;The first Word of Power will be “Universal Turing Machine”. You may remember a previous post of mine about &lt;a href=&quot;http://moshez.wordpress.com/2010/06/01/alan-turing&quot;&gt;Alan Turing&lt;/a&gt;, one of the greatest giants on whose shoulders we have the privilege to be standing on. But I want to start by talking about another great giant, &lt;a href=&quot;http://en.wikipedia.org/wiki/John_McCarthy_%28computer_scientist%29&quot;&gt;John McCarthy&lt;/a&gt;. McCarthy wrote a paper with the somewhat unassuming name, &lt;a href=&quot;http://www-formal.stanford.edu/jmc/recursive/recursive.html&quot;&gt;Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I&lt;/a&gt;. A more appropriate title would have been “paving the way forward for programming for the next 50 years”, you see. What McCarthy did in the paper was to lay down a simple explanation of a system for defining computation. Nowadays, a lot of computation is done, appropriately, on electronic computers. Before we had those, however, “computer” was a job title of a person who applied computation rules to symbols on paper to get results — much like the rules we learned in primary school for doing long multiplication.&lt;/p&gt;
&lt;p&gt;In both sense of the word “computer”, the goal is the same: apply rules to manipulate symbols. McCarthy defined a specific set of rules to manipulate symbols that he called “Lisp”. Lisp used S-expressions (short for “symbolic expressions”) to define computations. Read this sentence over again, because it might be the most important sentence in here: even though Lisp was a set of rules to manipulate S-expressions, those S-expressions define &lt;em&gt;other computations&lt;/em&gt;. If you only learned to manipulate S-expressions, someone could write an S-expression that did, say, long multiplication. Then, if you manipulated the S-expression for long multiplication followed by S-expressions representing numbers, you would &lt;em&gt;do long multiplication&lt;/em&gt;. Now comes the fun part — you could even &lt;em&gt;write the rules for manipulating S-expressions using S-expressions&lt;/em&gt;. You might think that for this to work, the rules for manipulating S-expressions would be really complicated. This is not true — you can see the &lt;a href=&quot;http://www-formal.stanford.edu/jmc/recursive/node3.html&quot;&gt;manipulation rules here&lt;/a&gt;. Sure, it’s a bit long, but doesn’t look like more than you needed to learn to do arithmetic, right?&lt;/p&gt;
&lt;p&gt;Well, what use would rules for manipulating S-expressions when already know how to manipulate S-expressions? Maybe very little, if not for a few other thing. I hope you have seen a demonstration of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life&quot;&gt;game of life&lt;/a&gt;, once upon a time. If you haven’t, I recommend that you read the wikipedia article. With 4 simple rules, much much simpler than McCarthy’s S-expression rules, much is possible. How much? Well, the proof is long and difficult, but mathematicians have found a Game of Life configuration that will &lt;em&gt;manipulate S-expressions&lt;/em&gt;. So if you only knew to manipulate squares on graph paper according to the rules of the Game of Life, seemingly easier than manipulating S-expressions, we could just give you a (pretty hefty) Game of Life that would cause you to manipulate S-expressions. Wait, but manipulating S-expressions lets you do arithmetic, right? So you could do arithmetic too!&lt;/p&gt;
&lt;p&gt;Wait, what about arithmetic? Well it turns out, if you just know how to add 1 to numbers, and do a bunch of other &lt;a href=&quot;http://en.wikipedia.org/wiki/%CE%9C-recursive_function#Definition&quot;&gt;trivial things&lt;/a&gt; (like substitute numbers for other numbers), we can give you a instructions that will let you manipulate the Game of Life. Or other instructions, that will manipulate S-expressions. It turns out that if you can do interesting enough computations, it doesn’t matter a whole bunch what you know to do — you can find an initial input (S-expression, Game of Life configuration, or arithmetic instructions) that will let you do anything. Anything? Well, not quite!&lt;/p&gt;
&lt;p&gt;Another interesting result (called “Rice’s Theorem”) is that you cannot write an S-expression (or any of the other things) to take any S-expression (or any of the other things) and say anything interesting about what it does to any input. Notice that I didn’t say “respectively”, and didn’t mean to — you can’t make an S-expression that will take any Game of Life configuration, and will say anything interesting about what it does. You can write S-expressions that will take some S-expressions (or …) and say something interesting about them — but not &lt;em&gt;any&lt;/em&gt; S-expression (or …).&lt;/p&gt;
&lt;p&gt;What has all this to do with our friend, Alan Turing? Well, Turing invented the original thing that stands for “…”, and he called it a Turing machine. A Turing machine has an internal state, and reads from and writes to a tape. The interesting thing about a Turing machine? You can write a Turing machine that will manipulate S-expressions. Or play the Game of Life. Or perform arithmetic. Any of those Turing machines can do anything S-expressions do! All of those are called “Universal Turing Machine”, because any computation possible by any other Turing machine, or S-expression, or Game of Life, or arithmetic, can also be done by them. You only need One Turing machine, or one S-expression, or one Game of Life configuration, or one set of arithmetic rules and you can do anything anyone else can do, if maybe somewhat slowly. Fortunately, or unfortunately, all those computations also have the same basic flaw — you can never write one of those to say anything interesting about any computation that comes their way (this will be important later!)&lt;/p&gt;
&lt;p&gt;Let us recap:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Computations that manipulate symbols can be done either electronically or by a human, equally well, if not equally fast.&lt;/li&gt;
&lt;li&gt;You can define a “universal computation”, that if you learn to do, anyone can get you to do any other computation by writing the correct input.&lt;/li&gt;
&lt;li&gt;It is impossible for you to know anything interesting about any possible computational input.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Those three concepts (“a lot of interesting manipulations are equivalent”, “universal manipulations are possible” and “nothing interesting to say”) are the core of what computers are. A computer chip does very specific manipulations ([1]). However, programmers, by writing carefully thought out inputs, can get it to perform any computation ([2]). Lastly, it is impossible to write a computer chip that will be able to say anything interesting about any specific program ([3]). Of course, crafting these programs is difficult — this is why programmers use “programming languages”, which are &lt;em&gt;even more&lt;/em&gt; “universal computation instructions”. A language is called “Turing complete” when you can use it to build a Turing machine (which would also have allowed you to build an S-expression manipulator, or Game of Life player, etc.). In short, all we have said so far applies equally well to most programming languages. There are niche non-Turing-complete languages, used where being able to say something interesting about any possible program is important — but here’s the rub — it’s actually &lt;em&gt;hard&lt;/em&gt; to invent something which is not Turing complete. As we saw above, even very simple things will be able to build Turing machines.&lt;/p&gt;
&lt;p&gt;Computers, languages and programmers are all becoming better at making computations that were “possible” a decade ago be “fast” now. There is an enormous economic pressure on that — after all, the more you can do “fast”, the more you can do “more and bigger”, and people like “more and bigger”.&lt;/p&gt;
&lt;p&gt;Now, we come to a very simple computation — copying. A “copier” can be defined in multiple ways, but let’s suppose, for the sake of argument, that we just want to replicate the input twice (“have two copies”). It is easy to write an S-expression to do it. Therefore, any Turing complete environment can do it. But remember — it is impossible to say anything “interesting” about any possible S-expression, and therefore, it is impossible to write a computation that outputs the correct answer for “this S-expression is not a copier”. Wait, what? Yes, that’s right. If an S-expression has access to some input, it is &lt;em&gt;impossible&lt;/em&gt; to know for sure that it will not copy it.&lt;/p&gt;
&lt;p&gt;The next Word of Power I wish to introduce is “bits”. A “bit” (short for binary digit) is a place-holder for something that can be either 0 or 1. Anything that can represent at least two states (say, the light switch in your kitchen) is a bit. Now, let’s say that you have a set of symbols — say musical notes. I hope you have seen “Sounds of Music”, and remember the best song ever — “Do, a deer” (etc.). Our symbols are “Do, Re, Mi, Fa, Sol, La, Ti”. As the song makes the case, we can write any piece of music with just those (yes, I know about sharps, flats and octaves…bear with me). Now, let’s assign “bit patterns” to each note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do — 000&lt;/li&gt;
&lt;li&gt;Re — 001&lt;/li&gt;
&lt;li&gt;Mi — 010&lt;/li&gt;
&lt;li&gt;Fa — 011&lt;/li&gt;
&lt;li&gt;Sol — 100&lt;/li&gt;
&lt;li&gt;La — 101&lt;/li&gt;
&lt;li&gt;Ti — 110&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, if we want to write the notes for the first line of “Twinkle, Twinkle” (Do Do Sol Sol Ti Ti Sol) we can instead write 000000100100110110100 in bits. If we have those bits, we can just take them in threes, and convert them back to the musical notes. We can do the same with any set of symbols — say, the alphabet. This is actually how, more or less, computers store text — they can convert the alphabet into bits, and save those bits. Then they can manipulate those bits using carefully crafted programs to, say, replace the word “Foo” with “Bar”. Or, say, copy them. If we have the bits to a fan fiction of Mickey Mouse having sex with Pluto, we can copy those too. If instead, we have the bits for an S-expression that will generate the bits for a fan fiction of Mickey Mouse having sex with Pluto, we could copy those too. But wait, this is funny — there is no way to know for certain that certain bits are &lt;em&gt;not&lt;/em&gt; an S-expression that will produce the bits of Mickey Mouse having sex with Pluto.&lt;/p&gt;
&lt;p&gt;A fan fiction of Mickey Mouse having sex with Pluto is a dangerous thing. It is, as the law and case law currently stands, a violation of copyright law. In general, it is not protected under the Fair Use doctrine, and this means that writing this fan fiction is illegal. Copying this fan fiction is illegal. What’s more, Disney has an incentive (or at least, believes it has an incentive) to prevent copying this fan fiction around. When incentive (or perceived incentive) and legal powers combine, the result is expected — Disney would dearly love to have an automatic way to prevent computers from copying this fan fiction. Or, say, from copying the bits that represent the video of “Cars 2″.&lt;/p&gt;
&lt;p&gt;Remember what I said above — it’s impossible to have a way to know for certain which bits are actually an S-expression that will create the bits for the “Cars 2″ video. Although Disney has the incentive (this is a matter of economics and psychology, ultimately the results of the forces of evolution) and the legal powers (this is a matter of social convention), the math, hard and unyielding, doesn’t care. Math doesn’t care about evolution. Math doesn’t care about society. Math is math, and the math says that you can’t build a computer that will only copy things if they’re not S-expressions that produce the Cars 2 video, no matter how much you want to.&lt;/p&gt;
&lt;p&gt;Join me next episode, when I explain the basics of cryptography, and how they pertain to the issue of copyright law.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/moshez.wordpress.com/687/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/moshez.wordpress.com/687/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/moshez.wordpress.com/687/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/moshez.wordpress.com/687/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/moshez.wordpress.com/687/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/facebook/moshez.wordpress.com/687/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/moshez.wordpress.com/687/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/twitter/moshez.wordpress.com/687/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/moshez.wordpress.com/687/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/moshez.wordpress.com/687/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/moshez.wordpress.com/687/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/moshez.wordpress.com/687/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/moshez.wordpress.com/687/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/moshez.wordpress.com/687/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=moshez.wordpress.com&amp;amp;blog=2210753&amp;amp;post=687&amp;amp;subd=moshez&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>moshez</name>
			<uri>http://moshez.wordpress.com</uri>
		</author>
	</entry>

	<entry>
		<title>Moshe Zadka: Why programmers are concerned about copyright law [Part 2 of 2]</title>
		<link rel="alternate" type="text/html" href="http://moshez.wordpress.com/2012/01/20/why-programmers-are-concerned-about-copyright-law-part-2-of-2/"/>
		<id>http://moshez.wordpress.com/?p=691</id>
		<updated>2012-01-20T17:36:03+00:00</updated>
		<content type="html">&lt;p&gt;[A lot of the ideas in this edition awe a lot to &lt;a href=&quot;http://craphound.com&quot;&gt;Cory Doctorow&lt;/a&gt;. The responsibility for any mistakes or omissions are still mine.]&lt;/p&gt;
&lt;p&gt;Recapping the previous episode:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It’s easy to define a system that is as powerful as any other computational system (Turing complete)&lt;/li&gt;
&lt;li&gt;It’s impossible to say what any computation does (Rice’s theorem)&lt;/li&gt;
&lt;li&gt;You can use bits (0s and 1s) to encode any sort of data — music, text or anything else.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this episode, I will have a lot more to say about bits. Before I delve into bits, though, I want to talk about computers. While abstract systems that do computations abound, most modern computers are fairly similar. The theoretical computational system they are built to resemble are so-called “&lt;a href=&quot;http://en.wikipedia.org/wiki/Von_Neumann_machine&quot;&gt;Von Neuman Machines&lt;/a&gt;“. A modern computer has lots of peripherals, but strip away the peripherals and you are left with:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A “microchip” which implements instructions like “Add Register1 and Register2 and put the Results in Register3″&lt;/li&gt;
&lt;li&gt;Memory — mapping of “addresses” (index numbers) to “values”&lt;/li&gt;
&lt;li&gt;Instructions on the microchip of the sort “Treat register 1 as an address, and fetch the value there into register 2″&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The exact instruction set that the microchip implements depends on the type, but ultimately, as we saw before, it does not matter too much — all computational systems are equivalent. What is important is “Moore’s Law”, of which many variants exist but ultimately says that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Microchips can perform more calculations per second every year.&lt;/li&gt;
&lt;li&gt;The amount of memory available for a given price keeps growing.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;An important computer peripheral, which almost all computers have a variant of, is a storage device. That ranges from a magnetic hard drive to a micro-SD card. All that is important, for our purposes, about those is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Accessing them is slower than memory&lt;/li&gt;
&lt;li&gt;They are bigger (have more addresses) than memory for the same price [a lot more -- frequently 10x or 30x]&lt;/li&gt;
&lt;li&gt;They grow bigger for the same price every year&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Another important computer peripheral is the network card. Networks connect computers to each other.&lt;/p&gt;
&lt;p&gt;Now, let’s remember something we said earlier — there is no way to reliably detect any sequence of 0s and 1s that encodes a computation that we do not like — say, a Turing machine outputting a fanfiction about Micky Mouse having sex with Pluto. Therefore, if a network card allows you to send two distinct messages [if it only allows you to send one message, it's kind of a sucky network card], you can send some “illegal” Turing machine encoding. Moreover, you will be able to store this illegal Turing machine faster and more cheaply every year.&lt;/p&gt;
&lt;p&gt;So as an inescapable conclusion of (1) The math (b) Moore’s law we see that the law cannot be enforced, and it costs less and less every year to evade this law. The laws of the universe (such as how easy it is to use Quantum Mechanics to implement computation on the stuff that is abundant on every ocean beach, or Rice’s theorem) care nothing for Walt Disney or a starving artist — they are simple there, immutable and unforgiving, and humans must learn to deal with them.&lt;/p&gt;
&lt;p&gt;One way to deal with them would be to “follow the money”: enforce the law only when someone is breaking it for corporate-level gain. This is not the way the legal system has gone through. Instead, they turned to &lt;a href=&quot;http://www.salon.com/2002/08/28/0wnz0red/&quot;&gt;God&lt;/a&gt; — “Crypto. Really good, standards-defined crypto”.&lt;/p&gt;
&lt;p&gt;So to understand what transpired, it is important to understand the basics of cryptography. From the beginning of time (as humans count time, I guess), people have communicated with each other — “Look, Ug, I found an antelope and killed it. Help me eat it?” Not long afterwards, eavesdropping begun — “Hey, everyone, Ung has an antelope.” The next level was to use codes — “Look, Ug, I found a You-know-what and you-know-what-ted it. Help me you-know-what it?”, and so the battle begun.&lt;/p&gt;
&lt;p&gt;Codes, like in the example above, have to balance two issues. The person to whom they are intended must be able to decipher them (Ung better hope Ug will get the right message). The person to whom they are &lt;em&gt;not&lt;/em&gt; intended for must not be able to decipher them (or once again, the whole village will know about the antilope). Fast-forward to Greek times, Caeasar had the eponymous cipher, based on shifting every letter in the alphabet by a certain amount and the Nazis had Enigma. Word to the wise: use neither of those, as they both have been “broken”. “Broken” is a term cryptographers use to say “the eavesdropper can read the messages which are not intended for them”. Cryptographers spend a lot of time trying to figure out how to read those…&lt;/p&gt;
&lt;p&gt;But back to the basics: In computer-based cryptography, we have a secret, S. S can be considered, like everything else a computer handles, as a certain sequence of bits. For cryptography to work, two parties have to pre-agree on S. (Side note: I will not be covering public-key cryptography here.) Then, we must be able to compute the “encryption”: a computation that takes M, a message, and calculates a function that depends on M and S. Then we must be able to compute “decryption”: a function that takes the encrypted message, E, and S, and returns to us M. Next, it should be impossible (or at least, very hard), to compute M from E without S.&lt;/p&gt;
&lt;p&gt;How do we know that something is “very hard”? Well, if we have a guess for S, we can check that the decryption gives us a plausible message. How hard is it to guess S? Returning to the quotation at the beginning of the section, “standards-based crypto” is usually at least 128 bits of S (also known as the “key size”). That means that there are 2 to the power of 128 options. It is largely agreed that the smallest time-frame relevant for computation is the time it crosses a photon (light particle) to cross a hydrogen atom. A hydrogen atom is about 10**-11 meters long. The speed of light is about 10**8 meters per second, which means it takes more than 10**-20 seconds, which is more than 2**-70 seconds. Thus, if we have 2**128 options, we need more than 2**58 seconds. 2**30 seconds is more than a year, so it will be more than 2**28 years, which is about 32 million years. I used various approximations above, but the conclusion still stands — and more and more modern crypto uses 256-bit sized keys, which is not quite the heat death of the universe, but the point still stands: you cannot guess and hope to win. However, it turns out to be an open problem whether &lt;em&gt;any&lt;/em&gt; question where you can easily verify guesses (the formal name for that is NP) is “hard” (the formal name for “easy” problems is P). By open, I mean that many computer scientists have tried tackling this problem over the last 50 years, with no success (and little progress).&lt;/p&gt;
&lt;p&gt;This means, in particular, we cannot know that any cryptographic computation is really “good”. However, what we can do, and the second part of why “really good” is followed by “standards-based”, is to ask really smart people to try and solve a cryptographic problem. If they can’t, after trying really hard, we assume that the problem cannot be solved, and we used it as our encryption mechanism.&lt;/p&gt;
&lt;p&gt;In modern times, the names “Ug” and “Ung”, perfectly good though they may be, have fallen into disuse. Modern cryptographers usually talk about “Alice” and “Bob” wanting to transmit messages, and “Eve” wanting to listen to them surreptitiously.&lt;/p&gt;
&lt;p&gt;So here is an example of a cryptographic system: if you buy a DVD in the store, it is encrypted with a special key. When you buy a DVD player in the store, is contains the key. Your DVD player is a computer, with special software that decrypts the DVD, with a special key, and then plays it. So Alice, which is the Hollywood studio, encrypted the movie contents. Then Bob, the DVD, decrypts it. Bob, to play the DVD, must have the key. You bought the DVD, so there is nothing stopping you from opening up the DVD player, and taking the key, is there?&lt;/p&gt;
&lt;p&gt;Well, there are two things. Once is simple: Hollywood, before giving the DVD maker the key, make sure that the DVD player is hard to “tamper” with. The DVD maker must put the key in a special chip, glued to the microchip, and that self-destructs if people tamper with it. As you can imagine, creative people have found ways to defeat that self-destruction. And so, Hollywood convinced the US government to pass a law called “Digital Millenium Copyright Act”. The DMCA says that&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It is illegal to tamper with the DVD that you bought and get the key out.&lt;/li&gt;
&lt;li&gt;It is illegal to tell someone the key that you dug out of the DVD.&lt;/li&gt;
&lt;li&gt;It is illegal to tell someone how to tamper with the DVD to get the key out.&lt;/li&gt;
&lt;li&gt;It is illegal to tell someone where to find instructions on how to tamper with the DVD, or how to get the key.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You might have noticed that 2-4 are restrictions on speech. There are &lt;a href=&quot;http://en.wikipedia.org/wiki/Illegal_number&quot;&gt;numbers that are so illegal&lt;/a&gt;, that not only are you not allowed to write them on a piece of paper and give them to your friend, but if someone spray-painted them on a building, you are not allowed to tell anyone where that building is. Whether you’re allowed to tell them where they can find a map with the building starred in it is, I believe, still up for debate.&lt;/p&gt;
&lt;p&gt;The incredulity continues as you find songs on You Tube and Flag images that encode illegal numbers. This means that certain songs and flags are now illegal. In fact, it very well might be that the Wikipedia page on “Illegal numbers” is already illegal, since it contains data that can allow recovery of these numbers. I wish I were kidding, but I am not.&lt;/p&gt;
&lt;p&gt;I, personally, am not a copyright extremist. I am not committed to abolish copyright. However, I think that understanding the math and physics of computation are important, because otherwise &lt;em&gt;we end up making songs illegal&lt;/em&gt;. When Hollywood claims that copyright infringement might cause jobs lost, and that this necessitates stronger copyright law, we should first ask “Will this make singing songs illegal?”&lt;/p&gt;
&lt;p&gt;This is why programmers are concerned about copyright law — because we understand all of the above. I hope, after reading this, you are also concerned!&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/moshez.wordpress.com/691/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/moshez.wordpress.com/691/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/moshez.wordpress.com/691/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/moshez.wordpress.com/691/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/moshez.wordpress.com/691/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/facebook/moshez.wordpress.com/691/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/moshez.wordpress.com/691/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/twitter/moshez.wordpress.com/691/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/moshez.wordpress.com/691/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/moshez.wordpress.com/691/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/moshez.wordpress.com/691/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/moshez.wordpress.com/691/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/moshez.wordpress.com/691/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/moshez.wordpress.com/691/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=moshez.wordpress.com&amp;amp;blog=2210753&amp;amp;post=691&amp;amp;subd=moshez&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>moshez</name>
			<uri>http://moshez.wordpress.com</uri>
		</author>
	</entry>

	<entry>
		<title>Jack Moffitt: The More Things Change: A Review of The Soul of a New Machine</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/metajack/~3/qRmZ4RpWwTg/"/>
		<id>tag:metajack.im:/2012/01/20/the-more-things-change/</id>
		<updated>2012-01-20T10:20:00+00:00</updated>
		<content type="html">&lt;p&gt;Already in my career I've experienced enormous passion, burnout,
extraordinary dedication to my team and projects, and depression. I'm
sure many others have as well. Has it always been this way with
technology? I often wonder if this rollercoaster is necessary,
healthy, or normal.&lt;/p&gt;

&lt;p&gt;I recently saw a recommendation for &lt;a href=&quot;http://www.amazon.com/Soul-New-Machine-Tracy-Kidder/dp/0316491977/?tag=metajack-20&quot;&gt;Soul of a New Machine&lt;/a&gt;,
which tells the story of a team of engineers at &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_General&quot;&gt;Data General&lt;/a&gt;
who built a new 32-bit computer in the late 1970s. The book is
fascinating. Thirty year later, many of its descriptions of the
project and the way the team worked and was treated could apply to any
modern project.&lt;/p&gt;

&lt;p&gt;The plot summary will no doubt sound familiar to you: A team of mostly
young, mostly male engineers works grueling hours to build something
amazing in too short an amount of time. They succeed, albeit a bit
over their original schedule. Despite the project's commercial
success, the team is denied both recognition and financial rewards and
many end up leaving the company. Almost all of them ultimately enjoyed
it and would (and did) do it again.&lt;/p&gt;

&lt;p&gt;There were many pieces of this story that resonated with me.&lt;/p&gt;&lt;h2&gt;Work is a Drug&lt;/h2&gt;

&lt;p&gt;On overworking &lt;a href=&quot;http://en.wikipedia.org/wiki/Tom_West&quot;&gt;Tom West&lt;/a&gt;, the manager of the team in the book,
says:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;That's the bear trap, the greatest vice. Your job. You can justify
    just about any behavior with it. Maybe that's why you do it, so you
    don't have to deal with all those other problems.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Why deal with the unpredictable world, when the controllable world of
creation is available? It's code as escapist drug, and I love to get
high on it. Mundane things like cleaning my house, and more
serious ones like taking care of my health, are all easy to avoid
while fixing bugs or starting a new project.&lt;/p&gt;

&lt;p&gt;It's both possible and important to find a balance.&lt;/p&gt;

&lt;p&gt;The team's secretary, who was much more than her title suggests,
suffered and succeeded with the rest of the team. Even she says:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;I would do it again. I would be very grateful to do it again. I
    think I would take a cut in pay to do it again.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Even as I recover from projects that burned me out, I am constantly
thinking about how to do new ones. In fact, while I'm doing any
project, I'm already thinking about doing another. This sounds like
drugs again. But they are good drugs.&lt;/p&gt;

&lt;h2&gt;Harassment and Treatment of Women&lt;/h2&gt;

&lt;p&gt;The book describes how some team members tormented the lone female
engineer. This is something that still happens today, and it's
terrible. And people then wonder why there are so few women in our
industry.&lt;/p&gt;

&lt;p&gt;In addition to that, at the end when they hand out the peer awards,
their award to the woman was for putting up with them, not for any of
her actual accomplishments.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://societyofwomenengineers.swe.org/index.php?option=com_content&amp;amp;task=view&amp;amp;id=88&amp;amp;Itemid=78&quot;&gt;Betty Shanahan&lt;/a&gt;
was that lone woman, and it looks to me that she deserved more than
just an award for thick skin. She's the CEO of the Society of Women
Engineers, and she was &quot;a member of the design team for the first
parallel processing minicomputer and manager of hardware design for
subsequent systems.&quot;  She later moved to the business side of
technology, and I wonder if that had anything to do with her having to
put up with the Eagle team's harassment.&lt;/p&gt;

&lt;h2&gt;How Something is Done is Important Too&lt;/h2&gt;

&lt;p&gt;Often we judge things by their properties, but one can also rightly
judge something by how it is made. Shoes made from child labor are
less good than those made in other ways.&lt;/p&gt;

&lt;p&gt;Kidder, the book's author, discusses this:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;In &lt;em&gt;The Nature of the Gothic&lt;/em&gt; John Ruskin decries the tendency of
    the industrial age to fragment work into tasks so trivial that they
    are fit to be performed ony by the equivalent of slave
    labor. Writing in the nineteeth century, Ruskin was one of the
    first, with Marx, to have raised this now-familiar complaint. In the
    Gothic cathedrals of Europe, Ruskin believed, you can see the
    glorious fruits of free labor given freely. What is usually meant by
    the term craftsmanship is the production of things of high quality;
    Ruskin makes the crucial point that a thing may also be judged
    according to the conditions under which it was built.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By this kind of measure, is the work many teams do good? Is the Eagle
computer that Tom West's team built really a success since the team
worked much overtime, suffered divorces and other problems, and in the
end received little to no reward? &lt;/p&gt;

&lt;p&gt;I think it's time for entrepreneurs and workers in our industry to
demand better. Our outputs will be better if they are made
sustainably, and not just by the measure above. In retrospect, maybe
the reviewers of &lt;a href=&quot;https://en.wikipedia.org/wiki/L.A._Noire&quot;&gt;LA Noire&lt;/a&gt; should have taken into the account
the &lt;a href=&quot;https://en.wikipedia.org/wiki/L.A._Noire#Staff_complaints&quot;&gt;trials&lt;/a&gt; of its developers; it certainly would not have
fared well.&lt;/p&gt;

&lt;h2&gt;Freedom of Expression&lt;/h2&gt;

&lt;p&gt;I want to hire &lt;a href=&quot;http://paulgraham.com/word.html&quot;&gt;resourceful&lt;/a&gt; people. I want to describe a
general outline of a design and not have to describe it in intricate
detail in order for them to build it.&lt;/p&gt;

&lt;p&gt;It turns out that this is critical for happiness. If we're told
exactly how to do something, it takes much of the creativity and fun
out of the work.&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;Engineers are supposed to stand among the privileged members of
    industrial enterprises, but several studies suggest that a fairly
    large percentage of engineers in America are not content with their
    jobs. Among the reasons cited are the nature of the jobs themselves
    and the restrictive way sin which they are managed. Among the terms
    used to describe their malaise are *declining technical challenge;
    misutilization; limited freedom of action; tight control of working
    conditions*.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You must trust those you work with to be resourceful. If you don't
trust them, you will end up micromanaging them into unhappiness, and
you will also remove their valuable creative input from your product.&lt;/p&gt;

&lt;p&gt;There is a balance to be struck with feedback. The Eagle engineers
thought that the managers didn't appreciate their efforts, but in
reality, some of this was them trying to stay out of the way. Kidder
asked the Tom West's boss:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;Had the Eagle project always interested him or had it grown in
    importance gradually?&lt;/p&gt;
    
    &lt;p&gt;&quot;From the start it was a very important project.&quot;&lt;/p&gt;
    
    &lt;p&gt;Was he pleased with the work of the Eclipse group?&lt;/p&gt;
    
    &lt;p&gt;&quot;Absolutely!&quot; His voice falls. &quot;They did a hell of a job.&quot;&lt;/p&gt;
    
    &lt;p&gt;But some members of the team felt that they had been rather
    neglected by the company.&lt;/p&gt;
    
    &lt;p&gt;&quot;That doesn't surprise me,&quot; he says. &quot;That's frequently the
    case. There's often a conflict in people's minds. How much direction
    do they want?&quot;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've had this same issue with investors as well. You don't want them
to meddle with your company or your product, but you also want their
advice and guidance. It's possible to go too far in either direction,
but mostly you hear about stories where investors meddle too much. I
personally think it's probably better to err on the side of too little
help than to end up with too much meddling.&lt;/p&gt;

&lt;h2&gt;The Venture Capitalists&lt;/h2&gt;

&lt;p&gt;Even thirty years ago, the VCs had a bad rap. Tom West was asked in a
&lt;a href=&quot;http://www.wired.com/wired/archive/8.12/soul.html&quot;&gt;Wired article&lt;/a&gt; years after the book's publishing why he stayed
at Data General until he retired:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;&quot;You could do new products and companies within the company, rather
    than shag some venture capitalist and kill yourself for five years.&quot;
    To be an entrepreneur, he says, &quot;you have to be interested in
    networking, even with fools.&quot;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is another reason why I would prefer to bootstrap companies if at
all possible.&lt;/p&gt;

&lt;p&gt;Tom West ended up working on many interesting projects at Data
General, but ultimately, none of them got the support or recognition
they deserved. The other members of the Eagle team spread out and
started or worked for new companies, and in general seemed much
happier.&lt;/p&gt;

&lt;h2&gt;Final Thoughts&lt;/h2&gt;

&lt;p&gt;In the end, it's both a fascinating tale of heroism and creativity and
a saddening tale of undervalued and underpaid engineers. I am both
emboldened to keep following my passions and more mindful of its
dangers. My troubles are not unique - not even modern. Thirty years
after this book was written, I feel like it could have been written
yesterday.&lt;/p&gt;
    &lt;img src=&quot;http://feeds.feedburner.com/~r/metajack/~4/qRmZ4RpWwTg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Jack Moffitt (jack@metajack.im)</name>
			<uri>http://metajack.im/</uri>
		</author>
	</entry>

	<entry>
		<title>Glyph Lefkowitz: The Concurrency Spectrum: from Callbacks to Coroutines to Craziness</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/glyph/~3/M1ABaaJrmwY/concurrency-spectrum-from-callbacks-to.html"/>
		<id>tag:blogger.com,1999:blog-8729083.post-1658981130046290535</id>
		<updated>2012-01-20T06:23:39+00:00</updated>
		<content type="html">&lt;br /&gt;
Concurrent programming idioms are on a spectrum of complexity.&lt;br /&gt;
&lt;br /&gt;
Obviously, writing code that isn't concurrent in any way is the easiest.  If you never introduce any concurrent tasks, you never have to debug any problems with things running in an unexpected order.  But, in today's connected world, concurrency of some sort is usually a requirement.  Each additional point where concurrency can happen introduces a bit of cognitive overhead, another place you need to think about what might happen, so as a codebase adds more of them it becomes more difficult to understand them all, and it becomes more challenging to understand subtle nuances of parallel execution. &lt;br /&gt;
&lt;br /&gt;
So, at the simplest end of the spectrum, you have callback-based concurrency.  Every time you have to proceed to the next step of a concurrent operation, you have to create a new function and new scope, and pass it to the operation so that the appropriate function will be called when the operation completes.  This is very explicit and reasonably straightforward to debug and test, but it can be tedious and overly verbose, especially in Python where you have to think up a new function name and argument list for every step.  The extra lines for the function definition and return statement can be an impediment to quickly understanding the code's intentions, so what facilitates understanding of the concurrency model can inhibit understanding of the code's actual logical purpose, depending on how much concurrent stuff it has to do.  Twisted's Deferreds make this a bit easier than raw callback-passing without fundamentally changing the execution dynamic, so they're at this same level.&lt;br /&gt;
&lt;br /&gt;
Then you have explicit concurrency, where every possible switch-point has to be labeled somehow.  This is yield-based coroutines, or inlineCallbacks, in Twisted.  This is more compact than using callbacks, but also more limiting.  For example, you can only resume a generator once, whereas you can run a callback multiple times.  However, for a logical flow of sequential concurrent steps, it reads very naturally, and is shorter, as it collapses out the 'def' and 'return' lines, and you have to think of at least two fewer names per step.&lt;br /&gt;
&lt;br /&gt;
However, that very ease can be misleading.  You might gloss over a 'result = yield ...' more easily than a 'def whatever(result): return result; something(whatever)'.  Nevertheless, if you have 'yield's everywhere you might swap your stack, then when you have a concurrency bug, you can look at any given arbitrary chunk of code and know that you don't need any locks in it, as long as you can't see any yield statements.  Where you do see yield statements, you know that you have some code that needs to be inspected.&lt;br /&gt;
&lt;br /&gt;
To continue down that spectrum, a cooperatively multithreading program with implicit context switches makes every line with any function call on it (or any line which might be a function call, like any operator which can be overridden by a special method) a possible, but not likely culprit.  Now when you have a concurrency bug you have to audit absolutely every line of code you've got, although you still have a few clues which will help you narrow it down and rule out certain areas of the code.  For example, you can guess that it would be pathological for 'x = []; ...; x.append(y)' to context switch. (Although, given arbitrary introspection craziness, it is still &lt;i&gt;possible&lt;/i&gt;, depending on what &quot;...&quot; is.)  This is way more lines than you have to consider with yield, although with some discipline it can be kept manageable.  However, experience has taught me that &quot;with some discipline&quot; is a code phrase for &quot;almost never, on real-life programming projects&quot;.&lt;br /&gt;
&lt;br /&gt;
All the way at the end of the spectrum of course you have preemptive multithreading, where every line of code is a mind-destroying death-trap hiding every possible concurrency peril you could imagine, and anything could happen at any time.  When you encounter a concurrency bug you have to give up and just try to drink your sorrows away.  Or just change random stuff in your 'settings.py' until it starts working, or something.  I never really did get comfortable in that style.  With some discipline, you can manage this problem by never manipulating shared state, and only transferring data via safe queueing mechanisms, but... there's that phrase again.&lt;br /&gt;
&lt;br /&gt;
Some programming languages, like Erlang, support efficient preemptive processes with state isolation and built-in super-cheap super-fast queues to transfer immutable values.  (Some other languages call these &quot;threads&quot; anyway, even though I would agree with Erlang's classification as &quot;processes&quot;.)  That's a different programming model entirely though, with its own advantages and challenges, which doesn't land neatly on this spectrum; if I'm talking about left and right here, Erlang and friends are somewhere above or below.  I'm just describing Python and its ilk, where threads give you a big pile of shared, mutable state, and you are constantly tempted to splash said state all over your program.&lt;br /&gt;
&lt;br /&gt;
Personally I like Twisted's style best; the thing that you yield is itself an object whose state can be inspected, and you can write callback-based or yield-based code as each specific context merits.  My opinion on this has shifted over time, but currently I find that it's best to have a core which is written in the super-explicit callback-based approach with no coroutines at all, and then high-level application logic which wraps that core using yield-based coroutines (@inlineCallbacks, for Twisted fans).&lt;br /&gt;
&lt;br /&gt;
I hope that in a future post, I may explain why, but that would take more words than I've got in me tonight.&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/8729083-1658981130046290535?l=glyph.twistedmatrix.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/glyph/~4/M1ABaaJrmwY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>glyph (noreply@blogger.com)</name>
			<uri>http://glyph.twistedmatrix.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Twisted Matrix Laboratories: December Sprint Report</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TwistedMatrixLaboratories/~3/KsoXHYUjzCI/december-sprint-report.html"/>
		<id>tag:blogger.com,1999:blog-1267458971896358542.post-4387751795153114036</id>
		<updated>2012-01-17T04:15:40+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://pycon.blogspot.com/2012/01/inaugural-pycon-5k-fun-run.html&quot;&gt;Twisted sprint&lt;/a&gt;? Twisted sprint! Here's the final Twisted sprint report of 2011, from our December 10th event at Smarterer in Boston.&lt;/p&gt;

&lt;br /&gt;

&lt;p&gt;&lt;b&gt;David Sturgis&lt;/b&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;was Sprint Host and Food Wrangler&lt;/li&gt;
&lt;li&gt;discussed miscellaneous &lt;tt&gt;twisted.web&lt;/tt&gt; feature&lt;/li&gt;
&lt;/ul&gt;

&lt;br /&gt;

&lt;p&gt;&lt;b&gt;JP Calderone&lt;/b&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;investigated 64 bit Windows 7 IPv6 problems&lt;/li&gt;
&lt;li&gt;finished &lt;a href=&quot;http://twistedmatrix.com/trac/ticket/5383&quot;&gt;#5383&lt;/a&gt;: Provide a library for simple valued named constants&lt;/li&gt;
&lt;li&gt;finished &lt;a href=&quot;http://twistedmatrix.com/trac/ticket/5084&quot;&gt;#5084&lt;/a&gt;: Accept IPv6 address literals (with embedded scope ids) in &lt;tt&gt;IReactorTCP.listenTCP&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;reviewed &lt;a href=&quot;http://twistedmatrix.com/trac/ticket/3420&quot;&gt;#3420&lt;/a&gt;: &lt;tt&gt;twisted.web.client&lt;/tt&gt; persistent connections&lt;/li&gt;
&lt;li&gt;reviewed &lt;a href=&quot;http://twistedmatrix.com/trac/ticket/1902&quot;&gt;#1902&lt;/a&gt;: compatibility work-around for commercial SSH 2.0.12 misbehaviours&lt;/li&gt;
&lt;li&gt;reviewed &lt;a href=&quot;http://twistedmatrix.com/trac/ticket/5400&quot;&gt;#5400&lt;/a&gt;: Change UDP port to have an explicit state machine, and no &lt;tt&gt;FileDescriptor&lt;/tt&gt; dependency&lt;/li&gt;
&lt;li&gt;reviewed &lt;a href=&quot;http://twistedmatrix.com/trac/ticket/3648&quot;&gt;#3648&lt;/a&gt;: &lt;tt&gt;twisted.cred.credentials.UsernameHashedPassword&lt;/tt&gt; doesn't hash password strings when &lt;tt&gt;checkPassword&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was the last sprint for JP as a Bostonian. We will miss you!&lt;/p&gt;

&lt;br /&gt;

&lt;p&gt;&lt;b&gt;Itamar&lt;/b&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;worked on &lt;a href=&quot;http://twistedmatrix.com/trac/ticket/5427&quot;&gt;#5427&lt;/a&gt;: Improve core documentation index page&lt;/li&gt;
&lt;li&gt;reviewed &lt;a href=&quot;http://twistedmatrix.com/trac/ticket/5383&quot;&gt;#5383&lt;/a&gt;: Provide a library for simple valued named constants&lt;/li&gt;
&lt;/ul&gt;

&lt;br /&gt;

&lt;p&gt;&lt;b&gt;Alex Levy&lt;/b&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;made headway on several website and documentation improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;br /&gt;

&lt;p&gt;&lt;b&gt;Glyph&lt;/b&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;discussed and then worked on &lt;a href=&quot;http://twistedmatrix.com/trac/ticket/1956&quot;&gt;#1956&lt;/a&gt;: Make a less sucky producer/consumer API&lt;/li&gt;
&lt;/ul&gt;

&lt;br /&gt;

&lt;p&gt;&lt;b&gt;I (Jessica McKellar)&lt;/b&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;reviewed &lt;a href=&quot;http://twistedmatrix.com/trac/ticket/5427&quot;&gt;#5427&lt;/a&gt;: Improve core documentation index page&lt;/li&gt;
&lt;li&gt;reviewed &lt;a href=&quot;http://twistedmatrix.com/trac/ticket/5429&quot;&gt;#5429&lt;/a&gt;: Documentation index&lt;/li&gt;
&lt;li&gt;reviewed &lt;a href=&quot;http://twistedmatrix.com/trac/ticket/5422&quot;&gt;#5422&lt;/a&gt;: &lt;tt&gt;pbgtk2.py&lt;/tt&gt; example is excessively complex&lt;/li&gt;
&lt;/ul&gt;

&lt;br /&gt;

&lt;p&gt;Thank you David for organizing this, and &lt;a href=&quot;http://smarterer.com/&quot;&gt;Smarterer&lt;/a&gt; for hosting.&lt;/p&gt;

&lt;p&gt;Thank you to everyone who &lt;a href=&quot;http://twistedmatrix.com/highscores/?time=2011-12-01&quot;&gt;closed out 2011&lt;/a&gt; with contributions to Twisted!&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1267458971896358542-4387751795153114036?l=labs.twistedmatrix.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/TwistedMatrixLaboratories/~4/KsoXHYUjzCI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Jessica McKellar (noreply@blogger.com)</name>
			<uri>http://labs.twistedmatrix.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Jack Moffitt: The Potentially Dark Future of Search</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/metajack/~3/qTC-aH8q6Z8/"/>
		<id>tag:metajack.im:/2012/01/12/the-potentially-dark-future-of-search/</id>
		<updated>2012-01-12T10:12:00+00:00</updated>
		<content type="html">&lt;p&gt;Twitter sees Google's latest Google+ feature, integration into Google
search, as anti-competitive, and it probably is. However, it brings to
the surface some real issues with the future of search and of data.&lt;/p&gt;

&lt;p&gt;Twitter's argument:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;We're concerned that as a result of Google's changes, finding this
    information will be much harder for everyone. We think that's bad
    for people, publishers, news organizations and Twitter users.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;https://plus.google.com/u/0/116899029375914044550/posts/24uqWqvALud&quot;&gt;Google's response&lt;/a&gt;
was:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;We are a bit surprised by Twitter's comments about Search plus Your
    World, because they chose not to renew their agreement with us last
    summer (&lt;a href=&quot;http://goo.gl/chKwi&quot;&gt;http://goo.gl/chKwi&lt;/a&gt;), and since then
    we have observed their rel=nofollow instructions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;People have been digging into the semantics of nofollow (see
&lt;a href=&quot;http://marketingland.com/schmidt-google-not-favored-happy-to-talk-twitter-facebook-integration-3151&quot;&gt;Danny Sullivan&lt;/a&gt; and
&lt;a href=&quot;http://luigimontanez.com/2012/how-rel-nofollow-works/&quot;&gt;Luigi Montanez&lt;/a&gt;),
but there is a much bigger issue.&lt;/p&gt;

&lt;p&gt;Google and other established and up-and-coming search engines have no
real way to include lots of data in their index. It's easy to imagine
that the lack of access to Twitter and Facebook data was a motivator
for Google+ in the first place.&lt;/p&gt;

&lt;p&gt;Lots of sites now generate enough data that it is unrealistic to crawl
them. For example, Youtube has more new content every day than they
allow anyone to crawl. Twitter is essentially the same. This means
there is no way to index this data without special arrangements with
the provider. Twitter has closely guarded their firehose of data, but
at least they have some mechanism to obtain it. Youtube, as far as I
am aware, has no such mechanism.&lt;/p&gt;

&lt;p&gt;My team and I ran into this problem head on trying to build Collecta,
a real-time search engine. Access to the data was a primary blocker
for many features and product ideas, and over the too short life of
that company, access became significantly more difficult, not easier.&lt;/p&gt;

&lt;p&gt;Google can build an effective search, even a real-time one, for
Youtube, but no one else can. Twitter can build search for their data,
but few others can, and their data access policies can and do change
on a whim.&lt;/p&gt;

&lt;p&gt;If Google believes that microblogging data will improve their search
product, then a reasonable strategy to obtain that data is to try and
build their own microblogging service to generate it. I can't fault
Google for trying. If I thought Collecta could have effectively
competed against Twitter for their audience, I would certainly have
attempted that as well.&lt;/p&gt;

&lt;p&gt;Google, Twitter, Facebook and others are hoarding silos of otherwise
public data. Not only is this artificially limiting the features of
their products, but it squashes the potential for new and exciting
search applications. The search services that have sprung up are
limited to your own data, aggregate results from service-specific
search APIs, exist at the mercy of data providers, or make do with a
tiny subset of the data. I don't think Google could have built their
own search engine if the Web were similarly hostile.&lt;/p&gt;

&lt;p&gt;One could argue for requiring these bits of data to be openly
available, but unlike the data of the past, this data is expensive to
publish and consume. Most of these services may not even have a
mechanism to publish the data, even internally. Simply receiving the
Youtube or Twitter firehoses (and not counting video or image media)
would require significant engineering effort, and the rate of data
generation is only accelerating.&lt;/p&gt;

&lt;p&gt;I think we must push for open access to data, even if it is
costly. These data wars benefit very few. If things don't change, the
future of search is dark.&lt;/p&gt;
    &lt;img src=&quot;http://feeds.feedburner.com/~r/metajack/~4/qTC-aH8q6Z8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Jack Moffitt (jack@metajack.im)</name>
			<uri>http://metajack.im/</uri>
		</author>
	</entry>

	<entry>
		<title>Jp Calderone: Learn About Twisted at PyCon 2012</title>
		<link rel="alternate" type="text/html" href="http://as.ynchrono.us/2012/01/learn-about-twisted-at-pycon-2012.html"/>
		<id>tag:blogger.com,1999:blog-4350363846291077818.post-5866982212141658827</id>
		<updated>2012-01-10T18:21:50+00:00</updated>
		<content type="html">&lt;p&gt;At PyCon this year I'll be presenting a tutorial to introduce Python programmers to Twisted.  This tutorial has two goals.  First, to give attendees a firm grasp of Twisted's concurrency model, both in the abstract and the concrete.  Second, to remove the mystery around the tools Twisted provides for developing robust, testable concurrent applications.  If you attend, you'll come away with an understanding of how event loops work and how to write code that works best in Twisted's event loop.&lt;/p&gt;&lt;p&gt;I am a long time core Twisted developer with real world experience building maintainable, scalable systems with Twisted.  I've also presented similar introductory Twisted tutorials several times in the past, letting me learn the common sticking points and teaching approaches to help overcome them.&lt;/p&gt;&lt;p&gt;Check out &lt;a href=&quot;https://us.pycon.org/2012/schedule/presentation/362/&quot;&gt;the tutorial's page on the PyCon 2012 website&lt;/a&gt; for details about what will be covered.  Come learn how to leverage Twisted and Twisted-based libraries to their fullest extent!&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/4350363846291077818-5866982212141658827?l=as.ynchrono.us&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Jean-Paul Calderone (noreply@blogger.com)</name>
			<uri>http://as.ynchrono.us/</uri>
		</author>
	</entry>

	<entry>
		<title>Moshe Zadka: Retroactive New Year’s Resolutions</title>
		<link rel="alternate" type="text/html" href="http://moshez.wordpress.com/2012/01/05/retroactive-new-years-resolutions-2/"/>
		<id>https://moshez.wordpress.com/?p=685</id>
		<updated>2012-01-05T10:17:04+00:00</updated>
		<content type="html">&lt;p&gt;As is my tradition, I will be posting my New Year’s resolutions from last year, retroactively decided:&lt;/p&gt;
&lt;p&gt;Get into a serious relationship&lt;/p&gt;
&lt;p&gt;Get engaged&lt;/p&gt;
&lt;p&gt;Move to a team at work where I fit in better&lt;/p&gt;
&lt;p&gt;Move to a nicer apartment&lt;/p&gt;
&lt;p&gt;Get a loan (to build up my credit history)&lt;/p&gt;
&lt;p&gt;Go to a Less Wrong meet-up&lt;/p&gt;
&lt;p&gt;Get a talk accepted at PyCon&lt;/p&gt;
&lt;p&gt;Get more recommendations on my Linked In profile&lt;/p&gt;
&lt;p&gt;Write Rationalist Fan Fiction&lt;/p&gt;
&lt;p&gt;Contact my Congressperson&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/moshez.wordpress.com/685/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/moshez.wordpress.com/685/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/moshez.wordpress.com/685/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/moshez.wordpress.com/685/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/moshez.wordpress.com/685/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/facebook/moshez.wordpress.com/685/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/moshez.wordpress.com/685/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/twitter/moshez.wordpress.com/685/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/moshez.wordpress.com/685/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/moshez.wordpress.com/685/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/moshez.wordpress.com/685/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/moshez.wordpress.com/685/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/moshez.wordpress.com/685/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/moshez.wordpress.com/685/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=moshez.wordpress.com&amp;amp;blog=2210753&amp;amp;post=685&amp;amp;subd=moshez&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>moshez</name>
			<uri>http://moshez.wordpress.com</uri>
		</author>
	</entry>

	<entry>
		<title>Thomas Vander Stichele: How do you manage mailing lists?</title>
		<link rel="alternate" type="text/html" href="http://thomas.apestaart.org/log/?p=1427"/>
		<id>http://thomas.apestaart.org/log/?p=1427</id>
		<updated>2012-01-02T16:00:57+00:00</updated>
		<content type="html">&lt;p&gt;Every new year is a time of cleaning.  After getting back to Inbox 0, my next target is my mailing list subscriptions.&lt;/p&gt;
&lt;p&gt;It must be something psychological, but I cannot bring myself to unsubscribe from some of these mailing lists.  I don’t check on them daily, but once in a while it’s darn useful to search through my local copy of mails on, say, selinux, and find solutions for a problem I’m having.&lt;/p&gt;
&lt;p&gt;However, all this mailing list mail brings me a lot of headache.  My email client is slow, and I would want it to be fast for the real mail I’m getting (from actual people, needing actual work).  It’s hard to track the mails that matter – all my list mail gets put into folders automatically with some procmail magic, but it also means that some of the things I should be paying more attention to are just another bold folder in Evolution somewhere down the mail tree.  And lastly, the server where I host my mail shared with friends gets too much traffic, and syncing 3 different evolutions over IMAP with it is a big part of the burden.&lt;/p&gt;
&lt;p&gt;I vastly prefered the newsreader model of old, and I think the de facto standard of mailing lists really is a mistake.  But I’m not sure what to replace it with.&lt;/p&gt;
&lt;p&gt;What I want:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;have selected mailing list archives be available on my machines, locally&lt;/li&gt;
&lt;li&gt;have them synced/updated automatically&lt;/li&gt;
&lt;li&gt;have them out of the way of my normal mail usage unless when I need them&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I’ve been considering &lt;a href=&quot;http://www.google.es/url?sa=t&amp;amp;rct=j&amp;amp;q=how%20to%20manage%20mailing%20list%20subscriptions&amp;amp;source=web&amp;amp;cd=3&amp;amp;ved=0CD4QFjAC&amp;amp;url=http%3A%2F%2Fshane.willowrise.com%2Farchives%2Fhow-i-manage-mailing-list-subscriptions%2F&amp;amp;ei=mdQBT7atEofn-gakwcnXAQ&amp;amp;usg=AFQjCNH0oI1xkf8nuYslm8Dczzh6Mmca9A&amp;amp;cad=rja&quot;&gt;getting a separate email account&lt;/a&gt; just for email lists for this purpose, although I don’t look forward much to having to change all my subscriptions, and would first like to hear from other people how this approach works out for them.&lt;/p&gt;
&lt;p&gt;There used to be a push towards web-based mailing list subscriptions, but I don’t know if anyone is really seriously using that, and I would like to have the option of reading these mailing list archives offline.&lt;/p&gt;
&lt;p&gt;How do you separate your ‘real’ mail from your mailing list mail? How do you handle them?&lt;/p&gt;</content>
		<author>
			<name>Thomas</name>
			<uri>http://thomas.apestaart.org/log</uri>
		</author>
	</entry>

	<entry>
		<title>Thomas Vander Stichele: using xargs on a list of paths with spaces in a file</title>
		<link rel="alternate" type="text/html" href="http://thomas.apestaart.org/log/?p=1424"/>
		<id>http://thomas.apestaart.org/log/?p=1424</id>
		<updated>2011-12-30T18:18:45+00:00</updated>
		<content type="html">&lt;p&gt;Every few weeks I have to spend an hour figuring out exactly the same non-googleable thing I’ve already needed to figure out.  So this time it’s going on my blog.&lt;/p&gt;
&lt;p&gt;The problem is simple: given an input file listing paths, one per line, which probably contain spaces – how do I run a shell command that converts each line to a single shell argument ?&lt;/p&gt;
&lt;p&gt;Today, my particular case was a file /tmp/dirs on my NAS which lists all directories in one of my dirvish vaults that contains files bigger than a GB.  For some reason not everything is properly hardlinked, but running hardlink on the vault blows up because there are so many files in there.&lt;/p&gt;
&lt;p&gt;Let’s see if wordpress manages to not mangle the following shell line.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;perl  -p -e 's@\n@\000@g' /tmp/dirs | xargs -0 /root/hardlink.py  -f -p -t -c --dry-run&lt;/code&gt;&lt;/p&gt;</content>
		<author>
			<name>Thomas</name>
			<uri>http://thomas.apestaart.org/log</uri>
		</author>
	</entry>

	<entry>
		<title>Thomas Vander Stichele: N900 life support</title>
		<link rel="alternate" type="text/html" href="http://thomas.apestaart.org/log/?p=1420"/>
		<id>http://thomas.apestaart.org/log/?p=1420</id>
		<updated>2011-12-29T09:35:44+00:00</updated>
		<content type="html">&lt;p&gt;I don’t want to simply be complaining about Nokia’s sad Linux story ending.&lt;/p&gt;
&lt;p&gt;It’s obvious that things aren’t going to get better though for Maemo device owners.&lt;/p&gt;
&lt;p&gt;Here are two things that caused me trouble over the last few months, and the fix that did it for me, in case you were suffering from the same problems.&lt;/p&gt;
&lt;ul&gt;
&lt;ol&gt;
The Facebook photo sharing functionality just stopped working for me.  It would upload the file, then give me an error without specifying any reason.  I had simply assumed the Facebook API had changed, and since afaik this plugin is sadly closed-source (what on earth possessed Nokia to make a social media sharing component closed to begin with is beyond me – what kind of IP secrets could you possibly have in there?) I thought I would have to do without for now.  And it really is a hassle to manually copy photos off then share them from the desktop.&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Turns out that I simply had to re-authenticate the Sharing Account in Settings.  No idea why – maybe Facebook changed some authentication system in the last few months ? Now it works again.&lt;/p&gt;
&lt;p&gt;(As a side note, this plugin’s behaviour is really annoying when it comes to uploading photos.  It will always try to upload as soon as you connect to a network, although usually all you get is access to some web page on which you have to authenticate, usually by paying, to get on to the net.  The sharing plugin already blasts photos at facebook, then fails, gives you a non-useful error message, and then sits there forever without any option to retry.  All you can do is cancel the transfer, in which case you will have to re-upload the photos from your library.  After some time I figured out that a reboot caused it to retry all pending uploads on the next network connect, and then after that I figured out a kill of a sharing manager process did the same thing.  But really, Nokia engineers – a simple ‘retry’ button was too hard ?)&lt;/p&gt;
&lt;/ol&gt;
&lt;ol&gt;
For the last two weeks my GPS stopped getting a lock completely.  This wreaked havoc on my barriosquare/foursquare checkins as well, which simply don’t register without a GPS lock (yes I still have a half-done port of bsq to the new foursquare API, but last time I tried I was still stuck on the simply terrible browser coming with the device that seems to be unable to properly complete SSL requests in emulator mode).&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I stumbled across &lt;a href=&quot;http://troshlyak.wordpress.com/2011/10/27/fixing-n900-gps-locking/&quot;&gt;this page&lt;/a&gt; and simply changed the AGPS server to google’s.  Worked like a charm on the next connect.  Nokia, I don’t know what you did to your AGPS server – surely other phones you have are using it too, not just the Maemo ones ?&lt;/p&gt;
&lt;p&gt;I swore I wasn’t going to buy an N9 because there’s no point in buying an EOL’d phone if I plan to develop for it.  The reviews when it actually came out almost persuaded me to get it, and the five minutes I got to play with Luis de Bethencourt’s phone got me really close.  I’ve even seen plans in Belgium offering this phone! But really, there isn’t much point if Nokia isn’t going to support this phone any more and services are just going to get worse, and important parts of the stack remain closed and thus unfixable down the road.&lt;/p&gt;
&lt;p&gt;This month’s Android course at work at least got me familiar developing for the phone and I was actually impressed by Eclipse this time around, and while Java still seems like a bitch to program in, the whole emulator setup is easy to use… Who knows, my next phone may in fact be an Android.&lt;/p&gt;
&lt;p&gt;In the meantime, it’s nice to see that &lt;a href=&quot;http://www.lefred.be/?q=node/148&quot;&gt;some of my fixes go noticed&lt;/a&gt;.  That motivates me to possibly fix that other annoyance in erminig-ng – all-day events triggering an alarm at midnight and waking me up :)&lt;/p&gt;&lt;/ol&gt;&lt;/ul&gt;</content>
		<author>
			<name>Thomas</name>
			<uri>http://thomas.apestaart.org/log</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: What are my projects?</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2011/12/what-are-my-projects.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-8212227942183096608</id>
		<updated>2011-12-26T04:54:40+00:00</updated>
		<content type="html">Launchpad doesn't really have any good mechanism for letting you review a list of &quot;your&quot; projects.&lt;br /&gt;&lt;br /&gt;That's partly because there are a lot of different ways that it &lt;i&gt;could&lt;/i&gt; do it. You could be the maintainer of a project, or its driver, or its bug supervisor, or you might have commit access to its trunk branch. All of this could be direct, or through membership of a team. It's tough.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Since it's that time of year when I review my projects, responsibilities, goals and the like and start to figure out what I want to do next year, I want to figure out what are my projects on Launchpad.&lt;br /&gt;&lt;br /&gt;Luckily, Launchpad has an API. I can't use it to figure out what projects I'm the maintainer of, but I can use it to figure out &lt;a href=&quot;http://paste.ubuntu.com/783038/&quot;&gt;what trunk branches I have commit access to&lt;/a&gt;.  The link has the Python code for the script.&lt;br /&gt;&lt;br /&gt;Really, Launchpad should allow me to curate my own list of projects, with input to that list coming from all of the sources mentioned above, as well as arbitrarily selecting projects.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-8212227942183096608?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jp Calderone: May - December Reading List</title>
		<link rel="alternate" type="text/html" href="http://as.ynchrono.us/2011/12/may-december-reading-list.html"/>
		<id>tag:blogger.com,1999:blog-4350363846291077818.post-6560490992446074685</id>
		<updated>2011-12-22T21:03:03+00:00</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt; &lt;a href=&quot;http://www.amazon.com/gp/product/1407642111/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1407642111&quot;&gt;The History of the Peloponnesian War&lt;/a&gt;.   Thucydides.  (Books 2 - 8)&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.amazon.com/gp/product/0882667033/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0882667033&quot;&gt;Root Cellaring: Natural Cold Storage of Fruits &amp;amp; Vegetables&lt;/a&gt;.   Mike and Nancy Bubel.&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.amazon.com/gp/product/0394753666/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0394753666&quot;&gt;The Fatal Shore: The Epic of Australia's Founding&lt;/a&gt;.   Robert Hughes.&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.amazon.com/gp/product/067003777X/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=067003777X&quot;&gt;Special Topics in Calamity Physics&lt;/a&gt;.   Marisha Pessl.&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.amazon.com/gp/product/1416551611/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1416551611&quot;&gt;The Dirty Life: A Memoir of Farming, Food, and Love&lt;/a&gt;.   Kristin Kimball.&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.amazon.com/gp/product/B001TODNZ0/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B001TODNZ0&quot;&gt;The Worst Hard Time: The Untold Story of Those Who Survived the Great American Dust Bowl&lt;/a&gt;.   Timothy Egan.&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.amazon.com/gp/product/0312875622/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0312875622&quot;&gt;The Children of the Sky (Zones of Thought)&lt;/a&gt;.   Vernor Vinge.&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.amazon.com/gp/product/0765341530/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0765341530&quot;&gt;The Gathering Storm (Wheel of Time)&lt;/a&gt;.  Robert Jordan and Brandon Sanderson.&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.amazon.com/gp/product/B004W0D3F8/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B004W0D3F8&quot;&gt;Oresteia: Agamemnon, The Libation Bearers, and The Eumenides&lt;/a&gt;.   Eschylus.&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.amazon.com/gp/product/0765364875/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0765364875&quot;&gt;Towers of Midnight (The Wheel of Time)&lt;/a&gt;.  Robert Jordan and Brandon Sanderson.&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.amazon.com/gp/product/1463726066/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1463726066&quot;&gt;The Clouds&lt;/a&gt;.   Aristophanes.&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.amazon.com/gp/product/B001QXC48Q/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B001QXC48Q&quot;&gt;Saturn's Children&lt;/a&gt;.   Charles Stross.&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.amazon.com/gp/product/B004KAB3M0/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B004KAB3M0&quot;&gt;The Fuller Memorandum (A Laundry Files Novel)&lt;/a&gt;.   Charles Stross.&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.amazon.com/gp/product/1886778957/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1886778957&quot;&gt;Scratch Monkey&lt;/a&gt;.   Charles Stross.&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/4350363846291077818-6560490992446074685?l=as.ynchrono.us&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Jean-Paul Calderone (noreply@blogger.com)</name>
			<uri>http://as.ynchrono.us/</uri>
		</author>
	</entry>

	<entry>
		<title>Jp Calderone: August - April Reading List</title>
		<link rel="alternate" type="text/html" href="http://as.ynchrono.us/2011/04/august-april-reading-list.html"/>
		<id>tag:blogger.com,1999:blog-4350363846291077818.post-1967315490113949317</id>
		<updated>2011-12-22T20:43:46+00:00</updated>
		<content type="html">&lt;div&gt;&lt;div&gt;Been a while since I let you all know what I've been reading:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0984550518/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0984550518&quot;&gt;Containment&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;Christian Cantrell.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B0037CEUAE/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B0037CEUAE&quot;&gt;Human Legacy Project&lt;/a&gt;. &lt;span style=&quot;border-collapse: collapse; line-height: 18px;&quot;&gt;Christian Cantrell.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0802142494/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0802142494&quot;&gt;The Long Emergency&lt;/a&gt;. &lt;span style=&quot;border-collapse: collapse; line-height: 18px;&quot;&gt;James Howard Kunstler.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0812534182/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0812534182&quot;&gt;Sethra Lavode&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;Steven Brust.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B003SNJVH4/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B003SNJVH4&quot;&gt;Star Soldier&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;Vaughn Heppner.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B003T0H93E/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B003T0H93E&quot;&gt;BIO-WEAPON&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;Vaughn Heppner.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0765341549/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0765341549&quot;&gt;Dzur&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;Steven Brust.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B0034KZ1DY/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B0034KZ1DY&quot;&gt;Fragile and Distant Suns: A Poul Anderson Collection&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;Poul Anderson.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B002RAR25C/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B002RAR25C&quot;&gt;Dreaming in Code: Two Dozen Programmers, Three Years, 4,732 Bugs, and One &lt;span style=&quot;line-height: 15px;&quot;&gt;Quest for Transcendent Software&lt;/span&gt;&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;Scott Rosenberg.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0553591363/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0553591363&quot;&gt;Spell Games&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;T. A. Pratt.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0553589989/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0553589989&quot;&gt;Blood Engines&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;T. A. Pratt.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0553589997/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0553589997&quot;&gt;Poison Sleep&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;T. A. Pratt.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0553591355/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0553591355&quot;&gt;Dead Reign&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;T. A. Pratt.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B002XDR28A/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B002XDR28A&quot;&gt;Bone Shop&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;T. A. Pratt.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B004IK9ECI/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B004IK9ECI&quot;&gt;Makers&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;Cory Doctorow.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0307276864/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0307276864&quot;&gt;Microcosm: E. coli and the New Science of Life&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;Carl Zimmer.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0452287863/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0452287863&quot;&gt;The Theory of Almost Everything&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;Robert Oerter.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/145379087X/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=145379087X&quot;&gt;Broken Mirrors&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;T. A. Pratt.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/1886778272/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1886778272&quot;&gt;The Warrior's Apprentice&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;Lois McMaster Bujold&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B004O4C13W/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B004O4C13W&quot;&gt;The Mountains of Mourning&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;Lois McMaster Bujold&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B001C0JBU2/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B001C0JBU2&quot;&gt;The history of Herodotus&lt;/a&gt;.  Herodotus. (except books 2 and 3)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0393316041/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0393316041&quot;&gt;Surely You're Joking, Mister Feynman!&lt;/a&gt;  &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;Richard P. Feynman.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0756405890/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0756405890&quot;&gt;The Name of the Wind&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;Patrick Rothfuss.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0756404738/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0756404738&quot;&gt;The Wise Man's Fear&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;Patrick Rothfuss.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B003XRERS8/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B003XRERS8&quot;&gt;Reluctant Swordsman&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;Dave Duncan.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B0037Z70MQ/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B0037Z70MQ&quot;&gt;The Golden Age of Science Fiction&lt;/a&gt;. Various&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;line-height: 15px; font-family: arial, helvetica, sans-serif;&quot;&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0684827905/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=jpcalsjou-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0684827905&quot;&gt;History of the Peloponnesian War&lt;/a&gt;. &lt;/span&gt;&lt;span style=&quot;border-collapse: collapse; font-size: 13px; line-height: 18px; font-family: arial, helvetica, sans-serif;&quot;&gt;Thucydides. (Book 1)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/4350363846291077818-1967315490113949317?l=as.ynchrono.us&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Jean-Paul Calderone (noreply@blogger.com)</name>
			<uri>http://as.ynchrono.us/</uri>
		</author>
	</entry>

	<entry>
		<title>Thomas Vander Stichele: ssh friction</title>
		<link rel="alternate" type="text/html" href="http://thomas.apestaart.org/log/?p=1417"/>
		<id>http://thomas.apestaart.org/log/?p=1417</id>
		<updated>2011-12-22T11:57:21+00:00</updated>
		<content type="html">&lt;p&gt;I haven’t been too good this year at removing friction from my workflow.  Today I wanted to change that.  And the random friction thrown my way today has to do with ssh.&lt;/p&gt;
&lt;p&gt;You see, somewhere along the line I read that it is a good idea to create separate keys for separate identities.  So I have an identity for all work-related stuff (which I consider ‘ring 1′: it’s unlikely to change but everyone can get fired or change jobs), one for personal stuff on machines I actually control (‘ring 0′: they’d have to pry it out of my dead hands), another for my ‘public online default’ identity (‘ring 2′: I can always pull a whytheluckystiff and pull myself of the net and reinvent myself), and then per-project identities (‘ring 3′: I may lose interest in being a fedora or gstreamer contributor without massive changes in my personality).&lt;/p&gt;
&lt;p&gt;I started splitting ring 3 per project when it made sense – for example, Fedora recently enforced a key change even if your account wasn’t compromised and even if you already have a strong passphrase on your key (like I had), and of course a massive flamefest ensued.  I shrugged and decided to split off a new key and set that on all my machines.&lt;/p&gt;
&lt;p&gt;But the problem is, this whole tower of ssh doesn’t really work well in practice.  I chose a long passphrase for the new fedora keys, but obviously I do not want to type that every time I clone a package or commit changes.  So I use ssh-agent.  In theory, ssh-agent adds your keys and asks you for the passphrase once, and is then able to offer those identities to the other side.&lt;/p&gt;
&lt;p&gt;The problem is a lot of ssh servers out there only give you a few tries.  So your ssh agent will offer identity by identity until it gets refused.  If my fedora identity was added as the fourth identity I lose – I can’t clone a package.&lt;/p&gt;
&lt;p&gt;Specifying IdentityFile in the ssh config is useless.  It is poorly documented, but &lt;a href=&quot;http://sealedabstract.com/code/github-ssh-with-multiple-identities-the-slightly-more-definitive-guide/&quot;&gt;IdentityFile files actually come after your ssh-agent identities&lt;/a&gt;.  So your agent blasts all the wrong keys at the host first, and you get denied.&lt;/p&gt;
&lt;p&gt;So you can specify IdentityOnly to make sure that only the identity file you want is being used. Sadly in that case it will not use the ssh-agent at all, so it will ask you for the password to your key file – the whole reason you want agents to be used in the first place.&lt;/p&gt;
&lt;p&gt;Now obviously ssh has all the pieces it needs to Do The Right Thing.  If my config says to use this identity and this identity only, ssh should be able to request ssh-agent to present that identity, and that identity only, and make the login happen without any password.&lt;/p&gt;
&lt;p&gt;Surely I must be missing something obvious.  Surely one of you uberhackers out there has set up the same thing as me.  Why don’t you comment about it here and help the rest of us?&lt;/p&gt;</content>
		<author>
			<name>Thomas</name>
			<uri>http://thomas.apestaart.org/log</uri>
		</author>
	</entry>

	<entry>
		<title>Stephen Thorne: Explaining For/Else In Python</title>
		<link rel="alternate" type="text/html" href="http://shiny.thorne.id.au/2011/12/explaining-forelse-in-python.html"/>
		<id>tag:blogger.com,1999:blog-21652080.post-568562507911649586</id>
		<updated>2011-12-19T14:06:27+00:00</updated>
		<content type="html">&lt;div class=&quot;posterous_autopost&quot;&gt;&lt;p&gt;In response to a &lt;a href=&quot;https://plus.google.com/u/0/104537541227697934010/posts/egY2pp8Febs&quot;&gt;thread on G+&lt;/a&gt; I've decided to write a this article on 'how for/else works'.&lt;/p&gt;  &lt;p&gt;I should start by saying that this isn't intuitive or simple. It's quite complicated, but it has a very clear use case. Let me start by stating as simply as I can the use-case.&lt;/p&gt;  &lt;div class=&quot;CodeRay&quot;&gt; &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;for element in seq:&lt;br /&gt;    if somecondition(element):&lt;br /&gt;         dosomething(element) &lt;br /&gt;         break&lt;br /&gt;else: &lt;br /&gt;     dosomething(defaultinput)&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt;   &lt;p&gt;I think that example is reasonably clear, but it's important to explain what's happening here.&lt;/p&gt;  &lt;p&gt;If a 'for' loop does not break, it's else is run, otherwise the else is not run. So:&lt;/p&gt;  &lt;ul&gt;  &lt;li&gt;The else suite is run if:  &lt;ul&gt;  &lt;li&gt;the sequence is empty&lt;/li&gt;  &lt;li&gt;break is never executed&lt;/li&gt;  &lt;/ul&gt;  &lt;/li&gt;  &lt;li&gt;The else suite is bypassed if:  &lt;ul&gt;  &lt;li&gt;break is executed&lt;/li&gt;  &lt;li&gt;a return statement in the loop is executed&lt;/li&gt;  &lt;li&gt;an exception raises in the for loop&lt;/li&gt;  &lt;/ul&gt;  &lt;/li&gt;  &lt;/ul&gt;  &lt;p&gt;I hope that's clear. Any comments or addendums or errors I've made, please let me know in the comments.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt; I don't think using an 'else:' on a for loop is a bad idea. But I think it should only be used in exactly the idiom presented in the example, anything with more complicated flow control or more than 8 lines should be re-factored to use a function call with 'return' in the appropriate places.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/21652080-568562507911649586?l=shiny.thorne.id.au&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Stephen Jerub Thorne (noreply@blogger.com)</name>
			<uri>http://shiny.thorne.id.au/</uri>
		</author>
	</entry>

	<entry>
		<title>Glyph Lefkowitz: I'm Sorry It's Come To This</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/glyph/~3/OQAKL9kOYMI/im-sorry-its-come-to-this.html"/>
		<id>tag:blogger.com,1999:blog-8729083.post-3423291996900484779</id>
		<updated>2011-12-15T10:20:01+00:00</updated>
		<content type="html">&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;If you want to be a great leader,&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;you must learn to follow the Tao.&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;Stop trying to control.&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;Let go of fixed plans and concepts,&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;and the world will govern itself.&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;i&gt;- &lt;a href=&quot;http://academic.brooklyn.cuny.edu/core9/phalsall/texts/taote-v3.html&quot;&gt;Tao Te Ching ch. 59,&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;i&gt;&lt;a href=&quot;http://academic.brooklyn.cuny.edu/core9/phalsall/texts/taote-v3.html&quot;&gt;as translated by S. Mitchell&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
I usually try not to get too political in my public persona – on blogs, twitter, IRC, mailing lists et cetera – and that's a conscious choice.&lt;br /&gt;
&lt;br /&gt;
I work on open source software.  I have for the last ten years.  I am lucky enough to have founded a project of my own, but in open source, leaders are more beholden to their followers than vice versa.  I depend on people showing up to effectively work for me, for free, on a regular basis.  So, I try to avoid politics not because I don't have strong convictions (anyone who knows me personally can tell you that I certainly do) but because I don't want someone to avoid showing up and helping do some good in the world in one area, just because we might disagree in another.&lt;br /&gt;
&lt;br /&gt;
This is a benefit of living in a free and democratic society: we have ways to dispute issues that we have strong feelings about, so we can cooperate on some things without having to agree on everything.  It's rarely perfect but we can usually get some good stuff done, with &lt;a href=&quot;https://en.wikipedia.org/wiki/Rough_consensus&quot;&gt;rough consensus and running code&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Today though, there's a political issue which I can't ignore.  The purpose of &lt;a href=&quot;http://twistedmatrix.com/trac/&quot;&gt;Twisted&lt;/a&gt; (the open source project which I founded) is to facilitate the transfer of information across the Internet.  A new law, &lt;a href=&quot;https://en.wikipedia.org/wiki/Stop_Online_Piracy_Act&quot;&gt;SOPA&lt;/a&gt;, is threatening to radically alter the legal infrastructure of the Internet in the United States, granting sweeping new powers to copyright cartels and fundamentally restricting the legal right to transfer any information, and to build tools that transfer it.  Twisted is designed to make it easy to implement new protocols, to easily experiment with improvements to systems like the &lt;a href=&quot;http://www.plagiarismtoday.com/2011/11/15/dns-sopa-content-blocking-and-more/&quot;&gt;Domain Name System&lt;/a&gt;.  SOPA might well make those potential improvements, and with only a little &lt;a href=&quot;http://www.svrowle.com/2011/11/when-even-googles-lawyers-are-worried-your-legislation-probably-sucks/&quot;&gt;paranoid&lt;/a&gt; fantasizing, Twisted itself, illegal.&lt;br /&gt;
&lt;br /&gt;
It's my view that this law is a blatantly &lt;a href=&quot;http://www.net-coalition.com/wp-content/uploads/2011/08/tribe-legis-memo-on-SOPA-12-6-11-1.pdf&quot;&gt;unconstitutional&lt;/a&gt; restriction on free speech.  It will &lt;a href=&quot;http://boingboing.net/2011/12/14/kill-sopa-save-americas-int.html?amp&quot;&gt;kill job creation&lt;/a&gt;, at a time when our nation can scarce afford another blow to its economy.  It will create the infrastructure to suppress political dissent, &lt;a href=&quot;http://advocacy.globalvoicesonline.org/2011/12/03/for-chinese-netizens-sopa-is-another-great-firewall/&quot;&gt;similar to the infrastructure in China and Syria&lt;/a&gt;, at a time when our &lt;a href=&quot;http://rootstrikers.org/&quot;&gt;corrupt&lt;/a&gt; political system needs dissent more than ever.  It is the wrong thing at the wrong time.&lt;br /&gt;
&lt;br /&gt;
This bill is being discussed in the house &lt;i&gt;today&lt;/i&gt;.  If you're in the US, call your representative &lt;a href=&quot;http://americancensorship.org/modal/call-form.html&quot;&gt;right now&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
(As always, I don't speak for anyone but myself; no one else has reviewed or endorsed these remarks.)&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/8729083-3423291996900484779?l=glyph.twistedmatrix.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/glyph/~4/OQAKL9kOYMI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>glyph (noreply@blogger.com)</name>
			<uri>http://glyph.twistedmatrix.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Twisted Matrix Laboratories: November Sprint Report</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TwistedMatrixLaboratories/~3/6K05UmwRupQ/november-sprint-report.html"/>
		<id>tag:blogger.com,1999:blog-1267458971896358542.post-1833297858570761702</id>
		<updated>2011-12-11T00:11:44+00:00</updated>
		<content type="html">November saw another successful Sprint at the Smarterer.com offices, thanks to a smaller but extremely busy group of developers:&lt;br /&gt;
&lt;br /&gt;
Reviewmeister(ess) Jessica McKellar secured second place in the Twisted High Score list with an impressive number of reviews, including: &lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://tm.tl/3037&quot;&gt;#3037&lt;/a&gt;: &quot;loseWriteConnection breaks loseConnection&quot; (now resolved)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tm.tl/4262&quot;&gt;#4262&lt;/a&gt;: &quot;Multicast documentation is misleading&quot; (now resolved)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tm.tl/538&quot;&gt;#538&lt;/a&gt;: &quot;Website-template.tpl is out of date&quot;&lt;/li&gt;
&lt;/ul&gt;
She also resolved &lt;a href=&quot;http://tm.tl/1247&quot;&gt;#1247&lt;/a&gt;: (&quot;kqreactor timeout error (traceback)&quot;), and opened &lt;a href=&quot;http://tm.tl/5385&quot;&gt;#5385&lt;/a&gt;, &lt;a href=&quot;http://tm.tl/5386&quot;&gt;#5386&lt;/a&gt;, and &lt;a href=&quot;http://tm.tl/5387&quot;&gt;#5387&lt;/a&gt;, while resolving &lt;a href=&quot;http://tm.tl/5060&quot;&gt;#5060&lt;/a&gt;: (&quot;Correct python requirement in twisted/topfiles/setup.py&quot;).&lt;br /&gt;
&lt;br /&gt;
Not to mention all the tickets reviewed at recent Sprints which have since been resolved! (Though, to mention them anyway, &lt;a href=&quot;http://tm.tl/1247&quot;&gt;#1247&lt;/a&gt;, &lt;a href=&quot;http://tm.tl/2115&quot;&gt;#2115&lt;/a&gt;, &lt;a href=&quot;http://tm.tl/2447&quot;&gt;#2447&lt;/a&gt;, &lt;a href=&quot;http://tm.tl/2498&quot;&gt;#2498&lt;/a&gt;, &lt;a href=&quot;http://tm.tl/2507&quot;&gt;#2507&lt;/a&gt;, and &lt;a href=&quot;http://tm.tl/5370&quot;&gt;#5370&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
Eternal High Score Overlord JP Calderone made a fair showing as well, finishing &lt;a href=&quot;http://tm.tl/5371&quot;&gt;#5371&lt;/a&gt; (&quot;In the developer guide, forbid new global reactor unit tests&quot;), and splitting &lt;a href=&quot;http://tm.tl/4671&quot;&gt;#4671&lt;/a&gt; (&quot;sometimes I want to have some constant values that are part of a set&quot;) into more managable tickets:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://tm.tl/5382&quot;&gt;#5382&lt;/a&gt;: &quot;Provide a library for valueless named constants&quot;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tm.tl/5383&quot;&gt;#5383&lt;/a&gt;: &quot;Provide a library for simple valued named constants&quot;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tm.tl/5384&quot;&gt;#5384&lt;/a&gt;: &quot;Provide a library for bitvector-like valued named constants&quot;&lt;/li&gt;
&lt;/ul&gt;
Of which &lt;a href=&quot;http://tm.tl/5382&quot;&gt;#5382&lt;/a&gt; and &lt;a href=&quot;http://tm.tl/5383&quot;&gt;#5383&lt;/a&gt; saw immediate progress.&lt;br /&gt;
&lt;br /&gt;
Returning Champion Sprinter Paul Swartz reviewed and otherwise worked on several tickets, including:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://tm.tl/2997&quot;&gt;#2997&lt;/a&gt;: &quot;Conch and getPeer&quot;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tm.tl/5352&quot;&gt;#5352&lt;/a&gt;: &quot;Do not register overlapping old DH key exchange messages&quot;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tm.tl/1902&quot;&gt;#1902&lt;/a&gt;: &quot;Compatibility work-around for commercial SSH 2.0.12 misbehaviours&quot;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tm.tl/3242&quot;&gt;#3242&lt;/a&gt;: &quot;Use python 2.5 'spwd' module instead of z3p secret 'shadow' module when available&quot;&lt;/li&gt;
&lt;/ul&gt;
One-word Twisted celebrity Glyph was also on hand to assist with the reviews of &lt;a href=&quot;http://tm.tl/3242&quot;&gt;#3242&lt;/a&gt;, &lt;a href=&quot;http://tm.tl/5382&quot;&gt;#5382&lt;/a&gt;, and &lt;a href=&quot;http://tm.tl/1918&quot;&gt;#1918&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
With considerably more words in his name, Itamar Turner-Trauring started porting a Nevow branch with IRI support (internationalized URLs) to Twisted as per ticket &lt;a href=&quot;http://tm.tl/5388&quot;&gt;#5388&lt;/a&gt;, as well as helping resolve &lt;a href=&quot;http://tm.tl/3037&quot;&gt;#3037&lt;/a&gt; with Jessica.&lt;br /&gt;
&lt;br /&gt;
Finally, Glyph, Itamar, and Dave Sturgis conferred on &lt;a href=&quot;http://tm.tl/288&quot;&gt;#288&lt;/a&gt;, and the related cluster of web-resource-model issues it involves; It is hoped that this will eventually result in a new Web Server URL Traversal API, or WSURLTA, not to be confused with the nordic kraken-headed demigod of lore.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1267458971896358542-1833297858570761702?l=labs.twistedmatrix.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/TwistedMatrixLaboratories/~4/6K05UmwRupQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Tenth (noreply@blogger.com)</name>
			<uri>http://labs.twistedmatrix.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Moshe Zadka: Contacting my congressperson</title>
		<link rel="alternate" type="text/html" href="http://moshez.wordpress.com/2011/12/09/contacting-my-congressperson/"/>
		<id>http://moshez.wordpress.com/?p=683</id>
		<updated>2011-12-09T18:49:59+00:00</updated>
		<content type="html">&lt;p&gt;I have decided to check which congressperson is responsible for my district, and send her a personal message urging her to vote against SOPA. Here is the text I used:&lt;/p&gt;
&lt;p&gt;Dear Congresswoman Speier,&lt;/p&gt;
&lt;p&gt;I am writing to you regarding the so-called “SOPA”, or “Stop Piracy Online Act” which will be up for debate and a vote soon (possibly as soon as December 15th). I am concerned about the implications of the bill for my rights, as well as those of others in the United States.&lt;/p&gt;
&lt;p&gt;Let me prefix this by saying that the bill will do nothing to “Stop Online Piracy”. Technologies like Freenet[1], Tor[2] or VPN[3] already exist for dedicated pirates to work around any technical or legal hurdles the US government might throw in their path.&lt;/p&gt;
&lt;p&gt;However, what the bill *will* do is to create a US equivalent of the so-called “Great Firewall of China” — a centralized place for the government to stop any communications it does not want. It wouldn’t work against pirates, of course, which would find any small hole in the implementation and smuggle everything through that (just like they do in China — a police state!). But it will mean that new forms of art or technology can be stopped by a unilateral act of the government.&lt;/p&gt;
&lt;p&gt;I, like many of your constituents, work in the hi-tech industry. I depend on free communication, and unfettered access to information, for my livelihood. If you put obstacles in front of Silicon Valley’s business, competitors outside the US will out-innovate, and eventually out-compete us.&lt;/p&gt;
&lt;p&gt;This bill does not just threaten my rights to free expression, and my access to new forms of communication. This bill threatens my ability to make money, all in the name of protecting out-moded business models.&lt;/p&gt;
&lt;p&gt;Last but not least, you will notice that the amounts of television, music and movies available has not decreased with the internet — even if we just limit our search to mass-media. If you factor in over 50 hours a minute of video uploaded to YouTube, you will see that this bill is not necessary in order to “To promote the Progress of Science and useful Arts”[Article I, Section 8, Clause 8, United States Constitution]&lt;/p&gt;
&lt;p&gt;I thank you in advance for your consideration, and hope that you will choose to vote according to the interests of your constituents — against the SOPA bill.&lt;/p&gt;
&lt;p&gt;Yours,&lt;br /&gt;
Moshe Z.&lt;/p&gt;
&lt;p&gt;[1]http://freenetproject.org/&lt;br /&gt;
[2]https://www.torproject.org/&lt;br /&gt;
[3]https://www.ipredator.se/&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/moshez.wordpress.com/683/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/moshez.wordpress.com/683/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/moshez.wordpress.com/683/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/moshez.wordpress.com/683/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/moshez.wordpress.com/683/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/facebook/moshez.wordpress.com/683/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/moshez.wordpress.com/683/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/twitter/moshez.wordpress.com/683/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/moshez.wordpress.com/683/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/moshez.wordpress.com/683/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/moshez.wordpress.com/683/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/moshez.wordpress.com/683/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/moshez.wordpress.com/683/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/moshez.wordpress.com/683/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=moshez.wordpress.com&amp;amp;blog=2210753&amp;amp;post=683&amp;amp;subd=moshez&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>moshez</name>
			<uri>http://moshez.wordpress.com</uri>
		</author>
	</entry>

	<entry>
		<title>Duncan McGreggor: OpenStack at DreamHost</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ElectricDuncan/~3/6gKK_1bIMXY/openstack-at-dreamhost.html"/>
		<id>tag:blogger.com,1999:blog-8825992.post-2095265409736546463</id>
		<updated>2011-12-07T02:49:46+00:00</updated>
		<content type="html">&lt;div style=&quot;clear: both; text-align: center;&quot; class=&quot;separator&quot;&gt;
&lt;a style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot; href=&quot;http://4.bp.blogspot.com/-i2e1yBn68hU/Tt7Nmr3OdgI/AAAAAAAAAGk/lrjeA31S3og/s1600/logo-green.png&quot;&gt;&lt;img src=&quot;http://4.bp.blogspot.com/-i2e1yBn68hU/Tt7Nmr3OdgI/AAAAAAAAAGk/lrjeA31S3og/s1600/logo-green.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
So I guess this is old news now, but &lt;a href=&quot;http://dreamhost.com/&quot;&gt;DreamHost&lt;/a&gt; is really into &lt;a href=&quot;http://openstack.org/&quot;&gt;OpenStack&lt;/a&gt; :-)&lt;br /&gt;
&lt;br /&gt;
(In fact, during recess, DreamHost asked if I would pass a note to OpenStack. I didn't look inside the note, but we can all guess what it said...)&lt;br /&gt;
&lt;br /&gt;
I was hired specifically to work on cloud stuff here at DreamHost, and we've got a new team that's super-excited about this -- they're starting to gear up for increased contributions and community engagement, gettin' themselves some cloud. We've now got our own &lt;a href=&quot;https://launchpad.net/%7Edreamhost-openstack-team&quot;&gt;Launchpad team&lt;/a&gt;, we're working on a handful of &lt;a href=&quot;https://blueprints.launchpad.net/%7Edreamhost-openstack-team&quot;&gt;blueprints&lt;/a&gt;, chatting it up on mail lists and IRC meetings -- you get the picture :-) Exciting times.&lt;br /&gt;
&lt;br /&gt;
For official blog posts and other news items that highlight DreamHost's interest and involvement in OpenStack, check these out:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://dreamhost.com/press-releases/dreamhost-pledges-support-to-openstack-project/&quot;&gt;DreamHost Pledges Support to OpenStack Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.dreamhost.com/2011/06/23/dreamhost-and-openstack-sitting-in-a-tree/&quot;&gt;DreamHost and OpenStack sitting in a tree...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.dreamhost.com/2011/07/28/dreamhost-uses-dells-crowbar-as-a-lever-to-raise-automation/&quot;&gt;DreamHost uses Dell’s Crowbar as a lever to raise automation&lt;/a&gt; (more on Crowbar &lt;a href=&quot;https://github.com/dellcloudedge/crowbar&quot;&gt;here&lt;/a&gt;) &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.thewhir.com/web-hosting-news/062311_Web_Host_DreamHost_Contributing_Code_for_Ceph_File_System_to_OpenStack&quot;&gt;Web Host DreamHost Contributing Code for Ceph File System to OpenStack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.oscon.com/oscon2011/public/schedule/detail/21174&quot;&gt;Ceph and OpenStack at OSCON 2011&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
I'll be writing more about our OpenStack work later, but wanted to get a quick cloud-shout-out done before too much time passed...&lt;br /&gt;
&lt;br /&gt;
P.S. We're hiring Python rock-stars!&lt;br /&gt;
 &lt;br /&gt;
P.P.S. Did I mention that DH is an AWESOME place to work? We got an award for that, &lt;a href=&quot;http://www.ocregister.com/articles/leadership-327671-employees-company.html&quot;&gt;two years in a row&lt;/a&gt; :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/8825992-2095265409736546463?l=oubiwann.blogspot.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?a=6gKK_1bIMXY:kx1_0Grcc1U:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?a=6gKK_1bIMXY:kx1_0Grcc1U:4cEx4HpKnUU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?i=6gKK_1bIMXY:kx1_0Grcc1U:4cEx4HpKnUU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?a=6gKK_1bIMXY:kx1_0Grcc1U:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?i=6gKK_1bIMXY:kx1_0Grcc1U:F7zBnMyn0Lo&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?a=6gKK_1bIMXY:kx1_0Grcc1U:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?i=6gKK_1bIMXY:kx1_0Grcc1U:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?a=6gKK_1bIMXY:kx1_0Grcc1U:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?d=qj6IDK7rITs&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ElectricDuncan/~4/6gKK_1bIMXY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Duncan McGreggor (noreply@blogger.com)</name>
			<uri>http://oubiwann.blogspot.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Duncan McGreggor: Occupy's Declaration of Independence</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ElectricDuncan/~3/83tNgDUERRM/occupys-declaration-of-independence.html"/>
		<id>tag:blogger.com,1999:blog-8825992.post-1965643131699265265</id>
		<updated>2011-11-21T22:08:49+00:00</updated>
		<content type="html">&lt;table cellpadding=&quot;0&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot; href=&quot;http://3.bp.blogspot.com/-u3DrtSIopjk/Tsq7RPaBCcI/AAAAAAAAAGc/ol9PlZAPcOo/s1600/Revolution_by_Peter_Whitley.jpg&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/-u3DrtSIopjk/Tsq7RPaBCcI/AAAAAAAAAGc/ol9PlZAPcOo/s320/Revolution_by_Peter_Whitley.jpg&quot; height=&quot;320&quot; border=&quot;0&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot; class=&quot;tr-caption&quot;&gt;Illustration by Peter Whitley&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
There's one thing I would really, really love to see under the tree this year -- under &lt;b&gt;everyone's&lt;/b&gt; tree: Occupy the World.&lt;br /&gt;
&lt;br /&gt;
For the first time in history, it seems that there might be enough momentum, enough communication, enough strength of individual convictions, and enough mass support to be able to have a world-wide, non-violent, revolution.&lt;br /&gt;
&lt;br /&gt;
Taking the US as an example in this beautiful hope: imagine 2 or 3 million people showing up on the lawns of the US law-making machinery in Washington, D.C., issuing their declaration of independence and simply stating a fact: &quot;Things are now going to change, we will not leave until we have the government that we want.&quot;&lt;br /&gt;
&lt;br /&gt;
Far from mob rule, the 99 is intelligent, lucid, and a collection of THE overwhelming majority... regardless of old political parties. An enormous amount of discussion, insightful inspection, exploration of alternatives has been researched, written about, and promoted over the past 5 to 10 years, co-culminating in what we see around us today as the Occupy movement. I have the utmost faith in these thinkers (by which I mean everyone from Gar Alperovitz to my second cousins working in Detroit, MI automotive plants) and their (our!) ability to produce a new constitution that provides for the 99 fairly. Such a new system would stand in stark contrast to that of today's system: one that caters to policies driven by enormous, &quot;legal&quot; bribes or banking systems that continuously steal from the customers and shareholders, running off with the loot.&lt;br /&gt;
&lt;br /&gt;
The 99 is saying it, and has been saying it for a while: &quot;It's time for a change.&quot;&lt;br /&gt;
&lt;br /&gt;
They've taken things further by showing an undeniable presence at the scenes of crimes (financial and governmental institutions). I say let's take the last logical step, and fix the problem: let's put a new system of government in place. Let's have radical, peaceful change. Let's do it with poise, grace, and while keeping the benefit of the entire planet foremost in our minds. Let's do it world-wide, and not stop until the job is done. Let's have a revolution.&lt;br /&gt;
&lt;br /&gt;
Let's have &lt;i&gt;the&lt;/i&gt; revolution. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/8825992-1965643131699265265?l=oubiwann.blogspot.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?a=83tNgDUERRM:FVGDUzd5p5I:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?a=83tNgDUERRM:FVGDUzd5p5I:4cEx4HpKnUU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?i=83tNgDUERRM:FVGDUzd5p5I:4cEx4HpKnUU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?a=83tNgDUERRM:FVGDUzd5p5I:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?i=83tNgDUERRM:FVGDUzd5p5I:F7zBnMyn0Lo&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?a=83tNgDUERRM:FVGDUzd5p5I:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?i=83tNgDUERRM:FVGDUzd5p5I:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?a=83tNgDUERRM:FVGDUzd5p5I:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ElectricDuncan?d=qj6IDK7rITs&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ElectricDuncan/~4/83tNgDUERRM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Duncan McGreggor (noreply@blogger.com)</name>
			<uri>http://oubiwann.blogspot.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: pyflakes update</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2011/11/pyflakes-update.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-470633188402716824</id>
		<updated>2011-11-21T14:29:05+00:00</updated>
		<content type="html">Thanks to &lt;a href=&quot;http://radix.twistedmatrix.com/&quot;&gt;radix&lt;/a&gt;, &lt;a href=&quot;http://as.ynchrono.us/&quot;&gt;exarkun&lt;/a&gt; &amp;amp; &lt;a href=&quot;http://as.ynchrono.us/&quot;&gt;dash&lt;/a&gt;, my branch to &lt;a href=&quot;http://pypi.python.org/pypi/pyflakes&quot;&gt;pyflakes&lt;/a&gt; to warn about duplicate definitions of classes finally landed. I did the work a year ago as an outrage-powered, opportunistic fix after I saw a co-worker struggle with tests weirdly not failing (Turned out it was a huge test module and there was another class at the bottom with the same name). I'm very happy to see it landed.&lt;br /&gt;&lt;br /&gt;For those who haven't been paying attention, official pyflakes development is now taking place on &lt;a href=&quot;https://launchpad.net/&quot;&gt;Launchpad&lt;/a&gt; as part of the &lt;a href=&quot;http://launchpad.net/divmod.org&quot;&gt;divmod.org&lt;/a&gt; project. The trunk of that project now has the best version of pyflakes known to man.&lt;br /&gt;&lt;br /&gt;pyflakes is the best static Python checker. It's fast, and has very few false positives.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update: &lt;/b&gt;A couple of people have asked me about &lt;a href=&quot;https://launchpad.net/pyflakes&quot;&gt;lp:pyflakes&lt;/a&gt;. It's dead. It died when the divmorg.org trac instance died ages ago. Don't use it. To get pyflakes or any other divmod project, use &lt;a href=&quot;https://launchpad.net/divmod.org&quot;&gt;lp:divmod.org&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-470633188402716824?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Twisted Matrix Laboratories: Twisted 11.1.0 has been released!</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TwistedMatrixLaboratories/~3/P2btIp3B_x0/twisted-1110-has-been-released.html"/>
		<id>tag:blogger.com,1999:blog-1267458971896358542.post-7193564646486452441</id>
		<updated>2011-11-17T18:41:36+00:00</updated>
		<content type="html">Twisted Matrix Laboratories is proud to announce the release of Twisted 11.1, thanks to the efforts of our release manager Thomas Hervé.&lt;br /&gt;
&lt;br /&gt;
Highlights of the 185 tickets closed include:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The poll() reactor as default where applicable, instead of select() everywhere.&lt;/li&gt;
&lt;li&gt;A new SSL implementation only relying on OpenSSL for cryptography, (not I/O) making it more robust.&lt;/li&gt;
&lt;li&gt;Several improvements to the fresh HTTP/1.1 client implementation, including proxy and cookie support.&lt;/li&gt;
&lt;li&gt;Thomas' personal favorite: a new howto has been published on test-driven development with Twisted.&lt;/li&gt;
&lt;li&gt;A new abortConnection() method for immediately closing TCP and SSL connections, the oldest ticket closed by this release.&lt;/li&gt;
&lt;/ul&gt;
For more information, see the &lt;a href=&quot;http://twistedmatrix.com/Releases/Twisted/11.1/NEWS.txt&quot;&gt;NEWS file&lt;/a&gt;. Note that this is the last release supporting Python 2.4 (the support on Windows stopped with 11.0).&lt;br /&gt;
&lt;br /&gt;
Thanks to the supporters who have &lt;a href=&quot;http://twistedmatrix.com/trac/wiki/TwistedSoftwareFoundation&quot;&gt;donated to Twisted&lt;/a&gt; via the Software Freedom Conservancy, and to the many contributors for this release! Download it now:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://pypi.python.org/packages/source/T/Twisted/Twisted-11.1.0.tar.bz2&quot;&gt;Twisted-11.1.0.tar.bz2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pypi.python.org/packages/2.5/T/Twisted/Twisted-11.1.0.win32-py2.5.msi&quot;&gt;Twisted-11.1.0.win32-py2.5.msi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pypi.python.org/packages/2.6/T/Twisted/Twisted-11.1.0.win32-py2.6.msi&quot;&gt;Twisted-11.1.0.win32-py2.6.msi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pypi.python.org/packages/2.7/T/Twisted/Twisted-11.1.0.win32-py2.7.msi&quot;&gt;Twisted-11.1.0.win32-py2.7.msi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1267458971896358542-7193564646486452441?l=labs.twistedmatrix.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/TwistedMatrixLaboratories/~4/P2btIp3B_x0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Itamar Turner-Trauring (noreply@blogger.com)</name>
			<uri>http://labs.twistedmatrix.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Thomas Vander Stichele: Fedora 16 upgrade</title>
		<link rel="alternate" type="text/html" href="http://thomas.apestaart.org/log/?p=1411"/>
		<id>http://thomas.apestaart.org/log/?p=1411</id>
		<updated>2011-11-13T13:03:28+00:00</updated>
		<content type="html">&lt;p&gt;A new Fedora, a new decision on which machines to upgrade.  Usually I try to stagger the three machines I use most – my work desktop, my home desktop, and my laptop.  I had updated work machine and laptop to F-15 when it came out, and kept my home desktop at F-14.&lt;/p&gt;
&lt;p&gt;I actually have two or three root partitions on each of those machines, and I typically do a fresh install on a separate root, so I can try things, poke around, and make sure everything I will need works.  When I do the install, I don’t mount my /home partition, because I don’t want to have the new version upgrade things for me on my user config.&lt;/p&gt;
&lt;p&gt;I have a pretty long checklist by now that I go through on each install/upgrade, installing the packages I use a lot, setting up specific configuration, copy over ssh keys, …&lt;/p&gt;
&lt;p&gt;I actually liked F-15 a lot, and though GNOME 3 has its issues (which I still want to document in a separate post), I overall enjoyed the experience.  At home, I noticed myself using the windows key or moving my mouse to the top left corner expecting something to happen.&lt;/p&gt;
&lt;p&gt;That is how you know you really are ready for GNOME3.&lt;/p&gt;
&lt;p&gt;So I thought, what the heck, let’s get to upgrading all of them.  I started with my laptop, as usual.  That mostly went fine, except for &lt;strong&gt;hurdle number one&lt;/strong&gt;.  My laptop actually has /home encrypted.  And I did not add it to my custom layout in anaconda.  So, the system dropped me in a rescue shell after booting.  It took me quite a while to figure out that I had to copy over /etc/crypttab from the old system.  After that, things worked again.&lt;/p&gt;
&lt;p&gt;Arguably, hurdle #1 may not be Fedora’s fault.  Maybe normal users don’t encrypt home drives, or use custom partitioning like I do (although on a few fedora upgrades this saved my bacon when it turned out certain things I needed didn’t work in the new Fedora, like VMWare)&lt;/p&gt;
&lt;p&gt;And yes, GNOME 3.2 is a slight improvement.  Enough to make a difference at least.  All the usual applications seem to work, so I can now mount my old /home directory.&lt;/p&gt;
&lt;p&gt;That’s when I ran into &lt;strong&gt;hurdle number 2&lt;/strong&gt;: the default uid/gid numbering change.  My thomas user now was 1000:1000 as opposed to 500:500 on all my machines before Fedora 16.&lt;/p&gt;
&lt;p&gt;In this day and age, I still have to shell it up to fix things like that:&lt;br /&gt;
&lt;code&gt;find / -uid 500 -exec chown 1000 {} \;&lt;br /&gt;
find / -gid 500 -exec chown :1000 {} \;&lt;/code&gt;&lt;br /&gt;
If I had less shame I’d tell you how embarassing it is if you do this for a few users on your system, and start thinking “let’s put this in a for loop”, and because it’s already 1 AM you start doing things like&lt;br /&gt;
&lt;code&gt;for a in 0 1 3; do find / -uid 50$a -exec chown 10$a {} \; ; find / -gid 50$a -exec chown 100$a {} \; done&lt;/code&gt;&lt;br /&gt;
Note how I got the number of 0′s wrong in the first find, and how I actually forgot the : in the second.  You can imagine how amusing it is to fix the effect of those commands.&lt;/p&gt;
&lt;p&gt;But I’m a shameful person so I won’t tell you about this bit.  Instead, suffice it to say that this took a long time.&lt;/p&gt;
&lt;p&gt;Ok, so now /home is mounted on the laptop, and for the most part things worked fine.&lt;/p&gt;
&lt;p&gt;On comes the weekend, so I turn to the home machine.  I tend to keep the work machine for last, because I don’t want to spend work time on fixing distro problems. And I usually take a whole weekend to upgrade at home.  The home machine turned out to be more of a problem.  I ran headlong into &lt;strong&gt;hurdle number three&lt;/strong&gt;. You see, there is this new thing called GPT for your partition table, and it is now the default, and it means that fdisk will no longer work, and now you should use gdisk (which sadly is not installed on the rescue bit of the install DVD, boo!), and this is all so we can have grub2, which is supposed to be better or something.&lt;/p&gt;
&lt;p&gt;I’m sure one day I will be thankful.  But on my home machine, I didn’t know any of this, and just had anaconda tell me something about the boot image being too large and there was no space for it and my system may not boot.  (I am not sure why I did not run into this problem on my laptop – presumably, looking at the disk layout now, because I kept the original install, which includes Windows, and just shrunk that and added linux – so it’s probably the windows thing doing the booting).  And sure enough, the Fedora 16 install did not boot.  It dropped me into my friend, the shell.&lt;/p&gt;
&lt;p&gt;So here’s the thing.  This new way of doing things needs more space than your average MBR, so you actually need to create a primary partition for this, and it needs to be in the first 2 TiB.  So you know what time it is now.  It’s resize-o-clock time – I get to learn the joys and mysteries of shrinking ext4-on-software-raid so I can make space for this new partition, which doesn’t need to be big, apparently 5 MB is more than enough.  Aren’t I happy now that I stubbornly stuck to having a /boot partition as the primary one on my machines, so I can just shrink that a little?&lt;/p&gt;
&lt;p&gt;So shrinking an ext partition I already had down pat.  I learnt about shrinking software raid partitions, and again I got into the land of not understanding which of the many types of numbers (sectors ? blocks ? bytes ? cilinders ? Mebi vs Mega ?) are understood the same way by the tools, or not understanding how much of those numbers you need to count extra because of the layer of indirection being added (encryption on logical volume on LVM on software RAID anyone ?).   So to be safe I end up shrinking 10% on each layer of the onion as I go deeper – then let the tools handle growing to the maximum space again, since that’s the one thing they’re usually decent at.&lt;/p&gt;
&lt;p&gt;But you know, if I’ve done all this, I want to get it right.  I don’t want a stinking BIOS boot partition sitting after my /boot partitions.  That’s not how F16 sets it up by default.  But I have never actually moved a partition.  So, download gparted, look at it, figure out how it can let me do that, make sure I ask it to count by cylinders so it doesn’t leave gaps, be puzzled at why it doesn’t let me fractions for MiB sizes of partitions, and work around it in some other way.  And so I finally have those two software raid /boot-wearing partitions where I want them – sitting right behind this new BIOS partition.&lt;/p&gt;
&lt;p&gt;I create a new partition in fdisk (which is what I’m used to), but I can’t actually set the partition type to EF02, which has four characters where I expect two.  But really that is what BIOS BOOT should be.&lt;/p&gt;
&lt;p&gt;And now the internet tells me I need to set some flag on it using a tool called parted – some flag called bios_grub.  Except when I type that magical command that sets the flag, it tells me it can’t exist:&lt;br /&gt;
&lt;code&gt;[root@otto ~]# parted /dev/sda set 6 bios_grub&lt;br /&gt;
parted: invalid token: bios_grub&lt;br /&gt;
Flag to Invert?&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Isn’t this tool nicely written for only the writer of the tool instead of for human beings?  Of course I don’t know this when it barfs this at me, but at the end of this story I figured a bunch of things out that this tool could have told me.&lt;/p&gt;
&lt;p&gt;You see, invalid token just means that it doesn’t accept the flag named bios_grub.  I know this because I’m a programmer so I know the programmer used a token parser – a thing normal people shouldn’t have to know about.  What’s that you’re asking? Flag to Invert? How about the Belgian flag, I would quite like to see the colors go in the opposite direction.  No, that’s a prompt to choose a different flag to invert than bios_grub.  Apparently bios_grub is a flag, not a setting, and I’m trying to invert it, instead of setting it.  Can you tell me what flags you do know about, dear parted ?&lt;/p&gt;
&lt;p&gt;&lt;code&gt;(parted) help set&lt;br /&gt;
  set NUMBER FLAG STATE                    change the FLAG on partition NUMBER&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;	NUMBER is the partition number used by Linux.  On MS-DOS disk labels,&lt;br /&gt;
        the primary partitions number from 1 to 4, logical partitions from 5&lt;br /&gt;
        onwards.&lt;br /&gt;
        FLAG is one of: boot, root, swap, hidden, raid, lvm, lba, hp-service,&lt;br /&gt;
        palo, prep, msftres, bios_grub, atvrecv, diag, legacy_boot&lt;br /&gt;
        STATE is one of: on, off&lt;/p&gt;
&lt;p&gt;Wait, what ? You do know about bios_grub ? But you don’t let me set it ?&lt;/p&gt;
&lt;p&gt;I seriously spent 30 minutes on trying to figure that one out.&lt;/p&gt;
&lt;p&gt;In the end, it’s because a) I should run gdisk b) parted won’t let you set that flag on a normal MBR drive c) gdisk should convert to using GPT and d) the messages gdisk prints by default are SUPER scary and the docs say that this is intentional to keep away stupid Windows users (I am not making this shit up).  Well, that’s why I use software RAID, isn’t it ? How about we take our chances, dive in deep, and let this gdisk thing do the conversion to GPT on the first disk.  Gulp.&lt;/p&gt;
&lt;p&gt;OK, I got lucky.  That actually worked.  I can now create this partition, with the proper flag set.  While I’m at it, why don’t we try this ‘sort partitions’ option in gdisk so that this new partition, which is now at the start, but listed as number 4 out of 4, shows up as number 1.  Sure, it will renumber all other partitions, but let’s just hope that most things use UUID’s and labels and what not by now, and if not I should be able to figure things out.&lt;/p&gt;
&lt;p&gt;In what feels like Day 5 in a two-day weekend, the system now boots! I actually see a new grub (wait, why is that text-mode only again ? Fedora guys, you spent years to make everything look graphical, because that was some huge important feature that mostly got in my way when it took longer than it was supposed to and I had no way to see why except reboot and remove quiet and rhgb from the options) and now you suddenly let grub2 take that back from you? Show us some spine, please), and the system shows me plymouth again.  Until it doesn’t anymore, and drops me into a terminal screen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hurdle number four&lt;/strong&gt;.  Can you guess what it is ? Go on, take a stab.  If you’ve updated your system, I’m sure you know the answer.  I’ll give you some whitespace to think about it…&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;SELinux.  Riding in to relabel my file system to save it from the evil people out there.  And sure, it warns me.   This may take a long time.  And then it proceeds to throw asterisks in my face.  Lots of asterisks.  It’s not the first time this happens.  But every time it does, I cannot help but wonder one thing.&lt;/p&gt;
&lt;p&gt;Who thought it was a great idea to throw asterisks at the user? How many asterisks am I supposed to expect? Never mind that you can’t actually count them unless you glue your eyeball at the screen, because there are so many they actually scroll off at the top.  You know, if you squint hard enough, you can see the maniacally laughing face of the programmer who thought this was a nice way of showing progress.  Never mind that tools like fsck can show a progress bar that actually means something (if you trick it into sending data to file descriptor 0) in a sensible way – one line on the console, and visible progress towards an end goal of 100%.&lt;/p&gt;
&lt;p&gt;If only I could guess what a long time is going to end up being.  Is it a ‘get a drink’ amount of time? Or ‘watch some dexter’.  Or nookie time? Or, get the hell out of the house and do all the shopping for the next three hours because there’s no way you’ll be doing anything useful with this system for that long?&lt;/p&gt;
&lt;p&gt;So I do all of those things, twice, and one even four times times (I won’t tell you which but I ended up having to pee a lot), and I come back, and the system has rebooted, and there’s actually a GUI asking me to log in.&lt;/p&gt;
&lt;p&gt;You know, this Fedora 16 better be frigging spectacular after this six day weekend.&lt;/p&gt;
&lt;p&gt;I log in, follow my standard upgrade checklist, try out some of my tools.  Media keys don’t seem to work as before for my prototype music player (it flashes a nasty forbidden sign at me), and even though I set up to have nothing happen on inserting audio CD’s (because my LEGO robot is inserting CD’s into an external drive about fifty times a day), Rhythmbox craps on and FORCES me to select which of the many CD’s with exactly the same name that audio CD might be.  So, par for the course so far.&lt;/p&gt;
&lt;p&gt;Maybe a reboot will fix that, it may not know about those settings until I have everything installed and upgraded.  And if I reboot, I’d better convert my second drive to GPT and fix my /boot and set that flag and all that.  So I do.  And for some reason I can’t figure out how to tell software raid that sda2 and sdb2 (which are both still perfectly mountable as ext file systems and were part of the previous RAID-1 /boot array before I resized them) really are a software raid.  So there’s this point where I’ve wasted more time on trying that then it would have taken me to actually manually type every byte on that /boot partition, and I just give up and recreate a software raid on those two partitions and copy stuff over.&lt;/p&gt;
&lt;p&gt;And then I reboot.  And won’t you know it.  Effing goddamn selinux relabel all over again.  In fact, this way too long entry was typed completely in less than half the time selinux took to complete some work it had already done an hour ago.&lt;/p&gt;
&lt;p&gt;I better have a working system after this last relabel finishes.  Now excuse me while I go make some comfort food, potatoes and beans and runny eggs with butter sauce.  I’m going to eat it while my good friend Dexter comes back from a long holiday.  It’s the only thing that is going to get me out of this weekend funk.  And you know who I will be thinking about every time my friend Dexter tells me of a problem he solved…&lt;/p&gt;</content>
		<author>
			<name>Thomas</name>
			<uri>http://thomas.apestaart.org/log</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: Automatic packaging update</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2011/11/automatic-packaging-update.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-2586467635191977316</id>
		<updated>2011-11-10T12:40:33+00:00</updated>
		<content type="html">I just blogged on developer.ubuntu.com about &lt;a href=&quot;http://developer.ubuntu.com/2011/11/automatic-packaging-progress/&quot;&gt;the work we're doing with automatic packaging&lt;/a&gt;. Read it!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-2586467635191977316?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Thomas Vander Stichele: Package repository updated for Fedora 16</title>
		<link rel="alternate" type="text/html" href="http://thomas.apestaart.org/log/?p=1408"/>
		<id>http://thomas.apestaart.org/log/?p=1408</id>
		<updated>2011-11-10T08:38:57+00:00</updated>
		<content type="html">&lt;p&gt;Following up on &lt;a href=&quot;http://thomas.apestaart.org/log/?p=1407&quot;&gt;last night’s post&lt;/a&gt;, I updated my &lt;a href=&quot;http://thomas.apestaart.org/pkg/&quot;&gt;package repositories&lt;/a&gt; with all packages I currently work on before sending them off to Fedora.&lt;/p&gt;
&lt;p&gt;The repository is updated with chromaprint, gstreamer-chromaprint, longomatch, and some of my own projects: moap, mach, morituri, and savon.&lt;/p&gt;</content>
		<author>
			<name>Thomas</name>
			<uri>http://thomas.apestaart.org/log</uri>
		</author>
	</entry>

	<entry>
		<title>Itamar Shtull-Trauring: The Euro crisis, in musical form</title>
		<link rel="alternate" type="text/html" href="http://sikritinfo.blogspot.com/2011/11/euro-crisis-in-musical-form.html"/>
		<id>tag:blogger.com,1999:blog-5374469488279884588.post-2241355701239109349</id>
		<updated>2011-11-10T04:03:14+00:00</updated>
		<content type="html">&lt;a href=&quot;https://www.youtube.com/watch?v=fqcn_TPu4qQ&quot;&gt;DOOM.&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5374469488279884588-2241355701239109349?l=sikritinfo.blogspot.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Itamar Turner-Trauring (noreply@blogger.com)</name>
			<uri>http://sikritinfo.blogspot.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Thomas Vander Stichele: Mach 1.0.0 “Madera” released</title>
		<link rel="alternate" type="text/html" href="http://thomas.apestaart.org/log/?p=1404"/>
		<id>http://thomas.apestaart.org/log/?p=1404</id>
		<updated>2011-11-09T22:56:01+00:00</updated>
		<content type="html">&lt;p&gt;Another November, another Fedora.  16 came out, so it was time to update mach again.&lt;/p&gt;
&lt;p&gt;And today I thought, is there any reason mach isn’t 1.0 yet ? Am I going to do anything more to this piece of code before I want to call it that ?&lt;/p&gt;
&lt;p&gt;And the answer is, no.  It’s the first Python application I’ve written, and I’m not particularly proud of the code, but I’m happy I’ve made good use of it for so long, and that it helped push packaging approaches forward and sparked ideas for the Fedora build system.  &lt;/p&gt;
&lt;p&gt;Since I didn’t like the original code for mach2 (there was a version 1 which was Makefile-based), I started a rewrite with unit tests, better code layout, decent classes for abstracting distro-specific stuff, and so on.&lt;/p&gt;
&lt;p&gt;The experience of how mock was created based off mach2 was a slightly sour one however, so I wasn’t really motivated to finish the mach3 rewrite.  Sometimes that’s the drawback of open source – sure, forking is specifically allowed, so don’t whine about it when it happens.  But when it’s done gratuitously, with no serious attempt at collaborating, it doesn’t feel like it’s in the spirit of open source.&lt;/p&gt;
&lt;p&gt;Anyway, that was a long time ago.  mach2 as it is today, is done.  It really only needs updating for newer versions.  As long as it works for me, it’s unlikely I will continue mach3, but who knows?&lt;/p&gt;
&lt;p&gt;Enjoy the &lt;a href=&quot;http://thomas.apestaart.org/projects/mach/&quot;&gt;release&lt;/a&gt;!&lt;/p&gt;</content>
		<author>
			<name>Thomas</name>
			<uri>http://thomas.apestaart.org/log</uri>
		</author>
	</entry>

	<entry>
		<title>Glyph Lefkowitz: Blocking vs. Running</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/glyph/~3/0vDUkrm6JHE/blocking-vs-running.html"/>
		<id>tag:blogger.com,1999:blog-8729083.post-4493860799690752323</id>
		<updated>2011-11-05T01:16:26+00:00</updated>
		<content type="html">I've heard tell of some confusion lately around what the term &quot;non-blocking&quot; means.  This isn't the first time I've tried to explain it, and it certainly won't be the last, but blogging is easier than the job &lt;a href=&quot;http://en.wikipedia.org/wiki/Sisyphus&quot;&gt;Sisyphus&lt;/a&gt; got, so I can't complain.&lt;br /&gt;
&lt;br /&gt;
A thread is &lt;a href=&quot;http://j.mp/nuSjZk&quot;&gt;blocking&lt;/a&gt; when it is performing an &lt;em&gt;input or output operation&lt;/em&gt; that may take an &lt;em&gt;unknown amount of time&lt;/em&gt;.  Crucially, a blocking thread is &lt;em&gt;doing no useful work&lt;/em&gt;.  It is stuck, consuming resources - in particular, its &lt;a href=&quot;http://stackoverflow.com/questions/2340093/how-is-stack-size-of-process-on-linux-related-to-pthread-fork-and-exec&quot;&gt;thread stack&lt;/a&gt;, and its &lt;a href=&quot;http://en.wikipedia.org/wiki/Process_table&quot;&gt;process table&lt;/a&gt; entry.  It is sucking up resources and getting nothing done.  These are resources that one can most definitely &lt;a href=&quot;http://en.wikipedia.org/wiki/Fork_bomb&quot;&gt;run out of&lt;/a&gt;, and are in fact &lt;a href=&quot;http://pubs.opengroup.org/onlinepubs/007904975/functions/getrlimit.html&quot;&gt;artificially limited&lt;/a&gt; on most operating systems, because if one has too many of them, the system &lt;a href=&quot;http://oreilly.com/catalog/linuxkernel/chapter/ch10.html&quot;&gt;bogs down&lt;/a&gt; and becomes unusable.&lt;br /&gt;
&lt;br /&gt;
A thread may also be &quot;stuck&quot; doing some computationally intensive work; performing a complex computation, and sucking up CPU cycles.  There is a very important distinction here, though.  If that thread is burning up CPU, it is &lt;em&gt;getting work done&lt;/em&gt;.  It is computing.  This is why we have computers: to compute things.&lt;br /&gt;
&lt;br /&gt;
It is of course possible for a program to have a bug where a program goes into an infinite loop, or otherwise performs work on the CPU without actually getting anything useful &lt;em&gt;to the user&lt;/em&gt; done, but if that's happening then the program is just buggy, or inefficient.  But such a program is not &lt;em&gt;blocking&lt;/em&gt;: it might be &quot;thrashing&quot; or &quot;stuck&quot; or &quot;broken&quot;, but &quot;blocking&quot; means something more specific: that the program is sitting around, doing nothing, while it is &lt;i&gt;waiting for some other thing&lt;/i&gt; to get work done, and not doing any of its own.&lt;br /&gt;
&lt;br /&gt;
A program written in an event-driven style may be busy as long as it needs to be, but that does not mean it is &lt;i&gt;blocking&lt;/i&gt;.  Hence, &lt;i&gt;event-driven&lt;/i&gt; and &lt;i&gt;non-blocking&lt;/i&gt; are synonyms.&lt;br /&gt;
&lt;br /&gt;
Furthermore, &lt;i&gt;non-blocking&lt;/i&gt; doesn't necessarily mean &lt;i&gt;single-process&lt;/i&gt;.  &lt;a href=&quot;http://twistedmatrix.com/&quot;&gt;Twisted&lt;/a&gt; is non-blocking, for example, but it has a sophisticated facility for &lt;a href=&quot;http://twistedmatrix.com/documents/current/api/twisted.internet.interfaces.IReactorProcess.spawnProcess.html&quot;&gt;starting, controlling and stopping other processes&lt;/a&gt;.  Information about changes to those processes is represented as plain old events, making it reasonably easy to fold the results of computation in another process back into the main one.&lt;br /&gt;
&lt;br /&gt;
If you need to perform a lengthy &lt;a href=&quot;http://teddziuba.com/2011/10/node-js-is-cancer.html&quot;&gt;computation&lt;/a&gt; in an event-driven program, that does &lt;a href=&quot;http://corbinsimpson.com/entry/posion-was-the-cure&quot;&gt;not&lt;/a&gt; mean you need to stop the world in order to do it.  It doesn't mean that you need to give up on the relatively simple execution model of an event loop for a mess of threads, either.  Just ask another process to do the work, and handle the result of that work as just another event.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/8729083-4493860799690752323?l=glyph.twistedmatrix.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/glyph/~4/0vDUkrm6JHE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>glyph (noreply@blogger.com)</name>
			<uri>http://glyph.twistedmatrix.com/</uri>
		</author>
	</entry>

	<entry>
		<title>Jonathan Lange: How to feel better (or, some tips on refactoring)</title>
		<link rel="alternate" type="text/html" href="http://code.mumak.net/2011/11/how-to-feel-better-or-some-tips-on.html"/>
		<id>tag:blogger.com,1999:blog-5733547231775030285.post-6888679017330633879</id>
		<updated>2011-11-04T18:29:19+00:00</updated>
		<content type="html">&lt;span style=&quot;background-color: transparent;&quot;&gt;A few months back I gave a lightning talk at the &lt;a href=&quot;https://launchpad.net/&quot;&gt;Launchpad&lt;/a&gt; Thunderdome about how I do refactoring.  It's very opinionated, and mostly applies to big, old code bases, but worth writing up anyway.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;The core idea here is that very few things make me feel as good as deleting code. I love cleaning up code and the clean code base that results, and I'm sure that many others feel like me. As such, this is a guide on how to feel better.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Know your enemy&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;“Functionality is an asset, code is a liability”. Truer words were never spoken. Every line of code is a potential source of bugs and a barrier to understanding, and thus carries a maintenance cost.&lt;br /&gt;&lt;br /&gt;Maintain an awareness of things that need refactoring. Here's a quick and incomplete list:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;unused code – this can be deleted&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;boilerplate – this should become a function or class&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;wrong documentation – these should be updated&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;two ways of doing something – perhaps there should be one&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;bad names – change them to something that makes you think less&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;2. Keep a &quot;yak stack&quot;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style=&quot;background-color: transparent;&quot; href=&quot;http://projects.csail.mit.edu/gsb/old-archive/gsb-archive/gsb2000-02-11.html&quot;&gt;Yak shaving&lt;/a&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt; is &quot;any seemingly pointless activity which is actually necessary to solve a problem which solves a problem which, several levels of recursion later, solves the real problem you're working on.&quot; (&lt;a href=&quot;http://catb.org/jargon/html/Y/yak-shaving.html&quot;&gt;Jargon File&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A few of us have extended the concept beyond the &quot;actually necessary&quot; to include anything that's making the task at hand more difficult and less fun but is not worth fixing &lt;i&gt;right&lt;/i&gt; now. Hence the yak stack. Here's how it works:&lt;br /&gt;&lt;br /&gt;Whenever you come across something in your code base that is difficult to understand or that slows you down: make a note of it. When you've finished the task at hand, fix the problem. If you encounter other things that slow you down, write them down. Work through the list.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Every option is wrong&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In a big, old code base, there are probably many, many areas that need refactoring.  Don't worry about which is the &quot;best&quot; place to start – there is no best place.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. Start from green, stay green&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Never, ever refactor while your tests are failing. Refactoring is about changing the shape of code while preserving its behaviour. It's much harder to be sure you're keeping the behaviour if you are comparing one set of thirty tracebacks with another set of thirty tracebacks. Better to compare a passing (&quot;green&quot;) test run with another passing test run.&lt;br /&gt;&lt;br /&gt;Run tests frequently. More often then you think you should. Commit often – think of it like quick save in a tough level of a video game. It frees you up to experiment more and means you have less in your head at any one time.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5. Do not nest&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Don't begin a refactoring while you are in the middle of another refactoring. If you find you must, use tools like '&lt;a href=&quot;http://doc.bazaar.canonical.com/beta/en/user-guide/shelving_changes.html&quot;&gt;bzr shelve&lt;/a&gt;' to store your current diff and then work from the clean head of your branch.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6. Keep moving, leave a trail&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Don't get bogged down in details, otherwise you'll never finish. Literally. Someone will come along and distract you and before you know it, three months will pass and your refactoring branch will be full of conflicts. If you see something you are unsure of, mark it with a XXX or a FIXME or a TODO or whatever works for you and then continue with what you are doing.&lt;br /&gt;&lt;br /&gt;Tools like '&lt;a href=&quot;http://launchpad.net/difftodo&quot;&gt;bzr todo&lt;/a&gt;' can make it really easy to check to see if you've added any XXX comments.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;7. Translate tests with care&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As said above, refactoring is about changing the shape of code while preserving its behaviour. When you update tests, you risk changing your definition of the system's behaviour – so be careful.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;8. Confront uncertainty with destruction&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If you see some code and you are not sure if it's needed, delete it. Doesn't matter if it's a whole function or just an odd line. If you have a test suite, and it was important, that will catch the failure. If you have version control, and it was important, one of your collaborators will notice and revert the change.&lt;br /&gt;&lt;br /&gt;If it was important and neither of these happened, then your whole project has learned something new about itself, and that's probably worth the hassle. (Oh, add tests &amp;amp; better docs after this happens.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;9. Good grep tools&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Remember that symbols aren't only referenced from files that match *.py.  In big code bases there are often other sorts of files that refer to symbols in the main code. In Launchpad, for example, we have ZCML and doctest files that refer to symbols. When you want to know how something is used or you want to rename something, make sure you use a grep command that actually finds everything.&lt;br /&gt;&lt;br /&gt;Ideally, you should be able to run this command faster than you can think about wanting to do it.&lt;br /&gt;&lt;br /&gt;Personally, I use 'bzr grep' a lot. Others recommend 'ack'.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;10. There will be failures&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Mentally prepare yourself for the fact that the first two or three full test runs after your refactoring will fail.  This is especially important for code bases that have multi-hour test run times.&lt;br /&gt;&lt;br /&gt;If you think this way, then you won't be as discouraged when it actually happens.&lt;br /&gt;&lt;br /&gt;&lt;b style=&quot;background-color: transparent;&quot;&gt;11. Finish the job&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Busy people refactoring a big code base are often tempted to apply a refactoring to only a single part.  For example, some useful function is extracted from repeated boilerplate in a few other functions. However, many, many other instances in the code base continue to use the repeated boilerplate.&lt;br /&gt;&lt;br /&gt;This is &lt;i&gt;almost&lt;/i&gt; worse than just leaving the repeated boilerplate.  There are now two idiomatic ways of doing the activity.  Further, other developers who work on other parts of the code base probably won't find out about it, and might end up repeating your refactoring. Ugh. How is anyone new expected to get to grips with this code?&lt;br /&gt;&lt;br /&gt;Similarly, if a class, function or concept is renamed, rename it everywhere, especially in the documentation.&lt;br /&gt;&lt;br /&gt;It's difficult and often tedious, but it really is worth taking refactorings to completion. Apply them to the whole code base, or not at all.&lt;br /&gt;&lt;br /&gt;Note that I'm referring to completeness, not perfection. If you block on perfection, you never get anything useful done. If you aim for frequent incremental improvements, you soar.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;12. Read these books&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I highly recommend &quot;&lt;a href=&quot;http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1320430812&amp;amp;sr=1-1&quot;&gt;Refactoring&lt;/a&gt;&quot; by Martin Fowler and &quot;&lt;a href=&quot;http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1320430812&amp;amp;sr=1-1&quot;&gt;TDD by Example&lt;/a&gt;&quot; by Kent Beck. I stole many of these ideas from them.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Over to you&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;This was very much just a dump of how I do refactoring when hacking on Launchpad. I'm always keen to learn more, and would love to hear about what works for you.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5733547231775030285-6888679017330633879?l=code.mumak.net&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>jml (noreply@blogger.com)</name>
			<uri>http://code.mumak.net/</uri>
		</author>
	</entry>

	<entry>
		<title>Jp Calderone: Don't Use Buildbot EC2 Features</title>
		<link rel="alternate" type="text/html" href="http://as.ynchrono.us/2011/10/dont-use-buildbot-ec2-features.html"/>
		<id>tag:blogger.com,1999:blog-4350363846291077818.post-5240778112752569787</id>
		<updated>2011-10-31T17:15:32+00:00</updated>
		<content type="html">I just noticed that Buildbot spun up one EC2 instance 31 days ago and another one 14 days ago and left them both running.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/4350363846291077818-5240778112752569787?l=as.ynchrono.us&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Jean-Paul Calderone (noreply@blogger.com)</name>
			<uri>http://as.ynchrono.us/</uri>
		</author>
	</entry>

	<entry>
		<title>Stephen Thorne: Gmail Keyboard Shortcuts</title>
		<link rel="alternate" type="text/html" href="http://shiny.thorne.id.au/2011/10/gmail-keyboard-shortcuts.html"/>
		<id>tag:blogger.com,1999:blog-21652080.post-5294418742951917913</id>
		<updated>2011-10-28T12:26:00+00:00</updated>
		<content type="html">&lt;div class=&quot;posterous_autopost&quot;&gt;&lt;div class=&quot;p_embed p_image_embed&quot;&gt; &lt;img src=&quot;http://posterous.com/getfile/files.posterous.com/jerub/p30v3nXyAf0qBbbA3mC4KQL0gOEI4UMXHLLvCOynRgubii9YuS2iXGtU8hWx/f3e04bbd80a5c4d9_gmail-magnet.jpg&quot; alt=&quot;F3e04bbd80a5c4d9_gmail-magnet&quot; height=&quot;333&quot; width=&quot;400&quot; /&gt; &lt;/div&gt; &lt;p&gt;I use Gmail a lot now. I also have come to know and love a few keyboard shortcuts. I can't imagine dealing with a large volume of email without them.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;You have to turn them on under the mail settings first.&lt;/div&gt; &lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;b&gt;u &lt;/b&gt;will refresh the current mail search or your inbox if you're looking at your inbox.&lt;/div&gt;&lt;div&gt;&lt;b&gt;u &lt;/b&gt;will return you to your mail search, label or inbox if you're looking at an email.&lt;/div&gt; &lt;div&gt;&lt;b&gt;j&lt;/b&gt;/&lt;b&gt;k&lt;/b&gt; to navigate between emails in your inbox view.&lt;/div&gt;&lt;div&gt;&lt;b&gt;x&lt;/b&gt; selects an email, and dumps you back at the message list if you were in an email.&lt;/div&gt;&lt;div&gt;&lt;b&gt;s &lt;/b&gt;applies a star to selected emails, or stars the email you're reading.&lt;/div&gt; &lt;div&gt;&lt;b&gt;+/-&lt;/b&gt; will flag/unflag an email as important (if you're using priority inbox)&lt;/div&gt;&lt;div&gt;&lt;b&gt;e &lt;/b&gt;archives selected emails, or archive an email you're reading.&lt;/div&gt;&lt;div&gt;&lt;b&gt;r &lt;/b&gt;replies to an email.&lt;/div&gt; &lt;div&gt;&lt;b&gt;m &lt;/b&gt;will mute selected email threads so it won't reappear in your inbox when more posts are made.&lt;/div&gt;&lt;div&gt;&lt;b&gt;gl&lt;/b&gt; lets you type the name of a label you want to view.&lt;/div&gt;&lt;div&gt;&lt;b&gt;? &lt;/b&gt;brings up the help.&lt;/div&gt; &lt;p&gt;&lt;/p&gt;&lt;div&gt;Most important button to me is &lt;b&gt;u, &lt;/b&gt;as it&lt;b&gt; &lt;/b&gt;refreshes my inbox when my android phone has chimed to let me know that I've got an important email, and the gmail UI hasn't shown it yet. The androids. They always know.&lt;/div&gt; &lt;p&gt;&lt;/p&gt;&lt;div&gt;(Photo from &lt;a href=&quot;http://www.geeksugar.com/Geek-Up-Fridge-Gmail-Magnet-3575214&quot;&gt;Geek Sugar&lt;/a&gt;)&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/21652080-5294418742951917913?l=shiny.thorne.id.au&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Stephen Jerub Thorne (noreply@blogger.com)</name>
			<uri>http://shiny.thorne.id.au/</uri>
		</author>
	</entry>

	<entry>
		<title>Stephen Thorne: Appengine Development</title>
		<link rel="alternate" type="text/html" href="http://shiny.thorne.id.au/2011/09/appengine-development.html"/>
		<id>tag:blogger.com,1999:blog-21652080.post-6728651047607462851</id>
		<updated>2011-10-28T12:25:39+00:00</updated>
		<content type="html">&lt;div class=&quot;posterous_autopost&quot;&gt;I've been quite enjoying writing some code for Google Appengine this week. Just a small project for querying a variety of book retailer websites for information.&lt;p&gt;&lt;/p&gt;I'm really impressed with it so far. Having the ability to simply import and use things like memcache and use it is excellent. It works locally with some kind of cache, and then when I deploy my app it uses a memcache on the server side seamlessly.&lt;p&gt;&lt;/p&gt; I'm also liking that the urlfetch infrastructure built into appengine supports async downloading of webpages, so i can fire off 5+ API queries simultaneously and then collect the results, instead of doing them in sequence.&lt;p&gt;&lt;/p&gt; Here's a random bit of code I threw together that lets me cache the results of doing API queries in memcache so that a user doing reloads won't cause more API requests to occur than are strictly necessary:&lt;p&gt;&lt;/p&gt; &lt;div style=&quot;margin-left: 40px; font-family: courier new,monospace;&quot;&gt;from google.appengine.api import urlfetch&lt;br /&gt;from google.appengine.api import memcache&lt;p&gt;&lt;/p&gt;CACHE_TIMEOUT = 3600 # 1 hour &lt;p&gt;&lt;/p&gt;class APIError(Exception):&lt;br /&gt;     pass&lt;p&gt;&lt;/p&gt;def cache_result(rpc, url):&lt;br /&gt;    result = rpc.get_result()&lt;br /&gt;    if result.status_code == 200:&lt;br /&gt;        data = result.content&lt;br /&gt;        memcache.add(url, data, CACHE_TIMEOUT)&lt;p&gt;&lt;/p&gt;def apiquery(url):&lt;br /&gt;     data = memcache.get(url)&lt;br /&gt;    if data is not None:&lt;br /&gt;        decoded_data = json.loads(data)&lt;br /&gt;        return lambda:decoded_data&lt;p&gt;&lt;/p&gt;    logging.debug(&quot;Cache miss for %r&quot;, url)&lt;p&gt;&lt;/p&gt;    rpc = urlfetch.create_rpc()&lt;br /&gt;     rpc.callback = lambda: cache_result(rpc, url)&lt;br /&gt;    urlfetch.make_fetch_call(rpc, url, method=urlfetch.GET)&lt;p&gt;&lt;/p&gt;    def answer():&lt;br /&gt;        result = rpc.get_result()&lt;br /&gt;        if result.status_code == 200:&lt;br /&gt;            data = result.content&lt;br /&gt;             return json.loads(data)&lt;br /&gt;        raise APIError, &quot;Broken!&quot;&lt;br /&gt;    return answer&lt;p&gt;&lt;/p&gt;&lt;/div&gt;With the above code I can now do something like:&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;margin-left: 40px; font-family: courier new,monospace;&quot;&gt; queries = [apiquery(url) for url in generate_api_queries()]&lt;br /&gt;for query in queries:&lt;br /&gt;    result = query()&lt;br /&gt;    ... # do stuff with result&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;span style=&quot;font-family: arial,helvetica,sans-serif;&quot;&gt;I don't really like the variable names I've used, but it's an interesting enough bunch of code linking together a few bits and pieces so I thought I'd throw it on my blog.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/21652080-6728651047607462851?l=shiny.thorne.id.au&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Stephen Jerub Thorne (noreply@blogger.com)</name>
			<uri>http://shiny.thorne.id.au/</uri>
		</author>
	</entry>

	<entry>
		<title>Twisted Matrix Laboratories: Sponsored Development, October 2011</title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TwistedMatrixLaboratories/~3/ZUh6SJsui1I/sponsored-development-october-2011.html"/>
		<id>tag:blogger.com,1999:blog-1267458971896358542.post-5903691958948302226</id>
		<updated>2011-10-25T18:28:42+00:00</updated>
		<content type="html">&lt;p&gt;I'm happy to report that I've just completed another two weeks of sponsored Twisted development.  As usual, the issue tracker directed most of my work.  I spent time on new development aimed at resolving tickets and I reviewed changes proposed by other developers with that aim.&lt;/p&gt;

&lt;p&gt;All told, 59 tickets got some attention that they would not have received without the sponsored development.  The result was 36 closed tickets and 17 other tickets unblocked for other developers to resume work on.  Over the coming days or weeks a few more tickets will probably be resolved as a result of this work, as developers (including myself) respond to review feedback.&lt;/p&gt;

&lt;p&gt;This work is made possible by the &lt;a href=&quot;http://twistedmatrix.com/trac/wiki/TwistedSoftwareFoundation&quot;&gt;sponsorship&lt;/a&gt; of individuals and organizations which have donated to the Twisted project, part of the &lt;a href=&quot;http://www.sfconservancy.org/&quot;&gt;Software Freedom Conservancy&lt;/a&gt;, a not-for-profit organization that helps promote, improve, and develop open source software.  Thanks!&lt;/p&gt;

&lt;p&gt;Apart from working to resolve tickets in the issue tracker, I also did some work on infrastructure.  I:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;cleaned up our BuildBot master configuration and &lt;a href=&quot;http://labs.twistedmatrix.com/2011/09/twisteds-buildbot-master-configuration.html&quot;&gt;published it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;implemented &lt;a href=&quot;http://twistedmatrix.com/pipermail/twisted-python/2011-October/024638.html&quot;&gt;improved error reporting&lt;/a&gt; for our API documentation build automation&lt;/li&gt;
&lt;li&gt;converted the subversion repository for the Twisted website to bzr and &lt;a href=&quot;https://launchpad.net/twisted-website&quot;&gt;made it public&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;moved some Windows build infrastructure to a new host with better network connectivity to try to reduce spurious build failures&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;For more details about a ticket, see &amp;lt;http://tm.tl/&lt;i&gt;NNNN&lt;/i&gt;&amp;gt;.&lt;/p&gt;

&lt;p&gt;The tickets I reviewed, with tickets now closed in bold:

&lt;/p&gt;&lt;div style=&quot;font-weight: bold;&quot;&gt;#78 - abortConnection() method for transports&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#2674 - t.i.defer.inlineCallbacks documentation issues&lt;/div&gt;
&lt;div&gt;#2675 - Test timeout policy should be decided by runner&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#3077 - twistd --help plugin list isn't alphabetized&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#3078 - Dynamic ZSH tab completion for any commands using t.p.usage&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#3350 - make each peer register as a producer in portforward&lt;/div&gt;
&lt;div&gt;#3453 - twisted.web._auth.digest mostly ignores the value of the uri field&lt;/div&gt;
&lt;div&gt;#3896 - Passing a unicode object to request.write corrupts the entire response&lt;/div&gt;
&lt;div&gt;#3926 - twisted.positioning -- a better positioning framework&lt;/div&gt;
&lt;div&gt;#4159 - Add pre-exec hook to spawnProcess&lt;/div&gt;
&lt;div&gt;#4519 - Delay parsing of request body until Request.args is accessed&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#4751 - t.c.telnet.ITelnetProtocol.unhandledSubnegotiation doesn't reflect reality&lt;/div&gt;
&lt;div&gt;#4849 - Add stream compression to twisted.words.jabber&lt;/div&gt;
&lt;div&gt;#5024 - MSI buildbot patches version to avoid breaking distutils MSI builder, but does it in the wrong place&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#5040 - twisted.web.template is lacking patterns&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#5044 - Client documentation should use explicit buildProtocol()s rather than magic &quot;protocol = MyProtocol&quot; on factories&lt;/div&gt;
&lt;div&gt;#5085 - Accept IPv6 address literals (with embedded scope ids) in IReactorTCP.connectTCP&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#5139 - Replace usage of os.path.walk in favor of twisted.python.filepath.FilePath.walk&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#5156 - no ambiguous antecedents (plugins documentation edition)&lt;/div&gt;
&lt;div&gt;#5192 - 100-continue support for twisted.web.client.Agent&lt;/div&gt;
&lt;div&gt;#5194 - log.msg can fail if someone removes an observer at the wrong time&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#5250 - finger15.tac patch&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#5252 - Manhole should support CTRL-A and CTRL-E for home/end&lt;/div&gt;
&lt;div&gt;#5253 - Add support for input history persistence in twisted.conch.manhole&lt;/div&gt;
&lt;div&gt;#5263 - add multipart/form-data support to twisted.web.client.Agent for easy form posts&lt;/div&gt;
&lt;div&gt;#5267 - allow twisted.internet.ssl.[Private]Certificate (and friends) to be backed with TLSLite rather than pyOpenSSL&lt;/div&gt;
&lt;div&gt;#5271 - trial test method timeout support is fragile&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#5275 - t.w.template does not always properly escape comments&lt;/div&gt;
&lt;div&gt;#5279 - pass mode to FilePath.createDirectory()&lt;/div&gt;
&lt;div&gt;#5282 - ILogObserver, log.msg, log.err, and logging.html are insufficiently stern about log observer thread safety&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#5283 - opt_user unused in manhole twistd plugin&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#5285 - win32eventreactor misses disconnect events that happen too soon&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#5286 - twisted.web.template documentation doesn't cover very basic use-case of rendering more than one of something&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#5288 - twisted.web.template.Tag.fillSlots documentation doesn't mention it returns self&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#5301 - test_tcp_internals.PlatformAssumptionsTestCase fails when we leak fds&lt;/div&gt;
&lt;div&gt;#5312 - Create some release automation for building Sphinx documentation&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;

&lt;p&gt;And tickets I developed:
&lt;/p&gt;&lt;div style=&quot;font-weight: bold;&quot;&gt;#581 - CopiedFailure.getTraceback should include the result of CopiedFailure.getErrorMessage even if unsafeTracebacks is not set&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#745 - writeSequence not well-tested&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;#1946 - ErrorHolder is basically untested&lt;/div&gt;
&lt;div&gt;&lt;b&gt;#2838 - _dumbwin32proc.Process does not implement IProcessTransport completely&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;#4603 - names should handle unknown records&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;#4666 - t.i.task.Cooperator scheduler objects must return an IDelayedCall&lt;/div&gt;
&lt;div&gt;#4671 - sometimes I want to have some constant values that are part of a set&lt;/div&gt;
&lt;div&gt;&lt;b&gt;#5040 - twisted.web.template is lacking patterns&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;#5062 - ProtocolWrapper masks the name of the wrapped protocol in the logs&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;#5075 - IntNStringReceiver copies too much data in dataReceived, causing AMP to be slow&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;#5140 - Deprecate twisted.scripts.tkunzip&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;#5158 - Installing on Pypy fails because of CPython-specific extension modules&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;#5233 - win32eventreactor doesn't notice TCP connection is lost in certain (hopefully rare) cases&lt;/div&gt;
&lt;div&gt;#5237 - Add SFTP example&lt;/div&gt;
&lt;div&gt;&lt;b&gt;#5273 - Improve the API documentation for MultiService.addService to clarify its use in comparison to Service.setServiceParent&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;#5278 - When connecting with endpoints, the application factory used is neither started nor stopped, and irrelevant start/stop messages are logged instead&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;#5285 - win32eventreactor misses disconnect events that happen too soon&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;#5291 - twisted.trial TestCase should support assertDictEqual from Python 2.7 unittest&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;#5292 - Listening ports used with wrapping factories could log better start messages&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;#5293 - Remove mktap and corresponding twistd options (mktap is broken in trunk)&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;#5299 - udp.Port schedules connectionLost call in the global reactor&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;#5303 - Default transport implementation doesn't write out bytes immediately&lt;/div&gt;
&lt;div&gt;&lt;b&gt;#5304 - Win32Reactor.spawnProcess is redundant&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;#5308 - Make UDP ports identify themselves when stopping&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;#5316 - Incorrect API link in twisted.web.proxy.Proxy docstring&lt;/b&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1267458971896358542-5903691958948302226?l=labs.twistedmatrix.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/TwistedMatrixLaboratories/~4/ZUh6SJsui1I&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Jean-Paul Calderone (noreply@blogger.com)</name>
			<uri>http://labs.twistedmatrix.com/</uri>
		</author>
	</entry>

</feed>

