<?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-4477131926658044957</id><updated>2012-01-31T15:12:47.208-08:00</updated><category term='consumernotebook'/><category term='finances'/><category term='courses'/><category term='ironpython'/><category term='funkload'/><category term='pip'/><category term='november'/><category term='interfaces'/><category term='feedfeeder'/><category term='pycon'/><category term='sprint'/><category term='plone conference'/><category term='redhat'/><category term='git'/><category term='pyladies'/><category term='djangocon'/><category term='rss'/><category term='classes'/><category term='family'/><category term='turbogears'/><category term='umlizer'/><category term='review'/><category term='solaris'/><category term='beautiful soup'/><category term='training'/><category term='rant'/><category term='laptop'/><category term='xml'/><category term='pinax'/><category term='java'/><category term='kss'/><category term='foxpro'/><category term='mac os'/><category term='djangodash'/><category term='wxpython'/><category term='django'/><category term='flex'/><category term='australia'/><category term='presentation tips'/><category term='holidays'/><category term='pyramid'/><category term='atom'/><category term='ria'/><category term='ubuntu'/><category term='j2ee'/><category term='jython'/><category term='django packages'/><category term='json'/><category term='NASA science'/><category term='google'/><category term='ruby'/><category term='spacebook'/><category term='technology'/><category term='javascript'/><category term='coldfusion'/><category term='github'/><category term='django-district'/><category term='graphviz'/><category term='geek celebrities'/><category term='ubigraph'/><category term='cartwheel'/><category term='python'/><category term='zpug'/><category term='wsgi'/><category term='zope'/><category term='windows'/><category term='cycling'/><category term='canvas'/><category term='five'/><category term='feedparser'/><category term='virtualenv'/><category term='HTML5'/><category term='friends'/><category term='linux'/><category term='personal'/><category term='opencomparison'/><category term='silverlight'/><category term='apology'/><category term='politics'/><category term='plone bootcamp 2008'/><category term='buildout'/><category term='martial arts'/><category term='kid'/><category term='xml rpc'/><category term='blog'/><category term='mongodb'/><category term='pylons'/><category term='GAPE'/><category term='plone'/><category term='grok'/><category term='sql'/><category term='food'/><category term='nova-django'/><category term='microsoft'/><category term='django-profiles'/><category term='foss'/><category term='NewZealand'/><category term='health'/><category term='NASA'/><title type='text'>pydanny</title><subtitle type='html'>My blog on things Python and other tech stuff.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default?start-index=101&amp;max-results=100'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>314</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-8960381809522620063</id><published>2012-01-25T10:16:00.000-08:00</published><updated>2012-01-25T13:36:16.035-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>How to justify attending PyCon sprints</title><content type='html'>Sad that the &lt;a href="https://us.pycon.org/"&gt;PyCon&lt;/a&gt; sprints fall on business days? Wishing you could stay but the boss/client won't let you and demands you back so '&lt;i&gt;you can work&lt;/i&gt;'? This is how you make it so that the sprints are something your management is demanding you attend &lt;strong&gt;every sprint ever&lt;/strong&gt;.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Make it foremost in your mind that the wonderful thing about the PyCon sprints is that the odds are that anyone who knows anything about whatever you are doing in &lt;a href="http://python.org"&gt;Python&lt;/a&gt; will be there.&lt;/li&gt;&lt;li&gt;Write up a list of the things that you are finding challenging, hard, or impossible to do with Python.&lt;/li&gt;&lt;li&gt;Now go to the boss and say something like: &lt;blockquote&gt;"Because the experts and leaders of the open source tools we are using are going to be there, I want to attend PyCon sprints. All my time at the sprints will be focused on sitting around them and working on our tools. I'll focus on things that directly impact our agency / company / organization, specifically things I wrote down on this list."&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;If the boss says, &lt;blockquote&gt;"Why not just use IRC or email?"&lt;/blockquote&gt;Then you say something like, &lt;blockquote&gt;"Well, IRC/email is not the same as sitting next to these people. I'll be so much more productive there!"&lt;/blockquote&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;strong&gt;Rinse and repeat.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Then, when you attend the PyCon sprints, follow through on what you said you were going to do. Sure, it might be more fun to work on project 'spam' even though your company uses project 'lumberjack', but if you prove how much you got done during the sprints, next year the boss will be much more encouraging. Even if a good boss says to go do what you want, at least spend some time sprinting on work related technology.&lt;br /&gt;&lt;br /&gt;Also, once you get approval to go, consider sending your boss to &lt;a href="http://pydanny.blogspot.com/2010/03/conferences-are-double-edged-sword.html"&gt;this old rant of mine&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Don't forget to &lt;a href="https://us.pycon.org/2012/registration/"&gt;register for PyCon&lt;/a&gt;! Early bird rates end today (January 25th, 2012) which means today is the last day to get involved in the &lt;strong&gt;extremely unofficial&lt;/strong&gt; &lt;a href="http://pydanny.blogspot.com/2012/01/join-pycon-early-birds-program.html"&gt;PyCon Early Birds program&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-8960381809522620063?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/8960381809522620063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=8960381809522620063' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8960381809522620063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8960381809522620063'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2012/01/how-to-justify-attending-pycon-sprints.html' title='How to justify attending PyCon sprints'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-3076389888950653095</id><published>2012-01-23T08:16:00.000-08:00</published><updated>2012-01-25T09:56:56.494-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>Join the PyCon Early Birds program!</title><content type='html'>First off, I want to say that me and my &lt;a href="http://twitter.com/audreyr"&gt;fiancee&lt;/a&gt; will be attending &lt;a href="https://us.pycon.org/2012/"&gt;PyCon US&lt;/a&gt; this year! Hooray! Can't wait to see old friends and make new ones. I'll be chairing one of the Panels at the PyWeb Summit on March 8th. We're absolutely delighted to see all the great talks, hang out in the hallway, and just be in the middle of Python for well over a week. &lt;br /&gt;&lt;br /&gt;Now on to the &lt;strong&gt;extremely unofficial PyCon Early Birds&lt;/strong&gt; program!&lt;br /&gt;&lt;br /&gt;PyCon early registration ends on January 25th. If you &lt;a href="https://us.pycon.org/2012/registration/"&gt;register&lt;/a&gt; at the early bird rate that gets you the benefit of joining the elite PyCon Early Birds group. Being a member of the &lt;strong&gt;PyCon Early Birds&lt;/strong&gt; gets you all sorts of incredible rewards and benefits.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Most importantly, you get some serious bragging rights.&lt;/li&gt;&lt;li&gt;A custom ribbon that says '&lt;strong&gt;Early Bird&lt;/strong&gt;' that you get to attach to your conference badge.&lt;/li&gt;&lt;li&gt;A discounted rate from the regular ticket rate as according to the &lt;a href="https://us.pycon.org/2012/registration/"&gt;registration&lt;/a&gt; page.&lt;/li&gt;&lt;li&gt;The confidence of knowing you have a ticket before they sell out.&lt;/li&gt;&lt;li&gt;A tasty and rather edible store-bought cookie provided by myself and Audrey Roy.&lt;/li&gt;&lt;li&gt;If the &lt;strong&gt;PyCon Early Birds&lt;/strong&gt; program gets enough members, I'm going to challenge PyCon chair Jesse Noller to stump me with Yoga poses! There's no way he'll even consider accepting a challenge like this unless the &lt;strong&gt;PyCon Early Birds&lt;/strong&gt; membership roster is big enough. So join and help me find out if his &lt;a href="http://en.wikipedia.org/wiki/Bikram_Yoga"&gt;Bikram&lt;/a&gt; will beat my &lt;a href="http://en.wikipedia.org/wiki/Capoeira"&gt;Capoeira&lt;/a&gt;!&lt;/li&gt;&lt;li&gt;Other incredible things that are in the works!&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Of course, PyCon has tons of other reasons to sign up besides the &lt;strong&gt;PyCon Early Birds&lt;/strong&gt; program. Amazing &lt;a href="https://us.pycon.org/2012/schedule/tutorials/"&gt;tutorials&lt;/a&gt;, &lt;a href="https://us.pycon.org/2012/schedule/"&gt;talks&lt;/a&gt;, and &lt;a href="https://us.pycon.org/2012/commmunity/sprints/projects/"&gt;sprints&lt;/a&gt;, plus great hallway tracks, a vendor room filled with great schwag, poster sessions, and startup row. &lt;a href="https://us.pycon.org/2012/sponsors/"&gt;Sponsorship&lt;/a&gt; levels are unbelievably high, and since the event is non-profit that means the money just goes right back into the community - starting with PyCon itself. This year is going to be &lt;strong&gt;AWESOME&lt;/strong&gt;!!!&lt;br /&gt;&lt;br /&gt;So what are you waiting for? &lt;a href="https://us.pycon.org/2012/registration/"&gt;Sign up&lt;/a&gt; for the &lt;strong&gt;Pycon Early Birds&lt;/strong&gt; before it's too late!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://us.pycon.org/2012/registration/register/" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="102" width="277" src="http://1.bp.blogspot.com/-fa4jnLXs1so/TniyemLkoiI/AAAAAAAAAqo/LjZqklTFBXk/s400/pycon2012.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-3076389888950653095?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/3076389888950653095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=3076389888950653095' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/3076389888950653095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/3076389888950653095'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2012/01/join-pycon-early-birds-program.html' title='Join the PyCon Early Birds program!'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-fa4jnLXs1so/TniyemLkoiI/AAAAAAAAAqo/LjZqklTFBXk/s72-c/pycon2012.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-8526888628676708017</id><published>2012-01-21T08:35:00.000-08:00</published><updated>2012-01-23T11:25:54.051-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><category scheme='http://www.blogger.com/atom/ns#' term='presentation tips'/><title type='text'>Tips for speaking</title><content type='html'>Last year I wrote a blog post called &lt;a href="http://pydanny.blogspot.com/2011/02/my-tips-for-speaking.html"&gt;My tips for speaking&lt;/a&gt;. In the face of SCALE 10X and other events coming up, this is my refactoring of that talk.&lt;br /&gt;&lt;br /&gt;My experience in giving talks?  I've been presenting on the job since 1999. I've been presenting at conferences since autumn of 2008. This past year (2011) I gave a lot of talks, helped others with their talks, and did a number of cooperative talks where I shared the stage with another person. I've learned a lot, from my own mistakes and those of others. Since I like to share, here we go. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;You aren't Steve Jobs&lt;/h3&gt;&lt;br /&gt;In terms of presenting, Steve Jobs was no mere mortal. He got away with wearing black in front of a black background. His slides were frequently dark. And he held up tiny objects in front of literally billions of people. He did all of this and got away with it.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;You. Won't.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Steve Jobs was billionaire leading a multi-billion dollar company. His presentations were highly choreographed affairs where every detail from lighting to audio to who got to attend was tightly controlled. &lt;br /&gt;&lt;br /&gt;For example, Steve could wear black because of amazingly proficient stage lighting techniques. Carefully watch a high definition video of him showing off the latest product while in a black sweater and you'll see that he's literally standing in a column of light. Odds are most conferences don't have spotlights or fancy lighting, and even if they do - the stage crew are not being promised a bonus for doing it right and financial ruin if they fail. &lt;br /&gt;&lt;br /&gt;What this means is be very, very careful about using the attributes of Steve's talks for inspiration or arguments on how you are going to do a talk. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;What to wear&lt;/h3&gt;&lt;br /&gt;Bring several presentation shirts to the conference so you can be sure that what you are wearing shows up in front of the background. Be a little classy and wear a polo shirt instead of that t-shirt. If the background is the same as your shirt, go and change. If you don't have a shirt that works, go buy one or wear your jacket.&lt;br /&gt;&lt;br /&gt;The reason being is the same as why Newscasters don't wear some colors on video. They don't want to look like floating heads and hands. It happens to them, it happens at technical conferences, and it will happen to you.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Black text on white background&lt;/h3&gt;&lt;br /&gt;I said it last year and I'll say it again: &lt;strong&gt;High contrast slides please&lt;/strong&gt;. If a designer, manager, friend, or spouse tries to stick colored backgrounds or text into your slides, politely remind them that what shows up nicely on the monitor or laptop &lt;strong&gt;will absolutely fail to be appreciated&lt;/strong&gt; by the attendees of the talk. Social media and IRC &lt;strong&gt;will be filled with comments about the unreadable colors&lt;/strong&gt; of your slides.&lt;br /&gt;&lt;br /&gt;Remember, unlike Steve Jobs, you have no control over the AV team or whatever the conference venue provides when it comes to projectors and screens. So play it as safe as possible.&lt;br /&gt;&lt;br /&gt;I really prefer the black text on white background. The people in the vision community (arts, theatre, animantion, and eye doctors) all agree with me.&lt;br /&gt;&lt;br /&gt;This past year I've had technical people (all with jobs outside the vision community) quote some interesting material about the validity of white text on black background, but I personally find it hard to read those slides if I'm in the back. Also, if the room is brightly lit, the letters are barely visible.&lt;br /&gt;&lt;br /&gt;The happiest alternative I've seen was at a Mongo event, and was a certain shade of dark blue with bright yellow letters. However, I think like the black background, it would be suspect in the wrong light.&lt;br /&gt;&lt;br /&gt;One last note: Don't use color gradients in your slides. Please.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Cheat at the command line!&lt;/h3&gt;&lt;br /&gt;I'm giving a talk today at &lt;a href="http://www.socallinuxexpo.org/scale10x"&gt;Southern California Linux Exposition 10x&lt;/a&gt; called &lt;a href="http://www.socallinuxexpo.org/scale10x/presentations/intro-python"&gt;Intro to Python&lt;/a&gt;. It's inspired by folks like &lt;a href="http://rhettinger.wordpress.com/"&gt;Raymond Hettinger&lt;/a&gt; and &lt;a href="http://www.dabeaz.com/"&gt;David Beazley&lt;/a&gt;. And the big thing I'll be doing is avoiding the command-line like the plague.&lt;br /&gt;&lt;br /&gt;This is because the command-line is treacherous in front of an audience. Conference networks are notoriously prone to going down at the wrong moment. Same goes for laptops, especially when connecting to projector hardware it's never touched before.&lt;br /&gt;&lt;br /&gt;Also, you know what it is like typing with someone looking over your shoulder? Imagine that times hundreds, or thousands when your video is being uploaded so people around the world can view it.&lt;br /&gt;&lt;br /&gt;So either use something like &lt;a href="http://pypi.python.org/pypi/PlayerPiano/0.1.1"&gt;PLayer Piano&lt;/a&gt; to record a command-line session in a docstring, or do what I do and use slide transitions to mock typing.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Be rested, fed, and sober for your talk.&lt;/h3&gt;&lt;br /&gt;In 2011 I watched a guy fumble through a talk with beer in hand, a personal hero of mine blearily try to get through his talk after a late night of drinking, and a couple people try to present after all-nighters. &lt;br /&gt;&lt;br /&gt;Respect your audience and take care of yourself before the talk. Get some sleep, eat well, and drink moderately. This will really help you get invited to more events.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Practice, practice, practice&lt;/h3&gt;&lt;br /&gt;In the past I've said I don't practice much. If at all. Ahem...&lt;br /&gt;&lt;br /&gt;It has been pointed out to me that I practice. A lot. Maybe not in front of a mirror, but I'm constantly going through my slides and coming up with things to say. I'll go through all my slides one-by-one and mouth what I'll be saying, and work out the timing of things. Which means that while I haven't been projecting my voice, I have been practicing.&lt;br /&gt;&lt;br /&gt;In 2011 I did the curious thing of actually trying to practice on a couple presentations. And I have to say that I've seen a huge amount of improvement. I certainly felt more confident and I feel like the talk goes better! For example, A talk I gave at PyCon AU 2011 that had some issues after a lot of practice went smashingly better at DjangoCon 2011.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Push questions and comments to the end&lt;/h3&gt;&lt;br /&gt;Your talk should have a flow, a pace as it were. And lots of interruptions will cause you to lose your chain of thought, or cause the audience to lose focus. If someone asks a question during your talk, ask them to wait until the end.&lt;br /&gt;&lt;br /&gt;If they keep asking questions or giving comments, ask them nicely to talk to you after your presentation. People are decent and will respond nicely to your request.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Sign up for Pycon US!&lt;/h3&gt;&lt;br /&gt;Early bird registration closes on January 25th. Sign up for it beforehand and you'll have enough money for a really good dinner with drinks. What are you waiting for? &lt;a href="https://us.pycon.org/2012/registration/"&gt;Go do it&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-8526888628676708017?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/8526888628676708017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=8526888628676708017' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8526888628676708017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8526888628676708017'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2012/01/tips-for-speaking.html' title='Tips for speaking'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-8700794439363618847</id><published>2012-01-18T11:10:00.000-08:00</published><updated>2012-01-18T11:13:46.651-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'>My SOPA boycott</title><content type='html'>I'm against SOPA and PIPA.&lt;br /&gt;&lt;br /&gt;I believe that those bills will kill not just free speech, but also business within the USA. Innovation will wither. I'm also of the belief that those companies trying to get SOPA into place don't realize that no idea is new and if SOPA passes they'll be hammered with an increasing amount of takedowns and suits against them for anything they do. Litigation based on SOPA won't be as easily handled as the current status quo.&lt;br /&gt;&lt;br /&gt;I've signed the petitions, I've posted on Twitter, Facebook, and Google. That isn't enough. I have to be willing to make a sacrifice. And in this case I'm going to make the sacrifice my vote.&lt;br /&gt;&lt;br /&gt;My vote sacrifice is a boycott. It's directed at any politician, local or otherwise:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;My Boycott:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;If you as a politician vote for SOPA/PIPA then you lose my vote. Regardless of whatever other opinions you have or party you belong to, you've lost me as a supporter.&lt;/li&gt;&lt;li&gt;If SOPA/PIPA passes you can get my vote back by voting for what bill that destroys SOPA/PIPA is nominated.&lt;/li&gt;&lt;li&gt;If SOPA/PIPA fails you can get my vote back by voting against whatever bills are resurrected to replace SOPA/PIPA.&lt;/li&gt;&lt;li&gt;I will ignore party boundaries. I will vote against my normal grain simply to get you removed from office.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;h3&gt;Why?&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;Like campaign finance reform, controls of freedom of speech often have unpredictable repercussions.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The terrible thing about these bills is that their supporters are bi-partisan. While it's wonderful to see political opponents working together, in this case, it's for a terrible cause.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I'm going to cross political boundaries too. I'm going to say that as a registered Democrat I'm going to vote Republican if a Democrat candidate at any level votes for SOPA/PIP.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;About Me&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;I don't use pirated software. I don't read, watch, or listen to pirated content. I purchase everything legally or use open source equivalents. I make a pretty decent salary and am pretty much in the direct center of what is called the 'middle-class'.&lt;br /&gt;&lt;br /&gt;I'm also pro-business and a rather patriotic citizen of the United States. I believe in our nation and what it represents, and I know these bills are going to be a dagger in the heart of what our founding fathers gave us.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally, as I said, I'm a Democrat willing to vote Republican, Green, Libertarian, or whatever to make my point. That's my sacrifice. My vote and role in this nation that took my family in over 100 years ago is now in the hands of politicians.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What's yours?&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-8700794439363618847?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/8700794439363618847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=8700794439363618847' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8700794439363618847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8700794439363618847'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2012/01/my-sopa-boycott.html' title='My SOPA boycott'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-6473118491817473306</id><published>2011-12-29T12:09:00.000-08:00</published><updated>2011-12-29T12:16:48.730-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><category scheme='http://www.blogger.com/atom/ns#' term='friends'/><category scheme='http://www.blogger.com/atom/ns#' term='family'/><category scheme='http://www.blogger.com/atom/ns#' term='holidays'/><title type='text'>Resolutions for 2012</title><content type='html'>&lt;ul&gt;&lt;li&gt;Go to a &lt;a href="http://python.org"&gt;Python&lt;/a&gt; related conference in North America, South America, Europe, Asia, Africa, Australia, and New Zealand.&lt;/li&gt;&lt;li&gt;Attend at least one JavaScript related conference or event.&lt;/li&gt;&lt;li&gt;Upload all my outstanding pictures to &lt;a href="http://www.flickr.com/photos/pydanny"&gt;Flickr!&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Make &lt;a href="http://consumernotebook.com"&gt;Consumer Notebook&lt;/a&gt; profitable.&lt;/li&gt;&lt;li&gt;Find more ways to make &lt;a href="http://twitter.com/audreyr"&gt;Audrey Roy&lt;/a&gt; happy.&lt;/li&gt;&lt;li&gt;Pull off an &lt;a href="http://en.wikipedia.org/wiki/Aerial_cartwheel"&gt;Aú sem Mão&lt;/a&gt; during a &lt;a href="http://en.wikipedia.org/wiki/Capoeira"&gt;Capoeira&lt;/a&gt; Roda.&lt;/li&gt;&lt;li&gt;Attend my first Capoeira Batizado.&lt;/li&gt;&lt;li&gt;See a place in the USA I've never been.&lt;/li&gt;&lt;li&gt;Work out at least three times a week.&lt;/li&gt;&lt;li&gt;Drop to a 32 waist&lt;/li&gt;&lt;li&gt;Visit friends and family back east. Been over a year since I've seen my sister!&lt;/li&gt;&lt;li&gt;Blog once a week. That is at least 52 blog entries!&lt;/li&gt;&lt;li&gt;Visit a Theme park.&lt;/li&gt;&lt;li&gt;Learn how to surf or snowboard.&lt;/li&gt;&lt;li&gt;Implement something in node.js, backbone.js, and handlebars.js&lt;/li&gt;&lt;li&gt;Take a high level Python class from the likes of Raymond Hettiger or David Beazly.&lt;/li&gt;&lt;li&gt;Teach some Python or Django.&lt;/li&gt;&lt;li&gt;Have a beer with Thomas, Andy, Andy, Tony, Garrick, Bernd, and the rest of Ye Aulde Gange.&lt;/li&gt;&lt;li&gt;See my old DC area friends such as Eric, Chris, Steve, Beth, Sarah, Daye, Renee, Kenneth, Leslie, Whitney, Dave, and many others.&lt;/li&gt;&lt;li&gt;Visit my Son.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-6473118491817473306?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/6473118491817473306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=6473118491817473306' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6473118491817473306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6473118491817473306'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/12/resolutions-for-2012.html' title='Resolutions for 2012'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-9057864826570203823</id><published>2011-12-27T18:34:00.000-08:00</published><updated>2011-12-27T18:40:33.678-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='djangocon'/><category scheme='http://www.blogger.com/atom/ns#' term='martial arts'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><category scheme='http://www.blogger.com/atom/ns#' term='friends'/><title type='text'>2011 Resolution Summary</title><content type='html'>Items that are crossed out are completed.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Travel to Europe again. Travel to Asia or Africa.&lt;i&gt;(Went to Australia instead. Which was an very, very acceptable substitute.)&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Visit a Disney park.&lt;/li&gt;&lt;li&gt;&lt;strike&gt;See a place in the USA I've never been.&lt;/strike&gt;&lt;/li&gt;&lt;li&gt;Drop the waist size 2 inches and &lt;strike&gt;not break any bones.&lt;/strike&gt;&lt;/li&gt;&lt;li&gt;&lt;strike&gt;Go to Pycon and present or teach.&lt;/strike&gt;&lt;/li&gt;&lt;li&gt;&lt;strike&gt;Go to DjangoCon and present or teach.&lt;/strike&gt;&lt;/li&gt;&lt;li&gt;&lt;strike&gt;Present at LA Django&lt;/strike&gt;&lt;/li&gt;&lt;li&gt;&lt;strike&gt;Continue my Muay Thai and Capoeira studies&lt;/strike&gt;, get back into Eskrima, learn some more BJJ, and &lt;strike&gt;practice the forms I know.&lt;/strike&gt;&lt;/li&gt;&lt;li&gt;Work out at least three times a week.&lt;/li&gt;&lt;li&gt;Go back east and teach martial arts for a day.&lt;/li&gt;&lt;li&gt;&lt;strike&gt;Finish some outstanding legal proceedings.&lt;/strike&gt;&lt;/li&gt;&lt;li&gt;&lt;strike&gt;Launch a site that does cool stuff and somehow brings in money.&lt;/strike&gt; &lt;i&gt;(&lt;a href="http://consumernotebook.com"&gt;Consumer Notebook&lt;/a&gt;)&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Get to the point with LISP where I can do cool stuff in it without needing a textbook. &lt;i&gt;(I seem to have spent this time working on JavaScript instead)&lt;/i&gt;.&lt;/li&gt;&lt;li&gt;Blog once a week. That is at least 52 blog entries! &lt;i&gt;(almost there!)&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;strike&gt;&lt;a href="http://pydanny.blogspot.com/2011/05/i-love-this-girl.html"&gt;Explain why I wrote&lt;/a&gt; &lt;a href="http://pydanny.blogspot.com/2010/02/pycon-2010-report-i.html"&gt;Diversity Rocks&lt;/a&gt;.&lt;/strike&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-9057864826570203823?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/9057864826570203823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=9057864826570203823' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/9057864826570203823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/9057864826570203823'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/12/2011-resolution-summary.html' title='2011 Resolution Summary'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-1002779903199102244</id><published>2011-12-22T16:46:00.000-08:00</published><updated>2011-12-22T17:06:56.699-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pyramid'/><category scheme='http://www.blogger.com/atom/ns#' term='opencomparison'/><category scheme='http://www.blogger.com/atom/ns#' term='courses'/><category scheme='http://www.blogger.com/atom/ns#' term='django packages'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='classes'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><title type='text'>New Year’s Python Meme</title><content type='html'>I love these blog memes, so I give you my version of &lt;a href="http://tarekziade.wordpress.com/2011/12/20/new-years-python-meme-2/"&gt;Tarek Ziade's New Year's Python Meme&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;1. What’s the coolest Python application, framework or library you have discovered in 2011?&lt;/h3&gt;&lt;br /&gt;For &lt;a href="http://python.org"&gt;python&lt;/a&gt; libraries, that would have to be &lt;a href="http://twitter.com/kennethreitz"&gt;Kenneth Reitz&lt;/a&gt;' &lt;a href="http://docs.python-requests.org/"&gt;python-requests&lt;/a&gt; library. I've used it for an amazing amount of stuff and &lt;a href="http://pydanny.blogspot.com/2011/05/python-http-requests-for-humans.html"&gt;blogged&lt;/a&gt; about it. It took the grunge out of doing HTTP actions with Python. The API is clean and elegant, getting out of your way. It embodies the State of the art for API design, which closely matches the Zen of Python.&lt;br /&gt;&lt;br /&gt;For applications, &lt;a href="http://djangolint.com"&gt;djangolint.com&lt;/a&gt; is awesome. It has helped me out so much on several projects. I would love to see something like this implemented and maintained for modern Python.&lt;br /&gt;&lt;br /&gt;All the Python friendly PaaS efforts that have emerged are changing the landscape for those of us who want to launch projects but don't want to become full time system administrators in the process. &lt;a href="http://heroku.com"&gt;Heroku&lt;/a&gt;, &lt;a href="http://djangozoom.com"&gt;DjangoZoom&lt;/a&gt;, &lt;a href="https://www.dotcloud.com/"&gt;DotCloud&lt;/a&gt;, &lt;a href="http://ep.io"&gt;ep.io&lt;/a&gt;, &lt;a href="http://gondor.io"&gt;gondor.io&lt;/a&gt;, and others are making it possible for developers to focus on development not server tooling. Google App Engine paved the way and it is wonderful to see the rest of the universe catch up with material that more closely follow core.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;2. What new programming technique did you learn in 2011?&lt;/h3&gt;&lt;br /&gt;Event based programming! I've touched on it for years, but this year I really got a lot more more into it thanks to &lt;a href="https://twitter.com/aurynn"&gt;Aurynn Shaw&lt;/a&gt; kickstarting me and &lt;a href="http://twitter.com/audreyr"&gt;Audrey Roy&lt;/a&gt; expanding my knowledge ever since.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;3. What’s the name of the open source project you contributed the most in 2011? What did you do?&lt;/h3&gt;&lt;br /&gt;I participated mostly as co-lead in the &lt;a href="http://opencomparison.org"&gt;Open Comparison&lt;/a&gt; project, which amongst other things involved running the largest sprint at PyCon 2011. We maintained &lt;a href="http://djangopackages.com"&gt;Django Packages&lt;/a&gt; and launched &lt;a href="http://pyramid.opencomparison.org"&gt;Pyramid&lt;/a&gt; and &lt;a href="http://plone.opencomparison.org"&gt;Plone&lt;/a&gt; versions of the project. We hope to launch a Python implementation in 2012.&lt;br /&gt;&lt;br /&gt;I took a lot of notes this year at &lt;a href="http://pydanny-event-notes.rtfd.org"&gt;pydanny-event-notes&lt;/a&gt; - enough to make a book.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;4. What was the Python blog or website you read the most in 2011?&lt;/h3&gt;&lt;br /&gt;Like &lt;a href="http://www.boredomandlaziness.org/2011/12/new-year-python-meme-december-2011.html"&gt;Nick Coghlan&lt;/a&gt;, that would be &lt;a href="http://planet.python.org"&gt;http://planet.python.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;5. What are the three top things you want to learn in 2012?&lt;/h3&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;How to use whatever consistently maintained project that replaces PIL that works in Python 2.7.x and Python 3.x.&lt;/li&gt;&lt;li&gt;Really advanced Python as taught by Raymond Hettiger.&lt;/li&gt;&lt;li&gt;&lt;a href="http://documentcloud.github.com/backbone/"&gt;backbone.js&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h3&gt;6. What are the top software, app or lib you wish someone would write in 2012?&lt;/h3&gt;&lt;br /&gt;A tool python-requests, but for shell access. Something like &lt;a href="http://pypi.python.org/pypi/Unipath"&gt;Unipath&lt;/a&gt;, but kept up-to-date and with nicely written documentation on &lt;a href="http://rtfd.org"&gt;Read the Docs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A PIL replacement that is maintained, works for all modern Pythons, and is close enough to the PIL API to not cause too much confusion.&lt;br /&gt;&lt;br /&gt;Something like &lt;a href="http://djangolint.com"&gt;Django Lint&lt;/a&gt; but for Python 2.7.x/3.x.&lt;br /&gt;&lt;br /&gt;An open source project that tracks test coverages across PyPI and publishes reports of the results via an API.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Want to do your own list? here’s how:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;copy-paste the questions and answer to them in your blog&lt;/li&gt;&lt;li&gt;tweet it with the #2012pythonmeme hashtag&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-1002779903199102244?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/1002779903199102244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=1002779903199102244' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/1002779903199102244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/1002779903199102244'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/12/new-years-python-meme.html' title='New Year’s Python Meme'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-143689920387307068</id><published>2011-12-17T15:10:00.000-08:00</published><updated>2011-12-17T21:55:26.689-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Evaluating which package to use</title><content type='html'>In November of 2009 I wrote about which &lt;a href="http://pydanny.blogspot.com/2009/11/code-ill-reuse.html"&gt;third-party Python Packages I'll use&lt;/a&gt;. Here is my modern take on it - much of it inspired by personal experience and the advice of peers and mentors:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Tag and release on PyPI&lt;/h3&gt;&lt;br /&gt;I really don't like pulling from tags on &lt;a href="https://github.com"&gt;Github&lt;/a&gt;, &lt;a href="https://bitbucket.org"&gt;BitBucket&lt;/a&gt;, or whatever. Or being told to pull from a specific commit. That works in early development, but it certainly doesn't fly in production. &lt;br /&gt;&lt;br /&gt;I also get frustrated when people release on &lt;a href="http://pypi.python.org/pypi"&gt;PyPI&lt;/a&gt; but then insist on hosting the release themselves. That is because invariably at some critical point in development when PyPI is up, the host provider is down. &lt;br /&gt;&lt;br /&gt;A &lt;b&gt;huge&lt;/b&gt; point of frustration is that I shouldn't have to leave the canonical source of &lt;a href="http://python.org"&gt;Python&lt;/a&gt; package versions to hunt down what I should be using. I've seen too many beginning Python developers fall into the trap of using 3 year old packages because they didn't know they should be using trunk. I was guilty of doing it for a 6+ month old release in 2010, and for that I apologize and promise I won't do it again.&lt;br /&gt;&lt;br /&gt;This also means your package needs to be &lt;a href="http://pypi.python.org/pypi/pip"&gt;pip&lt;/a&gt; installable. If you don't know how to do it, please read the &lt;a href="http://guide.python-distribute.org/"&gt;The Hitchhiker’s Guide to Packaging&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Documentation&lt;/h3&gt;&lt;br /&gt;2011 is closing, which means your package needs to have &lt;a href="http://sphinx.pocoo.org/"&gt;Sphinx Documentation&lt;/a&gt;. And those Sphinx Docs should be on &lt;a href="http://readthedocs.org/"&gt;Read the Docs&lt;/a&gt;. Read the Docs is great because it doesn't just host the rendered HTML, it also lets you easily push to it from a DVCS push - and implements nice search and handy PDFs too.&lt;br /&gt;&lt;br /&gt;Yes, I know there is &lt;a href="http://packages.python.org"&gt;packages.python.org&lt;/a&gt; but I don't trust it. It doesn't have the easy &lt;strong&gt;push/deploy&lt;/strong&gt; workflow of Read the Docs, which means often the docs are dated because it's yet another step for developers. Plus, the lack of search outside of Sphinx makes it hard to discover documentation.&lt;br /&gt;&lt;br /&gt;The same goes for hosting docs yourself. In fact, that's usually worse because when someone goes on vacation and the docs go down... ARGH!&lt;br /&gt;&lt;br /&gt;Please don't mention &lt;strike&gt;easy_install&lt;/strike&gt; in your docs. We are nearly in 2012 and ought to be unified on our package installer, which is &lt;a href="http://pypi.python.org/pypi/pip"&gt;&lt;b&gt;pip&lt;/b&gt;&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Tests&lt;/h3&gt;&lt;br /&gt;You should have them. Otherwise any update you put on PyPI puts the rest of us at risk. We can't be sure your updates to the project won't break our stuff. So please write some tests! If you add in coverage.py and some kind of lint checker, it can even be fun! It certainly does earn you bragging rights having a high coverage rating.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Code Quality&lt;/h3&gt;&lt;br /&gt;Are you using new-style classes or old-style classes? Do you follow PEP-8? Do you keep meta-classes to the absolute minimum? Is the code on an available DVCS so others can fork and contribute? These are things that weigh in my judgement, and certainly the judgement of others.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-143689920387307068?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/143689920387307068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=143689920387307068' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/143689920387307068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/143689920387307068'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/12/evaluating-which-package-to-use.html' title='Evaluating which package to use'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-5952408638111501243</id><published>2011-12-16T11:57:00.000-08:00</published><updated>2011-12-16T11:57:39.614-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opencomparison'/><category scheme='http://www.blogger.com/atom/ns#' term='djangodash'/><category scheme='http://www.blogger.com/atom/ns#' term='consumernotebook'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Announcing Consumer Notebook!</title><content type='html'>Need a &lt;a href="http://python.org/"&gt;Python programming language&lt;/a&gt; book? Want to see a comparison of the ones I own and use? Check out my &lt;a href="http://consumernotebook.com/lists/pydanny/must-have-python-programming-books/"&gt;Must-Have Python Programming Books &lt;/a&gt; comparison grid. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://consumernotebook.com/lists/pydanny/must-have-python-programming-books/"&gt;&lt;img border="0" height="123" src="http://1.bp.blogspot.com/-opvIYk7fbOc/TuuX4ohbUCI/AAAAAAAABBU/z52xqc4zSrQ/s200/Screen+shot+2011-12-16+at+11.09.28+AM.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Let's drill down and take a closer look at one of the items on the page, in this case &lt;a href="http://www.doughellmann.com/"&gt;Doug Hellmann&lt;/a&gt;'s amazing &lt;a href="http://consumernotebook.com/python-standard-library-example-developers/110/"&gt;The Python Standard Library by Example&lt;/a&gt;. The product detail pages include the ability to add pros and cons and attach said products to comparison grids and specialized lists like 'my wishlist' and 'my possessions'.&lt;br /&gt;&lt;br /&gt;Speaking of wishlists, &lt;a href="http://consumernotebook.com/lists/pydanny/wishlist/"&gt;check out my own&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://consumernotebook.com/lists/pydanny/wishlist/"&gt;&lt;img border="0" height="211" src="http://4.bp.blogspot.com/-N4Y6vZPX85s/TuuX-Y34NjI/AAAAAAAABBc/AgqXee08HSM/s320/Screen+shot+2011-12-16+at+11.10.18+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In order to add items, like&amp;nbsp;&lt;a href="http://consumernotebook.com/pajamacity-monkey-fleece-feetie-pajamas/102/"&gt;footy pajamas&lt;/a&gt;,&amp;nbsp;&amp;nbsp;I click on the 'add' button and paste the Amazon (or BestBuy) URL into the form:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_5gFPrlJNbA/TuuY_hnZElI/AAAAAAAABB0/UgKbJoFjLD8/s1600/Screen+shot+2011-12-16+at+11.14.18+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://1.bp.blogspot.com/-_5gFPrlJNbA/TuuY_hnZElI/AAAAAAAABB0/UgKbJoFjLD8/s200/Screen+shot+2011-12-16+at+11.14.18+AM.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-J72QEuoMOVg/TuuY8RBLiiI/AAAAAAAABBs/YSW3ds8OD-o/s1600/Screen+shot+2011-12-16+at+11.14.50+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="146" src="http://1.bp.blogspot.com/-J72QEuoMOVg/TuuY8RBLiiI/AAAAAAAABBs/YSW3ds8OD-o/s200/Screen+shot+2011-12-16+at+11.14.50+AM.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;At this time we just handle Amazon USA and BestBuy USA. In the future we plan on adding more affiliate providers, including non-USA providers to support our non-USA friends.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;There's a lot more than that...&lt;/h3&gt;In addition to &lt;a href="http://consumernotebook.com/blog/2011/dec/we-love-infographics/"&gt;weekly infographics&lt;/a&gt;, comparison grids, lists, and products, Consumer Notebook also awards points, coins,  badges, and a growing privilege set to participating users. We even implemented an energy bar which regenerates over time, designed to match the pace of human users and serve as one of the brakes on scripts and bots. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://consumernotebook.com/profiles/pydanny/"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-Bj2ykQAhb3c/TuuZfjoCWzI/AAAAAAAABB8/diG3lEqUTwk/s200/Screen+shot+2011-12-16+at+11.18.00+AM.png" width="156" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Technology&lt;/h3&gt;I built this with &lt;a href="http://twitter.com/audreyr"&gt;Audrey Roy&lt;/a&gt; using Python, &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt;, &lt;a href="http://jquery.com/"&gt;JQuery&lt;/a&gt;, &lt;a href="http://www.postgresql.org/"&gt;PostGreSQL&lt;/a&gt;, &lt;a href="http://www.memcached.org/"&gt;Memcached&lt;/a&gt;, and &lt;a href="http://www.rabbitmq.com/"&gt;RabbitMQ&lt;/a&gt;. I'll be blogging in depth about the technical side in an upcoming post.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Genesis&lt;/h3&gt;&lt;br /&gt;It was the summer of 2010 and we were brainstorming ideas for a coding contest called Django Dash. The one we settled on was a listing and comparison site for Django called &lt;a href="http://djangopackages.com/"&gt;Django Packages&lt;/a&gt;. The result has been a very useful tool for the Django community. Eventually, with the help of several dozen people, we turned the code into the &lt;a href="http://opencomparison.org/"&gt;Open Comparison&lt;/a&gt; framework and launched &lt;a href="http://pyramid.opencomparison.org/"&gt;Pyramid&lt;/a&gt; and &lt;a href="http://plone.opencomparison.org/"&gt;Plone&lt;/a&gt; implementations. Time permitting this year, we plan to do Python, Flask, Twisted, Node, JQuery, and other implementations.&lt;br /&gt;&lt;br /&gt;Since then we've wanted to do something similar, but in the context of products. And we wanted to do it right - elegant design combined with an ad-free space. So we cooked up Consumer Notebook, launching today!&lt;br /&gt;&lt;br /&gt;We'll be adding features and enhancements in the months to come. We've acquired a &lt;a href="https://twitter.com/toastythedog"&gt;community manager&lt;/a&gt;, and even have a &lt;a href="http://consumernotebook.com/blog/"&gt;blog&lt;/a&gt;. We would love for you to &lt;a href="http://consumernotebook.com/"&gt;check out the site&lt;/a&gt;, share it with your friends and family, and send us your commentary, suggestions, and advice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-5952408638111501243?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/5952408638111501243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=5952408638111501243' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5952408638111501243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5952408638111501243'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/12/announcing-consumer-notebook.html' title='Announcing Consumer Notebook!'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-opvIYk7fbOc/TuuX4ohbUCI/AAAAAAAABBU/z52xqc4zSrQ/s72-c/Screen+shot+2011-12-16+at+11.09.28+AM.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-87045814718207399</id><published>2011-12-09T07:05:00.000-08:00</published><updated>2011-12-15T06:52:53.123-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>My BaseModel</title><content type='html'>When I build projects in &lt;a href="http://djangoproject.com"&gt;Django&lt;/a&gt; I like to have a 'core' app with all my common bits in it, including a &lt;a href="https://github.com/opencomparison/opencomparison/blob/master/apps/core/models.py"&gt;BaseModel&lt;/a&gt;. In that BaseModel I'll define the most basic fields possible, in this case a simple pair of created/modified fields built using custom &lt;a href="http://djangopackages.com/packages/p/django-extensions/"&gt;django-extension&lt;/a&gt; fields. &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint-py"&gt;# core/models.py&lt;br /&gt;from django.db import models&lt;br /&gt;from django.utils.translation import ugettext_lazy as _&lt;br /&gt;&lt;br /&gt;from core.fields import CreationDateTimeField, ModificationDateTimeField&lt;br /&gt;&lt;br /&gt;class BaseModel(models.Model):&lt;br /&gt;    """ Base abstract base class to give creation and modified times """&lt;br /&gt;    created     = CreationDateTimeField(_('created'))&lt;br /&gt;    modified    = ModificationDateTimeField(_('modified'))&lt;br /&gt;    &lt;br /&gt;    class Meta:&lt;br /&gt;        abstract = True&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You'll notice I also have core.fields defined. That is because (unless things have changed), django-extensions doesn't work with &lt;a href="http://djangopackages.com/packages/p/south/"&gt;South&lt;/a&gt; out of the box. Hence the file below where I extend those fields to play nicely with my &lt;a href="http://djangopackages.com/grids/g/database-migration/"&gt;migration tool&lt;/a&gt; of choice.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint-py"&gt;# core/fields.py&lt;br /&gt;from django_extensions.db.fields import CreationDateTimeField, ModificationDateTimeField&lt;br /&gt;&lt;br /&gt;class CreationDateTimeField(CreationDateTimeField):&lt;br /&gt;&lt;br /&gt;    def south_field_triple(self):&lt;br /&gt;        "Returns a suitable description of this field for South."&lt;br /&gt;        # We'll just introspect ourselves, since we inherit.&lt;br /&gt;        from south.modelsinspector import introspector&lt;br /&gt;        field_class = "django.db.models.fields.DateTimeField"&lt;br /&gt;        args, kwargs = introspector(self)&lt;br /&gt;        return (field_class, args, kwargs)    &lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;class ModificationDateTimeField(ModificationDateTimeField):&lt;br /&gt;&lt;br /&gt;    def south_field_triple(self):&lt;br /&gt;        "Returns a suitable description of this field for South."&lt;br /&gt;        # We'll just introspect ourselves, since we inherit.&lt;br /&gt;        from south.modelsinspector import introspector&lt;br /&gt;        field_class = "django.db.models.fields.DateTimeField"&lt;br /&gt;        args, kwargs = introspector(self)&lt;br /&gt;        return (field_class, args, kwargs)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Unfortunately, this all shows up as red marks when I run &lt;a href="http://nedbatchelder.com/code/coverage/"&gt;coverage.py&lt;/a&gt; reports. To deal with that I added in some tests. However, I'll readily I'm not super pleased with the tests below, but they are better then nothing, right?&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint-py"&gt;# core/tests/test_fields.py&lt;br /&gt;from django.test import TestCase&lt;br /&gt;&lt;br /&gt;from core.fields import CreationDateTimeField, ModificationDateTimeField&lt;br /&gt;&lt;br /&gt;class TestFields(TestCase):&lt;br /&gt;    &lt;br /&gt;    def test_create_override(self):&lt;br /&gt;        field = CreationDateTimeField()&lt;br /&gt;        triple = field.south_field_triple()&lt;br /&gt;        &lt;br /&gt;        self.assertEquals(triple[0], 'django.db.models.fields.DateTimeField')&lt;br /&gt;        self.assertEquals(triple[1], list())&lt;br /&gt;        self.assertEquals(triple[2], {'default': 'datetime.datetime.now', 'blank': 'True'})&lt;br /&gt;        &lt;br /&gt;    def test_modify_override(self):&lt;br /&gt;        field = ModificationDateTimeField()&lt;br /&gt;        triple = field.south_field_triple()&lt;br /&gt;        &lt;br /&gt;        self.assertEquals(triple[0], 'django.db.models.fields.DateTimeField')&lt;br /&gt;        self.assertEquals(triple[1], list())&lt;br /&gt;        self.assertEquals(triple[2], {'default': 'datetime.datetime.now', 'blank': 'True'})&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Closing Thoughts&lt;/h3&gt;My pattern is also If I need more stuff in this BaseModel I extend it with another abstract class instead of changing it. That way I can be sure at least this part works really well and any additions are isolated in another class.&lt;br /&gt;&lt;br /&gt;I'll reiterate that I'm not happy with the tests. I'm open to suggestions. &lt;br /&gt;&lt;br /&gt;I pretty much got the BaseModel from &lt;a href="https://twitter.com/fwiles"&gt;Frank Wiles&lt;/a&gt; of &lt;a href="http://www.revsys.com/"&gt;RevSys&lt;/a&gt; back in the summer of 2010. What I added was sticking all the common bits into the core app, getting the South migration to play more nicely, and adding tests.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;But much of this is moot!&lt;/h3&gt;&lt;strong&gt;Note&lt;/strong&gt;: I added this segment several days after my original posting because of the stuff in the comments. Thanks &lt;a href="http://twitter.com/jezdez"&gt;Jannis Leidel&lt;/a&gt; and someone named John - this is part of why I post. &lt;br /&gt;&lt;br /&gt;Jannis and John both pointed out that django_extensions now has a TimeStampedModel that does what my BaseModel does. They also pointed out that django_extensions comes with built-in South migrations for it's CreationDateTimeField and ModificationDateTimeField fields.&lt;br /&gt;&lt;br /&gt;Which means thanks we can safely just do this and not worry about migrations:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint-py"&gt;# core/models.py&lt;br /&gt;from django.db import models&lt;br /&gt;from django.utils.translation import ugettext_lazy as _&lt;br /&gt;&lt;br /&gt;from django_extensions.db.fields import CreationDateTimeField, ModificationDateTimeField&lt;br /&gt;&lt;br /&gt;class BaseModel(models.Model):&lt;br /&gt;    """ Base abstract base class to give creation and modified times """&lt;br /&gt;    created     = CreationDateTimeField(_('created'))&lt;br /&gt;    modified    = ModificationDateTimeField(_('modified'))&lt;br /&gt;    &lt;br /&gt;    class Meta:&lt;br /&gt;        abstract = True&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/4477131926658044957-87045814718207399?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/87045814718207399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=87045814718207399' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/87045814718207399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/87045814718207399'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/12/my-basemodel.html' title='My BaseModel'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-917301476133711071</id><published>2011-12-07T08:16:00.000-08:00</published><updated>2011-12-07T09:36:29.389-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='djangocon'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Made Up Statistics</title><content type='html'>At &lt;a href="http://djangocon.us/"&gt;DjangoCon&lt;/a&gt;&amp;nbsp;my good friend &lt;a href="https://twitter.com/maraujop"&gt;Miguel Araujo&lt;/a&gt; and I presented on &lt;a href="http://speakerdeck.com/u/pydanny/p/advanced-django-forms-usage"&gt;Advanced Django Form Usage&lt;/a&gt;. &lt;a href="http://www.slideshare.net/pydanny/advanced-django-forms-usage/52"&gt;Slide 18&lt;/a&gt; of that talk mentioned some made up statistics. Here they are for reference:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;91% of Django projects use ModelForms.&lt;/li&gt;&lt;li&gt;80% ModelForms require trivial logic.&lt;/li&gt;&lt;li&gt;20% ModelForms require complex logic.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Important Disclaimer&lt;/b&gt;: These numbers were cooked out of thin air by yours truly. I determined them with zero research, they carry absolutely not scientific weight, and shouldn't be used in any serious argument. They are wholly my opinion, which is good or bad depending on your point of view and your own opinion of my opinions.&lt;br /&gt;&lt;br /&gt;With that out of the way, I'm going to make a bar graph out of my fictional data:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-51NIflXsIEs/Tt9-r4EdTyI/AAAAAAAABAs/8Vhak72LbIE/s1600/Screen+Shot+2011-12-07+at+6.42.41+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="275" src="http://2.bp.blogspot.com/-51NIflXsIEs/Tt9-r4EdTyI/AAAAAAAABAs/8Vhak72LbIE/s640/Screen+Shot+2011-12-07+at+6.42.41+AM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You'll notice that my bar titles could be stronger. I actually did that on purpose in case anyone tries to use that chart in real life. In any case, if you thought that was interesting, then read on. I have many more made-up statistics. For example, here are more numbers I've cooked up:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Pydanny Made Up DevOps Statistics&lt;/h3&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/DevOps"&gt;DevOps&lt;/a&gt; is the new hotness. I know because every other Python meetup features someone speaking on it - just like every other Ruby, Perl, and PHP meetup. Anyway... numbers:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;24.3% &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; developers doing DevOps think they could have launched a &lt;a href="http://en.wikipedia.org/wiki/PaaS"&gt;PaaS&lt;/a&gt; (aka &lt;a href="http://heroku.com/"&gt;Heroku&lt;/a&gt; clone) before &lt;a href="http://www.quora.com/What-is-the-Heroku-equivalent-for-Django-applications"&gt;it got crowded&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;46.3% Python developers doing DevOps spend all their time writing &lt;a href="https://github.com/opscode/chef"&gt;Chef&lt;/a&gt;/&lt;a href="https://github.com/puppetlabs/puppet"&gt;Puppet&lt;/a&gt; scripts and yet still claim to be Python developers.&lt;/li&gt;&lt;li&gt;14% Python developers are worried about so much of the backend being done in Ruby.&lt;/li&gt;&lt;li&gt;54% Python developers are just happy that there are many options now and don't care about the internal machinery that much.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;This time, because I'm worried about the data being taken seriously, I've titled the bar chart in such a way that no one will reference it in anything important:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-JgpJrCKf0hA/Tt9-eNCEJFI/AAAAAAAABAk/gvSuTSPJSHo/s1600/Screen+Shot+2011-12-07+at+6.53.58+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="299" src="http://3.bp.blogspot.com/-JgpJrCKf0hA/Tt9-eNCEJFI/AAAAAAAABAk/gvSuTSPJSHo/s640/Screen+Shot+2011-12-07+at+6.53.58+AM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Pydanny Made Up Python Enviroment Statistics&lt;/h3&gt;&lt;br /&gt;Following the obvious logic flow&amp;nbsp;(to me anyway)&amp;nbsp;of DevOps to something else, let's go into Python environments, also known as the &lt;a href="http://pypi.python.org/pypi/virtualenv"&gt;VirtualEnv&lt;/a&gt; vs &lt;a href="http://pypi.python.org/pypi/zc.buildout"&gt;Buildout&lt;/a&gt; debate, which adds up to an even 100% (making it good pie chart material):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;77% of Python Developers prefer VirtualEnv.&lt;/li&gt;&lt;li&gt;13% of Python Developers prefer Buildout.&lt;/li&gt;&lt;li&gt;7% of Python developers rolled their own solution and &lt;b&gt;wish they could switch over.&lt;/b&gt;&lt;/li&gt;&lt;li&gt;3% of Python developers rolled their own solution and are fiendishly delighted with how they have guaranteed their own job security forever. I know who some of you are and I can say with some confidence that when the Zombie apocalypse happens, no one is going to invite you into their fortified compounds. &lt;b&gt;We hate you that much.&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-_KjJJk8IreQ/Tt-AAL5RXxI/AAAAAAAABA0/5-rNxxl_X_U/s1600/Screen+Shot+2011-12-07+at+7.02.05+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="350" src="http://4.bp.blogspot.com/-_KjJJk8IreQ/Tt-AAL5RXxI/AAAAAAAABA0/5-rNxxl_X_U/s400/Screen+Shot+2011-12-07+at+7.02.05+AM.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Pydanny Made Up Template Debate Statistics&lt;/h3&gt;&lt;br /&gt;The made up statistics in this post frequently touch on contentious topics. So let me add another controversial topic, this time the never ending template debate in Python:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;70% python developers prefer &lt;a href="https://docs.djangoproject.com/en/1.3/ref/templates/"&gt;non-XML&lt;/a&gt; &lt;a href="http://jinja.pocoo.org/docs/"&gt;templates&lt;/a&gt;&lt;/li&gt;&lt;li&gt;25% python developers prefer &lt;a href="http://www.makotemplates.org/"&gt;XML&lt;/a&gt; &lt;a href="http://genshi.edgewall.org/"&gt;templates&lt;/a&gt;&lt;/li&gt;&lt;li&gt;5% python developers wonder why we don't just use the &lt;a href="http://docs.python.org/library/string.html#formatstrings"&gt;str.format()&lt;/a&gt; method and be done with it&lt;/li&gt;&lt;li&gt;50% python developers &lt;a href="http://lucumr.pocoo.org/2010/12/5/not-so-stupid-template-languages/"&gt;strongly&lt;/a&gt; &lt;a href="http://techspot.zzzeek.org/2010/12/04/in-response-to-stupid-template-languages/"&gt;disagree&lt;/a&gt; with my &lt;a href="http://pydanny.blogspot.com/2010/12/stupid-template-languages.html"&gt;Stupid Template Languages&lt;/a&gt; blog post from last year.&lt;/li&gt;&lt;/ul&gt;The display for this data is a lovely pie chart as seen below. In order to make it appear more useful, I took out the part where people disagreed with me and also made it a 3-D pie chart.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--ijkQ3PBK34/Tt-Egj96KrI/AAAAAAAABA8/q3YaOK19iu4/s1600/Screen+Shot+2011-12-07+at+7.19.56+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="345" src="http://2.bp.blogspot.com/--ijkQ3PBK34/Tt-Egj96KrI/AAAAAAAABA8/q3YaOK19iu4/s400/Screen+Shot+2011-12-07+at+7.19.56+AM.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Pydanny Made Up Python Web Optimization Statistics&lt;/h3&gt;&lt;br /&gt;I sometimes get asked how to best optimize a Django site. My answer is '&lt;b&gt;cache and then cache some more&lt;/b&gt;' but there are those who disagree with me and start switching out Django internals before doing anything silly like looking at I/O. &amp;nbsp;My bet is this same thing happens with other frameworks such as &lt;a href="http://docs.pylonsproject.org/en/latest/docs/pyramid.html"&gt;Pyramid&lt;/a&gt;.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;20% developers argue switching template languages.&lt;/li&gt;&lt;li&gt;80% developers argue using caching and load balancing.&lt;/li&gt;&lt;li&gt;100% Django/Pyramid/&lt;a href="http://flask.pocoo.org/"&gt;Flask&lt;/a&gt;/etc core developers argue using caching and load balancing.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-bClUXJGnY8Q/Tt-iEZTBYvI/AAAAAAAABBM/MOjFk6PPGxA/s1600/Screen+Shot+2011-12-07+at+9.27.10+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="231" src="http://1.bp.blogspot.com/-bClUXJGnY8Q/Tt-iEZTBYvI/AAAAAAAABBM/MOjFk6PPGxA/s400/Screen+Shot+2011-12-07+at+9.27.10+AM.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Of all the made up statistics in this blog post, I suspect this is the one closest to the truth of things.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update&lt;/b&gt;: &lt;a href="http://twitter.com/alex_gaynor"&gt;Alex Gaynor&lt;/a&gt; and &lt;a href="http://twitter.com/audreyr"&gt;Audrey Roy&lt;/a&gt; pointed out that the original line graph for this data was not appropriate. My weak defense was that I'm trying not to make things too serious but they stated that the line graph was so&amp;nbsp;inappropriate&amp;nbsp;it distracted from the rest of the post. Thanks for the advice!&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Pydanny Made Up Framework Debate Statistics&lt;/h3&gt;&lt;br /&gt;Alright, let's conclude this article with some statistics I cooked up about frameworks in Python. I'm going to do more then just mention web frameworks, dabbling into other awesome things that the Python community has given us.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;23.6% of us get &lt;a href="http://webpy.org/"&gt;web.py&lt;/a&gt; and &lt;a href="http://www.web2py.com/"&gt;web2py&lt;/a&gt; confused with each other.&lt;/li&gt;&lt;li&gt;42% Python developers think Pyramid/Flask have awesome names that don't get mispronounced the same way Django does.&lt;/li&gt;&lt;li&gt;28% Python developers wish they could find a way to get some &lt;a href="http://scipy.org/"&gt;SciPy&lt;/a&gt; into their projects.&lt;/li&gt;&lt;li&gt;22% Python developers wish there was a &lt;a href="http://www.python.org/dev/peps/pep-0008/"&gt;PEP-8&lt;/a&gt; wrapper for &lt;a href="http://twistedmatrix.com/trac/"&gt;Twisted&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;49% Twisted developers wish that Python had accepted their standard instead of PEP-8.&lt;/li&gt;&lt;li&gt;90% Python developers wonder what they were drinking when they renamed it to&amp;nbsp;&lt;a href="http://bluebream.zope.org/"&gt;BlueBreem&lt;/a&gt; and wonder if it is sold over the counter in their municipality.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;No chart? Getting this one to look meaningful was turning into a herculean effort. I invite others to render this data into something that look attractive and doesn't lose meaning. Come up with something impressive and I'll put it into a follow-up blog post.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-917301476133711071?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/917301476133711071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=917301476133711071' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/917301476133711071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/917301476133711071'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/12/made-up-statistics.html' title='Made Up Statistics'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-51NIflXsIEs/Tt9-r4EdTyI/AAAAAAAABAs/8Vhak72LbIE/s72-c/Screen+Shot+2011-12-07+at+6.42.41+AM.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-4649590964919437140</id><published>2011-12-04T16:46:00.000-08:00</published><updated>2011-12-04T16:48:00.289-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='djangocon'/><category scheme='http://www.blogger.com/atom/ns#' term='australia'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>The Story of Live-Noting</title><content type='html'>Like a lot of people, I've got this thing I do when I attend conferences, meetups, classes, and tutorials: I take notes. My open source based ones are mostly written in &lt;a href="http://en.wikipedia.org/wiki/ReStructuredText"&gt;RestructuredText&lt;/a&gt; and I've kept in a particular folder since at least 2006.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Putting notes in a DVCS&lt;/h3&gt;On September 13, 2009, I uploaded these notes to &lt;a href="http://github.com"&gt;Github.com&lt;/a&gt;. I did that because I wasn't pleased with the workflow I established of moving items to Dropbox for backup. I use DVCS all the time and I figured why not just put my notes where I put my code? So I added my notes as a Github repo.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;DVCS Notes Based Management System?&lt;/h3&gt;For a while I tried to use the Github folder README.rst trick to make a navigations system for my notes. But Github isn't designed for making a README into a dynamic custom content navigator, and it would make a silly feature request. I would rather the Github team work on &lt;a href="http://en.wikipedia.org/wiki/Mercurial"&gt;Mercurial&lt;/a&gt; integration or other practical things before they honored a request to turn their system into my own custom Notes Management System. Eventually I just gave up on it and moved on.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Sphinx + Read The Docs!&lt;/h3&gt;In early July of 2011 I had a wicked fun thought. What if I turned my notes into a &lt;a href="http://en.wikipedia.org/wiki/Mercurial"&gt;Sphinx&lt;/a&gt; project and posted it on &lt;a href="http://readthedocs.org"&gt;readthedocs.org&lt;/a&gt;? Most of my content is in RestructuredText and I've gotten really fast at rolling out Sphinx documentation. The 'hard' part would be converting the few README.rst files into index.rst files, but on the flip side I could use fancy Sphinx directives.&lt;br /&gt;&lt;br /&gt;I'm not exactly sure when I started down this path, bit this &lt;a href="https://github.com/pydanny/pydanny-event-notes/commit/2d17305ee7e75c9972d9f3fad3b35afdc3cc4a30#Makefile"&gt;commit log entry&lt;/a&gt; leads me to think I had it working on or around July 8th. What that would mean is that every time I pushed up a change in my notes, within minutes readthedocs.org would publish the content to the world in lovely HTML markup.&lt;br /&gt;&lt;br /&gt;The result?&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;a href="http://pydanny-event-notes.readthedocs.org/"&gt;Pydanny Event Notes&lt;/a&gt;&lt;/h3&gt;&lt;br /&gt;Here's a screen shot of the front page&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://pydanny-event-notes.readthedocs.org" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="260" width="320" src="http://1.bp.blogspot.com/-4x7yIGXZLzE/TtwS1kBMkxI/AAAAAAAAA_o/DsJOE5zxABM/s320/Screen%2BShot%2B2011-12-04%2Bat%2B4.39.23%2BPM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;PyCon Australia 2011 Test Drive&lt;/h3&gt;For the &lt;a href="http://pycon-au.org/2011/about/"&gt;2011 PyCon Australia&lt;/a&gt; I gave my new process a serious whirl. I found if I created the page before the talk and entered some basic data like author and title and tied it to the index then I could constantly check the quality of my output while taking my notes. It made my notes seem a bit more exciting and alive. I even tweeted about it cause I thought it was fun, and people around the world seemed to enjoy the effort I was putting into my notes. &lt;br /&gt;&lt;br /&gt;Because I was committing constantly in order to get updates on &lt;a href="http://readthedocs.org"&gt;readthedocs.org&lt;/a&gt; as soon as possible, I also adopted the habit of super-short pull request messages. That's because the content I'm writing overrides the need for verbose comments. So when you see me writing "moar" it's because every minute or so I'm doing something like:&lt;br /&gt;&lt;pre class="pretty-print bash"&gt;$ git commit -am "moar"&lt;br /&gt; $ git push&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Kiwi PyCon 2011&lt;/h3&gt;I did my rapid note taking again at Kiwi PyCon and it was fun. The downside was that sometimes I get rather critical in my notes and I had a couple speakers come up to me later to clarify their positions. This makes it a bit challenging because I want to put down my thoughts, but if my thoughts impact another person, what should I do? Especially since if my negative notes on someone turn up in a search it can negatively impact the speaker way beyond a single talk. This is now always on my mind when I take notes, and I'm trying to figure out a good way to handle this going forward.&lt;br /&gt;&lt;br /&gt;In essence, I don't want to constrain what I write but I also don't want to write something that will haunt someone else later. Even with a caveat and all that stuff, it can still be problematic. There is a difference between me ranting about something and me taking notes, and the written word is such that things are all too often taken out of context.&lt;br /&gt;&lt;br /&gt;Food for thought indeed.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;DjangoCon 2011 and the invention of the term 'live-noting'&lt;/h3&gt;At the start of &lt;a href="http://djangocon.us/"&gt;DjangoCon&lt;/a&gt; 2011 someone tweeted that they were planning to 'live-blog' the event. Suddenly I realized that what I was doing had a name for it, and that was 'live-noting'. So I tweeted that was what I was doing and it seemed to catch on.&lt;br /&gt;&lt;br /&gt;Not only that, but I got asked if I would accept pull requests. After a good two seconds of deep thought, I responded that I would only consider corrections and clarifications, not new material.  I received not just &lt;a href="https://github.com/pydanny/pydanny-event-notes/pull/1"&gt;one&lt;/a&gt;, but &lt;a href="https://github.com/pydanny/pydanny-event-notes/pull/2"&gt;two&lt;/a&gt; pull requests from good friends and left the conference pretty happy. &lt;br /&gt;&lt;br /&gt;On top of that, I managed to get featured on the front page of &lt;a href="http://readthedocs.org/"&gt;http://readthedocs.org&lt;/a&gt;! (Thanks Eric)&lt;br /&gt;&lt;br /&gt;&lt;a href="https://twitter.com/kennethlove"&gt;Kenneth Love&lt;/a&gt; also took notes in a similar fashion: &lt;a href="http://readthedocs.org/docs/djangocon-2011-notes/"&gt;readthedocs.org/docs/djangocon-2011-notes&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PyCodeConf 2011&lt;/h3&gt;I had the excellent fortune of being an invited speaker to Github's &lt;a href="http://py.codeconf.com/"&gt;PyCodeConf&lt;/a&gt;. While I gave my talk, my lovely fiancée, &lt;a href="http://twitter.com/audreyr"&gt;Audrey&lt;/a&gt; took notes of my talk and submitted a pull request. Her contribution was the first time I accepted content I did not write, and I'll say right now she's the only one for whom I will accept such content. On the other hand, If you take notes when I present let me know and I'll link to them from my own notes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://twitter.com/#!/joshbohde"&gt;Josh Bohde&lt;/a&gt; also took notes at the event in a similar fashion &lt;a href="http://readthedocs.org/projects/joshbohde-event-notes/"&gt;readthedocs.org/projects/joshbohde-event-notes&lt;/a&gt; and even as I write this post he shares the featuring of our notes on the frontispiece of &lt;a href="http://readthedocs.org/"&gt;readthedocs.org&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-MFII1ZIN1Y8/TtwTTKDzFvI/AAAAAAAAA_0/opbu44Ixvvc/s1600/Screen%2BShot%2B2011-12-04%2Bat%2B4.41.24%2BPM.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="186" width="320" src="http://2.bp.blogspot.com/-MFII1ZIN1Y8/TtwTTKDzFvI/AAAAAAAAA_0/opbu44Ixvvc/s320/Screen%2BShot%2B2011-12-04%2Bat%2B4.41.24%2BPM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Closing Thoughts&lt;/h3&gt;I often use my notes as reference, and if you follow the &lt;a href="https://github.com/pydanny/pydanny-event-notes/commits/master"&gt;commit logs&lt;/a&gt; you may even see me comment or clean up things I wrote down years ago.&lt;br /&gt;&lt;br /&gt;The graphs and stats of this effort is really interesting. &lt;a href="https://github.com/pydanny/pydanny-event-notes/graphs/languages"&gt;Fortran&lt;/a&gt;? And a total of &lt;br /&gt;&lt;a href="https://github.com/pydanny/pydanny-event-notes/contributors"&gt;Five contributors&lt;/a&gt;! &lt;br /&gt;&lt;br /&gt;All of this makes taking notes a lot more fun. I enjoy finding ways to enhance and improve my process, and find it exciting that others are following a similar pattern of effort. My hope is to make 2012 the Year of PyCon, where I find a way to go to a &lt;a href="http://python.org"&gt;Python&lt;/a&gt; related conference on six continents (Antartica is too cold for my tastes) and take notes everywhere.&lt;br /&gt;&lt;br /&gt;Going forward, should I document how I built this out? Would my steps and patterns be useful for others?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-4649590964919437140?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/4649590964919437140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=4649590964919437140' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4649590964919437140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4649590964919437140'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/12/story-of-live-noting.html' title='The Story of Live-Noting'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-4x7yIGXZLzE/TtwS1kBMkxI/AAAAAAAAA_o/DsJOE5zxABM/s72-c/Screen%2BShot%2B2011-12-04%2Bat%2B4.39.23%2BPM.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-4793612022022572445</id><published>2011-11-04T13:00:00.000-07:00</published><updated>2011-11-04T13:21:53.486-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Redux: Python Things I Don't Like</title><content type='html'>Back in May of 2009, I wrote about &lt;a href="http://pydanny.blogspot.com/2009/05/eight-things-i-dont-like-about-python.html"&gt;Eight Things I don't like about Python&lt;/a&gt;. It was my attempt to come up with things I don't like about my programming language of choice. Consider this my update of that post.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;1. Division sucks in Python&lt;/h3&gt;In &lt;a href="http://python.org"&gt;Python&lt;/a&gt; 3 this is fixed so that &lt;b&gt;2 / 3 = 0.6666666666666666&lt;/b&gt; but in Python 2.7.x you have &lt;b&gt;2 / 3 = 0&lt;/b&gt;. You can fix that in Python 2.7.x with doing a &lt;i&gt;from __future__ import division&lt;/i&gt; before your division call. Can anyone tell me if a version of 2.7.x will natively support &lt;b&gt;2 / 3 = 0.6666666666666666&lt;/b&gt; without that import?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; Chris Neugebauer pointed out that changing division in Python 2.7.x will break backwards compatibility. However that doesn't change that I don't like it in Python 2.7.x.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;strike&gt;2. TKinter blows&lt;/strike&gt;&lt;/h3&gt;Honestly, it doesn't really matter to me anymore. I either use command-line scripts or things delivered to the web. Also, thanks to Brett Cannon, I know if I need to make TKinter look good, I can use &lt;a href="http://docs.python.org/library/ttk.html"&gt;TK Themed Widgets&lt;/a&gt; right out of the standard library.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;3. Lambdas make it easy to obfuscate code&lt;/h3&gt;I'm known for &lt;a href="http://pydanny.blogspot.com/2007/07/lambdas-no-more.html"&gt;not liking lambdas in Python&lt;/a&gt;. These days, I do know of use cases for Lambdas, but those are far and few between. I might even try to turn that into a blog post this month - use cases for Lambdas in Python. Fortunately for me, these days I seem to work with people who mostly agree with me on this subject.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;4. Sorting objects by attributes is annoying&lt;/h3&gt;This is still annoying for me. As I said, "&lt;i&gt;... the snippet of code is trivial. Still, couldn't sorting objects by attributes or dictionaries by elements be made a bit easier? sort and sorted should have this built right in. I still have to look this up each and every time.&lt;/i&gt;"&lt;br /&gt;&lt;br /&gt;I've thought of proposing something easier as a PEP. Imagine that! Me submitting a PEP!&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;strike&gt;5. Regex should be a built-in function&lt;/strike&gt;&lt;/h3&gt;Before I got to do Python full-time I was a go-to person with regular expressions. Languages without them were weak in my opinion. Since then (2006-ish) my skills have faded somewhat in regards to regular expressions. And you know what? It hasn't been a problem. Python's string functions are fast and useful, and when I really need regular expressions, I import the library and do some research. I'm considering this one closed.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;6. Reload could be less annoying&lt;/h3&gt;Reload only works on modules. I want to be able to something like &lt;b&gt;reload(my_module)&lt;/b&gt;, &lt;b&gt;reload(my_class)&lt;/b&gt;, &lt;b&gt;reload(my_function)&lt;/b&gt;, or even &lt;b&gt;reload(my_variable)&lt;/b&gt;:&lt;br /&gt;&lt;pre class="prettyprint-py"&gt;&gt;&gt;&gt; from my_module import MyClass, my_function, my_variable&lt;br /&gt;&gt;&gt;&gt; mc = MyClass(my_variable)&lt;br /&gt;&gt;&gt;&gt; mc &lt;br /&gt;5&lt;br /&gt;# I go change something in my_module.MyClass and save the file&lt;br /&gt;&gt;&gt;&gt; reload(MyClass) # reload just MyClass&lt;br /&gt;&gt;&gt;&gt; mc = MyClass(my_variable)&lt;br /&gt;&gt;&gt;&gt; mc &lt;br /&gt;10&lt;br /&gt;&lt;/pre&gt;My current fix is to use unittest as my shell as much as possible. And that is probably a good thing.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;7. Help doesn't let me skip over the '__' methods&lt;/h3&gt;As I said way back when, "&lt;i&gt;Python's introspection and documentation features makes me happy. And yet when I have to scroll past __and__, __or__, and __barf__ each time I type help(myobject), I get just a tiny bit cranky. I want help to accept an optional boolean that defaults to True. If you set it to False you skip anything with double underscores.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="https://github.com/inky/see"&gt;See project&lt;/a&gt; is one solution to the issue. A different approach I've used is the &lt;a href="http://sphinx.pocoo.org/ext/autodoc.html"&gt;Sphinx autodoc&lt;/a&gt; feature, but Sphinx is a lot of work and doesn't cover every contigency.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;8. Not enough female Pythonistas&lt;/h3&gt;These days I know a lot of female Python developers. There is my own fiancee, &lt;a href="http://twitter.com/audreyr"&gt;Audrey Roy&lt;/a&gt;. Face-to-face I've met and talked to &lt;a href="http://twitter.com/webdevgirl"&gt;Christine Cheung&lt;/a&gt;, &lt;a href="http://twitter.com/jackiekazil"&gt;Jackie Kazil&lt;/a&gt;, &lt;a href="https://twitter.com/leahculver"&gt;Leah Culver&lt;/a&gt;, &lt;a href="https://twitter.com/kjam"&gt;Katharine Jarmul&lt;/a&gt;, &lt;a href="https://twitter.com/kcunning"&gt;Katie Cunningham&lt;/a&gt;, &lt;a href="https://twitter.com/bshaurette"&gt;Barbara Shaurette&lt;/a&gt;, &lt;a href="https://twitter.com/estherbester"&gt;Esther Nam&lt;/a&gt;, &lt;a href="http://www.twitter.com/sandymahalo"&gt;Sandy Strong&lt;/a&gt;, &lt;a href="http://www.twitter.com/backcode"&gt;Sophia Viklund&lt;/a&gt;, &lt;a href="http://www.twitter.com/tiny_mouse"&gt;Jessica Stanton&lt;/a&gt; &lt;a href="http://www.twitter.com/aurynn"&gt;Aurynn Shaw&lt;/a&gt;, &lt;a href="https://twitter.com/br3nda"&gt;Brenda Wallace&lt;/a&gt;, &lt;a href="https://twitter.com/jenofdoom"&gt;Jen Zajac&lt;/a&gt;, and many more I know I'm missing. And there are even more with whom I've had in-depth online conversations.&lt;br /&gt;&lt;br /&gt;So why didn't I put a strike-through on this one? Because the numbers still aren't good enough. I know a lot of female Pythonistas, but how many do you know? And even if you know a decent number, what percentage of a meetup group you attend are women?&lt;br /&gt;&lt;br /&gt;I can say that things are improving, but they could be better - for women or minorities. Find ways to pitch in, be it &lt;a href="http://pyladies.com/events/"&gt;PyLadies events&lt;/a&gt;, &lt;a href="http://pystar.org/"&gt;PyStar workshops&lt;/a&gt;, or what have you. &lt;br /&gt;&lt;br /&gt;One last note on this subject, I've heard some unsubstantiated statements that the .Net world has a higher female-to-male ration then the Open Source world. Are we going to take that kind of thing sitting down?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-4793612022022572445?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/4793612022022572445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=4793612022022572445' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4793612022022572445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4793612022022572445'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/11/redux-python-things-i-dont-like.html' title='Redux: Python Things I Don&apos;t Like'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-1263608775465897276</id><published>2011-11-02T13:40:00.000-07:00</published><updated>2011-11-02T13:53:47.039-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geek celebrities'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Loving the bunch class</title><content type='html'>&lt;blockquote&gt;&lt;h3&gt;Warning&lt;/h3&gt;This is me playing around with things in Python. It's not anything I use in real projects (except maybe the odd test). Please don't use these in anything important or you'll regret it.&lt;/blockquote&gt;Every play with a &lt;b&gt;bunch&lt;/b&gt; class? I love 'em and make them protected or unprotected. I started using them early in my &lt;a href="http://python.org"&gt;Python&lt;/a&gt; career, although it wasn't nearly about 2 years ago that I learned what they were called and the best way to code them. In any case, here is a simple, unprotected Bunch class.&lt;br /&gt;&lt;pre class="prettyprint-py"&gt;# Simple unprotected Python bunch class&lt;br /&gt;class Bunch(object):&lt;br /&gt;&lt;br /&gt;    def __init__(self, **kwargs):&lt;br /&gt;        self.__dict__.update(kwargs)&lt;br /&gt;&lt;br /&gt;bunch = Bunch(name='Loving the bunch class')&lt;br /&gt;print(bunch.name)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You can also make protected ones, that don't let pesky developers like me overwrite attributes, methods, and properties by accident:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint-py"&gt;# Simple protected Python bunch class&lt;br /&gt;class ProtectedBunch(object):&lt;br /&gt;    """ Use this when you don't want to overwrite existing methods and data """&lt;br /&gt;&lt;br /&gt;    def __init__(self, **kwargs):&lt;br /&gt;        for k, v in kwargs.items():&lt;br /&gt;            if k not in self.__dict__:&lt;br /&gt;                self.__dict__[k] = v&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You can also write them to raise errors when a &lt;b&gt;key&lt;/b&gt; is in &lt;b&gt;self.__dict__&lt;/b&gt;. Or perhaps merely publish a warning. There are many ways to customize, but generally you want to keep these things as simple as possible. Anyway, let's get back to the main topic...&lt;br /&gt;&lt;br /&gt;In the early days of my experiences with Python I found a small, nagging issue with &lt;b&gt;dictionaries&lt;/b&gt; and &lt;b&gt;objects&lt;/b&gt;. The notation wasn't as handy as what you got with JavaScript and some other languages I was using at the time. For example:&lt;br /&gt;&lt;pre class="prettyprint-js"&gt;// JavaScript object notation&lt;br /&gt;o = {};&lt;br /&gt;o.name = 'Loving the bunch class';&lt;br /&gt;o.name; // Calling with 'dot' notation&lt;br /&gt;o['name']; // Calling with 'bracket' notation  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Unfortunately, in Python you can't do this with a normal bunch class:&lt;br /&gt;&lt;pre class="prettyprint-py"&gt;# Python bunch class failing on bracket notation&lt;br /&gt;class Bunch(object):&lt;br /&gt;&lt;br /&gt;    def __init__(self, **kwargs):&lt;br /&gt;        self.__dict__.update(kwargs)&lt;br /&gt;&lt;br /&gt;bunch = Bunch(name='Loving the bunch class')&lt;br /&gt;print(bunch.name)&lt;br /&gt;print(bunch['name'])&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;  File "&lt;stdin&gt;", line 1, in &lt;module&gt;&lt;br /&gt;TypeError: 'Bunch' object is not subscriptable&lt;br /&gt;&lt;/module&gt;&lt;/stdin&gt;&lt;/pre&gt;&lt;br /&gt;The quick answer is found with a &lt;a href="http://code.activestate.com/recipes/52308/#c2"&gt;little trick I found&lt;/a&gt; in the comments of a recipie by &lt;a href="http://en.wikipedia.org/wiki/Alex_Martelli"&gt;Alex Martelli&lt;/a&gt; that gives you the ability to do:&lt;br /&gt;&lt;pre class="prettyprint-py"&gt;# Fancy dictionary/object trick&lt;br /&gt;class Buncher(dict):&lt;br /&gt;    """ Warning: DON'T USE THIS IN REAL PROJECTS """&lt;br /&gt;&lt;br /&gt;    def __init__(self,**kw):&lt;br /&gt;        dict.__init__(self,kw)&lt;br /&gt;        self.__dict__.update(kw)&lt;br /&gt;&lt;br /&gt;bunch = Bunch(name='Loving the bunch class')&lt;br /&gt;print(bunch.name)&lt;br /&gt;print(bunch['name'])&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I'm not the only one who likes Bunch classes. On PyPI I found a &lt;a href="http://pypi.python.org/pypi/bunch"&gt;really complete implementation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Of course, in a lot of cases you probably don't want this '&lt;i&gt;weight of code&lt;/i&gt;', right? Dictionaries being lighter than full objects and all that. Nevertheless, it's fun for noodling and playing around with code. Still, I'm thinking it might be a fun little project to take a group of bunch implementations and do performance checks on them versus each other and dictionaries. Maybe the 'performance hit' isn't so bad.&lt;br /&gt;&lt;br /&gt;I should also dig into things like &lt;a href="http://docs.python.org/library/collections.html#defaultdict-objects"&gt;defaultdict&lt;/a&gt; and other constructs to learn more. Part of the fun of any programming language is the depth of even the 'simplest' components of the language.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-1263608775465897276?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/1263608775465897276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=1263608775465897276' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/1263608775465897276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/1263608775465897276'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/11/loving-bunch-class.html' title='Loving the bunch class'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-4019493357866524520</id><published>2011-10-14T08:16:00.000-07:00</published><updated>2011-10-14T10:54:50.949-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geek celebrities'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='review'/><title type='text'>PyCodeConf 2011 Report</title><content type='html'>&lt;a href="http://audreyr.posterous.com/75336715"&gt;As my fiancee said&lt;/a&gt;, "&lt;a href="http://py.codeconf.com/"&gt;PyCodeConf&lt;/a&gt; is a new kind of &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; conference with a radically different format. Speakers are invited to speak about whatever they desire relating to the theme ("The Future of Python"), in front of a room of round tables. In between talks there are long breaks to encourage discussion. As a result, talks are edgier, and you really get to know people and possibly shape the future together."&lt;br /&gt;&lt;br /&gt;This summer (2011) I was invited by &lt;a href="http://chriswanstrath.com/"&gt;Chris Wanstrath&lt;/a&gt; to be an invited speaker at the first ever PyCodeConf, to be held in &lt;a href="http://en.wikipedia.org/wiki/Miami"&gt;Miami&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Florida"&gt;Florida&lt;/a&gt;. I've been using &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; and &lt;a href="https://github.com/"&gt;Github&lt;/a&gt; since early 2009, and more importantly, I've known Chris since &lt;a href="http://djangocon.us/"&gt;DjangoCon&lt;/a&gt; 2009. I've always appreciated his interest in not just providing tools for the community, but also his efforts across languages and platforms to improve the lives of developers and those who support developers. And that he and his partners seem to make a pretty penny at it and share what they make (drink-ups and now conferences) is only a good thing in my opinion. &lt;br /&gt;&lt;br /&gt;So I accepted Chris' invitation. :-)&lt;br /&gt;&lt;br /&gt;The theme for the conference was the future of Python, and I submitted a talk proposal about Collaboration. Chris helped me figure my talk topic, which was awfully nice of him. Shortly afterwards my fiancee, &lt;a href="http://twitter.com/audreyr"&gt;Audrey Roy&lt;/a&gt;, received her own invitation to speak.&lt;br /&gt;&lt;br /&gt;Between the time that Chris invited me to speak and the start of conference, &lt;a href="http://voodootikigod.com/"&gt;Chris Williams&lt;/a&gt; of &lt;a href="http://promotejs.com/"&gt;JS Conf&lt;/a&gt; got involved.&lt;br /&gt;&lt;br /&gt;Alright, let's review things...&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Accommodations&lt;/h3&gt;&lt;br /&gt;Everyone stayed in the &lt;a href="http://www.epichotel.com/"&gt;Epic Hotel&lt;/a&gt;, in downtown Miami. The rooms fit the name of the hotel, being Epic in size and having amazing stuff in them. The rooms had free/good internet if you signed up for a hotel mailing list. Since we rehearsed and polished talks the night before the conference we ordered room service and were pleased with what we ate. The hotel had a heated outdoor pool on the 14th floor, which I'll get into later. In any case, the only time I've been in a comparable hotel was the incredible arrangements provided by the &lt;a href="http://nz.pycon.org/2011"&gt;PyCon New Zealand&lt;/a&gt; folks who put us up in the &lt;a href="http://www.museumhotel.co.nz/"&gt;Museum Hotel&lt;/a&gt; for a few days.&lt;br /&gt;&lt;br /&gt;Sure, $189/night is high, but 3 nights when you split it with 2 or more people makes it not so bad. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Result: Superb&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conference Meals&lt;/h3&gt;&lt;br /&gt;If you are serving me food, you can't go wrong with salmon, steak, good cheese, fresh vegetables, coffee, and juice.  I can report that PyCodeConf did quite well in this regard.&lt;br /&gt;&lt;br /&gt;Outside of the conference I really enjoyed the food. Andiamo was a crazy good pizza place. I also got some really nice &lt;a href="http://en.wikipedia.org/wiki/Grouper"&gt;grouper&lt;/a&gt; which you can only seem to get in Florida.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Result: Superb&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The Conference Room&lt;/h3&gt;&lt;br /&gt;The conference took place on the 14th floor of the Epic Hotel. This was a single track conference, with all the talks were given in the same room. The room was large, but everyone had a comfortable seat at large round tables. That was a nice touch, because it encouraged you to socialize with everyone nearby. &lt;br /&gt;&lt;br /&gt;That worked out for the most part, except for a couple of developers sitting at a table who had backs turned to the speakers and were talking loudly while pair programming or something. I asked them to quiet down but 30 seconds later they were back at it. We moved away, but in retrospect considering their rudeness, I should have politely asked them to take it outside.&lt;br /&gt;&lt;br /&gt;Anyway, the acoustics were good, the temperature comfortable, and the seats comfortable. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Result: Superb&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Speakers&lt;/h3&gt;&lt;br /&gt;Speaker selection was done magnificently well. There wasn't a dud within the lot of speakers. I normally expect that in any conference you'll get at least one dud talk per day, and pycodeconf didn't have that problem (unless my talk sucked).&lt;br /&gt;&lt;br /&gt;Jesse Noller opened things up with a great encouraging talk, Raymond Hettinger gave a talk on Python basics that was so full of nuance that I'm terrified of attending an advanced talk by him, Alex Gaynor filled us with hope for PyPy, Tracy Osborn taught us how to bootstrap entrepreneur projects, Travis Oliphant wants Python core and PyPy to collaborate more with the Scientific Community, Audrey Roy gave up some of her community building secrets, David Beazly explained the issues of the GIL in terms mere mortals such as myself can understand, Gary Bernhardt gave an amazing talk comparing Python and Ruby, and Leah Culver made Django + backbone.js look easy, but if you talk to her you know whatever she does is sophisticated and not for beginners. Dustin Sallings sold me on a neat idea for testing to help catch edge cases and Armin Ronacher opened my eyes on WSGI.&lt;br /&gt;&lt;br /&gt;The wonderful thing about these talks is that since everyone knew the upcoming tracks, or had seen the previous ones, we could relate to each other. So David Beazly, Travis Oliphant, and Avery Pennarun raised interesting concerns about PyPy that everyone got the chance to hear about. They weren't show-stopping issues, just raising awareness about things that Alex didn't cover in his talk.&lt;br /&gt;&lt;br /&gt;I live-noted the event as much as I could, with notable gaps in Leah's talk (she talks fast and is very technical and wanted to give her my full attention) as well as Armin (his talk shocked me a bit - I'm still a WSGI newbie). You can see my efforts at &lt;a href="http://pydanny-event-notes.readthedocs.org/en/latest/PyCodeConf2011/index.html"&gt;my PyCodeConf live-notes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Speaking of live-noting, &lt;a href="http://joshbohde-event-notes.readthedocs.org/en/latest/pycodeconf/index.html"&gt;Josh Bohde also live-noted the event&lt;/a&gt;&amp;nbsp;and captured a ton of stuff I missed.&lt;br /&gt;&lt;br /&gt;The gaps between talks were also a nice 15 minutes. That meant you could stretch your legs, get a drink, and talk to people. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Result: Superb&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Parties&lt;/h3&gt;&lt;br /&gt;We (me and Audrey) missed the first party (hosted by &lt;a href="http://newrelic.com/"&gt;New Relic&lt;/a&gt; at a place called DRB) on account of preparing for our talks. We always do our absolute best on talks, and both like to practice a lot. Also, Mark Pilgrim's disappearance had touched me and I wanted to talk about it. We heard it was a great party, so we'll assume that it was. :)&lt;br /&gt;&lt;br /&gt;The next evening the party (hosted by &lt;a href="http://www.heroku.com/"&gt;Heroku&lt;/a&gt;) was on the 14th floor, which meant it was a &lt;a href="http://www.flickr.com/photos/sundaykofax/6241284072/"&gt;pool party&lt;/a&gt;! There was great food, good drink, and a latin jazz band playing. One of the pools was heated, so most &lt;a href="http://www.flickr.com/photos/sundaykofax/6241289932/in/set-72157627885835624"&gt;people&lt;/a&gt; stayed in there, and drank many watermelon mojitos served by the staff. The pool was a huge hit because it was comfortable and people just talked freely. No laptops, no phones, just talking. Chris Williams served us drinks himself, Chris Wanstrath got wet, and everyone just relaxed. I have to say, a heated pool party is something EVERY conference should give. MOAR POOL PARTEEZ PLEEZE!&lt;br /&gt;&lt;br /&gt;The final night's party was at the News Lounge and was hosted by Github and &lt;a href="http://droptype.com/"&gt;Droptype&lt;/a&gt;. The drinks and people were awesome, and I have good memories of being in a circle listening to Chris Williams and Audrey Roy talk. I did go beyond tipsy, overdid the &lt;a href="http://en.wikipedia.org/wiki/Capoeira"&gt;Capoeira&lt;/a&gt;, and tried to convince Chris Wanstrath to give up the whole DVCS hosting thing to do wedding planning. There was also a bunch of us getting kicked out of a Karaoke bar because of the antics of a Python core developer. Ha ha ha. It was a crazy night that took me two days to recover from.&lt;br /&gt;&lt;br /&gt;I'm glossing some important discussions that happened while I was still sober at these two parties, and maybe in the future if things play out right I'll go over them.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Result: Superb&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;People&lt;/h3&gt;&lt;br /&gt;Part of attending conferences is to meet old friends and make new ones. I got to spend time with Mark Ramm, Jesse Noller, Nick Coghlan, Alex Gaynor, Ben Firshman, Armin Ronacher, Raymond Hettinger, Rachel Hettinger, Chris Wanstrath, and many other excellent people. I also got the chance to meet and befriend Kenneth Reitz, Chris Williams, David Cramer, Wayne Witzel, and Leah Culver. I'm missing at least a dozen more. It was great to put faces to people, and in some cases, hear their side of a story.&lt;br /&gt;&lt;br /&gt;Also, I got to gush at programming heroes like David Beazly and Travis Oliphant like a total fanboy. &lt;br /&gt;&lt;br /&gt;Believe it or not, I got a bit shy. I'm kicking myself over not introducing myself to more people.  Next time!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Result: Superb&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Summary&lt;/h3&gt;&lt;br /&gt;The conference was amazing. Like all conferences it had its own character and fun. Because it was a purely commercial conference I was a bit worried going into it, since I've heard about the corporate feel of these things. Those fears were completely mitigated by the open attitude and decentness of the conference organizers and sponsors. I look forward to attending PyCodeConf again in the future.&lt;br /&gt;&lt;br /&gt;If you've got good senior technical staff and you want them to benefit from a conference, this is a good place to send them.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Overall Result: Superb&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-4019493357866524520?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4019493357866524520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4019493357866524520'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/10/pycodeconf-2011-report.html' title='PyCodeConf 2011 Report'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-6004832004714521976</id><published>2011-10-09T09:00:00.000-07:00</published><updated>2011-10-08T23:23:08.751-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='pyramid'/><category scheme='http://www.blogger.com/atom/ns#' term='NewZealand'/><category scheme='http://www.blogger.com/atom/ns#' term='australia'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Conference Talks I want to see</title><content type='html'>I'm writing this the day after &lt;a href="https://github.com/"&gt;Github&lt;/a&gt;'s &lt;a href="http://py.codeconf.com/"&gt;pycodeconf&lt;/a&gt; ended. That was an amazing conference, and I'll be blogging it soon (I'll also be writing about &lt;a href="http://pycon-au.org/"&gt;PyCon Australia&lt;/a&gt;, &lt;a href="http://nz.pycon.org/2011"&gt;PyCon New Zealand&lt;/a&gt;, and &lt;a href="http://djangocon.us/"&gt;DjangoCon US&lt;/a&gt;). With all this conference experience very current in my head, things I've seen and done at them, and the&amp;nbsp;deadline for &lt;a href="http://us.pycon.org/2012/"&gt;PyCon US&lt;/a&gt; submissions coming up, here are some talks I really want to see happen in the next six months. If not at PyCon US, then please consider these for other forthcoming events!&lt;br /&gt;&lt;br /&gt;Note: Couldn't do my preferred 'linkify' as well as I liked thanks to bad hotel internet. I'll clean it up later.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Advanced SQL Alchemy Usage&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I think the uber-powerful &lt;a href="http://sqlalchemy.org/"&gt;SQL Alchemy&lt;/a&gt; ORM needs the same sort of treatment me and &lt;a href="http://tothinkornottothink.com/"&gt;Miguel Araujo&lt;/a&gt; gave on &lt;a href="http://www.slideshare.net/pydanny/advanced-django-forms-usage"&gt;Advanced Django&lt;/a&gt; &lt;a href="http://speakerdeck.com/u/pydanny/p/advanced-django-forms-usage"&gt;Forms Usage&lt;/a&gt;. Not a 30 tutorial or overview or '&lt;i&gt;State of&lt;/i&gt;', but tricks and patterns by someone who has used it frequently on more than one project. Multiple projects is important because the speaker should have had the chance to try multiple approaches. Start with something simple like a TimeStampModel all model classes might inherit from, then go into deeper and and more complex technical detail. Finish the talk with something crazy hard from SQL Alchemy that is hard to explain. If that causes you to open a  bug/documentation ticket, then you'll know that you've done the talk right. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Advanced Django Models Usage&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Following the same pattern as my SQL Alchemy idea above, start with something simple like a TimeStampModel (including South  migration of fields), then go into complex looks with Q objects, good patterns for &lt;a href="https://docs.djangoproject.com/en/1.3/topics/db/managers/"&gt;Managers&lt;/a&gt;, &lt;a href="https://docs.djangoproject.com/en/1.3/topics/db/aggregation/"&gt;Aggregation&lt;/a&gt;, &lt;a href="https://docs.djangoproject.com/en/1.3/topics/db/transactions/"&gt;Transactions&lt;/a&gt;, and then finish it with the craziest, hardest thing you can find. When putting together the closing material causes you to open tickets for broken core code/documentation, then you know you've done it right. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Python Code Obfuscation Contest&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This &lt;i&gt;&lt;b&gt;certain-to-be-controversial talk idea&lt;/b&gt;&lt;/i&gt; would be where the speaker would solicit Pythonistas to submit a single  arcane &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; code module that would have to display the text of "&lt;i&gt;Although that way may not be obvious at first unless you're Dutch.&lt;/i&gt;" There would be a '&lt;i&gt;Expert&lt;/i&gt;' category which would forbid the eval/exec functions. The "&lt;i&gt;Anything Goes Category&lt;/i&gt;" would allow use of &lt;b&gt;eval&lt;/b&gt;/&lt;b&gt;exec&lt;/b&gt;. The conference talk would be where the speaker announces the winners and comments on the brilliant insanity of submissions.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Django + Flask + Pyramid: A demonstration of useful things you can do with WSGI&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;At pycodeconf &lt;a href="http://lucumr.pocoo.org/"&gt;Armin Ronacher&lt;/a&gt; showed how with &lt;a href="http://www.wsgi.org/"&gt;WSGI&lt;/a&gt;, he can run &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt;, &lt;a href="http://flask.pocoo.org/"&gt;Flask&lt;/a&gt;, &lt;a href="http://pylonsproject.com/"&gt;Pyramid&lt;/a&gt; all from same server from the same domain. This surprised a lot of people, including me, and I want to see more of what Armin was talking about. I don't want any theory. I don't want anything obscure. I just want meaty bits I can implement the day after I hear the talk.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Zen of Python&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Richard Jones &lt;a href="http://pydanny-event-notes.readthedocs.org/en/latest/PyconAU2011/zen_of_python.html"&gt;gave his version of the talk at PyCon AU&lt;/a&gt;, and I want to hear other opinions about it. I'm happy to hear an expert give his view, and I would also be delighted to hear how a beginner (or relative beginner) feels about it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Websites and OO Design Concepts: A Tutorial&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;For beginners, I would love to see a talk on a list of OO theories, and as each list item was discussed, examples designed in the context of a web site, how to do things right, plus identified anti-patterns would be presented. The web angle would be a good way to get the incoming Python web crowd to attend and identify with raised issues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-6004832004714521976?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6004832004714521976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6004832004714521976'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/10/conference-talks-i-want-to-see.html' title='Conference Talks I want to see'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-4556098135235395321</id><published>2011-09-23T09:49:00.000-07:00</published><updated>2011-09-23T09:49:22.129-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='django-profiles'/><title type='text'>Profiles: Breaking Normalization</title><content type='html'>In the summer of 2010 I either saw this pattern or cooked it up myself. It is specific to the &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; &lt;a href="https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users"&gt;profiles&lt;/a&gt; system and helps me get around some of the limitations/features of &lt;a href="https://docs.djangoproject.com/en/1.3/topics/auth/"&gt;django.contrib.auth&lt;/a&gt;. I like to do it on my own projects because it makes so many things (like performance) so much simpler. The idea is to replicate some of the fields and methods on the&lt;a href="https://docs.djangoproject.com/en/1.3/topics/auth/#users"&gt;     django.contrib.auth.model.User    &lt;/a&gt; model in your user profile(s) objects. I tend to do this usually on the     &lt;a href="https://docs.djangoproject.com/en/1.3/topics/auth/#django.contrib.auth.models.User.email"&gt;email&lt;/a&gt;    ,     &lt;a href="https://docs.djangoproject.com/en/1.3/topics/auth/#django.contrib.auth.models.User.first_name"&gt;first_name&lt;/a&gt;    ,     &lt;a href="https://docs.djangoproject.com/en/1.3/topics/auth/#django.contrib.auth.models.User.last_name"&gt;last_name&lt;/a&gt;     fields and the     &lt;a href="https://docs.djangoproject.com/en/1.3/topics/auth/#django.contrib.auth.models.User.get_full_name"&gt;get_full_name&lt;/a&gt;     method. Sometimes I also do it on the &lt;a href="https://docs.djangoproject.com/en/1.3/topics/auth/#django.contrib.auth.models.User.username"&gt;username&lt;/a&gt; field, but then I also ensure that the username duplication is un-editable in any context.&lt;br /&gt;&lt;br /&gt;Sure, this breaks &lt;a href="http://pydanny.blogspot.com/2011/07/normalization-noitazilamron.html"&gt;normalization&lt;/a&gt;, but the scale of this break is tiny. Duplicating four fields each with a max of 30 characters for a total of 120 characters per record is nothing in terms of data when you compare to avoiding the mess of doing lots of &lt;b&gt;profile-to-user&lt;/b&gt; joins on very large data sets.&lt;br /&gt;&lt;br /&gt;One more thing, I've found that most users don't care about or for the division between their accounts and profiles. They are more than happy with a single form, and if they aren't, well you can still use this profile model to build both account and profile forms.&lt;br /&gt;&lt;br /&gt;Alright, enough talking, let me show you how my Profile models tend to look:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-py"&gt;from django.contrib.auth.models import User&lt;br /&gt;from django.db import models&lt;br /&gt;from django.utils.translation import ugettext_lazy as _&lt;br /&gt;&lt;br /&gt;class Profile(models.Model):&lt;br /&gt;    """ Normalization breaking profile model authored by Daniel Greenfeld """&lt;br /&gt;    &lt;br /&gt;    user = models.OneToOneField(User)&lt;br /&gt;    email = models.EmailField(_("Email"), help_text=_("Never given out!"), max_length=30)&lt;br /&gt;    first_name = models.CharField(_("First Name"), max_length=30)&lt;br /&gt;    last_name = models.CharField(_("Last Name"), max_length=30)&lt;br /&gt;&lt;br /&gt;    # username field notes:&lt;br /&gt;    #     used to improve speed, not editable! &lt;br /&gt;    #     Never changed after original auth.User and profiles.Profile creation!&lt;br /&gt;    username = models.CharField(_("User Name"), editable=False) &lt;br /&gt;&lt;br /&gt;    def save(self, **kwargs):&lt;br /&gt;        """ Override save to always populate changes to auth.user model """&lt;br /&gt;        user_obj = User.objects.get(username=self.user.username)        &lt;br /&gt;        user_obj.first_name = self.first_name&lt;br /&gt;        user_obj.last_name = self.last_name&lt;br /&gt;        user_obj.email = self.email&lt;br /&gt;        user_obj.is_active = self.is_active        &lt;br /&gt;        user_obj.save()&lt;br /&gt;        super(Profile,self).save(**kwargs)&lt;br /&gt;&lt;br /&gt;    def get_full_name(self):&lt;br /&gt;        """ Convenience duplication of the auth.User method """&lt;br /&gt;        return "{0} {1}".format(self.first_name, self.last_name)&lt;br /&gt;&lt;br /&gt;    @models.permalink&lt;br /&gt;    def get_absolute_url(self):&lt;br /&gt;        return ("profile_detail", (), {"username": self.username})&lt;br /&gt;&lt;br /&gt;    def __unicode__(self):&lt;br /&gt;        return self.username&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;All of this is good, but you have to be careful with emails. Django doesn't let you duplicate existing emails in the &lt;b&gt;django.contrib.auth.model.User&lt;/b&gt; model so we want to catch that early and display an elegant error message. Hence this Profile form:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-py"&gt;from django import forms&lt;br /&gt;from django.contrib.auth.models import User&lt;br /&gt;from django.utils.translation import ugettext_lazy as _&lt;br /&gt;&lt;br /&gt;from profiles.models import Profile&lt;br /&gt;&lt;br /&gt;class ProfileForm(forms.ModelForm):&lt;br /&gt;    """ Email validation form authored by Daniel Greenfeld """&lt;br /&gt;        &lt;br /&gt;    def clean_email(self):&lt;br /&gt;        """ Custom email clean method to make sure the user doesn't use the same email as someone else"""&lt;br /&gt;        email = self.cleaned_data.get("email", "").strip()&lt;br /&gt;&lt;br /&gt;        if User.objects.filter(email=email).exclude(username=self.instance.user.username):&lt;br /&gt;            self._errors["email"] = self.error_class(["%s is already in use in the system" % email])&lt;br /&gt;            return ""            &lt;br /&gt;&lt;br /&gt;        return email&lt;br /&gt;&lt;br /&gt;    class Meta:&lt;br /&gt;        &lt;br /&gt;        fields = (&lt;br /&gt;                    'first_name',&lt;br /&gt;                    'last_name',&lt;br /&gt;                    'email',&lt;br /&gt;                    )&lt;br /&gt;        model = Profile&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/4477131926658044957-4556098135235395321?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/4556098135235395321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=4556098135235395321' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4556098135235395321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4556098135235395321'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/09/profiles-breaking-normalization.html' title='Profiles: Breaking Normalization'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-2426821555341109237</id><published>2011-09-14T09:39:00.000-07:00</published><updated>2011-09-14T09:39:00.260-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac os'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualenv'/><category scheme='http://www.blogger.com/atom/ns#' term='buildout'/><category scheme='http://www.blogger.com/atom/ns#' term='pip'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>History of my most used shell commands</title><content type='html'>&lt;a href="http://pydanny.blogspot.com/2008/04/history-of-my-most-used-shell-commands.html"&gt;I ran this a few years back&lt;/a&gt;&amp;nbsp;and I'm running it again today.&lt;br /&gt;&lt;br /&gt;What is interesting is that compared to the older history, &lt;a href="http://git-scm.org/"&gt;git&lt;/a&gt; has replaced svn, &lt;a href="http://pypi.python.org/pypi/pip"&gt;pip&lt;/a&gt; has replaced easy_install, and &lt;a href="http://pypi.python.org/pypi/virtualenv"&gt;virtualenv&lt;/a&gt; has now completely subsumed buildout. Oh, how the mighty have fallen!&lt;br /&gt;&lt;pre class="prettyprint"&gt;$ history | awk '{a[$2]++ } END{for(i in a){print a[i] " " i}}'|sort -rn |head -n 20&lt;br /&gt;&lt;br /&gt;209 git&lt;br /&gt;123 python&lt;br /&gt;34 ls&lt;br /&gt;31 mate&lt;br /&gt;18 cd&lt;br /&gt;14 pwd&lt;br /&gt;9 hg&lt;br /&gt;8 touch&lt;br /&gt;7 rm&lt;br /&gt;6 cp&lt;br /&gt;5 pip&lt;br /&gt;5 mv&lt;br /&gt;5 django-admin.py&lt;br /&gt;4 mkvirtualenv&lt;br /&gt;3 mysql&lt;br /&gt;3 mkdir&lt;br /&gt;3 bash&lt;br /&gt;2 deactivate&lt;br /&gt;2 add2virtualenv&lt;br /&gt;1 workon&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-2426821555341109237?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/2426821555341109237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=2426821555341109237' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2426821555341109237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2426821555341109237'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/09/history-of-my-most-used-shell-commands.html' title='History of my most used shell commands'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-5915127996336366365</id><published>2011-09-13T20:11:00.000-07:00</published><updated>2011-09-13T20:11:09.165-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NewZealand'/><category scheme='http://www.blogger.com/atom/ns#' term='pyladies'/><category scheme='http://www.blogger.com/atom/ns#' term='djangocon'/><category scheme='http://www.blogger.com/atom/ns#' term='courses'/><category scheme='http://www.blogger.com/atom/ns#' term='australia'/><category scheme='http://www.blogger.com/atom/ns#' term='django packages'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='training'/><category scheme='http://www.blogger.com/atom/ns#' term='classes'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Quick conferences report: Presentations</title><content type='html'>My lovely Fiancée, &lt;a href="http://audreyr.posterous.com/"&gt;Audrey Roy&lt;/a&gt;, was invited to be the opening keynote speaker at both &lt;a href="http://pycon-au.org/2011"&gt;PyCon Australia&lt;/a&gt;&amp;nbsp;on &lt;a href="http://www.slideshare.net/audreyr/pycon-australia-2011-keynote-audrey-roy"&gt;Diversity in Python&lt;/a&gt;&amp;nbsp;(&lt;a href="http://www.youtube.com/watch?v=76YfICi8LcA"&gt;video&lt;/a&gt;) and &lt;a href="http://nz.pycon.org/2011/about/"&gt;PyCon New Zealand&lt;/a&gt;&amp;nbsp;on &lt;a href="http://www.slideshare.net/audreyr/kiwi-pycon-2011-audrey-roy-keynote-speech"&gt;Python on the Web&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As for me, I managed to get talks into both of those conferences AND DjangoCon US. I co-presented on three of them, and I share all credit for success with my cohorts.&amp;nbsp;The talks I gave at the conferences were (I'll post videos when they get up):&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.slideshare.net/pydanny/confessions-of-a-joe-developer"&gt;Confessions of Joe Developer&lt;/a&gt; (PyCon Australia, DjangoCon US)&lt;/b&gt;&lt;br /&gt;The genesis of this talk was as a lightning talk at I gave at the &lt;a href="http://pydanny.blogspot.com/2011/06/hollywood-hackathon-on-june-18th.html"&gt;Hollywood&lt;/a&gt; &lt;a href="http://pydanny.blogspot.com/2011/06/hollywood-hackathon-report.html"&gt;Hackathon&lt;/a&gt;. It is a talk about admitting that us mere mortals need to ask questions, &lt;a href="http://pydanny-event-notes.rtfd.org/"&gt;take notes&lt;/a&gt;, and follow good practices in general. I gave it again at &lt;a href="http://www.meetup.com/ladjango/"&gt;LA Django&lt;/a&gt; this summer, extending it to a full length talk complete with lots of technical content. At PyCon Australia I toned down the technical content because I was nervous, and while the response was positive, it &amp;nbsp;could have been much better. So for DjangoCon I ramped up the tech-talk and it worked much better. I've now given the talk 4 times, and I'm leaning towards retiring it.&lt;br /&gt;&lt;div id="__ss_8349366" style="width: 425px;"&gt; &lt;iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/8349366" width="425"&gt;&lt;/iframe&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.slideshare.net/pydanny/python-worst-practices"&gt;Python Worst Practices&lt;/a&gt; (PyCon New Zealand)&lt;/b&gt;&lt;br /&gt;This talk grew out of a &lt;a href="http://socal-piggies.org/scp"&gt;SoCal Piggies&lt;/a&gt; lightning talk which I gave for the purpose of humor. Often we as &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; developers are smug in the clarity of the language that we don't realize just how easily we can obfuscate code. In fact, I contend that Python is fully capable of a &lt;a href="http://en.wikipedia.org/wiki/Code_Obfuscation#Recreational_obfuscation"&gt;code obfuscation contest&lt;/a&gt;. This talk rejects a lot of crazy practices I've either done myself or had to debug from other people's work. For New Zealand I added a ton of content and tested things pretty diligently. The variable naming pages stumped some people I really respect and I was quite happy with that result.&lt;br /&gt;&lt;div id="__ss_7771404" style="width: 425px;"&gt; &lt;iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/7771404" width="425"&gt;&lt;/iframe&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.slideshare.net/audreyr/django-package-thunderdome-by-audrey-roy-daniel-greenfeld"&gt;Django Packages Thunderdome&lt;/a&gt; (co-presented with Audrey Roy, DjangoCon US)&lt;/b&gt;&lt;br /&gt;Audrey did most of the work for this presentation. In this talk I helped review a horde of &lt;a href="http://djangopackages.com/"&gt;Django Packages&lt;/a&gt; across 7 different categories. It was nerve wracking because every part of our talk would get judged - but Audrey kept things really positive and made it clear we were providing constructive criticism. I think she got her message across to most people, and more importantly, it got a lot of people thinking about what ought to be normal community standards. I'll probably blog on those community thoughts and statements later, but I think Audrey (with help from me) accomplished what she aimed to do.&lt;br /&gt;&lt;div id="__ss_9168634" style="width: 425px;"&gt; &lt;iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/9168634" width="425"&gt;&lt;/iframe&gt; &lt;br /&gt;&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/audreyr" target="_blank"&gt;Audrey Roy&lt;/a&gt; &lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.slideshare.net/pydanny/advanced-django-forms-usage"&gt;Advanced Django Form Usage&lt;/a&gt; (co-presented with &lt;a href="http://twitter.com/maraujop"&gt;Miguel&lt;/a&gt; &lt;a href="http://tothinkornottothink.com/"&gt;Araujo&lt;/a&gt;)&lt;/b&gt;&lt;br /&gt;Some time ago Miguel befriended me and helped resurrect the &lt;a href="http://django-uni-form.rtfd.org/"&gt;django-uni-form&lt;/a&gt; project. He graciously agreed to help me present on &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; Forms and we decided to make the talk as sophisticated as possible. Previous Django form talks have been good, but focused on the fundamentals and we wanted to do something really different. This talk was hard because Miguel and I were on opposite sides of the planet, so we did a lot of &lt;a href="https://github.com/"&gt;github&lt;/a&gt; pull/pushes. In both doing research and presenting Miguel did an unbelievably good job and I hope he does more of this in the future. The response was extremely positive and I'm certain that our plan of getting our notes/work/transcript into Django core is well on it's way.&lt;br /&gt;&lt;div id="__ss_9181902" style="width: 425px;"&gt; &lt;iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/9181902" width="425"&gt;&lt;/iframe&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://pydanny.blogspot.com/2011/07/ultimate-django-tutorial-workshop.html"&gt;Ultimate Django Tutorial Workshop&lt;/a&gt; (DjangoCon US)&lt;/b&gt;&lt;br /&gt;I got about 10 professional Django experts in a room, including Django core developers, and had them help me coach nearly 20 people through a modified version of the Django tutorial. Students seemed to learn tons, lots of socializing happened thanks to some happy accidents, and the experts got a chance to really see where the Django tutorial needs work. &lt;a href="http://pyladies.com/"&gt;PyLadies&lt;/a&gt; organizer &lt;a href="http://esthernam.com/"&gt;Esther Nam&lt;/a&gt; spent her sprint days working on something that ties the slides into the Django Tutorial - and for now I'm holding off on sharing my work until she says her work is done.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;These were amazing opportunities to speak and will hopefully make a difference. I wouldn't have traded all of this for the world. It was a lot of work, and I doubt I'll ever go quite at this pace again. My plan is to do fewer talks and make them much better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-5915127996336366365?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/5915127996336366365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=5915127996336366365' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5915127996336366365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5915127996336366365'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/09/quick-conferences-report-presentations.html' title='Quick conferences report: Presentations'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-8393947247935115419</id><published>2011-09-04T15:19:00.000-07:00</published><updated>2011-09-04T15:20:10.494-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Responses to Github is my resume</title><content type='html'>Shortly after I posted &lt;a href="http://pydanny.blogspot.com/2011/08/github-is-my-resume.html"&gt;Github is my resume&lt;/a&gt;&amp;nbsp;the responses started coming in. They seemed to fill these categories:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;"Github is a portfolio, not a resume!"&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I think this is rather valid, being a much more accurate description of the role that &lt;a href="https://github.com/"&gt;Github&lt;/a&gt; and other &lt;a href="http://bitbucket.org/"&gt;social&lt;/a&gt; &lt;a href="http://sourceforge.net/"&gt;coding&lt;/a&gt; &lt;a href="http://launchpad.net/"&gt;sites&lt;/a&gt; are having in getting developer jobs these days. &amp;nbsp;Two of the more choice responses in this category were posts by &lt;a href="https://plus.google.com/u/0/113612142759476883204/posts/esANZdjrgkn"&gt;Gini Trapini&lt;/a&gt;&amp;nbsp;and &lt;a href="http://petdance.com/2011/08/your-github-account-is-not-your-portfolio-but-its-a-start/"&gt;Andy Lester&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;"In X years of hiring, I've never requested source code along with the resume!"&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This comment raised the issue that personality, location, writing skills, etc were important. I agree that being able to not annoy your team into losing productivity is important, but it doesn't negate the frequent desire to be able to review the work of potential hires. Ignore the code at your own risk.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;"Using only binary for calculations, how many ping pong balls fit in your car?"&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A couple people said they prefer to ask programming questions or challenging problems in interviews to seeing portfolios of code. Personally, I think a few programming questions are okay but in my opinion '&lt;i&gt;challenging problems&lt;/i&gt;' all too often means sticking your interviewees with puzzles and trick questions that all too often have nothing to do with the day-to-day work of being a developer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-8393947247935115419?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/8393947247935115419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=8393947247935115419' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8393947247935115419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8393947247935115419'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/09/responses-to-github-is-my-resume.html' title='Responses to Github is my resume'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-8948706936373853768</id><published>2011-08-23T06:04:00.000-07:00</published><updated>2011-08-23T06:42:27.240-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='australia'/><category scheme='http://www.blogger.com/atom/ns#' term='training'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>Github is my resume</title><content type='html'>I remember the first time I heard that statement - a couple years back &lt;a href="http://eflorenzano.com/"&gt;Eric Florenzano&lt;/a&gt; said it to me on Twitter when I posted my resume publicly and asked for opinions. At the time I laughed at his statement, because it felt like naive arrogance to ditch the idea of a resume and 'traditional' social networking like Facebook and LinkedIn. How wrong I was...&lt;br /&gt;&lt;br /&gt;Before I go any further, this isn't to say that education, job history, and references aren't important in getting jobs that utilize a lot of &lt;a href="http://python.org/"&gt;Python&lt;/a&gt;. They are important, but I think they go more towards shaping you as a person than getting a job. So if you want access to Python jobs (and possibly other open source languages), you need to be able to show working code. Why is this the case? I can thing of several reasons:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;It is much harder to forge your style of code, comments, tests, and docs in a repo than it is to make false claims on a resume.&lt;/li&gt;&lt;li&gt;Development team managers don't take LinkedIn references seriously because how often we see them &lt;i&gt;gamed&lt;/i&gt;.&lt;/li&gt;&lt;li&gt;Code gives us a body of work employers (including me) can use in order to help evaluate your skill and ability levels.&lt;/li&gt;&lt;/ol&gt;Let's summarize that into a bold statement:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Python employers want to review your code in a public repo.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;That puts the pressure on you doesn't it? Now you've got to show working code. One extremely unethical way to do that is to copy/paste other people's code into your own repo and claim it as your own. The problem with that is real reviewers know good code doesn't just magically appear in gigantic chunks. Which I'll sum up with another statement:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Python employers are smart enough to read your commit log.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So as a beginner, what can you do? A lot of shops will want to see your code but if you put up your early code, doesn't that mean they'll see your ugly, mistake-ridden work? Yes they will - but if you keep at it with tutorial examples you are working, whatever pet project you cook up, or even submitting patches to various existing projects, they'll see how your code improves. I am much more inclined to hire a person able/willing to learn than a jaded expert who doesn't want to grow - which is why I always try to think like an eternal beginner. Which brings me to my third statement:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Python employers are willing to hire bright, hungry developers willing to learn.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Getting away from employment, let's talk a little about the Python development community. This community is a meritocracy with amazing foresight. Passion for code and/or natural talent is often recognized before skill is achieved - but only if you show the community you are learning. Get your code onto &lt;a href="http://github.com/"&gt;Github&lt;/a&gt;, or &lt;a href="http://bitbucket.org/"&gt;BitBucket&lt;/a&gt;, or &lt;a href="http://sourceforge.net/"&gt;SourceForge&lt;/a&gt; so it is seen, and keep at it! Try to commit every day and if that isn't possible, then once a week!&lt;br /&gt;&lt;br /&gt;Because if you write code every day or every week, over time your code will get better, you'll also be able to demonstrate a consistent body of work, and your passion for software development will be obvious. Also, try to comment your code as much as possible.&lt;br /&gt;&lt;br /&gt;One good trick is to put your ongoing notes in a repo. I do it myself at &lt;a href="https://github.com/pydanny/pydanny-event-notes"&gt;https://github.com/pydanny/pydanny-event-notes&lt;/a&gt;. My early notes are very, very different from my later notes. Often embarrassingly so, but to a Python employer I'm pretty certain they are a useful reference into just how I think.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Github, not LinkedIn&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;LinkedIn (and Facebook, Google Plus, et al) are a place to define your profile and nothing more. That profile should include a link to your code. Python employers will be looking your for links to your code, not for any sort of networking you do on those sites. Employers get annoyed by '&lt;i&gt;developers&lt;/i&gt;' who excessively network but have no links to code samples on Github or other similar sites. If you have no code to find then it means we can't see your work, your thought processes, or your passion. &lt;br /&gt;&lt;br /&gt;One common technique you see by a lot of Python developers is posting quick links to their projects and efforts on Github using various social networks. You can and should do the same.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;You make connections by showing you want to learn&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-8948706936373853768?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/8948706936373853768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=8948706936373853768' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8948706936373853768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8948706936373853768'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/08/github-is-my-resume.html' title='Github is my resume'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-8154422061373000576</id><published>2011-07-31T14:26:00.000-07:00</published><updated>2011-07-31T16:46:56.220-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pyladies'/><category scheme='http://www.blogger.com/atom/ns#' term='djangocon'/><category scheme='http://www.blogger.com/atom/ns#' term='courses'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='geek celebrities'/><category scheme='http://www.blogger.com/atom/ns#' term='training'/><category scheme='http://www.blogger.com/atom/ns#' term='classes'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>The Ultimate Django Tutorial Workshop</title><content type='html'>That is a big statement to make as a title of a class/workshop blog post. However, in this case I believe I'm fully justified because this is going to be awesome. Here's why:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. The teachers are beyond incredible&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In the course description it says I'm the teacher and I have lab assistants. In retrospect, what I should have said is, "&lt;i&gt;Daniel Greenfeld is organizing a workshop taught by the people he respects and admires&lt;/i&gt;".&lt;br /&gt;&lt;br /&gt;Think I'm kidding? Look at just some of the names of people I've got lined up to participate:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jacobian.org/"&gt;Jacob Kaplan-Moss&lt;/a&gt;, Benevolent Dictator For Life of &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://cecinestpasun.com/"&gt;Russell Keith-Magee&lt;/a&gt;, President of the&amp;nbsp;&lt;a href="https://www.djangoproject.com/foundation/"&gt;Django Software Foundation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://djangocon.us/speaker/profile/19/"&gt;Audrey Roy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://djangocon.us/speaker/profile/24/"&gt;Jacob Burch&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://djangocon.us/speaker/profile/31/"&gt;Katharine Jarmul&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://djangocon.us/schedule/presentations/54"&gt;Corey Bertram&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://djangocon.us/schedule/presentations/53/"&gt;Sandy Strong&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://djangocon.us/speaker/profile/44/"&gt;Jonas Obrist&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://djangocon.us/speaker/profile/28/"&gt;Christine Cheung&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://djangozoom.com/about/"&gt;Shimon Rura&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Follow those links to their bios or talks and you'll see that they are the people speaking at &lt;a href="http://djangocon.us/"&gt;DjangoCon&lt;/a&gt;. &amp;nbsp;The general idea is to get the people already speaking at DjangoCon or those who are extremely experienced in it to teach the class.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. The teacher to student ratio is going to be really small&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This is not going to be a room with a few instructors and umpteen students in it. If the class size gets big, I'm going to bring in more teachers. I'll cajole, plead, and do whatever I must to get them in the room. I don't want anyone left behind!&lt;br /&gt;&lt;br /&gt;I want a ratio of 5 students to each teacher.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Class implemented with a lot of lessons learned&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I've taught a bunch. So have a number of the instructors I've lined up. We know which parts of the tutorial are important to focus on, and which parts should be visited by students later on their own. This means you learn the critically important parts that get you kick-started as a Django developer.&lt;br /&gt;&lt;br /&gt;One thing we'll try to squeeze in is deployment to one of the new Django hosts such as &lt;a href="http://djangozoom.com/"&gt;Djangozoom.com&lt;/a&gt;, &lt;a href="http://gondor.io/"&gt;Gondor.io&lt;/a&gt;, and &lt;a href="http://ep.io/"&gt;ep.io&lt;/a&gt;. In fact, Shimon Rura,&amp;nbsp;one of the co-founders of Djangozoom,&amp;nbsp;participating as an instructor.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. We're all volunteers&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;All the proceeds earned by the instructors for this course will be going to the &lt;a href="http://pyladies.com/"&gt;Pyladies&lt;/a&gt; Sponsorship program. That is important for two reasons:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Your attendance will help Pyladies sponsor more women to learn &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; in the future.&lt;/li&gt;&lt;li&gt;The teachers are doing this because they want to do it. They want you to learn Django.&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;5. It won't end at 12:30 PM&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Officially the tutorial ends at 12:30PM and we should be done. Sometimes though we stumble on things &amp;nbsp;and we don't finish with the rest of the class&amp;nbsp;(like me in my last C programming class). But after a lunch break I'm planning on grabbing some space and working through the rest of the tutorial with anyone who didn't complete the class.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6. The tutorial opens DjangoCon&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The tutorial starts on Monday, September 5, 2011 at 9:30 AM at the&amp;nbsp;Hilton Portland and Executive Tower at 921 SW Sixth Avenue in&amp;nbsp;Portland, Oregon, USA. If you do plan on attending DjangoCon and are new to the framework, what a great way to get started!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;7. You don't have to attend DjangoCon itself to take the tutorial&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Tickets for the event are being sold separately from the conference. So if you can't take off more than one day of school or work, this is a great way to capitalize on DjangoCon.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Convinced? Here is what you need to know and do to get signed up:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Get a laptop running Windows 7, Mac OS X 10.5 or higher, or Ubuntu.&lt;/li&gt;&lt;li&gt;If there is no Python installed, install &lt;a href="http://python.org/download/"&gt;Python 2.7.1&lt;/a&gt;. &lt;b&gt;DO NOT INSTALL PYTHON 3!!!&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Make sure you have a grounding in Python. If you are new to Python you need to have finished at least half the chapters in&amp;nbsp;&lt;a href="http://learnpythonthehardway.org/"&gt;learnpythonthehardway.org&lt;/a&gt;&amp;nbsp;before you attend. &lt;i&gt;If you come to this event with no prior Python experience you will be left behind&lt;/i&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://dcus11tutorials.eventbrite.com/"&gt;Buy a ticket&lt;/a&gt;!&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-8154422061373000576?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/8154422061373000576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=8154422061373000576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8154422061373000576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8154422061373000576'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/07/ultimate-django-tutorial-workshop.html' title='The Ultimate Django Tutorial Workshop'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-9047098515999917248</id><published>2011-07-17T20:53:00.000-07:00</published><updated>2011-07-17T22:44:54.013-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='review'/><title type='text'>Amtrak Review</title><content type='html'>&lt;a href="http://twitter.com/audreyr"&gt;Audrey&lt;/a&gt; and I got invited to a wedding in the Pacific Northwest. And mostly to try something new, we decided to take &lt;a href="http://en.wikipedia.org/wiki/Amtrak"&gt;Amtrak's&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Coast_Starlight"&gt;Coast Starlight&lt;/a&gt; from &lt;a href="http://en.wikipedia.org/wiki/Union_Station_(Los_Angeles)"&gt;Los Angeles' Union Station&lt;/a&gt; to &lt;a href="http://en.wikipedia.org/wiki/King_Street_Station_(Seattle)"&gt;Seattle, Washington's King Street Station&lt;/a&gt;. &amp;nbsp;There was some incredible awesomeness about the trip, and a lot that... wasn't so awesome.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;No Internet (Bad)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Thanks to encroaching deadlines we planned to take advantage of Amtrak's wireless Internet, otherwise we would have flown. Each direction took 36 hours, which is basically two days. Which meant four working days on the train. Sure, we would have liked to have sat back and just enjoyed the journey, but for us that wasn't an option on this particular trip.&lt;br /&gt;&lt;br /&gt;Unfortunately, both the ride there and the ride back lacked internet. In the first case the car with it wasn't part of the train. On the way back the car was part of the train but the Internet was nonfunctional. Which cost us nearly 4 days of work.&lt;br /&gt;&lt;br /&gt;We did manage to use our cell phones for tethering, but coverage on rail lines is not that good. Each time we hit a town we connected and caught as much as we could. It wasn't ideal, but it worked. We're still trying to dig out from under work time lost.&lt;br /&gt;&lt;br /&gt;What you should know is that more experienced Amtrak passengers all said that they've never had working Internet. There is always a problem on long journeys on the Coast Starlight. Which means don't use the train for business.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Room (Okay)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We aren't big people and are fairly flexible and athletic. So the roomette we got was quite snuggly. Larger people or those unable to&amp;nbsp;maneuver&amp;nbsp;in tight spaces will probably be uncomfortable.&lt;br /&gt;&lt;br /&gt;However, I think if I did this again I would get a bigger room. They have restrooms built in, but I think I would use external bathrooms so as to keep the room smelling nicer.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Food (Okay)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The breakfast eggs and dinner steak rocked. So did the ribs. The coffee was good. Everything else was mediocre at best. &lt;br /&gt;&lt;br /&gt;The juices they served tasted like they lacked any connection to natural substances.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Room Attendants, Conductors, and Lounge Car attendant (Good)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The room attendants were amazing. They worked their butt off and got no sleep. I made sure to tip them well. The conductors were also extremely helpful. The first lounge car attendant, a guy named 'CJ' was incredible - he lacked a real lounge car and simply made do.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Diner Car Service (Unacceptably&amp;nbsp;Bad)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The service in the Dining cars was uniformly bad. They were rude, obnoxious, and did their absolute best to avoid eye contact. One meal, when we waited two freaking hours for our food while others got seated and finished after we ordered, was unbelievable. If we asked about our food or drink refills we got snapped at. In retrospect, we should have gotten up and left - or filed a formal complaint.&lt;br /&gt;&lt;br /&gt;After several attempts to weather the bad service we took all meals in our private roomette.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scenery (Outstanding)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This is the part of things that was incredible. The Coast Starlight goes through some amazing scenery, from the beaches of Southern California to the incredible forests and mountains of the Pacific Northwest. &amp;nbsp;Pictures just don't do it justice - you have to see it sometime for yourself.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion (Okay)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The lack of Internet was annoying. The abominable dining car service was infuriating and Amtrak should give their dining car servers some basic lessons in proper restaurant hospitality.&lt;br /&gt;&lt;br /&gt;Those things said, because the scenery was just that lovely, I might consider taking another multi-day train ride over a time when I wasn't trying to hit deadlines and would avoid the dining car at all costs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-9047098515999917248?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/9047098515999917248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=9047098515999917248' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/9047098515999917248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/9047098515999917248'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/07/amtrak-review.html' title='Amtrak Review'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-2020988296924171365</id><published>2011-07-17T19:32:00.000-07:00</published><updated>2011-12-16T11:25:10.143-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pyramid'/><category scheme='http://www.blogger.com/atom/ns#' term='pyladies'/><category scheme='http://www.blogger.com/atom/ns#' term='opencomparison'/><category scheme='http://www.blogger.com/atom/ns#' term='courses'/><category scheme='http://www.blogger.com/atom/ns#' term='django packages'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='classes'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python and Django class/hackathon!</title><content type='html'>The Los Angeles &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; community (&lt;a href="http://www.meetup.com/ladjango"&gt;LA Django&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://la.pyladies.com/"&gt;LA&lt;/a&gt; &lt;a href="http://pyladies.com/"&gt;PyLadies&lt;/a&gt;) is meeting in Santa Monica on July 23rd to teach &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; and hack on all things Python on Saturday, July 23rd. The day will start with a Django class based on the official Django tutorial, then turn into a general hackathon, and finish up with lighting talks.&lt;br /&gt;&lt;br /&gt;Leading the event is noted Pythonista &lt;a href="http://djangocon.us/speaker/profile/31/"&gt;Katharine&lt;/a&gt; &lt;a href="http://twitter.com/kjam"&gt;Jarmul&lt;/a&gt;. As Katharine is giving the talk on &lt;a href="http://djangocon.us/schedule/presentations/35/"&gt;web scraping at DjangoCon US&lt;/a&gt;, I'm hoping we can get her to give a lightning talk on the subject.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Learning Django&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/sandymahalo"&gt;Sandy Strong&lt;/a&gt; will lead the effort to &amp;nbsp;teach people the fundamentals of Django. Besides all things Django and devops, Sandy is presenting the &lt;a href="http://djangocon.us/schedule/presentations/53/"&gt;testing talk at DjangoCon US&lt;/a&gt;. And if that isn't good enough for you, she won't be alone teaching - there will be a bunch of us developers experienced with Django there to to provide her with support.&lt;br /&gt;&lt;br /&gt;Even if you already know Django, please come and hang out for the first half! You can either help out others or work on your own project.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Hacking Python and Django&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The second half of the day will be about working on whatever you want. If you are new to Django and want to finish the tutorial, go right ahead. Or you can work on your own pet Django or Python project. In fact, I know that there will be work on the nascent &lt;a href="http://pylonsproject.org/projects/pyramid/about"&gt;Pyramid project&lt;/a&gt; intended to represent the &lt;a href="https://github.com/LAPython/pythonla"&gt;entire Los Angeles Python community&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lightning Talks&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We'll finish with lightning talks. Several people who attended the day will get the chance to talk for 5 minutes or so about a project, tool, or cause they wanted to share. If they go too long we start applauding until they step down.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Social Hour&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;After another awesome day of Python in LA, everyone will&amp;nbsp;cool down by hanging and chatting over drinks. If you're lucky, maybe you'll get to see me do a drunken one-handed cartwheel where I don't spill a drop of what I'm holding.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;My role&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I'll be there in my normal role of setting up tables and chairs, helping during the class portion, and hacking on some &lt;a href="http://github.com/cartwheelweb/packaginator"&gt;Packaginator&lt;/a&gt; stuff in&amp;nbsp;preparation&amp;nbsp;for the forthcoming August/September Packaginator sprints at &lt;a href="http://pycon-au.org/"&gt;PyCon AU&lt;/a&gt;, &lt;a href="http://nz.pycon.org/"&gt;Kiwi Pycon&lt;/a&gt;, and &lt;a href="http://djangocon.us/"&gt;DjangoCon US&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sponsors&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This is all possible thanks to the sponsorship of &lt;a href="http://mahalo.com/"&gt;Mahalo&lt;/a&gt;, &lt;a href="http://cars.com/"&gt;Cars.com&lt;/a&gt;, and the &lt;a href="http://www.python.org/psf/"&gt;Python Software Foundation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://pyladies-django-july.eventbrite.com/"&gt;Sign up!&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Tickets are selling out really fast! &lt;a href="http://pyladies-django-july.eventbrite.com/"&gt;Sign up now!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-2020988296924171365?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/2020988296924171365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=2020988296924171365' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2020988296924171365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2020988296924171365'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/07/python-and-django-classhackathon.html' title='Python and Django class/hackathon!'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-2892925667796612569</id><published>2011-07-12T15:41:00.000-07:00</published><updated>2011-07-12T15:52:02.509-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='mongodb'/><title type='text'>Normalization noitazilamroN</title><content type='html'>Since pretty much the start of my career as a developer back in the 1990s one skill I've carried from job-to-job has been an understanding of relational databases. Over the years I've worked with &lt;a href="http://en.wikipedia.org/wiki/Foxpro"&gt;Foxpro&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Access"&gt;Access&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Oracle_Database"&gt;Oracle&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Microsoft_SQL_Server"&gt;SQL Server&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/MySQL"&gt;MySQL&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Sqlite"&gt;Sqlite&lt;/a&gt;, and now&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Postgresql"&gt;PostGreSQL&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Interestingly enough,&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Database_Normalization"&gt;database normalization&lt;/a&gt; comes&amp;nbsp;instinctively&amp;nbsp;to me. I knew about complex SQL joins and unions and subqueries before I read anything about normalization. As I read up on normalization, it was rather exciting to discover that my natural instinct during database design was to hit the fourth or fifth normal form without thinking about it. &amp;nbsp;And since for most of my pre-&lt;a href="http://python.org/"&gt;Python&lt;/a&gt; career the number of records I dealt with was measured in the tens of thousands, normalization was a great tool. I was aware that my record sets were smallish, and good database design kept my stuff running fast.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Relational Databases are not a panacea that lets you overcome bad code&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;It surprises me how many developers I've encountered over the years who complained about the performance issues of normalized data but didn't understand normalization. Instead, they refused to follow any sort of standard and every table seemed to duplicate data and every query requires complex joins for trivial data calls. And usually with sets of records in the count of tens of thousands, not millions or billions. The end result are projects that were/are unmaintainable and slow, with or without normalization.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NoSQL is not a panacea that lets you overcome bad code&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Which brings me to the current state of things. NoSQL is a big thing, with advantages of NoSQL being touted in the arenas of speed, reliability, flexible architecture, avoidance of &lt;a href="http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch"&gt;Object relational&amp;nbsp;impedance&amp;nbsp;mismatch&lt;/a&gt;, and just plain ease of development. I've spent a year spinning an &lt;a href="http://en.wikipedia.org/wiki/XML"&gt;XML&lt;/a&gt; database stapled on top of MS SQL Server, years using &lt;a href="http://en.wikipedia.org/wiki/ZODB"&gt;ZODB&lt;/a&gt;, and about a woefully short time working on &lt;a href="http://en.wikipedia.org/wiki/MongoDB"&gt;MongoDB&lt;/a&gt; projects. Like relational databases, the sad truth about XML, ZODB, and MongoDB is that there are problems. And just as with relational databases, the worst of it stemmed not from any issues with data systems, but developers and engineers.&amp;nbsp;Like any other tool you can make terrible mistakes that lead to unmaintainable projects.&lt;br /&gt;&lt;br /&gt;So for now, like most of the developers I know, what I like to do is as follows:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Create a well-normalized database preferably using PostGreSQL.&lt;/li&gt;&lt;li&gt;Cache predicted slowdown areas in &lt;a href="http://en.wikipedia.org/wiki/Redis_(data_store)"&gt;Redis&lt;/a&gt;.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Use data analysis to spot database bottlenecks and &lt;a href="http://en.wikipedia.org/wiki/Denormalization"&gt;break normalization&lt;/a&gt; via specific non-normalized tables.&lt;/li&gt;&lt;li&gt;Use a queue system like &lt;a href="http://celeryproject.org/"&gt;Celery&lt;/a&gt; or even chronjobs to populate the&amp;nbsp;non-normalized&amp;nbsp;table so the user never sees anything slow.&lt;/li&gt;&lt;li&gt;Cache the results of queries against the specific&amp;nbsp;non-normalized&amp;nbsp;tables in Redis.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;The end result is something with the rigidity of a relational database but with the delivery speed of a key/value database.&amp;nbsp; Since I work a lot in &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; this means I get the advantage of most of the &lt;a href="http://djangopackages.com/"&gt;Django Packages ecosystem&lt;/a&gt; (at this time you lose much of the ecosphere if you go pure NoSQL). You can do the same in &lt;a href="http://pylonsproject.org/projects/pyramid/about"&gt;Pyramid&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Ruby_on_Rails"&gt;Rails&lt;/a&gt;, or whatever. Maybe its a bit conservative, but it works just fine.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-2892925667796612569?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/2892925667796612569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=2892925667796612569' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2892925667796612569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2892925667796612569'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/07/normalization-noitazilamron.html' title='Normalization noitazilamroN'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-5561367756019764468</id><published>2011-06-29T02:14:00.000-07:00</published><updated>2011-12-16T11:25:10.145-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opencomparison'/><category scheme='http://www.blogger.com/atom/ns#' term='australia'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>I'm going to Pycon Australia!</title><content type='html'>I'm flying across the &lt;a href="http://en.wikipedia.org/wiki/Pacific"&gt;pacific&lt;/a&gt;! To a new continent!! To &lt;a href="http://en.wikipedia.org/wiki/Sydney"&gt;Sydney&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Australia"&gt;Australia&lt;/a&gt;!!!&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Okay, take a deep breath...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;My girlfriend, &lt;a href="http://twitter.com/#!/audreyr"&gt;Audrey Roy&lt;/a&gt;, is going to be giving a keynote speech at &lt;a href="http://pycon-au.org/2011"&gt;Pycon Australia&lt;/a&gt;. I'm going with her because, well, we travel everywhere together. To make the trip even more awesome, there was some last minute room in the schedule and the organizers of the conference offered me a speaking slot.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;When and where will we be?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Pycon Australia will be from August 20th and 21st, with sprints the 22nd and 23rd, all at the &lt;a class="reference external" href="http://www.smc.au.com/"&gt;Sydney Masonic Center&lt;/a&gt; at 66 Goulburn Street. &lt;a href="http://www.pycon-au.org/2011/registration/"&gt;Register&lt;/a&gt; and hang out with us!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What will we be presenting on?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Audrey's keynote is still in the works.&lt;br /&gt;&lt;br /&gt;As for me, I'll be giving the new and improved version of my (in)famous Confessions of Joe Developer talk, of which the '&lt;a href="http://www.slideshare.net/pydanny/confessions-of-a-joe-developer"&gt;old slides&lt;/a&gt;' are here. You'll get to hear me confess about my shortcomings in public and in return I'll pass on tricks I've learned to convince people to believe that I know what I'm doing.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What will we be sprinting on?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I'll be leading the sprint on &lt;a href="http://packaginator.rtfd.org/"&gt;Packaginator&lt;/a&gt;, the framework behind &lt;a href="http://djangopackages.com/"&gt;Django Packages&lt;/a&gt;. The goal will be to &lt;i&gt;finally&lt;/i&gt; launch Python Packages. Python Packages won't replace &lt;a href="http://pypi.python.org/pypi"&gt;PyPI&lt;/a&gt;, it will simply provide a new window into what our wonderful Python community has produced. And I'm excited to work have our wonderful host,&amp;nbsp;&lt;a href="http://www.mechanicalcat.net/richard/log"&gt;Richard Jones&lt;/a&gt;, as a resource for questions about PyPI API questions and systems sure to arise.&lt;br /&gt;&lt;br /&gt;Audrey has told me she may assume her role as co-lead of Packaginator or work on another one of her great ideas (she created the idea for Django Packages - I just tagged along).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Will Pyladies host a workshop or hackathon in Sydney?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Audrey tells me there has been some interest from the Australian Python community in running a &lt;a href="http://pyladies.com/"&gt;Pyladies&lt;/a&gt; event around Pycon Australia. She's put out a &lt;a href="http://audreyr.posterous.com/call-to-action-pyladies-seattle-sydney-au-wel"&gt;call-to-action&lt;/a&gt; and wants to do something the day before or the day after Pycon Australia. Please contact Audrey at &lt;a href="mailto:audreyr@pyladies.com"&gt;audreyr@pyladies.com&lt;/a&gt;&amp;nbsp;if you want to know more or volunteer.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Please come and say hi!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There will be lots of people there, and I'm asking &lt;a href="http://wiki.python.org/moin/MelbournePUG"&gt;everyone&lt;/a&gt; &lt;a href="http://trac.proams.org/index.fcgi/wiki/Pysig"&gt;in&lt;/a&gt;&amp;nbsp;&lt;a href="http://www.sypy.org/"&gt;greater&lt;/a&gt; &lt;a href="https://sites.google.com/site/brisbanepy/"&gt;Australia&lt;/a&gt; &lt;a href="http://python.or.id/"&gt;and&lt;/a&gt; &lt;a href="http://www.nzpug.org/"&gt;nearby&lt;/a&gt; &lt;a href="http://www.nzzug.org/"&gt;nations&lt;/a&gt; &lt;a href="http://wiki.python.org/moin/LocalUserGroups#Asia"&gt;and&lt;/a&gt; planets interested in &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; to &lt;a href="http://www.pycon-au.org/2011/registration/"&gt;register&lt;/a&gt; and meet us!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-5561367756019764468?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/5561367756019764468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=5561367756019764468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5561367756019764468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5561367756019764468'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/06/im-going-to-pycon-australia.html' title='I&apos;m going to Pycon Australia!'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-6918625304681187140</id><published>2011-06-28T09:39:00.000-07:00</published><updated>2011-06-28T09:39:07.105-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pyladies'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Hollywood Hackathon Report</title><content type='html'>A few weeks ago, specifically June 18, 2011, two Python groups,&amp;nbsp;&lt;a href="http://pyladies.com/"&gt;Pyladies&lt;/a&gt;&amp;nbsp;LA&amp;nbsp;(since they are now global) and the local&amp;nbsp;&lt;a href="http://socal-piggies.org/"&gt;Southern California Python Interest Group&lt;/a&gt; joined forces with &lt;a href="http://borderstylo.com/"&gt;Border Stylo&lt;/a&gt; to put on hopefully the first of what I have styled the '&lt;i&gt;Hollywood Hackathon&lt;/i&gt;'.&lt;br /&gt;&lt;br /&gt;Anyway, let's get down to some serious business. The event was exciting, eye opening, and I hope it happens again.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So why was this event special?&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Out of the 55 local attendees, about 60% were female. Both genders had a wide range of skill levels and interests.&amp;nbsp;&lt;/li&gt;&lt;li&gt;30 more people participated from around the world.&lt;/li&gt;&lt;li&gt;Numerous attendees, male and female, contributed to open source for the first time.&lt;/li&gt;&lt;li&gt;The waiting list for tickets was long.&lt;/li&gt;&lt;li&gt;The PSF and &lt;a href="http://pythonsprints.com/2011/06/9/pyladies-sprint-los-angeles/"&gt;Python Sprints&lt;/a&gt; jumped at the chance to help out.&lt;/li&gt;&lt;li&gt;Code got submitted to various open source projects built using stuff like&amp;nbsp;&lt;a href="http://pyladies.com/"&gt;Python&lt;/a&gt;, &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt;, &lt;a href="http://pylonsproject.org/projects/pyramid/about"&gt;Pyramid&lt;/a&gt;, &lt;a href="http://bottlepy.org/docs/dev/"&gt;Bottle&lt;/a&gt;, &lt;a href="http://learnpythonthehardway.org/"&gt;Learn Python the Hard Way&lt;/a&gt;, and more.&lt;/li&gt;&lt;li&gt;The turnout was awesome. Imagine if there had been months of lead time and a dedicated conference site? Pyladies Con anyone?&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;What I did at the event&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I did what I could to help set things up, presented at the&amp;nbsp;end, and&amp;nbsp;gave Python advice to those who needed it. Most of my Python advice was helping those stuck on setting up their system or trying to find a particular module to do a task.&lt;br /&gt;&lt;br /&gt;The best thing about helping out people at an event like this is that people start figuring out things themselves. Yeah, you help them, but they do the thinking and they do the coding. All you do is provide that initial little bit of help and then they go off and make their world better.&amp;nbsp;How cool is that?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Raise your hand!&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I'm guilty of this too, that &lt;i&gt;I don't want to feel stupid by asking questions&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;This is crazy!&lt;br /&gt;&lt;br /&gt;If you ever come to an event like this, where a dozen people are giving their free time to walk around to mentor, then raise your hand.&amp;nbsp;Otherwise it is by luck that someone will help you. Maybe we'll see you stuck on the same few lines of code or maybe we'll hear you curse exclaim in frustration. Or maybe mentors won't see you in trouble and you'll never get help.&lt;br /&gt;&lt;br /&gt;So please, if you have any questions or problems, don't hesitate to raise your hand!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Closing bits&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I have some advanced notice that the&amp;nbsp;&lt;b&gt;Pyladies&lt;/b&gt;&amp;nbsp;organizers (regardless of opinion &lt;a href="http://pyladies.com/leadership/"&gt;&lt;b&gt;I am not a Pyladies organizer&lt;/b&gt;&lt;/a&gt;) is putting together a kit so you can open up a Pyladies club in your city. Yup, they are going global and I'll be helping spread that message in a future blog post.&lt;br /&gt;&lt;br /&gt;If you wan to know more about what happened, Pyladies has an &lt;a href="http://pyladies.com/blog/recap-june-2011-hollywood-hackathon-at-border-stylo/"&gt;excellent writeup&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Future of Python is women making up 50% or more of the community&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/pydanny/5851931370/" style="margin-left: auto; margin-right: auto;" title="The Future of Python by pydanny, on Flickr"&gt;&lt;img alt="The Future of Python" height="375" src="http://farm6.static.flickr.com/5308/5851931370_9e13667b4e.jpg" width="500" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-6918625304681187140?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/6918625304681187140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=6918625304681187140' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6918625304681187140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6918625304681187140'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/06/hollywood-hackathon-report.html' title='Hollywood Hackathon Report'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5308/5851931370_9e13667b4e_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-5163058344687966910</id><published>2011-06-25T15:48:00.000-07:00</published><updated>2011-06-25T15:48:42.347-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Do not upload dev releases at PyPI</title><content type='html'>In &lt;a href="http://pydanny.blogspot.com/2011/06/announcing-django-uni-form-080-beta.html"&gt;my last blog post&lt;/a&gt; I mentioned that the plan was to release the django-uni-form 0.8.0 final in about six days. To my chagrin I was pointed at Tarek Ziade's &lt;a href="http://tarekziade.wordpress.com/2011/02/15/do-not-upload-dev-releases-at-pypi/"&gt;post about not publishing beta releases on PyPI.&lt;/a&gt;&amp;nbsp;So the django-uni-form team has now pushed up the 0.8.0 release of the library today, and removed the BETA from discovery via the &lt;a href="http://djangopackages.com/packages/p/django-uni-form/"&gt;web&lt;/a&gt; or &lt;a href="http://pypi.python.org/pypi/pip"&gt;pip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lesson learned&lt;/b&gt;: Until future notice from the distutils2 effort led by Tarek, if you are running a project that has any Stable releases, don't use &lt;a href="http://pypi.python.org/pypi"&gt;PyPI&lt;/a&gt; to publish non-final versions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-5163058344687966910?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/5163058344687966910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=5163058344687966910' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5163058344687966910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5163058344687966910'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/06/do-not-upload-dev-releases-at-pypi.html' title='Do not upload dev releases at PyPI'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-8474687439452573630</id><published>2011-06-24T14:04:00.000-07:00</published><updated>2011-06-24T14:08:57.132-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='djangocon'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>Announcing django-uni-form 0.8.0 beta!</title><content type='html'>This has been a long time coming, but I am pleased to announce the release of the&lt;a href="http://pypi.python.org/pypi/django-uni-form/0.8.0-beta"&gt; django-uni-form 0.8.0 beta&lt;/a&gt;. We plan to release the 0.8.0 final next Friday around the start of July 2011.&lt;br /&gt;&lt;br /&gt;This is an enormous jump forward in the project, and I think you'll like what has been done and who contributed.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Some notable changes&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;As of this release, there is now a &lt;a href="http://pypi.python.org/pypi/django-uni-form/0.8.0-beta"&gt;formal django-uni-form&lt;/a&gt; release on &lt;a href="http://pypi.python.org/pypi"&gt;PyPI&lt;/a&gt; that fully supports &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; &lt;a href="https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/"&gt;CSRF&lt;/a&gt; tokens.&lt;/li&gt;&lt;li&gt;Better error messages to help you debug. No more annoying Null messages on bad helpers!&lt;/li&gt;&lt;li&gt;The &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; code has been carefully cleaned and optimized. Much easier to read, debug, and it plain &lt;a href="http://django-uni-form.readthedocs.org/en/latest/faq.html#how-fast-is-django-uni-form"&gt;runs faster on form heavy sites&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Various improvements to the templates to better match the parent &lt;a href="http://sprawsm.com/uni-form/"&gt;Uni-Form&lt;/a&gt; library.&lt;/li&gt;&lt;li&gt;Only compatible with Django 1.2 or higher and Python 2.6 or higher. If you need something to work with other earlier versions of Django/Python, then I suggest using &lt;a href="http://pypi.python.org/pypi/django-uni-form/0.7.0"&gt;django-uni-form 0.7.0&lt;/a&gt;. Or better yet, upgrade your site!&lt;/li&gt;&lt;li&gt;&lt;a href="http://django-uni-form.readthedocs.org/en/latest"&gt;Much improved documentation&lt;/a&gt; on the awesome &lt;a href="http://readthedocs.org/"&gt;readthedocs.org&lt;/a&gt; site.&lt;/li&gt;&lt;li&gt;&lt;a href="http://django-uni-form.readthedocs.org/en/latest/changelog.html#id1"&gt;Tons of other things&lt;/a&gt;!&lt;/li&gt;&lt;li&gt;Upcoming faster release cycles. More on that in the next section...&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;Leadership change for django-uni-form&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Let's face it, over a year between releases&amp;nbsp;is too long for any active open source project. I haven't done the incredible (and patient) &lt;a href="https://github.com/pydanny/django-uni-form/watchers"&gt;django-uni-form community&lt;/a&gt; justice in supporting their issues and pull requests. This project has needed a much more active lead for some time. Fortunately, I found a new project in the way of &lt;a href="http://tothinkornottothink.com/aboutme/"&gt;Miguel Araujo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/maraujop"&gt;Miguel Araujo&lt;/a&gt; shares my passion for good form generation and has a very deep understanding of Python, Django, and HTML. Also, his decisions on everything about this project either matches my own thoughts or he's been able to easily convince me why his concepts are sound. He is responsive to pull requests and issues, and his work is of high quality. So we should be seeing lots of releases and a better evolution of the system to match other advancements in the Django community.&lt;br /&gt;&lt;br /&gt;So going forward Miguel will be the project lead for django-uni-form, and I'll be '&lt;i&gt;former&amp;nbsp;project lead' &lt;/i&gt;and&lt;i&gt;&amp;nbsp;'documentation donkey&lt;/i&gt;'.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The future of django-uni-form in the face of the forms refactor&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Some people are wondering what place django-uni-form has in the face of th&lt;a href="http://www.blogger.com/"&gt;&lt;span id="goog_1002167097"&gt;&lt;/span&gt;e Django GSOC forms refactor&lt;span id="goog_1002167098"&gt;&lt;/span&gt;&lt;/a&gt; by Greg Mullegger. Is the need for django-uni-form going away?&lt;br /&gt;&lt;br /&gt;First of all, I actually have been pushing for a forms refactor in Django for some time. At the &lt;a href="http://djangocon.us/"&gt;djangocon.us&lt;/a&gt;&amp;nbsp;2010 sprints &lt;a href="http://cecinestpasun.com/"&gt;Russel Keith-McGee&lt;/a&gt;, Django core developer and DSF president,&amp;nbsp;asked my opinion on the design of a forms refactor. For the GSOC effort, I was delighted that the GSOC forms project followed the opinion that I preferred in how to &amp;nbsp;doing things, and so I put in my non-binding vote for Gregor's approach. I'm rooting for you Gregor!&lt;br /&gt;&lt;br /&gt;Second, while I think that while this library may change a bit to accomodate the eventual integration of Gregor's work, the need to be able to do&amp;nbsp;guaranteed&amp;nbsp;working &lt;a href="http://django-uni-form.readthedocs.org/en/latest/concepts.html#section-508"&gt;Section 508&lt;/a&gt; compliant layouts easily and more importantly make fancy layout changes in Python will keep this library alive and useful for a long time coming.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Whither goes the source code?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Finally, we'll be keeping the repo at&lt;a href="https://github.com/pydanny/django-uni-form"&gt; https://github.com/pydanny/django-uni-form&lt;/a&gt; for the 0.8.x series so we have time to properly warn the community. When the forms refactor hits Django (prompting the necessary release of the 0.9.x series) we may be moving the library to its own &lt;a href="http://github.com/"&gt;github&lt;/a&gt; account.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I want to thank all the contributors, users, and anyone who gave me guidance or suggestions for this project. All the credit for this goes to you.&amp;nbsp;I'm honored to have started something used by so many great people in so many wonderful ways.&lt;br /&gt;&lt;br /&gt;This evolved from a Django beginner's shortcut filter to a rather sizable project with a great community. Due to my support of this project I learned &lt;a href="http://git-scm.com/"&gt;git-scm&lt;/a&gt;, setuptools, &lt;a href="http://jquery.com/"&gt;JQuery&lt;/a&gt;, &lt;a href="http://sphinx.pocoo.org/"&gt;Sphinx&lt;/a&gt;, &lt;a href="https://docs.djangoproject.com/en/1.3/howto/custom-template-tags/"&gt;custom Django filters and templatetags&lt;/a&gt;, and more. I look forward to where it will go in the future with Miguel as lead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-8474687439452573630?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/8474687439452573630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=8474687439452573630' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8474687439452573630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8474687439452573630'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/06/announcing-django-uni-form-080-beta.html' title='Announcing django-uni-form 0.8.0 beta!'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-8195342618638251109</id><published>2011-06-12T01:31:00.000-07:00</published><updated>2011-06-12T01:37:53.642-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='sprint'/><title type='text'>Hollywood Hackathon on June 18th!</title><content type='html'>Alas, that isn't the formal name of the event, but I'm calling it that anyway. That name just rolls off the tongue, and just seems to embody my &lt;i&gt;East Coast style&lt;/i&gt; distorted vision of the &lt;a href="http://www.meetup.com/ladjango/"&gt;Los Angeles&lt;/a&gt; &lt;a href="http://pyladies.com/"&gt;Python&lt;/a&gt; &lt;a href="http://socal-piggies.org/scp"&gt;community&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Anyway, this is a day long event in Hollywood for &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; developers of all skill levels to come and code like fiends with either really smart people or nice people like me. The &lt;a href="http://pyladies.com/"&gt;PyLadies&lt;/a&gt; and &lt;a href="http://socal-piggies.org/"&gt;SoCal Piggies&lt;/a&gt; are organizing this event, and they even got some &lt;a href="http://pyladies.com/blog/thank-you-python-software-foundation/"&gt;PSF funding for things like tables, chairs, and t-shirts&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Which reminds me, please encourage the smart women of all ages in your life to attend! We'll have mentors just for them!&lt;br /&gt;&lt;br /&gt;I'll be there to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Help out as a general volunteer by setting up tables, manning registration, and answering questions.&lt;/li&gt;&lt;li&gt;Assist a few friends on their open source projects.&lt;/li&gt;&lt;li&gt;Work on the new &lt;a href="https://github.com/LAPython/pythonla"&gt;Python LA website&lt;/a&gt;&amp;nbsp;(powered by &lt;a href="http://pylonsproject.org/projects/pyramid/about"&gt;Pyramid&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;Finish the &lt;a href="http://readthedocs.org/docs/dango-uni-form/en/latest/"&gt;documentation&lt;/a&gt; of &lt;a href="https://github.com/pydanny/django-uni-form"&gt;django-uni-form&lt;/a&gt; 0.8.0 if it isn't yet done.&lt;/li&gt;&lt;li&gt;Maybe close some &lt;a href="https://github.com/cartwheelweb/packaginator"&gt;Packaginator&lt;/a&gt; tickets and pull requests.&lt;/li&gt;&lt;/ul&gt;And now to open the floor to questions...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;I'm just starting with Python, should I come?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Heck yeah!&amp;nbsp;Hackathons (and sprints) are a great way to learn new skills or hone your technique by sitting alongside experienced developers who actually need your help.&amp;nbsp;A lot of projects have what are called 'low hanging fruit', which are 'simpler' tasks saved for beginner developers to wet their teeth on.&lt;br /&gt;&lt;br /&gt;Things I've learned at events like these include Git, Mercurial, JQuery, and a hundred other things that have made me a better coder.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What if I don't have a project of my own to bring? Should I come?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Heck yeah! There will be a number of projects around that you can join and contribute to in order to make the world a better place. There isn't a list up yet, but I'm hoping by Saturday there will be one.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What if I want to come and recruit people?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Absolutely not. This is not a job fair and we don't want unnecessary distractions.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What should I bring?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Your own functioning laptop with power cord.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How much does it cost and where do I register?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The event will put you back a measly $15 and that covers food and drinks for the day. Registration is&amp;nbsp;&lt;a href="http://pyladies-hackathon.eventbrite.com/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pyladies-hackathon.eventbrite.com/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="161" src="http://evbdn.eventbrite.com/s3-s3/eventlogos/14047389/1733429735-7.jpg" width="320" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-8195342618638251109?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/8195342618638251109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=8195342618638251109' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8195342618638251109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8195342618638251109'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/06/hollywood-hackathon-on-june-18th.html' title='Hollywood Hackathon on June 18th!'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-1803040770278858864</id><published>2011-05-26T05:40:00.000-07:00</published><updated>2011-05-26T05:47:05.376-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python HTTP Requests for Humans</title><content type='html'>Ever try to use &lt;a href="http://python.org/"&gt;Python's&lt;/a&gt; standard library for doing a &lt;a href="http://en.wikipedia.org/wiki/POST_(HTTP)"&gt;POST&lt;/a&gt;? Or a &lt;a href="http://en.wikipedia.org/wiki/GET_(HTTP)"&gt;GET&lt;/a&gt;,&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/PUT_(HTTP)"&gt;PUT&lt;/a&gt;, or &lt;a href="http://en.wikipedia.org/wiki/DELETE_(HTTP)"&gt;DELETE&lt;/a&gt;? What about when you have to deal with&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Basic_access_authentication"&gt;HTTP Basic Auth&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;In a word, ugh.&lt;br /&gt;&lt;br /&gt;Let's face it, this is one part of Python that is really not for human consumption. While there are a million things you can do with things like&amp;nbsp;&lt;a href="http://docs.python.org/library/urllib.html"&gt;urllib&lt;/a&gt;,&amp;nbsp;&lt;a href="http://docs.python.org/library/urllib2.html"&gt;urllib2&lt;/a&gt;,&amp;nbsp;&lt;a href="http://docs.python.org/library/socket.html"&gt;socket&lt;/a&gt;,&amp;nbsp;&lt;a href="http://docs.python.org/library/urlparse.html"&gt;urlparse&lt;/a&gt;, the fact of the matter is that implementing anything beyond &lt;b&gt;urllib.urlopen()&lt;/b&gt; is a matter of diving into arcane APIs.&lt;br /&gt;&lt;br /&gt;Sure, thanks to works like &lt;a href="http://www.doughellmann.com/PyMOTW/"&gt;Doug Hellmann's Python Module of the Week&lt;/a&gt;&amp;nbsp;and &lt;a href="http://www.voidspace.org.uk/python/articles/urllib2.shtml"&gt;Michael Foord's documentation of urllib2&lt;/a&gt;&amp;nbsp;the problem isn't unsurmountable. Unfortunately, the eclectic mix of libraries and weird APIs means when you have to revisit your code in a few months your code feels like spaghetti.&lt;br /&gt;&lt;br /&gt;Do you doubt me?&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-py"&gt;# This sample gleefully taken from https://gist.github.com/973705&lt;br /&gt;&lt;br /&gt;import urllib2&lt;br /&gt;&lt;br /&gt;gh_url = 'https://api.github.com'&lt;br /&gt;gh_user= 'user'&lt;br /&gt;gh_pass = 'pass'&lt;br /&gt;&lt;br /&gt;req = urllib2.Request(gh_url)&lt;br /&gt;&lt;br /&gt;password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()&lt;br /&gt;password_manager.add_password(None, gh_url, gh_user, gh_pass)&lt;br /&gt;&lt;br /&gt;auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)&lt;br /&gt;opener = urllib2.build_opener(auth_manager)&lt;br /&gt;&lt;br /&gt;urllib2.install_opener(opener)&lt;br /&gt;&lt;br /&gt;handler = urllib2.urlopen(req)&lt;br /&gt;&lt;br /&gt;print handler.getcode()&lt;br /&gt;print handler.headers.getheader('content-type')&lt;br /&gt;&lt;br /&gt;# ------&lt;br /&gt;# 200&lt;br /&gt;# 'application/json'&lt;/pre&gt;&lt;br /&gt;Really?&lt;br /&gt;&lt;br /&gt;This much code to make a simple HTTP GET request with some auth?!?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Really?!?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This is a debugging nightmare! Especially when you have to deal with complex service APIs provided by Paypal, Amazon, Google, Authorize.net, and a million other systems.&lt;br /&gt;&lt;br /&gt;I bet I could earn a decent living by charging Pythonistas a buck each time they took the shortcut of doing HTTP actions in the shell via curl or wget. &lt;br /&gt;&lt;br /&gt;Anyway, wouldn't it be great if we could just call a single function with the URL and auth data as parameters? And that the same dialogue would exist for GET, POST, PUT, DELETE or whatever? Wouldn't that be just plain wonderful? If only we could have that functionality in Python!!!&lt;br /&gt;&lt;br /&gt;Fortunately for us, we do have that functionality courtesy of &lt;a href="http://kennethreitz.com/"&gt;Kenneth Reitz&lt;/a&gt;'s &lt;a href="http://pypi.python.org/pypi/requests"&gt;Requests&lt;/a&gt; library! Our verbose code sample above becomes the wonderfully terse and easy-to-memorize script as shown below:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-py"&gt;# This sample joyfully taken from https://gist.github.com/973705&lt;br /&gt;&lt;br /&gt;import requests&lt;br /&gt;&lt;br /&gt;r = requests.get('https://api.github.com', auth=('user', 'pass'))&lt;br /&gt;&lt;br /&gt;print r.status_code&lt;br /&gt;print r.headers['content-type']&lt;br /&gt;&lt;br /&gt;# ------&lt;br /&gt;# 200&lt;br /&gt;# 'application/json'&lt;/pre&gt;&lt;br /&gt;Want to do a post with data? Try this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-py"&gt;# This example cooked up by me!&lt;br /&gt;&lt;br /&gt;import requests&lt;br /&gt;post_data = {"amount":10000, "service":"writing blog posts"}&lt;br /&gt;&lt;br /&gt;r = requests.post('http://example.com/api', post_data, auth=('user', 'pass'))&lt;br /&gt;&lt;br /&gt;print r.status_code&lt;br /&gt;print r.headers['content-type']&lt;br /&gt;&lt;br /&gt;# ------&lt;br /&gt;# 200&lt;br /&gt;# 'application/json'&lt;/pre&gt;&lt;br /&gt;The &lt;a href="https://github.com/kennethreitz/requests"&gt;Requests&lt;/a&gt; library is still young, but I've yet to run into any bugs or undocumented edge cases. The &lt;a href="http://docs.python-requests.org/en/latest/index.html"&gt;documentation is awesome&lt;/a&gt;, but you don't really need it at all. The library is intuitive, fun, and and there is clearly one way to do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-1803040770278858864?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/1803040770278858864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=1803040770278858864' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/1803040770278858864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/1803040770278858864'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/05/python-http-requests-for-humans.html' title='Python HTTP Requests for Humans'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-1132191400778873619</id><published>2011-05-23T14:01:00.000-07:00</published><updated>2011-09-30T11:43:54.039-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><category scheme='http://www.blogger.com/atom/ns#' term='family'/><title type='text'>I love this girl!</title><content type='html'>In every person's life there are those incredibly memorable experiences that stick with you forever. The entirety of &lt;a href="http://us.pycon.org/2010/about/"&gt;PyCon 2010&lt;/a&gt; is for me that experience. You see, PyCon 2010 saw me introduced to the lovely, talented, and brilliant &lt;a href="http://twitter.com/audreyr"&gt;Audrey Roy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/pydanny/4389161092/" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img src="http://farm5.static.flickr.com/4044/4389161092_4657fac2ab_m.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Moments after I heard her lovely voice for the first time, we looked into each other's eyes. After that moment, I spent every waking moment of the conference finding excuses to spend time with her. Fortunately for me, most of her tastes for talks and social events matched my own. Within days we were &lt;a href="http://www.flickr.com/photos/pydanny/4404666820/"&gt;dancing in each other's arms&lt;/a&gt;.&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;a href="http://www.flickr.com/photos/47628826@N05/4374285165/" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;" title="2010-02-20 23.21.30 by tombrander, on Flickr"&gt;&lt;img alt="2010-02-20 23.21.30" src="http://farm5.static.flickr.com/4071/4374285165_04f18a6d6d_m.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;By the end of the PyCon we both knew we had something special. So after the conference &lt;a href="http://www.flickr.com/photos/pydanny/sets/72157623798861723/"&gt;we both flew&lt;/a&gt; &lt;a href="http://www.flickr.com/photos/pydanny/sets/72157623641835532/"&gt;back and forth&lt;/a&gt; &lt;a href="http://www.flickr.com/photos/pydanny/sets/72157623923236848/"&gt;across the country&lt;/a&gt; &lt;a href="http://www.flickr.com/photos/pydanny/sets/72157623929276286/"&gt;every two weeks&lt;/a&gt; for months to keep seeing each other. My phone bill skyrocketed. I became intimately familiar with &lt;a href="http://en.wikipedia.org/wiki/Skype"&gt;Skype&lt;/a&gt;. It was crazy and magnificent. Finally, on May 5th of 2010 I moved out West to be with her for good.&lt;br /&gt;&lt;br /&gt;Audrey may seem shy at first, but she has a fierce heart (FYI, she played Ice Hockey for years and did the bargaining for my car). She has a degree in Electrical Engineering and Computer Science from &lt;a href="http://en.wikipedia.org/wiki/MIT"&gt;MIT&lt;/a&gt;. She supports me in everything I want to do. If you enjoy &lt;a href="http://djangopackages.com/"&gt;Django Packages&lt;/a&gt; and follow &lt;a href="https://github.com/opencomparison/opencomparison"&gt;Open Comparison&lt;/a&gt;, she came up with the idea. We cook and eat healthy, and besides our differences on seafood/&lt;a href="http://oppugn.us/posts/1279823157.html"&gt;mac-and-cheese&lt;/a&gt; we are a food match. She loves my family and they adore her. She is a talented visual artist in any medium she attempts. As a developer, she learns unbelievably fast and produces high quality code in languages such as &lt;a href="http://python.org/"&gt;Python&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/C++"&gt;C++&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Objective-C"&gt;Objective-C&lt;/a&gt;, and anything else she touches. She hacks the &lt;a href="http://en.wikipedia.org/wiki/Linux"&gt;Linux&lt;/a&gt; kernel so she can use her preferred peripherals. Her role in the technical community continually grows, and recently she launched the &lt;a href="http://pyladies.com/"&gt;PyLadies advocacy group&lt;/a&gt;.&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/pydanny/5670147589/" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img src="http://farm6.static.flickr.com/5266/5670147589_dceb54c1ea_m.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Airborne girlfriend!&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;An incredible thing about Audrey is that she makes me a better person. I didn't see this at first, but my good friend and mentor &lt;a href="http://twitter.com/holdenweb"&gt;Steve Holden&lt;/a&gt; pointed it out. She doesn't just bring me joy, she makes me a more tenacious, honest, and compassionate person.&lt;br /&gt;&lt;br /&gt;Life is never perfect, but thanks to Audrey and the &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; community that brought us together, life is just plain good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-1132191400778873619?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/1132191400778873619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=1132191400778873619' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/1132191400778873619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/1132191400778873619'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/05/i-love-this-girl.html' title='I love this girl!'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm5.static.flickr.com/4044/4389161092_4657fac2ab_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-204943295383582380</id><published>2011-05-19T00:01:00.000-07:00</published><updated>2011-05-19T06:50:35.199-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>A couple great Pycon 2011 Talks</title><content type='html'>Yes, this should have been posted months ago... Anyway,&amp;nbsp;so many great talks at &lt;a href="http://us.pycon.org/2011/"&gt;PyCon 2011&lt;/a&gt;, here are two great ones! Being an eternal beginner, I try to hit both entry level and advanced talks.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.pycon.tv/video/46/"&gt;How to write obfuscated Python&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;Why waste your time with one decorator when 10 of them attached to a function, each named as descriptively as 'X' or 'G' will make your code delightfully hard to interpret? Also included such goodies as '&lt;b&gt;object = str&lt;/b&gt;' which I borrowed for my own &lt;a href="http://www.slideshare.net/pydanny/python-worst-practices"&gt;Python Worst Practices&lt;/a&gt;. In my opinion, &lt;a href="http://reverend.healeys.net/"&gt;Reverend Johnny Healy&lt;/a&gt; gave the funniest and obscure talk of the conference, and yet somehow managed to export some useful knowledge in the process.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.pycon.tv/video/68/"&gt;The Data Structures of Python&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://alexgaynor.net/"&gt;Alex Gaynor&lt;/a&gt; gave a great 'beginner' talk here. As he went over the basic types in Python, and while he presented well, I wondered if this talk was for me. My hubris was that I thought the talk was beneath me. Then Alex dove into some more sophisticated material like namedtuples and collections and yet again I was reminded how periodically going over the 'basics' is a good thing. Alex kept his talk to a reasonable pace, giving enough time for people to take notes and truly understand what he was teaching. If the whole crazy programming thing doesn't work out for him, he might want to consider becoming an educator.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-204943295383582380?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/204943295383582380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=204943295383582380' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/204943295383582380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/204943295383582380'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/05/couple-great-pycon-2011-talks.html' title='A couple great Pycon 2011 Talks'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-2658420751982507563</id><published>2011-04-25T16:16:00.000-07:00</published><updated>2011-04-25T16:18:43.123-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='courses'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='training'/><category scheme='http://www.blogger.com/atom/ns#' term='classes'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>We won first place at Startup Camp LA!</title><content type='html'>On a whim we (me and &lt;a href="http://twitter.com/audreyr"&gt;audreyr&lt;/a&gt;) decided to try out &lt;a href="http://los-angeles.startupcamper.com/"&gt;Startup Camp LA&lt;/a&gt; organized by &lt;a href="http://semanticseed.com/"&gt;Semantic Seed&lt;/a&gt;. This is one of those Silicon Vally style competitions to launch a minimally viable product along with a business plan and marketing pitch in the course of a weekend. We thought it would be a good excuse to hack on a project we've been cooking up in our heads over a year. So we booked our tickets via meetup.com and showed up at the new &lt;a href="http://nextspace.us/"&gt;Nextspace&lt;/a&gt; Los Angeles location.&lt;br /&gt;&lt;br /&gt;The organizers did a really good great job providing space, food, and lots of useful advice. I look forward to the next event that they run in the area.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Startup Camp LA Pitches&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The first pitch was on &lt;a href="http://confidox.cartwheelweb.com/"&gt;Confidox&lt;/a&gt;, an exclusive recruiting site for lawyers with a focus on clean design, security, and good use of email/sms. The presenter, a professional attorney with great oratory skills, had mockups and a business plan ready to go.&lt;br /&gt;&lt;br /&gt;Audrey gave our pitch, which is a site for recruiting developers that is created and maintained by developers. Developers are treated with dignity and respect, and not as&amp;nbsp;replaceable&amp;nbsp;components. We've talked to people on-and-off about this for over a year, and thought this would be a good opportunity to get things moving.&lt;br /&gt;&lt;br /&gt;After Confidox and our proposal came a lot of other dreamers.&lt;br /&gt;&lt;br /&gt;Then began the bargaining and voting for team placements. Voting was done with paper money. We&amp;nbsp;received&amp;nbsp;the second-highest amount of paper money and Confidox got third place.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Switching projects&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As said, our recruiting idea got second place in votes. We got assigned two other people, one of them being the &lt;b&gt;Confidox&lt;/b&gt; guy. This meant we got the most paper money total!&lt;br /&gt;&lt;br /&gt;Rather than work on our project and have to educate the new guys on the developer ecosystem, we decided to switch to Confidox for the weekend. The scope was reasonable, the plan sound, and the mockups meant we had a specification to code against.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Development&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"Ideas are cheap, implementation is hard."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;From the start Audrey and I decided to not allow any scope creep. No social media widgets, banner advertisements, forums, branding, coupons, or anything that distracted from the business model. That would allow for a clean design and elegant implementation. We went to work, taking breaks to help hammer out the marketing pitch and socialize with the other teams. Our goal was a stable, functional prototype - something we achieved thanks to our mostly open source technology stack.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Technology Stack&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Unless specified otherwise, everything is open source:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://python.org/"&gt;Python&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.postgresql.org/"&gt;PostGreSQL&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jquery.com/"&gt;JQuery&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blueprintcss.org/"&gt;Blueprint CSS&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://httpd.apache.org/"&gt;Apache HTTP Server&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://tropo.com/"&gt;Tropo&lt;/a&gt; (commercial&amp;nbsp;SMS messaging with free dev accounts and developer friendly API)&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;The Final Pitches&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The Confidox pitch:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Our group presented as a team. Marketing talked marketing, techs talked tech.&lt;/li&gt;&lt;li&gt;A live prototype site with fully functioning authentication, registration, profiles, listings, search, and email/SMS notifications.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;The other teams presented well, but I was shocked by a few things:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Most pitches lacked even a buggy prototype.&lt;/li&gt;&lt;li&gt;Presenting teams bickering during their presentations.&lt;/li&gt;&lt;li&gt;Unbelievably, one slide presentation had music that the presenter had to shout over.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Why Confidox won Startup Camp LA&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Audrey took charge of the group and kept us focused on the elegant,&amp;nbsp;straightforward idea. She didn't just code, she also treated the business side as being equally important as the technical delivery (giving them constant feedback and coaching). Which meant we could both roll out a working prototype and nail the marketing pitch.&lt;br /&gt;&lt;br /&gt;When it came down to it, we were a team. Everyone had purpose and everyone contributed.&amp;nbsp;We communicated our idea and demonstrated that our prototype works.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Going forward&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Confidox is not off the ground yet, we'll see where it goes. We certainly have a capable team.&lt;br /&gt;&lt;br /&gt;This event was a success for us and our company &lt;a href="http://cartwheelweb.com/"&gt;Cartwheel&lt;/a&gt;. Also, with ancillary projects with large contributor basis such as&amp;nbsp;&lt;a href="http://djangopackages.com/"&gt;Django Packages&lt;/a&gt;,&amp;nbsp;&lt;a href="https://github.com/cartwheelweb/packaginator"&gt;Packaginator&lt;/a&gt;, and &lt;a href="https://github.com/pydanny/django-uni-form"&gt;Django Uni-Form&lt;/a&gt;, me and Audrey have proven ourselves capable of just launching dynamic projects quickly that work and are used by real people for real work. We'll see what we can do with that proof.&lt;br /&gt;&lt;br /&gt;Finally, if you want to learn our techniques for constructing Confidox and other efforts, come to our &lt;a href="http://cartwheelweb.eventbrite.com/"&gt;Los Angeles area classes&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-2658420751982507563?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/2658420751982507563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=2658420751982507563' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2658420751982507563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2658420751982507563'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/04/we-won-first-place-at-startup-camp-la.html' title='We won first place at Startup Camp LA!'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-823378966016256178</id><published>2011-04-22T09:22:00.000-07:00</published><updated>2011-04-22T09:22:35.683-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='courses'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='training'/><category scheme='http://www.blogger.com/atom/ns#' term='classes'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='cartwheel'/><title type='text'>I teach Python and Django</title><content type='html'>&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;This is one of those blog posts where a developer announces that he/she is teaching for a whole week. The difference is that in this post I'm going to explain why I want to teach and why you should take my classes or send your staff.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;I'm an experienced instructor.&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I've taught a variety of things for over 20 years, including in alphabetical order: Best practices, &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt;, English, &lt;a href="http://jquery.com/"&gt;JQuery&lt;/a&gt;, martial arts, &lt;a href="http://pinaxproject.com/"&gt;Pinax&lt;/a&gt;, &lt;a href="http://python.org/"&gt;Python&lt;/a&gt;, Selenium, soccer, and unit testing. I speak clearly, get across technical points well, and love the material. I also know how to provide an early foundation of knowledge and then expand upon it for maximum benefit.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I don't just dump knowledge into the heads of my students; I take the time to teach them common standards and best practices, so their code is extendable and maintainable.&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;I'm not alone.&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Audrey Roy, co-founder of &lt;a href="http://cartwheelweb.com/"&gt;Cartwheel&lt;/a&gt;, leader of &lt;a href="http://pyladies.com/"&gt;PyLadies&lt;/a&gt; and &lt;a href="http://djangopackages.com/"&gt;Django Packages&lt;/a&gt;, who has tutored and lab assisted at &lt;a href="http://en.wikipedia.org/wiki/MIT"&gt;MIT&lt;/a&gt; will be teaching with me, meaning the teacher-to-student ratio is kept at 5:1 for our first offering.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;I want you to surpass me.&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;After teaching various things for many years I've found it a point of honor and immense pride when a student shines better than myself. I'm not one of those teachers who holds something back so I can always have the edge. In fact, my ultimate goal is to make you better than me.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;I rest on the shoulders of giants.&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I'm sure the people I'm mentioning in this section are going to roll their eyes, but lets face it - they rock!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;In any case, I've had the fortune of helping &lt;a href="http://holdenweb.com/"&gt;Steve Holden&lt;/a&gt; write &lt;a href="http://en.wikipedia.org/wiki/Python_3"&gt;Python 3&lt;/a&gt; classes for the &lt;a href="http://www.oreillyschool.com/"&gt;O'Reilly School of Technology&lt;/a&gt;. I've been exposed to the Django code bases of &lt;a href="http://science.nasa.gov/"&gt;NASA&lt;/a&gt;,&amp;nbsp;&lt;a href="http://revsys.com/"&gt;RevSys&lt;/a&gt; and &lt;a href="http://eldarion.com/"&gt;Eldarion&lt;/a&gt;. While I can't share that work directly, I can take the abstract of their methods and turn it into lessons.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;For the employers: Classes are a good way to find resources&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Having trouble finding staff? Imagine instead you hire a talented developer from another language and send them to my classes. In a week's time for a fraction of the price they'll have been kickstarted into not just knowing how to do their job, but how to expand their knowledge so if they don't know something, they know who to ask.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Refresher courses are free for six months&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Space-permitting, you can retake a class at no charge.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;The course schedule&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Our first classes are scheduled for May 16th to May 20th. We are offering:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://three-day-python-crash-course-eorg.eventbrite.com/"&gt;Three Day Python Crash Course (May 16th, 17th, and 18th)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://two-day-django-crash-course-eorg.eventbrite.com/"&gt;Two Day Django Crash Course (May 19th and May 20th)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;One more thing, if you take both classes we'll give you a 10% discount after registration.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-823378966016256178?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/823378966016256178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=823378966016256178' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/823378966016256178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/823378966016256178'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/04/i-teach-python-and-django.html' title='I teach Python and Django'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-5056470665631912900</id><published>2011-04-17T09:26:00.000-07:00</published><updated>2011-04-17T10:20:33.896-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>How NOT to interview Pythonistas</title><content type='html'>There are a lot of firms who complain that all the experienced &lt;a href="http://python.org/"&gt;Python&lt;/a&gt;&amp;nbsp;people&amp;nbsp;are taken, and wonder if they should choose a different toolset. On the flip side of the coin, I've heard a growing &amp;nbsp;number of developers/engineers complain about horrible hiring practices they encounter. So which is it?&lt;br /&gt;&lt;br /&gt;I think it is a mix of both. Compared to the current need, there is a shortage of experienced Pythonistas. On the other hand, I've seen really stupid mistakes by otherwise professional firms, stupid mistakes which are &lt;b&gt;NOT&lt;/b&gt; caused by recruiters and don't just cost the firm a possible hire, but hurts their reputation. This is because people will complain to each other on IRC and in users groups about how your firm hires people and all of a sudden your firm has a bad reputation.&lt;br /&gt;&lt;br /&gt;So that this stops happening, here are three really bad moves I've seen by companies:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. If cold calling, don't EVER ask technical questions.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Recently I keep hearing about this one and it even happened to me about 8 years ago.&lt;br /&gt;&lt;br /&gt;A pythonista is doing something, maybe coding, driving, sleeping, or eating when they get a call. The pythonista answers and are asked if they are interested in working for Company X. The pythonista gives a positive answer. &lt;i&gt;Then the interviewer asks if they could answer some technical questions.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;At this point the interviewer has &lt;b&gt;failed&lt;/b&gt;. In fact, they have &lt;b&gt;failed hard&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Odds are that being on the spot, the Pythonista will agree. And then, without a day to prep themselves for doing an interview, they are answering questions. There are no metrics for this one but I bet 90% of developers will fail questions they normally could answer in a heartbeat. Afterwards, the developer/engineer will kick themselves because they knew the answer, but because they were flustered they got things wrong.&lt;br /&gt;&lt;br /&gt;And then, to really seal the deal, because the developer/engineer has failed the interview, the interviewer will inform them that they are not the sort of material that Company X wants. So not only did the pythonista mess up easy questions, now the lack of respect for their skills and person has been made abundantly clear.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The interviewer is completely at fault here&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;The real problem for the interviewer is that if that potential hire that they just rejected talks about it, experienced developers/engineers will hear about it and it will be a unspoken black mark against their firm.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lesson learned: &lt;/b&gt;What the interviewer should have done is email first, or if they called, ask if they could schedule a technical interview, either in person or on the phone. There is no exception to this system.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Make it clear that an interview is an interview.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Imagine there is a company you respect and admire. You meet the founders or the senior technical lead at a social event and they invite you to visit their firm. You arrive at the office expecting a tour and instead get handed to the technical staff for a challenging interview. Unprepared you don't do so well, and unsurprisingly the company doesn't hire you.&lt;br /&gt;&lt;br /&gt;This is so full of wrong on the part of the hiring firm I don't know where to begin.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lesson learned: &lt;/b&gt;If you are bringing someone into the office for an interview, make it abundantly clear you are interviewing the&amp;nbsp;prospect. Say it in person and confirm it in email.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Make crazy requests in the technical interview&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A few years ago a very capable friend was asked to provide a list of Fibonacci numbers, but he wasn't allowed to use a function and need to use a database. When he solved that one his effort was then criticized for 15 minutes by four developers. Then he was then asked to do it again, only this time in ECMA script.&lt;br /&gt;&lt;br /&gt;Well before node.js existed, someone else I know was asked to use browser JavaScript to write a multithreaded HTTP server. When my friend asked "&lt;i&gt;why would you ever do such a thing?&lt;/i&gt;", he was told not to ask that question but to solve the issued problem.&lt;br /&gt;&lt;br /&gt;In all these cases the interviewee left annoyed, if not angry. Years have gone by and they still complain about these firms.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lesson learned: For the hard questions, make them meaningful&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-5056470665631912900?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/5056470665631912900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=5056470665631912900' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5056470665631912900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5056470665631912900'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/04/how-not-to-interview-pythonistas.html' title='How NOT to interview Pythonistas'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-7603591922260359724</id><published>2011-04-09T07:30:00.000-07:00</published><updated>2011-04-09T07:30:46.437-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Are you looking for Python and Django Work?</title><content type='html'>I've done some consulting work for a company in &lt;a href="http://en.wikipedia.org/wiki/New_York_City"&gt;New York City&lt;/a&gt; that is looking for full time developers of all levels. They've got a solid business model, experienced and excellent leadership, and an existing team of talented developers who do things the right way. The founders and developers have been behind a bunch of things you know and love. The company is stable, well-financed, and offers full benefits.&lt;br /&gt;&lt;br /&gt;In short: they're building the dream team. They don't use dumb words like rockstar and ninja: they're looking for quietly competent developers with a taste for travel.&lt;br /&gt;&lt;br /&gt;Additional experience with CSS, JavaScript/JQuery, GIS, Git, Linux, and experience with contributing to open source projects are definite pluses.&lt;br /&gt;&lt;br /&gt;Before you apply you need to pass this little test of mine. If you fail any portion of of this test then we won't consider hiring you.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Can you get to the office or are you willing to move closer? When you begin, you need to be able to get to New York City, New York every day of the week. Over time you can work out telecommuting options.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Are you a solitary developer? I'll throw away any responses from recruiters and consulting firms.&lt;/li&gt;&lt;li&gt;Bonus Question: Not a requirement but do you have any open source contributions from any languages to share?&lt;/li&gt;&lt;li&gt;Can you send your resume to my email address 'hidden' in the code below? To do that, you'll need to know enough about Python to run this code:&lt;/li&gt;&lt;/ul&gt;&lt;ol&gt;&lt;/ol&gt;&lt;blockquote&gt;numbers = [83, 101, 110, 100, 32, 114, 101, 115, 117, 109, 101, 32, 116, 111, 32, 112, 121, 100, 97, 110, 110, 121, 64, 112, 121, 100, 97, 110, 110, 121, 46, 99, 111, 109, 32, 119, 105, 116, 104, 32, 115, 117, 98, 106, 101, 99, 116, 32, 111, 102, 32, 39, 108, 111, 102, 116, 121, 39]&lt;br /&gt;&lt;br /&gt;''.&lt;span style="color: #000099;"&gt;join&lt;/span&gt;([chr(x) for x in numbers])&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-7603591922260359724?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/7603591922260359724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=7603591922260359724' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/7603591922260359724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/7603591922260359724'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/04/are-you-looking-for-python-and-django.html' title='Are you looking for Python and Django Work?'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-6643258748462541914</id><published>2011-04-06T10:28:00.000-07:00</published><updated>2011-12-16T11:25:10.147-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opencomparison'/><category scheme='http://www.blogger.com/atom/ns#' term='django packages'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='sprint'/><title type='text'>Python Packages sprint on Sunday 4/10/2011</title><content type='html'>Want to help &lt;a href="http://python.org/"&gt;Python&lt;/a&gt;? Want to encourage &lt;a href="http://pypi.python.org/pypi"&gt;PyPI&lt;/a&gt; to focus on being the best package index system possible and not a catalog/ratings/documentation engine? Then sprint with us on &lt;a href="https://github.com/cartwheelweb/packaginator"&gt;Packaginator&lt;/a&gt; this weekend because...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;We need your help!&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In my &lt;a href="http://pydanny.blogspot.com/2011/04/pycon-2011-sprint-report.html"&gt;last blog post&lt;/a&gt; I mentioned &lt;a href="https://github.com/cartwheelweb/packaginator"&gt;Packaginator&lt;/a&gt; which will power the forthcoming Python Packages site. The purpose of this site is to do for Python what &lt;a href="http://djangopackages.com/"&gt;Django Packages&lt;/a&gt; does for &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt;. We aren't quite ready for launch, and the purpose of this post is to list what tasks remains. There is an enormous amount of outstanding work, and we want to launch as soon as possible so...&lt;br /&gt;&lt;br /&gt;Before I begin, Python Packages will have some dramatic differences from Django Packages:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The 'Add Package' controls won't exist. The only way to get a package into the site is to put your package onto PyPI.&lt;/li&gt;&lt;li&gt;At launch only approved moderators will be able to create new grids and grid features.&lt;/li&gt;&lt;li&gt;Only approved moderators and package owners will be able to edit the target repo URLs and add/edit/remove packages on grids.&lt;/li&gt;&lt;li&gt;Users will still be able to click the "I use this" button.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Please join us!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We invite you to sprint with us on Sunday, April 10, 2011. We are sprinting on Python Packages / Packaginator from the &lt;a href="http://oshackathon-eorg.eventbrite.com/"&gt;Los Angles OS Hackathon&lt;/a&gt; this weekend but also invite remote sprinters to join us from across the globe.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How to participate&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://readthedocs.org/docs/packaginator/latest/contributing.html"&gt;How to contribute to Packaginator is &lt;/a&gt;&lt;a href="http://readthedocs.org/docs/packaginator/latest/contributing.html"&gt;really well documented&lt;/a&gt;&amp;nbsp;and I beg you to read that before commencing any sort of work. We don't use IRC to communicate, instead relying on our convore channel at &lt;a href="http://convore.com/packaginator"&gt;http://convore.com/packaginator&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Because &lt;b&gt;we can, have, and will reject pull requests&lt;/b&gt;, I need to reiterate a few things:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://readthedocs.org/docs/packaginator/latest/contributing.html#run-the-tests"&gt;Run the test suite before you submit your pull request&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://readthedocs.org/docs/packaginator/latest/contributing.html#keep-your-pull-requests-limited-to-a-single-issue"&gt;Keep your pull requests small and focused&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://readthedocs.org/docs/packaginator/latest/contributing.html#follow-pep-8-and-keep-your-code-simple"&gt;Be familiar with PEP-8 and keep your code simple&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Important: &lt;/b&gt;Because we are "this close to launch", for Sunday we aren't the least bit interested in dramatic architecture revisions, model changes, obfuscating our settings, new design, different layouts, or adding Haystack. We'll consider those afterwards.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;Tickets&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Priority tickets are the real choke points that we want to overcome. We could use help on all of them:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/cartwheelweb/packaginator/issues/labels/starter"&gt;Low hanging fruit tasks&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/cartwheelweb/packaginator/issues/labels/challenging"&gt;Challenging tasks&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/cartwheelweb/packaginator/issues/labels/Priority"&gt;Priority tasks&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;When you start a ticket, please let us know in&amp;nbsp;&lt;a href="http://convore.com/packaginator"&gt;http://convore.com/packaginator&lt;/a&gt;&amp;nbsp;so we can mark it as assigned in the Github issue tracking system or warn you if it is already being worked.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Launch&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We hope to launch this sunday or in the immediate days afterwards, and for that&amp;nbsp;Jacob Kaplan-Moss, Jacob Burch, and&amp;nbsp;Noah Kantrowitz&amp;nbsp;&amp;nbsp;have graciously volunteered their time to do the engineering work.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-6643258748462541914?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/6643258748462541914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=6643258748462541914' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6643258748462541914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6643258748462541914'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/04/python-packages-sprint-on-sunday.html' title='Python Packages sprint on Sunday 4/10/2011'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-6666757337220455109</id><published>2011-04-05T10:23:00.000-07:00</published><updated>2011-12-16T11:25:10.149-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pyramid'/><category scheme='http://www.blogger.com/atom/ns#' term='opencomparison'/><category scheme='http://www.blogger.com/atom/ns#' term='django packages'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>PyCon 2011 Sprint Report</title><content type='html'>I love sprints. I've yet to participate in a sprint where I didn't learn something that made a difference in my programming career. Off the top of my head some of the things I've learned include &lt;a href="http://en.wikipedia.org/wiki/Distributed_Version_Control_System"&gt;distributed version control&lt;/a&gt;, picking the right &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; tool, &lt;a href="http://jquery.com/"&gt;JQuery&lt;/a&gt;, &lt;a href="http://www.sqlalchemy.org/"&gt;SQLAlchemy&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Bazaar_(software)"&gt;Bazaar&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Git_(software)"&gt;Git&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Mercurial_(software)"&gt;Mercurial&lt;/a&gt;, the true importance of &lt;a href="http://docs.python.org/library/unittest.html"&gt;unittests&lt;/a&gt;, and Python's &lt;a href="http://docs.python.org/library/functions.html#zip"&gt;built-in zip function&lt;/a&gt;. And the &lt;a href="http://us.pycon.org/2011/sprints/projects/"&gt;PyCon 2011 sprints&lt;/a&gt; were no different.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://us.pycon.org/2011/"&gt;PyCon 2011&lt;/a&gt; was different in that this time I was going to co-lead a project, specifically &lt;a href="http://djangopackages.com/"&gt;Django Packages&lt;/a&gt; and the hopeful launch of Python Packages.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note&lt;/b&gt;: The goal of Python Packages is not to replace &lt;a href="http://pypi.python.org/"&gt;PyPI&lt;/a&gt;, but rather serve as a resource to find, evaluate, and compare packages used in the every day life of a Python. In my opinion, PyPI should be dedicated to listing and serving packages - anything else (comments, ratings, documentation, etc) just adds complexity to the project and diffuses the focus of their team.&lt;br /&gt;&lt;br /&gt;It all started with us being the second-to-last in line at the PyCon sprint announcements. At the microphone I forgot to mention a few things so I was worried that our attendance would suck. I tried to take it in good humor, but doubt worried at my gut. My co-lead, &lt;a href="http://twitter.com/audreyr"&gt;Audrey Roy&lt;/a&gt;, was confident that if no one showed, then we would have fun with just the two of us hacking away.&lt;br /&gt;&lt;br /&gt;To our delight and surprise, turnout was good with about ten (10) people showing up. And thanks to &lt;a href="http://readthedocs.org/docs/packaginator/en/latest/lessons_learned.html#djangocon-2010"&gt;lessons learned at DjangoCon 2010&lt;/a&gt;&amp;nbsp;and our tricks to &lt;a href="http://readthedocs.org/docs/packaginator/en/latest/lessons_learned.html#getting-sprinters"&gt;getting more sprinters&lt;/a&gt;&amp;nbsp;and helping&amp;nbsp;&lt;a href="http://readthedocs.org/docs/packaginator/en/latest/lessons_learned.html#assigning-work"&gt;sprinters&lt;/a&gt; &lt;a href="http://readthedocs.org/docs/packaginator/en/latest/lessons_learned.html#be-conservative"&gt;deliver&lt;/a&gt; &lt;a href="http://readthedocs.org/docs/packaginator/en/latest/lessons_learned.html#helping-people-get-stuff-done"&gt;code&lt;/a&gt;, the number of participants kept growing. In the end we had twenty-four (24) new contributors to the project, which was simply amazing.&lt;br /&gt;&lt;br /&gt;Test coverage had been mediocre on &lt;a href="https://github.com/djangopackages/djangopackages"&gt;Django Packages&lt;/a&gt;, but after a show stopping bug got into production (someone changed a commonly used function to a property), we did a huge amount of work to not only increase &lt;a href="http://www.djangopackages.com/packages/p/django-coverage/"&gt;test coverage&lt;/a&gt; but also refactor tests to be simpler and actually test rather than just increase coverage numbers. The improved quality and quantity of test coverage gave contributors the confidence to refactor and simplify some of the 'brilliant code' that I had written during the first month of the project.&lt;br /&gt;&lt;br /&gt;We also got a &lt;a href="http://readthedocs.org/docs/packaginator/en/latest/lessons_learned.html#pull-requests"&gt;bit draconian about accepting pull requests&lt;/a&gt;&amp;nbsp;but&amp;nbsp;&lt;a href="http://readthedocs.org/docs/packaginator/en/latest/contributing.html#how-to-get-your-pull-request-accepted"&gt;documented how to get pull requests accepted&lt;/a&gt;. That might sound mean but if stopping one person's bug allowed ten (10) other people to maintain productivity then everyone is happier. Also, it allowed us to coach some of the new Python developers coming from other languages on their work. Which was awesome because we saw people's work evolve in a day from rank beginner material to competent Pythonista submissions. To think we had some part in helping people improve is one of the best things we got out of the sprint.&lt;br /&gt;&lt;br /&gt;And the results?&lt;br /&gt;&lt;br /&gt;The biggest thing, which we got into place on the second evening of the sprint, is that Django Packages is now an instance of &lt;a href="https://github.com/cartwheelweb/packaginator"&gt;Packaginator&lt;/a&gt;. Packaginator is a framework for launching package comparison sites for Python based tools. After a bit more work to happen this coming Sunday (4/10/2011), we'll be able to trivially deploy Python Packages, Pyramid Packages, Plone Packages, and Flask Packages - all of them able to support patches from Packaginator without causing the maintainers of those sites to hate our guts. We should also will have the hooks to support things like Vim Packages, Ubuntu Packages, Fedora Packages and more quite shortly.&lt;br /&gt;&lt;br /&gt;Packaginator handles repos much better and now supports&amp;nbsp;&lt;a href="https://bitbucket.org/"&gt;Bitbucket&lt;/a&gt;, &lt;a href="https://github.com/"&gt;Github&lt;/a&gt;, and &lt;a href="https://launchpad.net/"&gt;Launchpad&lt;/a&gt; out of the box. &lt;a href="http://sourceforge.net/"&gt;SourceForge&lt;/a&gt; may happen very soon. &lt;a href="http://code.google.com/hosting/"&gt;Google Project Hosting&lt;/a&gt;, when Google implements &lt;a href="http://code.google.com/p/support/issues/detail?id=5088"&gt;Project Hosting API &lt;/a&gt;(cause we refuse to screen scrape pages for MetaData) will be handled shortly thereafter. Thanks to the work of the 'repo men' adding a new repo is now much easier, and we hope people submit new ones to handle things like Trac and other repo systems.&lt;br /&gt;&lt;br /&gt;Our &lt;a href="http://readthedocs.org/docs/packaginator/en/latest/index.html"&gt;documentation&lt;/a&gt; went from passable to incredible, and our &lt;a href="http://readthedocs.org/docs/packaginator/en/latest/install.html"&gt;installation story is awesome&lt;/a&gt;. You want people to participate in your project? Then learn you some &lt;a href="http://en.wikipedia.org/wiki/Restructured_Text"&gt;RestructuredText&lt;/a&gt; and &lt;a href="http://sphinx.pocoo.org/"&gt;Sphinx&lt;/a&gt; and host your documentation on &lt;a href="http://readthedocs.org/"&gt;Read the Docs&lt;/a&gt;. Read the Docs is awesome and I need to blog about why all Python docs should move there.&lt;br /&gt;&lt;br /&gt;There was a huge amount of template cleanup - and the grid X-Y access can be rotated. We haven't turned on that feature yet, but you'll see it shortly.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The sprints were awesome. I learned a lot about running projects and managed to get into some new coding tricks (zip() comes to mind) into my brain. That this project is helping the open source world made it even better. And the best thing of all is I got to make over twenty new friends - all of whom worked with us towards a single common goal.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PyCon 2011 Contributors&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Aaron Kavlie&lt;/li&gt;&lt;li&gt;Adam Saegebarth&lt;/li&gt;&lt;li&gt;Alex Robbins&lt;/li&gt;&lt;li&gt;Andrii Kurinny&lt;/li&gt;&lt;li&gt;Audrey Roy&lt;/li&gt;&lt;li&gt;Brian Ball&lt;/li&gt;&lt;li&gt;Bryan Weingarten&lt;/li&gt;&lt;li&gt;Chris Adams&lt;/li&gt;&lt;li&gt;Daniel Greenfeld&lt;/li&gt;&lt;li&gt;Eric Spunagle&lt;/li&gt;&lt;li&gt;Evgeny Fadeev&lt;/li&gt;&lt;li&gt;Flaviu Simihaian&lt;/li&gt;&lt;li&gt;Gisle Aas (Repo Man)&lt;/li&gt;&lt;li&gt;Jacob Burch&lt;/li&gt;&lt;li&gt;James Pacileo&lt;/li&gt;&lt;li&gt;Jeff Schenck&lt;/li&gt;&lt;li&gt;Jim Allman&lt;/li&gt;&lt;li&gt;John M. Camara&lt;/li&gt;&lt;li&gt;Jonas Obrist&lt;/li&gt;&lt;li&gt;jrothenbuhler&lt;/li&gt;&lt;li&gt;Nate Aune&lt;/li&gt;&lt;li&gt;Nolan Brubaker&lt;/li&gt;&lt;li&gt;Preston Holmes&lt;/li&gt;&lt;li&gt;Stuart Powers&lt;/li&gt;&lt;li&gt;Szilveszter Farkas (Repo Man)&lt;/li&gt;&lt;li&gt;Tom Brander&lt;/li&gt;&lt;li&gt;Vasja Volin&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-6666757337220455109?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/6666757337220455109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=6666757337220455109' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6666757337220455109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6666757337220455109'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/04/pycon-2011-sprint-report.html' title='PyCon 2011 Sprint Report'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-6699431582263844341</id><published>2011-04-01T00:01:00.000-07:00</published><updated>2011-04-01T22:53:14.275-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pyramid'/><category scheme='http://www.blogger.com/atom/ns#' term='foss'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><category scheme='http://www.blogger.com/atom/ns#' term='GAPE'/><title type='text'>Announcing Garbaginator!</title><content type='html'>While working on &lt;a href="https://github.com/cartwheelweb/packaginator"&gt;Packaginator&lt;/a&gt; at the PyCon 2011 sprints we discovered some serious issues in the way that Django handles garbage collection. After a huge amount of work, we managed to isolate and fix the problem. This 'fix', as it were, was only possible by doing a very sophisticated 'hack' of critical internal components of the Django Web Application framework. We also discovered that similar issues occurred in other existing Python application frameworks such as Pyramid, Flask, Web.py, Web2Py, Grok, Twisted, Tornado, Google App Engine, and Rails.&lt;br /&gt;&lt;br /&gt;Since then the Packaginator community has been fiercely debating what we should do with our newly created set of hacks. After a lot of arguments going both ways we've decided to come up with our own application framework and release it to the world under the GPL license.&lt;br /&gt;&lt;br /&gt;This brand new application framework ignores the lessons learned from all the other Python frameworks and embraces the cutting edge concept of Not-Invented-Here. It focuses less on features and enhancements over existing systems and much, much more on the critical concept of formal Garbage handling.&lt;br /&gt;&lt;br /&gt;Some of the critical modules include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;RubberGloves (for handling dirty objects)&lt;/li&gt;&lt;li&gt;Django-Garbaginator&lt;/li&gt;&lt;li&gt;Flask-Recycling&lt;/li&gt;&lt;li&gt;Pyramid-Garbaginator&lt;/li&gt;&lt;li&gt;Web.2.py Garbaginator Bridgerator ('cause people always get Web2Py and web.py confused with each other so we bridged them together)&lt;/li&gt;&lt;li&gt;BlueBream&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Check out the home page at: &lt;a href="http://garbaginator.cartwheelweb.com/"&gt;http://garbaginator.cartwheelweb.com&lt;/a&gt;&lt;/div&gt;Fork Garbaginator on GitHub: &lt;a href="https://github.com/cartwheelweb/garbaginator"&gt;https://github.com/cartwheelweb/garbaginator&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; This was an April Fool's Day Joke&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-6699431582263844341?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/6699431582263844341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=6699431582263844341' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6699431582263844341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6699431582263844341'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/03/announcing-garbaginator.html' title='Announcing Garbaginator!'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-5727415326938348035</id><published>2011-03-24T20:58:00.000-07:00</published><updated>2011-03-24T21:02:38.788-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>PyCon 2011 Tutorial Report</title><content type='html'>As mentioned &lt;a href="http://pydanny.blogspot.com/2011/01/pinax-tutorial-at-pycon-2011.html"&gt;many times&lt;/a&gt; in &lt;a href="http://pydanny.blogspot.com/2011/02/my-pinax-solutions-class-at-pycon-2011.html"&gt;previous&lt;/a&gt; &lt;a href="http://pydanny.blogspot.com/2011/02/my-django-tutorial-at-pycon.html"&gt;entries&lt;/a&gt; of this &lt;a href="http://pydanny.blogspot.com/"&gt;blog&lt;/a&gt;, with &lt;a href="http://brianrosner.com/"&gt;Brian Rosner&lt;/a&gt; I taught the &lt;a href="http://us.pycon.org/2011/schedule/presentations/111/"&gt;Pinax Solutions tutorial&lt;/a&gt;. We had some last minute people sign up so turnout meant nearly every seat in the room was taken. The second-half being a workshop seemed to go smashingly well. That said, one person had serious problems with getting things running and they left the tutorial without having anything running. I'm not sure how to deal with that besides having a spare laptop setup for that invariable bad laptop that always seems to show up.&lt;br /&gt;&lt;br /&gt;The next day I took &lt;a href="http://us.pycon.org/2011/speaker/profile/166/"&gt;Noah Kantrowitz&lt;/a&gt;' &lt;a href="http://us.pycon.org/2011/schedule/presentations/141/"&gt;(Re-)Introduction to C for Python developers&lt;/a&gt;. It was my first time every trying to code in &lt;a href="http://en.wikipedia.org/wiki/C_(programming_language)"&gt;C&lt;/a&gt;, and it was done by solving problems on this day. He dumped us right in the deep end, which was awesome for the first exercise but then I got a bit lost. I think he should have shown the answer code after everyone got a chance to try to solve things. He finished up the second half of things with some incredibly good content that made me want to use C a lot. I hope he gives this tutorial again next year since I think with a little fine tuning it will be a showcase class.&lt;br /&gt;&lt;br /&gt;I kept my eye on a few tutorials, and was pleased to see that all the introductory &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; classes were full. That is a good sign because more beginners means a stronger community.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-5727415326938348035?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/5727415326938348035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=5727415326938348035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5727415326938348035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5727415326938348035'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/03/pycon-2011-tutorial-report.html' title='PyCon 2011 Tutorial Report'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-4299302415106712872</id><published>2011-03-24T11:18:00.000-07:00</published><updated>2011-03-24T11:51:04.683-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geek celebrities'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><category scheme='http://www.blogger.com/atom/ns#' term='GAPE'/><title type='text'>I'll get you next time, Wesley Chun!</title><content type='html'>At the start of this month I laid out the &lt;a href="http://pydanny.blogspot.com/2011/03/great-pycon-ribbon-game.html"&gt;Great Pycon Ribbon Game&lt;/a&gt;. &lt;a href="http://us.pycon.org/"&gt;PyCon&lt;/a&gt; ribbons are given to people based on their contribution to the conference. Give a tutorial, present a speech, volunteer to do grunt work, sponsor the event, be Guido van Rossum, and more each gives you a special colored ribbon you get to attach to your conference badge.&lt;br /&gt;&lt;br /&gt;Last year I had the most of anyone except for&amp;nbsp;&lt;a href="http://us.pycon.org/2011/speaker/profile/151/"&gt;Wesley Chun&lt;/a&gt;. He's one of my favorite instructors, is an author and Google App Engine advocate, and a good friend. To my five ribbons he had seven. He clearly beat me and deserved the win.&lt;br /&gt;&lt;br /&gt;This year when I issued my ribbon challenge he immediately said that he was giving up. He had too much work and family things going on. I gave him my regrets and planned to totally crush everyone's ribbon count at the conference. I was sure I could duplicate my five ribbon effort from last year and no one else would be able to match me!&lt;br /&gt;&lt;br /&gt;So imagine my surprise when Wesley Chun had seven, SEVEN ribbons on his badge.&amp;nbsp;He beat me this year. Worse, I managed only four this year. So he didn't just beat me at the game, he opened the lead.&lt;br /&gt;&lt;br /&gt;I'm a good loser. I don't begrudge him. Well, maybe not too much.&lt;br /&gt;&lt;br /&gt;Next year I'll issue the challenge again. I hope you join us, since win or lose the wonderful thing about this competition is that PyCon and the community benefits.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-4299302415106712872?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/4299302415106712872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=4299302415106712872' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4299302415106712872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4299302415106712872'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/03/ill-get-you-next-time-wesley-chun.html' title='I&apos;ll get you next time, Wesley Chun!'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-1461950308486417015</id><published>2011-03-08T16:32:00.000-08:00</published><updated>2011-03-10T12:53:47.330-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>The Great PyCon Ribbon Game!</title><content type='html'>Here is my challenge for attendees of &lt;a href="http://us.pycon.org/"&gt;PyCon 2011&lt;/a&gt; - try to win as many volunteer badge ribbons as possible. Whoever gets the most ribbons at PyCon 2011 can claim the title &lt;b&gt;"King of PyCon Badge Ribbons&lt;/b&gt;" and I'll write a special blog post for you, your employer/company, and your favorite non-obscene thing.&lt;br /&gt;&lt;br /&gt;Rules:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You have to &lt;b&gt;earn&lt;/b&gt; the badge ribbons. You have to give tutorials, make presentations, volunteer left and right, and be a great sport. Stealing ribbons is out. So is trading for them.&lt;/li&gt;&lt;li&gt;Only real badge ribbons are valid. You can't write your own and tape them onto your badge.&lt;/li&gt;&lt;li&gt;You must proudly affix the ribbons to your badge.&lt;/li&gt;&lt;li&gt;Cheaters will be lambasted verbally. You deserve what you get.&lt;/li&gt;&lt;/ul&gt;In 2010 I managed to earn five (5) PyCon ribbons and only &lt;a href="http://us.pycon.org/2011/speaker/profile/151/"&gt;Wesley Chun&lt;/a&gt; beat me. Think you can beat our scores from last year? Think you can beat me this year?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-1461950308486417015?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/1461950308486417015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=1461950308486417015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/1461950308486417015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/1461950308486417015'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/03/great-pycon-ribbon-game.html' title='The Great PyCon Ribbon Game!'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-9216201648132182519</id><published>2011-02-25T23:00:00.000-08:00</published><updated>2011-02-25T23:01:59.615-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><category scheme='http://www.blogger.com/atom/ns#' term='presentation tips'/><title type='text'>My tips for speaking</title><content type='html'>I've been presenting on the job since 1999. I've been presenting at conferences since autumn of 2008. I've got some tricks I've picked up over the years. I'll be using these tricks (and more) at &lt;a href="http://us.pycon.org/"&gt;PyCon&lt;/a&gt;, so you'll be able to see and judge them in action.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Black text on white background&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Remember the old days of &lt;a href="http://en.wikipedia.org/wiki/Geocities"&gt;Geocities&lt;/a&gt; when people had purple backgrounds with yellow text? Or dark green backgrounds with white text? Or crazy fonts? We make fun of that sort of thing now. Unfortunately, I've seen presentations done that way in the recent past and so have you.&lt;br /&gt;&lt;br /&gt;Yup, background colors that look great on a laptop or monitor screen often lose something in the transition to a projector. You can't predict what the venue will give you in regards to quality/brand of projector, so why take unnecessary risks?&lt;br /&gt;&lt;br /&gt;So I stick with the classic of what people have been doing forever. I choose the lightest possible background, the darkest colored text, and I use the default font of the slide software. Maybe its not fancy or artistic, but my message isn't obfuscated by forcing people to squint to see slides reinforcing what I'm saying.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fear the command line!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The sucky thing about giving a tutorial is that you have to touch the command-line. And something invariably goes wrong. If you do have to use the command-line remember the following tips:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;White background and black text and increase the size of the text. I don't care if you prefer to code with a black background with tiny green letters - your audience simply won't be able to follow you as easily. Since I heard a &lt;a href="http://en.wikipedia.org/wiki/Walt_Disney_Animation_Studios"&gt;Walt Disney Animation Studios&lt;/a&gt; technical lead have the same opinion, I now feel empowered enough &amp;nbsp;to complain after any talk featuring an unreadable shell.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Try to fake the command-line. I've heard &lt;a href="http://pypi.python.org/pypi/PlayerPiano"&gt;player piano&lt;/a&gt; is a great tool for doing that and will save you from that minute of silence when you try to figure out what you did wrong.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Don't read the slides to the audience&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Listening to someone read the content off a slide is dull. I try to say anything BUT what is on the slide. When I do it speak the content of a slide exactly its because I'm purposefully breaking my pattern to make a point. Or to be silly because I'm getting tense.&lt;br /&gt;&lt;br /&gt;What you should be doing is using the slides to remind yourself of your next point. Think of them as notes for your speech, not the speech itself&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bullets are dangerous&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Bullets are live ammunition. Even in small quantities they can kill a talk. They can put an audience to sleep, cause them to start checking twitter, or even leave. So I use bullets very sparingly in presentations (classes can be different) because of their potency. Because of their inherent silliness I tend to use bullets in self-deprecating humor.&lt;br /&gt;&lt;br /&gt;A better tactic than bullets is to create a subject header on a number of slides and put a single bullet under that subject header. So instead of one (1) slide about 'Python' with bullets of 'Monty', 'Guido', and 'Spam', I like to have three (3) slides each with a header of '&lt;a href="http://python.org/"&gt;Python&lt;/a&gt;' and the content simply being '&lt;a href="http://en.wikipedia.org/wiki/Monty_Python"&gt;Monty&lt;/a&gt;', '&lt;a href="http://en.wikipedia.org/wiki/Guido_Van_Rossum"&gt;Guido&lt;/a&gt;', and '&lt;a href="http://en.wikipedia.org/wiki/Spam_(Monty_Python)"&gt;Spam&lt;/a&gt;'.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sixty seconds per slide&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If you wait too long your slide will become boring to the audience and their brains will drift. This ties right into the problem with bullets. Keep things moving along.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Be rested, fed, and sober for your talk&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Skip the late night party and get a good night's rest. The day of the talk eat food that makes you feel physically better.&lt;br /&gt;&lt;br /&gt;In January I went to a talk where the speaker was presenting on a technical matter with beer in hand. Maybe he thought it was hip, but his talk sucked. He got out of sync with his slides and stumbled around his own thoughts. &amp;nbsp;Not only was the talk of poor quality but it was&amp;nbsp;disrespectful&amp;nbsp;of the speaker.&lt;br /&gt;&lt;br /&gt;Needless to say, the audience was very grumbly about the 45 minutes they wasted.&lt;br /&gt;&lt;br /&gt;That was a terrible shame because his slides were pretty good. I bet if he had been sober that talk would have rocked.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;If people ask questions during the talk, ask them to wait until the end&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;They'll break your pace,&amp;nbsp;rhythm, and timing. If they can't wait until the end then they now fall under my definition of heckler and are not worth answering anyway.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Be nice to people who come up to you after a talk&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You never know who is that new person who comes up to you. Maybe they are planning to blog about you or write about you in the press. Maybe they are a possible business or job lead. Maybe they are someone who wants to throw a &lt;a href="http://en.wikipedia.org/wiki/Gajillion"&gt;gajillion&lt;/a&gt; dollars at you. Be nice to them and you'll find out. Try to find time to talk to everyone, even if for just a minute each.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-9216201648132182519?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/9216201648132182519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=9216201648132182519' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/9216201648132182519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/9216201648132182519'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/02/my-tips-for-speaking.html' title='My tips for speaking'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-3187652033261330564</id><published>2011-02-17T11:21:00.000-08:00</published><updated>2011-02-17T12:40:48.684-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='geek celebrities'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>My Django tutorial at PyCon</title><content type='html'>Working on my tutorial slides for my &lt;a href="http://us.pycon.org/2011"&gt;PyCon&lt;/a&gt; &lt;a href="http://us.pycon.org/2011/schedule/presentations/111/"&gt;class/tutoria&lt;/a&gt;l/&lt;a href="http://pydanny.blogspot.com/2011/02/my-pinax-solutions-class-at-pycon-2011.html"&gt;workshop&lt;/a&gt; last night I suddenly came to a stark realization.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Out of dozens of slides, only 5 of them are Pinax specific.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;o.O&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I think this is because the slides are a condensed version of what the best and brightest in the &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; and &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; community think are good practices and tools. What do I mean?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jacobian.org/"&gt;Jacob Kaplan-Moss&lt;/a&gt; on matching best practices with incredible documentation and tests.&lt;/li&gt;&lt;li&gt;&lt;a href="http://b-list.org/"&gt;James Bennett&lt;/a&gt;&amp;nbsp;on using small apps rather than monolithic ones.&lt;/li&gt;&lt;li&gt;&lt;a href="http://jtauber.com/"&gt;James Tauber&lt;/a&gt; and &lt;a href="http://brianrosner.com/"&gt;Brian Rosner&lt;/a&gt;'s code in &lt;a href="http://pinaxproject.com/"&gt;Pinax&lt;/a&gt; which taught me and so many others incredible Django tricks.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.python.org/dev/peps/pep-0008/"&gt;PEP-8&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.python.org/dev/peps/pep-0020/"&gt;Zen of Python&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://compoundthinking.com/blog/index.php/about/"&gt;Mark Ramm&lt;/a&gt;&amp;nbsp;on well, nearly everything but especially his critical commentaries on Django.&lt;/li&gt;&lt;/ul&gt;So what does this mean?&lt;br /&gt;&lt;br /&gt;Well, I've been rethinking the mantra "Pinax is Django". &amp;nbsp;It is hard to say that when users of &lt;a href="http://django-cms.org/"&gt;django-cms &lt;/a&gt;and &lt;a href="http://satchmoproject.com/"&gt;satchmoproject&lt;/a&gt; and other frameworks can't use core Pinax components. That said, users of those tools tend to rely on same foundation: Python, Django, &lt;a href="http://virtualenv.openplans.org/"&gt;virtualenv&lt;/a&gt;, and &lt;a href="http://pip.openplans.org/"&gt;pip&lt;/a&gt; and growing ecosphere of &lt;a href="http://djangopackages.com/"&gt;Django Packages&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Which leads me to realize that with just 5 slides pertaining to Pinax material in the tutorial, the Pinax Solutions class could be renamed "&lt;b&gt;Django Solutions class with a bit of Pinax&lt;/b&gt;".&lt;br /&gt;&lt;br /&gt;And this makes a lot of sense. Some of the bits that made Pinax special such as static media handling are now part of Django as of the &lt;a href="http://docs.djangoproject.com/en/dev/releases/1.3/#extended-static-files-handling"&gt;forthcoming 1.3 release&lt;/a&gt;. Lessons learned from &lt;a href="https://github.com/pydanny/django-uni-form"&gt;Django Uni-Form&lt;/a&gt; which grew out of supporting div-based forms in Pinax are helping determine the path of forms work in Django 1.4. Which means that if you are using django-cms or other &lt;a href="http://www.djangopackages.com/grids/g/cms/"&gt;CMS&lt;/a&gt;, &lt;a href="http://django-shop.org/"&gt;django-shop&lt;/a&gt; or other &lt;a href="http://www.djangopackages.com/grids/g/ecommerce/"&gt;e-commerce&lt;/a&gt; tools, then you are benefitting from what Pinax has done for the community.&lt;br /&gt;&lt;br /&gt;All of this leads to my closing statements about the class/workshop: The class is about Django with a little bit of Pinax tossed in. Having in the past worked with &lt;a href="http://storymarket.com/"&gt;multiple&lt;/a&gt; &lt;a href="http://science.nasa.gov/"&gt;non-Pinax&lt;/a&gt; &lt;a href="http://cartwheelweb.com/"&gt;projects&lt;/a&gt;, I can assure you that the solutions presented and the workshop itself will be of use to you regardless of if your project is using that framework.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-3187652033261330564?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/3187652033261330564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=3187652033261330564' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/3187652033261330564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/3187652033261330564'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/02/my-django-tutorial-at-pycon.html' title='My Django tutorial at PyCon'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-8605444182726875707</id><published>2011-02-14T09:38:00.000-08:00</published><updated>2011-02-14T09:38:24.784-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pinax'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>My Pinax Solutions class at Pycon 2011</title><content type='html'>Heavily inspired by &lt;a href="http://sheddingbikes.com/posts/1295120282.html"&gt;Zed Shaw's Learn Python the Hard Way&lt;/a&gt; class I'm changing the lecture style format of the &lt;a href="http://us.pycon.org/2011/schedule/presentations/111/"&gt;Pinax Solutions class&lt;/a&gt; at&amp;nbsp;&lt;a href="http://us.pycon.org/2011"&gt;PyCon 2011&lt;/a&gt; to a more workshop-oriented format.&lt;br /&gt;&lt;br /&gt;Which means that the first half of the class we (myself and the &lt;a href="http://us.pycon.org/2011/speaker/profile/143/"&gt;peerless&lt;/a&gt; &lt;a href="http://brianrosner.com/"&gt;Brian&lt;/a&gt; &lt;a href="https://github.com/brosner"&gt;Rosner&lt;/a&gt;) will spend on material critical for people new to &lt;a href="http://pinaxproject.com/"&gt;Pinax&lt;/a&gt;&amp;nbsp;or old hands who want to see what 0.9 offers. That means setting things up via virtualenv and pip, Pinax specific settings, media handling, template layout, extending core Pinax apps, use of &lt;a href="https://github.com/eldarion/idios"&gt;idios to change profiles&lt;/a&gt;, openid/openauth, &lt;a href="http://djangopackages.com/"&gt;Django Packages&lt;/a&gt; to find Pinax approved stuff and more. That will be the foundation and our slides/handouts will be useful as cheat sheets for these critical parts in any &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; application.&lt;br /&gt;&lt;br /&gt;The second half of the&amp;nbsp;class&amp;nbsp;will be a workshop. We'll spend the next half helping people with their personal projects, and will even have a few stock projects we can toss at people that either already are open source or could be released as open source.&amp;nbsp;We won't write your project for you, but we will provide advice, guidance, and some elbow grease in getting things to work.&amp;nbsp;If someone asks for something that we think the rest of the class could benefit from, we'll show them how to do it on the projector and then everyone benefits.&lt;br /&gt;&lt;br /&gt;After the class, I'm free the rest of the day so I'll continue helping people even after the tutorial is officially over. Thursday (March 10th, 2011) after lunch I'll be also available to provide aid and support. &amp;nbsp;Anyone else can join but those who attended the Pinax Solutions tutorial will get precedence.&lt;br /&gt;&lt;br /&gt;During the &lt;a href="http://us.pycon.org/2011/schedule/lists/talks/"&gt;main body of the conference&lt;/a&gt; I'll be attending talks and giving a &lt;a href="http://us.pycon.org/2011/schedule/presentations/56/"&gt;couple&lt;/a&gt; &lt;a href="http://us.pycon.org/2011/schedule/presentations/72/"&gt;myself&lt;/a&gt;&amp;nbsp;so my time to provide aid will likely be completely curtailed.&lt;br /&gt;&lt;br /&gt;I will be there at the &lt;a href="http://us.pycon.org/2011/sprints/"&gt;sprints&lt;/a&gt; working on various &lt;a href="http://github.com/djangopackages/djangopackages"&gt;Pinax&lt;/a&gt; &lt;a href="http://github.com/pydanny/django-uni-form"&gt;and&lt;/a&gt; &lt;a href="http://github.com/pydanny/django-la-facebook"&gt;Django&lt;/a&gt; &lt;a href="http://github.com/pydanny/django-tagging-ext"&gt;projects&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If time permits we'll go over deployment, but I recommend &lt;a href="http://us.pycon.org/2011/schedule/presentations/173/"&gt;Jacob Kaplan-Moss' Python/Django Deployment Workshop&lt;/a&gt; if you want a full treatment of the subject.&lt;br /&gt;&lt;br /&gt;Note I: If you've already signed up for the Pinax Solutions tutorial, you should be getting an email from the PyCon tutorial staff shortly.&lt;br /&gt;&lt;br /&gt;Note II: If you are new to &lt;a href="http://python.org/"&gt;Python&lt;/a&gt;, I recommend that you take any of the &lt;a href="http://us.pycon.org/2011/schedule/presentations/108/"&gt;basic&lt;/a&gt; &lt;a href="http://us.pycon.org/2011/schedule/presentations/99/"&gt;Python&lt;/a&gt; &lt;a href="http://us.pycon.org/2011/schedule/presentations/117/"&gt;tutorials&lt;/a&gt; at PyCon instead of this class.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-8605444182726875707?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/8605444182726875707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=8605444182726875707' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8605444182726875707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8605444182726875707'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/02/my-pinax-solutions-class-at-pycon-2011.html' title='My Pinax Solutions class at Pycon 2011'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-5822787268598409479</id><published>2011-02-12T13:58:00.000-08:00</published><updated>2011-02-12T18:42:37.664-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='NASA science'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><category scheme='http://www.blogger.com/atom/ns#' term='NASA'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>How to sell Python panel at Pycon</title><content type='html'>Do you want to use&amp;nbsp;&lt;a href="http://python.org/"&gt;Python&lt;/a&gt;&amp;nbsp;but are you fighting Fear, Uncertainty, and Doubt (&lt;a href="http://en.wikipedia.org/wiki/Fear,_uncertainty_and_doubt"&gt;FUD&lt;/a&gt;) in your organization? Does any of this sound familiar to you?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Python is just a scripting language.&lt;/li&gt;&lt;li&gt;Python is too new to use in real production environments.&lt;/li&gt;&lt;li&gt;Language X has better benchmarks doing obscure math so it is better for web development.&lt;/li&gt;&lt;li&gt;Python sounds great but we've already spent so much on this expensive tool that does things badly!&lt;/li&gt;&lt;/ul&gt;A lot of people want to use Python, but their customer, management, school, government, or organization won't let them. Python is a great tool, but can be challenging to get in the door. &lt;a href="http://us.pycon.org/2011/schedule/presentations/72/"&gt;This panel&lt;/a&gt; will explore how companies and individuals have successfully introduced Python, what tools are available to sell Python, how to fight the good fight, and what pitfalls there are to avoid.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Panel Questions&lt;/b&gt;&lt;br /&gt;For &lt;a href="http://us.pycon.org/2011/schedule/presentations/72/"&gt;this event at Pycon&lt;/a&gt;&amp;nbsp;I've got some stock questions ready but I want the community at large to&amp;nbsp;&lt;a href="http://goo.gl/mod/5uKk"&gt;suggest some more&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Speakers&lt;/b&gt;&lt;br /&gt;For this panel I choose five speakers from the broad categories of academia, government, commercial organizations, and non-profit who have had a known impact in their organizations:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Academia&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.mmg.msu.edu/brown.html"&gt;C. Titus Brown&lt;/a&gt; is an Open source hacker, Artificial Life/Digital Evolution, B.A. Math (Reed), Earthshine research, Ph.D. Developmental Biology and Regulatory genomics (Caltech), Python testing tools, Python Software Foundation member, Assistant Professor (Michigan State U.) - dev bio, genomics, metagenomics, software engineering.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Note: A lot of my personal understanding on how to do web tests outside of Selenium is thanks to a Pycon tutorial given by Dr. Brown and Grig Gheorghiu back in 2008.&lt;/i&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Government&lt;/b&gt;&lt;br /&gt;Chris Shenton is a partner at &lt;a href="https://koansys.com/"&gt;Koansys LLC&lt;/a&gt;, a consulting company whose clients include US Federal Government agencies, Internet startups, and non-profit organizations. He is a free software and UNIX bigot, advocating for the use of both in organizations large and small. He's been involved with the Washington DC area's &lt;a href="http://meetup.zpugdc.org/"&gt;Python/Zope/Plone user group ZPUGDC&lt;/a&gt; for years, and recently was appointed to its board.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Note: Chris has the dubious honor of introducing me to Python in 2005 and was pivotal in promoting the adoption of Python for use in NASA's &lt;a href="http://science.nasa.gov/"&gt;Science Mission Directorate&lt;/a&gt;.&lt;/i&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Large Business&lt;/b&gt;The Vice President of Engineering at &lt;a href="http://new.evite.com/"&gt;Evite/IAC&lt;/a&gt;, &lt;a href="http://www.linkedin.com/in/danmesh"&gt;Dan Mesh&lt;/a&gt; is the person credited by other Evite staff with bringing Python to life in that business.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;We used Evite for our just passed &lt;a href="http://www.opensourcehackathon.com/"&gt;LA area hackathon&lt;/a&gt; and plan to use it for future events.&lt;/i&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Non-Profit Organizations&lt;/b&gt;&lt;br /&gt;&lt;a href="http://richleland.com/"&gt;Rich Leland&lt;/a&gt; is an Application Architect at National Geographic where he uses Python on a daily basis to work on &lt;a href="http://nationalgeographic.com/"&gt;nationalgeographic.com&lt;/a&gt; and its ecosystem of web sites. He is also the founder of &lt;a href="http://www.meetup.com/django-district/"&gt;django-district&lt;/a&gt;, a group for &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; users in the Washington, DC area. In the past life he worked for &lt;a href="http://dsc.discovery.com/"&gt;Discovery Channel&lt;/a&gt; as Designer and Lead Web Developer.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Small Business&lt;/b&gt;&lt;br /&gt;Frank Wiles is President of &lt;a href="http://www.revsys.com/"&gt;Revolution Systems&lt;/a&gt;, Lawrence, KS. Expert in Internet infrastructure scaling and performance. Primarily focused on Django and PostgreSQL.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Note: I credit Frank with providing me with a great opportunity to work with an &lt;a href="http://www.revsys.com/blog/2011/feb/07/big-secret-project-ive-been-working/"&gt;awesome code base&lt;/a&gt;&amp;nbsp;but also the encouragement and support to get me through my first year as a freelance consultant.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-5822787268598409479?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/5822787268598409479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=5822787268598409479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5822787268598409479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5822787268598409479'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/02/how-to-sell-python-panel-at-pycon.html' title='How to sell Python panel at Pycon'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-8281149477306125834</id><published>2011-01-31T15:11:00.000-08:00</published><updated>2011-01-31T15:12:44.222-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>What I want for Django Facebook connect</title><content type='html'>For a customer I need to do Facebook authentication on a new Django project. I went to the &lt;a href="http://www.djangopackages.com/grids/g/facebook-authentication/"&gt;Django Packages Facebook Authentication Grid&lt;/a&gt; and figured I would plug it in, set some keys, and go! Facebook authentication is a common client requirement, and this must have been solved many times over, right?&lt;br /&gt;&lt;br /&gt;Unfortunately, most (I'm still going through them) of the listed packages worry me. Security is &lt;b&gt;HARD&lt;/b&gt;. Security is &lt;b&gt;DANGEROUS&lt;/b&gt;. Since Facebook auth is a common requirement I shouldn't be forced to roll my own authentication or hack through someone else's implementation to get things working.&lt;br /&gt;&lt;br /&gt;Yet many of the packages listed in the grid above lack documentation or what exists is outdated. Some of them simply drop errors or seem to intentionally obfuscate them (I won't name anyone &lt;b&gt;YET&lt;/b&gt; because I want to give people a chance to correct these issues). Finally, I've yet to find any with any sort of logging to help diagnose possible intrusions or just as a way to see what is happening when you have trouble hooking up things.&lt;br /&gt;&lt;br /&gt;I understand that Facebook is a moving target. But on the other hand, shouldn't updates to these things be in place?&lt;br /&gt;&lt;br /&gt;So what do I want in a Django app that does Facebook authentication?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Documentation that will build on &lt;a href="http://readthedocs.org/"&gt;readthedocs.org&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Use of the logging module for diagnosis.&lt;/li&gt;&lt;li&gt;Sample project with a working example of hitting a dummy app (call it &lt;i&gt;stupid-test-for-pydanny&lt;/i&gt; if you like) on Facebook provided by the project manager.&lt;/li&gt;&lt;li&gt;Proper packaging on PyPI&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;In the spirit of things if your project does this I'm willing to try it out and blog about it. I'm also going to sprint on this issue during &lt;a href="http://cartwheelhackathon.eventbrite.com/"&gt;Saturday's Hackathon at Cartwheel HQ&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-8281149477306125834?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/8281149477306125834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=8281149477306125834' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8281149477306125834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8281149477306125834'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/01/what-i-want-for-django-facebook-connect.html' title='What I want for Django Facebook connect'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-6563833458708622690</id><published>2011-01-25T19:37:00.000-08:00</published><updated>2011-01-25T19:38:47.010-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pinax'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='cartwheel'/><title type='text'>Los Angeles Open Source Hackathon</title><content type='html'>I want to announce the launch of our new company which we've named&amp;nbsp;&lt;a href="http://cartwheelweb.com/"&gt;Cartwheel&lt;/a&gt;! Besides &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; and &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; consulting, our plan is to support local Los Angeles small business, teach classes, and host events. And our first event is a &lt;a href="http://cartwheelhackathon.eventbrite.com/"&gt;Los Angeles Open Source Hackathon&lt;/a&gt; on February 5th! Space is limited so&amp;nbsp;&lt;a href="http://cartwheelhackathon.eventbrite.com/"&gt;RSVP before tickets run out!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Open Source Hackathon at Cartwheel&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A &lt;a href="http://en.wikipedia.com/wiki/Hackathon"&gt;hackathon&lt;/a&gt; (or sprint if we want to be Pythonic) is where a bunch of developers get together to push various projects forward.&lt;br /&gt;&lt;br /&gt;Bring your laptop and work on any open source project that you'd like, as long as it's open source. It can be an existing open source project (e.g. Django, Python) or a new one of your own. Leave the work stuff at work! &lt;br /&gt;&lt;br /&gt;Got an existing project? Hackathons are a great place to share ideas and perhaps find additional contributors. Let me know and I'll put it in an additional blog post.&lt;br /&gt;&lt;br /&gt;New to open source?  A beginning developer? We'll help you get started with open source software development and do our best match you to a project that fits what you want to do.&lt;br /&gt;&lt;br /&gt;Some projects that may be worked on:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Nudge: &lt;a href="http://evite.com/"&gt;Evite's&lt;/a&gt; API tool is being open sourced!&lt;/li&gt;&lt;li&gt;&lt;a href="https://github/djangopackages/djangopackages"&gt;django-packages&lt;/a&gt;: Integration with &lt;a href="https://github.com/eldarion/brabeion"&gt;brabeion&lt;/a&gt; and &lt;a href="http://github.com/djangopackages/djangopackages"&gt;bugfixes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://github/pydanny/django-uni-form"&gt;django-uni-form&lt;/a&gt; FormWizard integration, documentation cleanup&lt;/li&gt;&lt;li&gt;&lt;a href="http://pinaxproject.com/"&gt;Pinax&lt;/a&gt; &lt;a href="http://github.com/pydanny/django-tagging-ext"&gt;django-tagging-rst&lt;/a&gt; &lt;a href="http://pypi.python.org/pypi/django-tagging-ext/0.3.1"&gt;0.3.1&lt;/a&gt; integration&lt;/li&gt;&lt;li&gt;&lt;a href="http://github.com/toastdriven/tastypie"&gt;tastypie&lt;/a&gt; adding &lt;a href="http://en.wikipedia.org/wiki/Oauth"&gt;oauth&lt;/a&gt; for authentication&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://pydanny.blogspot.com/2011/01/los-angeles-open-source-hackathon.html"&gt;Please RSVP as soon as possible&lt;/a&gt;. The $10 ($11.54 with fee) ticket price covers breakfast, lunch, and dinner.  Costs are partially subsidized by Cartwheel.  We hope you can join us!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-6563833458708622690?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/6563833458708622690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=6563833458708622690' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6563833458708622690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6563833458708622690'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/01/los-angeles-open-source-hackathon.html' title='Los Angeles Open Source Hackathon'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-2809921930446984147</id><published>2011-01-20T09:31:00.000-08:00</published><updated>2011-01-20T10:43:23.356-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pyramid'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>Why you should go to Pycon</title><content type='html'>&lt;b&gt;Because you are new to Python&lt;/b&gt;&lt;br /&gt;If you want to get better at &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; then &lt;a href="http://us.pycon.org/"&gt;Pycon&lt;/a&gt; is one of the better avenues to learn. Think of it as a nine day data dump of Pythonic knowledge straight to your brain!&lt;br /&gt;&lt;br /&gt;When it comes to the &lt;a href="http://us.pycon.org/2011/schedule/sessions/99/"&gt;fundamentals&lt;/a&gt; of Python, the &lt;a href="http://us.pycon.org/2011/schedule/sessions/117/"&gt;tutorials&lt;/a&gt; are a &lt;a href="http://us.pycon.org/2011/schedule/sessions/118/"&gt;great&lt;/a&gt; &lt;a href="http://us.pycon.org/2011/schedule/sessions/111/"&gt;way&lt;/a&gt; to &lt;a href="http://us.pycon.org/2011/schedule/sessions/219/"&gt;hit&lt;/a&gt; &lt;a href="http://us.pycon.org/2011/schedule/sessions/32/"&gt;the&lt;/a&gt; &lt;a href="http://us.pycon.org/2011/schedule/sessions/108/"&gt;ground&lt;/a&gt; &lt;a href="http://us.pycon.org/2011/schedule/sessions/242/"&gt;running&lt;/a&gt;. How do you think I learned? Also, there are &lt;a href="http://us.pycon.org/2011/schedule/lists/talks/"&gt;dozens of beginner talks&lt;/a&gt; designed to introduce you what highly qualified people think you should be doing. Finally, the &lt;a href="http://us.pycon.org/2011/sprints/"&gt;sprints&lt;/a&gt; are a great way to work with real experts for days - because even the most advanced projects needs people to knock out the invariable score of simple bugs, do documentation and write additional tests.&lt;br /&gt;&lt;br /&gt;Also, Zed Shaw is going to teach his Learning Python the Hard Way tutorial &lt;a href="http://sheddingbikes.com/posts/1295120282.html"&gt;throughout the conference&lt;/a&gt;. (follow that link!) To summarize, besides going over his lessons and some basic conference coaching, he's going to take his class to conference talks and then bring them back to apply what was learned. He won't be doing it alone either - a number of other python folk are going to volunteer their time to help, and I'm going to be one of them.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Because you are old to Python&lt;/b&gt;&lt;br /&gt;A &lt;a href="http://us.pycon.org/2011/schedule/sessions/47/"&gt;good&lt;/a&gt; &lt;a href="http://us.pycon.org/2011/schedule/sessions/122/"&gt;chunk&lt;/a&gt; of the &lt;a href="http://us.pycon.org/2011/schedule/sessions/141/"&gt;tutorials&lt;/a&gt; are &lt;a href="http://us.pycon.org/2011/schedule/sessions/144/"&gt;designed&lt;/a&gt; &lt;a href="http://us.pycon.org/2011/schedule/sessions/161/"&gt;specifically&lt;/a&gt; for &lt;a href="http://us.pycon.org/2011/schedule/sessions/164/"&gt;experienced&lt;/a&gt; &lt;a href="http://us.pycon.org/2011/schedule/sessions/274/"&gt;Pythonistas&lt;/a&gt; &lt;a href="http://us.pycon.org/2011/schedule/sessions/187/"&gt;wishing&lt;/a&gt; to &lt;a href="http://www.blogger.com/"&gt;&lt;span id="goog_1045069554"&gt;&lt;/span&gt;expand&lt;span id="goog_1045069555"&gt;&lt;/span&gt;&lt;/a&gt; &lt;a href="http://us.pycon.org/2011/schedule/sessions/64/"&gt;their&lt;/a&gt; &lt;a href="http://us.pycon.org/2011/schedule/sessions/219/"&gt;knowledge&lt;/a&gt; (OMG &lt;a href="http://us.pycon.org/2011/schedule/sessions/259/"&gt;Raymond&lt;/a&gt; &lt;a href="http://us.pycon.org/2011/schedule/sessions/260/"&gt;Hettinger&lt;/a&gt;). And then as we all know the conference itself has scores of advanced talks designed to challenge you. Finally, what better place to work on your favorite project or get people to work on your project then the massive Pycon&amp;nbsp;&lt;a href="http://us.pycon.org/2011/sprints/"&gt;sprints&lt;/a&gt;&amp;nbsp;?&lt;br /&gt;&lt;br /&gt;Want to do Python related technology full-time? What better place to look then where amazing &lt;a href="http://us.pycon.org/2011/sponsors/prospectus/"&gt;companies and organizations&lt;/a&gt;&amp;nbsp;hang out with the intention of hiring people? And invariably some of those hiring groups will be hosting parties too...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Because you are recruiting&lt;/b&gt;&lt;br /&gt;Looking for good staff to do Python, &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt;, &lt;a href="http://plone.org/"&gt;Plone&lt;/a&gt;, &lt;a href="http://docs.pylonsproject.org/"&gt;Pyramid&lt;/a&gt;, &lt;a href="http://wxpython.org/"&gt;wxPython&lt;/a&gt;, NoSQL, Linux admin, Unix admin, BSD admin, Windows admin, Science, or Engineering work? Pycon will be where 1500 of the best and brightest people on the planet will hang out for over a week and some of them will be interested in new opportunities. &lt;a href="http://us.pycon.org/2011/sponsors/prospectus/"&gt;Sponsorship&lt;/a&gt; is a great way to get yourself noticed by hundreds of Pythonistas.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Because it is cheap&lt;/b&gt;&lt;br /&gt;Until January 25th Pycon registration is at its early bird prices. Even when it goes up it is still a pretty good deal. Admittedly the biggest expense is the hotel ($159/night) but there are decent and much cheaper hotels ($80/night last I checked) within a few blocks of the conference.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-2809921930446984147?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/2809921930446984147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=2809921930446984147' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2809921930446984147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2809921930446984147'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/01/why-you-should-go-to-pycon.html' title='Why you should go to Pycon'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-4945713879947031200</id><published>2011-01-15T08:13:00.000-08:00</published><updated>2011-01-15T17:56:32.925-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='mongodb'/><title type='text'>January Mongo LA conference</title><content type='html'>Back in the mid-1990s my professional software development career started in &lt;a href="http://en.wikipedia.org/wiki/Relational_database"&gt;relational databases&lt;/a&gt;. Periodically though I interacted with &lt;a href="http://en.wikipedia.org/wiki/NoSQL"&gt;NoSQL&lt;/a&gt; databases. In 1999 I heard about &lt;a href="http://en.wikipedia.org/wiki/ObjectStore"&gt;ObjectStore&lt;/a&gt;. In 2003 I played with a few &lt;a href="http://en.wikipedia.org/wiki/XML_database"&gt;XML databases&lt;/a&gt;. With XML databases of the time, I found all you got out of them was a lot of complexity bolted onto a SQL based system. In 2006 I was introduced to &lt;a href="http://en.wikipedia.org/wiki/ZODB"&gt;ZODB&lt;/a&gt;, the &lt;a href="http://en.wikipedia.org/wiki/Zope"&gt;Zope&lt;/a&gt; stack's object oriented database. ZODB has some fascinating traits, but the hard schemas used by &lt;a href="http://plone.org/"&gt;Plone&lt;/a&gt; and Zope made it as rigid/stable as SQL systems but without as many useful tools. In 2008 I played a bit with Google's &lt;a href="http://en.wikipedia.org/wiki/BigTable"&gt;BigTable&lt;/a&gt; via appengine, where my impression was that of a relational database without indexes.&lt;br /&gt;&lt;br /&gt;Since then, a lot of new NoSQL solutions that have embraced the idea of schema-less architectures have presented themselves. I've glanced at them but until recently nothing on my plate really justified their use and taking the time to learn how to use them. Recently I've come across a project that justifies the whole &lt;a href="http://en.wikipedia.org/wiki/Nosql#Document_store"&gt;document store&lt;/a&gt; approach used in systems like &lt;a href="http://en.wikipedia.org/wiki/MongoDB"&gt;MongoDB&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/CouchDB"&gt;CouchDB&lt;/a&gt;, and others. However, because users of NoSQL tend to be such heavy &lt;a href="http://en.wikipedia.org/wiki/Drinking_the_Kool-Aid"&gt;kool-aid&lt;/a&gt; drinkers, I've been a bit shy.&lt;br /&gt;&lt;br /&gt;Well, last night &lt;a href="http://mediatemple.net/"&gt;Media Temple&lt;/a&gt; laid out an awesome spread for &lt;a href="http://www.10gen.com/conferences/mongola2011"&gt;Mongo Los Angeles&lt;/a&gt;. The agenda was clearly a kool-aid fountain of information, but at least they weren't trying to sell me a timeshare, right? Plus, it gave me a chance to hang with awesome &lt;a href="http://python.org/"&gt;python&lt;/a&gt; folk like &lt;a href="http://www.audreymroy.com/"&gt;Audrey Roy&lt;/a&gt; and &lt;a href="http://twitter.com/unbracketed"&gt;Brian Luft&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Most of the talks were will implemented, I've picked out two presentations out for being just plain well done:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Building your first MongoDB Application&lt;/b&gt;&lt;br /&gt;Antoine Girbal delivered a talk that was a great, elegant introduction to MongoDB. In thirty minutes he gave a solid introduction to why Mongo was created, how the data is structured, how to call data, how to index it, and more. And yet it didn't feel like a firehose of information. This is how it should be done for any introduction to any open source project. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Beyond Logging: Using MongoDB to Power a Private Social Network&lt;/b&gt;&lt;br /&gt;This was the pièce de résistance of the evening, a presentation on mating MongoDB with an existing relational database design. It was incredibly informative and demonstrated that with a bit of moderation and discipline you can make the very difficult rather easy. Plus the presenter, Justin Jenkins educates via &lt;a href="http://learnmongo.com/"&gt;learnmongo.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Have I drunk the kool-aid?&lt;/b&gt;&lt;br /&gt;So what did I get out of these introductory talks? Well, it appears that MongoDB is exactly what I need for an upcoming &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; project. The downside is that if I use MongoDB for all the persistence for this Django project then I lose the chief advantage of working with Django. I'm not talking about the admin and ORM themselves cause I know django-nonrel and mongoengine exists, I'm talking about the &lt;a href="http://www.djangopackages.com/"&gt;multitude of efforts&lt;/a&gt; that support the relational database roots of Django.&lt;br /&gt;&lt;br /&gt;Also, this project involves quite a bit of information best stored in a relational database. Not everything is a document! And I know from a lot of experience that trying to fit a spiffy square peg into a round hole is dangerous.&amp;nbsp;So what I'll probably do is use PostGreSQL for the accounting information and user management. The documents will be stored in MongoDB, with one of the indexes for said documents being on the username attribute of each document.&lt;br /&gt;&lt;br /&gt;Simplicity itself, right?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-4945713879947031200?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/4945713879947031200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=4945713879947031200' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4945713879947031200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4945713879947031200'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/01/january-mongo-la-conference.html' title='January Mongo LA conference'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-2043243815350507951</id><published>2011-01-10T18:18:00.000-08:00</published><updated>2011-01-15T17:57:11.397-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pinax'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>Pinax Tutorial at Pycon 2011</title><content type='html'>Tutorial Name: &lt;a href="http://us.pycon.org/2011/schedule/sessions/111/"&gt;Pinax Solutions at Pycon 2011&lt;/a&gt;&amp;nbsp;(March 9th)&lt;br /&gt;&lt;br /&gt;This year I am yet again part of a two man team providing instruction on &lt;a href="http://pinaxproject.com/"&gt;Pinax&lt;/a&gt; at &lt;a href="http://us.pycon.org/2011/home"&gt;Pycon&lt;/a&gt;. Last year's &lt;a href="http://us.pycon.org/2010/tutorials/greenfeld_pinax/"&gt;Long Pinax Tutorial&lt;/a&gt; went well, with &lt;a href="http://pydanny.com/"&gt;myself&lt;/a&gt; and &lt;a href="http://jtauber.com/"&gt;James Tauber&lt;/a&gt;&amp;nbsp;receiving&amp;nbsp;a lot of positive feedback plus some really good constructive criticism.&lt;br /&gt;&lt;br /&gt;Based off that criticism and our own experiences since last year's tutorial we decided to make some changes, specifically we wanted our class to be very solutions focused. Think of it as an organized brain dump of how best to start a project, leverage in the Pinax framework plus the rest of the &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; &lt;a href="http://djangopackages.com/"&gt;ecosphere&lt;/a&gt; to do all that tedious make work we so dislike. Using these tools will let you focus on your project's unique attributes, meaning you get to focus on all the fun stuff!&lt;br /&gt;&lt;br /&gt;Another big change to the class is that &lt;a href="http://brianrosner.com/"&gt;Brian Rosner&lt;/a&gt; will be taking over in James' place as co-presenter (last year he was instrumental in reviewing the content of the class). Brian is a &lt;a href="http://docs.djangoproject.com/en/1.1/internals/committers/#core-developers"&gt;Django core committer&lt;/a&gt;, a &lt;a href="https://github.com/pinax"&gt;Pinax core developer&lt;/a&gt;, the tech lead of &lt;a href="http://eldarion.com/"&gt;Eldarion&lt;/a&gt;, and the steward of &lt;a href="http://gondor.io/"&gt;Gondor&lt;/a&gt;. If you like how the current Django admin works, you can thank him for his hard work. Even if he didn't have those credentials, Brian is a great speaker and really patient with questions. He started me on &lt;a href="http://git-scm.org/"&gt;git&lt;/a&gt; back back at &lt;a href="http://us.pycon.org/2009/about/"&gt;Pycon 2009&lt;/a&gt; and has been kind to me the times I've screwed things up in git ever since.&lt;br /&gt;&lt;br /&gt;The course itself will go over the &lt;a href="http://pinaxproject.com/docs/dev/"&gt;0.9 series of Pinax&lt;/a&gt;. You'll need a laptop with &lt;a href="http://www.python.org/download/"&gt;Python 2.6+&lt;/a&gt; installed (Python 3.x won't work in Django). You should be familiar with Django and Python.&lt;br /&gt;&lt;br /&gt;See you there!&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://us.pycon.org/" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;img alt="PyCon 2011, Atlanta, March 9-17" src="http://us.pycon.org/2011/site_media/static/img/badges/pycon-badge-400x120.png" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-2043243815350507951?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/2043243815350507951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=2043243815350507951' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2043243815350507951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2043243815350507951'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/01/pinax-tutorial-at-pycon-2011.html' title='Pinax Tutorial at Pycon 2011'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-2619599212368468377</id><published>2011-01-06T11:17:00.000-08:00</published><updated>2011-01-06T12:15:42.568-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><title type='text'>I don't work in a vacuum</title><content type='html'>Not too long ago I wrote a blog rant called '&lt;a href="http://pydanny.blogspot.com/2010/12/stupid-template-languages.html"&gt;Stupid Template Languages&lt;/a&gt;'. I suspected I was setting off a firestorm, but I have to admit I didn't quite expect to have the singular honor of having both &lt;a href="http://lucumr.pocoo.org/2010/12/5/not-so-stupid-template-languages/"&gt;Armin Ronacher&lt;/a&gt; and &lt;a href="http://techspot.zzzeek.org/2010/12/04/in-response-to-stupid-template-languages/"&gt;Mike Bayer&lt;/a&gt; respond to me in their own blogs. As one might say, "Danny, you really stepped into it."&lt;br /&gt;&lt;br /&gt;My initial response to their entries was to start writing another post that would refute what they said point-by-point. However, while the tone in my original post was somewhat confrontational, the problem is that I didn't want to turn the debate into a sordid affair with drawn sides. You see, I've long respected both Mike and Armin as developers and people. Even if I didn't care about them, all it would do is stir up angry retaliations and steer people away from good tools. So I &lt;a href="http://pydanny.blogspot.com/2010/12/reactions-to-stupid-template-languages.html"&gt;linked to their responses&lt;/a&gt;,&amp;nbsp;let it go, and I hope we can drink over the issue this year at &lt;a href="http://us.pycon.org/2011/home/"&gt;Pycon&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;However, if we step away from the tools, the real problem I was addressing in my post was this:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;I don't work in a vacuum&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Any tool has the potential for misuse. As &lt;a href="http://alexgaynor.net/"&gt;Alex Gaynor&lt;/a&gt; pointed out in &lt;a href="http://djangodose.com/podcasts/community-catchup/episode/32/"&gt;Django Dose&lt;/a&gt;, he is familiar with the poorly crafted system which was part of the reason why I wrote 'Stupid Template Languages'. Heck, anyone reading this blog has probably run into one of those nightmarish system created by others that we have to maintain, and many of us will sheepishly admit to having been the author of such systems.&lt;br /&gt;&lt;br /&gt;When you create a system like that you are making things harder for others to contribute and enhance. Trivial tasks become monumental and the desire to post your sad story to &lt;a href="http://thedailywtf.com/"&gt;The Daily WTF&lt;/a&gt; becomes very strong.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Don't work in a vacuum&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There are the well-documented methods called 'best practices' that us programmers ought to follow in order to make our work more maintainable. &amp;nbsp;In the general programming world, patterns like &lt;a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller"&gt;Model-View-Controller&lt;/a&gt; (MVC) is a common way to break up pieces of a project into predictable components. In the &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; world, we generally follow a set of standards called '&lt;a href="http://www.python.org/dev/peps/pep-0008/"&gt;pep-8&lt;/a&gt;' for writing our code. Various groups and organizations often have additional standards for naming, tests, and documentation styles.&lt;br /&gt;&lt;br /&gt;Standards can be created without wisdom or consideration for real-world issues. Too many tests and documentation can eat up time on a project and cause interminable delays; there are horror stories about developers writing pages of non-technical material in order to produce a single line of working code.&lt;br /&gt;&lt;br /&gt;Following these methods and doing so with wisdom is like striving for a &lt;a href="http://en.wikipedia.org/wiki/Theory_of_forms"&gt;platonic ideal&lt;/a&gt;. It is both gratifying and time consuming to reach for perfection - and this perfection is fleeting because of the shifting requirements of clients, operating systems, and tool changes. To attempt to reach for this helps a person be considered a good developer, but doesn't guarantee that they are actually good.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Breaking the rules&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Sometimes you have to abandon best practices. Sometimes the tool at hand makes it hard to perform a task without breaking the rules. In the python world a good example is&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Monkey-patching"&gt;monkey-patching&lt;/a&gt;, which we do with trepidation. In the relational database world, people with a deep understanding of&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Database_normalization"&gt;normalization&lt;/a&gt;&amp;nbsp;will sometimes indulge in&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Denormalization"&gt;de-normalization&lt;/a&gt;&amp;nbsp;in order to boost performance.&lt;br /&gt;&lt;br /&gt;Unlike best practices, there is no platonic ideal that clearly states when breaking the rules is a good thing. Ever seen a database created by a developer without any knowledge of normalization who smugly says their database is better because it started off de-normalized? How many of us have seen views where control and persistence is integrally embedded? Or where views are embedded in control code?&lt;br /&gt;&lt;br /&gt;In regards to the debate that triggered this post, I've read the following phrase a few times as an argument against my rant: "We're all consenting adults here".&lt;br /&gt;&lt;br /&gt;Does that mean we can do what we want? That we can write spaghetti code?&lt;br /&gt;&lt;br /&gt;Certainly most people reading this post will know that statement generally refers to variable handling in Python, not the right to sunder the rules of good coding practices. Yet I've seen people use that as a mantra to ignore any sense of good coding practices for python related projects. Which meant that the level of effort to maintain and expand those projects increased at the same rapid rate that the bus factor decreased.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I'll just throw out some well known platitudes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Code like you aren't in a vacuum.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Break the rules only when you have a concrete reason.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Learn to take criticism well.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-2619599212368468377?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/2619599212368468377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=2619599212368468377' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2619599212368468377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2619599212368468377'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2011/01/i-dont-work-in-vacuum.html' title='I don&apos;t work in a vacuum'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-7044169482243057180</id><published>2010-12-30T22:04:00.000-08:00</published><updated>2011-12-27T18:31:26.161-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='djangocon'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><category scheme='http://www.blogger.com/atom/ns#' term='holidays'/><title type='text'>Resolutions for 2011</title><content type='html'>&lt;ul&gt;&lt;li&gt;Travel to Europe again.&lt;/li&gt;&lt;li&gt;Travel to Asia or Africa.&lt;/li&gt;&lt;li&gt;Visit a Disney park.&lt;/li&gt;&lt;li&gt;&lt;strike&gt;See a place in the USA I've never been.&lt;/strike&gt;&lt;/li&gt;&lt;li&gt;Drop the waist size 2 inches and not break any bones.&lt;/li&gt;&lt;li&gt;&lt;strike&gt;Go to Pycon and present or teach.&lt;/strike&gt;&lt;/li&gt;&lt;li&gt;&lt;strike&gt;Go to DjangoCon and present or teach.&lt;/strike&gt;&lt;/li&gt;&lt;li&gt;&lt;strike&gt;Present at LA Django&lt;/strike&gt;&lt;/li&gt;&lt;li&gt;&lt;strike&gt;Continue my Muay Thai and Capoeira studies&lt;/strike&gt;, get back into Eskrima, learn some more BJJ, and &lt;strike&gt;practice the forms I know.&lt;/strike&gt;&lt;/li&gt;&lt;li&gt;Work out at least three times a week.&lt;/li&gt;&lt;li&gt;Go back east and teach martial arts for a day.&lt;/li&gt;&lt;li&gt;&lt;strike&gt;Finish some outstanding legal proceedings.&lt;/strike&gt;&lt;/li&gt;&lt;li&gt;&lt;strike&gt;Launch a site that does cool stuff and somehow brings in money.&lt;/strike&gt;&lt;/li&gt;&lt;li&gt;Get to the point with LISP where I can do cool stuff in it without needing a textbook.&lt;/li&gt;&lt;li&gt;Blog once a week. That is at least 52 blog entries!&lt;/li&gt;&lt;li&gt;&lt;strike&gt;Explain why I wrote &lt;a href="http://pydanny.blogspot.com/2010/02/pycon-2010-report-i.html"&gt;Diversity Rocks&lt;/a&gt;.&lt;/strike&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-7044169482243057180?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/7044169482243057180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=7044169482243057180' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/7044169482243057180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/7044169482243057180'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/12/resolutions-for-2011.html' title='Resolutions for 2011'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-4791698885447451781</id><published>2010-12-30T13:52:00.000-08:00</published><updated>2010-12-30T13:52:16.304-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pinax'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='health'/><category scheme='http://www.blogger.com/atom/ns#' term='friends'/><category scheme='http://www.blogger.com/atom/ns#' term='cycling'/><category scheme='http://www.blogger.com/atom/ns#' term='nova-django'/><category scheme='http://www.blogger.com/atom/ns#' term='finances'/><category scheme='http://www.blogger.com/atom/ns#' term='martial arts'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='family'/><category scheme='http://www.blogger.com/atom/ns#' term='kid'/><category scheme='http://www.blogger.com/atom/ns#' term='NASA'/><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Recap of 2010</title><content type='html'>This has been an unforgettable year. I can't believe all this stuff happened. I've moved many times, met wonderful people, and seen my life change in ways I could have never predicted.&lt;br /&gt;&lt;br /&gt;The good:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Met a whole new bunch of wonderful people - relationships to last a lifetime. Arthur, Audrey, Celso,&amp;nbsp;Cody, Daniel, Jacob, Jeff, Lahn, Moriah, Skyler, Todd and others I'm certainly forgetting to my undying shame. Thanks for your awesomeness!&lt;/li&gt;&lt;li&gt;&lt;a href="http://us.pycon.org/2010/conference/schedule/event/15/"&gt;Presented&lt;/a&gt; and &lt;a href="http://us.pycon.org/2010/tutorials/greenfeld_pinax/"&gt;taught&lt;/a&gt; at &lt;a href="http://us.pycon.org/2010/"&gt;Pycon 2010&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Had a blast in the &lt;a href="http://www.flickr.com/photos/pydanny/tags/dcsnow2010/"&gt;blizzard of 2010&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Prepped my house of 9 years for sale and sold it.&lt;/li&gt;&lt;li&gt;Paid off my debts. I sleep so much better now.&lt;/li&gt;&lt;li&gt;Left NASA after 5 years and 3 months for freelancing pastures. Thanks &lt;a href="http://eldarion.com/"&gt;Eldarion LLC&lt;/a&gt;, &lt;a href="http://www.revsys.com/"&gt;Revsys LLC&lt;/a&gt;, &lt;a href="http://holdenweb.com/"&gt;Holdenweb LLC&lt;/a&gt;, and Bryan Klein. Being exposed to some of the incredible code and developers on these projects has made me a better developer. Show me more!&lt;/li&gt;&lt;li&gt;Flew enough in the spring to put me ahead of notorious traveller James Tauber for about 2 months in sheer mileage accumulated.&lt;/li&gt;&lt;li&gt;Got to &lt;a href="http://www.flickr.com/photos/pydanny/4441466409/in/set-72157623641835532/"&gt;reconnect&lt;/a&gt;&amp;nbsp;with&amp;nbsp;a cousin and met his &lt;a href="http://www.flickr.com/photos/pydanny/4548945816/in/set-72157623923236848/"&gt;lovely wife and handsome son&lt;/a&gt;. Also hung out with my &lt;a href="http://www.flickr.com/photos/pydanny/4641382158/"&gt;Uncle Al&lt;/a&gt; and Aunt Sandra.&lt;/li&gt;&lt;li&gt;Got a tour of &lt;a href="http://www.flickr.com/photos/pydanny/4548946090/in/set-72157623923236848/"&gt;Ames Research Center&lt;/a&gt; thanks to &lt;a href="http://www.flickr.com/photos/pydanny/4548310913/in/set-72157623923236848/"&gt;Michael Sims&lt;/a&gt;. He'll probably be presenting at Pycon!&lt;/li&gt;&lt;li&gt;Attended another &lt;a href="http://www.flickr.com/photos/pydanny/4548945328/in/set-72157623923236848/"&gt;NASA wedding by Mark and Ariel&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Took a &lt;a href="http://www.flickr.com/photos/pydanny/sets/72157624048647087/"&gt;cruise to Mexico&lt;/a&gt; on a &lt;a href="http://en.wikipedia.org/wiki/Carnival_Splendor"&gt;ship that caught fire&lt;/a&gt; just months later.&lt;/li&gt;&lt;li&gt;Said goodbye to Virginia and moved to &lt;a href="http://en.wikipedia.org/wiki/Lawrence,_Kansas"&gt;Lawrence, Kansas&lt;/a&gt;&amp;nbsp;to run with the unicorns and 5 months later to &lt;a href="http://en.wikipedia.org/wiki/Los_Angeles,_California"&gt;Los Angeles, California&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Road tripped across the Western half of the country! Twice! Spent 3 days in &lt;a href="http://en.wikipedia.org/wiki/Las_Vegas,_Nevada"&gt;Las Vegas&lt;/a&gt; over Halloween!&lt;/li&gt;&lt;li&gt;Learned fundamentals of &lt;a href="http://en.wikipedia.org/wiki/Capoeira"&gt;Capoeira&lt;/a&gt; from Celso Wills. Wish I could learn more from him. :(&lt;/li&gt;&lt;li&gt;Learned how to drive and bought my first car.&lt;/li&gt;&lt;li&gt;Worked on another course for&amp;nbsp;&lt;a href="http://holdenweb.com/"&gt;Holdenweb LLC&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Launched &lt;a href="http://djangopackages.com/"&gt;Django Packages&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Presented at &lt;a href="http://djangocon.us/schedule/sessions/20/"&gt;DjangoCon 2010&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Started &lt;a href="http://en.wikipedia.org/wiki/Muay_Thai"&gt;Muay Thai&lt;/a&gt; classes in Los Angeles. I've done quite a bit of it, but these were the first regular classes I've had in about 16 years.&lt;/li&gt;&lt;li&gt;Brought my son to Los Angeles so I could spend a week with him for the first time in 15 months.&lt;/li&gt;&lt;li&gt;Almost up to 7 years without a broken bone!&lt;/li&gt;&lt;li&gt;Worked another year in &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; related technologies.&lt;/li&gt;&lt;li&gt;Started learning &lt;a href="http://landoflisp.com/"&gt;LISP&lt;/a&gt; and played a lot more with &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt; (especially &lt;a href="http://jquery.com/"&gt;JQuery&lt;/a&gt; and &lt;a href="http://jqueryui.com/"&gt;JQuery UI&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;The bad:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Left my students in Virginia. The &lt;a href="http://www.flickr.com/photos/pydanny/4600104174/in/set-72157624043210674/"&gt;young ones were especially hard to let go&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Had to say goodbye to friends in the DC area. Some people I'll miss are Alex, Beth, Brandon, Chris, Dave, Daye, Eric, Jim, Joe, Katie, Muhammed, Pilar, Rich, Renee, Ron, Sarah, Sebastion, Shawn, Steve, and Whitney. I know I'm missing some names!&lt;/li&gt;&lt;li&gt;I'm far from all my immediate family: Carla, Ciana, Dad, Doug, Michele, Midori, Mom, Seth, and Timiri.&lt;/li&gt;&lt;li&gt;Watched &lt;a href="http://www.meetup.com/nova-django"&gt;NOVA Django&lt;/a&gt; falter after I left the DC area.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Had to wait 15 months between spending more than a day or so with my son.&lt;/li&gt;&lt;li&gt;Didn't really practice much Eskrima all year.&lt;/li&gt;&lt;li&gt;Didn't blog enough. Last year I blogged almost twice as much!&lt;/li&gt;&lt;li&gt;Frustratingly, haven't been able to finish &lt;b&gt;something&lt;/b&gt; that prevents me from writing about certain things. Yes, this is quite vague, and my hope is to clarify it in a few weeks.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-4791698885447451781?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/4791698885447451781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=4791698885447451781' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4791698885447451781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4791698885447451781'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/12/recap-of-2010.html' title='Recap of 2010'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-251788144967455577</id><published>2010-12-30T13:12:00.000-08:00</published><updated>2010-12-30T13:56:29.763-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='djangocon'/><category scheme='http://www.blogger.com/atom/ns#' term='martial arts'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><category scheme='http://www.blogger.com/atom/ns#' term='friends'/><category scheme='http://www.blogger.com/atom/ns#' term='family'/><title type='text'>2010 Resolution Summary</title><content type='html'>Items that are crossed out are completed.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;s&gt;Sell the house, pay off the remainders of my debts, and get my own place to stay. And get a car too.&lt;/s&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;s&gt;Travel to another country.&lt;/s&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Take my son to another country.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Drop the waist size 2 inches &lt;s&gt;and not break any bones&lt;/s&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;s&gt;Go to an amusement park, visit the beach, and also see a part of the USA I've never been.&lt;/s&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;s&gt;Do more educational work for Python related technologies&lt;/s&gt;, and that includes getting the Django Education Foundation really rolling forwards.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;T&lt;s&gt;hrow away at least half my current stuff. I don't have much stuff now, and I want even less. Also, If I don't use or interact with any one of my non-book remaining possessions by 2011, I'm throwing it away.&lt;/s&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Move my blog to my own system and blog at least once a week.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Get a mountain bike and have reasons to use it.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Get back into Eskrima, focus more on BJJ, &lt;s&gt;get into Capoeira.&lt;/s&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Hire a maid. I'm not messy, but I want someone to do the fine tuning of my place.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Go to &lt;s&gt;Pycon&lt;/s&gt;, &lt;s&gt;DjangoCon&lt;/s&gt;, and a new conference.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Have a beer with &lt;s&gt;Thomas&lt;/s&gt;, &lt;s&gt;Andy&lt;/s&gt;, Andy, Tony, Garrick, Bernd, and the rest of Ye Aulde Gange.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-251788144967455577?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/251788144967455577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=251788144967455577' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/251788144967455577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/251788144967455577'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/12/2010-resolution-summary.html' title='2010 Resolution Summary'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-1516485317765093461</id><published>2010-12-06T05:50:00.000-08:00</published><updated>2010-12-06T05:50:04.483-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Reactions to "Stupid Template Languages"</title><content type='html'>My blog post on &lt;a href="http://pydanny.blogspot.com/2010/12/stupid-template-languages.html"&gt;Stupid Template Languages&lt;/a&gt;&amp;nbsp;has had some excellently crafted responses by&amp;nbsp;&lt;a href="http://lucumr.pocoo.org/about/"&gt;Armin Ronacher&lt;/a&gt;,&amp;nbsp;&lt;a href="http://techspot.zzzeek.org/"&gt;Mike Baye&lt;/a&gt;r, and&amp;nbsp;&lt;a href="http://holdenweb.blogspot.com/"&gt;Steve Holden&lt;/a&gt;.&amp;nbsp;I respect and admire each of these developers, and their combined projects have made a real impact on my career. I'm happy that our community is large enough to have a difference of opinion, delighted that our base language of &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; allows us the power to play with different options so easily, and hope that we can debate our differences of opinion this year at &lt;a href="http://us.pycon.org/"&gt;PyCon&lt;/a&gt;. The first round of drinks are on me!&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://lucumr.pocoo.org/2010/12/5/not-so-stupid-template-languages/"&gt;Response&lt;/a&gt; of&amp;nbsp;Armin Ronacher, creator of &lt;a href="http://jinja.pocoo.org/"&gt;Jinja2&lt;/a&gt; and &lt;a href="http://lucumr.pocoo.org/projects/"&gt;other projects&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://techspot.zzzeek.org/2010/12/04/in-response-to-stupid-template-languages/"&gt;Response&lt;/a&gt; of&amp;nbsp;Mike Bayer, creator of &lt;a href="http://www.makotemplates.org/"&gt;Mako&lt;/a&gt; and &lt;a href="http://sqlalchemy.org/"&gt;SQL Alchemy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://holdenweb.blogspot.com/2010/12/templating-systems.html"&gt;Response&lt;/a&gt; of&amp;nbsp;Steve Holden, &lt;a href="http://www.python.org/psf/"&gt;Chairman of the Python Software Foundation&lt;/a&gt; and creator of PyCon&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-1516485317765093461?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/1516485317765093461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=1516485317765093461' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/1516485317765093461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/1516485317765093461'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/12/reactions-to-stupid-template-languages.html' title='Reactions to &quot;Stupid Template Languages&quot;'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-4398893616175764487</id><published>2010-12-03T05:57:00.000-08:00</published><updated>2011-01-08T07:21:40.430-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>Stupid Template Languages</title><content type='html'>For years I've been absolutely certain that I really prefer stupid template languages any time I'm generating HTML. The less the template language can do the better. Since I spend most of my time coding in &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; you might assume this applies just to Python, but I think it also applies to anything where you have the power to readily mix HTML generation and code.&lt;br /&gt;&lt;br /&gt;The biggest annoyance I have with smart template languages (&lt;a href="http://www.makotemplates.org/"&gt;Mako&lt;/a&gt;, &lt;a href="http://genshi.edgewall.org/"&gt;Genshi&lt;/a&gt;, &lt;a href="http://jinja.pocoo.org/"&gt;Jinja2&lt;/a&gt;, &lt;a href="http://php.org/"&gt;PHP&lt;/a&gt;, &lt;a href="http://www.perl.org/"&gt;Perl&lt;/a&gt;,&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/ColdFusion"&gt;ColdFusion&lt;/a&gt;,&amp;nbsp;etc) is that you have the capability to mix core business logic with your end views, hence violating the rules of Model-View-Controller architecture. While the web can be hard to match to MVC, in general you aren't supposed to do that sort of thing.&amp;nbsp;I've made the mistake of putting core logic in the wrong places in the past, but I'm proud to say I've gotten good at avoiding that particular mistake.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;I don't work in a vacuum.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I often work on projects crafted by others, some who decided for arcane/brilliant/idiotic reasons to mix the&amp;nbsp;kernel&amp;nbsp;of their applications in template function/macros. This is only possible in Smart Template Languages! If they were using a Stupid Template Language they would have been forced put their kernel code in a Python file where it applies, not in a template that was supposed to just render HTML or XML or plain text.&lt;br /&gt;&lt;br /&gt;What it comes down to is that Smart Template Languages designers assume that developers are smart enough to avoid making this mistake. Stupid Template Languages designers assume that developers generally lack the discipline to avoid creating horrific atrocities that because of unnecessary complexity have a bus factor of 1.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So what is a Smart Template Language?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;/b&gt;In my own vernacular, template languages that let you write functions/macros are what I call a &lt;b&gt;Smart Template Language&lt;/b&gt;. Some of them are brilliantly executed, the example of Jinja2 comes to mind, but invariably I suffer through abuse of its Macro control structure as implemented by others.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Misery Cubed a.k.a. Genius Template Languages&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Next comes&amp;nbsp;&lt;b&gt;Genius Template Languages&lt;/b&gt;, which take things a step further. These template languages allow you to not only define functions/macros, but also let you embed unrestricted Python (or &lt;a href="http://www.ruby-lang.org/en/"&gt;Java&lt;/a&gt; or &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; or whatever) in the template. This 'feature' lets you code your entire application in the templates! &amp;nbsp;In the Python world what comes to mind is Mako and Genshi, but I'm sure there are many other tools with this 'capability'.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;I like Stupid Template Languages!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;Stupid Template Languages don't let you define functions/macros. They don't let you embed Python code. They barely let you define variables and often have simplistic control architectures.&lt;br /&gt;&lt;br /&gt;For Django efforts, which is about 70% of my work, I like the &lt;a href="http://docs.djangoproject.com/en/dev/topics/templates/"&gt;Django Template Language&lt;/a&gt; (DTL). Since it is used by a huge community, there are a ton of useful apps which have it as a dependency. Switching away from it would mean cutting myself off from a &lt;a href="http://djangopackages.com/"&gt;large ecosphere of tools&lt;/a&gt;&amp;nbsp;I can use to not reinvent the wheel.&lt;br /&gt;&lt;br /&gt;Back in my &lt;a href="http://bluebream.zope.org/"&gt;Zope&lt;/a&gt;/&lt;a href="http://plone.org/"&gt;Plone&lt;/a&gt; days I really, really enjoyed the &lt;a href="http://en.wikipedia.org/wiki/Template_Attribute_Language"&gt;Template Attribute Language&lt;/a&gt; (TAL) because it was stupid too. If I needed an XML generation template language and could import it easily I might consider using it again, or perhaps &lt;a href="http://chameleon.repoze.org/docs/latest/zpt.html"&gt;Chameleon&lt;/a&gt;, which is a new, improved version . The downside is that they come paired with another tool paired with it, METAL, which gave it macros. My own experience with METAL is that it was all too easy to do what we developers do with Smart Template Languages.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;But DTL and TAL are slow!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;So what?&lt;br /&gt;&lt;br /&gt;If you want to boost your performance, first try caching. There are a ton of tools you can use, with &lt;a href="http://www.varnish-cache.org/"&gt;Varnish&lt;/a&gt; being one I keep seeing in action. Read the docs on your favorite web framework's caching engine and apply what you learn. And Djangonauts should read up on &lt;a href="http://www.slideshare.net/mmalone/scaling-django-1393282"&gt;Mike Malone&lt;/a&gt; as much as possible.&lt;br /&gt;&lt;br /&gt;If after all that the site still delivers slow content and it appears to be a template language issue, then identify the bottleneck content and consider alternatives for that one portion. My favorite response is a bit of &lt;a href="http://en.wikipedia.org/wiki/AJAX"&gt;AJAX&lt;/a&gt;. Use your framework to render the content as &lt;a href="http://en.wikipedia.org/wiki/JSON"&gt;JSON&lt;/a&gt; and have &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt; parse it into legible content, a task which &lt;a href="http://en.wikipedia.org/wiki/JQuery"&gt;JQuery&lt;/a&gt; makes trivial.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-4398893616175764487?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/4398893616175764487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=4398893616175764487' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4398893616175764487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4398893616175764487'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/12/stupid-template-languages.html' title='Stupid Template Languages'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-5627665793797602128</id><published>2010-11-06T15:26:00.000-07:00</published><updated>2010-11-06T15:26:48.275-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django packages'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>Release classifiers in distutils/pypi</title><content type='html'>Thanks to &lt;a href="http://dougma.com/"&gt;Doug Napoleone&lt;/a&gt; I'm now aware there is already a convention followed for the &lt;a href="http://python.org"&gt;python&lt;/a&gt; and framework versions, but it appears that not enough people are aware of it. This post is pretty much a &lt;a href="https://www.blogger.com/comment.g?blogID=4477131926658044957&amp;amp;postID=7921310865600322429"&gt;reposting of the second comment of the post immediately preceding this one&lt;/a&gt; and Doug gets full credit for this post. I'm just repeating his message:&lt;br /&gt;&lt;br /&gt;The release classifiers in this post should be included in the standard distutils documentation. For the moment, you can see the full list of classifiers here:&lt;br /&gt;&lt;a href="http://pypi.python.org/pypi?%3Aaction=list_classifiers"&gt;http://pypi.python.org/pypi?%3Aaction=list_classifiers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For the python language version the classifier is:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Programming Language :: Python :: x.y.z&lt;/blockquote&gt;&lt;br /&gt;With each version on it's own line. That way you can browse the repository by python version (see the bottom of the page):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pypi.python.org/pypi?:action=browse&amp;amp;c=214"&gt;http://pypi.python.org/pypi?:action=browse&amp;amp;c=214&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There is also support for frameworks which you can see on that page as well. There it is done with:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Framework :: Django :: x.y.z&lt;/blockquote&gt;&lt;br /&gt;There is Zope, Plone, and a number of other frameworks already there.&lt;br /&gt;&lt;br /&gt;In the example you gave the proper, and supported way of writing the metadata is:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Programming Language :: Python&lt;br /&gt;Programming Language :: Python :: 2.4&lt;br /&gt;Programming Language :: Python :: 2.5&lt;br /&gt;Programming Language :: Python :: 2.6&lt;br /&gt;Programming Language :: Python :: 2.7&lt;br /&gt;Framework :: Django&lt;br /&gt;Framework :: Django :: 0.96&lt;br /&gt;Framework :: Django :: 1.0&lt;br /&gt;Framework :: Django :: 1.1&lt;br /&gt;Framework :: Django :: 1.2.1&lt;br /&gt;Framework :: Django :: 1.3&lt;/blockquote&gt;&lt;br /&gt;Now it becomes a matter of education and illumination. This should be in the standard distutils documentation and arguably the home page of PyPI (or easily found there). And &lt;a href="http://djangopackages.com"&gt;Django Packages&lt;/a&gt; will be supporting this functionality in the near future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-5627665793797602128?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/5627665793797602128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=5627665793797602128' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5627665793797602128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5627665793797602128'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/11/release-classifiers-in-distutilspypi.html' title='Release classifiers in distutils/pypi'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-7921310865600322429</id><published>2010-11-06T12:34:00.000-07:00</published><updated>2010-11-06T13:31:20.059-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django packages'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>A request for new pypi classifiers</title><content type='html'>This request is to help enhance &lt;a href="http://djangopackages.com/"&gt;Django Packages&lt;/a&gt;, &lt;a href="http://code.activestate.com/pypm/"&gt;PyPM Index&lt;/a&gt;, and other projects. This would also help the Python community at large.&lt;br /&gt;&lt;br /&gt;Would it be possible that a standard be established for listing in &lt;a href="http://pypi.python.org/pypi"&gt;PyPI&lt;/a&gt; &lt;a href="http://docs.python.org/distutils/setupscript.html#additional-meta-data"&gt;classifiers&lt;/a&gt; which versions of a package is known to operate? Using &lt;a href="http://b-list.org/"&gt;James Bennett&lt;/a&gt;'s django-registration at &lt;a href="http://pypi.python.org/pypi/django-registration"&gt;http://pypi.python.org/pypi/django-registration&lt;/a&gt; as an example (see my bolded, last two lines to understand what I'm trying to demonstrate):&lt;br /&gt;&lt;blockquote&gt;Development Status :: 5 - Production/Stable&lt;br /&gt;Environment :: Web Environment&lt;br /&gt;Framework :: Django&lt;br /&gt;Intended Audience :: Developers&lt;br /&gt;License :: OSI Approved :: BSD License&lt;br /&gt;Operating System :: OS Independent&lt;br /&gt;Programming Language :: Python&lt;br /&gt;Topic :: Utilities&lt;br /&gt;&lt;b&gt;Python Versions :: 2.4, 2.5, 2.6, 2.7&lt;br /&gt;Django Versions :: 0.96, 1.0, 1.1, 1.2.1, 1.3&lt;/b&gt;&lt;/blockquote&gt;The metadata system I'm writing about in this blog post is &lt;a href="http://docs.python.org/distutils/setupscript.html#additional-meta-data"&gt;specified on the distutils documentation page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I picked a Django package but this could be for Zope, Pyramid, PyQT, or anything.&lt;br /&gt;&lt;br /&gt;If we had something like this in place then people could quickly identify on PyPI and other resources if a tool can be of use to&amp;nbsp;them or if it needs to be updated to the latest code base. If this already exists, then can someone point me at the existing specification so I can promote it?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Edit: &lt;/b&gt;&lt;a href="https://coderanger.net/"&gt;Noah Kantrowitz&lt;/a&gt; suggested I take a look at the 'requires' keyword which is part of the distutils spec. However, this does not show up in the PyPI API (&lt;a href="http://wiki.python.org/moin/PyPiXmlRpc"&gt;http://wiki.python.org/moin/PyPiXmlRpc&lt;/a&gt;) and so doesn't fit our needs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-7921310865600322429?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/7921310865600322429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=7921310865600322429' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/7921310865600322429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/7921310865600322429'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/11/request-for-new-pypi-classifiers.html' title='A request for new pypi classifiers'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-4368382390511025787</id><published>2010-09-21T19:16:00.000-07:00</published><updated>2010-09-21T21:06:08.335-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='djangocon'/><category scheme='http://www.blogger.com/atom/ns#' term='django packages'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>DjangoCon 2010 report I</title><content type='html'>The conference was like a family gathering except without any oddly weird uncles. To my utmost embarrassment I got overwhelmed a few times and forgot names of people I respect and admire.&lt;br /&gt;&lt;br /&gt;If I went through people I got to touch base with, I would have to list three digits worth of people and play favorites. That just ain't me, so I'm just going to say everyone there was awesome and I hope to see you again at Pycon!&lt;br /&gt;&lt;br /&gt;Alright then, some reporting:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Django Software Foundation Panel&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Russel Keith-Magee, the new DSF president hosted a panel with Ben Slavin, Sean O'Conner, Jeremy Dunck, and myself. Russ went over plans for DSF finances and the hopeful creation of a DSF ecosphere of applications.&lt;br /&gt;&lt;br /&gt;My own contribution was talking a little about Django Packages, and bit more about "Why Django". &lt;br /&gt;&lt;br /&gt;Why Django, or maybe one day "Enterprise Djangoproject" is an advocacy site for Django targeted not to developers but to decision makers. It is a work in progress, we are collecting case studies and articles, and building out the site. &lt;br /&gt;&lt;br /&gt;Ben Slavin then challenged me about the code and data. Other Django community projects like djangoapps and djangosites are closed source efforts without an API and this causes problems for the community. If a site goes down or is unmaintained then the community loses.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;I agree.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So I promised that for these Django community projects the code is public, APIs were being made to support people fetching data from them at any time, and I'm trying to figure out how to do data dumps without handing out even salted passwords. Furthermore, I would give full access to these sites and servers behind them to those that Russell appointing to the position of being watchdog.&lt;br /&gt;&lt;br /&gt;And I'm working on that promise. Django Packages now has an API and a BDFL has server access to Django Packages. Why Django is still a work in progress, so things are still in flux. I'll post updates to my promise of openness.&lt;br /&gt;&lt;br /&gt;Furthermore, I challenge anyone who puts together a site useful to the community, be it a new version of Django Apps or Django Sites to follow my own promise. By all means maintain and work your project, but be willing to publish all data and keep your code under an open source license. Also provide access to whom the DSF president appoints so that others can provide maintenance for your site.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;Eric Florenzano's Keynote&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Eric Florenzano gave the keynote on What Sucks about Django (and how we can fix it). He did a very good job of it. Watch his talk. It has some amazingly telling points.&lt;br /&gt;&lt;br /&gt;Anyways, I'm challenging for Eric to eat his own dogfood. The only people I saw Eric talk to were the same people he is always around and conferences. How many times did he go up to a person he didn't recognize and start talking to them? How many new people did he meet at DjangoCon 2010?&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;Portland Views, Food, and Beer&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On Saturday, as a break, I went with Eric Holscher, Ben Firschman, and Andrew Godwin to the park around the Portland zoo. Below you can see where a lady pointed out that we could see mountains 50 and 150 miles away. That left three geeks speechless while &lt;br /&gt;Ben Firschman captured the moment. This picture is Ben's and all rights belong to him.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm5.static.flickr.com/4150/4980586085_7c97a7d080_d.jpg" style="margin-left: 1em; margin-right: 1em;" /&gt;&lt;br /&gt;&lt;br /&gt;And then I had my action shot taken by Ben. Again, all rights to him.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://farm5.static.flickr.com/4107/4980587017_51b9224e79_d.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://farm5.static.flickr.com/4107/4980587017_51b9224e79_d.jpg" width="211" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I just have to say that Ben is an amazing photographer and I'm honored to be in a few of his pictures of DjangoCon. In addition to that he presented on class based views in Django, which I plan to blog about as well as incorporate into Django Packages in the near future.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Edit:&lt;/b&gt; Blogspot is acting really oddly which is why I took out the linking and other things.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Edit II:&amp;nbsp;&lt;/b&gt;Eric&amp;nbsp;&lt;a href="http://pydanny.blogspot.com/2010/09/djangocon-2010-report-i.html?showComment=1285127097356#c135230163972552928"&gt;ate his own dog food&lt;/a&gt;. Awesome!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-4368382390511025787?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/4368382390511025787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=4368382390511025787' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4368382390511025787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4368382390511025787'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/09/djangocon-2010-report-i.html' title='DjangoCon 2010 report I'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-2893877833826866723</id><published>2010-08-28T17:11:00.000-07:00</published><updated>2010-08-28T17:11:39.449-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django packages'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>New features for Django Packages</title><content type='html'>Since the &lt;a href="http://djangodash.com/"&gt;Django Dash&lt;/a&gt; ended, the Django Packages team has been working to add new features and close out bugs.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;"I Use This" added&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Since we only want hard metrics on this site, we incorporated an "I Use This" button on the packages. This is so you can identify which packages you use. Please don't press this button for packages that you like, only the ones that are part of your coding efforts.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Added BitBucket support&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We are still working out some of the kinks for coming up with stats from &lt;a href="http://bitbucket.org/"&gt;BitBucket&lt;/a&gt;. Most of the data we collect is fetched via the API, but a little is scraped off individual project pages.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Cache the commits&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Originally the commit history was &amp;nbsp;fetched live. But &lt;a href="http://github.com/"&gt;Github&lt;/a&gt; only provides the last 35 commits and BitBucket limits you to the last 50 commits. So now we store the commit history and update it nightly. Which means that the sooner you post your packages the better your commit history will look on Django Packages.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Rebuilt the package updater&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Limitations on how many API calls you can make against Github (60 a minute) meant that we had to write some fun code to get around that problem. I think the problem is solved now, but I'm worried I might get to eat my words.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Added a help section&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As much as we wanted a completely intuitive site, this will hopefully make it easier for people to figure out how to participate on the site.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Package Add/Edit form refactor&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We completely rebuilt the Package add/edit form to make it easier to add packages. So far the response has been entirely positive.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Page cleanup and CSS Reset&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We've been slowly cleaning up the HTML and resetting the CSS. Everything is looking prettier. Our goal is to make things more readable, so a lot of the changes are subtle.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Email verification works&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It works, and now you get an email to confirm your account.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-2893877833826866723?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/2893877833826866723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=2893877833826866723' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2893877833826866723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2893877833826866723'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/08/new-features-for-django-packages.html' title='New features for Django Packages'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-7161231420639998397</id><published>2010-08-21T09:22:00.000-07:00</published><updated>2010-08-28T17:12:25.095-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='djangodash'/><category scheme='http://www.blogger.com/atom/ns#' term='django packages'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='sprint'/><title type='text'>Django Dash Lessons Learned</title><content type='html'>Our experience with &lt;a href="http://djangodash.com/"&gt;Django Dash 2010&lt;/a&gt; was that it was an wonderful exercise in classic &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; development, &lt;a href="http://en.wikipedia.org/wiki/Cowboy_coding"&gt;cowboy/cowgirl coding&lt;/a&gt;, and drinking copious amounts of &lt;a href="http://en.wikipedia.org/wiki/Caffeine"&gt;caffeinated&lt;/a&gt; beverages. The result, &lt;a href="http://djangopackages.com/"&gt;Django Packages&lt;/a&gt;, is something we are happy with, are&amp;nbsp;continuing&amp;nbsp;to improve, and hope will improve the community.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lesson: Fixtures are a must&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Django gives you this amazing &lt;a href="http://docs.djangoproject.com/en/dev/ref/contrib/admin/"&gt;Admin control panel&lt;/a&gt;. As soon as you get your models in place and are entering test data, start creating fixtures. For the dash we named them initial_data.json and loaded them into the individual app directories. This meant that every time we blew away the database we got a reload with records in place. Sometimes this means you have to hand-edit &lt;a href="http://en.wikipedia.org/wiki/JSON"&gt;JSON&lt;/a&gt; (or &lt;a href="http://en.wikipedia.org/wiki/YAML"&gt;YAML&lt;/a&gt; if you swing that way), but the alternative is to waste time re-entering the same data again and again. Don't forget to change the names of your test fixtures before you launch!&lt;br /&gt;&lt;br /&gt;From the command-line how to save a fixture pydanny-style:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-bsh"&gt;./manage.py dumpdata package &amp;gt; apps/packages/fixtures/initial_data.json&lt;/pre&gt;&lt;br /&gt;One nice thing about fixtures is that when you do have the time/need, you can use them to help you write tests. And it makes development easier for contributors.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lesson: Research ahead of time&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In the days before the contest, we researched to see if our target repos (&lt;a href="http://github.com/"&gt;Github&lt;/a&gt;, ;&lt;a href="http://bitbucket.org/" &gt;BitBucket&lt;/a&gt;, and&amp;nbsp;&lt;a href="http://code.google.com/"&gt;Google Project Hosting&lt;/a&gt;) each had an API and a python library to speak to that API. Github has both an API and python library, Bitbucket has an API but no library. And as far as we can tell, Google Project Hosting lacks both API and library (&lt;i&gt;someone please tell me I'm wrong about Google Project Hosting lacking an API&lt;/i&gt;).&lt;br /&gt;&lt;br /&gt;This meant that when we commenced coding we knew which code base to work with - we weren't trying to look up this or that random package.&lt;br /&gt;&lt;br /&gt;We did the same thing for rendering charts.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lesson: Get it working then optimize&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Looking at some of the code makes us wince a bit.&amp;nbsp;&lt;i&gt;But we got it working.&lt;/i&gt;&amp;nbsp;Now we can go back and do some code cleanup, maybe use an&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454" style="color: #b4445c;"&gt;XML parser instead of regex&lt;/a&gt;&amp;nbsp;to try to scrape content from PyPI, and generally feel better about ourselves.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lesson: Plan out system architecture in advance&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In retrospect it was really amusing, but the night of launch the site was serving via the Django runserver command. We were so dead tired and neither of us are crack system administrators that we did what we had to do to score the contest launch point. The next day &lt;a href="http://audreyr.posterous.com//"&gt;Audrey&lt;/a&gt; got the site running under&lt;a href="http://httpd.apache.org/"&gt;Apache&lt;/a&gt;, and next week we'll be giving someone else system access to increase reliability. Next year for the contest we'll probably use&amp;nbsp;&lt;a href="http://djangopackages.com/grids/g/webserver/"&gt;something like this&lt;/a&gt;&amp;nbsp;or get&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Continuous_integration" style="color: #b4445c;"&gt;continuous integration&lt;/a&gt;&amp;nbsp;running in the first hour.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lesson: Don't be afraid to chat with others after the contest starts&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Share your ideas, selected packages and frameworks with your competitors. The break from coding helps clear the mind and they might counter with a better idea/package/framework you can use.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-7161231420639998397?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/7161231420639998397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=7161231420639998397' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/7161231420639998397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/7161231420639998397'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/08/django-dash-lessons-learned.html' title='Django Dash Lessons Learned'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-6711485069175840217</id><published>2010-08-17T07:30:00.000-07:00</published><updated>2011-12-15T10:58:28.635-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='djangodash'/><category scheme='http://www.blogger.com/atom/ns#' term='django packages'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='sprint'/><title type='text'>Announcing Django Packages!</title><content type='html'>I'm part of a &lt;a href="http://djangodash.com/teams/scared-of-rabbits/"&gt;two person team&lt;/a&gt; that just launched that BETA site for &lt;a href="http://djangopackages.com/"&gt;http://djangopackages.com&lt;/a&gt;, a site that is designed to list all the &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; Applications, Frameworks, and Packages created by the Django community. While there are already a few places to look for these things, it is quite easy to argue that they are challenging to navigate, don't give any hard metrics, or are woefully incomplete/unstable/closed. Our goal was to provide an attractive, easy-to-navigate, easy-to-add-data, stable site and share it with the world.&lt;br /&gt;&lt;br /&gt;Also, this was our entry into &lt;a href="http://djangodash.com/"&gt;Django Dash 2010&lt;/a&gt;, and was the culmination of a few days of brainstorming over paper, a lot of research, and two days of feverish coding/designing. The project was feature complete to our specifications at 5pm the second day, and the rest of the time was spent adding in UI tweaks, usability enhancements, and trying to deploy our creation.&lt;br /&gt;&lt;br /&gt;Since then, we've cleaned up a the UI, improved the design, and got the site stable. The &lt;a href="http://github.com/opencomparison/opencomparison"&gt;code is open source and on github,&lt;/a&gt; so fork and contribute!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Design Consideration: No 'Like' button or 'Rate my app' rating systems&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We wanted hard metrics. So the package numbers are pulled from the repo sites such as &lt;a href="http://github.com/"&gt;Github&lt;/a&gt;, &lt;a href="http://bitbucket.com/"&gt;Bitbucket&lt;/a&gt;, and &lt;a href="http://code.google.com/hosting/"&gt;Google Code&lt;/a&gt;. Otherwise things get weighted funny. Sure, this system can be monkeyed with, but its a good metric for now. We've had suggestions from Django core developers of coming up with a quality check system, things like &lt;a href="http://pypants.org/"&gt;pypants&lt;/a&gt;&amp;nbsp;and/or a formalized approval system.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Design Consideration: Grids&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Early on we wanted to duplicate and improve upon the &lt;a href="http://code.djangoproject.com/wiki/CMSAppsComparison"&gt;Django CMS Comparison&lt;/a&gt;&amp;nbsp;page. There is also a version for &lt;a href="http://code.djangoproject.com/wiki/ForumAppsComparison"&gt;Forums&lt;/a&gt;, but it would be nice to have a &lt;a href="http://pydanny.blogspot.com/2009/04/show-me-your-open-source-django-blog.html"&gt;current one for blogs&lt;/a&gt;! In addition,&amp;nbsp;recently I heard that 't&lt;i&gt;ag clouds are the mullets of web 2.0&lt;/i&gt;'. This really struck a chord in my soul. Since we had metrics on packages, why not compare those metrics, and use those comparisons, which we call 'grids', instead of tags? In fact, we extended our idea and instead of traditional tabs we use grids in the top navigation area as seen below:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_KEFU5_uGRyw/TGok9P6U5BI/AAAAAAAAAw4/KOlaapAL6ZE/s1600/Screen+shot+2010-08-17+at+12.57.44+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="92" src="http://1.bp.blogspot.com/_KEFU5_uGRyw/TGok9P6U5BI/AAAAAAAAAw4/KOlaapAL6ZE/s320/Screen+shot+2010-08-17+at+12.57.44+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Design Consideration: Categories&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The site groups packages into three categories, '&lt;b&gt;Apps&lt;/b&gt;' which are individual django applications. '&lt;b&gt;Frameworks&lt;/b&gt;' which are aggregates of apps and python modules. And '&lt;b&gt;Projects&lt;/b&gt;' which are implementations of Apps and Frameworks. We've thought about adding '&lt;b&gt;Tools&lt;/b&gt;' but weren't sure if there was anything that fit that concept, and we are leery about allowing regular &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; efforts into the fold.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Design Consideration: Regex vs XML&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Slurping data out of Github was easy, especially since I used &lt;a href="http://github.com/pydanny/python-github2"&gt;python-github2&lt;/a&gt;. Bitbucket has a RESTful API as well that serves out JSON. I think Google Code does as well. &lt;a href="http://pypi.python.org/"&gt;PyPI&lt;/a&gt; does not and DOAP on PyPI seems to give little that is useful, so I was forced to do screen scrapes of version numbers and downloads. I'm much faster with Regex and string methods than XML juggling, and speed was of the issue this weekend. I'm not sure what benefit there is to redoing it in HTML5lib or lxml, since what I have works and appears to be stable.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Design Consideration: Leave caching and optimization for later&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Besides a tiny bit of memory based template caching on the home page, there is/was no optimization. In time I plan to cache many things using a proper key/value store like &lt;a href="http://code.google.com/p/redis/"&gt;redis&lt;/a&gt; or &lt;a href="http://memcached.org/"&gt;memcached&lt;/a&gt;. Perhaps not before more design and usability work is done.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Why scared of rabbits?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You wouldn't understand unless you live on the Kansas prairie.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note&lt;/b&gt;: if you have any suggestions, issues, problems with Django Packages please use our &lt;a href="http://github.com/opencomparison/opencomparison/issues"&gt;issue tracker&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-6711485069175840217?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/6711485069175840217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=6711485069175840217' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6711485069175840217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6711485069175840217'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/08/announcing-django-packages.html' title='Announcing Django Packages!'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KEFU5_uGRyw/TGok9P6U5BI/AAAAAAAAAw4/KOlaapAL6ZE/s72-c/Screen+shot+2010-08-17+at+12.57.44+AM.png' height='72' width='72'/><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-8243853095782643576</id><published>2010-08-08T12:04:00.000-07:00</published><updated>2010-08-08T12:05:13.860-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='djangocon'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>More reasons to go to DjangoCon!</title><content type='html'>I was thinking some more about &lt;a href="http://djangocon.us/"&gt;DjangoCon&lt;/a&gt; next month.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Capoeira"&gt;Capoeira&lt;/a&gt; - &lt;/b&gt;I'm known for doing &lt;a href="http://www.flickr.com/photos/pydanny/3913799572/"&gt;one&lt;/a&gt;-&lt;a href="http://www.flickr.com/photos/pydanny/4388349921/"&gt;handed&lt;/a&gt; &lt;a href="http://www.flickr.com/photos/pydanny/4442245488/"&gt;cartwheels&lt;/a&gt;. But at last year's DjangoCon I got a chance to &lt;a href="http://www.vimeo.com/6802099"&gt;try my hand at Capoeira&lt;/a&gt;. Since then I've managed to get in some actual regular &lt;a href="http://meetup.com/beribazu"&gt;&lt;span id="goog_2118772256"&gt;&lt;/span&gt;Capoeira&lt;span id="goog_2118772257"&gt;&lt;/span&gt;&lt;/a&gt; training. My hope is to tag up with &lt;a href="http://oregoncapoeiraraca.com/"&gt;Oregon Capoeira&lt;/a&gt; and see how my &lt;a href="http://en.wikipedia.org/wiki/Capoeira#Capoeira_angola"&gt;Angola&lt;/a&gt; matches their &lt;a href="http://en.wikipedia.org/wiki/Capoeira#Capoeira_regional"&gt;Regional&lt;/a&gt;. Even if you've never done a cartwheel, it should still be a blast to try out!&lt;br /&gt;&lt;br /&gt;Okay, now on to listing some more talks I'm looking forward to having at the conference:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://djangocon.us/schedule/sessions/19/"&gt;Why Django sucks and how we can fix it&lt;/a&gt; - While &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; is the king of &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; web framewrks,&amp;nbsp;&lt;a href="http://www.eflorenzano.com/"&gt;Eric Florenzano&lt;/a&gt;&amp;nbsp;is going to slam it hard. But he isn't going to just troll the conference, he's also going to provide us some possible solutions. The best thing of all, is that since Django is open source, we can all contribute to make it better!&lt;/li&gt;&lt;li&gt;&lt;a href="http://djangocon.us/schedule/sessions/11/"&gt;Pony Pwning&lt;/a&gt; - Django is a nicely secure framework thanks to the security focus of the community, but &lt;a href="http://djangocon.us/speaker/profile/29/"&gt;Adam Baldwin&lt;/a&gt;&amp;nbsp;shows us how as developers we can make&amp;nbsp;compromising&amp;nbsp;mistakes. If you want to avoid being caught with your pants down on a day where you didn't wear clean underwear, go to this talk!&lt;/li&gt;&lt;li&gt;&lt;a href="http://djangocon.us/schedule/sessions/16/"&gt;State of Pinax&lt;/a&gt;&amp;nbsp;- &lt;a href="http://pinaxprojects.com/"&gt;Pinax&lt;/a&gt; is a platform for rapidly building websites in Django that I've made contributions to off-and-on since about December 2008. Heck, my talks and &lt;a href="http://us.pycon.org/2010/tutorials/greenfeld_pinax/"&gt;tutorial&lt;/a&gt; at DjangoCon and&amp;nbsp;&lt;a href="http://us.pycon.org/2010/conference/schedule/event/15/"&gt;Pycon&lt;/a&gt;&amp;nbsp;were about Pinax! Anyway, &lt;a href="http://oebfare.com/"&gt;Brian Rosner&lt;/a&gt;, arguably &lt;a href="http://www.flickr.com/photos/kcunning/3903211229/in/faves-pydanny/"&gt;the second tallest man in the Pinax community&lt;/a&gt;&amp;nbsp;is going to tell us the past, present, and future of this incredible tool set.&lt;/li&gt;&lt;li&gt;&lt;a href="http://djangocon.us/schedule/sessions/18/"&gt;From Slice to Site: Django in 30 minutes&lt;/a&gt; - Tired of hearing about how its easier to deploy a &amp;lt;insert-competing-but-sucky-language&amp;gt; site? &lt;a href="http://elephantangelchild.blogspot.com/"&gt;Katie Cunningham&lt;/a&gt;&amp;nbsp;of &lt;a href="http://science.nasa.gov/"&gt;NASA SMD&lt;/a&gt; fame is going to show you how you can do it fast and easy. A great beginner talk from someone skilled at speaking and educating!&lt;/li&gt;&lt;li&gt;&lt;a href="http://djangocon.us/schedule/sessions/20/"&gt;How to sell Django&lt;/a&gt; - So your trying to convince the customer/boss that Django is the way to go. But they read somewhere that XML + Shell scripts is how to build an application used by millions or talk to a well-dressed salesperson selling&amp;nbsp;&lt;a href="http://www.coboloncogs.org/"&gt;antiquated/broken technology&lt;/a&gt;. How do you get past this issue? Well, I'm hosting a panel on how to convince the people who sign the checks that Django is the way to go. I've got &lt;a href="http://holdenweb.com/"&gt;Steve Holden&lt;/a&gt;, J&lt;a href="http://jtauber.com/"&gt;ames Tauber&lt;/a&gt;, and either &lt;a href="http://jacobian.org/"&gt;Jacob Kaplan-Moss&lt;/a&gt; or &lt;a href="http://www.frankwiles.com/"&gt;Frank Wiles&lt;/a&gt;, plus another person to discuss this on a panel.&lt;/li&gt;&lt;li&gt;&lt;a href="http://djangocon.us/schedule/sessions/32/"&gt;Large Problems in Django, Mostly Solved&lt;/a&gt; - Unfortunately scheduled at the same time as my own talk, my good friend &lt;a href="http://ericholscher.com/"&gt;Eric Holscher&lt;/a&gt; is giving a talk on some of the best applications written for Django. These are tools that solve a lot of problems for you. Ever wonder what is the best REST application? How to do proper searches? Migrate data? Also, want to make your pet application endorsed by the Django ecosphere? Then attend this talk!&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-8243853095782643576?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/8243853095782643576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=8243853095782643576' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8243853095782643576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8243853095782643576'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/08/more-reasons-to-go-to-djangocon.html' title='More reasons to go to DjangoCon!'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-1215953842166926100</id><published>2010-08-06T18:21:00.000-07:00</published><updated>2010-08-08T11:19:30.608-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='djangocon'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Getting excited about DjangoCon US!</title><content type='html'>&lt;a href="http://djangocon.us/"&gt;Djangocon&lt;/a&gt; starts in just a month. I'm looking forward to this event because of so many reasons. Lets go over some of them!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Friends -&amp;nbsp;&lt;/b&gt;I'll get to meet with old friends and make new ones. Rather than list names I'm going to mark a sheet of paper with the alphabet and check off letters as I meet/make a friend with the first name that matches an unmarked letter. Which makes me wonder if their is a &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; app for that in the making...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Portland&lt;/b&gt; - Great food and awesome beer at cheap prices. The wonderful thing about Portland is that the base ingredients are really good. I found I liked the simpler/cheaper things there more than fancy foods. The food carts alone are worth visiting the city.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Oregon State - &lt;/b&gt;It is a beautiful state and since words can't do justice here is an image:&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://farm3.static.flickr.com/2656/3897946209_386ea300bc_m_d.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://farm3.static.flickr.com/2656/3897946209_386ea300bc_m_d.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Me at Mutnomah falls!&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;&amp;nbsp;The conference schedule rocks! - &lt;/b&gt;The talks they lined up all look really good. They range from the basics to the advanced, and include things that go beyond the technical. Some of my favorite picks from &lt;b&gt;just&lt;/b&gt; the first day:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://djangocon.us/schedule/sessions/3/"&gt;Typewar: A Case Study&lt;/a&gt; - &lt;a href="http://jtauber.com/"&gt;James Tauber&lt;/a&gt; is an incredible speaker, not to mention the founder of &lt;a href="http://pinaxproject.com/"&gt;Pinax&lt;/a&gt; and the CEO of &lt;a href="http://eldarion.com/"&gt;Eldarion&lt;/a&gt;. His talks are best served live. Typewar is an interesting game but the story of its inception and maintenance is a gem for anyone looking to see how the masters do it.&lt;/li&gt;&lt;li&gt;&lt;a href="http://djangocon.us/schedule/sessions/5/"&gt;So you want to be a core developer?&lt;/a&gt; - &lt;a href="http://cecinestpasun.com/"&gt;Russel Keith-Magee&lt;/a&gt;, a core developer, lets us know what we need to know and do to work on Django core. He got approved for &lt;b&gt;three &lt;/b&gt;talks so you know he has to kick butt as a speaker.&lt;/li&gt;&lt;li&gt;&lt;a href="http://djangocon.us/schedule/sessions/7/"&gt;Maps of Imaginary Lands&lt;/a&gt; - &lt;a href="http://djangocon.us/speaker/profile/58/"&gt;Malcom Tredennick&lt;/a&gt;, another core developer, shows how to use &lt;a href="http://docs.djangoproject.com/en/dev/ref/contrib/gis/"&gt;django.contrib.gis&lt;/a&gt; to set up fancy maps of non-existant places. One day I'll have to do this for a place I created in my youth, a place called 'Dannyland'. Anyway, Malcom also has&amp;nbsp;&lt;b&gt;three&lt;/b&gt; talks so he's got to have a lot of cool points.&lt;/li&gt;&lt;li&gt;&lt;a href="http://djangocon.us/schedule/sessions/8/"&gt;Django Forms: Tips, tricks, and ways to stay out of trouble&lt;/a&gt; - &lt;a href="http://shawnrider.com/"&gt;Shawn Ride&lt;/a&gt;r of &lt;a href="http://pbs.org/"&gt;PBS&lt;/a&gt;&amp;nbsp;fame might not be a core developer but he's another brilliant coder and great speaker. This is a great beginner talk and maybe a decent advanced talk too.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Thats just four great talks described. And its just the tip of the iceberg! This is going to be great!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Edit&lt;/b&gt;: Fixed a geography mistake. I am so&amp;nbsp;embarrassed.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-1215953842166926100?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/1215953842166926100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=1215953842166926100' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/1215953842166926100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/1215953842166926100'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/08/getting-excited-about-djangocon-us.html' title='Getting excited about DjangoCon US!'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-3050858011049000964</id><published>2010-07-30T14:05:00.000-07:00</published><updated>2010-07-30T14:05:25.109-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='martial arts'/><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Rainbows on the prairie</title><content type='html'>What is life like on the prairie? Well, under the right conditions it is like this:&lt;br /&gt;&lt;br /&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" data="http://www.flickr.com/apps/video/stewart.swf?v=71377" height="300" type="application/x-shockwave-flash" width="400"&gt; &lt;param name="flashvars" value="intl_lang=en-us&amp;photo_secret=1ef8521aaa&amp;photo_id=4838089880&amp;flickr_show_info_box=true"&gt;&lt;/param&gt;&lt;param name="movie" value="http://www.flickr.com/apps/video/stewart.swf?v=71377"&gt;&lt;/param&gt;&lt;param name="bgcolor" value="#000000"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/video/stewart.swf?v=71377" bgcolor="#000000" allowfullscreen="true" flashvars="intl_lang=en-us&amp;photo_secret=1ef8521aaa&amp;photo_id=4838089880&amp;flickr_show_info_box=true" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;About two months ago I rented a nice house a few miles outside &lt;a href="http://en.wikipedia.org/wiki/Lawrence,_Kansas"&gt;Lawrence, Kansas&lt;/a&gt;. My original goal was to bike into town a few days every week. However, I'm&amp;nbsp;leery&amp;nbsp;of biking alone down rolling country roads so I bought myself a &lt;a href="http://en.wikipedia.org/wiki/Dodge_Neon"&gt;cheap little car&lt;/a&gt;. It gets me to and from Lawrence.&lt;br /&gt;&lt;br /&gt;My fun new activity is &lt;a href="http://en.wikipedia.org/wiki/Capoeira"&gt;Capoeira&lt;/a&gt;. It keeps me in shape and is something new and exciting for me to do. In order to support the Capoeira, I started up a local &lt;a href="http://www.meetup.com/beribazu/"&gt;meetup&lt;/a&gt;. Yeah, at the extreme end of things you see some crazy acrobatics but for most people its the chance to have fun and get in shape. I should post some video online of my antics at Capoeira.&lt;br /&gt;&lt;br /&gt;I'm also doing a bit of cooking. The kitchen in our house is really nice and I'm practicing my old culinary skills. My hope is to do a cook-off or a food camp with local friends at some point. Or maybe just relax and just cook for fun.&lt;br /&gt;&lt;br /&gt;I tried a ballroom dance class in the area but was not happy with the quality of instruction. Also, that each class we learned a whole new dance form meant that you never really got comfortable with a single method. That said, I did learn some nice steps and hope to do them at a conference and found I really enjoy &lt;a href="http://en.wikipedia.org/wiki/Salsa_(dance)"&gt;salsa&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The food here is generally cheap and good. Especially when it comes to core produce and meats. Getting some of the edgier ingredients means paying coastal prices or more. Fish and seafood seems to be hit or miss. I've heard the barbecue is outstanding but haven't been to any of the really &lt;a href="http://www.gatesbbq.com/"&gt;notable&lt;/a&gt; &lt;a href="http://www.oklahomajoesbbq.com/restaurant/"&gt;places&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Life is a lot cheaper here. The dollar stretches amazingly far. My monthly rent on a really big house is a third of the cost of my mortgage or much less than what I was paying for a room in &lt;a href="http://en.wikipedia.org/wiki/Arlington_County,_Virginia"&gt;Arlington, Virginia&lt;/a&gt;. That means I do a few more of the things I really enjoy and also be able to save at a good rate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-3050858011049000964?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/3050858011049000964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=3050858011049000964' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/3050858011049000964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/3050858011049000964'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/07/rainbows-on-prairie.html' title='Rainbows on the prairie'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-5928960605165318028</id><published>2010-07-16T15:14:00.000-07:00</published><updated>2011-09-29T16:28:06.256-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><title type='text'>Getting piston forms to play nicely with JSON</title><content type='html'>&lt;blockquote&gt;&lt;b&gt;Critical Update 2011/09/29!!!&lt;/b&gt; &lt;br /&gt;&lt;b&gt;Critical Update 2011/09/29!!!&lt;/b&gt; &lt;br /&gt;&lt;b&gt;Critical Update 2011/09/29!!!&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;a href="http://bitbucket.org/jespern/django-piston/wiki/Home"&gt;django-piston&lt;/a&gt; has been barely supported for nearly two years. That is an eternity, and the number of forks to address multiple issues is a cause for alarm. Because of that, in it's place at this time I recommend &lt;a href="http://pypi.python.org/pypi/django-tastypie"&gt;django-tastypie&lt;/a&gt;. It is &lt;a href="https://github.com/toastdriven/django-tastypie/commits/master"&gt;up-to-date&lt;/a&gt;, has &lt;a href="http://django-tastypie.readthedocs.org/"&gt;very good documentation&lt;/a&gt;, &lt;a href="http://django-tastypie.readthedocs.org/en/latest/authentication_authorization.html#oauthauthentication"&gt;supports OAUTH&lt;/a&gt;, and scored second place in the Django Packages thunderdome (it got nearly 3x as many points!). Another tool to consider is &lt;a href="http://django-rest-framework.readthedocs.org/"&gt;Django Rest Framework&lt;/a&gt;, which is as good as django-tastypie but lacks the OAUTH support.&lt;br /&gt;&lt;br /&gt;On the django-piston front, &lt;a href="https://groups.google.com/forum/#!topic/django-piston/n2mwlEBhtU0"&gt;Joshua Ginsberg has taken over the reins&lt;/a&gt; and we should hopefully see some movement again. In which case I'll be able to remove this section of the blog post.&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;Back to the existing blog post...&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A commonly used tool by &lt;a href="http://djangopeople.com/"&gt;Djangonauts&lt;/a&gt; is &lt;a href="http://bitbucket.org/jespern/django-piston/wiki/Home"&gt;django-piston&lt;/a&gt;, which is designed to make building a &lt;a href="http://en.wikipedia.org/wiki/REST"&gt;REST&lt;/a&gt; API easier. It even works with &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; forms to provide easily written PUT/POST validation, which should be pretty darn nice. Unfortunately,&amp;nbsp;if you go with django-piston forms validation it doesn't accomodate the JSON (or XML or YAML) requests and if validation fails it responds in HTML. Even more unfortunate, making validation accept and return JSON with&amp;nbsp;PUT/POST requests is not documented.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;While one could argue that it is documented in the django-piston docstrings, in my opinion that is not sufficient.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Fortunately while working on a project for &lt;a href="http://www.revsys.com/"&gt;Revolution Systems&lt;/a&gt; we worked out a solution:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-py"&gt;"""&lt;br /&gt;myapi/resource.py&lt;br /&gt;&lt;br /&gt;    author: Daniel Greenfeld&lt;br /&gt;    license: BSD&lt;br /&gt;&lt;br /&gt;This assumes your API accepts JSON only.&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;import json&lt;br /&gt;&lt;br /&gt;from piston.decorator import decorator&lt;br /&gt;from piston.resource import Resource&lt;br /&gt;from piston.utils import rc, FormValidationError&lt;br /&gt;&lt;br /&gt;def validate(v_form, operation='POST'):&lt;br /&gt;    """ This fetches the submitted data for the form &lt;br /&gt;        from request.data because we always expect JSON data&lt;br /&gt;        It is otherwise a copy of piston.util.validate.&lt;br /&gt;    """&lt;br /&gt;        &lt;br /&gt;    @decorator&lt;br /&gt;    def wrap(f, self, request, *a, **kwa):&lt;br /&gt;        &lt;br /&gt;        # Assume that the JSON response is in request.data&lt;br /&gt;        # Probably want to do a getattr(request, data, None)&lt;br /&gt;        #   and raise an exception if data is not found&lt;br /&gt;        form = v_form(request.data)&lt;br /&gt;&lt;br /&gt;        if form.is_valid():&lt;br /&gt;            setattr(request, 'form', form)&lt;br /&gt;            return f(self, request, *a, **kwa)&lt;br /&gt;        else:&lt;br /&gt;            raise FormValidationError(form)&lt;br /&gt;    return wrap&lt;br /&gt;&lt;br /&gt;class Resource(Resource):&lt;br /&gt;    &lt;br /&gt;    def form_validation_response(self, e):&lt;br /&gt;        """&lt;br /&gt;        Turns the error object into a serializable construct.&lt;br /&gt;        All credit for this method goes to Jacob Kaplan-Moss&lt;br /&gt;        """&lt;br /&gt;        &lt;br /&gt;        # Create a 400 status_code response&lt;br /&gt;        resp = rc.BAD_REQUEST&lt;br /&gt;        &lt;br /&gt;        # Serialize the error.form.errors object&lt;br /&gt;        json_errors = json.dumps(&lt;br /&gt;            dict(&lt;br /&gt;                (k, map(unicode, v))&lt;br /&gt;                for (k,v) in e.form.errors.iteritems()&lt;br /&gt;            )&lt;br /&gt;        )&lt;br /&gt;        resp.write(json_errors)&lt;br /&gt;        return resp&lt;/pre&gt;&lt;br /&gt;Usage in handlers.py:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-py"&gt;from django import forms&lt;br /&gt;&lt;br /&gt;from piston.handler import BaseHandler&lt;br /&gt;&lt;br /&gt;from myapp.models import Article&lt;br /&gt;&lt;br /&gt;# We use our custom validate rather than piston's default&lt;br /&gt;from myapi.resource import validate&lt;br /&gt;&lt;br /&gt;class ArticleForm(forms.Form):&lt;br /&gt;    """ This is best stored in forms.py but we put &lt;br /&gt;        here for sake of clarity"""&lt;br /&gt;&lt;br /&gt;    author      = forms.CharField(required=True)&lt;br /&gt;    title       = forms.CharField(required=True)&lt;br /&gt;    content     = forms.CharField(required=True)&lt;br /&gt;&lt;br /&gt;class ArticleHandler(BaseHandler):&lt;br /&gt;&lt;br /&gt;    allowed_methods = ('GET', 'POST', 'PUT', 'DELETE', )&lt;br /&gt;    model = Article&lt;br /&gt;                    &lt;br /&gt;    @validate(ArticleForm)&lt;br /&gt;    def create(self, request):&lt;br /&gt;        # Create/POST code goes here. &lt;br /&gt;&lt;br /&gt;    @validate(ArticleForm)&lt;br /&gt;    def update(self, request, id):&lt;br /&gt;        # Update/PUT code goes here. &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Usage in urls.py:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-py"&gt;from django.conf.urls.defaults import *&lt;br /&gt;&lt;br /&gt;from piston.authentication import HttpBasicAuthentication as auth&lt;br /&gt;&lt;br /&gt;# Import our ArticleHandler&lt;br /&gt;from myapi.handlers import ArticleHandler&lt;br /&gt;# Use our custom Resource class instead of piston's default&lt;br /&gt;from myapi.resource import Resource &lt;br /&gt;&lt;br /&gt;article_handler = Resource(ArticleHandler, authentication=auth)&lt;br /&gt;&lt;br /&gt;urlpatterns = patterns('',&lt;br /&gt;   url(&lt;br /&gt;        r'^articles/(?P&lt;id&gt;(\d+))$', &lt;br /&gt;        article_handler,&lt;br /&gt;        { 'emitter_format': 'json' },&lt;br /&gt;        name='api_article'&lt;br /&gt;       ),   &lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Of course, this assumes you are mapping Create/Read/Update/Delete (&lt;a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete"&gt;CRUD&lt;/a&gt;) actions to your API.&lt;br /&gt;&lt;br /&gt;I'm interested to see other solutions people have used to handle this in django-piston, and what suggestions people have that could improve on the examples I'm supplying here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-5928960605165318028?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/5928960605165318028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=5928960605165318028' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5928960605165318028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5928960605165318028'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/07/getting-piston-forms-to-play-nicely.html' title='Getting piston forms to play nicely with JSON'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-403401635466468479</id><published>2010-07-09T12:59:00.000-07:00</published><updated>2010-07-09T12:59:55.694-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jython'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='ironpython'/><title type='text'>I want to talk to Jython and Iron Python developers</title><content type='html'>I want to ask some questions of the &lt;a href="www.jython.org/"&gt;Jython&lt;/a&gt; and &lt;a href="http://ironpython.net/"&gt;Iron Python&lt;/a&gt; communities. I'm primarily looking for efforts that can go into publishable case studies. Experience in use of &lt;a href="http://djangoproject.com"&gt;Django&lt;/a&gt; in the Jython and Iron Python environments is also very much desired. Please use my email address which is obfuscated below and can be decoded by simply running the code in a python shell:&lt;br /&gt;&lt;pre class="prettyprint lang-py"&gt;''.join([chr(x) for x in [112, 121, 100, 97, 110, 110, 121, 64, 103, 109, 97, 105, 108, 46, 99, 111, 109]])&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-403401635466468479?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/403401635466468479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=403401635466468479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/403401635466468479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/403401635466468479'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/07/i-want-to-talk-to-jython-and-iron.html' title='I want to talk to Jython and Iron Python developers'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-5662013075042439624</id><published>2010-06-29T11:43:00.000-07:00</published><updated>2010-06-29T14:34:44.906-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apology'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Apologies to the Python community</title><content type='html'>Apparently planet python is pulling all content off this blog to its RSS feed. Which meant a rant I wrote this morning that was completely off topic went to the entire Python community. I'm contacting the staff behind planet.python.org and asking that they point at the correct feed so this doesn't happen again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-5662013075042439624?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/5662013075042439624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=5662013075042439624' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5662013075042439624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5662013075042439624'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/06/apologies-to-python-community.html' title='Apologies to the Python community'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-8871757836234718497</id><published>2010-06-29T08:23:00.000-07:00</published><updated>2010-06-29T08:34:39.443-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='friends'/><category scheme='http://www.blogger.com/atom/ns#' term='family'/><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>I hate Mac &amp; Cheese</title><content type='html'>I'm not a picky eater. I'm willing to eat every meat that is legal in the United States and wouldn't mind traveling to places where the laws are different. I have this strange desire to try pickled insects in a third world nation. I often eat things I don't like, such as eggplant.&lt;br /&gt;&lt;br /&gt;However, the truth is that &lt;b&gt;I really loathe &lt;a href="http://en.wikipedia.org/wiki/Mac_&amp;amp;_Cheese"&gt;mac &amp;amp; cheese&lt;/a&gt;&lt;/b&gt;. I hate cooking it, I hate eating it, I hate cleaning up after it. I've thrown away pots that have been used to cook it. I claim to be different because I despise this American staple, and silly as you may think it may be it is my preference not to have anything to do with cheesy pasta. Heck, it &lt;a href="http://en.wikipedia.org/wiki/Mac_&amp;amp;_Cheese#Health_concerns_and_controversy"&gt;ain't even healthy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Note: I sometimes like some cheese on top of tomato based sauces or chili that has pasta mixed into it. This is &lt;b&gt;not the same thing&lt;/b&gt;&amp;nbsp;as mac &amp;amp; cheese.&lt;br /&gt;&lt;br /&gt;Yet the complication I face is that I have dear friends and family who think that their&lt;b&gt; prize-winning homemade mac &amp;amp; cheese made from imported unpasteurized&amp;nbsp;cheese&lt;/b&gt; will be something that I love. That I'll change and they'll get the chance to smugly say that it was the quality of what I've eaten that discouraged me.&lt;br /&gt;&lt;br /&gt;That won't happen. &lt;br /&gt;&lt;br /&gt;I've been forced to try everything from Kraft mac &amp;amp; cheese to gourmet cheesy pasta prepared by chefs I otherwise respect. I've had it dumped on my plate on picnics and in fancy  restaurants. I've had the people proudly insist I try their recipe all while making it clear that they would take it as a personal insult if I didn't try it and would also take it as a personal insult if I didn't like it.&lt;br /&gt;&lt;br /&gt;And you know what? &lt;br /&gt;&lt;br /&gt;I hated it. Its vile. Its disgusting.&lt;br /&gt;&lt;br /&gt;Please stop insisting that I try your concoction. You aren't going to change me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-8871757836234718497?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/8871757836234718497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=8871757836234718497' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8871757836234718497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8871757836234718497'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/06/i-hate-mac-cheese.html' title='I hate Mac &amp; Cheese'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-5489999957948744193</id><published>2010-06-08T17:29:00.000-07:00</published><updated>2010-06-09T07:53:49.075-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>My little unit test trick</title><content type='html'>This is an oldie but a goodie.&lt;br /&gt;&lt;br /&gt;I love writing unit tests for &lt;a href="http://python.org"&gt;Python&lt;/a&gt; code. It makes me so happy seeing the little dots go by. Add in some &lt;a href="http://nedbatchelder.com/code/coverage/"&gt;coverage.py&lt;/a&gt; and you can even make a game out of how much your code is covered. Of course, adding in &lt;a href="http://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt; just makes it even better.&lt;br /&gt;&lt;br /&gt;However, sometimes when your unit tests get sophisticated it can be a pain to introspect via the Python shell (&lt;a href="http://en.wikipedia.org/wiki/REPL"&gt;REPL&lt;/a&gt;) on one terminal shell and then go back to the unittest. Especially when the unit tests get even the least bit sophisticated. In the shell you can forget steps since you are entering things manually.&lt;br /&gt;&lt;br /&gt;So as soon as things get the least bit complicated I simply start using the Python help() function and &lt;a href="http://docs.python.org/library/pdb.html"&gt;pdb&lt;/a&gt; library inside my test code. For example:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-py"&gt;class MyTests(unittest):&lt;br /&gt;    def test_pretending_to_be_complex(self):&lt;br /&gt;        ...&lt;br /&gt;        complex_object = really_complex_actions()&lt;br /&gt;        ...&lt;br /&gt;        &lt;br /&gt;        # help demonstration&lt;br /&gt;        help(complex_object)&lt;br /&gt;&lt;br /&gt;        # PDB example cause everyone loves that too.&lt;br /&gt;        import pdb        &lt;br /&gt;        pdb.set_trace()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So what does this give you? Well, the &lt;b&gt;help()&lt;/b&gt; function acts here &lt;b&gt;exactly&lt;/b&gt; the same way it does from the Python shell. It stops the code processing and lets you do introspection. pdb lets you step through things with joy.&lt;br /&gt;&lt;br /&gt;Try it out!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EDIT&lt;/b&gt;: Of course, you probably wouldn't use both help and pdb. Thats because you can call help() inside of PDB. My example just shows you available options. Thanks to Gary for pointing this out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-5489999957948744193?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/5489999957948744193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=5489999957948744193' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5489999957948744193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5489999957948744193'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/06/my-little-unit-test-trick.html' title='My little unit test trick'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-4941484417762037967</id><published>2010-05-11T12:14:00.003-07:00</published><updated>2010-05-11T12:17:34.294-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='canvas'/><title type='text'>Using modernizr to help with canvas</title><content type='html'>On my current project I've been using a little bit of the &lt;a href="http://en.wikipedia.org/wiki/HTML5"&gt;HTML5&lt;/a&gt;&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Canvas_element"&gt;Canvas element&lt;/a&gt; to provide a little bell/whistle. However, the problem with Canvas is that not all browsers support it. Out of the box though Canvas gives you a quick and handy way of dealing with that problem:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-html"&gt;&amp;lt;div id="content"&amp;gt;&lt;br /&gt;    &amp;lt;div id="demo-space-wrapper"&amp;gt;&lt;br /&gt;        &amp;lt;canvas height="100" id="demo-space" width="100"&amp;gt;&lt;br /&gt;            This text is displayed if the client browser does not support HTML5 Canvas.&lt;br /&gt;        &amp;lt;/canvas&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The problem with this approach is that if your layout expects to have an object there and your client's use of Internet Explorer doesn't include the Canvas extension then this could damage the overall feel of your layout.&lt;br /&gt;&lt;br /&gt;And that is where &lt;a href="http://www.modernizr.com/"&gt;Modernizr&lt;/a&gt; comes in to play. It is a trivial to use JavaScript library that makes it possible to detect if a browser can use Canvas or any other HTML control. So what I did was take the &lt;a href="http://www.modernizr.com/docs/#canvas"&gt;Modernizr Canvas detection documentation&lt;/a&gt; and apply it to my JavaScript. With that in hand I wrote this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-js"&gt;// check for canvas&lt;br /&gt;if (Modernizr.canvas) {&lt;br /&gt;    // We have canvas so add a rectangle&lt;br /&gt;    var demospace = document.getElementById('demo-space');&lt;br /&gt;    var context = demospace.getContext('2d');&lt;br /&gt;    context.fillStyle = "rgb(255,0,0)";&lt;br /&gt;    context.fillRect(10, 10, 10, 10)            &lt;br /&gt;} else {&lt;br /&gt;    // No canvas. Remove the layout space to preserve the layout.&lt;br /&gt;    var ul = document.getElementById('content');&lt;br /&gt;    var li = document.getElementById('demo-space-wrapper');&lt;br /&gt;    ul.removeChild(li);&lt;br /&gt;};&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/4477131926658044957-4941484417762037967?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/4941484417762037967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=4941484417762037967' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4941484417762037967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4941484417762037967'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/05/using-modernizr-to-help-with-canvas.html' title='Using modernizr to help with canvas'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-2819924999559580378</id><published>2010-05-11T11:38:00.002-07:00</published><updated>2010-05-11T11:40:35.448-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><title type='text'>Code highlighting on blogger</title><content type='html'>Thanks to &lt;a href="http://lukabloga.blogspot.com/2008/10/to-test-new-highlighting.html"&gt;Luka Marinko&lt;/a&gt; I have code highlighting now!&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-py"&gt;def python_funct():&lt;br /&gt;   a = a + b&lt;br /&gt;   print "Hello Highlighted code"&lt;br /&gt;&lt;br /&gt;class Foo(Bar):&lt;br /&gt;   pass&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/4477131926658044957-2819924999559580378?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/2819924999559580378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=2819924999559580378' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2819924999559580378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2819924999559580378'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/05/code-highlighting-on-blogger.html' title='Code highlighting on blogger'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-110531299428225122</id><published>2010-05-07T09:45:00.002-07:00</published><updated>2010-05-07T09:59:46.395-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geek celebrities'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Steve Holden giving a talk on Python education</title><content type='html'>&lt;a href="http://holdenweb.com"&gt;Steve Holden&lt;/a&gt;, &lt;a href="http://www.python.org/psf/"&gt;Python Software Foundation&lt;/a&gt; chairman and all around decent guy is giving a webcast talk today at 1 pm PST (4 pm EST) about the &lt;a href="http://www.oreillyschool.com"&gt;O'Reilly school&lt;/a&gt; courses on &lt;a href="http://python.org"&gt;Python&lt;/a&gt; and the upcoming O'Reilly &lt;a href="http://www.oreillyschool.com/certificates/upcoming-courses.php"&gt;Python certification programs&lt;/a&gt;. Check out the O'Reilly promotional page:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.oreillyschool.com/images/ost_email_html/webcast_steve_holden.html"&gt;Steve Holden's Webcast&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some quick notes:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Steve Holden is a marvelous speaker and a great wit. Even if you don't do Python and aren't a geek its worth listen to him talk. &lt;a href="http://pydanny.blogspot.com/2010/04/moving-away-from-dc.html"&gt;Leaving the DC area&lt;/a&gt; means I won't get the chance to sit at his feet and absorb his magnificent wisdom.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. In certain ways, I believe Python needs these kinds of certification programs. The lack of certification or any paper validation of python skills means that a number of large and conservative organizations are often hesitant to use Python. And one way to make those organizations more open to using Python is certifications. Its not the only answer, and its an answer that comes with its own set of problems, but I think that Steve and O'Reilly are a really good choice for overcoming these problems.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. I helped Steve write the &lt;a href="http://www.oreillyschool.com/courses/python1/"&gt;Python 1: Beginning Python&lt;/a&gt;. So by attending you will be supporting my work too. :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-110531299428225122?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/110531299428225122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=110531299428225122' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/110531299428225122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/110531299428225122'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/05/steve-holden-giving-talk-on-python.html' title='Steve Holden giving a talk on Python education'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-4267546460349435268</id><published>2010-04-23T06:31:00.005-07:00</published><updated>2010-04-23T07:02:45.797-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nova-django'/><category scheme='http://www.blogger.com/atom/ns#' term='martial arts'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='friends'/><category scheme='http://www.blogger.com/atom/ns#' term='family'/><title type='text'>Moving away from DC</title><content type='html'>Way back in 1969, when I was about a year and a half old, my family moved to Laurel, Maryland, which is about 20 miles north of Washington, DC. Since then, I've lived in central Maryland, Washington, and Northern Virginia. I enjoyed my friends and family, and the things that I've done.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yet I always wanted to see the rest of our world, try new things, explore new horizons. Breathe different air, if you will. My ideal existence would be to live in a lot of different places, living six months for a time in place to place so I can get a good experience of the planet.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Not long ago conditions came together that made it feasible for me to do all this. My house is sold, my son is 18, I don't currently own any furniture, and I have a job that allows/encourages for telecommuting (and that is because of &lt;a href="http://python.org"&gt;Python&lt;/a&gt; and &lt;a href="http://djangoproject.com"&gt;Django&lt;/a&gt;). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So on May 5th I'm moving to &lt;a href="http://en.wikipedia.org/wiki/Los_Angeles_metropolitan_area"&gt;Los Angeles, California&lt;/a&gt; for a short term stay. I'm there to hang out with a certain artist/developer and to go on a vacation that I've wanted to do for many months. More details on this move in another post.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In early June I'm moving again to &lt;a href="http://en.wikipedia.org/wiki/Lawrence,_Kansas"&gt;Lawrence, Kansas&lt;/a&gt;. I've got a number of friends there, but much more important are the professional reasons. The entrepreneur for my start-up will be living not far from there,  &lt;a href="http://www.revsys.com/"&gt;Revolution Systems&lt;/a&gt; offered me office space, and the cost of living is amazingly low. Another nice feature is that its in the central point of the USA, so flying anywhere on the continent doesn't take that long.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm very excited, but I'm also sad to go. I'll miss being near my son, my parents and siblings. I'll miss all my DC area friends, who are way too numerous to list. I will certainly miss all my students, young and old, not to mention the other teachers at OMAA.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I will be coming back in late June, and then perhaps in either late July or August. And who knows, maybe someday my travels will bring me back to the Washington, DC area for an extended stay?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-4267546460349435268?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/4267546460349435268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=4267546460349435268' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4267546460349435268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/4267546460349435268'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/04/moving-away-from-dc.html' title='Moving away from DC'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-6402935716192950671</id><published>2010-03-21T09:33:00.026-07:00</published><updated>2010-12-08T10:57:36.472-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nova-django'/><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='NASA science'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><category scheme='http://www.blogger.com/atom/ns#' term='NASA'/><title type='text'>Leaving NASA</title><content type='html'>&lt;div&gt;This has been a hard post to write. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I was delighted that on January 3rd, 2005 I started my first day working for the &lt;a href="http://nasascience.nasa.gov/"&gt;National Aeronautics and Space Administration&lt;/a&gt; (NASA).   While I wasn't working on science efforts, I was at least contributing to the cause. In 2005 I was introduced by co-worker &lt;a href="http://koansys.com/"&gt;Chris Shenton&lt;/a&gt; to &lt;a href="http://python.org/"&gt;Python&lt;/a&gt;, which became my favorite programming language ever. I also learned tools like &lt;a href="http://zope.org/"&gt;Zope&lt;/a&gt;, &lt;a href="http://plone.org/"&gt;Plone&lt;/a&gt;, and &lt;a href="http://django.org/"&gt;Django&lt;/a&gt;. Over the past five years, I've met a lot of fascinating people in and around the agency, a list that seems endless in size and scope. That includes astronauts, scientists, engineers, developers, managers, and so much more.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;This meant so much to me, and maybe because my first memories of television as a child were the moon landings of the early 1970s. I dreamed as a child of being an astronomer or astronaut, and sometimes I plot how I would redo my life to fit these dreams if I got a second childhood.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the past year I've had some incredible opportunities present themselves to me. I've been presenting frequently on Django and &lt;a href="http://pinaxproject.com/"&gt;Pinax&lt;/a&gt;. I've had the singular honor of writing course material for &lt;a href="http://holdenweb.com/"&gt;Holdenweb, LLC&lt;/a&gt; on behalf of the &lt;a href="http://www.oreillyschool.com/"&gt;O'Reilly School of Technology&lt;/a&gt;. Representing NASA as a contractor to the Python and related communities has been both enjoyable and a great honor.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yet all things, even good ones, must come to an end.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've decided to become an independent consultant. My first project will be working with &lt;a href="http://revsys.com/"&gt;Revolution Systems&lt;/a&gt; (&lt;a href="http://jacobian.org/"&gt;Jacob Kaplan-Moss&lt;/a&gt; and &lt;a href="http://www.frankwiles.com/"&gt;Frank Wiles&lt;/a&gt;) on a neat stealth project that looks very promising and once launched will help people. The project will be Python/Django/&lt;a href="http://www.linux.org/"&gt;Linux&lt;/a&gt; based, and the client insists on accessibility, testing, and quality work. We'll be exploring the boundaries of what has been done with those tools and besides what must remain proprietary, a lot of our work will end up going back to the community. Sounds like my kind of thing!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My last day is April 1, 2010. I'm both excited to explore this new project, and saddened that my professional world for the past five years is coming to an end. Yet the overlap in technology and the participation of the NASA SMD python group in the open source world means that my work with NASA isn't coming to an end, its just transforming into something different.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nevertheless, this is the end of an era for me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Which is partly why I'm happy that I'll still be in touch with my fellow NASA SMD Python contractors such as &lt;a href="http://elephantangelchild.blogspot.com/"&gt;Katie Cunningham&lt;/a&gt;, &lt;a href="http://koansys.com/"&gt;Chris Shenton&lt;/a&gt;, &lt;a href="http://chris.improbable.org/"&gt;Chris Adam&lt;/a&gt;s, James Saint-Rossy, and others. I also plan to be real friendly with the awesome Ames Research Center Python/Django/FOSS groups such as the intrepid Mark Friedenbach and the entire incredibly awesome &lt;a href="http://nebula.nasa.gov/"&gt;Nebula&lt;/a&gt; team.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll miss having the pleasure of working with Leslie Cahoon, &lt;a href="http://jessykate.com/"&gt;Jessy Cowan-Sharp&lt;/a&gt;, John Kasmark, Bob Ryan, Candace Solomon, Bill Keeter, Gamble Gilbertson, Meredith Mengel, Malik Ahmad, Jenny Mottar, Mike Brody, Virginia Butcher, Dawayne Pretlor, Michele Montgomery, Jim Consalvi,Siew Chin Hon, Hans Goetzelt, Shannon Lantzy, and many more.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lastly, I'll miss the honor of serving civil servants such as Gretchen Davidian, Sharron Sample, and Ruth Netting and others.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-6402935716192950671?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/6402935716192950671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=6402935716192950671' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6402935716192950671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6402935716192950671'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/03/leaving-nasa.html' title='Leaving NASA'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-6395322349976731605</id><published>2010-03-05T10:11:00.003-08:00</published><updated>2010-03-05T10:24:54.700-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pinax'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>Pycon 2010 report III: Sprints</title><content type='html'>&lt;div&gt;My report for the sprints of &lt;a href="http://us.pycon.org/2010"&gt;Pycon 2010&lt;/a&gt;. This isn't a general review of the sprints, just how it affected me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;a href="http://pinaxproject.com/"&gt;Pinax&lt;/a&gt; Sprint&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don't have a hard count of how many people participated on Pinax this year. Last year's sprint looked like we had a lot more, but last year the Pinax room was home to people doing other things, albeit mostly &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; related stuff. In any case, this year we had probably about 10 people working on Pinax, or things that went directly into Pinax.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While &lt;a href="http://jtauber.com/"&gt;James Tauber&lt;/a&gt; is the leader of the Pinax community, this year &lt;a href="http://oebfare.com/"&gt;Brian Rosner&lt;/a&gt; stepped up and did an amazing job being both a technical resource and director of geeks. The mutual clarity of vision and obvious telepathy between Brian and James is truly a joy to behold. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also appreciate the entire Pinax community. Besides coaching me on &lt;a href="http://git-scm.org/"&gt;Git&lt;/a&gt; branches (work uses SVN so I just don't get enough Git practice) they also gracefully understood that &lt;a href="http://pydanny.blogspot.com/2010/02/pycon-2010-report-i.html"&gt;I was a bit distracted this year&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;My specific contributions to Pinax&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the things that had bugged me about Pinax for some time were the individual project tag apps. These were a per project extension of &lt;a href="http://code.google.com/p/django-tagging/"&gt;django-tagging&lt;/a&gt;, and were used to simply display tagged data. I was never happy about the displays of the tags, the lack of pagination, or that you had to create/modify an entire project level application just to control a display.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So last &lt;a href="http://www.djangocon.org/"&gt;DjangoCon&lt;/a&gt; I wrote &lt;a href="http://github.com/pydanny/django-tagging-ext"&gt;django-tagging-ext&lt;/a&gt;. What it does is let you control the displays of tags via a root urlconf wiring. It still needs some work (cleaning a query, 100% test coverage, better documentation), but its a big step up from the alternative.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For Pycon I volunteered to go into all the Pinax projects that used tags and replace the tag_app there with django-tagging-ext wiring. I thought it would be relatively trivial, but in practice it was not.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The issue was that immediately prior to the conference, changes had been made to Pinax trunk that caused a small number of errors. All them passed existing tests but failed when you actually clicked through pages. Yeah, that does mean that Pinax &lt;a href="http://nedbatchelder.com/code/coverage/"&gt;code coverage &lt;/a&gt;needs improvement, but that is something we are working feverishly on. In any case, what that meant was that by implementing the new tag display system, I got the chance to fix a number of small but poignant bugs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also worked some to help the code coverage of tests. Brian Rosner worked with me and gave me some excellent pointers. I feel sad because I think we had a disconnect on what we consider pair programming, and want to assure him that the time he gave me was a high mark of the conference.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;In regards to pair programming, I don't mind working with someone until you figure something out, but spending hours and hours sharing a computer drives me nuts. Once a person 'gets it', go do something else and let them go forward.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Volume of Contribution&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Looking at the &lt;a href="http://github.com/pinax/pinax/graphs/impact"&gt;Pinax impact chart on github&lt;/a&gt; I can claim that I had the most impact during the sprint. Heck, &lt;a href="http://twitter.com/pydanny/status/9908711789"&gt;I even jokingly claimed it on Twitter&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Except that claim is false.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The truth of the matter is that how many commits I did in a brief period is nothing compared to what Brian and James did to equip others to make commits. Or what they've done during the history of Pinax. Or what they might have done to side projects that touch Pinax. Also, during the sprints my work was really focused to a specific area of Pinax, and besides some work I did with &lt;a href="http://skyl.org/"&gt;Skylar Saveland&lt;/a&gt;, I worked mostly by myself.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So that claim is full of hubris and rather silly. If that claimed annoyed anyone in the Pinax community I'll buy your forgiveness with a beer.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-6395322349976731605?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/6395322349976731605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=6395322349976731605' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6395322349976731605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6395322349976731605'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/03/pycon-2010-report-iii-sprints.html' title='Pycon 2010 report III: Sprints'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-7944314587571528485</id><published>2010-03-03T06:28:00.006-08:00</published><updated>2010-03-03T12:50:32.561-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>Conferences are a double edged sword</title><content type='html'>&lt;div&gt;This post isn't for developers, its for managers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; world once a year there is &lt;a href="http://us.pycon.org/"&gt;Pycon&lt;/a&gt;. In other languages, tools, and frameworks they all have that one big conference where all the top people go. There are classes, tutorials, scheduled talks, open spaces, keynotes, and tons of networking. All your developers will want to go, and the ones that do will rave about the time they had. So how do you as a manager handle a big conference?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Conferences are a double edged sword. If handled well they will be a huge boon to you and your organization. Handled poorly and they can be devastating to you, your projects, your team, and your organization. Knowing which way to swing the 'conference sword' in such a way that you don't get cut is a handy tool to have in your pocket.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, remember that at the big conference there will be lots of networking. Make sure your developers are really happy with you before they go. Also have your your developers go with business cards. Ask them to bring back business cards. Remind them of whatever referral policy your company might have. Why pay for a headhunter when your own staff can do the hiring for you?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Second, remember that people will be scoping out your staff for potential hire.  Don't anger your developers immediately before, during, or immediately after a conference. Keep deadlines as far away as possible from the conference. Don't begrudge them leaving and task them with petty work. Because what would have been training plus an energizing break for your staff will now be considered job fair by your staff.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Third, try to cover even a portion of the costs of the conference. If your organization doesn't officially do conferences, then offer to pay for their time during the sprints just so long as that open source work even tangentially affects what they do back at the office. That way they don't use up so much leave and odds are they'll have lots of smart comrades around to help them through some of the tricky parts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fourth, when the developers come back, ask them what they learned. Ask if they can incorporate these lessons into current or future tasks. They'll gush about twenty new things and most of them will be inapplicable. But there will be one or two things that are a perfect match and you'll both be grinning at each other in regards to challenges now effortlessly overcome or new services you can offer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fifth, try to go yourself. In fact, try and organize the whole trip. If you are close enough, rent vehicles and drive down. Set up the hotel rooms. You'll be able to network with other manager types and your staff will rave about you. Hiring will become that much easier.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So lets look at two ways to handle a big conference like Pycon:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The Wrong Way&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Block any attempts the developers make in getting reimbursement for the trip.&lt;/li&gt;&lt;li&gt;Schedule deadlines around the conference. If anything goes wrong, declare that this is why people should not go.&lt;/li&gt;&lt;li&gt;Before the conference, grumble about developers going away and then when they come back grumble about time lost.&lt;/li&gt;&lt;li&gt;Developer time lost at the conference should not be compounded by talking about the conference when they come back.&lt;/li&gt;&lt;li&gt;Act surprised when your team comes back angry and at low morale levels. Act more surprised when they leave for positions elsewhere.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The Right Way&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Get business cards and fliers for your staff to bring to the conference.&lt;/li&gt;&lt;li&gt;In the meeting before the conference, go over the company referral system for new hires. Also offer beer or a meal for new hires.&lt;/li&gt;&lt;li&gt;At least get the developers paid hours for the sprints. Beg and borrow from your own manager to try and cover other parts of the conference. Act surprised with the gratefulness of your staff.&lt;/li&gt;&lt;li&gt;Afterwards, dedicate a staff meeting to things learned at the conference. &lt;/li&gt;&lt;li&gt;Go yourself and hang out in the vendor room. Hand out cheap but goofy swag. Bring thousands of business cards and hand them out. Visit a few talks. Invite developers from other companies to meals. Boast about your staff and company. Be amazed by the new hires you pick up.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-7944314587571528485?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/7944314587571528485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=7944314587571528485' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/7944314587571528485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/7944314587571528485'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/03/conferences-are-double-edged-sword.html' title='Conferences are a double edged sword'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-3417479790386121039</id><published>2010-03-02T06:40:00.005-08:00</published><updated>2010-03-02T08:59:28.258-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apology'/><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='friends'/><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Apologies to Katie</title><content type='html'>&lt;a href="http://elephantangelchild.blogspot.com/"&gt;Katie Cunningham&lt;/a&gt; is a good friend of mine. We met about nine years ago through a mutual acquaintance. We had a number of similar interests all tied to general geekery and kids. I've always appreciated her honesty, humor, and work ethic. In December 2006 I got her a job at &lt;a href="http://www.nasa.gov/"&gt;NASA&lt;/a&gt;, which eventually got her involved in &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; and &lt;a href="http://djangoproject.com/"&gt;various&lt;/a&gt; &lt;a href="http://plone.org/"&gt;related&lt;/a&gt;&lt;a href="http://us.pycon.org/"&gt; communities&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One thing I like about Katie is that she likes to cook and she always does so from scratch. Her focus is on a mix of various savory dishes and baking. Since she takes care to find out her friend's allergies and preferences, it is a rare moment when people do not like what she cooks. One of my absolute favorites is a blackberry cobbler that she makes, which she does not destroy with loads of sugar. She knows that when taken in quantity sugar adversely affects me and that I also love blackberries.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm good at entrees and appetizers and sides, but baking is beyond me unless I use a pre-mix. So I really respect what Katie does.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So anyway, recently on &lt;a href="http://twitter.com/"&gt;twitter&lt;/a&gt; when she was discussing bagels with &lt;a href="http://jacobian.org/"&gt;Jacob Kaplan-Moss&lt;/a&gt; I called her out publicly for putting icing on cheesecake. As an &lt;a href="http://en.wikipedia.org/wiki/Ashkenazi"&gt;Ashkenazi Jew&lt;/a&gt; from family who spent generations in the New York area (although I was raised in Maryland) I'm picky about cheesecake. Legal toppings are berries, and going crazy with toppings is having those berries in a heavy glaze.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, it turns out that the illegal toppings cheesecake instance was not done by Katie, but rather her mother. Katie's mom is a wonderful lady who is also a cook whose work is worth tasting and all around wonderful person. But she puts a thin layer of sour cream icing on cheesecake. While I'm sure somewhere there is a Jewish law against illegal toppings on cheesecake, Katie's mom's defense is that she is not a Jew. And I certainly appreciate her Southern style fare.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, for what it is worth, this is my public, formal apology to Katie. She rocks and if you are smart, you'll convince her to bake for you.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-3417479790386121039?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/3417479790386121039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=3417479790386121039' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/3417479790386121039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/3417479790386121039'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/03/apologies-to-katie.html' title='Apologies to Katie'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-5134908074168837965</id><published>2010-03-01T05:13:00.005-08:00</published><updated>2010-03-01T09:50:34.922-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac os'/><category scheme='http://www.blogger.com/atom/ns#' term='nova-django'/><category scheme='http://www.blogger.com/atom/ns#' term='pinax'/><category scheme='http://www.blogger.com/atom/ns#' term='django-district'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>Pycon 2010 report II</title><content type='html'>&lt;div&gt;The first half day report for formal conference activities on February 21.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Plenary: Introduction&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I helped in registration so I arrived late to listen to &lt;a href="http://www.haynesandboone.com/van_lindberg/"&gt;Van Lindburgh&lt;/a&gt; start the conference. Which was a shame because I like to listen to him speak. Nevertheless, I consoled myself with the knowledge that I had contributed my time and service to help him launch what turned out to be an amazing conference.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Keynote: &lt;a href="http://holdenweb.com/"&gt;Steve Holden&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In December Steve had presented to the &lt;a href="http://www.meetup.com/NOVA-Django"&gt;NOVA-Django&lt;/a&gt; a much &lt;a href="http://www.meetup.com/NOVA-Django/calendar/11979823/?from=list&amp;amp;offset=0"&gt;earlier draft of his speech&lt;/a&gt;. As much as his stuff back in December was good, what he did at &lt;a href="http://us.pycon.org/"&gt;Pycon&lt;/a&gt; was right on the money. He was in fine form, and the conclusion was very much Steve Holden at his best.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;The next night Steve was in rare fine form, but that is a story for another day...&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Keynote: &lt;a href="http://www.python.org/~guido/"&gt;Guido Van Rossum&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Being that I am &lt;a href="http://www.python.org/~guido/"&gt;Guido's&lt;/a&gt; biggest fan, and have trouble breathing in his presence, you might think I'm a bit biased. Alas, in this case, Guido's talk was not my favorite of the conference. If memory serves, at last year's Pycon he mentioned a desire to remove the "For Life" from BDFL and this year I think that showed a little bit. It was nice to have him field questions from the &lt;a href="http://eldarion.com/"&gt;Eldarion&lt;/a&gt; supplied &lt;a href="http://pycon.djangodose.com/"&gt;pycon.djangodose.com&lt;/a&gt; feed and the audience, but from Guido I guess I want vision and on-high judgements.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Leafy Chat, et al by &lt;a href="http://alexgaynor.net/"&gt;Alex Gaynor&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Alex Gaynor is great at public speaking. He is unafraid of crowds and speaks with good clarity. His talks are always informative, and this was no different. The downside was that for his talk he had 35 minutes to present a &lt;b&gt;lot&lt;/b&gt; of information. So he didn't have the time to explore some of the technical hurdles they overcame in each effort. Nevertheless, it was informative, and by the end it seemed clear that one of the lessons re-learned was to focus on a simple core architectural design and make it work.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;A Short &lt;a href="http://pinaxproject.com/"&gt;Pinax&lt;/a&gt; Tutorial by Me&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've given variations of this talk at least three times previously. Once at &lt;a href="http://www.djangocon.org/"&gt;DjangoCon&lt;/a&gt;, once for NOVA-Django, and once for &lt;a href="http://www.meetup.com/django-district/"&gt;Django-District&lt;/a&gt;. So I'm rather practiced at it, which turned out to be a good thing. Because, brand new good luck charm or not, this talk ended up having a host of problems.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First off, we couldn't get any Apple laptop to work with the projector. So we started 7-8 minutes late on a Windows machine. So I had to speak very quickly, especially if I was going to include the technical side of things. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I finished the majority of slides with time to spare and then things went wrong again. The Windows machine... didn't do what was needed. Displaying Pinax and showing off its tricks just wasn't going to happen. So we ended up with an extended Q&amp;amp;A session.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Not my best presentation, but memorable. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the works is me giving the talk a least a couple more times. Once with my local friends at &lt;a href="http://www.zpug.org/"&gt;ZPUG-DC&lt;/a&gt; and once at &lt;a href="http://www.meetup.com/ladjango/"&gt;LA Django&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Managing the World's Oldest Django Project by &lt;a href="http://b-list.org/"&gt;James Bennett&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;James is always on the ball when it comes to presentations. His stuff is well researched and documented, and his voice is both relaxing and invigorating. It was good to hear about lessons learned, experiences, and some of the more interesting foibles they've been through. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;An Underwater Python: Tortuga the Python Powered Robot by Joseph Lisee&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Python powered underwater Robots? I was so excited by this talk! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yeah, odds are it would have almost no professional applicability, but sometimes you just have to see what other people are doing with one of your favorite tools. I was impressed by the energy and creativity of the students at the &lt;a href="http://ram.umd.edu/"&gt;Robotics group at the University of Maryland&lt;/a&gt; and am trying to figure out how to include robots in my next project. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-5134908074168837965?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/5134908074168837965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=5134908074168837965' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5134908074168837965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/5134908074168837965'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/03/pycon-2010-report-ii.html' title='Pycon 2010 report II'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-6647043415225194367</id><published>2010-02-24T12:13:00.010-08:00</published><updated>2011-06-14T22:42:28.657-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pinax'/><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>Pycon 2010 report I</title><content type='html'>&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;a href="http://us.pycon.org/"&gt;Pycon&lt;/a&gt; was an incredible learning experience and networking opportunity. I met many good friends again and made just as many new ones. In addition, this was the first time I presented and did so on &lt;a href="http://pinaxproject.com/"&gt;Pinax&lt;/a&gt; two times. Furthermore, in the name of diversity, this instance of Pycon saw the premiere of the &lt;a href="http://us.pycon.org/2010/registration/financial-aid/"&gt;Financial Assistance Grant for Women&lt;/a&gt;. We also had a dedicated talk on &lt;a href="http://us.pycon.org/2010/conference/schedule/event/77/"&gt;Diversity as a Dependency&lt;/a&gt;. The benefit this focus on diversity was that...&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;um...&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;yeah...&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;like...&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;uh...&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;um...&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;D&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;i&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #993300;"&gt;v&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #663333;"&gt;e&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333300;"&gt;r&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #003300;"&gt;s&lt;span class="Apple-style-span" style="color: #003333;"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #000066;"&gt;t&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #330099;"&gt;y &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #330033;"&gt;R&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #cc33cc;"&gt;o&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #00cccc;"&gt;c&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #cc0000;"&gt;k&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #663300;"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Did I learn a lot at pycon? Heck yeah. Networking was life changing. And unlike previous conferences, I'm in a position to take advantages of opportunities offered. The next few weeks and months will see a lot of changes and challenges for me. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Note&lt;/b&gt;: I've got to keep some things under wraps for now so I'm going to have to aggressively moderate comments. Feel free to comment, just don't take comment rejections personally.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note II&lt;/b&gt;: For reference, this post is mostly about &lt;a href="http://pydanny.blogspot.com/2011/05/i-love-this-girl.html"&gt;Audrey Roy&lt;/a&gt; and some about the &lt;a href="http://revsys.com/"&gt;job offering&lt;/a&gt; I got at PyCon 2010.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-6647043415225194367?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/6647043415225194367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=6647043415225194367' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6647043415225194367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/6647043415225194367'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/02/pycon-2010-report-i.html' title='Pycon 2010 report I'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-8043959939891113134</id><published>2010-02-18T09:08:00.004-08:00</published><updated>2010-02-18T09:12:33.027-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>I've got ribbons!</title><content type='html'>Odds are this will be my last post on blogspot. After this it should be on my personal blog.&lt;br /&gt;&lt;br /&gt;Anyway, I'm here at &lt;a href="http://us.pycon.org"&gt;Pycon&lt;/a&gt;. I presented a Pinax tutorial and tomorrow I'm presenting a talk on &lt;a href="http://us.pycon.org/2010/conference/schedule/event/15/"&gt;Pinax&lt;/a&gt;. I'm also a session chair and plan to help with assembling things for registration. And what do I get out of it?&lt;br /&gt;&lt;br /&gt;Ribbons.&lt;br /&gt;&lt;br /&gt;RIBBONS!!!&lt;br /&gt;&lt;br /&gt;My plan is to have more ribbons than anyone else.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-8043959939891113134?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/8043959939891113134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=8043959939891113134' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8043959939891113134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/8043959939891113134'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/02/ive-got-ribbons.html' title='I&apos;ve got ribbons!'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-2808600315100952128</id><published>2010-02-10T07:43:00.007-08:00</published><updated>2010-02-10T08:05:39.610-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='pinax'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Eating my own Dog Food</title><content type='html'>For several years now I've hosted this &lt;a href="http://pydanny.com/"&gt;blog&lt;/a&gt; here on &lt;a href="http://blogger.com/"&gt;blogspot/blogger&lt;/a&gt;. Its been both a good and bad experience. For writing out simple posts it has made things pretty easy. However, if I try to post code examples I've got to deal with the various quirks of the blog engine. How it escapes special characters and that you can't easily do color colorization has been really annoying. Yes, I know you can do some hoop jumping to make this work, but I decided a long time ago that if I had to do that then I would host my own blog.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Speaking of which, a few months back I got called out for not &lt;a href="http://en.wikipedia.org/wiki/Eating_one's_own_dog_food"&gt;eating my own dog food&lt;/a&gt;. Yup, as a &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; developer shouldn't I use something Python powered? I currently do &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt; professionally so those are in my tool chest so this should be trivial. Heck I also do some serious &lt;a href="http://pinaxproject.com/"&gt;Pinax&lt;/a&gt; work so why not that?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Whatever I put it under, it would be a nice move. I would be able to format and control my blog to a much better degree. I could easily supply code examples. I could use the hosting to demonstrate pet projects or launch some of the things I've wanted to try for some time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So which blog to use? Roll my own?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Heck no.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've got a &lt;a href="http://nasascience.nasa.gov/"&gt;full-time job&lt;/a&gt;, I teach 10+ hours a week, and my &lt;a href="http://holdenweb.com/"&gt;consulting&lt;/a&gt; &lt;a href="http://eldarion.com/"&gt;efforts&lt;/a&gt; eat up a chunk of my free time. So rather than use my energy to reinvent the wheel, I would rather rely on the hard work and labor of others.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With that in mind, I really, really like &lt;a href="http://github.com/montylounge/django-mingus"&gt;Django-Mingus&lt;/a&gt;. Out of the box it does everything that I want and is a breeze to get up and running. It has a large, active community and it even uses a project that has my name attached, &lt;a href="http://github.com/pydanny/django-wysiwyg"&gt;django-wysiwyg&lt;/a&gt; (although &lt;a href="http://chris.improbable.org/"&gt;Chris Adams&lt;/a&gt; did most of the work).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some might ask the good questions as to why I'm not using Pinax for my new blog. In essence, I wanted to do something in the wild that wasn't Pinax powered and my concept projects all use Pinax. So don't worry, I'll be doing Pinax work for as long as I can foresee.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I've begun working on it during the &lt;a href="http://www.flickr.com/photos/pydanny/sets/72157623364245346/"&gt;Blizzard of 2010&lt;/a&gt;. I'll have it up today unless we lose power or Internet.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4477131926658044957-2808600315100952128?l=pydanny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pydanny.blogspot.com/feeds/2808600315100952128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4477131926658044957&amp;postID=2808600315100952128' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2808600315100952128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4477131926658044957/posts/default/2808600315100952128'/><link rel='alternate' type='text/html' href='http://pydanny.blogspot.com/2010/02/eating-my-own-dog-food.html' title='Eating my own Dog Food'/><author><name>pyDanny</name><uri>http://www.blogger.com/profile/00481523876497446983</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_KEFU5_uGRyw/S6PSlr6FIQI/AAAAAAAAAtE/T7DZn_IE6aQ/S220/pc_cartwheel.jpeg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4477131926658044957.post-8250971821250997334</id><published>2010-02-04T11:59:00.002-08:00</published><updated>2010-02-06T12:44:38.833-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pycon'/><title type='text'>How I write my presentations</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span"  style=" color: rgb(51, 0, 0); font-size:x-large;"&gt;Tools&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I tend to use just a few simple tools. I like to keep things simple because I'm focusing on my message. Complexity means I spend all my time with this or that widget and fundamentally I don't care about tools.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Google for Images&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;I look for images that have free/open licenses for reuse. Sometimes its hard to find something that is properly licensed, so I have to alter what the image is supposed to be.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Mac OS X Screen Capture&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;If I want colorized code, prettily formatted text, or simple shell displays, I use command-shift+4. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Google Documents Presentation&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;You really can't do anything too fancy with Google Documents, which might bother some but I find it perfect for my needs. Also, storing my drafts on Google makes a lot of sense because if Google has problems with storage then I'll be worrying about Zombies more than a presentation. And I also don't have to worry about losing a machine. Google Docs also exports to PDF or Powerpoint which is useful during the presentation or uploading to &lt;a href="http://slideshare.com/"&gt;slideshare&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, Google Docs lets me easily share and collaborate. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;NeoOffice Presentations&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Actually, I don't like this tool but I use it during my long metro rides when I don't have access to the Internet. I can export from Google Docs a PPT file, edit it, and then upload later.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;&lt;span class="Apple-style-span"  style="color:#330000;"&gt;Methodology&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;How I write things out and present.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;b&gt;Black text on white background&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;For a while I played with various color schemes. I found that problematic because what displays nicely on my Mac often doesn't display prettily on the big screen. Things can become illegible. Also, keeping away from pretty color schemes means nearly every picture looks good. So why not go with the historical constant thats been used for centuries? &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:16px;"&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;b&gt;I am moderate in my use of bullets&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;I don't think bu
