<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2781337673308296390</id><updated>2011-12-24T20:15:25.763-05:00</updated><title type='text'>Jack Diederich's Python Blog</title><subtitle type='html'>What I'm working on in Python, tips, observations, stuff.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>76</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-2002432086231741174</id><published>2011-12-23T11:05:00.003-05:00</published><updated>2011-12-23T13:04:43.575-05:00</updated><title type='text'>PyCooooooonnnnn!</title><content type='html'>The &lt;a href=https://us.pycon.org/2012/schedule/lists/talks/"&gt;Talk schedule&lt;/a&gt; has been published and I'm on it.  For which I'm very greatful - I saw the full list of ~400 submissions and there were many I'd like to see which didn't make the cut. [To all those people I'll let you in on a secret: submit the same thing at a smaller conference.  They have 80%+ acceptance rates - basically they just toss out the crazies and let everyone else speak.  PyCon was like that not too long ago.  So go and speak wherever they will have you and get some practice: my first PyCon talk never would have been accepted under today's standards.]&lt;P&gt;&lt;br /&gt;&lt;B&gt;Name Dropping&lt;/B&gt;&lt;P&gt;&lt;br /&gt;Normally I'm a &lt;i&gt;Hallway Track&lt;/i&gt; kind of guy but there are some talks from friends I kinda want to see as it happens as an event: &lt;a href="https://us.pycon.org/2012/schedule/presentation/21/"&gt;Larry Hastings&lt;/a&gt;, &lt;a href="https://us.pycon.org/2012/schedule/presentation/44/"&gt;Doug Hellman&lt;/a&gt;, &lt;a href="https://us.pycon.org/2012/schedule/presentation/45/"&gt;Jeff Rush&lt;/a&gt;, &lt;a href="https://us.pycon.org/2012/schedule/presentation/58/"&gt;Benjamin Peterson&lt;/a&gt; (is he old enough to drink yet?), &lt;a href="https://us.pycon.org/2012/schedule/presentation/104/"&gt;David Mertz&lt;/a&gt;, &lt;a href="https://us.pycon.org/2012/schedule/presentation/114/"&gt;Moshe Zadka&lt;/a&gt; (long time/first time?), &lt;a href="https://us.pycon.org/2012/schedule/presentation/141/"&gt;Ned Batchelder&lt;/a&gt;, &lt;a href="https://us.pycon.org/2012/schedule/presentation/144/"&gt;Alex Martelli&lt;/a&gt;, &lt;a href="https://us.pycon.org/2012/schedule/presentation/196/"&gt;Barry Warsaw&lt;/a&gt;, &lt;a href="https://us.pycon.org/2012/schedule/presentation/241/"&gt;Dino Viehland&lt;/a&gt;, &lt;a href="https://us.pycon.org/2012/schedule/presentation/244/"&gt;Maciej/Gaynor/Rigo&lt;/a&gt; (pypy), &lt;a href="https://us.pycon.org/2012/schedule/presentation/246/"&gt;Armin Ronacher&lt;/a&gt;, &lt;a href="https://us.pycon.org/2012/schedule/presentation/384/"&gt;Glyph&lt;/a&gt; (I'll tell you his real name in trade for a beer), &lt;a href="https://us.pycon.org/2012/schedule/presentation/399/"&gt;Raymond Hettinger&lt;/a&gt;, &lt;a href="https://us.pycon.org/2012/schedule/presentation/429/"&gt;Gary Bernhardt&lt;/a&gt;, and  &lt;a href="https://us.pycon.org/2012/schedule/presentation/446/"&gt;Jim Baker&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And that's just the list of speakers I know will be good, there are many more that look good on paper that I want to see.&lt;br /&gt;&lt;p&gt;&lt;B&gt;You'd better nail it kid&lt;/B&gt;&lt;p&gt;&lt;br /&gt;There are some perennial talk topics because it is always nice to have a fresh take on important things.  That said, being the second (or third, or fourth) person to retread the same ground is difficult.&lt;br /&gt;&lt;br /&gt;Larry Hastings is treading old ground with &lt;a href="https://us.pycon.org/2012/schedule/presentation/21/"&gt;Stepping through CPython&lt;/a&gt;, a tour of what really happens when your python code runs.  I did it in 2006 as "Writing your own python types in C" and Ned Batchelder did it much better in 2009 as "A Whirlwind Excursion Through Python in C".  I'm looking forward to Larry's take.&lt;br /&gt;&lt;br /&gt;&lt;a href=https://us.pycon.org/2012/schedule/presentation/17/"&gt;Getting the most out of Python imports&lt;/a&gt; by Eric Snow.  Note that he speaking about imports and his name isn't Brett Cannon.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://us.pycon.org/2012/schedule/presentation/45/"&gt;The Magic of Metaprogramming&lt;/a&gt; by Jeff Rush and &lt;a href="https://us.pycon.org/2012/schedule/presentation/64/"&gt;Metaclasses&lt;/a&gt; by Luke Sneeringer.  Not just well tread ground, but ground always loaded with fresh landmines.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://us.pycon.org/2012/schedule/presentation/131/"&gt;Decorators and Context Managers&lt;/a&gt; by Dave Brondsema.  I'm very much looking forward to this one, as those things have been my topics in the last few years.  I haven't met Dave but I imagine he has giant brass balls.&lt;br /&gt;&lt;p&gt;&lt;B&gt;And the other thing&lt;/B&gt;&lt;P&gt;&lt;br /&gt;Raymond Hettinger will be presenting &lt;a href="https://us.pycon.org/2012/schedule/presentation/399/"&gt;The Art of Subclassing&lt;/a&gt; and I will be presenting &lt;a href="https://us.pycon.org/2012/schedule/presentation/352/"&gt;Stop Writing Classes&lt;/a&gt;.  Raymond and I have agreed on pretty much everything in the decade I've been involved with python (he was already a commiter when I showed up*).  I doubt we are in disagreement about classes or subclassing, rather we are giving talks about two different topics.  His is "here is how you do hard things well" and mine is "don't do hard things, they are hard and you'll probably fuck it up". Two weeks ago I wrote a caching class that used __new__ and this past week I refactored it to not do that;  the code was half the length and achieved the same result.  My only question to the team was "why did no one yell at me two weeks ago?"&lt;br /&gt;&lt;br /&gt;* My favorite PyCon story is my first one: 2003 in DC and I got to meet everyone that was previously just names on a mailing list.  Hettinger was working the registration desk and I was like "thats neat" and when I stepped out into the smoker's lounge I introduced myself to the three hangers about.  "Hi, I'm Jack Diederich" was followed by "Hi, I'm (Alex Martelli|Tim Peters|Christian Tismer)". That was awesome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-2002432086231741174?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/2002432086231741174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=2002432086231741174' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2002432086231741174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2002432086231741174'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2011/12/pycooooooonnnnn.html' title='PyCooooooonnnnn!'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-8482183723049843638</id><published>2011-07-11T23:54:00.004-04:00</published><updated>2011-07-12T00:27:35.917-04:00</updated><title type='text'>Analog Analogies</title><content type='html'>At work there has been a recent interest in explaining tech things in terms non-tech people can understand.  Not just because it helps explain tech things to non-tech people but because it also clarifies to &lt;i&gt;tech people&lt;/i&gt; what &lt;b&gt;the purpose of the thing is&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;We hit on the term "analog analogies" because one of my coworkers kept saying "analog" instead of "analogy" and I didn't think of the two terms as synonymous.  I thought of "analog" as opposite "digital", but not for a second did I think "analogue" was synonymous with "analog" (it is). Hence the redundancy.  So "analog analogies" became the phrase meaning "explaining a digital thing by analogy."&lt;br /&gt;&lt;br /&gt;By way of for example[1] I'll be leading off my five minutes at the Q3 kickoff with one of my favorite analog analogies: the high and low laundry equilibriums.  There are only two stable equalibriums in laundry: you can keep all your clothes clean and do laundry every time you have a basket of dirty, or you can have a full clothes hamper and only do a load when you need something to wear.&lt;br /&gt;&lt;br /&gt;It is a not terrible analogy for technical debt.  But the analogy falls down because even in a medium sized project you might have several different laundry equilibriums across different aspects: are we keeping a lid on our code bottlenecks?  backend queries?  can we rent/buy faster machines?  And the worst part is you might not know which is lacking.  I think the Germans have a word for how you know: messerschitz.  You gotta do that too.&lt;br /&gt;&lt;br /&gt;[1] I like to pretend to be all Dutchy on occasion.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-8482183723049843638?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/8482183723049843638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=8482183723049843638' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8482183723049843638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8482183723049843638'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2011/07/analog-analogies.html' title='Analog Analogies'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-158498073983863919</id><published>2011-06-05T21:27:00.002-04:00</published><updated>2011-06-05T22:26:45.297-04:00</updated><title type='text'>MUD Nostalgia</title><content type='html'>For programmers of a certain age - those who saw their first internet connection in the 90s - MUDs [Multi User Dungeons - basically D&amp;D online] were de rigueur.  Open Source was in its infancy and this new thing called linux came on a stack of 35 3.5" floppy disks (configuration was equally hostile).  So if you wanted to contribute to a collaborative project MUDs were where it was at.  A number of python people have outed themselves as [ex?]mudders, including Glyph (Twisted founder, Twisted started as a mudlib), Doug Napoleone (PSF board), Jesse Noller (PSF board), Richard Tew (Stackless Python), Will Kahn-Greene (Miro, and mud client Lyntin), and yours truly (I maintain telnetlib, need I say more?).&lt;br /&gt;&lt;br /&gt;Learning is in the doing, so what I got of college was mostly lots of free time to do stuff.  I spent maybe 400 hours in four years doing programming for classwork and over 4000 hours writing LPC code for a now defunt MUD* (using /bin/ed - the only supported editor).  Writing a mudlib was my "turtles all the way down" moment, when it clicked that user level programs were just programs that were composited from other programs;  The trick was that the lower level stuff had an agreed upon naming convention but otherwise wasn't special at all.&lt;br /&gt;&lt;br /&gt;I'll admit to being somewhat jealous of the college students of today - it is easy to contribute to projects that actually matter.   Being able to rely on ping times being under 500ms is nice too (Europe used to just _go away_, sometimes for days).&lt;br /&gt;&lt;br /&gt;I haven't left MUDing completely behind.  I still use it to try out new methodologies in coding and just play around in general.  Leanlyn (http://bit.ly/leanlyn) is my Lyntin fork that is about 10 years old and will never be finished (or be less than user hostile).  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* The dead mud was Ether Realms.  I can still be found sometimes at OverDrive (a Lehigh staple) and Three Kingdoms.&lt;br /&gt;** College came with lots and lots of free time. I spent way more than 4000 hours just chasing tail.  Imagine me but with shoulder length hair, an eyebrow ring, and a flannel shirt (it was the 90s)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-158498073983863919?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/158498073983863919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=158498073983863919' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/158498073983863919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/158498073983863919'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2011/06/mud-nostalgia.html' title='MUD Nostalgia'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-2782520116421121579</id><published>2011-03-16T21:33:00.005-04:00</published><updated>2011-03-16T22:04:57.607-04:00</updated><title type='text'>PyCon Speaking</title><content type='html'>Do read Moshe's &lt;a href="http://moshez.wordpress.com/2011/03/16/how-to-give-an-ok-talk-at-a-technical-conference-like-oh-say-pycon/"&gt;How to give an OK talk&lt;/a&gt;, esp the Narrative part.  It feels quite silly to repeat yourself on every slide but you are preforming live and not writing on paper - so tell the audience why slide N+1 is important and for the same reason as slide N at every opportunity.  During my talk I felt as though I was being overly repetitive, but on watching it after the fact I feel like I didn't hammer home the point enough (you should do more shit like this!).&lt;br /&gt;&lt;br /&gt;Speaking of speaking: I asked a few popular conference warriors (Martelli &amp; Hettinger) how many talks they had given and when they first felt comfy giving talks.  They didn't know.  I should have asked Beazely and C.T. Brown but they're professors and get more practice in a year than most people get in a lifetime.&lt;br /&gt;&lt;br /&gt;But seriously, those popular conference regulars didn't know.  Hettinger estimated he had spoken 30 times.  His wife then pointed out he did 15 talks last year and so he upped his estimate to "more than 15 twice."  Martelli estimated 50-100 talks but was equally uncertain.  Myself, I've only done 7-8 and still get nervous if the room is less than 30 or more than 300 people.  Hettinger said something like "I still get nervy when it the audience is 10x what I'm used to."  I couldn't coax an admission out of Alex (I had only vague thoughts on the topic when I asked, and no narrative).&lt;br /&gt;&lt;br /&gt;Take it all as paraphrased hearsay, but anytime I have to step up to a podium I just say to myself "suck it up, princess."  It mostly works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-2782520116421121579?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/2782520116421121579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=2782520116421121579' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2782520116421121579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2782520116421121579'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2011/03/pycon-speaking.html' title='PyCon Speaking'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-4771557848839279</id><published>2011-03-12T17:47:00.008-05:00</published><updated>2011-03-14T22:17:05.633-04:00</updated><title type='text'>PyCon Detritus</title><content type='html'>PyCon proper is over and sprints have begun.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Language Summit&lt;/h4&gt;&lt;br /&gt;The Summit was boring again this year, and this is good.  The language moratorium is over so PEP 380 ("yield from") is moving forward.  The stdlib will get its own repository so it can be shared between CPython/Jython/IronPython/PyPy.  Likewise all the commiters from the not-CPython projects will have commit privs to CPython (most already do).&lt;br /&gt;&lt;h4&gt;My Talk&lt;/h4&gt;&lt;br /&gt;&lt;b&gt;Useful Namespaces: Decorators and Context Managers&lt;/b&gt; went over well:  &lt;a href="http://goo.gl/fb/bSMfm"&gt;video available here&lt;/a&gt; and &lt;a href="https://convore.com/pycon-2011/useful-namespaces-context-managers-and-decorators-jack-diederich/"&gt;here's the live Convore thread&lt;/a&gt; from the talk.&lt;p&gt;&lt;br /&gt;Every year I say I'm not going to do another talk, but it is years like this that make it worthwhile.  Dozens of people I don't know have offered me thanks, jobs, free beer, and ZJs.  There is no worse feeling than spending 40 hours on something and having it be less than good.  I'm a happy camper.&lt;p&gt;&lt;br /&gt;The first question was asked by Larry Hastings ; it's become an inside joke because Larry has asked the first question at ALL my past PyCon talks (having a confederate to break the ice on questions is handy).  I zinged him a bit in my response ("thank you for pointing that out, and may I point out it's just an example slide");  apparently most people thought I was razzing a random questioner even though I was addressing him by name.&lt;p&gt;&lt;br /&gt;&lt;br /&gt;Another questioner objected to my use of a module named "UnicodeNazi" because it isn't nice to talk about Nazis even (or especially) jokingly.  I restated his objection and said he should take it up with the module's maintainer.  That maintainer is Austrian, natch.&lt;p&gt;&lt;br /&gt;&lt;br /&gt;The room was pretty full.  Not going out the night before definitely helped my delivery.  There were some A/V problems at the start (lots of those this year) so I rushed the last few slides.  Better that than running short though.&lt;br /&gt;&lt;h4&gt;Other People's Talks&lt;/h4&gt;&lt;br /&gt;So far, so good.  Yesterday my talk was in the afternoon so I spent all day preparing and didn't make any talks.  Today I went to three:  Alex Gaynor's "Python's Data Structures," Larry Hasting's "The Python That Wasn't," and Richard Saunder's "Everything You Wanted to Know About Pickling..."  Most of my time was consumed by the Hallway track.&lt;br /&gt;&lt;h4&gt;Hotel&lt;/h4&gt;&lt;br /&gt;The hotel has banned alcohol (or at least implied a ban) in public spaces that is not purchased from the hotel.  I don't know if this is because of money or just because they want fewer drunks walking around.  Annoying either way.&lt;br /&gt;&lt;h4&gt;Diverstiry&lt;/h4&gt;&lt;br /&gt;A woman came up to me and said that something I told her last year had stuck with her.  Last year she was sitting at a table with myself and another core dev, and holding her own when discussing eldrich corners of Python.  The topic turned to contributing to open source and she had a list of reasons she felt she couldn't contribute, none of them very good.  The good news is that she sprinted remotely last year, is sprinting in person this year, and has contributed code to projects over the past year.  Oh, and the thing I said that stuck with her?  "Suck it up, princess."  So I have struck a blow both for and against diversity. [FYI, I don't remember saying that but it is the kind of thing I might say after a few beers]&lt;p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-4771557848839279?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/4771557848839279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=4771557848839279' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4771557848839279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4771557848839279'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2011/03/pycon-detritus.html' title='PyCon Detritus'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-5383374344978349399</id><published>2011-02-26T18:08:00.003-05:00</published><updated>2011-02-26T18:28:52.660-05:00</updated><title type='text'>Happy PyCon to Everyone</title><content type='html'>I'm in the happy majority of Python commiters that mostly idle except for the scheduled holidays like bug weekends and release alphas, and only awake for the high holidays like PyCon.  I'll be speaking again this year and I'll be there for the language summit before and two days of sprinting afterward.&lt;br /&gt;&lt;br /&gt;This weekend I stopped researching my talk "Useful Namespaces" and started actually writing slides;  the theme is a riff on "Namespaces are one honking great idea -- let's do more of those!" and the first slide is "I monkey patch the shit out of everything."  Coincidentally I won't be sprinting 100% on core stdlib this year but will instead be trying to fix up my monkey patches and tests on other projects that haven't yet made it upstream.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-5383374344978349399?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/5383374344978349399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=5383374344978349399' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/5383374344978349399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/5383374344978349399'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2011/02/happy-pycon-to-everyone.html' title='Happy PyCon to Everyone'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-7451650465260097161</id><published>2010-09-24T16:48:00.002-04:00</published><updated>2010-09-24T16:50:56.028-04:00</updated><title type='text'>On Deployment Policy</title><content type='html'>Q: Don't we have a policy about drinking during deployments?&lt;br /&gt;A: Yes, we always drink during deployments.&lt;br /&gt;Q: I thought the policy was "Friends don't let friends deploy drunk?"&lt;br /&gt;A: If you can still type how drunk can you be?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-7451650465260097161?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/7451650465260097161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=7451650465260097161' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/7451650465260097161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/7451650465260097161'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2010/09/on-deployment-policy.html' title='On Deployment Policy'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-1226881002829359189</id><published>2010-04-08T12:48:00.002-04:00</published><updated>2010-04-08T12:59:35.033-04:00</updated><title type='text'>Encouraging Arbitrage in Virtual Economies</title><content type='html'>I'm always surprised by how different companies conduct interviews - I shouldn't be after being surprised so many times;  so my surprise at being surprised is surprising (to be all meta).  Today I had to give a talk to a group of devs on the topic of Anything.  I started out with snippets of my canned talks and then it diverged as people asked questions.  Anyway, it is a virtual goods company so here is the talk I &lt;i&gt;should&lt;/i&gt; have given, but the idea didn't hit me until I was in the car on the way home.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Encouraging Arbitrage in Virtual Economies&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Wikipedia &lt;a href="http://en.wikipedia.org/wiki/Arbitrage"&gt;defines arbitrage&lt;/a&gt; as&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;In economics  and finance, arbitrage is the practice of taking advantage of a price difference between two or more markets: striking a combination of matching deals that capitalize upon the imbalance, the profit being the difference between the market prices.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;So arbitrage is being the classic and much maligned middle-man: buy from one guy and then resell to another guy at a slightly higher price.  People hate middle-men because they seem to make money from doing nothing (they don't &lt;i&gt;make&lt;/i&gt; anything dammit!), but they serve the very useful function of smoothing out prices.  In return for their cut they &lt;i&gt;add information to the system&lt;/i&gt; and more information is a good thing.&lt;br /&gt;&lt;br /&gt;When there are a lot of people arbitraging a good you get more stables prices.  When there are several pawnshops close by you can bet that they will charge very similar prices.  You can walk into one and sell your iPod without doing research and be pretty sure you got a fair price.&lt;br /&gt;&lt;br /&gt;When there is competition the gap between what you get paid for that iPod and the price of buying one also shrinks.  This has huge ramifications because it basically allows you to rent items by buying them and then selling them back.  Need an ebook reader for the weekend? buy it today and sell it back on Monday for $10 less.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What this means for virtual economies&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In a heavily arbitraged market users can try out new things cheaply: instead of renting that ebook reader they can try out a FarmVille tractor or that fancy new Vorpal blade, safe in the knowledge that they can sell it back at a small loss.  Users like to do new things, so this is good.  Since arbitrage adds information to the system it also tells users what they should be doing.  They can see through prices what other users value and then do more of that.&lt;br /&gt;&lt;br /&gt;Note that I added some big qualifiers in there: heavily arbitraged, competition, a lot of people.  To get those things you need to make arbitrage as easy as possible.  You need a market that supports both &lt;a href="http://www.investopedia.com/terms/b/bid-askspread.asp"&gt;"bid" and "ask" prices&lt;/a&gt; so the gap is obvious even to casual users.  You also want as many people doing hard-core arbitrage as possible so give them as much information on past prices as possible in a very easy to use format.  I really can't emphasize that enough: I've ruined many in-game economies by &lt;i&gt;actively removing information&lt;/i&gt; from the system by say, buying up all the copies of an item.  Other people didn't have any current information on the prices, and the games didn't offer historical information so it was only me who had it.  This is possible even on sites that offer some historical information (Duels only listed the last N sales so I just sold to myself a bunch of times to clear the buffer).&lt;br /&gt;&lt;br /&gt;If you have a bunch of people doing this and the transactions only happen in-game you also have a ready made money sink.  Tax the transactions at X% and put the proceeds in /dev/null.  An interesting question is what that tax rate should be.  If it is high you get less arbitrage because there is no money to be made, and as a knock on the other users get less benefit because the cost of "renting" an item is higher.&lt;br /&gt;&lt;br /&gt;PS, on a python-related note: there are lots of python folks that care about this stuff in real life markets too.  Corner Hettinger or Glyph sometime when you have a few hours to spare.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-1226881002829359189?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/1226881002829359189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=1226881002829359189' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/1226881002829359189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/1226881002829359189'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2010/04/encouraging-arbitrage-in-virtual.html' title='Encouraging Arbitrage in Virtual Economies'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-4065210428607463783</id><published>2010-03-13T09:26:00.002-05:00</published><updated>2010-03-13T11:14:00.058-05:00</updated><title type='text'>Comparing the Ruby/PHP/Python C Interpreters</title><content type='html'>The other day I went poking around the Ruby and PHP interpreters (the current stable versions).  I hadn't looked inside PHP since the 4.x series and Ruby I had never checked out.  Like CPython the internals of both PHP and Ruby look something like their resulting language, but in C.  For each interpreter I just compiled it and looked at how core types and extension types were implemented.&lt;br /&gt;&lt;h4&gt;Ruby 1.9.1&lt;/h4&gt;&lt;br /&gt;Ruby-the-language has lots of syntax and its core types are just as extensible at run time as classes written in ruby (you can monkey patch core types).  The compile was clean and runs with -Wall, generating just a couple warnings.  All the unit tests passed. The grammar is implemented with lex/yacc and the resulting parse.c file took 10 minutes to compile on my 1.5GHz machine.  Did I mention the grammar is big?&lt;br /&gt;&lt;br /&gt;There is no difference between ruby core types and extension types written in C.  That is mostly true in python but ruby goes all the way.  The C-struct that holds information about the ruby type has a hash map that contains all the type's methods - and I mean all of them.  Here is the interface for adding a __add__ method (cBignum is the core integer type)&lt;br /&gt;&lt;br /&gt;rb_define_method(rb_cBignum, "+", rb_big_plus, 1);&lt;br /&gt;&lt;br /&gt;The "+" is the not-so-magic name for the addition operator.  The type's hash uses "+" as a key that points to the value of the addition function.  That is a beautiful interface compared to CPython, where you have to put the __add__ method in the right place in a struct[1].  As an optimization the "hash" is actually a list if the number of methods is small;  method strings are interned and assigned a number - I'm not sure why this is faster than just keeping the hashkey on the string and always using a dict, but I assume someone benchmarked it.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;PHP 5.2.13&lt;/h4&gt;&lt;br /&gt;[NB, I should have looked at the 5.3.x release but the 5.2.13 release was at the top of the homepage when I went looking]&lt;br /&gt;&lt;br /&gt;I hadn't looked at PHP since the 4.x series (see my &lt;a href="http://jackdied.blogspot.com/2008/01/in-beginning.html"&gt;why I started using Python&lt;/a&gt; post).  PHP has added some nice features since then, like namespaces, but the interpreter looks much the same.  The compile uses a custom wrapper around gcc and is very spammy: a dozen -I include directories on each line for hundreds of C files.  It does not use -Wall by default so if you want really really spammy turn that on.  After compiling PHP I ran the unit tests and 7 failed[2].  All 7 had to do with bad conversions between signed and unsigned numbers (a negative signed int is a positive unsigned int).  This is a production release so those failures are not confidence inspiring.&lt;br /&gt;&lt;br /&gt;Like PHP-the-language the C interpreter makes a big distinction between core types and extension types.  The core types are int, string, and list/hash (a hybrid).  The C-struct is a union that has is either an integer, string, list/hash, or "resource" (everything else).  Extension types can't do operator overloading so the interpreter has if/else clauses for handling the core types.  Methods are added by registering them by resource number in a global registry.&lt;br /&gt;&lt;br /&gt;Objects get passed around in the core as pointers to pointers, and sometimes as pointers to pointers to pointers.  I'm not sure why, but this can't be good for speed.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Python 2.5+ 3.x&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;I'll lump all releases of Python after 2.5 together because the internals are very similar.  The AST (abstract syntax tree) that the byte compiler uses was rewritten and simplified for the 2.5 release and there haven't been any big changes to the internals since then.  The 3.x releases made some big simplifications, but they still use the same framework.&lt;br /&gt;&lt;br /&gt;Like Ruby, Python compiles cleanly and uses -Wall, generating few warnings.  The test suite passes.  Python doesn't make a distinction between core types and extension types: if you copied Objects/dictobject.c and renamed it "mydict" [insert dict joke here] you could ship it as a module and "import mydict".  The only difference is that the byte compiler knows that when you type "d = {}" you mean "d = dict()".&lt;br /&gt;&lt;br /&gt;The C-struct for python types is a bit more complicated than the ruby one.  It has specific slots for all the magic methods like __add__ instead of keeping them in a hash map like it does for pure-python classes.  Like PHP the execution loop does have some if/elses for core types like integer, but unlike PHP this is just a speed hack and not a requirement (I assume Ruby does something similar).&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Conclusion&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;So there you have it.  All three interpreters look much like their parent language once you get under the hood.  I'd mention the perl interpreter too but it's been years since I dove into that one; but guess what?  It looks like perl.&lt;br /&gt;&lt;br /&gt;[1] python-dev has several threads about adding a similar simple interface.  Someone just has to do the work (at PyCon Hastings said he's exploring it).&lt;br /&gt;[2] I downloaded PHP 5.3.2 and the 7 test failures I saw are fixed, but I get 9 new and different failures.&lt;br /&gt;&lt;br /&gt;PS, blogger hates H4 tags.  Why the extra newline?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-4065210428607463783?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/4065210428607463783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=4065210428607463783' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4065210428607463783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4065210428607463783'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2010/03/comparing-rubyphppython-c-interpreters.html' title='Comparing the Ruby/PHP/Python C Interpreters'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-8351265142087175551</id><published>2010-03-05T23:22:00.002-05:00</published><updated>2010-03-05T23:32:56.940-05:00</updated><title type='text'>Some Odd Observations as a PyCon Speaker</title><content type='html'>1) Your answer to the first question after your talk will be simple, neat, and wrong.&lt;br /&gt;2) That question will have been asked by Larry Hastings.&lt;br /&gt;&lt;br /&gt;Extrapolation from my experience might fail in your particular circumstances because Larry isn't omnipresent. It might fail for my talks too: the pycon video archives only go back to last year.&lt;br /&gt;&lt;br /&gt;NB "wrong" in the sense of "less than optimally correct."   I included a fuller answer on my published slides both years.  Which no one will see.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-8351265142087175551?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/8351265142087175551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=8351265142087175551' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8351265142087175551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8351265142087175551'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2010/03/some-odd-observations-as-pycon-speaker.html' title='Some Odd Observations as a PyCon Speaker'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-2761822009696281132</id><published>2010-03-02T00:27:00.009-05:00</published><updated>2010-03-04T00:20:32.446-05:00</updated><title type='text'>PyCon Wrapup II: Python Stuff</title><content type='html'>[People stuff is trees-and-forest, so here is a post on what was done about Python at PyCon]&lt;br /&gt;&lt;br /&gt;The talks were good and the 5x (as opposed to 4x) tracks didn't seem to hurt.  Worst case: any talk you missed you can watch on &lt;a href="http://pycon.blip.tv/"&gt;pycon.blip.tv&lt;/a&gt;.  Speakers were aware that their talks would be recorded so using laser pointers (instead of highlights or spoken words) is going away.  This is a sideways move - laser pointers were useful right up until they weren't.&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;Language Summit&lt;/b&gt; was far more boring than last year.  Python 3.x issues are mostly settled from the core-dev standpoint so the big issues were &lt;a href="http://www.python.org/community/sigs/current/distutils-sig/"&gt;disutils&lt;/a&gt; (how, and at what level should python packages care about packaging) and alternate implementations.  &lt;a href="http://code.google.com/p/unladen-swallow/"&gt;Unladen Swallow&lt;/a&gt; was the talk of the town not because they are the first alternate implementation of Python but because they are the first implementation that plans to ship with benefits and no tradeoffs.  Did I say no tradeoffs?  It was unanimus that both disutils2 and Unladen Swallow would be integrated once the tradeoffs were wholly positive.  Who can't get behind that?&lt;br /&gt;&lt;br /&gt;PyCon sprints were smaller for python-dev this year but I couldn't tell if that was true for other major groups like Twisted and Django (the rooms were more broken up this year).  I can say for certain the python-dev sprint had both fewer regulars and fewer pure-newbies; One local EE postgrad wanted to help out and simultaneously tried to make me care that his badge and his name didn't match; He went by "Cedric" but his badge said something else (I believe he was Caribbean).  I have a long standing amusement with first names: my birth certificate doesn't say "Jack," Titus Brown's doesn't start with "Titus," and Alex Martelli's doesn't say "Alex."  For that matter Guido's may say "Guido" but he doesn't care how you pronounce it.  In fact all the groups I'm a participant and care about most don't care who you are legally, and don't ask for ID at the door (to riff on my last post, caring about legal ID is a "negative trust" cue).&lt;br /&gt;&lt;br /&gt;The PSF (Python Software Foundation) exists to serve two different classes of users: end-users and People-who-hire-end-users.  To put it differently the PSF is a single purpose organization that wants more users both from the bottom-up and top-down.  The bottom-up stuff has been easier to organize in the form of "your-locality-here" Cons.  While the PSF wants to help people to do more of that they also want to aid the corporate users who have an interest in Python.  Getting companies to spend money and organize sprints has happened quite successfully before, but very irregularly (see the &lt;a href="http://wiki.python.org/moin/NeedForSpeed"&gt;Need for Speed sprint&lt;/a&gt;).  Quite happily I can say that if half the events that were spit-balled at PyCon come to be then sprints will be even more prolific in the near future (both bottom-up and top-down) and they will be just as free but even more topic specific (2to3 porting, hardcore dev stuff).  At least four groups have intentions to do an event in Boston, for instance.&lt;br /&gt;&lt;br /&gt;The CPython bug tracker has 2000 outstanding issues (a mix of bug reports/feature requests/doc requests).  A new status field named "languishing" was added because there are a lot of bugs that have +1/-1 comments by core-devs but no resolution;  it is a classic "middle school dance"* deadlock where no-one feels they have authority and is just waiting for someone else to pronounce.  AMK and I closed about 20 of these during sprints (some applied, some rejected) but there are still a ton of these bugs outstanding.  They just need a champion (for or against) to get resolution.  Alex Gaynor recently did a post about who-gets-what-commit-rights on &lt;a href="http://alexgaynor.net/2010/feb/25/committer-models-unladen-swallow-pypy-and-django/"&gt;various python projects&lt;/a&gt; (not including python-dev).  Python-dev can be disfunctional because there are 120 committers and everyone assumes there is someone else who knows better for any particular bug (the "middle school dance").&lt;br /&gt;&lt;br /&gt;Steve Holden and Michael Foord both have the audio bug: imagine what camera crazy people spend on digital SLR gear but apply that to audio eq.  Between the two they captured tens of hours of audio at PyCon and some of that should start showing up soon.  Editing is the hard part in making raw into general interest so maybe four or five hours of that will appear for general publication.  The blackmail snippets are easy to produce; if any exists you've already received it and the adjoining demands (Foord sensibly priced his at slightly less than a trans-Atlantic plane ticket; Holden has yet to publish a price list).&lt;br /&gt;&lt;br /&gt;* "middle school dance" is comp-sci jargon for a deadlock where party A is waiting for party B to do something and the reverse.  The allusion is to boys standing on one side of the gym waiting for the girls to ask them to dance and the girls standing on the other side, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-2761822009696281132?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/2761822009696281132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=2761822009696281132' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2761822009696281132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2761822009696281132'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2010/03/pycon-wrapup-ii-python-stuff.html' title='PyCon Wrapup II: Python Stuff'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-1011922248339421993</id><published>2010-02-26T20:48:00.005-05:00</published><updated>2010-02-27T00:08:49.104-05:00</updated><title type='text'>High Trust, High Responsibility Communities</title><content type='html'>[This is a blog version of a lightning talk I didn't give at PyCon]&lt;br /&gt;&lt;br /&gt;People Hacking is as old as time, and every long lasting organization engages in it.  One example of hacking people (and the title of this post) is to tell people you trust them.  This "trust cue" invites reciprocity -- people behave well because you've signaled that you expect them to.  Google's "don't be evil" motto works this way; the company has promised the outside world that it should be trusted so internal employees feel pressure to live up to the promise.&lt;br /&gt;&lt;br /&gt;You can do the opposite and tell people that you don't trust them ["negative trust cues"] and people being people their behavior is predictably cautious and non-cooperative.  I once worked for an ex-DEA prosecutor and to put it mildly the employer-employee relations weren't stellar.&lt;br /&gt;&lt;br /&gt;The Python community has many positive trust cues going for it.  The coding end is open source so everyone is a volunteer by definition, and volunteering for anything is a positive trust cue.  Likewise PyCon introduces people face-to-face and having met someone as a real-live-person (even once!) invites an obligation to be more forgiving in the sterile world of email and bug trackers (was he being a dick or just having a bad day?  I've met him, must have been a bad day).  I got my commit bit after never having one of my many patches to CPython accepted*, but curiously not long after I met the guy who had rejected them (Raymond Hettinger, who was working the registration desk when I checked in). &lt;br /&gt;&lt;br /&gt;I am/was a member of a large number of long standing volunteer orgs (most are fraternal**) and have seen many variations on trust cues: the big ones are the Boy Scouts, Habitat for Humanity, the Kappa Alpha Society, and the Free Masons.  None are as old or put as high an emphasis on trust cues as the Masons - everything is setup to do charity and avoid conflict.  It is prohibited to drink before/during meetings***, discuss politics, or discuss religion.  The taboos are so strong that there aren't legal punishments for violating them - you are trusted not to violate them so (by reciprocity) no one does.  Very few of the members are half as smart as the average lunch table at PyCon, but it is impossible not to like the members of my lodge because every time I see them they are &lt;i&gt;doing charity&lt;/i&gt;: giving blood, contributing to food banks, etc.  The trust cues are through the roof (one side effect of that is a very high attrition rate -- people quit because the activities are quite stolid and boring).&lt;br /&gt;&lt;br /&gt;So the Python community in general and PyCon in particular inculcate positive trust cues (when was the last time your saw a post titled "PyCon sucked?" never).  That said, I ran away from the python-d7y list because it was so loaded with negative trust cues.  See &lt;a href="http://pycon.blip.tv/file/3261290/"&gt;Anna Ravenscroft's PyCon2010 talk&lt;/a&gt; for very healthy ways to promote positive trust cues and eschew negative ones.  The topic mandated the  opposite of the "no politics, no religion" of my other, more boring, org and the results were predictable.  The d7y list was mostly harmless but 5% of the talk was by people that had no skin in the game (and hence no expectation of kindness or reciprocity).  To be vague and ablative the demands of the 5% was a laundry list of negative trust cues: censorship, name-and-shame, and other minor atrocities.  As a result most discussion of the list actually took place off the list because plain discussion on the list was impossible (par exemplar was one of the moderators emailing me off-book "I wish I could +1 but I can't.  We need a new list.").&lt;br /&gt;&lt;br /&gt;In closing the Python community exploits human nature in the form of trust == responsibility pretty well.  I am happy to be exploited thusly because I'm human and it tickles my humanity.  Assign bugs to me and - if I've met you or have met someone who has met you - I'll be quick to close it with a more delicate comment than otherwise.&lt;br /&gt;&lt;br /&gt;* My patches weren't bad or wrong, they just weren't enough of a speed boon considering the maintenance overhead to be added to the stdlib.&lt;br /&gt;** I have three brothers and no sisters so that's where I'm at ease.  Though until recently (last century) "fraternal" meant "brotherhood of man" instead of the narrower "male only" so there still exist some mixed sex and female-only orgs that have "fraternity" in the name.&lt;br /&gt;*** The "no booze" is very unusual for voluntary associations in the US.  Most clubs have a members only bar that is the major fundraiser for the org. For instance, when I lived in Pennsylvania I was a social member of the King of Prussia Volunteer Fire Company - I was one of the thousand members who didn't fight fires but paid $30/year for my membership card (you needed to be nominated by an actual fire-fighter to join but like most orgs this was a technicality -- they were mainly interested in keeping out people who couldn't find one related person to say something nice about them)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-1011922248339421993?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/1011922248339421993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=1011922248339421993' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/1011922248339421993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/1011922248339421993'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2010/02/high-trust-high-responsibility.html' title='High Trust, High Responsibility Communities'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-4768155519730724232</id><published>2010-02-24T12:21:00.003-05:00</published><updated>2010-02-25T02:12:17.061-05:00</updated><title type='text'>PyCon Wrapup</title><content type='html'>Here are my assorted thoughts on PyCon this year.  Long story short: Marvelous.&lt;br /&gt;&lt;br /&gt;The Atlanta location was actually in downtown Atlanta and not like the Chicago or Dallas PyCons where it was hosted nearer the airport than the city itself.  There were dozens of restaurants and bars at every price-point within walking distance, and even more than that if you took the train a few stops.  My favorites were the cheap local places like the Vietnamese soup joint (via Titus Brown) and the chili cheese dog joint (via Larry Hastings).  I liked the high price steak joints too, but you can get good food anywhere so it's less of a kick.  Now that we have some institutional knowledge about eating in Atlanta I expect to eat even better next year.&lt;br /&gt;&lt;br /&gt;The conference organizers, program committee, and network guys all did a perfect job this year.  You won't hear about it much because when things "just work" there is nothing to talk about.  As an anecdote about how well things were setup: during sprints one developer was loading up his computer with video because the 'net download speed was better than he could get at home over fiber.  Another anecdote: during sprints a different conference was coming in and had signs that listed our sprint rooms as part of their conference venue;  I know nothing about the particulars but there was a flurry of panicked activity and the situation was handled.&lt;br /&gt;&lt;br /&gt;Labor must be cheap in Atlanta because every business had more employees per square foot than I've seen in any other American city - including many Southern ones.&lt;br /&gt;&lt;br /&gt;Flying sucks.  While PyCon-qua-PyCon wouldn't be possible without cheap flights (trans-Atlantic esp) I would really have liked a heads-up that I would be stuck in Philadelphia for five hours.   I could have called up some kith &amp; kin and hit the downtown instead of sitting in the terminal for a dog's age.&lt;br /&gt;&lt;br /&gt;I mostly got to talk to the people I wanted to see but haven't seen since last year (including the other Boston locals).  I also met some new and interesting folks.  Unfortunately one week isn't enough to do &lt;i&gt;enough&lt;/i&gt; of both no matter how little sleep you get; but I'm pretty happy with the results.&lt;br /&gt;&lt;br /&gt;A big shout-out to &lt;a href="http://www.ccpgames.com/"&gt;CCP games&lt;/a&gt;.  They have an Atlanta office so an even bigger chunk of the Iceland office was at PyCon than usual.  I met their Atlanta marketing director who is the guy who behind the &lt;a href="http://en.wikipedia.org/wiki/2007_Boston_bomb_scare"&gt;viral marketing cum bombscare&lt;/a&gt; for ATHF a few years back.  Good to see he landed on his feet.  The CCP guys are a big reason why I slept very little, and happily so. Allow me a semi-related shout-out to Mr &amp; Mrs Wayne &amp; Wendy Witzel;  I met them at a 'con or two ago, and Wayne volunteered as my session chair this year.  They are both big EVE players and know Reykjavik better than I do (I don't know much).  [Also, her name is not "Wendy" which I have been told repeatedly but refuse to acknowledge.  It &lt;i&gt;should be&lt;/i&gt; Wendy, dammit.]&lt;br /&gt;&lt;br /&gt;Every secret project tried to do a release in time for PyCon, or so it seems.  Some of the company ANNs include &lt;a href="http://saucelabs.com/"&gt;Sauce Labs&lt;/a&gt; and &lt;a href="http://www.nasuni.com/"&gt;Nasuni&lt;/a&gt;.  Additionally the conference was a big bag of leaky secrets so expect more announcements quite soon (I'm not contractually obligated to not-say but I will so as to not blunt their PR).  &lt;br /&gt;&lt;br /&gt;Sprints were smaller this year than last, especially python-dev.  The sprint rooms at late night were also less, umm, vigorous than in past years.  Sprints are still ongoing but for the first few days, when I was there, I can say there were zero card games played.  Not holdem, not asshole, not set, not nothing.&lt;br /&gt;&lt;br /&gt;I normally don't ask about late night sprint activities out of a sense of propreity, but I'll make an exception in this case.  Was anyone around circa 3am on Wednesday?  I have a lump on my head and I'm somewhat curious about its origins.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-4768155519730724232?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/4768155519730724232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=4768155519730724232' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4768155519730724232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4768155519730724232'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2010/02/pycon-wrapup.html' title='PyCon Wrapup'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-7074817452059490601</id><published>2010-02-16T17:02:00.002-05:00</published><updated>2010-02-16T18:01:02.867-05:00</updated><title type='text'>PyCon Prep</title><content type='html'>If you are giving a talk take the time to watch AMK's &lt;a href="http://pycon.blip.tv/file/1947177/"&gt;How to Give a Python Talk&lt;/a&gt;.  I posted &lt;a href="http://jackdied.blogspot.com/2009/04/speaking-about-speaking.html"&gt;some thoughts on speaking&lt;/a&gt; last year too.  For anyone attending: go listen to &lt;a href="http://www.voidspace.org.uk/python/weblog/arch_d7_2010_02_06.shtml#e1157"&gt;the Pre-PyCon podcast&lt;/a&gt; where several regular PyConers give a conference HOWTO.  It features some solid advice such as "accept the first dinner invitation you get" to which I'd add my favorite "eat lunch at a table with no one you know."  It is easy to get insular especially for repeat speakers* and/or python-devs so the lunch rule helps me break out of that.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Finalize my talk and cut to length.  "Finalize" is a bit of a joke because I tend to rewrite it every time I do a practice run.  My talk last year got rewritten in the wee hours the night before I gave it too.  Cutting to length isn't much of a problem;  If you've done many rewrites and know how many slides you have you can adjust how much you talk about each slide on-the-fly.  Relatedly, I'm impressed by the people that give just the talk they rehearsed - it's something I can't do.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Load up my Kindle.  I'm not much of a gadget guy - I wear a watch and carry a pocket knife (I'm down to my last one, @#*@$^ TSA).  The Kindle is a gift that I haven't had a chance to use because I don't travel much.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Load up my laptop.  I rarely turn it on because my home office has three nice LCDs so I need to 'svn up' all the python trees and pull some bzr repositories for other projects. (I guessed wrong and started using bzr before Python announced the switch to mercurial).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Get my home network in order.  I need to open up an ssh port so I can tunnel over a secure connection at the con.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Work on my lightning talks.  I'm not 100% sure these will happen but be on the lookout for "High Trust, High Responsibility Communities" and "The Physics of Bowling."  The community one will not include farkers, goons, or /b/tards but in my research I did come across &lt;a href="http://terranova.blogs.com/terra_nova/2007/02/what_is_emergen_1.html"&gt;this interesting article about EVE Online&lt;/a&gt; (EVE uses python heavily and always sends a contingent to PyCon) which includes a player .sig "You may be playing EVE Online, but be warned: we are playing Something Awful."  My talk is about hacking people via trust cues and what does and doesn't work in some all-volunteer groups I'm in (Python-dev and Masons feature heavily).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;No beta-blockers, again.  I keep meaning to use performance enhancing drugs when I talk (beta-blockers are used by &lt;a href="http://media.www.smithsophian.com/media/storage/paper587/news/2009/04/16/Features/Nervous.No.More.Beta.Blockers.Quell.Anxiety-3711643.shtml"&gt;concert violinists to quell the symptoms of stress&lt;/a&gt; during performances) but never bother to procure them.  Instead I just forgo coffee the day of my talk, which kinda sucks.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;No mustache, again.  I enjoyed it but it was a one time thing.  Anecdotally: people who know you without facial hair have a hard time recognizing you with it.  The opposite is not true: people who know you with facial hair have no problem recognizing you shaved.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;* Jack's Rule of Badges: If two people in a group have speaker's badges then &lt;i&gt;everyone&lt;/i&gt; in the group will have speaker's badges.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-7074817452059490601?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/7074817452059490601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=7074817452059490601' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/7074817452059490601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/7074817452059490601'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2010/02/pycon-prep.html' title='PyCon Prep'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-9035097774224738720</id><published>2010-02-04T00:15:00.003-05:00</published><updated>2010-02-06T14:08:41.521-05:00</updated><title type='text'>PyCon on the Charles, Night 2</title><content type='html'>50+ members of the Boston Python Local turned out for &lt;a href="http://python.meetup.com/181/calendar/12189588/"&gt;PyCon on the Charles, Night 2&lt;/a&gt;; a dress rehearsal for PyCon speakers from the Boston area.  Ned did an informal survey of the audience and 1/3rd will be at PyCon proper.  I did an even more informal eyeball survey of the audience and 20% had beards and 10% were women (the groups were mutually exclusive).  Only 2% of the attendees brought cookies and I would have berated her for reinforcing gender stereotypes but I was too busy thanking her for the oatmeal cookies with chocolate chips.&lt;br /&gt;&lt;br /&gt;Peter Portante led off with his talk "The words 'Non-Blocking' and 'Asynchronous' Are Not Synonyms and Here's Why" (I paraphrase) which started with examples of documentation that use the terms synonymously and then detailed how they the two concepts are, in fact, different.  The talk is a broad tour of what one thing means versus the other as well as who-owns-what as far as kernel-vs-userpace goes.  Peter also footnoted the hell out of it so if you want to learn the difference between select(), epoll(), and kqueue() you can.&lt;br /&gt;&lt;br /&gt;Glyph gave a beta* of his talk "Turtles All The Way Down" (not a paraphrase).  The title references the fact that python behaves in unsurprising ways by design.  His explicit goal wasn't to explain how all the "Python's Dusty Corners" work but to hammer home that what even a python newbie knows mostly holds up in strange, dark places because python's authors and maintainers are learned refugees from other camps that publish tomes like the "C++ FAQs (3rd ed)."&lt;br /&gt;&lt;br /&gt;Gylph's talk was of particular interest to me because he's talking about &lt;i&gt;the same damn topic&lt;/i&gt; as I am and in the same time slot.  Thankfully the world is a big place so his talk is also &lt;i&gt;completely different&lt;/i&gt;.  This is my 7th PyCon so I've seen many topics repeated and I'm always pleasantly surprised by how differently the same material is presented by different people; part of it is personality, part of it is style, and part of it is voice.  I, for one, would pay to listen to Alex Martelli read a phonebook.&lt;br /&gt;&lt;br /&gt;Antonio Rodriguez gave an alpha of his keynote address.  Keynotes are fun because they get to give BIG BOLD AVDICE.  Hyperbole is fun because like advice from your father things need to be said twice as loud because you'll only follow half of it.  The alpha talk was 3x as loud as necessary but I think he'll trim it down to the keynote normal of 2x based on feedback (and some topics will get moved to the Language Summit instead).&lt;br /&gt;&lt;br /&gt;Edward Abrams debuted his "DJ-ing in Python: Audio processing fundamentals" talk.  It is an industy talk/python success story.  Not my favorite milieu but industry talks do a good job of highlighting tools and best practices.  Abrams gave a brief overview of why audio manipulation is hard followed by a list of which python tools he used to solve his problems.  NumPy and threads (for I/O) were featured heavily.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* version 6beta2 if his intro slide is to be believed&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-9035097774224738720?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/9035097774224738720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=9035097774224738720' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/9035097774224738720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/9035097774224738720'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2010/02/pycon-on-charles-night-2.html' title='PyCon on the Charles, Night 2'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-1185361916367824490</id><published>2010-01-21T00:13:00.002-05:00</published><updated>2010-01-21T19:04:53.058-05:00</updated><title type='text'>PyCon on the Charles</title><content type='html'>The first three Boston PyCon speakers spoke last night at &lt;a href="http://python.meetup.com/181/calendar/12189514/"&gt;PyCon on the Charles, Night I&lt;/a&gt;.  NB: If you are near Boston do show up on Feb 3rd for &lt;a href="http://python.meetup.com/181/calendar/12189588/"&gt;PyCon on the Charles, Night II&lt;/a&gt; with Glyph Lefkowitz, Peter Portante, and Edward Abrams. &lt;p&gt;&lt;br /&gt;Francesco Pierfederici did a "python success story" industry talk on using a mix of Python and Fortran-77 (via the "ctypes" module) to eat terabytes of telescope image data in real-ish time - the requirements include picking out &lt;i&gt;all new&lt;/i&gt; asteroids from the thousands of known moving objects during the 60 second window before the next 3giga-pixel image arrives.  Approximating thousands of N-Body problems in limited time is a challenge, and that's Francesco's job.&lt;p&gt;&lt;br /&gt;&lt;a href="http://nedbatchelder.com/blog/"&gt;Ned Batchelder&lt;/a&gt; gave his talk "Go Easier on Yourself: You don't test enough and the reason you don't test enough is because you don't write easily testable code."  With good examples.  No, &lt;i&gt;great examples&lt;/i&gt;.  Ned is an invited speaker this year because he is concise.  His &lt;a href="http://nedbatchelder.com/text/whirlext.html"&gt;talk from last year&lt;/a&gt; covered the same topic I have talked on before and I kept thinking "He didn't mention X" followed by "I should have omitted that too."&lt;p&gt;&lt;br /&gt;My talk on "Python's Dusty Corners" earned it's more accurate original twitter title "Strange Python Shit."  I scrapped my originally planned "overview of everything" and 1000-slide opus that covered comparisons, descriptors, namespace lookups, and context managers.  I had to because that morning I tried to put all my well researched and thoroughly unit-tested examples into power point and it came out at .. I stopped kidding myself at 40 slides and gave up.  Instead I threw up the bullet point slides on what I had and just tried to talk extemporaneously; The result was about 10 minutes of speaking and 30 minutes of Q &amp; A. This suits me just fine - as I said about Vilnius (host of EuroPython 2008) "I love this town, it is unkempt but not ruinously so."&lt;p&gt;&lt;br /&gt;Most questions boiled down to asking &lt;i&gt;for what purpose&lt;/i&gt; this "strange python shit" existed and why the stuff didn't seem more useful in the generic:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;   Guy: what good is [protocol X] other than that it makes it easy to implement [core python feature Y]?&lt;br&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;The answer was usually "none" which is a compelling story by itself.&lt;p&gt;&lt;br /&gt;Based on feedback my final talk will include more graphics (arrow pointing at the dot in "foo.bar") and include a description of &lt;i&gt;why&lt;/i&gt; magic can happen (and why it rarely does!) at the dot.  My original code examples that implement the various features like instance lookup in pure python will end up on a blog or wiki once I get them formatted.  They were way too long to fit on a slide but about right for a web tutorial.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-1185361916367824490?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/1185361916367824490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=1185361916367824490' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/1185361916367824490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/1185361916367824490'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2010/01/pycon-on-charles.html' title='PyCon on the Charles'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-3460534677804922346</id><published>2010-01-16T11:40:00.003-05:00</published><updated>2010-01-16T12:27:03.264-05:00</updated><title type='text'>PyCon Plans</title><content type='html'>My flight is booked, I'm registered, and I have otherwise been pushed, filed, stamped, indexed, briefed, debriefed and numbered*.  I'll be there for the Language Summit through two and a half days of sprints.&lt;br /&gt;&lt;br /&gt;My "Python's Dusty Corners" talk is coming along.  I'll be giving a version of it next week at the Microsoft NERD Center (the too-clever acronym for their "New England Research &amp; Development" house) at the first night of the &lt;a href="http://nedbatchelder.com/blog/201001/pycon_on_the_charles_part_1.html"&gt;PyCon on the Charles&lt;/a&gt; PyCon dress rehearsal.  The talk still lacks a strong narrative - "things you might not know about python" is too loose for my tastes.  I'll be polling the audience after to pick their favorite bits which will hopefully allow me to narrow the talk to one of two narratives:&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Here is a feature that you don't know about and here is what it looks like when a lib/framework &lt;i&gt;does&lt;/i&gt; use it and throws an error.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Here are all the ways that attribute lookup can be magic.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;.. but if the audience feedback is that a hodge-podge of decorators, protocols, and namespace lookups &lt;i&gt;actually is&lt;/i&gt; the interesting story I'll stick with that.&lt;br /&gt;&lt;br /&gt;The conference organizers owe me some free drink tickets: &lt;a href="http://spreadsheets.google.com/pub?key=t4SBtBV9Qi0pHXHOUAc83Aw&amp;gid=25"&gt;The schedule is up&lt;/a&gt; and I have a good time slot (afternoon on the middle day) but I'm up against Glyph's "Turtles All the Way Down" talk.  Hell, &lt;i&gt;I&lt;/i&gt; want to see that talk.  Thankfully I can because Glyph is giving a version at &lt;a href="http://python.meetup.com/181/calendar/12189588/"&gt;PyCon on the Charles night II&lt;/a&gt;.  Feast and famine: I lucked out last year and had a packed talk because Bruce Perens was scheduled to give a keynote on the exact same topic as my talk (thus priming the pump) but then had to pull out at the last moment due to injury.  Does Glyph ski? I'll have to ask him.&lt;br /&gt;&lt;br /&gt;Be seeing you,&lt;br /&gt;&lt;br /&gt;-Jack&lt;br /&gt;&lt;br /&gt;* "The Prisoner" remake was terrible.  I disliked it so much I felt the need to &lt;a href="http://jackdied.com/article/1040"&gt;write about it&lt;/a&gt; on my non-python blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-3460534677804922346?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/3460534677804922346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=3460534677804922346' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/3460534677804922346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/3460534677804922346'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2010/01/pycon-plans.html' title='PyCon Plans'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-7158310618340531171</id><published>2009-12-30T12:45:00.006-05:00</published><updated>2010-01-06T21:45:37.993-05:00</updated><title type='text'>A Glimpse of PyCon in Your Hometown</title><content type='html'>As in past years local Python user groups are hosting PyCon speakers to give their talks in a dress rehearsal before PyCon.  It is good for the speakers, good for the local user groups, and good for PyCon (more polished talks!  I did a teardown/rewrite of my talk last year based on Boston PIG feedback).  Here are three dates I know of with locations and speakers:&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Toronto, Feb 16, Linux Caffe&lt;/h4&gt;&lt;br /&gt;* Leigh Honeywell: Think Globally, Hack Locally - Teaching Python in Your Community&lt;br /&gt;* Greg Wilson: What We've Learned From Building Basie&lt;br /&gt;* Mike Fletcher: Debating 'til Dawn: Topics to keep you up all night&lt;br /&gt;&lt;h4&gt;Boston, Jan 20, Microsoft NERD center&lt;/h4&gt;&lt;br /&gt;* Francesco Pierfederici: Python for Large Astronomical Data Reduction and Analysis Systems&lt;br /&gt;* Jack Diederich: Python's Dusty Corners&lt;br /&gt;* Ned Batchelder: Tests and Testability&lt;br /&gt;* [added] Antonio Rodriguez: preview of his Keynote&lt;br /&gt;&lt;h4&gt;Boston, Feb 3, Microsoft NERD center&lt;/h4&gt;&lt;br /&gt;* Peter Portante: Demystifying Non-Blocking and Asynchronous I/O&lt;br /&gt;* Glyph Lefkowitz: Turtles All The Way Down: Demystifying Deferreds, Decorators, and Declarations&lt;br /&gt;* Edward Abrams: DJing in Python: Audio processing fundamentals&lt;br /&gt;&lt;h4&gt;Seattle, Jan 30, Paul Allen Center&lt;/h4&gt;&lt;br /&gt;[added from &lt;a href="http://seapig.org/"&gt;Seattle PIG&lt;/a&gt; in the comments]&lt;br /&gt;* Speakers TBD&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The Toronto announcement is &lt;a href="http://pygta.mylesbraithwaite.com/2010-02/pycondress/"&gt;here&lt;/a&gt; and though Boston hasn't been officially announced it was organized by &lt;a href="http://nedbatchelder.com/blog/"&gt;Ned Batchelder&lt;/a&gt; this year (he organized last year's "PyCon on the Charles" too).&lt;br /&gt;&lt;br /&gt;I'm happy to see Boston back up in the rankings with six talks this year.  I intend to fully [ab]use my slot by briefly highlighting all the "dusty corners" (all the __method__ methods and object protocols) and then, based on feedback, expanding on just a subset for PyCon proper.  The opportunity to see talks beforehand is a boon;  you can see a talk NOW and free up a slot during PyCon and you can also see talks that you would otherwise skip altogether (I saw a great talk last year that I wouldn't have picked based on the printed program's blurb).  And of course you can get ahead on your "hallway track" by catching up with people a month ahead of time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-7158310618340531171?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/7158310618340531171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=7158310618340531171' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/7158310618340531171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/7158310618340531171'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/12/glimpse-of-pycon-in-your-hometown.html' title='A Glimpse of PyCon in Your Hometown'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-4351773569782750859</id><published>2009-10-05T20:28:00.003-04:00</published><updated>2009-10-05T21:05:12.692-04:00</updated><title type='text'>Cthulhu and Python</title><content type='html'>Andrew Kuchling broached the topic on twitter so I think that makes it fair game.&lt;br /&gt;&lt;br /&gt;For those of you who don't know H.P. Lovecraft wrote the short fiction horror story &lt;a href="http://en.wikipedia.org/wiki/The_Call_of_Cthulhu"&gt;The Call of Cthulhu&lt;/a&gt; in 1926.  The story would only become popular much later, and only in recent decades it has been every sci-fi writer's rite of passage to embellish and extend the genre.  It is to those authors what &lt;a href="http://en.wikipedia.org/wiki/The_Aristocrats_%28film%29"&gt;The Aristocrats&lt;/a&gt; joke is to stand-up comedians - everyone tries to take the same idea and make it their own.  Like &lt;i&gt;The Aristocrats&lt;/i&gt; the &lt;i&gt;Cthulhu Mythos&lt;/i&gt; is widely pursued because it is opened ended (inviting mutations) and nobody gets sued for riffing on it.&lt;br /&gt;&lt;br /&gt;There are some sci-fi authors that routinely include Python in their fiction.  Charlie Stross is one of those;  as it happens at a PyCon I was chatting with a developer who was extolling Stross's work (his girlfriend happened to be DoD and working on a counter virus predicted by Stross and which Stross named in his book after a &lt;a href="http://www.absoluteastronomy.com/topics/I_Am_Curious_%28Yellow%29"&gt;1967 experimental Swedish soft-core movie&lt;/a&gt;).  I had recently read and enjoyed Stross's short variation on the Cthulhu mythos &lt;a href="http://www.infinityplus.co.uk/stories/colderwar.htm"&gt;A Colder War&lt;/a&gt; (in which Ollie North and Reagan damn us all to Hell using not nukes, but instead weakly godlike beings) and I've been a Stross fan ever since.&lt;br /&gt;&lt;br /&gt;Charlie has featured python-3000 in his last couple books, the first of which was put out when py3.0 was just a joking reference.   His politics are plain enough (though Scottish he's more of a Fabian Socialist) but his writing is tight so the occasional implausibilities (python dominates the world; the US economy becomes third world in ten years) are forgivable.&lt;br /&gt;&lt;br /&gt;I would have tiwttered all that, but the medium doesn't allow it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-4351773569782750859?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/4351773569782750859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=4351773569782750859' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4351773569782750859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4351773569782750859'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/10/cthulhu-and-python.html' title='Cthulhu and Python'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-4919497190679101005</id><published>2009-09-30T21:10:00.003-04:00</published><updated>2009-09-30T22:36:44.663-04:00</updated><title type='text'>My PyCon 2010 Talk</title><content type='html'>My talk is tentatively titled "Python's Dusty Corners."*  It will be a brief overview of all the features in python that you don't need to know about right up until the moment you do.  The list includes how comparisons work, descriptors, iterators, context managers, namespaces, else clauses on for/while loops (suggested by Hettinger), and whatever else you can suggest in the comments (please do!).  The narrative of the talk is that these are features that you don't need and/or shouldn't use in your day-to-day code but that you need to keep in the back of your mind because other people's code and the stdlib do use them.  As Alex Martelli pointed out in his wonderful talk &lt;a href="http://blip.tv/file/1957071"&gt;Abstractions as Leverage&lt;/a&gt; you can't successfully function at one level of abstraction if you don't know what is going on at the next level down.  This talk is a whirlwind tour of the next level down.&lt;br /&gt;&lt;br /&gt;I'm honored to be an invited speaker this year.  This just means the program committee has pre-approved any talk I give instead of going through the normal program committee proposal process.  I had some stem-winding conversations with friends about what this means and what purpose it serves.  Firstly it is a flattering inducement to get prior popular speakers to speak again, and possibly no more than that.  Secondly it gives speakers a chance to do a talk that might not make it through the normal approval process.  I knew a person in college** who's motto was "There is a fine line between being &lt;i&gt;The Man&lt;/i&gt; and being &lt;i&gt;That Guy&lt;/i&gt;."  Imagine a Venn diagram with barely overlapping circles labeled "Good Ideas" and "Bad Ideas;"  Being "The Man" is the thin overlap between the two, and committees are very good at avoiding any idea that is anywhere close to the "Bad ideas" region, let alone one that that is actually in it.  Having invited speakers is a way for the committee to include those ideas with minimal risk by inviting people who have a proven track record and hoping they don't screw up.&lt;br /&gt;&lt;br /&gt;That said my talk is pretty safe and certainly would have made it through the normal process.  I would love to give a talk I thought was in the dangerous "The Man" zone but I haven't the foggiest idea of what that talk would be.  Err, I have some idea but none long enough to be a proper talk.  For lightning talks I'll be preparing "I love graphs" (I do, and I have the graphs to prove it), "The Physics of Bowling Balls" (waaay more interesting than you would guess), and my always-threatened-never-done talk "PyAsshole: Simulating a partial information, non-trump, drinking card game in Python."&lt;br /&gt;&lt;br /&gt;* As much as I liked the title I proposed on twitter It wouldn't help the conference (or me, or anyone really) to have a talk titled "Strange Python Shit" on the program.&lt;br /&gt;** He looked suspiciously similar to me, but with hair down to his shoulders and an eyebrow ring (lay off, it was the early 90s).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-4919497190679101005?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/4919497190679101005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=4919497190679101005' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4919497190679101005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4919497190679101005'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/09/my-pycon-2010-talk.html' title='My PyCon 2010 Talk'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-7715656090760072203</id><published>2009-09-30T00:55:00.004-04:00</published><updated>2009-09-30T01:16:31.017-04:00</updated><title type='text'>Your Talk Proposal Here</title><content type='html'>As it turns out one of the marginal items that gets trimmed in a down economy is conference jaunts [Q: who would have guessed? A: everybody]. PyCon 2010 needs talks, so if you have something interesting to say to a few hundred people this is your chance. I didn't volunteer for the program committee this year so I don't know the exact numbers but the acceptance rate is going to be much higher than the 50% for past years.&lt;br /&gt;&lt;br /&gt;This is a great opportunity to practice your chops; I got my start when PyCon was 300 people and talks had a 90% acceptance rate. The last few years PyCon has had 1000+ people and even the smallest talk room gets 200 people. If you have anything interesting to say, this is your chance to say it.&lt;br /&gt;&lt;br /&gt;NB, hopefully PyCon won't have to do what other conferences routinely do and say "we've extended the deadline, but this time we mean it!" For fuck's sake the conference is in Atlanta in February - I'll be happily golfing during the time I'm not speaking.&lt;br /&gt;&lt;br /&gt;NB, by "golfing" I also mean "going to the shooting range" and "bowling" as weather dictates.&lt;br /&gt;&lt;br /&gt;ENB: Anna Ravenscroft has a tidy short list of &lt;a href="http://annaraven.blogspot.com/2009/09/why-women-dont-talk-enough.html"&gt;bogus reasons why you can't give a talk&lt;/a&gt;.   The title is pointed at women but the excuses are universal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-7715656090760072203?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/7715656090760072203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=7715656090760072203' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/7715656090760072203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/7715656090760072203'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/09/your-talk-proposal-here.html' title='Your Talk Proposal Here'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-2661918739239516843</id><published>2009-08-21T14:54:00.003-04:00</published><updated>2009-08-21T15:16:39.572-04:00</updated><title type='text'>Looking For a New Gig</title><content type='html'>I'm a Boston based python developer looking for a new gig, full time or consulting.  Here are my resume highlights:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Co-founded a web analytics &amp; marketing company (&lt;a href="http://psynchronous.com/analytics.html"&gt;Psynchronous Communications&lt;/a&gt;), and grew it to 1M+ in annual revenues.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Python core developer, author of Class Decorators.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;PyCon, EuroPython, and PyCon UK speaker.  (&lt;a href="http://blip.tv/file/1949345/"&gt;video of my PyCon2009 talk&lt;/a&gt;).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Hired, managed, and led small teams of developers in the rapid development of web applications.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;10+ years at web startups using a LAMP stack.  7+ years in Python. 10+ years C/C++.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;OpenAir.com company foosball champion.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;The full "brag sheet" available on request (which omits that last item due to space restrictions).&lt;br /&gt;&lt;br /&gt;Jack Diederich&lt;br /&gt;email: jackdied@gmail.com&lt;br /&gt;cell: 617-821-1734&lt;br /&gt;&lt;br /&gt;PS I've posted my contact information in several public places over the years but it is still invisible to google. Hopefully repetition will fix that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-2661918739239516843?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/2661918739239516843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=2661918739239516843' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2661918739239516843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2661918739239516843'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/08/looking-for-new-gig.html' title='Looking For a New Gig'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-3280366590795259060</id><published>2009-07-12T20:32:00.009-04:00</published><updated>2009-07-16T00:28:01.723-04:00</updated><title type='text'>Dominoes</title><content type='html'>Playing dominoes is hard.  Like playing card games there are many games you can play with dominoes and last night I was exposed to &lt;a href="http://en.wikipedia.org/wiki/Muggins_(domino_game)"&gt;Muggins/Fives&lt;/a&gt;.  Muggins has a points system and unlike the kiddie version of dominoes that I grew up with is not a game of chance (think War versus Bridge).  The big tipoffs that it is a hard problem are that A) it is a partial information game [you can only see the board and your own hand] and B) grown men play against each other for money [I'm told the variant we were playing is very popular in the Bahamas].&lt;br /&gt;&lt;br /&gt;The first thing I did was look for AI research papers on solving dominoes.  After an hour of feeding terms to search engines I can say: there is no research.  This is strange because Checkers (a boring perfect information game) was still interesting enough to researchers that it was &lt;a href="http://www.thinkartificial.org/artificial-intelligence/the-unbeatable-checkers-ai-system/"&gt;solved only 10 years ago&lt;/a&gt;.  People don't bet on checkers so the fact that dominoes is a research orphan left me intrigued.  Of course there's a personal angle too:  If it was an easy problem to solve I could solve it and then travel while grifting strangers out of their money;  If it was a hard problem to solve (like Bridge or Go) then I'd add it to my list of "fun things to play."&lt;br /&gt;&lt;br /&gt;In Muggins you get points when all of the exposed end tiles add up to a multiple of five.  If you go out first you also get bonus points equal to the sum of the pips in your opponents' hands.&lt;br /&gt;&lt;br /&gt;After a couple hours I had a working 150 line simulator and two simple strategies: play any legal move (dumb strategy) and play the highest scoring legal move (less dumb).   I use the term "working" loosely.  A number of nefarious bugs related to non-randomness lurked in the code.   These caused the last player added to win ties in scoring, who goes first, and some other spots.  You can view the final &lt;a href="http://jackdied.com/jackdied/dominoes.py"&gt;dominoes.py source here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To implement the strategies I went for the simplest thing that could possibly work: generator coroutines.  They have a simple interface and they keep state so even somewhat complicated strategies are possible without writing a big interface class.  You just write a function with a couple breakpoints and everything just works.  Here is the generator for "play the first move that is legal"&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;def dumb_player(player_no, board, hand):&lt;br /&gt;    ''' play the first domino that is legal '''&lt;br /&gt;    yield None # signal that we are setup&lt;br /&gt;    while True:&lt;br /&gt;        for a, b in pairs_and_reverse(hand): # (a,b)+(b, a)&lt;br /&gt;            try:&lt;br /&gt;                board.play(player_no, a, b)&lt;br /&gt;                # if we get here it is a legal play&lt;br /&gt;                yield None&lt;br /&gt;                break&lt;br /&gt;            except IllegalPlay: pass&lt;br /&gt;        else:&lt;br /&gt;            # draw a possibly legal play&lt;br /&gt;            board.draw(player_no)&lt;br /&gt;    return&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The boiler plate of setup and try/except Illegal play was identical over all the simple strategies so I refactored so that the strategy is just a scoring function applied to all legal moves.  The simple strategy becomes ("a" and "b" are the two ends of the domino, "a" is the side that matches the board and "b" is the open end left after play):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def dumb_player(board, player_no, a, b):&lt;br /&gt;    ''' randomly choose a legal play '''&lt;br /&gt;    return None # all plays are equal&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;.. and the strategy for playing the highest scoring move possible is&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def score_player(board, player_no, a, b):&lt;br /&gt;    ''' always plays the immediately highest scoring tile '''&lt;br /&gt;    sc = board.play(player_no, a, b)&lt;br /&gt;    board.undo()&lt;br /&gt;    return sc&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Add a function that does a round-robin tourney of all scoring functions 5000 times each and you have a quick fitness test.&lt;br /&gt;&lt;br /&gt;Well, it turns out dominoes is easy (or at least simple).  This blew away all my assumptions;  If you look at the source I have a dozen scoring functions some of which consider the pips on the already played tiles and the secret pips in the players hand.  The best of them beats the very simple "score_player" just 50.5% of the time.  50.5% is a solid money maker if you are playing blackjack against the house at hundreds of hands an hour, but peanuts if you are playing 10 games of dominoes an hour against someone who is using the simple score_player strategy.&lt;br /&gt;&lt;br /&gt;The source is out there and understandable (500 lines, 300 of which are short strategy functions).  If anyone can consistently beat my best attempt "score_blocker6" then post the source in the comments and I'll buy you a beer next PyCon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-3280366590795259060?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/3280366590795259060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=3280366590795259060' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/3280366590795259060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/3280366590795259060'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/07/dominoes.html' title='Dominoes'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-5660403225035671729</id><published>2009-07-05T19:51:00.007-04:00</published><updated>2009-07-05T22:36:02.934-04:00</updated><title type='text'>ICFP Contest 2009</title><content type='html'>The &lt;a href="http://icfpcontest.org/"&gt;ICFP 2009 programming contest&lt;/a&gt; started a couple weeks earlier than last year, and unfortunately I only found out about it as it was ending.  The challenge is to solve as best as possible in 72 hours a problem that can't be brute forced in 72 hours.  I love this challenge; I've been participating in the contest (in python) since 2002 and even left EuroPython early last year just to compete.  I don't do writeups every year but I did for &lt;a href="http://jackdied.com/python/60"&gt;2007&lt;/a&gt;, &lt;a href="http://jackdied.com/static/icfp2004/"&gt;2004&lt;/a&gt;, and &lt;a href="http://jackdied.com/static/icfp2002/"&gt;2002&lt;/a&gt;.  This year I didn't participate officially but I did tackle the program after the fact.&lt;br /&gt;&lt;br /&gt;The best resource for writeups and implementations is the &lt;a href="http://wiki.freaks-unidos.net/icfp/2009/"&gt;FUN team&lt;/a&gt; page.  They did their entry in python as did an amazingly large number of contestants this year.  Their page has links to a dozen writeups, a sub-reddit, and some good pages on the maths of orbital mechanics.&lt;br /&gt;&lt;br /&gt;The contest is a great chance to try out new tools and methodologies.  I tried Unit Testing for the first time during an ICFP weekend (many moons ago) and I've been sold ever since.  If Unit Testing helps you finish a time-limited competition &lt;i&gt;faster&lt;/i&gt; then how could it possibly hurt during normal dev?  I've also used the contest to try out pair programming, Test Driven Development, and &lt;a href="http://wiki.python.org/moin/Pyrex"&gt;pyrex&lt;/a&gt; [I won't talk about those more unless someone asks].&lt;br /&gt;&lt;br /&gt;This year I used the contest as a chance to try out the &lt;a href="http://docs.python.org/library/ctypes.html#module-ctypes"&gt;ctypes module&lt;/a&gt; and &lt;a href="http://www.pygame.org/news.html"&gt;Pygame&lt;/a&gt; gui library.  More on that below, but first to the ICFP problem:&lt;br /&gt;&lt;h4&gt;Problem Defined&lt;/h4&gt;  This year, like many past years, the challenge was to implement a virtual machine that runs the binaries provided by the organizers.  The VM binaries simulated a bunch of orbital mechanics.  You then had to write programs that interacted with the simulations to push a satellite from one orbit to another, meet up with other satellites in orbit, and more complicated variations on the theme.&lt;br /&gt;My strategy was the same as in past years:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Read the problem description, write a reference implementation in pure python, and test the hell out of the reference implementation.&lt;br&gt;[actual time: 1 hour]&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Use that to write a visualizer and explore the problem mechanics and horribly underspecified written problem description.&lt;br&gt;[actual time &lt;br&gt;[actual time: 2 hours. I had to install pygame and read the docs first]&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Write a work-alike in screaming fast C so as much time as possible can be spent solving the problem instead of waiting on simulations to finish.&lt;br&gt;[actual time: 3 hours.  I had to learn the ctypes module and fool around with it.  &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;The VM was very simple; it consisted of add/subtract/multiply/copy/if-test-else operations.  Knocking out a working and tested version took about an hour.  The tests were important because even my 150-line python implementation had a couple bugs in it.  They also exposed some really shitty bugs in the written problem description.  For instance a table listed 10 bits in one opcode as the 'imm' value but it should have been 3 bits of value with 7 bits of padding.  The unit tests picked up bad values and a re-examination of the problem description led me to footnote 1.5 which said the value is 3-bits (why didn't they update the table too?  no idea).&lt;br /&gt;The nature of the VM lent itself to a fast C implementation.  The executable cannot change itself so if the 30th opcode adds memory locations 101 and 102 it &lt;i&gt;always&lt;/i&gt; adds memory locations 101 and 102.  It never does a conditional jump or anything else funky.  Writing a C version of the inner loop was almost as simple as adding print statements to the python version and then throwing the output at gcc.  To understand the VM a little better (and test it even more) I added my own opcodes that did asserts and wrote a self-test binary that was a translation of my python unit tests into VM code.  I could be confident in the C translation because it ran the self-check the same as the python version.  The C version runs 1000 times faster than the pure python version, which is nice.  Oddly, adding -Ox compiler flags makes the self test completely shit the bed;  I say odd because the program is extremely deterministic so I guessed it would optimize nicely.&lt;br /&gt;&lt;br /&gt;Writing a visualizer early (in pygame) was invaluable.  The first draft just drew the current orbit, the target orbit, and the satellite's current position (state was printed to stdout).  I assigned the arrow keys to manipulate the thrusters and discovered another bug in the spec -- setting thrust dx/dy points the thrusters in that direction so if you want to increase your speed in direction X you need to fire in direction negative X.  Playing with the visualizer also answered some other ambiguities in the spec -- the simulation keeps track of your relative position to the Earth but it really means your relative position to the CENTER of the Earth adn not the surface.  That isn't just important to know it also makes all the maths much easier.&lt;br /&gt;&lt;br /&gt;Solving the level 1 problems was easy.  Included in the problem description was maths for calculating thrust vectors for moving an object from one orbit to another.  The maths, however, were for doing it using a minimum of fuel but the score for your solution is maximized by doing it as quickly as possible and using all your available fuel.  Thanks to the first and simplier solutions I understood enough orbital mechanics to know you always wanted to fire thrusters either perpendicular or parallel to the tangent of the orbit at your current position. Thanks to the screaming fast C implementation I could brute force how much and which way to fire to get a high scoring solution.  Having a fast state push/pop was a huge advantage too.  Because the simulator works in discrete 1-second intervals the "real" mathematic solution is off by a little;  so instead you want to do things a little early or a little later than the "ideal."  That discrete solution is easily brute forced once you have the "real" solution.&lt;br /&gt;&lt;br /&gt;Writing the ctypes/so library was interesting.  The VM is specified as having a program execution area (a list of opcode, arg1, arg2 tuples), a memeory area (a finite array of doubles), a boolean status flag, a double score value, and a couple short double arrays for IO.  Because the program loop is deterministic it goes away when you translate it to C.  Then you are left with a bunch of double arrays of known size, one boolean, and one other double.  The organizers left a big hint that you could implement this as a single array of doubles by leaving the first two values in one of the arrays undefined.  So the obvious solution is to stick the one special double and the boolean flag in there (as a double) and then just concat all the arrays-of-doubles together.  The max combined size is finite and under 3000 * sizeof(double).  Pre-allocating a big array of these and memcpy'ing them for push/pop of state becomes dirt cheap.  As a bonus it makes the ctypes interface stupid simple too because the struct is just a single array of 3000 doubles.  Kinda: python doesn't have a native double type so ctypes converts to float. In order to get and set the raw double values of the VM I made the ctypes definition a union of 3000 doubles and 3000 unsigned long longs; when deciding what to do floats were close enough but when initializing the VM data or writing the trace I could set/get the 8-byte ulonglongs (hurray for c's type ignorance!).&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;ctypes&lt;/h4&gt;In the past if I wanted C speed I always hand rolled CPython extension modules.  It is a little bit of extra work but the speed is unbeatable (2x faster than pyrex in my experience).  ctypes is so useful I don't ever think I'll ever hand-write an extension module again.  The only stdlib module that currently uses ctypes is uuid, but I expect many new modules to use ctypes instead of doing it the hard way.&lt;br /&gt;&lt;br /&gt;The VM operates on doubles but python only has a native float type.  I was very tempted to create a new core datatype by copying Objects/floatobject.c and search/replace'ing every 'float' to 'double' but because I was using ctypes I opted for the quicker and simpler casting of those doubles a ulonglongs when I needed to set/get.  I bet &lt;a href="http://numpy.scipy.org/"&gt;Numpy&lt;/a&gt; has a way to deal with all this but I'd already hit my limit on new-tools-learned-per-hour.  I understand raw C &lt;br /&gt;&lt;br /&gt;ctypes makes easy things easy and hard things possible.  If your .so (*NIX .dll) has functions that take an int/void and return an int/void you don't even need to provide a prototype -- it just works.  So instead of writing a full featured Python/C wrapper for my basic datatype (an array of 64bit values) I just wrote 6 lines of python that defined the struct layout and then a C library that had a bunch of manipulation functions that returned 1/0 success/failure values and 100 lines of python that mapped property names to assignments/reads of the memory chunk.  It was much less work for 90% of the speed.  It also meant it was easy to apply the unit tests for my pure-python solution to the hybrid solution because the only difference was the underlying storage - a dict for the pure python and an C-array for the ctypes wrapped .so.&lt;br /&gt;&lt;h4&gt;pygame&lt;/h4&gt;In the past my goto-GUI has been Tkinter.  I've been using Tk every since reading &lt;i&gt;Learning Python&lt;/i&gt; in 2001 which is half a python book and half a Tk book.  I've accumulated a personal library of Tk elements that do everything from menus to graph plotting to shape drawing.  I threw it all out for this year for pygame and ended up with a very decent visualizer that was just a couple hundred lines of python code.  I won't be going back to Tk for graphical GUIs in the future (I still like it for text).&lt;br /&gt;&lt;br /&gt;[&lt;b&gt;More later&lt;/b&gt;]&lt;br /&gt;&lt;br /&gt;ps, I use "maths" plural like the British commonwealths simply because I like it;  I lived in Australia for a year and it grew on me.  However, you won't hear me singularizing "sports" or saying someone is "in hospital" - they are "in &lt;i&gt;the&lt;/i&gt; hospital."  English is the best language ever because what is legal is whatever works.  To paraphrase a variously attributed quote: "English doesn't borrow from other languages.  It takes them down dark alleys, bashes them on the head, and rifles through their pockets."  Some people will tell you English has a giant number of rules, but really that someone is just trying to make sense of a system where anything goes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-5660403225035671729?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/5660403225035671729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=5660403225035671729' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/5660403225035671729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/5660403225035671729'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/07/icfp-contest-2009.html' title='ICFP Contest 2009'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-3475568845520569396</id><published>2009-04-07T20:04:00.005-04:00</published><updated>2009-04-07T20:37:45.242-04:00</updated><title type='text'>HOWTO: get useful information out of the buildbot</title><content type='html'>The CPython core has a raft of machines that do nothing but pull updates from subversion (the code repository) and run the unit tests.  You can see the full and somewhat cryptic list of &lt;a href="http://www.python.org/dev/buildbot/all/"&gt;all the boxes and their status&lt;/a&gt; on the buildbot webpage.  I had to relearn how to read all the output because I had failing tests that only failed on other people's boxen.  So here's the HOWTO. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Find your branch&lt;/b&gt;&lt;br /&gt;Ten minutes after your checkin reload the buildbot page and find the machines running the branch you checked into.  The machines are titled with the codebase being run, currently either "trunk" (aka 2.7), 2.6 (the maintenance branch), 3.0 (another maintenance branch), or 3.x (the py3k trunk).  The other words in the name are some combination of hardware, operating system, and compiler.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Open a bunch of tabs&lt;/b&gt;&lt;br /&gt;Each vertical column below the name is a time series of builds and statuses with the most recent at the top. The items are either Green (completed, OK), Red (completed, catastrophe), or Yellow (either still running, ambiguous success, or informational).  Open a tab by clicking on the "Build NNN" links on all the machines running the branch you care about.  Your checkin is listed in the leftmost column so only pick builds than start above (afterwards) that checkin.  Then wait an hour or two.  [what does the build number mean?  I have no idea but I'm guessing the Nth build for that machine]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Check the builds&lt;/b&gt;&lt;br /&gt;Most of the builds should have finished so go ahead and reload all the tabs for the individual machines.  If the build is still in progress you can tell by the giant header that says "Build In Progress." If it is done you will see a series of little headers and links.  Each header is for the different stages: update from svn, run ./configure, recompile the source, and run the test suite.  The link titled "stdio" after each of these should be renamed more plainly "view ./configure output,"  "view test output" etc.  This is what you want to see.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Find the output you care about&lt;/b&gt;&lt;br /&gt;Search to find the tests and failures that apply to you.  Especially on the trunk there may be failures that aren't your fault.  Someone elses' checkin might even be causing an abort before your stuff even gets run.  If you stuff works, great!  If not..&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Checkin, rinse, and repeat&lt;/b&gt;&lt;br /&gt;Based on the output you may need to make another checkin and let all the buldbots run again.  If the failure isn't verbose enough then you will have to checkin some debugging output and wait for them to run again.&lt;br /&gt;&lt;br /&gt;.. and that's all there is to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-3475568845520569396?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/3475568845520569396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=3475568845520569396' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/3475568845520569396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/3475568845520569396'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/04/howto-get-useful-information-out-of.html' title='HOWTO: get useful information out of the buildbot'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-7272293544706313434</id><published>2009-04-07T17:33:00.004-04:00</published><updated>2009-04-07T19:59:37.712-04:00</updated><title type='text'>telnetlib progress</title><content type='html'>The first item in my &lt;a href="http://jackdied.blogspot.com/2009/04/fixing-telnetlib.html"&gt;Fixing Telnetlib TODO&lt;/a&gt; ("#1 test the hell out of telnet") is nearly done.  The unit tests now test IAC handling and SB negotiation in addition to the read_* methods.  As a bonus it looks like I fixed all the race conditions in the read tests'cause the builbots are going greener. (aside: did you know about &lt;a href="http://docs.python.org/library/queue.html#Queue.Queue.join"&gt;Queue.join()&lt;/a&gt;?  I didn't, very handy).&lt;br /&gt;&lt;br /&gt;The only remaining nit is that the SB data tests are creating an uncollectable GC cycle.  The Telnet object has a reference to the negotiation callback.  The negotiation callback needs to call telnetob.read_sb_data() to get at the SB data.  So I have a nego_collector class that looks like&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class nego_collector(object):&lt;br /&gt;    def __init__(self, sb_getter=None):&lt;br /&gt;        self.seen = ''&lt;br /&gt;        self.sb_getter = sb_getter  # cycle, this is a Telnet.read_sb_data bound method&lt;br /&gt;        self.sb_seen = ''&lt;br /&gt;&lt;br /&gt;    def do_nego(self, sock, cmd, opt):&lt;br /&gt;        self.seen += cmd + opt&lt;br /&gt;        if cmd == tl.SE and self.sb_getter:&lt;br /&gt;            sb_data = self.sb_getter()&lt;br /&gt;            self.sb_seen += sb_data&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The nego_collector either needs to keep a weakref to the function or we have to break the cycle manually.  Consider this just another crufty corner in telnetlib.&lt;br /&gt;&lt;br /&gt;[woops].  I spoke too soon.  Not all the buildbots are passing so I now have a machine running the telnetlib tests in an infinite loop with the CPU heavily loaded.  Hopefully I can smoke out the remaining race conditions locally.  If not I'll have to sign up to use the &lt;a href="http://www.snakebite.org/network"&gt;Snakebite&lt;/a&gt; testing farm.&lt;br /&gt;[later]  Fixed.  Almost certainly.  We now allow a margin of error of 100% (a whopping 0.3 seconds) in our timing assertions and we do fewer of them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-7272293544706313434?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/7272293544706313434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=7272293544706313434' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/7272293544706313434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/7272293544706313434'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/04/telnetlib-progress.html' title='telnetlib progress'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-4811042550114940034</id><published>2009-04-04T22:41:00.004-04:00</published><updated>2009-04-04T23:43:23.969-04:00</updated><title type='text'>Speaking about Speaking</title><content type='html'>AMK's talk &lt;a href="http://pycon.blip.tv/file/1947177/"&gt;How to Give a Python Talk&lt;/a&gt; is very informative, you should watch it even if you aren't planning on giving a talk.  Why should you watch it?  partly because it gives you an idea of what goes into a talk and partly because it demystifies giving a talk enough that it might prompt you into giving one.  Lots of solid advice.&lt;br /&gt;&lt;br /&gt;Andrew's talk itself is a nice illustration of some of his points.  No one would mistake Andrew for a motivation speaker; you don't walk away from that talk with an inexplicable need to buy what he's selling and given the audience you might actually be pissed off if you thought he was trying to sell something.  (talk-&gt;content != NULL) ? Good_talk : Bad_talk.  PyCon attendees care more about red meat than glitter and are very forgiving on presentation if the red meat is there.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How I do it&lt;/b&gt; what I do to prepare has heavy overlap with what Andrew recommends.  Practice is king.  When I step on the stage I'm not nervous per se, but when speaking in front of a large audience I do tend to read the slides much more than I talk about them in practice.  So my rule of thumb is to practice a talk where I spend three minutes per slide knowing that I'll drop most of my segues and only spend one minute live talking per slide.  Figure out your own constant and practice against that.  I was amazed at Ned Batchelder's talk because the &lt;a href="http://pycon.blip.tv/file/1957417/"&gt;the video of his talk&lt;/a&gt; matched so closely with &lt;a href="http://nedbatchelder.com/text/whirlext.html"&gt;his text explication of his slides&lt;/a&gt;.  The prepared text is almost 1-to-1 which I personally just can't do.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Narrative, Narrative, Narrative&lt;/b&gt;:  Pick a theme and stick with it.  If you don't talk to your premise once every couple minutes then you have failed.  My talk was "Class Decorators: Radically Simple" and I tried to say on every example that a decorator was a callable that took one argument and returned something.  Raymond Hettinger's talk was "Easy AI in Python" and he started and finished every example emphasizing that a novice could do it.  Alex Martelli's talk was "Abstractions as Leverage" and he introduced every slide with a quote from a very dead (and sometimes white) male who had made the same point back when writing was a novelty.  It seems odd but part of your job as a speaker is to repeat yourself, repeatedly.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Don't drink coffee&lt;/b&gt;:  This sucks, but you can't drink your normal amount of coffee before your talk.  I was hoping to drink a few cups and balance it out with a bloody mary but my talk was in the AM and the hotel bar wasn't open.  Instead I drank only a little coffee so I wouldn't be humming on stage.  I'm told Beta Blockers work to suppress the nerves (symphony orchestras use them) but I haven't tried it myself.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Practice is free and Plentiful&lt;/b&gt;: It is a not-so-secret fact that user groups, PIGs, and even Cons are starved for presenters.  My most recent talk started as a lightning talk and then I gave it at a local user's group and a couple Cons that had 90%+ acceptance rates before giving it at PyCon.  Practice is good and the opportunities for practice are many.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;You already know something to talk about&lt;/b&gt;  At the Boston PIG talk-dry-run (all the PyCon presenters gave their talk to 30 people a week before they gave it to 300+) I spent the first five minutes talking about talking.  You do know something you can do a talk about and it sounds like "what is something I wish I knew about one year ago?"  It's that easy.  Try one or three ideas on the local group as a lightning talk and then grow the best one into a proper talk proposal.&lt;br /&gt;&lt;br /&gt;It isn't complicated, see you with a speaker's badge next year!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-4811042550114940034?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/4811042550114940034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=4811042550114940034' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4811042550114940034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4811042550114940034'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/04/speaking-about-speaking.html' title='Speaking about Speaking'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-2591151605270117295</id><published>2009-04-04T21:53:00.002-04:00</published><updated>2009-04-04T21:56:31.400-04:00</updated><title type='text'>Small test_telnetlib progress</title><content type='html'>My &lt;a href="http://bugs.python.org/issue5696"&gt;first patch&lt;/a&gt; of test_telnetlib is up.  It tests most of the guarantees that the various Telnet.read_* methods make (I'm sure I missed a couple).  The only problem is that every single test theoretically has a race condition.  In actual practice the chances of a race are 0.0%, but theoretically it isn't sound.  I posted it as a patch (as opposed to just committing it) to see if anyone has an opinion.&lt;br /&gt;&lt;br /&gt;For the next round of tests I'll be writing unit tests for the out-of-band negotiations parser.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-2591151605270117295?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/2591151605270117295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=2591151605270117295' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2591151605270117295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2591151605270117295'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/04/small-testtelnetlib-progress.html' title='Small test_telnetlib progress'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-2744006056680815579</id><published>2009-04-03T16:59:00.007-04:00</published><updated>2009-04-03T21:50:46.571-04:00</updated><title type='text'>PyCon Errata</title><content type='html'>&lt;b&gt;Old and New Faces&lt;/b&gt; It was good to see everyone, too many names to mention.  That includes all the other Boston pythoneers who I tend to see just once a year and in a city not named "Boston."  There is never enough time to time to talk to everyone but I did try.  I also did my usual thing which is to purposely eat lunch with no one I know [it's my fifth PyCon so this rule has been relaxed to "as few people I know as possible"].  A few mentions: somehow I'd never met Jesse Noller before (despite many PyCons and him being in Boston);  Georg Brandl made it over to the US for PyCon for the first time;  I didn't run into Martin Blais until day five when he was sitting next to me at sprints;  a sixteen year old (who is senior to me on py-dev) thanked me for contributing a patch; and David Mertz (whom I had never met in person) ran up, introduced himself, and disappeared into the ether (far too brief: I have to invite him over for dinner or something).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Limited Excess&lt;/b&gt;  In a down economy attendance and freebies were also down.  Almost no speakers ended their talk with a "and we'ere hiring!" slide as opposed to the past standard of 100%.  To my shock and horror I actually had to pay for most of my own dinners and drinks.  CCP/EVE Online was a standout in this respect [If you're wondering how a company in Iceland can afford to be generous remember that their subscribers pay in dollars and euros, not kronas].&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EVE Fan-Fest&lt;/b&gt;  I learned about &lt;a href="http://www.eveonline.com/fanfest/2008/"&gt;EVE Fan-Fest&lt;/a&gt; not from the CCP guys but from a husband/wife team of players.  1500+ gamers descend on Reykjavik annually.  This is such a large number of extra people for a country of 300k that the conference has to be closely coordinated with the government, hotels, and airlines.  The mind reels.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Code Blindness&lt;/b&gt;  By the end of sprints I was suffering from the geek equivalent of &lt;a href="http://en.wikipedia.org/wiki/Snow_blindness"&gt;snow blindness&lt;/a&gt;.  Throughout sprints I traded bug reports, emails, and checkins with Hiro Yamamoto (the "John Smith" of Japan).  He'd miss something and I'd whargarbl his name under my breath.  I'd miss something and know he was grumbling half way across the world.  I pretty clearly lost that battle when I committed a patch that checked to see if unsigned longs were less than zero (oh sure, the compiler can optimize it out, but still..).  Which reminds me, I still need to revert that.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;We have a prodigy on our critical path&lt;/b&gt;.  Python's release manager is Benjamin Peterson and Benjamin is sixteen years old.  On the internet &lt;a href="http://www.unc.edu/depts/jomc/academics/dri/idog.html"&gt;nobody knows you're a dog&lt;/a&gt; and in open source no one cares if you're in High School.  He gets stuff done, end of story.  There is a small amount of cognitive dissonance involved, but not much.  For instance he gave me an attaboy for a patch I submitted last year - and while I have shoes that are older than he is - he sincerely meant it as a compliment and I took it as such.  He's good people to have around - though if he gets a driver's license or a girlfriend we're in a spot of trouble. [I talked to his mother only briefly but she treated his hobby as casually as if he was on a sports team.]&lt;br /&gt;&lt;br /&gt;Benjamin is not without precedent.  Our now somewhat older prodigy is named Georg Brandl.  The idea of prolonged adolescence is pretty new in cultural terms (less than 60 years old).  Both men are sterling illustrations that when you treat "kids" like adults, they behave like adults (heck, they were adults in the first place but just not acknowledged as so).  Let's have more of this please.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Twitter&lt;/b&gt;  Twitter was the breakout story of the year at PyCon.  I've peeked at it several times but never seen the point.  I'm so old school I still refer to IM as "&lt;a href="http://en.wikipedia.org/wiki/Talk_(software)"&gt;talk&lt;/a&gt;."  Twitter was nowhere to be seen last year but this year it was pervasive.  Sure, most of the tweets were mindless blather but they fill the mindless blather niche very well.  "bourbon in the Kennedy room" is useful when broadcast but not the kind of thing you'd send an email about.  Michael Foord (aka &lt;a href="http://twitter.com/voidspace"&gt;voidspace&lt;/a&gt;) gained 50 followers a day during the conference.  I have reluctantly broken down and &lt;a href="http://twitter.com/jackdied"&gt;signed up too&lt;/a&gt;.  Oddly one of my first tweets was answering the question "do I need stitches for this?" which is something I know much about (I had a very full childhood and I have the scars to prove it).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;My Talk&lt;/b&gt;  Video of my talk &lt;a href="http://pycon.blip.tv/file/1949345/"&gt;Class Decorators: Radically Simple&lt;/a&gt; is now online.  I was pleased with my performance until I saw the video.  Thankfully attendees care more about content that presentation because there are a dozen things I would like to do over;  I don't have a future as a motivational speaker.  I have done a talk on that same topic several times now and this time was a giant rewrite.  The night before I was in bed by midnight but tossed and turned.  I ended up giving up and rewriting large portions until 5am.  I slept for three hours and what you see was me looking at the slides for the second time.  All the ridiculous example slides were what people [unsolicited!] came up and told me is what made class decorators "click" for them.  Go figure.&lt;br /&gt;&lt;br /&gt;There is a raft of little things I would change about the presentation.  Unfortunately I won't ever give it again so I'll have to apply them to my next talk (after I think one up).  Bloused shirt?  gone, starch that thing and make sure it is tucked in.  Conversational voice? gone, I have a separate speaker's voice and I didn't use it (lack of sleep?).  USB remote slide dongle? gone, I spent as much time aiming the laser pointer at the screen as I did talking to the room.   Wireless mike? keep, standing at the podium sucks [I lucked out - I was in the only room that had a wireless mike and I only got to use it because I asked].&lt;br /&gt;&lt;br /&gt;Oh, and the perenial "pause between sentences." For the first five minutes I talked like I was reading a teleprompter.  There isn't much you can do about this other than practice.&lt;br /&gt;&lt;br /&gt;[and then some more errata]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;International&lt;/b&gt;  As I've mentioned before PyCon is the inverse of EuroPython in that it is 75% American and 25% European (eyeball numbers: I'd love to see hard data on this). The speakers list is somewhat more static because there is a subset of people who go to conventions for fun (myself included).  To confuse things further there are a number of Americans who weren't born here and some "Americans" who are American but not in name (Alex Martelli is still Italian for sentimental reasons despite living in and literally marrying into to America).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Martelli's Slides&lt;/b&gt;  Alex Martelli's slides are immediately recognizable because he uses the same background and the same quirky font on all of them, always.  I got the scoop from Anna Ravenscroft (a sometimes PyCon speaker and AKA Mrs Alex Martelli).  He is fond of the background and font because they remind him of a blackboard.  No one has complained so that's all there is to it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sprints are Magic&lt;/b&gt;  Two days of sprints generated the same amount of python-checkin traffic as a regular month.  Questions are just so much cheaper in person than in email that it couldn't be otherwise.  Raise you hand and say "can anyone tell me about [interface]" and you get an answer.  Person-to-person social pressures also lead to quicker bug resolution.  Jesse Noller said something like "I assigned a pickle functools bug to you while you were in the can, it seemed up your alley."  It wasn't up my alley but a few hours later I had read the pickle docs and checked in a patch to make functools.partial instances pickle-able.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-2744006056680815579?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/2744006056680815579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=2744006056680815579' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2744006056680815579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2744006056680815579'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/04/pycon-errata.html' title='PyCon Errata'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-3767990574585796403</id><published>2009-04-03T14:54:00.004-04:00</published><updated>2009-04-03T15:45:26.864-04:00</updated><title type='text'>Fixing telnetlib</title><content type='html'>During the PyCon sprints I re-assigned all open (and unclaimed) telnetlib bugs to myself.  The biggest longstanding complaint about telnetlib is that non-trivial negotations aren't possible because the negotiation callback is very bare bones.  The biggest problem with telnetlib is that there is almost no test suite - which is why some bugs have been open for seven years.  So my priorities are first to test the hell out of telnetlib and second to improve negotiation.&lt;br /&gt;&lt;br /&gt;The negotiation problem is clearest when dealing with two-way communications like NAWS (Negotiate About Window Size).  The first time the server asks DO NAWS the client can reply WILL NAWS and include its current window size.  The current negotiation callback supports this just fine.   But when the client resizes its window it needs to be able to tell the server, which means Telnet needs a hook for a pending negotiations queue.  And forget about the STATUS code which asks the other end of the connection to say what options it thinks have been negotiated - the current Telnet has no notion of state.&lt;br /&gt;&lt;br /&gt;Below are the raw TODO and research notes I put together in a few hours at sprints.  I used google code search to find some of the attempts to fix telnetlib by either subclassing it or writing a semi-compatible Telnet-alike from scratch (these are harder to grep for, for obvious reasons).  The RFCs section marks each RFC as Must/Will/Won't implement.  "Must implement" means core stuff for the Telnet class, "Will implement" means the telnetlib should include a negotation implementation for that RFC, and "Won't implement" means it won't (because the RFC is either archaic or otherwise unused in the wild).  The BUGS list includes all open bugs and the closed bugs I want to revisit or double-check.&lt;br /&gt;&lt;br /&gt;---- TESTING TELNETLIB ----&lt;br /&gt;* Testing&lt;br /&gt;  - test the read_* gaurantees&lt;br /&gt;  - test timeouts (already implemented?)&lt;br /&gt;  - test the sb handling&lt;br /&gt;* make real negotation possible&lt;br /&gt;* add real timeout and prompt exceptions&lt;br /&gt;* make Telnet objects context managers&lt;br /&gt;* process_rawq is a train wreck. Make sure we do something compatible but less icky.&lt;br /&gt;* figure out where the hell they found all those contstants.  &lt;br /&gt;* Why is chr(17)/"\021" blindly filtered out of the stream?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---- BUGS ----&lt;br /&gt;&lt;br /&gt;OPEN&lt;br /&gt;&lt;br /&gt;http://bugs.python.org/issue5188&lt;br /&gt;telnetlib process_rawq buffer handling is confused&lt;br /&gt;&lt;br /&gt;http://bugs.python.org/issue2550&lt;br /&gt;SO_REUSEADDR doesn't have the same semantics on Windows as on Unix&lt;br /&gt;&lt;br /&gt;http://bugs.python.org/issue1360221&lt;br /&gt;telnetlib expect() and read_until() do not time out properly&lt;br /&gt;&lt;br /&gt;http://bugs.python.org/issue1252001&lt;br /&gt;Issue with telnetlib read_until not timing out&lt;br /&gt;&lt;br /&gt;http://bugs.python.org/issue1049450&lt;br /&gt;Solaris: EINTR exception in select/socket calls in telnetlib&lt;br /&gt;&lt;br /&gt;http://bugs.python.org/issue708007&lt;br /&gt;TelnetPopen3, TelnetBase, Expect split&lt;br /&gt;[THIS, a rewrite of telnetlib.  Mine for good stuff]&lt;br /&gt;&lt;br /&gt;http://bugs.python.org/issue1678077&lt;br /&gt;improve telnetlib.Telnet so option negotiation becomes easie&lt;br /&gt;&lt;br /&gt;http://bugs.python.org/issue1772788&lt;br /&gt;chr(128) in u'only ascii' -&gt; TypeError with misleading msg&lt;br /&gt;&lt;br /&gt;http://bugs.python.org/issue1737737&lt;br /&gt;telnetlib.Telnet does not process DATA MARK (DM)&lt;br /&gt;&lt;br /&gt;http://bugs.python.org/issue1772794&lt;br /&gt;Telnetlib dosn't accept u'only ascii'&lt;br /&gt;&lt;br /&gt;CLOSED&lt;br /&gt;&lt;br /&gt;http://bugs.python.org/issue2451&lt;br /&gt;No way to disable socket timeouts in httplib, etc.&lt;br /&gt;&lt;br /&gt;http://bugs.python.org/issue822974&lt;br /&gt;Telnet.read_until() timeout parameter misleading &lt;br /&gt;&lt;br /&gt;http://bugs.python.org/issue630829&lt;br /&gt;telnetlib.py: don't block on IAC and enhancement&lt;br /&gt;&lt;br /&gt;http://bugs.python.org/issue723312&lt;br /&gt;ability to pass a timeout to underlying socket&lt;br /&gt;&lt;br /&gt;http://bugs.python.org/issue1520081&lt;br /&gt;telnetlib.py change to ease option handling.&lt;br /&gt;&lt;br /&gt;http://bugs.python.org/issue664020&lt;br /&gt;telnetlib option subnegotiation fix&lt;br /&gt;&lt;br /&gt;http://bugs.python.org/issue723364&lt;br /&gt;terminal type option subnegotiation in telnetlib&lt;br /&gt;&lt;br /&gt;---- RFCs ----&lt;br /&gt;&lt;br /&gt;http://en.wikipedia.org/wiki/Telnet&lt;br /&gt;Wikipedia lists all the relevant RFCs at the bottom.&lt;br /&gt;&lt;br /&gt;[--FORMAT--]&lt;br /&gt;URL&lt;br /&gt;Short Description&lt;br /&gt;Will/Won't implement&lt;br /&gt;[--FORMAT--]&lt;br /&gt;&lt;br /&gt;http://www.iana.org/assignments/telnet-options&lt;br /&gt;List of officially assigned option codes&lt;br /&gt;Must implement.&lt;br /&gt;&lt;br /&gt;http://tools.ietf.org/html/rfc854&lt;br /&gt;(1983) Telnet protocol definition.&lt;br /&gt;Must implement.&lt;br /&gt;&lt;br /&gt;http://tools.ietf.org/html/rfc855&lt;br /&gt;(1983) Telnet negotation.&lt;br /&gt;Must implement.&lt;br /&gt;&lt;br /&gt;http://tools.ietf.org/html/rfc856&lt;br /&gt;(1983) Telnet binary protocol.&lt;br /&gt;Won't implement.  This was obviated by Kermit, Zmodem, and the like.&lt;br /&gt;&lt;br /&gt;http://tools.ietf.org/html/rfc857&lt;br /&gt;(1983) Telnet ECHO negotiation.&lt;br /&gt;Will implement.&lt;br /&gt;&lt;br /&gt;http://tools.ietf.org/html/rfc858&lt;br /&gt;(1983) Supress Go-Ahead.  Nego supression of "your turn" messages for full duplex connections.&lt;br /&gt;Won't implement.&lt;br /&gt;&lt;br /&gt;http://tools.ietf.org/html/rfc859 (Obsoletes http://tools.ietf.org/html/rfc651)&lt;br /&gt;(1983) Telnet status.  Ask other party to retransmit what they think the current negotiated options are.&lt;br /&gt;Will implement.&lt;br /&gt;&lt;br /&gt;http://tools.ietf.org/html/rfc860&lt;br /&gt;(1983) Timing mark.  A work around for servers that can't read the socket as fast as people type (!!!).&lt;br /&gt;Won't implement.&lt;br /&gt;&lt;br /&gt;http://tools.ietf.org/html/rfc861&lt;br /&gt;(1983) negotiating about negotiating&lt;br /&gt;Proln't, Doubtful this is still in effect.&lt;br /&gt;&lt;br /&gt;http://tools.ietf.org/html/rfc885&lt;br /&gt;(1983) End-of-Record code.&lt;br /&gt;Might, I have a vague recollecting that this is used as a prompt sigil.&lt;br /&gt;&lt;br /&gt;http://tools.ietf.org/html/rfc1073&lt;br /&gt;(1988) NAWS (Negotiate About Window Size)&lt;br /&gt;Will implement.&lt;br /&gt;&lt;br /&gt;http://tools.ietf.org/html/rfc1079&lt;br /&gt;(1988) Baud rate negotiation&lt;br /&gt;Won't implement.&lt;br /&gt;&lt;br /&gt;http://tools.ietf.org/html/rfc1091 (Obsoletes http://tools.ietf.org/html/rfc930)&lt;br /&gt;(1989) Terminal type negotiation&lt;br /&gt;Will implement.&lt;br /&gt;&lt;br /&gt;http://tools.ietf.org/html/rfc1184 (Obsoletes http://tools.ietf.org/html/rfc1116)&lt;br /&gt;(1990) Telnet linemode nego. Basically save packets by being less interactive.&lt;br /&gt;Won't implement.&lt;br /&gt;&lt;br /&gt;http://tools.ietf.org/html/rfc1372 (Obsoletes http://tools.ietf.org/html/rfc1080)&lt;br /&gt;(1992) Terminal flow control.  Local terminal stuff.&lt;br /&gt;Won't implement.&lt;br /&gt;&lt;br /&gt;http://tools.ietf.org/html/rfc2217&lt;br /&gt;(1997) SLIP-lite protocol for sharing a modem.&lt;br /&gt;Won't implement.&lt;br /&gt;&lt;br /&gt;http://tools.ietf.org/html/rfc2946&lt;br /&gt;(2000) Telnet Encryption nego.&lt;br /&gt;Won't implement (does anyone actually use this?)&lt;br /&gt;&lt;br /&gt;http://tools.ietf.org/html/rfc4777&lt;br /&gt;(2006) IBM iSeries hardware telnet extensions.&lt;br /&gt;Won't implement (starngely, the RFC argues against implementing itself)&lt;br /&gt;&lt;br /&gt;---- Alternate Implementations ----&lt;br /&gt;[found using google code search]&lt;br /&gt;&lt;a href="http://www.google.com/codesearch/p?hl=en#lKxBKOTyjQc/trunk/src/robot/libraries/Telnet.py&amp;q=\(telnetlib.Telnet\):%20lang:python"&gt;a hacky ECHO negotiator&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/codesearch/p?hl=en#uriFJHKUOyw/rmake-1.0.7/rmake/lib/telnetserver.py&amp;q=\(telnetlib.Telnet\):%20lang:python"&gt;subclass-and-patch NAWS negotiator&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cs.mtsu.edu/pyvc/changeset/132/trunk/lib/python2.4/site-packages/tt.py?format=diff&amp;new=132"&gt;a from-scratch wrapper&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lyntin.cvs.sourceforge.net/viewvc/lyntin/lyntin40/sandbox/leantin/rtelnetlib.py?revision=1.1&amp;view=markup"&gt;a from-scratch reimplementation&lt;/a&gt; w/ better (but unpythonic) negotiating.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-3767990574585796403?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/3767990574585796403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=3767990574585796403' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/3767990574585796403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/3767990574585796403'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/04/fixing-telnetlib.html' title='Fixing telnetlib'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-4129215218207275498</id><published>2009-03-31T03:11:00.004-04:00</published><updated>2009-04-01T22:54:46.157-04:00</updated><title type='text'>PyCon Organizers: Doug loves numbers and numbers love Doug</title><content type='html'>The PyCon organizers struggle to make each conference better than the last.  As I &lt;a href="http://jackdied.blogspot.com/2009/03/pycon-organizers.html"&gt;mentioned in another post&lt;/a&gt; they did a bang up job on logistics this year.  One metric they track is speaker popularity.  It is a bit fuzzy because hot topics vary and individual speakers can do well on one topic while sucking at another.  But the organizers do try to sift out the best.&lt;p&gt;&lt;br /&gt;&lt;h4&gt;Speaker Data&lt;/h4&gt;&lt;br /&gt;This year generated a bonanza of speaker data.  The online talk schedule was all interact-y and allowed attendees to plan and print their preferred talks ahead of time.  During the conference itself the back of every room had a pile of poker chips and three buckets: Green, Yellow, and Red.  The idea being that everyone drops a chip in the Good/Neutral/Bad bucket as they walk out at the end of each talk [hopefully they leave at the end].&lt;p&gt;&lt;br /&gt;&lt;h4&gt;Doug Knowns Data&lt;/h4&gt;&lt;br /&gt;If you were thinking the stats are weak and there are many ways to game the numbers you are very right and very wrong.  Doug Napoleone loves data even more than I do so he's doing regressions like nobodies business.  &lt;a href="http://www.dougma.com/archives/160"&gt;Doug has a post up explaining the raw data&lt;/a&gt; and the problems associated with turning the raw stuff into usable numbers.  He does speech recognition software as his day job so he knowns statistics backwards and forwards.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-4129215218207275498?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/4129215218207275498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=4129215218207275498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4129215218207275498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4129215218207275498'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/03/pycon-organizers-doug-loves-numbers-and.html' title='PyCon Organizers: Doug loves numbers and numbers love Doug'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-228043952933751437</id><published>2009-03-31T02:35:00.002-04:00</published><updated>2009-04-03T16:03:45.352-04:00</updated><title type='text'>Is This Pythonic? Conclusion</title><content type='html'>I couldn't leave well enough alone and continued to refactor the code from the &lt;a href="http://jackdied.blogspot.com/2009/03/is-this-pythonic.html"&gt;Is This Pythonic? Open Space&lt;/a&gt;.  The final version I &lt;a href="http://code.google.com/p/pyshards/issues/detail?id=1"&gt;submitted as a patch&lt;/a&gt; to the original project.  The biggest change was not in apply_all (as I assumed) but in writing a new chunk of code that sucks all the ugly and special cases from the rest of the code and puts it in one place.  I don't know if there is a pattern name for this but it tends to happen at boundaries. Pretty print functions are usually ugly for instance, and for good reason - your only other choice is to ugly up the core.&lt;br /&gt;&lt;br /&gt;So here is FetchAccumulator.  It sits at the boundry just above the database calls and returns tidy, regular data to its callers.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class FetchAccumulator(object):&lt;br /&gt;  def __init__(self, sql, args=None, fetch_per=-1, limit=-1):&lt;br /&gt;    self.results = []&lt;br /&gt;    self.sql = sql&lt;br /&gt;    self.args = args&lt;br /&gt;    self.fetch_per = fetch_per&lt;br /&gt;    self.limit = limit&lt;br /&gt;    return&lt;br /&gt;&lt;br /&gt;  def fetch(self, cursor):&lt;br /&gt;    cursor.execute(self.sql, self.args)&lt;br /&gt;    if self.fetch_per == 1:&lt;br /&gt;      results = cursor.fetchone()&lt;br /&gt;      assert len(results) &lt;= 1, results&lt;br /&gt;    elif self.limit &gt; 0:&lt;br /&gt;      results = cursor.fetchmany(self.limit)&lt;br /&gt;      assert len(results) &lt;= self.limit, (len(results), self.limit)&lt;br /&gt;    else:&lt;br /&gt;      results = cursor.fetchall()&lt;br /&gt;&lt;br /&gt;    if not results or not filter(None, results): # code smell&lt;br /&gt;      return&lt;br /&gt;&lt;br /&gt;    self.results.extend(results)&lt;br /&gt;    self.limit -= len(results)&lt;br /&gt;&lt;br /&gt;    if not self.limit: # we fetched our limit&lt;br /&gt;      raise DoneApply()&lt;br /&gt;    return&lt;br /&gt;&lt;br /&gt;  def __iter__(self):&lt;br /&gt;    return iter(self.results)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This makes the other functions much, much simpler.  Here are four database query functions that use FetchAccumulator.  Seventy lines are now twenty.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class ShardCursor(cursor.BaseCursor):&lt;br /&gt;    def selectOne(self, sql, args=None):&lt;br /&gt;        accum = FetchAccumulator(sql, args, fetch_per=1, limit=1)&lt;br /&gt;        apply_all(valid_shards(self._shard), accum.fetch)&lt;br /&gt;        return accum&lt;br /&gt;&lt;br /&gt;    def selectMany(self, sql, args=None, size=-1):&lt;br /&gt;        accum = FetchAccumulator(sql, args, limit=size)&lt;br /&gt;        apply_all(valid_shards(self._shard), accum.fetch)&lt;br /&gt;        return accum&lt;br /&gt;&lt;br /&gt;    def selectAll(self, sql, args=None):&lt;br /&gt;        accum = FetchAccumulator(sql, args)&lt;br /&gt;        apply_all(valid_shards(self._shard), accum.fetch)&lt;br /&gt;        return accum&lt;br /&gt;&lt;br /&gt;    def countOne(self, sql, args=None):&lt;br /&gt;        accum = FetchAccumulator(sql, args, fetch_per=1)&lt;br /&gt;        apply_all(valid_shards(self._shard), accum.fetch)&lt;br /&gt;        return accum&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Of course these functions now have their own code smell -- they only vary in their accumulator so they could be collapsed into a single function.  That would require refactoring all the calling code which is a bigger project than I wanted to take on.&lt;br /&gt;&lt;br /&gt;The apply_all function grew a proper exception to allow callers to bail out of the loop early.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class DoneApply(Exception): pass&lt;br /&gt;&lt;br /&gt;def apply_all(shards, func):&lt;br /&gt;  for shard in shards:&lt;br /&gt;    db = shard.establishConnection()&lt;br /&gt;    try:&lt;br /&gt;      cursor = db.cursor()&lt;br /&gt;      func(cursor)&lt;br /&gt;    except DoneApply:&lt;br /&gt;      break&lt;br /&gt;    finally:&lt;br /&gt;      db.close()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I'll omit the unit tests.  The original project had no unit tests for this code so I had to write some to make sure my refactoring wasn't breaking anything.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-228043952933751437?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/228043952933751437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=228043952933751437' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/228043952933751437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/228043952933751437'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/03/is-this-pythonic-conclusion.html' title='Is This Pythonic? Conclusion'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-8738833388700470027</id><published>2009-03-29T17:01:00.007-04:00</published><updated>2009-03-29T19:28:23.421-04:00</updated><title type='text'>Is This Pythonic?</title><content type='html'>Moshe Zadka and I did an Open Space titled "Is This Pythonic?" where we took someone else's code and reworked it to be cleaner. The code we worked on was &lt;a href="http://code.google.com/p/pyshards/source/browse/trunk/src/pyshards/core/cursor.py"&gt;cursors.py from the PyShards project&lt;/a&gt;.&lt;p&gt;&lt;br /&gt;[Originally Steve Holden and Raymond Hettinger were going to host it (they've done it before) but Steve bowed out and Raymond decided to go downtown with his girl]&lt;p&gt;&lt;br /&gt;Here is the selectOne function in it's original form.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def selectOne(self, sql, args=None):&lt;br /&gt;  results = []&lt;br /&gt;  shard = self._shard;&lt;br /&gt;  while shard != None and len(results) == 0:&lt;br /&gt;    db = shard.establishConnection()&lt;br /&gt;    cursor = db.cursor()&lt;br /&gt;    cursor.execute(sql, args)&lt;br /&gt;    res = cursor.fetchone()&lt;br /&gt;    if res != None:&lt;br /&gt;      results.extend(res)&lt;br /&gt;      cursor.close ()&lt;br /&gt;      db.close ()&lt;br /&gt;      shard = shard.next&lt;br /&gt;  return results&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The code mixes a bunch of conceptual actions in one big blob.  It is walking a linked list* of shards. It acquires a resource (making it harder to test) but doesn't safely release it in a try/finally.  It builds up a list of results, and finally returns it.  That's a lot of things for one function to be doing at once.&lt;p&gt;&lt;br /&gt;Below was the first cut.   Each action is broken into a separate function. Because there are many functions &lt;i&gt;almost&lt;/i&gt; like this one we can even reuse those parts.&lt;p&gt; &lt;br /&gt;* The linked list should just be a list, but that's a bigger refactoring.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def valid_shards(shard):&lt;br /&gt;  ''' walk the shards linked list, yielding the items '''&lt;br /&gt;  while shard:&lt;br /&gt;    yield shard&lt;br /&gt;    shard = shard.next&lt;br /&gt;&lt;br /&gt;def apply_all(shards, func):&lt;br /&gt;  ''' for each shard connect to the database, create a cursor, and pass it to func '''&lt;br /&gt;  for shard in shards:&lt;br /&gt;    db = shard.establishConnection()&lt;br /&gt;    try:&lt;br /&gt;      cursor = db.cursor()&lt;br /&gt;      yield func(cursor)&lt;br /&gt;    finally:&lt;br /&gt;      db.close()&lt;br /&gt;&lt;br /&gt;def selectOne(self, sql, args):&lt;br /&gt;  ''' execute sql on each shard, returning the first row (if any) on each shard'''&lt;br /&gt;  def fetchone(cursor):&lt;br /&gt;    return curser.fetchone(sql, args)&lt;br /&gt;&lt;br /&gt;  results = apply_all(valid_shards(self._shard), fetchone)&lt;br /&gt;  return filter(None, results)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So each function has a little job and does it in a straghtforward way.  Because the module has many methods that are &lt;i&gt;almost&lt;/i&gt; like selectOne() we should be able to reuse those parts.  So we gave it a try on selectMany()&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def selectMany(self, sql, args=None, size=None):&lt;br /&gt;        results = []&lt;br /&gt;        stillToFetch = size&lt;br /&gt;        shard = self._shard;&lt;br /&gt;        while shard != None and stillToFetch &gt; 0:&lt;br /&gt;            db = shard.establishConnection()&lt;br /&gt;            cursor = db.cursor()&lt;br /&gt;            cursor.execute(sql, args)&lt;br /&gt;            res = cursor.fetchmany(stillToFetch)&lt;br /&gt;            if res != None:&lt;br /&gt;                results.extend(res)&lt;br /&gt;                stillToFetch = stillToFetch - len(res)&lt;br /&gt;            cursor.close ()&lt;br /&gt;            db.close ()&lt;br /&gt;            shard = shard.next&lt;br /&gt;        return results&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;SelectMany has an extra wrinkle that SelectOne doesn't in that it will stop early if it gets enough result rows.  The apply_all function doesn't have a hook for stopping early so we have to kludge one into the function we pass in.  Here is the first draft that has a big code smell.  Raising StopIteration will do the right thing but it won't if the implementation changes.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def selectMany(self, sql, args=None, size=None):&lt;br /&gt;  limit = [size]&lt;br /&gt;  def fetchmany(cursor):&lt;br /&gt;    res = cursor.fetchmany(sql, args)&lt;br /&gt;    limit[0] = limit[0] - len(res)&lt;br /&gt;    if size is not None and limit[0] &lt;= 0:&lt;br /&gt;      raise StopIteration&lt;br /&gt;  &lt;br /&gt;  for results in apply_all(valid_shards(self), fetchmany):&lt;br /&gt;    for result in results:&lt;br /&gt;      yield result&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This code would be much cleaner in python2.6, and much much cleaner in 2.7 (the dev trunk).  So let's pretend that 'nonlocal' and 'yield from' are available.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def selectMany(self, sql, args=None, size=None):&lt;br /&gt;  def fetchmany(cursor):&lt;br /&gt;    nonlocal size&lt;br /&gt;    res = cursor.fetchmany(sql, args)&lt;br /&gt;    size -= len(res)&lt;br /&gt;    if size and size &lt;= 0: # our bug just became more obvious!&lt;br /&gt;      raise StopIteration&lt;br /&gt;  &lt;br /&gt;  for results in filter(None, apply_all(valid_shards(self), fetchmany)): # bug fixed!&lt;br /&gt;    yield from results&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;[I fixed the missing filter bug in that one too]&lt;br /&gt;Let's fix that size bug and raise a specific exception so our code is safe even if the implementation of apply_all changes.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def selectMany(self, sql, args=None, size=None):&lt;br /&gt;  class LimitReached(Exception): pass&lt;br /&gt;  def fetchmany(cursor):&lt;br /&gt;    nonlocal size    &lt;br /&gt;    if size is not None and size &lt;= 0: # bug fixed!&lt;br /&gt;      raise LimitReached&lt;br /&gt;    res = cursor.fetchmany(sql, args)&lt;br /&gt;    size -= len(res)&lt;br /&gt;&lt;br /&gt;  try:&lt;br /&gt;    for results in filter(None, apply_all(valid_shards(self), fetchmany)):&lt;br /&gt;      yield from results&lt;br /&gt;  except LimitReached:&lt;br /&gt;    pass&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Yuck.  That might more correct but now the code smell is stinking up the room.  What we need to do is stuff more smarts into apply_all().&lt;br /&gt;&lt;b&gt;&lt;i&gt;To Be Continued...&lt;/i&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-8738833388700470027?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/8738833388700470027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=8738833388700470027' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8738833388700470027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8738833388700470027'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/03/is-this-pythonic.html' title='Is This Pythonic?'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-6429361148853152504</id><published>2009-03-29T16:16:00.002-04:00</published><updated>2009-03-29T16:22:23.104-04:00</updated><title type='text'>PyCon Organizers</title><content type='html'>The organizers did a bang up job this year.  With the addition of a green room for speaker prep (coffee available all day w/ your speaker badge) and walkie-talkies for the organizers everything went smoothly.   I heard a couple gripes about the Wifi but I haven't had any problems myself.&lt;br /&gt;&lt;br /&gt;The hitches are with the venue and are the usual complaints.  They charge $25/day for wifi in the hotel rooms.  We don't have projectors in the open space rooms because they want $600/per projector per day.  Coffee and beverage service gets torn down and put back up repeated so they can charge each time.  Annoying.&lt;br /&gt;&lt;br /&gt;The videos for the conference &lt;a href="http://pycon.blip.tv/posts?view=archive&amp;nsfw=dc"&gt;are already being posted&lt;/a&gt;.  This is an amazing feat - each talk has three video and several audio channels that have to be spliced together.    I'll link when mine goes up.&lt;br /&gt;&lt;br /&gt;Thanks guys!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-6429361148853152504?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/6429361148853152504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=6429361148853152504' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/6429361148853152504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/6429361148853152504'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/03/pycon-organizers.html' title='PyCon Organizers'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-9116129566995904795</id><published>2009-03-29T11:10:00.004-04:00</published><updated>2009-03-29T11:15:06.739-04:00</updated><title type='text'>Open Spaces Board is teh Funny</title><content type='html'>Someone got drunk and clever and backfilled yesterdays Open Spaces schedule board with fictional talks [typos mine, I was touch typing].  Another guy is making a panorama photo, I'll add a link when he sends it to me.&lt;br /&gt;&lt;br /&gt;Teach Me Ian Bicking.&lt;br /&gt;Settings.py: Why sysadmins love editing your .py files.&lt;br /&gt;A.N.U.S.: Plugabble Sphincters&lt;br /&gt;Traversal: URL mapping is for the west.&lt;br /&gt;Forking: because arguing is too hard.&lt;br /&gt;Djylons: Let's make it happen.&lt;br /&gt;Fulton v Rossum: Cage Match ($10)&lt;br /&gt;GROIN: Come see how it works.&lt;br /&gt;Zope: Making the simple IMPOSSIBLE.&lt;br /&gt;Plone: Making Zope unreadable.&lt;br /&gt;Acquisition Algebra: Fultonian mind fuck &amp; other OOPSLA oddities.&lt;br /&gt;Tic Tac Toe: Learn how to play, learn the secret strategies.&lt;br /&gt;Tresling: Arm wrestling + Tetris, let us teach you!&lt;br /&gt;Wheels: let's try them square (w/ pic of a trapazoid).&lt;br /&gt;Niagra Planning: Waterfall 2.0 session&lt;br /&gt;Catastophe Planning: Waterfall 3.0 session&lt;br /&gt;Play: Rubix cube with a brown belt.&lt;br /&gt;Reality: My hairy twisted pony.&lt;br /&gt;Pickle: Love/Hate.&lt;br /&gt;Let's get the hell out of Rosemont and find something decent to eat.&lt;br /&gt;re Rosemont: STEAK.&lt;br /&gt;ISO 9000: The future of python?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-9116129566995904795?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/9116129566995904795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=9116129566995904795' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/9116129566995904795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/9116129566995904795'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/03/open-spaces-board-is-teh-funny.html' title='Open Spaces Board is teh Funny'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-6566537503205692106</id><published>2009-03-28T15:37:00.008-04:00</published><updated>2009-03-28T17:52:34.472-04:00</updated><title type='text'>PyCon Day2</title><content type='html'>&lt;h4&gt;Class Decorators: Radically Simple&lt;/h4&gt;&lt;br /&gt;I gave my talk today, slides are available &lt;a href="http://us.pycon.org/2009/conference/schedule/event/55/"&gt;on the PyCon website&lt;/a&gt; (the ppt version might be crap - I exported from OpenOffice). I added two pages of speaker's notes at the top that answer some questions (and whargarbls) and some eratta.&lt;br /&gt;&lt;br /&gt;The final talk only shares a few slides with the PyConUK version and maybe none with the original EuroPython version.  I went to bed at midnight like a good boy but tossed and turned thinking of the talk until 2am.  At that point I gave up and rewrote a big chunk of the talk (which had already been rewritten since Boston two weeks ago).  I finished around 5am and then sacked out for 3 hours.  Somehow it managed to come in at the perfect length of 25 minutes (+5 for Q/A).&lt;br /&gt;&lt;br /&gt;Now that I have this talk licked, I'll be retiring it.  I have about 8 months to come up with an idea for next year.&lt;br /&gt;&lt;h4&gt;Talks&lt;/h4&gt;&lt;br /&gt;[updated as I go to them]&lt;br /&gt;Manfred Schwendinger: "Google App Engine: How to survive in Google's Ecosystem"&lt;br /&gt;This was a detailed description of how his particular application uses cloud services (they use both Amazon EC2 and Google AppEngine).  It was interesting but very detail oriented (we do this like this, and that like that).  I'll be downloading the slides for future reference.&lt;br /&gt;&lt;br /&gt;Bob Ippolito: "Drop ACID and think about data"&lt;br /&gt;Bob's talk was about using non-ACID (basically non-SQL) storage.  A good overview of why you, the web developer, probably don't care about the things ACID databases do well and don't care about the things alternate data stores (key-value, column-based, "persistent eventually") do badly.  It's a good trip through all the available alternatives.  A intro pitch about each class of stores and then a quick overview of the major implementations.  This talk was &lt;b&gt;packed&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Ned Betchelder: "Whirlwind Excursion thrhough Writing a C Extension"&lt;br /&gt;A good primer for writing modules and types in C.  It's a massive subject and Ned did a good job of showing one of everything.  I wasn't at the Boston meetup where he previewed his talk so I was glad to make this one.&lt;br /&gt;&lt;br /&gt;Alex Martelli: "Abstractions as Leverage"&lt;br /&gt;A typical Martelli talk, which is to say very good.  His sonorous voice would tame rabid badgers.  To say he's erudite doesn't begin to cover it - in 20 slides he used quotes from blogs, the American Journal of Psychriatry ("I recommend everyone subscribes"), and of course lots of dead people including a Chinese sword fighting manual (what, no Clausewitz?).  Here are some of the bullets (full slides http://aleax.it/python_abst.pdf)&lt;br /&gt;* to use an abstraction well you need to understand at least two layers below it&lt;br /&gt;* (Splosky's Law) "All Abstractions leak", which is to say all abstractions lie.&lt;br /&gt;* ex/ NFS isn't a cloal file system.  It can be useful to treat it like one but if you don't know how it works you are going to get burned sooner or later.&lt;br /&gt;* You can be a good python programmer without understanding how it is implemented but you can never be a great one. &lt;br /&gt;* You can't write a good abstraction unless you know they layers above too -- how it will actually be used.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-6566537503205692106?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/6566537503205692106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=6566537503205692106' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/6566537503205692106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/6566537503205692106'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/03/pycon-day2.html' title='PyCon Day2'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-620261920564575597</id><published>2009-03-27T14:41:00.005-04:00</published><updated>2009-03-27T22:52:56.337-04:00</updated><title type='text'>PyCon Day 1</title><content type='html'>Today is the first day of the conference proper.  The most popular talk (measured by the online talk planner widget) was canceled.  Titlted "Designing Applications with Non-Relational Databases" I was sure to go, but alas the speaker canceled for reasons unknown.&lt;br /&gt;&lt;br /&gt;This year there is a "Green Room" for speakers and conference volunteers.  I wasn't expecting it to be green but I was hoping for a lounge.  Instead it is a purely functional ops area - the network is run from here.  It has power strips, a test projector, and free coffee.  It might not have a wet bar but it is still a nice perk.&lt;br /&gt;&lt;h4&gt;Talks&lt;/h4&gt;&lt;br /&gt;[updated as I go to them]&lt;br /&gt;Brett Cannon "How Python is Developed."  It was a good overview of core python development pitched at newbies.  He sketched out the basic bug and feature cycles, how to [eventually] get core commit privs, etc.  It was mainly an informational session so it included lost of links to the existing documentation (some of which was written by Brett).&lt;br /&gt;Jess Noller "Introduction to Multiprocessing in Python."  'Multiprocessing' is a module that lets you do .. multiprocessing in python.  I only new vaguely what it did before.  Now I now kinda what it does.  I might know more but I was busy refactoring some itertools types [see below].&lt;br /&gt;Raymond Hettinger "Easy AI in Python."  A ramble through several different problems with code of the solvers.  The point is to show how easy it is to solve most problems.  So easy that a kid could literally do it (part of the talk was about why kids &lt;i&gt;should&lt;/i&gt; do it).  I missed most off this one because I was hacking [see below] but I'd seen it before so I didn't mind.&lt;br /&gt;&lt;h4&gt;Balls&lt;/h4&gt;&lt;br /&gt;I should read python-dev more regularly.  It turns out Hettinger went and implemented fast-C permutations, combinations, and cartesian product in the itertools module.  You know, just like &lt;a href="http://probstat.sourceforge.net/"&gt;the probstat module I wrote&lt;/a&gt;.  That old code is pretty un-pythonic (I wrote it in my inbetween stage so it is a generic lib with both python and perl wrappings).  I had a mostly finished rewrite that was CPython from the ground up and - suprise! - it looks almost identical to Raymond's.  Almost, I spun out the iterator into a separate object so the base object could have a len (iterators aren't allowed to support len).  His doesn't have random access but that is one of the things no one used on mine so I was going to drop it anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-620261920564575597?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/620261920564575597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=620261920564575597' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/620261920564575597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/620261920564575597'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/03/pycon-day-1.html' title='PyCon Day 1'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-2396003139131137541</id><published>2009-03-27T12:25:00.003-04:00</published><updated>2009-03-27T12:49:10.393-04:00</updated><title type='text'>Python Language Summit</title><content type='html'>[this is about yesterday, I'm getting caught up]&lt;br /&gt;&lt;br /&gt;Yesterday was the Python Language Summit.  40+ of the core developers of all the python implementations (CPython, Jython, IronPython) met to discuss &lt;i&gt;stuff&lt;/i&gt;.  The meeting was five hours in 1.25 hour chunks.  Morning topics included goals for future releases, the timing of future releases, and what processes we need to change, if any.  Afternoon topics were how to share more stuff (tests and benchmarks) across implementations, and how to combine different the various setup/packaging projects into one.&lt;br /&gt;&lt;br /&gt;Meeting face-to-face is always easier than using a mailing list.  The conversations are synchronous, latency is low, and decorum is higher.  The meeting could have used a dose of Robert's Rules of Order - it wasn't always clear when we had reached consensus so topics drifted until even tangents had been exhausted.  Some quick pronouncements might have been better.&lt;br /&gt;&lt;br /&gt;What decisions were made?  I'm not really sure.  Python 2.7 might be the last in the 2.x series, or it might not.  New libraries are more likely to get backported than new core language features.  If you were expecting to continue on the 2.x series until a magic day when you found yourself writing 3.x code you will be waiting forever.  There was some interest in writing a 3to2 source converter that mirrors the 3to2 tool.  Because 3.x has stronger semantics (only one obvious way to do it) a 3to2 tools is theoretically easier to write; but a 3to2 tool might also target many 2.x versions so "easier" is still a lot of work.&lt;br /&gt;&lt;br /&gt;The different implementations will be sharing more tests and benchmarks in the future.  Probably.  There was general agreement we should but it will be up to individuals to make it so (as always).  Ditto for packaging - everyone agreed that the different tools should combine but the devil is in the details - so the discussion is being moved to the packaging-SIG list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-2396003139131137541?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/2396003139131137541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=2396003139131137541' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2396003139131137541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2396003139131137541'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/03/python-language-summit_27.html' title='Python Language Summit'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-980726070375933912</id><published>2009-03-25T19:17:00.003-04:00</published><updated>2009-03-25T21:13:10.435-04:00</updated><title type='text'>In Chicago</title><content type='html'>All checked in at the Crown Plaza (where most of the core devs seem to be staying).  Took the hotel shuttle over with Glyph and Brian Dorsey.  Glyph and I had different flights from BOS to ORD but arrived at the same time.  Go figure.&lt;br /&gt;&lt;br /&gt;The talk of the town so far is &lt;a href="http://code.google.com/p/unladen-swallow/wiki/ProjectPlan"&gt;Unladen Swallow&lt;/a&gt; - a google effort to replace the CPython byte code machine with LLVM.  Goal #1 "Produce a version of Python at least 5x faster than CPython."  Holy S**t.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-980726070375933912?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/980726070375933912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=980726070375933912' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/980726070375933912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/980726070375933912'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/03/in-chicago.html' title='In Chicago'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-5879864413965489142</id><published>2009-03-24T22:35:00.003-04:00</published><updated>2009-03-24T23:15:48.411-04:00</updated><title type='text'>PyCon Tomorrow</title><content type='html'>I arrive in the afternoon on the 25th and will be there through April 1st (leaving in the PM).&lt;br /&gt;&lt;br /&gt;Tip: DO NOT bring a heavy coat unless you are from a sunshine state.  Chicago sounds cold but like last year it is supposed to be warmer in Chicago than Boston (55F+ during the day, 35F+ at night).  Last year I stepped off the airplane wearing an overcoat and it turned warm into sweltering hot.&lt;br /&gt;&lt;br /&gt;No mustache again this year .. and maybe never again.  While it was fun so was being a longhair with an eyebrow ring in the early 90s (dude, it was the early 90s).  Many things are fun, once.&lt;br /&gt;&lt;br /&gt;I have business cards this year.  Plain $0.25/ea Kinkos cards and not the $2.00/pop custom wonders I had at my tech/marketing company.  Last year I had neither and felt naked.&lt;br /&gt;&lt;br /&gt;Consider the above an announcement that I'm officially back in the job market;  tomorrow will be two years exactly that I've been on vacation.  My bowling game has improved greatly, my golf game not as much (though to be fair I've been bowling for 2 years and golfing for 25).  It was nice to be available to travel to every birthday/baptism/marriage/funeral/etc and go abroad on a whim but it does get old (and the pay stinks).  Mainly I'm looking forward to working with a team again.  Personal projects are fun but it ain't the same.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-5879864413965489142?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/5879864413965489142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=5879864413965489142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/5879864413965489142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/5879864413965489142'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/03/pycon-tomorrow.html' title='PyCon Tomorrow'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-349565932974872444</id><published>2009-03-18T21:54:00.004-04:00</published><updated>2009-03-18T23:15:03.407-04:00</updated><title type='text'>Afterward: PyCon on the Charles</title><content type='html'>The &lt;a href="http://jackdied.blogspot.com/2009/03/pycon-on-charles.html"&gt;Boston mini-PyCon&lt;/a&gt; went well.  The Beta House was at max capacity with 30+ in attendance.  I met &lt;a href="http://jessenoller.com/"&gt;Jesse Noller&lt;/a&gt; for the first time;  I'm not sure how this managed to be a first because he's a python dev and has been at the last few PyCons.  I'd bet there are pictures on flickr that have both of us in frame.&lt;br /&gt;&lt;br /&gt;Noller's talk was a thousand foot view of the plethora of multiprocessing/concurrent/messaging/you-name-it frameworks in python.  He compared the current proliferation to the mess of competing web and ORM frameworks of two years ago.  Sounds about right.&lt;br /&gt;&lt;br /&gt;Taylor's talk was about &lt;a href="http://fishsoup.net/software/reinteract/"&gt;Reinteract&lt;/a&gt;, his spreadsheetish interactive python shell.  I expected to sleep through this but the app is actually interesting.  It falls somewhere between IPython and Resolver One in functionality.  I'm sure he and the Resolver guys will have lots to talk about.&lt;br /&gt;&lt;br /&gt;My talk went OK.  Half the slides are new (again) and I really like the individual slides, but in the rewrite it lost its narrative (the "Radically Simple" of the title).  I loved the idea of jumping in on the second slide with an example titled "Why this is Cool" but it fell flat because the first slide didn't explain the pains and foibles of doing without class decorators.  I also need to reinsert the longer explanation of what decorators (and metaclasses and mixins) are.  The PyCon crowd will be more savvy than the Cambridge user's group but not &lt;i&gt;that&lt;/i&gt; much more savvy.  A few people said "that looks really cool but I have no idea WTF you are talking about."  My talk is flagged as "advanced" in the program but beginner/intermediate/advanced is ignored by attendees (and usually isn't on the printed schedule).&lt;br /&gt;&lt;br /&gt;Bruce Eckel will not be giving a keynote as he broke his leg badly while skiing.  This is a mixed blessing for me because Bruce's keynote was about class decorators and metaclasses.  Good for me because people won't skip my talk for his keynote.  Bad for me because I wanted to see his talk and was looking forward to talking to him.  Oh, and now I have a useless T-shirt that says "Bruce Eckel Stole My Talk" on the front and "I Stole Bruce Eckel's Talk" on the back.&lt;br /&gt;&lt;br /&gt;Ned Bachelder gave his PyCon talk &lt;a href="http://nedbatchelder.com/text/whirlext.html"&gt;A Whirlwind Excursion through Python C Extensions&lt;/a&gt; at the previous meetup.  Do click the link, it includes his slides interspersed with his own commentary.  I did a similar talk titled "Writing Your Own Python Types in C" a couple years ago so Ned &amp; I traded notes.  One of the slides is a nod to our conversation.  It isn't as egoboo as the time time Guido gave me full slide w/ attribution in his "State of Python" address, but I'll take it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-349565932974872444?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/349565932974872444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=349565932974872444' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/349565932974872444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/349565932974872444'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/03/afterward-pycon-on-charles.html' title='Afterward: PyCon on the Charles'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-8715827058169185834</id><published>2009-03-03T10:05:00.006-05:00</published><updated>2009-03-18T03:09:33.424-04:00</updated><title type='text'>PyCon on the Charles</title><content type='html'>&lt;a href="http://nedbatchelder.com/blog/index.html"&gt;Ned Batchelder&lt;/a&gt; has organized a preview/practice session of all the Boston based pythoneer's talks.  Ned gave his talk last month at the Cambridge meetup, and March 18th there will be a three hour session with Jesse Noller, Owen Taylor, and me at the &lt;a href="http://coworking.pbwiki.com/CoworkingBoston"&gt;Beta House&lt;/a&gt;.  Talks start at 6:30pm.  If you haven't been to a PyCon it is a chance to see a mini version of one.  I'll even bring the beer.&lt;br /&gt;&lt;br /&gt;Talks are:&lt;br /&gt;Noller: &lt;a href="http://us.pycon.org/2009/conference/schedule/event/69/"&gt;Concurrency and Distributed Computing with Python Today&lt;/a&gt;&lt;br /&gt;Taylor: &lt;a href="http://us.pycon.org/2009/conference/schedule/event/23/"&gt;Reinteract: a better way to interact with Python&lt;/a&gt;&lt;br /&gt;Diederich: &lt;a href="http://us.pycon.org/2009/conference/schedule/event/55/"&gt;Class Decorators: Radically Simple&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;[fixed] I misattributed Taylor's talk to someone else.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-8715827058169185834?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/8715827058169185834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=8715827058169185834' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8715827058169185834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8715827058169185834'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/03/pycon-on-charles.html' title='PyCon on the Charles'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-6812051022122719961</id><published>2009-03-01T11:49:00.004-05:00</published><updated>2009-03-01T12:01:43.510-05:00</updated><title type='text'>Python Language Summit</title><content type='html'>[cross posted from my non-python blog with some minor edits]&lt;br /&gt;&lt;br /&gt;I just got my invitation to the &lt;a href="http://us.pycon.org/2009/about/summits/language/"&gt;Python language summit&lt;/a&gt;.  I had planned on going anyway, so the invitation just makes it less awkward for everyone involved.  The summit overlaps with the tutorial days of &lt;a href="http://us.pycon.org/2009/about/"&gt;PyCon&lt;/a&gt; because, well, by definition if you belong in the summit you don't belong in the tutorials [tutorial instructors can suck it].&lt;p&gt;&lt;br /&gt;The summit is interesting because it is unusual* - open source events are usually open access too.  The agenda is wide open and is roughly focused on standardization and &lt;i&gt;the future&lt;/i&gt;, whatever that is.  The invitees are the core developers of &lt;i&gt;all&lt;/i&gt; the implementations of Python: regular Python (aka "CPython"), Jython (Java), and IronPython (C#).&lt;p&gt;&lt;br /&gt;I'm not sure what the purpose of the invites is, other than to convey weight.  To make the list is to ask "who are the 50 people on the planet who would actually want to come?"  Griefers and trolls would be bounced regardless [come to think of it, maybe I was invited because I have no compunctions about bouncing griefers and trolls] so perhaps the invitations are meant to discourage the well meaning but clueless.  Every convention has at least a few of those - does anyone remember the "callable None" guy from a few years back?  "well meaning but clueless" doesn't begin to describe him.&lt;p&gt;&lt;br /&gt;&lt;br /&gt;* It is not without precedent. See the &lt;a href="http://jackdied.com/archive/363-369"&gt;the Reykjavik sprint&lt;/a&gt;. [my favorite bit from those posts "Cod jerky smells a bit like feet but tastes OK. Dried shark smells a lot like feet and tastes exactly like dried asshole."]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-6812051022122719961?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/6812051022122719961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=6812051022122719961' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/6812051022122719961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/6812051022122719961'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/03/python-language-summit.html' title='Python Language Summit'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-1244199981637967271</id><published>2009-02-13T12:55:00.002-05:00</published><updated>2009-02-13T12:58:45.479-05:00</updated><title type='text'>PSA: Wireless Keyboards</title><content type='html'>The batteries in your wireless keyboard don't die at arbitrarily long intervals.  You put your cellphone close to the receiver at arbitrary intervals and then move it while changing the batteries.&lt;br /&gt;&lt;br /&gt;And by "you" I mean "me."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-1244199981637967271?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/1244199981637967271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=1244199981637967271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/1244199981637967271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/1244199981637967271'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/02/psa-wireless-keyboards.html' title='PSA: Wireless Keyboards'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-8037426485182776849</id><published>2009-01-22T12:05:00.007-05:00</published><updated>2009-02-07T16:13:22.179-05:00</updated><title type='text'>Look Who's [not] Talking at PyCon</title><content type='html'>The &lt;a href="http://us.pycon.org/2009/conference/talks/"&gt;schedule is up&lt;/a&gt; and it looks good.  It is a mix of conference warriors plus some new blood; likewise the talks are a mix of old standards and new topics (some of the new talks are by conference warriors and vice versa).&lt;br /&gt;&lt;br /&gt;The familiar names include Brett Cannon (cpython), Jim Baker, (jython), and Michael Foord (ironpython).  There is a host of names that might be missing or might not - I can't recall if they do talks every year - but there is no Norwitz, Warsaw, Holden, or Martelli.  Noticeably absent is Raymond Hettinger who has given several talks per con at several cons a year.  Noticeably present is EVE Online in the form of Richard Tew and Krisjan;  with the Icelandic Krona where it is I don't know how they can afford a taxi let alone air fare.&lt;br /&gt;&lt;br /&gt;On the new list is Bill Gribble.  Bill Gribble gets a free beer for having one of the best names ever (if his Mother shows up she can collect for her work, instead).  I bet none of his friends ever start a story "I was having lunch with my friend Bill..."  But instead always "I was having lunch with my friend Bill Gribble..."  I don't know Gribble from a hole in the wall but I'll make a point of changing that.&lt;br /&gt;&lt;br /&gt;[update]  Talked to Raymond and he'll be attending, at least (barring life's usual caveats).&lt;br /&gt;[updateder] As Brett and Ivan mention in the comments there is now a tier of &lt;a href="http://us.pycon.org/2009/conference/keynotes/"&gt;invited talks&lt;/a&gt; that includes many of the "missing" conference regulars.  Glad to have em, the "hall track" is my favorite and many on the invited speakers list make it so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-8037426485182776849?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/8037426485182776849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=8037426485182776849' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8037426485182776849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8037426485182776849'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/01/look-whos-not-talking-at-pycon.html' title='Look Who&apos;s [not] Talking at PyCon'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-9049826604130211783</id><published>2009-01-18T18:38:00.003-05:00</published><updated>2009-01-18T19:58:58.901-05:00</updated><title type='text'>Post's Machine</title><content type='html'>An undergrad CompSci major, Shriphani Palakodety, &lt;a href="http://shriphani.com/blog/2009/01/17/posts-machine-emulator/"&gt;posted an implementation of Post's Machine&lt;/a&gt;.  Post's machine is a simple computer that has separate data and execution storage.  Here's my implementation and my advice to Shriphani - Keep it simple! When working on hard problems post-graduation you'll find that code gets complicated of its own volition.  The job of the writer is to fight it at every turn (the next guy to come along will appreciate the effort).&lt;br /&gt;&lt;br /&gt;This version replaces the two custom containers with python dicts and moves all the complicated code to the pretty printer.  A collections.defaultdict might be a slightly better choice for the 'infinite tape' that starts as all zeros.  A nice thing about defaultdicts is that you can min() and max() even empty dicts.&lt;br /&gt;&lt;br /&gt;I also did a python3.0 version which was nearly identical except for a 'with' on the file open and print-as-fucntion.  Disappointingly I thought the advanced tuple unpack syntax would help in the case where a too-short tuple is padded and then the padding discarded.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# args might be a two or three tuple&lt;br /&gt;a, b, c = (args + [0])[:3]&lt;br /&gt;&lt;br /&gt;# python3 syntax&lt;br /&gt;a, b, c, *ignore = args + [0]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The *ignore argument demands to be read as opposed to the [:3] trimmer on the end which keeps the low profile it deserves.&lt;br /&gt;&lt;br /&gt;Here's the code for my Post Machine&lt;br /&gt;&lt;pre&gt;def parse(lines):&lt;br /&gt;  program = {}&lt;br /&gt;  for line in lines:&lt;br /&gt;    pos, action, jump = [p.strip() for p in line.split(',') + ['0']][:3]&lt;br /&gt;    program[pos] = action, jump&lt;br /&gt;  return program&lt;br /&gt;&lt;br /&gt;def execute(program):&lt;br /&gt;  tape = {}&lt;br /&gt;  tape_pos = 0&lt;br /&gt;  action = None&lt;br /&gt;  action_pos = '0'&lt;br /&gt;&lt;br /&gt;  while action != 'exit':&lt;br /&gt;    action, action_pos = program[action_pos]&lt;br /&gt;&lt;br /&gt;    pretty_tape(tape, tape_pos)&lt;br /&gt;&lt;br /&gt;    if action == '&lt;':&lt;br /&gt;      tape_pos -= 1&lt;br /&gt;    elif action == '&gt;':&lt;br /&gt;      tape_pos += 1&lt;br /&gt;    elif action == 'mark':&lt;br /&gt;      tape[tape_pos] = 1&lt;br /&gt;    elif action == 'unmark':&lt;br /&gt;      tape[tape_pos] = 0&lt;br /&gt;&lt;br /&gt;  return tape, tape_pos&lt;br /&gt;&lt;br /&gt;def pretty_tape(tape, tape_pos):&lt;br /&gt;  if not tape:&lt;br /&gt;    tape = {0:0}&lt;br /&gt;  min_pos = min(tape_pos, min(tape), 0)&lt;br /&gt;  max_pos = max(tape_pos, max(tape), 4)&lt;br /&gt;&lt;br /&gt;  parts = []&lt;br /&gt;  for pos in range(min_pos, max_pos + 1):&lt;br /&gt;    val = tape.get(pos, 0)&lt;br /&gt;    if pos == tape_pos:&lt;br /&gt;      parts.append('[%d]' % val)&lt;br /&gt;    else:&lt;br /&gt;      parts.append('%d' % val)&lt;br /&gt;&lt;br /&gt;  print '.....', ', '.join(parts), '.....'&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;  program = parse(open('post.txt'))&lt;br /&gt;  execute(program)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-9049826604130211783?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/9049826604130211783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=9049826604130211783' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/9049826604130211783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/9049826604130211783'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2009/01/posts-machine.html' title='Post&apos;s Machine'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-5858629502903130940</id><published>2008-12-16T09:05:00.002-05:00</published><updated>2008-12-16T09:26:10.513-05:00</updated><title type='text'>PyCon Talk Accepted</title><content type='html'>I received my talk acceptance email yesterday.  On schedule, even!  The PyCon organzers get more polished every year (I didn't submit a talk last year so maybe this isn't new).  It will be interesting when they publish the stats for talk proposals.  I vaguely recall that the rate was 50% last year and 80% the year before that.  The attendee numbers doubled between '06 and '07 so the number of proposals likely did too.&lt;br /&gt;&lt;br /&gt;The email included the anonymous reviews of the proposal.  Most were +1 but I'll keep in mind the +0 and -1s when preparing the new version of the talk.  They were mostly concerned that the PyCon UK version of the slides was too code heavy.  There is even more material now that decorators are in use "in the wild" so I may shunt those into a separate tutorial-like paper or maybe just include them as slides after the end so people who download the .pdf will see them.&lt;br /&gt;&lt;br /&gt;I'll definitely have to prep and practice the new talk well in advance of PyCon.  Lots of possibilities there;  The Colorado Python group get together to practice all their member's talks every year - we could get the Boston PIG to do something similar.  And I could make a show-me-do thing.  And I'll definitely give it to the pythoners at my old company as a trial run.&lt;br /&gt;&lt;br /&gt;Don't forget to register early for PyCon.  We maxed out the hotel some nights last year and this year should be even bigger.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-5858629502903130940?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/5858629502903130940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=5858629502903130940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/5858629502903130940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/5858629502903130940'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/12/pycon-talk-accepted.html' title='PyCon Talk Accepted'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-5334461473625253088</id><published>2008-11-12T15:21:00.002-05:00</published><updated>2008-11-12T15:29:29.438-05:00</updated><title type='text'>PyCon 2009 Plans</title><content type='html'>I'll be there.  I submitted a talk proposal for a further refined version of my &lt;a href="http://jackdied.blogspot.com/2008/09/pycon-uk-class-decorators-radically.html"&gt;class decorators&lt;/a&gt; talk.  Since that talk people have actually started to write useful class decorators that weren't just replacements for metaclass hacks.  The &lt;a href="http://www.voidspace.org.uk/python/weblog/arch_d7_2008_10_04.shtml"&gt;total ordering decorator&lt;/a&gt;, for instance, modifies a class that implements the __lt__ comparison to have ALL the comparison operators.  For the talk I'll also work up a decorator to replace UserDict: define __getitem__ and the deco will add __contains__, etc.  I always thought mixins were a hack, frankly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-5334461473625253088?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/5334461473625253088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=5334461473625253088' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/5334461473625253088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/5334461473625253088'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/11/pycon-2009-plans.html' title='PyCon 2009 Plans'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-2121374084774268348</id><published>2008-09-16T17:06:00.007-04:00</published><updated>2008-11-18T19:43:45.315-05:00</updated><title type='text'>Post PyCon UK</title><content type='html'>Due to my harried transit I didn't get to prepare my lightning talk "PyAsshole: Simulating a partial information non trump card drinking game in Python."  I did spend my flight home working on a simulator.  It currently onl-y has one strategy (random legal plays) so I have to add a player that uses my preferred strategy [play to win or - when you can't - play not to lose].  I'll also have to implement a drink count in the simulation.  The idea is that no matter what the player plays he has a chance of reverting to a random play at a chance based on his drink count.&lt;br /&gt;&lt;br /&gt;Unfortunately adding in a drink count immediately injects a social (and thus very hard to model) component to the game.  The mechanical rules say you drink if you are skipped or if you pass.  But the social rules say you can be made to drink for any reason by someone higher than you in the chain.  People being people those optional drinks are subject to retribution and those kinds of things are very hard to model.  I expect tit-for-tat to work well in simulated play but that completely ignores the human propensity which is to engage in cooperative play.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-2121374084774268348?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/2121374084774268348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=2121374084774268348' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2121374084774268348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2121374084774268348'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/09/post-pycok-uk.html' title='Post PyCon UK'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-1213437701170088003</id><published>2008-09-14T08:28:00.006-04:00</published><updated>2008-09-16T16:54:29.828-04:00</updated><title type='text'>PyCon UK:  Class Decorators, Radically Simple</title><content type='html'>I'm giving a new version of my EuroPython talk, &lt;a href="http://jackdied.com/jackdied/decos_and_metas_uk.pdf"&gt;Class Decorators: Radically Simple&lt;/a&gt;.&lt;p&gt;&lt;br /&gt;Two thirds of the slides are new.  There is much more front end emphasis on what decorators are and simple function decorators examples.  The examples of class decorators and metaclasses have also changed.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Post Con&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I changed the slide that used the old 3rd party decorator module to use the standard lib functools equivalent.&lt;br /&gt;&lt;br /&gt;Speakers thoughts:  The details of this talk were substantially different than the EuroPython version.  I had more slides but there was less talky-talk involved with each one so it ended up the same at about twenty minutes.  I intend to rejigger it again and submit it to PyCon as a mix of the two talks.  The more concrete slides at PyCon UK went over well but most of the metaclass banter fell off and all the esoteric stuff (which will probably stay dead).  The topical slide about getting my passport was skipped during the presentation - I did it as a lightning talk instead.&lt;br /&gt;&lt;br /&gt;I wasn't nervous for the talk itself, there were maybe 75 people in the audience.  I was nervous for my 5 minute lightning talk immediately afterward "How to get a new US passport same-day while committing the minimum number of felonies."  I don't know why - I've spoken in front of larger crowds before and the idea of lightning talks is that they aren't expected to be polished (I had no slides and just spoke extemporaneously).  The lightning talk went well and might have tied for the highest number of laugh-lines with the other humorous talk "Why I love Zeppelins."&lt;br /&gt;&lt;br /&gt;Next time I intend to cheat and take some &lt;a href="http://www.ethanwiner.com/BetaBlox.html"&gt;Beta Blockers&lt;/a&gt; before any speech.  For those who don't know: beta blockers repress the physical symptoms of the fight-or-flight reflex only and don't change your brain.  So they will suppress a quiver in your voice or hands but don't help with "umms" or "aahs."  The only way to suppress the um/ah reflex is to practice before hand - a mirror works fine;  just have enough canned variations on the topic that you can pick and choose the most suitable one at runtime which is more fluid than you think.&lt;br /&gt;&lt;br /&gt;I only had one question during the talk and one question afterward.  I'll have to think of ways to introduce more uncertainly into the talk for my next version.  The first version At EuroPython elicited two or three questions during the talk and two or three after.  Based on that feedback I answered those in this version but I'd like to generate some new ones next time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-1213437701170088003?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/1213437701170088003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=1213437701170088003' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/1213437701170088003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/1213437701170088003'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/09/pycon-uk-class-decorators-radically.html' title='PyCon UK:  Class Decorators, Radically Simple'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-1189315958828997354</id><published>2008-09-10T21:07:00.004-04:00</published><updated>2008-09-10T21:17:23.677-04:00</updated><title type='text'>PyCon UK Flight Plans</title><content type='html'>What to do with on a 12 hour flight between Boston and Birmingham (1 stop in Amersterdam)?&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;I could work on my presentation.  This would be OK but not ideal since I don't have internet conectivity to look stuff up.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I could work on my lightning talk: "PyAsshole: Simulating a partial information non trump card drinking game in Python."  I'll do some of that but I only have five hours of batteries. [if you aren't familiar &lt;a href="http://www.pagat.com/climbing/asshole.html"&gt;see here&lt;/a&gt; for one set of rules]&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I could bring Neal Stephenson's Anathem but I could fit two or three other books in my bag instead of that door stop; I'll do that because if I can't get into his book I'm stuck with it.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;I'll likely do a mix of PyAsshole and books with at least one of those being Heinlein's &lt;i&gt;The Moon is a Harsh Mistress&lt;/i&gt; which is frequently cited but which I've never read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-1189315958828997354?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/1189315958828997354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=1189315958828997354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/1189315958828997354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/1189315958828997354'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/09/pycon-uk-flight-plans.html' title='PyCon UK Flight Plans'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-1547535426966659622</id><published>2008-08-11T01:29:00.002-04:00</published><updated>2008-08-11T01:45:33.588-04:00</updated><title type='text'>Speaking at UK Python</title><content type='html'>The &lt;a href="http://www.pyconuk.org/timetable.html"&gt;talk schedule&lt;/a&gt; for UK python is posted and I'm on it.  Conferences are a good time by themselves but I'd be lying if I said I don't enjoy talking in addition to attending.&lt;br /&gt;&lt;br /&gt;The schedule is a bit funky with four rooms instead of the standard three.  It is an interesting experiment so I hope one of the organizers will write up the reasons for, and the results of afterwords.  UK Python is expected to be small at ~200 people (the size of PyCon 10 years ago).  Small ventures are expected to experiment because the cost of failure is low and the rewards of success are high.  I don't have a horse in this race so I'm happy to watch and see.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-1547535426966659622?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/1547535426966659622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=1547535426966659622' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/1547535426966659622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/1547535426966659622'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/08/speaking-at-uk-python.html' title='Speaking at UK Python'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-3809578158099379650</id><published>2008-08-08T20:23:00.004-04:00</published><updated>2008-08-08T20:53:16.016-04:00</updated><title type='text'>UK Python Plans</title><content type='html'>I submitted a talk this week which is hopefully not too late.  I do like the idea of rolling admissions as opposed to the aspirational deadlines of other Py* conferences.  "The dealine is Monday! and this time we really mean it!"  The talk is a version of my EuroPython one with feedback from the first time I gave it.&lt;br /&gt;&lt;br /&gt;I'll be there for UK python even if my talk isn't accepted (please disregard this if you are on the UK program committee).  I've technically been on English soil before but practically I don't think airports really count.  By the same token I've visited California and Hawaii.&lt;br /&gt;&lt;br /&gt;See you there and hopefully the yobs, chavs, and hoodies aren't as bad as the UK papers make out*.&lt;br /&gt;&lt;br /&gt;* There were many commonwealth attendees at EuroPython and the pan-national conference attracted ex-patriots in particular.  I've always toyed with the idea of being an expat and some nudged me to expatriate to the UK.  I dismissed the idea with some bluster about not being able to carry a gun or a proper knife.  Not that I carry a gun;  the nice thing about being an American is the free rider effect (crims don't know that you aren't carrying, they just know that some people are).  I will be at the range tomorrow and will likely post pictures on &lt;a href="http://jackdied.com"&gt;my non-python blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-3809578158099379650?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/3809578158099379650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=3809578158099379650' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/3809578158099379650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/3809578158099379650'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/08/uk-python-plans.html' title='UK Python Plans'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-3820367220670311691</id><published>2008-07-28T00:39:00.005-04:00</published><updated>2008-07-28T03:54:38.796-04:00</updated><title type='text'>German, American, or Other? Part II</title><content type='html'>My PyCon 2008 posts included an item &lt;a href="http://jackdied.blogspot.com/2008/03/misc-from-pycon-ii.html"&gt;"German, American, or Other"&lt;/a&gt; with a list of core python developers (anyone with subversion privs) and a guessing game on nationality.  I just updated the post with some statistics on how many Americans come from German immigrants (hint: lots) but I'll repeat the update up top.&lt;br /&gt;&lt;br /&gt;German ancestry is dominant** in &lt;a href="http://en.wikipedia.org/wiki/German_American"&gt;17% of Americans&lt;/a&gt; or about 50 million people.   You can be 1% German and have a German last name or 99% German and have a Spanish last name but if people mate randomly* the number of people with German last names would be at least as high as the number of people who self-report that they are mostly of German ancestry.  There are 80 million Germans and somewhere near that number of Americans with German last names so this quiz becomes somewhat less surprising in hindsight.&lt;br /&gt;&lt;br /&gt;* and mate randomly they do.  The urge to mate is much stronger than any weak favoritism for ethnic continuity.  In the US the idea that like-marries-like doesn't last for two generations (see "My Big Fat Greek Wedding").  And the idea is weakest in the majority (aka white people).  Growing up I was amazed that the O'Dea kids down the street were 100% Irish.  They weren't recent immigrants so the only thing in my mind was: wow, what are the odds?&lt;br /&gt;&lt;br /&gt;If you want another anecdote, here's one: my father's father (who's last name I have, obviously) did not like the &lt;a href="http://en.wikipedia.org/wiki/Pennsylvania_Dutch"&gt;Pennsylvania Dutch&lt;/a&gt; ("Dutch" being the popular corruption of "Deutsch") .  He was a 3rd generation New York German but he didn't care for the country bumpkin Pennsylvania Germans who got on a Westward boat 10+ generations before his own ancestors.  His bias was entirely theoretical and limited to jokes and stereotypes.  He didn't consider my mother (100% Dutchy) or any of her family as "Dutchy" because they were doctors, lawyers, businessmen, and engineers.  He was encouraged to not bring it up and everyone else was reminded that he didn't really mean it.  "Etlay itway opdray" is our family motto so this was rarely a problem.&lt;br /&gt;&lt;br /&gt;** German ancestry is a plurality but thankfully English/Scottish law is dominant.  At the time of the Constitutional Convention in Philadelphia, Pennsylvania the dominant language in Pennsylvania was actually German.  Those German speaking Americans were not parochial, however, they voted to make English the official language of the state. &lt;br /&gt;&lt;br /&gt;NB, if you ever read a story about harsh race relations in America please take my grandfather's story into account.  My grandfather's rhetoric far exceeded reality.  His words (accurately quoted!) would have been an indictment but were far different than his beliefs in practice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-3820367220670311691?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/3820367220670311691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=3820367220670311691' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/3820367220670311691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/3820367220670311691'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/07/german-american-or-other-part-ii.html' title='German, American, or Other? Part II'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-7730758749822372333</id><published>2008-07-22T18:23:00.003-04:00</published><updated>2008-07-22T18:25:37.941-04:00</updated><title type='text'>QOTW</title><content type='html'>&lt;blockquote&gt;I suspect you've spent too much time using Python when you start calling C variable assignments "mutations" ;-) &lt;/blockquote&gt;&lt;br /&gt;Fredrik Lundh in a &lt;a href="http://nedbatchelder.com/blog/200807/on_the_counterintuitiveness_of_speed.html"&gt;thread at Ned Batchelder's blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-7730758749822372333?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/7730758749822372333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=7730758749822372333' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/7730758749822372333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/7730758749822372333'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/07/qotw.html' title='QOTW'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-8553674526104986439</id><published>2008-07-11T19:00:00.009-04:00</published><updated>2008-07-11T22:41:55.740-04:00</updated><title type='text'>ICFP at a Glance</title><content type='html'>This years problem is simple and very very hard (otherwise it wouldn't be much of a contest).  It is a hard path finding problem with time constraints like many past years. Unlike &lt;i&gt;recent&lt;/i&gt; years the problem doesn't favor big teams or teams with lots of CPU power.  OK, it favors them a little but not much.&lt;br /&gt;&lt;br /&gt;The problem is to write a "Mars Rover" control program that communicates over a TCP/IP socket and receives and sends messages with a small real-ish time delay (around ~100ms).  All submitted programs will run on the same hardware so the team with the best algos will likely win.&lt;br /&gt;&lt;br /&gt;Bob is out but I'm still sticking to the bourbon and steaks theme.  I spent an hour on the porch reading and interpreting the problem.  And I brought some friends:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://jackdied.com/static/icfp_lobster.jpg"&gt;&lt;br /&gt;&lt;br /&gt;Beside Huey, Duey, and Louey are the printed problem description, a fifth of Bulleit bourbon, my engineering notebook, and a trusty Uni-Ball Roller (blue).&lt;br /&gt;&lt;br /&gt;If it doesn't violate the rules ... here is how I'm approaching the problem for a first draft:&lt;br /&gt;* ignore the delay in sending commands&lt;br /&gt;* treat all boulders and craters as square&lt;br /&gt;* treat hostile martians as immobile boulders&lt;br /&gt;&lt;br /&gt;As the joke goes a Physicist was asked to guess how much a horse weighed and said "Well first we assume the horse is a sphere..."   Good enough for a first estimate.&lt;br /&gt;&lt;br /&gt;You will notice that I'm a good sport - the rubber bands have been cut on the lobsters.  Also, lobsters aren't a big deal in Boston.  They cost $8/lb (similar to luncheon ham) so what would be extravagant in land-locked Iowa costs just $30 here.&lt;br /&gt;&lt;br /&gt;The problem has a bunch of complicating quirks, of course.  It may be profitable to crash into a boulder to slow down and on some maps it may be best to suicide as quickly as possible because of the scoring system.  20 grad students spent a month designing the problem so I'm sure more subtleties will out.  Bastards.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Aside&lt;/b&gt; I should have mentioned that I went bowling before food shopping and the problem was published.  152, 159 - not good but not terrible considering I was jet lagged and I was a week out of practice.  Plus the lanes were messy (that's my excuse and I'm sticking to it).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-8553674526104986439?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/8553674526104986439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=8553674526104986439' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8553674526104986439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8553674526104986439'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/07/icfp-at-glance.html' title='ICFP at a Glance'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-7508077811783240535</id><published>2008-07-11T11:11:00.006-04:00</published><updated>2008-07-11T11:49:47.682-04:00</updated><title type='text'>ICFP 2008 Starts NOW</title><content type='html'>The &lt;a href="http://icfpcontest.org/?2008"&gt;ICFP programming contest&lt;/a&gt; starts in a couple hours.  I have done it the past five+ years and care enough that I flew back from EuroPython early just so I could participate.  Unfortunately my usual compatriot Bob (an Electrical Engineer) has been sidelined by an illness.  This is a double blow because not only do I not have a second, our normal weekend of beers and grilling (really $50 bottles of bourbon and &lt;a href="http://www.omahasteaks.com/servlet/OnlineShopping"&gt;Omaha Steaks&lt;/a&gt;) is off.&lt;br /&gt;&lt;br /&gt;I'll be doing it anyway but with a reduced level of fun (and likely success).  If anyone reading this wants to participate let me know.  I'll be running a bzr repository and depending on the problem (which changes by year) the code will be somewhere between 90% python and 90% C.&lt;br /&gt;&lt;br /&gt;Foord, Brandl?  I'm looking your way.&lt;br /&gt;&lt;br /&gt;I've been meaning to publish my contact information for a long time;  &lt;a href="http://patrickweb.com/index.php"&gt;John Patrick&lt;/a&gt; has been a big deal at IBM for a long time and published "Net Attitude."  He makes all his contact information (phone, IM handle, etc) publicly available and swears that is no more than a nuisance.  Previously my information was unpublished and the biggest nuisances were head hunters and telemarketers.  To put it a different way: all the annoying people already can find me, so why not make it public?&lt;br /&gt;&lt;br /&gt;So if you are looking for semi-serious team for the ICFP contact me at jackdied@gmail.com or 617 821 1734 ('mercian).  If you're in Boston there are a few wifi enabled cafes/bars/restaurants where we could collaborate.&lt;br /&gt;&lt;br /&gt;3 hours until the problem is published.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-7508077811783240535?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/7508077811783240535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=7508077811783240535' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/7508077811783240535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/7508077811783240535'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/07/icfp-2008-starts-now.html' title='ICFP 2008 Starts NOW'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-2129034282491160276</id><published>2008-07-10T23:41:00.005-04:00</published><updated>2008-07-11T09:28:32.312-04:00</updated><title type='text'>EuroPython Errata</title><content type='html'>Hettinger used tinyurl URLs in all his presentations to give short URLs to resources like CPython source code.  Unfortunately I miss-typed a '3' into an 'E' and landed on a gay porn page.  This wouldn't have been a problem but I was sitting in the front row and the room lights were out so my screen was BRIGHT.  I couldn't just close the page because it had popups, I had to bookmark it first, etc.&lt;br /&gt;&lt;br /&gt;The price of a con varies but costs about the same as a vacation.  For EuroPython the plane ticket from Boston to Vilnius was $1400 ($600 for the airline, $800 in taxes!),  conference hotel was 100 euros/night, walking-around money was $60/day.  If you plan ahead (which I did not) you can save money on everything but the airfare.  Some of the attendees stayed at a hostel (15 Euros/night) or rented an apartment (50 euros/night).  Food and drink prices vary by city: PyCon Chicago was about $100/day, and the Iceland sprint was about $200/day.  You can avoid that by buying food and drink at a supermarket which are reachable by public transport.  Conventions are vacations for me so I voluntarily spend quite a bit around town.&lt;br /&gt;&lt;br /&gt;Vilnius was unusually cheap.  The public bus from the airport cost 1.10 litas (about $0.30 US).  I thought the hotel was unusually cheap - the venison (deer) plate was 35 litas ($11 us) and 0.5 liters of beer 9 litas ($3 us).  The hotel was expensive - prices in town were around 25 litas for a meal and 4.5 litas for a beer.&lt;br /&gt;&lt;br /&gt;Conferences should have water and coffee available ALL THE TIME.  The PyCon organizers tried to do this but the hotel staff sometimes cleared the service.  At EuroPython coffee was available all day but water only rarely;  the hotel had no water fountains, none at all (are water fountains an American thing?).&lt;br /&gt;&lt;br /&gt;Vilnius is not a wealthy country.  Our hotel seemed to be the center of the "jet set" for Lithuania.  The casino in the hotel basement was full of locals spending flashy money and the stip club across the street the same (so I am told).&lt;br /&gt;&lt;br /&gt;Bars close whenever they feel like, as do restaurants.  We had to leave a diner/breakfast place at 7am because &lt;i&gt;they were closing&lt;/i&gt;.  The casino was open 24 hours a day but to get in you must give them all your information and they take your picture.  I think I mostly thwarted them with my state drivers license and a bad picture.  I didn't gamble - the rest of the hotel barstaff went on strike but the casino did not.&lt;br /&gt;&lt;br /&gt;A Vilnius taxi ("taksi") costs twice as much if you hail one on the street instead of calling.  This is the local law.  So if you need a cab have the hotel call one for you.&lt;br /&gt;&lt;br /&gt;I was worried about attendees English (mostly for my presentation).  The ESL (English as a Second Language) English was as good at EuroPython as at PyCon.  Also, the material being technical python stuff most of the written content is understandable even if you don't speak the language (I can read &lt;a href="http://pocoo.org/%7Egbrandl/pypy.pdf"&gt;Brandl's PyPy talk&lt;/a&gt; just fine and I know zero German).&lt;br /&gt;&lt;br /&gt;PyCon is about 3/4 American and 1/4 other.  EuroPython was the reverse.&lt;br /&gt;&lt;br /&gt;If you are standing in a group of people and two of them have speaker's badges then ALL of them will have speaker's badges.  This isn't because of elitism; it is because the speakers tend to speak everywhere so they already know each other.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-2129034282491160276?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/2129034282491160276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=2129034282491160276' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2129034282491160276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2129034282491160276'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/07/europython-errata.html' title='EuroPython Errata'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-3392214445467351962</id><published>2008-07-09T08:34:00.006-04:00</published><updated>2008-07-10T04:30:38.411-04:00</updated><title type='text'>Class Decorators: Radically Simple</title><content type='html'>The slides for my presenation are now online: &lt;a href="http://www.europython.org/TalkMaterials?action=AttachFile&amp;do=view&amp;target=class_decorators_radically_simple.pdf"&gt;Class Decorators: Radically Simple&lt;/a&gt;.  Hopefully the pdf export worked OK.&lt;br /&gt;&lt;br /&gt;The talk went reasonably well but I went a bit too fast and finished in 20 minutes instead of 25.  I did have a full room.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update&lt;/b&gt; Christ on a crutch and other blasphemies - The talks weren't recorded but I turned on my video camera and left it next to me on the desk.  The audio was pretty good and oh boy - I really talked much too fast.  I need to master talking in front of 150 people at the same speed that I talk to five.&lt;br /&gt;&lt;br /&gt;I also dislike what my voice sounds like on tape, but that is a normal thing.  Also, most people can't expect to be as sonorous ss Alex Martelli (an Italian with a booming voice and a English diction that would put most teachers to shame).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-3392214445467351962?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/3392214445467351962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=3392214445467351962' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/3392214445467351962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/3392214445467351962'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/07/class-decorators-radically-simple.html' title='Class Decorators: Radically Simple'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-3331702296833374004</id><published>2008-07-05T13:49:00.005-04:00</published><updated>2008-07-08T18:34:13.853-04:00</updated><title type='text'>Off to EuroPython</title><content type='html'>My flight out of Boston leaves in a few hours.  I'll be arriving in Vilnius on the 6th at 2pm (Lufthansa 3252).  If you see me in the Airport I'll be the tall redhead with a Lithuanian phrasebook in one hand, looking all American-y.&lt;br /&gt;&lt;br /&gt;(short hair and no mustache again, like PyCon2007 and not like PyCon2008)&lt;br /&gt;&lt;br /&gt;later: "looking all American-y" didn't work out.  The Lufthansa stewardesses spoke English to the English, French to the French, but German to me.  Sure, I am more than half genetically German (and I look it) and .. I didn't exactly dissuade them by answering "coffee, ja" when the drinks cart rolled around, after she had said something unintelligible to me that must have been "something to drink?"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-3331702296833374004?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/3331702296833374004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=3331702296833374004' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/3331702296833374004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/3331702296833374004'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/07/off-to-europython.html' title='Off to EuroPython'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-2982129862802514137</id><published>2008-06-08T00:03:00.003-04:00</published><updated>2008-06-08T01:01:25.025-04:00</updated><title type='text'>See You at EuroPython</title><content type='html'>My talk was accepted for &lt;a href="http://www.europython.org/EuroPython"&gt;EuroPython&lt;/a&gt; so I'll be invading Lithuania July 7th-12th (probably arriving on the 6th and leaving on the 13th to blunt the jet lag).&lt;br /&gt;&lt;br /&gt;Unfortunately this conflicts with the &lt;a href="http://www.icfpcontest.org/?the_2008_contest"&gt;2008 ICFP&lt;/a&gt; contest on the 11th-14th.  In past years (&lt;a href="http://jackdied.com/python/59"&gt;2007 writeup&lt;/a&gt;) I've done the ICFP as a long weekend steak and beers hack-a-thon with friends.  Maybe we can get a BoF going at EuroPython.&lt;br /&gt;&lt;br /&gt;Doh, &lt;a href="http://lebowskifest.com/"&gt;Lebowskifest&lt;/a&gt; is that weekend too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-2982129862802514137?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/2982129862802514137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=2982129862802514137' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2982129862802514137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/2982129862802514137'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/06/see-you-at-europython.html' title='See You at EuroPython'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-6037894717403213448</id><published>2008-05-21T16:58:00.002-04:00</published><updated>2008-05-21T17:05:03.477-04:00</updated><title type='text'>Boston Python Life</title><content type='html'>I still haven't been to a Cambridge python meetup in a long time and I just blocked Wednesdays again by signing up for a bowling league that night.  A man has to have his priorities.&lt;br /&gt;&lt;br /&gt;Will G's Nomadic Computing Herd now &lt;a href="http://herd.jottit.com/schedule"&gt;has a schedule&lt;/a&gt;.  I've worked with Will on open source projects in the past and lived five minutes away from him for years but we've never met.  &lt;a href="http://www.dougma.com/"&gt;Doug Napoleone&lt;/a&gt; quipped at PyCon "I travel 1000 miles to see people that live next door."  Exactly (Doug also lives five minutes away and I hadn't seen him since last PyCon).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-6037894717403213448?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/6037894717403213448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=6037894717403213448' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/6037894717403213448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/6037894717403213448'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/05/boston-python-life.html' title='Boston Python Life'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-6498734426305662579</id><published>2008-05-21T16:33:00.002-04:00</published><updated>2008-05-21T16:43:29.691-04:00</updated><title type='text'>EuroPython, Maybe</title><content type='html'>I submitted a talk proposal for EuroPython.  It is a longer version of the &lt;a href="http://jackdied.blogspot.com/2008/03/pycon-is-over.html"&gt;lightning talk I didn't give&lt;/a&gt; at PyCon (slots filled up really super early).&lt;br /&gt;&lt;br /&gt;If it is accepted I'll be in Lithuania.  I would like to go regardless but PyCon cost 2k+ and because the Fed has been printing dollars for the last 20 years I suspect a trip to Europe would cost even more than that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-6498734426305662579?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/6498734426305662579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=6498734426305662579' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/6498734426305662579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/6498734426305662579'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/05/europython-maybe.html' title='EuroPython, Maybe'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-8951885712473021038</id><published>2008-04-12T20:36:00.003-04:00</published><updated>2008-04-12T20:41:31.316-04:00</updated><title type='text'>Shell Count Meme</title><content type='html'>history | awk '{{a[$2]++) END(for(i in a) {printf "%5d\t%s\n", a[i], i))' | sort -rn head&lt;br /&gt;&lt;br /&gt;awk: line 1: extra ')'&lt;br /&gt;awk: line 1: missing ( near END&lt;br /&gt;awk: line 1: extra ')'&lt;br /&gt;awk: line 2: missing } near end of file&lt;br /&gt;&lt;br /&gt;Take that!&lt;br /&gt;(actually I use tcsh which doesn't keep history between invocations.  So this output is as interesting as it gets)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-8951885712473021038?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/8951885712473021038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=8951885712473021038' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8951885712473021038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8951885712473021038'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/04/shell-count-meme.html' title='Shell Count Meme'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-8248443529929588524</id><published>2008-03-23T00:18:00.009-04:00</published><updated>2008-07-28T00:37:10.936-04:00</updated><title type='text'>Misc from PyCon II</title><content type='html'>I wasn't active on the Pycon-organizers list this year but this game suggestion did get some laughs at the python-dev core sprint.  So I give you:&lt;br /&gt;&lt;h3&gt;German, American, or Other?&lt;/h3&gt;&lt;br /&gt;(All of these guys have svn commit privs on the core, as &lt;a href="http://www.python.org/dev/committers"&gt;listed here&lt;/a&gt;)&lt;p&gt;&lt;br /&gt;&lt;br /&gt;Hettinger: &lt;font color="white"&gt;American&lt;/font&gt;&lt;br /&gt;Brandl: &lt;font color="white"&gt;German&lt;/font&gt;&lt;br /&gt;Lundh: &lt;font color="white"&gt;Other (Swedish)&lt;/font&gt;&lt;br /&gt;Reifschneider: &lt;font color="white"&gt;American&lt;/font&gt;&lt;br /&gt;Doerwald: &lt;font color="white"&gt;German&lt;/font&gt;&lt;br /&gt;Diederich: &lt;font color="white"&gt;American (my great^8-grandfather was German)&lt;/font&gt;&lt;br /&gt;Martelli: &lt;font color="white"&gt;American/Other (originally Italian)&lt;/font&gt;&lt;br /&gt;Dalke: &lt;font color="white"&gt;American&lt;/font&gt;&lt;br /&gt;Kuchling: &lt;font color="white"&gt;Other (Canadian)&lt;/font&gt;&lt;br /&gt;Ronacher: &lt;font color="white"&gt;German&lt;/font&gt;&lt;br /&gt;Warsaw: &lt;font color="white"&gt;American&lt;/font&gt;&lt;br /&gt;Janssen: &lt;font color="white"&gt;American&lt;/font&gt;&lt;br /&gt;Heimes: &lt;font color="white"&gt;German&lt;/font&gt;&lt;br /&gt;Tismer: &lt;font color="white"&gt;German&lt;/font&gt;&lt;br /&gt;Goodger: &lt;font color="white"&gt;Other (Canadian)&lt;/font&gt;&lt;br /&gt;Wolever: &lt;font color="white"&gt;Other (Canadian or just in Canada?)&lt;/font&gt;&lt;br /&gt;Forsberg: &lt;font color="white"&gt;Other (Swedish)&lt;/font&gt;&lt;br /&gt;Yoshida: &lt;font color="white"&gt;I have no idea but I'm hoping this is a trick question&lt;/font&gt;&lt;br /&gt;Stein: &lt;font color="white"&gt;American&lt;/font&gt;&lt;br /&gt;Niemeyer: &lt;font color="white"&gt;Other (Brazilian)&lt;/font&gt;&lt;br /&gt;Seutter: &lt;font color="white"&gt;Other (Canadian)&lt;/font&gt;&lt;br /&gt;Kaiser: &lt;font color="white"&gt;German (?)&lt;/font&gt;&lt;br /&gt;Gustaebel: &lt;font color="white"&gt;German&lt;/font&gt;&lt;br /&gt;Lemburg: &lt;font color="white"&gt;German&lt;/font&gt;&lt;br /&gt;Loewis: &lt;font color="white"&gt;German&lt;/font&gt;&lt;br /&gt;Klose: &lt;font color="white"&gt;German&lt;/font&gt;&lt;br /&gt;Norwitz: &lt;font color="white"&gt;American&lt;/font&gt;&lt;br /&gt;Schemenauer: &lt;font color="white"&gt;Other (Canadian)&lt;/font&gt;&lt;br /&gt;Oussoren: &lt;font color="white"&gt;Other&lt;/font&gt;&lt;br /&gt;Heller: &lt;font color="white"&gt;German&lt;/font&gt;&lt;br /&gt;Wouters: &lt;font color="white"&gt;Other (Dutch)&lt;/font&gt;&lt;br /&gt;Seilnacht: &lt;font color="white"&gt;Other&lt;/font&gt;&lt;br /&gt;Petursson: &lt;font color="white"&gt;American (probably, he speaks fluent Icelandic but I think he converted as a youth)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;[highlight the text after the ':' to see the answer]&lt;br /&gt;&lt;br /&gt;No doubt there are some errors in there so please leave corrections in the comments. Google isn't great for determining nationality and I didn't even google the answers I already "knew."  Also, apologies to any Austrians who got lumped in with the Germans (a friend's grandmother at the age of 90 told her son she was Austrian after saying she was German for a lifetime.  When confronted she replied "German, Austrian, whatever.")&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update&lt;/b&gt; (July 27, 2008)  German ancestry is dominant in &lt;a href="http://en.wikipedia.org/wiki/German_American"&gt;17% of Americans&lt;/a&gt; or about 50 million people.   You can be 1% German and have a German last name or 99% German and have a Spanish last name but if people mate randomly* the number of people with German last names would be at least as high as the number of people who self-report that they are mostly of German ancestry.  There are 80 million Germans and somewhere near that number of Americans with German last names so this quiz becomes somewhat less surprising in hindsight.&lt;br /&gt;&lt;br /&gt;* and mate randomly they do.  The urge to mate is much stronger than any weak favoritism for ethnic continuity.  In the US the idea that like-marries-like doesn't last for two generations (see "My Big Fat Greek Wedding").  And the idea is weakest in the majority (aka white people).  Growing up I was amazed that the O'Dea kids down the street were 100% Irish.  They weren't recent immigrants so the only thing in my mind was: wow, what are the odds?&lt;br /&gt;&lt;br /&gt;If you want another anecdote, here's one: my father's father (who's last name I have, obviously) did not like the &lt;a href="http://en.wikipedia.org/wiki/Pennsylvania_Dutch"&gt;Pennsylvania Dutch&lt;/a&gt; ("Dutch" being the popular corruption of "Deutsch") .  He was a 3rd generation New York German but he didn't care for the country bumpkin Pennsylvania Germans who got on a Westward boat 10+ generations before his own ancestors.  His bias was entirely theoretical and limited to jokes and stereotypes.  He didn't consider my mother (100% Dutchy) or any of her family as "Dutchy" because they were doctors, lawyers, businessmen, and engineers.  He was encouraged to not bring it up and everyone else was reminded that he didn't really mean it.  "Etlay itway opdray" is our family motto so this was rarely a problem.&lt;br /&gt;&lt;br /&gt;NB, if you ever read a story about harsh race relations in America please take the last paragraph into account.  My grandfather's rhetoric far exceeded reality.  His words (accurately quoted!) would have been an indictment but were far different than his beliefs in practice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-8248443529929588524?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/8248443529929588524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=8248443529929588524' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8248443529929588524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8248443529929588524'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/03/misc-from-pycon-ii.html' title='Misc from PyCon II'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-948302554628086801</id><published>2008-03-20T18:39:00.002-04:00</published><updated>2008-03-22T23:41:11.055-04:00</updated><title type='text'>Bonus PyCon Day!</title><content type='html'>I was supposed to fly back to Boston tonight after a successful PyCon but the fates intervened. Or United Airlines sucks - take your pick.&lt;br /&gt;&lt;br /&gt;Well, United isn't entirely useless because they did manage to get my bags to Boston. Bastards.&lt;br /&gt;&lt;br /&gt;I do get to sprint for an extra day and I was able to get a room in the conference hotel. Joe, the all knowing bartender, says that the airlines booked a block of 250 rooms here for tonight. It should be a pretty ecclectic and angry crowd at the bar.&lt;br /&gt;&lt;br /&gt;Update: I made it home the next day (Friday) but last I saw David Goodger his flight was canceled and he was expecting to get out Saturday.  From the customer service lines at the airport David probably had some company.&lt;br /&gt;&lt;br /&gt;NB, perhaps my mistake was traveling without &lt;a href="http://www.towel.org.uk/index.php/The_Hitchhiker%27s_Guide_to_the_Towel"&gt;a towel&lt;/a&gt;.  That's like asking for trouble.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-948302554628086801?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/948302554628086801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=948302554628086801' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/948302554628086801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/948302554628086801'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/03/bonus-pycon-day.html' title='Bonus PyCon Day!'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-8012415783679087859</id><published>2008-03-18T18:05:00.002-04:00</published><updated>2008-03-18T18:22:17.024-04:00</updated><title type='text'>Misc from PyCon I</title><content type='html'>Don't stay at the Double Tree (the hotel next to the conference hotel) and if you own their stock sell now.  I was impressed when checking in because they gave me a hot cookie (that is not a euphamism).  I asked about it and they pointed out the OVEN behind the counter.  I thought these people really have their shit together - even thouogh I didn't want a cookie.  But the clocks in every room were wrong by an hour.  Worse, the clocks are set by a radio signal and have no way to manually set the time.  The hotel knows about the problem but isn't trying to fix it.  That hour is because congress, in its infinite wisdom, wanted to save us all money at no expense to themselves by screwing with Daylight Savings.  Congrats congress: you have cost three hundred million people five minutes of inconvenience a week for a year and counting.&lt;br /&gt;&lt;br /&gt;Do stay at the Crown Plaza (the conf hotel).  It has some rough spots - the bar doesn't open until 4pm - but has fewer signs of dysfunction than the Double Tree.  I left a book in a common area yesterday and today asked a waitress if they had found it and saved it.  She told me they had found one book but asked me to describe it instead of showing it to me.  It turns out I had used a $20 bill as a bookmark and they wanted to make sure they had the right guy first.  Actually I had two book marks in there and the other one was a plane ticket stub.  Another employee had left a message for me at the desk.  So yeah, the Crown Plaza franchise might be average but the local staff are honest and hard working.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-8012415783679087859?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/8012415783679087859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=8012415783679087859' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8012415783679087859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/8012415783679087859'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/03/misc-from-pycon-i.html' title='Misc from PyCon I'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-5654831528471881674</id><published>2008-03-17T12:25:00.002-04:00</published><updated>2008-03-17T12:29:40.966-04:00</updated><title type='text'>PyCon Core Sprints</title><content type='html'>Sprints have started.  The core python sprint has 30 guys this year which is huge (about 12 are core committers).  The Django sprint is maybe twice that size.  Thankfully no one has revoked my privs since last year even though I haven't committed anything in ten months.&lt;br /&gt;&lt;br /&gt;First I'll be investigating &lt;a href="http://www.python.org/dev/peps/pep-3115/"&gt;PEP 3115 (Metaclasses in 3k)&lt;/a&gt;.  I tried some of the syntax yesterday and couldn't get it to work so either the implementation or the PEP is off.  It's probably the PEP in which case my first checkin will be a doc fix.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-5654831528471881674?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/5654831528471881674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=5654831528471881674' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/5654831528471881674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/5654831528471881674'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/03/pycon-core-sprints.html' title='PyCon Core Sprints'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-450753823407891576</id><published>2008-03-16T17:14:00.002-04:00</published><updated>2008-03-16T17:18:35.126-04:00</updated><title type='text'>PyCon is Over</title><content type='html'>Well, the main conference anywawy.  I'll be around for sprints.&lt;br /&gt;&lt;br /&gt;I prepared a lightening talk but didn't get to do it (the talks were a bit disorganized and the slots were full instantly).  Mine would have been on class decorators in python.  Originally it was titled "in python 3000" but someone back ported decos to 2.6 recently.  A pdf of the slides &lt;a href="http://jackdied.com/jackdied/decos_and_metas.pdf"&gt;is available here&lt;/a&gt;.  Most of the content was to be spoken so the slides are sparse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-450753823407891576?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/450753823407891576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=450753823407891576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/450753823407891576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/450753823407891576'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/03/pycon-is-over.html' title='PyCon is Over'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-4350608082466094728</id><published>2008-03-11T10:52:00.003-04:00</published><updated>2008-03-11T10:58:58.899-04:00</updated><title type='text'>See You at PyCon</title><content type='html'>I thought I procrastinated last year -- but a friend just asked me what I was doing for St Patrick's day and I said *!#@(*%.  The good news is that this morning I was able to book a hotel room and a flight.  The bad news is that I couldn't get the conference rate at the hotel and I have to stay next door on the 13th.  Live and not learn, I always say.&lt;br /&gt;&lt;br /&gt;If you are looking for me I look pretty much the same as I always have, but mustachier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-4350608082466094728?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/4350608082466094728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=4350608082466094728' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4350608082466094728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4350608082466094728'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/03/see-you-at-pycon.html' title='See You at PyCon'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-7914680088743154341</id><published>2008-02-19T15:29:00.002-05:00</published><updated>2008-02-19T15:32:19.686-05:00</updated><title type='text'>Holy PyCon!</title><content type='html'>I just tried to register for PyCon (and failed, the fraud detection hates me apparently).  The shocker is that I was reg number 585 and the early bird period hasn't even ended!  Undoubtedly some of those were test registrations but still - this should be a much bigger PyCon than the previous one which was also record setting.&lt;br /&gt;&lt;br /&gt;See you in Chicago! (I'll be staying for sprints too)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-7914680088743154341?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/7914680088743154341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=7914680088743154341' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/7914680088743154341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/7914680088743154341'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/02/holy-pycon.html' title='Holy PyCon!'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-4764761075712282217</id><published>2008-01-20T02:43:00.000-05:00</published><updated>2008-01-20T03:04:51.902-05:00</updated><title type='text'>Boston Python Life</title><content type='html'>My old habit of missing &lt;a href="http://python.meetup.com/181/"&gt;Boston python meetups&lt;/a&gt; for no good reason is over.  I'm now in a Wednesday bowling league so I have a good reason.&lt;br /&gt;  Or a reason, anyway.&lt;br /&gt;&lt;br /&gt;The Wingware hosted &lt;a href="http://wingware.com/pipermail/boston-pig/"&gt;Boston-PIG list&lt;/a&gt; seems dead.  There was some shuffle when the Boston group became the Cambridge group.  I think there is a Plone group too which is sometimes the same people.  Maybe &lt;a href="http://www.dougma.com/"&gt;Doug&lt;/a&gt; could clear that up.&lt;br /&gt;&lt;br /&gt;Will Guaraldi's &lt;a href="http://bluesock.org/~willg/blog/herd"&gt;Nomadic Telecommuting Herd&lt;/a&gt; occasionally meets across the street from me.   Maybe I'll run into them sometime (but they don't have a schedule, so that's hard to do).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-4764761075712282217?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/4764761075712282217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=4764761075712282217' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4764761075712282217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/4764761075712282217'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/01/boston-python-life.html' title='Boston Python Life'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-400292950558235958</id><published>2008-01-14T07:18:00.000-05:00</published><updated>2008-01-14T12:52:22.330-05:00</updated><title type='text'>In The Beginning</title><content type='html'>This is the story of how I started using python.&lt;br /&gt;&lt;br /&gt;Out of college I was a well indoctrinated C++ guy.  My resume had silly goals on it like "desires to work at a CMM level 3 or higher organization."  It was the mid 90s so I ended up working at a C++ based dot com instead (Musicblvd and later CDNow).  I left two years later with my youthful enthusiasm for the "correct way" way stripped.   It was now the late 90s and my next job was working at a Perl based dot com in Boston (OpenAir).  Things were just so much &lt;i&gt;easier&lt;/i&gt; with Perl.  And everything was different: OpenAir didn't have a single machine that cost over $5k whereas Musicblvd had more than one that cost over $1Mil (a fully loaded E10k ran the database*).  Release cycles were monthly instead of annually.  Everything was so plainly better and more productive it wasn't even funny.  I was no longer a C++ guy.&lt;br /&gt;&lt;br /&gt;So when I quit during the bust in 2001 to start my own company I wanted to use perl.  I was afraid to for legal reasons so I started casting around for another "P" language.  We did the prototype  in PHP.   The  prototype worked but the code was ugly and slow.  Python had some buzz so I downloaded that  and  translated our small app from PHP to Python.  The resulting code was a third smaller, easier to read, and ran faster.  If that wasn't enough the C guy in me loved the Python core.  Compared to Perl and PHP the Python core was simple, clean, and without much baggage.  I was sold.&lt;br /&gt;&lt;br /&gt;It is many years later and I'm still happy with Python.  I have even added one new feature to python (&lt;a href="http://python.org/dev/peps/pep-3129/"&gt;class decorators&lt;/a&gt;) and of course, one &lt;a href="http://www.python.org/dev/summary/2006-09-16_2006-09-30/#os-x-and-ssize-t-formatting"&gt;bug&lt;/a&gt; too.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* and that 256 processor Sun wasn't infallible.  When it crashed (which it did) Sun helicoptered in tech support and basically paid us off not to talk about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-400292950558235958?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/400292950558235958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=400292950558235958' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/400292950558235958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/400292950558235958'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/01/in-beginning.html' title='In The Beginning'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-6005136820146796618</id><published>2008-01-13T15:51:00.000-05:00</published><updated>2008-01-14T12:54:30.171-05:00</updated><title type='text'>Three Flavors of mod_*</title><content type='html'>Ian Bicking &lt;a href="http://blog.ianbicking.org/2008/01/12/what-php-deployment-gets-right/"&gt;talks about the conceptual flavors&lt;/a&gt; of web deployment.  Go read that because this post is only tangential to his point.&lt;br /&gt;&lt;br /&gt;Under the Apache 1.x series I have used mod_perl, mod_php, and mod_python.  All three do things slightly differently with regards to loading code.  Keep in mind apache 1.x only uses the pre-forking model so each request handling process starts life as an exact copy of the root process.  The root process's main job is to spawn child processes. [everything below was true in 2000 and for apache 1.x. Don't make decisions based on &lt;a href="http://jackdied.blogspot.com/2008/01/in-beginning.html"&gt;my recolections&lt;/a&gt; unless you plan on running some ancient servers.]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;mod_perl&lt;/b&gt;  allows you to preload scripts when the root process starts.  This means no matter how large your code base you only have to compile and execute it once and then every child process starts life with the same initialized modules already in place.  At a perl-based company where I worked the preload script was a single line&lt;ul&gt;use Everything;&lt;/ul&gt;The 'Everything' package loaded, well, everything (is this a standard perl-ism nowadays?).  Everything.pm was the most delicate module in a large code base.  It imported all the packages in the code base in a way that avoided cycles.  As a downside the server couldn't use apache's "graceful" restart because the root server didn't have a way to unload the perl runtime and reload Everything.  Besides reloading everything was slooow on the 400MHz CPUs of the day.  The work-around was to have a proxy server that could point to one of two local ports that ran mod_perl.  To gracefully switch the unused app server was stopped and restarted and the proxy was repointed to the new local port.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;mod_php&lt;/b&gt; is a bit of yuck by comparison.  Or a joy for the reasons Bicking states.  The yuck is that mod_php compiles and executes scripts anew &lt;i&gt;on every request&lt;/i&gt;.  This is great for shared hosts as it acts like CGI but with less overhead because it doesn't have to fork on every request.  This sucks for application servers that know they want to run the same code over and over again.  It gets worse when the codebase is large and there is a package like Everything.pm that loads the entire codebase of a good sized application on every request [yes, this post is somewhat autobiographical].&lt;br /&gt;&lt;br /&gt;&lt;b&gt;mod_python&lt;/b&gt; is somewhere between mod_perl and mod_php.  The first time a child handles a request it pays the price of loading and executing a script.  After that all requests handled by the child are quick because sys.modules still contains all the modules loaded by previous runs.  mod_python could support preloading modules in the parent process like mod_perl with a trivial patch [see the mod_python archives circa 2001 for the patch I submitted] but it was decided that the security risk (because the parent process usually starts as root) outweighed the benefit of child nodes having a longer startup time.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;In conclusion&lt;/b&gt; I would urge you to read the source of the mod_whatever for the language you use.  They are small and all work give-or-take the same.  It also gives you some idea of how the internals of your favorite language work.  My first trip was into mod_perl and I found it readable but with a lot of baggage.  When I read mod_php I thought "what a hack! Is this broken on purpose?"  Finally I read mod_python and with my perl background I was aghast at how simple and clean the interpreter related code was.&lt;br /&gt;&lt;br /&gt;See you at PyCon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-6005136820146796618?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/6005136820146796618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=6005136820146796618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/6005136820146796618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/6005136820146796618'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2008/01/three-flavors-of-mod.html' title='Three Flavors of mod_*'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-1276955801903133830</id><published>2007-12-21T11:23:00.000-05:00</published><updated>2007-12-21T11:51:35.858-05:00</updated><title type='text'>The AWK Programming Language</title><content type='html'>On Raymond Hettinger's advice I picked up a copy of "The AWK Programming Language." At 200 pages it makes "The C Programming Language" look like a door stop by comparison.  I'm told Chapter 2 is especially good.  Chapter 2 is 50 pages out of that 200.&lt;br /&gt;&lt;br /&gt;Up til now I've been modeling my writing on Stevens and specifically "Advanced Programming in the UNIX Environment."  That book truly is a door stop and I've consulted it too many times to count.  Need to write a quick and dirty TCP/IP server?  It's in there.  Can't remember how to properly fork a daemon?  It's in there (don't forget to fork twice!)  It is an incredible achievement for a computer book to still be useful over 15 years after it was published.&lt;br /&gt;&lt;br /&gt;Raymond also says he has checked in a bunch of optimizations.  I'll have to 'svn up' and maybe write about them here (I say that just to increase the likelihood of doing it).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-1276955801903133830?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/1276955801903133830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=1276955801903133830' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/1276955801903133830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/1276955801903133830'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2007/12/awk-programming-language.html' title='The AWK Programming Language'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2781337673308296390.post-6173880916985224939</id><published>2007-12-07T20:33:00.000-05:00</published><updated>2007-12-07T20:40:40.571-05:00</updated><title type='text'>Python stuff goes here</title><content type='html'>The python section of my main blog (&lt;a href="http://jackdied.com/python"&gt;over here&lt;/a&gt;) was dying from neglect so I'm starting one here.  I won't be porting the old content because there wasn't much of it and it was time based besides (updates from PyCon, etc).&lt;br /&gt;&lt;br /&gt;My Python TODO list is relatively unchanged:&lt;br /&gt;* Book&lt;br /&gt;* Rewrite the probstat extension&lt;br /&gt;  (permutation/combination/cartesian of iterables)&lt;br /&gt;* Get active in python development again&lt;br /&gt;&lt;br /&gt;I didn't put in a talk proposal for PyCon but I will be there.  I will be preparing a couple lightning talks to test out ideas for full talks for PyCon 2009.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2781337673308296390-6173880916985224939?l=jackdied.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jackdied.blogspot.com/feeds/6173880916985224939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2781337673308296390&amp;postID=6173880916985224939' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/6173880916985224939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2781337673308296390/posts/default/6173880916985224939'/><link rel='alternate' type='text/html' href='http://jackdied.blogspot.com/2007/12/python-stuff-goes-here.html' title='Python stuff goes here'/><author><name>Jack Diederich</name><uri>http://www.blogger.com/profile/01875505174692466327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
