<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Newest blog posts on Those Clever Kids</title><link>http://thosecleverkids.com/blog/</link><description>Updates to the porfolio AS THEY HAPPEN!</description><atom:link href="http://thosecleverkids.com/thoughts/blog/latest" rel="self"></atom:link><language>en-us</language><lastBuildDate>Thu, 16 Sep 2021 10:40:17 -0000</lastBuildDate><item><title>A Dog Who's Lost Its Bite</title><link>http://thosecleverkids.com/thoughts/posts/dog-whos-lost-its-bite</link><description>
A Dog Who&amp;#39;s Lost Its Bite&lt;br /&gt;
&lt;p&gt;I ran into https://www.youtube.com/watch?v=Z6VrKro8djw this weekend and I have been thinking about it non-stop. Paul Simon and Big Daddy Kane (and to a lesser extent, Biz Markie) are musical icons for me, people who were Very Important at different times in my life and people who I hold dear, to the point I spent the bulk of that video's runtime this weekend arguing Paul Simon is an artist on a par with Yeats. YMMV. &lt;/p&gt;

&lt;p&gt;I had no idea it existed. No idea a Paul Simon song from the '70s had been gifted a video in the '90s, no idea why it opens with two future hip hop icons but it's so Paul Simon to be miles ahead; game recognizing game and all that.&lt;/p&gt;

&lt;p&gt;But. (Man, I wish I could write that &lt;a href="https://www.poetryfoundation.org/poems/50285/surprised-by-joy"&gt;"Oh" that Wordsworth wrote&lt;/a&gt; except maybe on the other hand no I don't) But what if Paul Simon and Biz and Big Daddy isn't a thing that will ever happen again? What if that meeting of old New York Jewish guy superstar and up-and-coming rappers represents the high point of racial harmony in the US? &lt;em&gt;Do the Right Thing&lt;/em&gt; was on TV last night and between the two I've been thinking what if the freedom to be ok with each other enough in the horrible, Zubaz-clad '90s represents the best America will ever be at talking about race? Because much as I grouse about the fake brave and phony tough "patriots" in this country, I think humanity is something we do better than most. Feel free to take a quick survey of the state of Europe and then argue. What if everything is downhill from here and we just take the easy way out and blame foreigners, gays, gypsies, Jews and every other false boogeyman from before WWII?&lt;/p&gt;

&lt;p&gt;I know things weren't great in the '90s and I know Big Daddy Kane breaking bread with Paul Simon isn't some miracle. But what would it look like today? We don't really have musical icons or even icons . . . Paul Simon would be, Eddie Vedder or someone. And we don't really have a burgeoning new musical genre (or maybe we do, I am old now and wouldn't know), but even if there is one, the two stars would either be political opposites who wouldn't be interested in trying or they'd be so similar to be totally boring or (most likely by far) they'd be brought together by whichever brand they both endorse and pretend to find each other totally fascinating. Man, all that dystopian sci-fi got real so fast. &lt;/p&gt;

&lt;p&gt;I guess what I am trying to say, if you will pardon me and lean in for a second so I can whisper real close, is Fuck This and Fuck That and Fuck Anyone Who Thinks Like That.&lt;/p&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/dog-whos-lost-its-bite</guid></item><item><title>Bananas: A Play in One Act</title><link>http://thosecleverkids.com/thoughts/posts/bananas-play-one-act</link><description>
Bananas: A Play in One Act&lt;br /&gt;
&lt;p&gt;Josie: Why are there those bugs?
Michelle: Those are fruit flies, it's because the bananas are getting old. We could make peanut butter-banana cookies or banana muffins&amp;mdash;
Josie: I have an idea!
Michelle: What is it?
Josie: We could throw them out.
Me: &lt;/p&gt;

&lt;p&gt;&amp;lt;img src="https://espngrantland.files.wordpress.com/2014/06/9u4jd.gif"&amp;gt;&lt;/p&gt;

&lt;p&gt;&amp;lt;i&amp;gt;This is my son, mine own Telemachus,
To whom I leave the sceptre and the isle – 
Well-loved of me&amp;lt;/i&amp;gt;&lt;/p&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/bananas-play-one-act</guid></item><item><title>Norm</title><link>http://thosecleverkids.com/thoughts/posts/norm</link><description>
Norm&lt;br /&gt;
&lt;p&gt;This is about an old coworker. A guy I was hired by and hired to stand in for. I spent a couple of weeks in the industry I have worked in for a couple of decades filling in for a guy named Norm and everyone kept telling me, "Wait 'til you meet Norm". But I didn't think anything about it because I'd pretty much held all manhood cheap until it proved itself otherwise.&lt;/p&gt;

&lt;p&gt;So two Mondays later it's almost lunchtime and I meet Norm, as he hangs up a phone call (on a landline!) and levitates above the partition between us. And the first words the motherfucker says to me are, "You ever do that, pretend to pick up your wife at lunch and do it?!" and I just stare at him like I'm on the wrong side of the glass at the zoo. And our whole relationship for almost a decade is that, one of us on the other side of the glass not quite hearing the other; we're the two strongest personalities in the room and it sucks for us and it sucks for everyone else and thank God there's someone above us who knows enough to keep us apart because we drive each other and everyone else nuts. I'm a perfectionist who doesn't want to be questioned when he fucks up and Norm becomes a project manager who files a ticket asking why you fucked up, then immediately phones to ask why you haven't responded about that then shows up at your desk to see what a fuck-up looks like while you're looking up how the Do Not Disturb thing works on the phone (seriously, land lines! like old black-and-white movies). So they kept us apart because we were So Different and it went fine and the only time they didn't keep us apart they shipped us to England and Norm was so NORM that it was almost an International Incident and that's about it for my memories. I left, he left, he went back and we saw each other a couple of times in the last decade.&lt;/p&gt;

&lt;p&gt;And then last week he killed himself. And fuck me Norm. Because goddamnit I thought we were a lot different and it turns out we were the same. My mom would have called you "Bright Eyes" too because those eyes hide the same fucking poor impulse control, wanting to let someone else in on The Secret. Fuck, I know that secret too and it sucks and I never imagined someone who seemed way cooler knew it and I am broken-hearted that I couldn't have done better by you or anyone else who has those bright eyes that want to tell you it hurts but can't say so because it's An Imposition. This world is rough and for some goddamn reason it keeps getting rougher and fuck me if I will ever be ok with the idea of losing someone who could make it fun sometimes.&lt;/p&gt;

&lt;p&gt;So if you're thinking of doing this to me too, fuck you, call me. Because I don't want to sit around for the rest of my life feeling shitty that I didn't do better by you too.&lt;/p&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/norm</guid></item><item><title>To the Job That Just Fired Me</title><link>http://thosecleverkids.com/thoughts/posts/job-just-fired-me</link><description>
To the Job That Just Fired Me&lt;br /&gt;
&lt;h2&gt;Lessons I Learned&lt;/h2&gt;

&lt;p&gt;Get the environment set up first. No matter what. Instead of getting it set up so I was comfortable with it, I just took the 6 Docker machines you provide and tried to run with that. I know better. I know that means it's not easy to debug, that it's hard to follow the code around, so I half-assed it and ran some of the containers and ran some of it locally. Except the system has one layer in one language talking to another layer in another language via an API that passes cookies around. So if the services aren't all running on the same fake "domain" the cookies don't work right and I spent days chasing ghosts because of that. That was stupid.&lt;/p&gt;

&lt;p&gt;On the other hand, asking developers to use a 100 gigabyte copy of the real database is a mistake in so many ways. It didn't even fit on my laptop. 100 gig means 200 gigs free: 100 for the file and 100 for the database you're restoring (or thereabouts). My fancy Macbook with an SSD only has 250 gigs of space total. Even if it fit, having a database that big means no one is going to refresh it unless they absolutely have to. It also means every developer has a lot more information than they need.&lt;/p&gt;

&lt;h2&gt;Joining&lt;/h2&gt;

&lt;p&gt;An onboarding process would be good. I know I'm just a contractor, but expecting to drop me in an environment with a ton of logic spread across two back-end languages, a ton of SQL and a bunch of JavaScript framework code without any documentation is asking a lot. Expecting someone to find their way across a database with 8 separate schemas and many hundreds of tables without a database diagram is . . . unrealistic. It would be faster and better to suck it up and pair a veteran with a new hire for a couple of weeks as an investment in getting people up to speed and being effective a lot faster. The team dynamic is weird. The people are all very nice but there's no clarity to who I should and shouldn't be bothering or when. And then there's That Guy. The guy multiple people warned me about. The guy you laughed about when I smiled ruefully at his Thinks He Knows code reviews. &lt;a href="https://twitter.com/tclancy/status/862069601676427265"&gt;He's a cancer&lt;/a&gt;. Rather than helping everyone be better, he wants everyone to know he's better. None of his feedback is actually actionable. It's all references to books that may or may not be applicable but the rule in life is "Show, don't tell". He's only a teller. I never imagined a person who would literally pop into group chats to announce which IDE everyone should be using. That's borderline insane. You need to manage him. Instead, when he shit in my hat for no good reason you didn't push back, just suggested he was "Too busy" to be providing all that useful insulting code review to get him to go away.&lt;/p&gt;

&lt;h2&gt;Leaving&lt;/h2&gt;

&lt;p&gt;Even if you're not going to come up with an onboarding process, please figure out the off-boarding process. You completely telegraphed the fact you were going to cut me loose, saying you needed 20 minutes to find a conference room (and then requiring me to ping you at 30 minutes). In that time, regardless of the outcome of our conversation, all of my access should have been revoked. Don't try to be nice. Don't worry about how to frame a conversation. Take all access away. God knows we have too much. Heck, I'm writing this 4 hours later and you are talking to someone about my contract language. I still have access to all of the code repositories. I have access to every dev and QA server. Shit, I have &lt;code&gt;sudo&lt;/code&gt; access on them (!). Maybe I couldn't do any lasting damage, but a meaner man could make a mess of your tomorrow. Especially since merging into certain branches causes auto-deployments. Emptying out the codebase and altering the requirements files to install a bunch of incompatible packages would be fun. Clearing out the databases would cause how much downtime, etc. And that's a good argument for slimming down the databases that go to developers. At a minimum, change all the user passwords to a standard password so we can't set up a job to crack every client password you have. Come on.&lt;/p&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/job-just-fired-me</guid></item><item><title>Handy Bit of Python Detective Kit</title><link>http://thosecleverkids.com/thoughts/posts/handy-bit-python-detective-kit</link><description>
Handy Bit of Python Detective Kit&lt;br /&gt;
&lt;p&gt;I'm working on (&lt;a href="http://thosecleverkids.com/thoughts/posts/upgrading-django"&gt;yet another&lt;/a&gt;) Django upgrade for a client and the project is old enough that it's affected by the structure changes in Django 1.4, compounded by some seriously custom structure of its own. I kept getting an error from Django's &lt;code&gt;autoreload&lt;/code&gt; saying &lt;code&gt;The system cannot find the file specified: 'manage.py'&lt;/code&gt;. I traced it back to the prefixes on &lt;code&gt;ROOT_URLCONF&lt;/code&gt; and &lt;code&gt;WSGI_APPLICATION&lt;/code&gt; in the settings and then some path manipulation in the &lt;code&gt;wsgi&lt;/code&gt; file, but along the way I suspected there might be some hard-coded paths hidden in &lt;code&gt;__init__.py&lt;/code&gt; files throughout the app and managed to find all of the possible candidates with &lt;code&gt;find . -name "__init__.py" -size +1c&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Oh yeah: and always delete &lt;code&gt;.pyc&lt;/code&gt; files when your changes don't seem to have any effect!&lt;/p&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/handy-bit-python-detective-kit</guid></item><item><title>Autocomplete in Python Shell on Windows</title><link>http://thosecleverkids.com/thoughts/posts/autocomplete-python-shell-windows</link><description>
Autocomplete in Python Shell on Windows&lt;br /&gt;
&lt;p&gt;Because I drive myself insane replicating this when I find I want autocomplete on Windows, here are the steps (as of January 2017 anyway):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pip install pyreadline&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pip install ipython[shell]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Except right now step 2 fails when installing &lt;code&gt;scandir&lt;/code&gt; so I grabbed it &lt;a href="http://www.lfd.uci.edu/~gohlke/pythonlibs/#scandir"&gt;here&lt;/a&gt;, installed the .whl file via pip and then ran that second step.&lt;/p&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/autocomplete-python-shell-windows</guid></item><item><title>Dear Josie: On Weasel Words</title><link>http://thosecleverkids.com/thoughts/posts/dear-josie-weasel-words</link><description>
Dear Josie: On Weasel Words&lt;br /&gt;
&lt;p&gt;Dear Josie,&lt;/p&gt;

&lt;p&gt;On the very off-chance I don't get a chance to barrage you about this a thousand times, here's a lesson on weasel words. Take a look at &lt;/p&gt;

&lt;p&gt;&lt;img src="/static/thoughts/kelly-front.jpg" alt="Mailer front" /&gt;&lt;/p&gt;

&lt;p&gt;Always be suspicious when politicians or advertisers (if there's still a difference) don't say what they mean or aren't exacting in their words. Consider "standing up for women's health care" and "No woman should be denied access to health care". What issue could this possibly be about? It can't be about Universal Health Care: that applies to men and children in addition to adult women. The access issues about women's health in 2016 are abortion in particular and whether the government funds Planned Parenthood in general and that's essentially a proxy for the argument about abortion: while Planned Parenthood provides a number of services for women the political discourse makes it sound like a drive-thru for abortion. &lt;/p&gt;

&lt;p&gt;Freedom of choice is important not so much because everybody loves to have abortions but because it represents freedom from patriarchy and is arguably a necessity for gender equality. So talking about things like "women's health care" instead of saying "I am for/ against abortion access" is a clever lie to try to attract undecided voters. When in doubt, go with a trustworthy jerk over a clever liar. &lt;em&gt;Speaking of which&lt;/em&gt; (which is a favorite phrase of yours right now because you can't figure out when to use it):&lt;/p&gt;

&lt;p&gt;&lt;img src="/static/thoughts/kelly-back.jpg" alt="Mailer back" /&gt;&lt;/p&gt;

&lt;p&gt;"Access to over-the-counter birth control" doesn't mean shit. I have access to Fabergé eggs; all I need to do is stump up the tens of millions of dollars to buy one. "Access" is a wonderful weasel word. All it promises is the item in question won't be rounded up and fired into space. But at least she's for Planned Parenthood, right? "Funding for community health centers that provide women's health care" is a long way away from "I support centers that provide abortion information or abortion access". Those centers can be anything, including religious-based centers that do the opposite of what she's trying to position herself as in this mailing to women.&lt;/p&gt;

&lt;p&gt;In short, down with people who won't say what they mean and down with Kelly Ayotte.&lt;/p&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/dear-josie-weasel-words</guid></item><item><title>Getting Back to Full Stack</title><link>http://thosecleverkids.com/thoughts/posts/getting-back-full-stack</link><description>
Getting Back to Full Stack&lt;br /&gt;
&lt;p&gt;I started out as a front-end developer and became a very good one right around the time we all moved to CSS and XHTML. I was lucky the company I worked for was forward-thinking enough to encourage me to try back-end development and thanks to some great co-workers, practice and reading, I became a very good back-end developer as well. When I went off to work on my own I (slowly) discovered back-end development paid a lot better, which makes sense: learning HTML, CSS and some level of JavaScript is a good entry point to whatever you want to do as a coder and for a lot of people it's exactly what they do want to do. So the pool of people who can do a decent job on a front-end project is much larger. Being able to design a system, map it out and actually implement it in a timely fashion is a rarer skill. And it's riskier: screw up your estimate on a front-end project by 50% and you may lose a week or two of billing. Mess it up on a back-end system and you could be in financial pain for a long time.&lt;/p&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/getting-back-full-stack</guid></item><item><title>Upgrading Django</title><link>http://thosecleverkids.com/thoughts/posts/upgrading-django</link><description>
Upgrading Django&lt;br /&gt;
&lt;p&gt;For the second time in a few years I've found myself doing a number of Django upgrades. It's a good thing: I'm happy the framework I chose to base most of my work on when I went solo has stayed relevant. But this time I wanted to document some of the pain points to make things easier on anyone else going through the same.&lt;/p&gt;

&lt;p&gt;First off, this round of updates has been a lot easier than the first: back then I was the point of contact for &lt;a href="https://www.webfaction.com/"&gt;WebFaction&lt;/a&gt; clients who had a Django app but no longer had a developer and those orphaned projects trended &lt;em&gt;ancient&lt;/em&gt;. I started working with Django in 2009 with &lt;a href="https://www.djangoproject.com/weblog/2009/jul/29/1-point-1/"&gt;Django 1.1&lt;/a&gt; and that was modern compared to most of the WebFaction projects. The biggest challenge in that group was a project running on 0.96 and using &lt;code&gt;psycopg&lt;/code&gt;. I'd been installing &lt;code&gt;psycopg2&lt;/code&gt; for so long at that point it never occurred to me there was a version before it. And the Internet felt the same way: obtaining a version of Django that old was a challenge (see &lt;a href="http://stackoverflow.com/questions/19179881/how-do-i-get-an-older-version-of-django-pip-says-could-not-find-version"&gt;this thread&lt;/a&gt; for how to get versions no longer listed in Pypi). Obtaining a copy of &lt;code&gt;psycopg&lt;/code&gt; proved impossible (I cheated and wound up downloading the folder from the client's &lt;code&gt;site-packages&lt;/code&gt; directory and using that to replicate the issue they were seeing-- definitely not a recommended approach).&lt;/p&gt;

&lt;h2&gt;General Guidelines&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use a &lt;a href="http://docs.python-guide.org/en/latest/dev/virtualenvs/"&gt;&lt;code&gt;virtualenv&lt;/code&gt;&lt;/a&gt; or similar concept. If you're already doing so, great. If you are not, now is definitely the time to start. If you're doing anything more than a minor upgrade/ working on a project with no 3rd party libraries, you are going to run into some "dependency hell" where you've updated to Django 1.NEW and updated all your code to be compatible and then find out some libraries you use aren't compatible. The best case scenario is where you just need to update the libraries to their latest versions too, but you may have to play around with the versions to make it all work. Otherwise you need to figure out how to replace the library or &lt;a href="https://bitbucket.org/tclancy/django_openid_provider"&gt;fork it&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Implicit in my &lt;code&gt;virtualenv&lt;/code&gt; suggestion is that you also use &lt;code&gt;pip&lt;/code&gt; to install packages and &lt;code&gt;pip freeze&lt;/code&gt; to create a requirements file &lt;em&gt;with the exact versions&lt;/em&gt; of the libraries your project uses. &lt;/li&gt;
&lt;li&gt;If you are updating from a truly old version of Django, try not to get too hung up on updating to the latest and greatest. You might have to shoot for something a little bit older because the incompatibilities are just too great or there isn't enough time right now to make it all work. In updating my old site from 1.2 to 1.10 I actually stopped at 1.6 for a while instead. This is another place &lt;code&gt;virtualenv&lt;/code&gt; is your friend: at one point I had three local environments for my site, &lt;code&gt;tkc&lt;/code&gt; (live), &lt;code&gt;tkc16&lt;/code&gt; and &lt;code&gt;tkc110&lt;/code&gt;. Once I finished the upgrade process, I deleted the first two and renamed &lt;code&gt;tkc110&lt;/code&gt; to &lt;code&gt;tkc&lt;/code&gt; and it was like nothing ever happened. Be aware of the &lt;a href="https://www.djangoproject.com/download/#supported-versions"&gt;long-term release versions and the deprecation schedule&lt;/a&gt; when targeting a new version.&lt;/li&gt;
&lt;li&gt;If you are jumping from a really old version, do some reading on the release notes to see what new features are available to you. I'm focusing on problems you may run into and backwards-incompatible changes, but one of the major reasons to upgrade are all the improvements you get. Be aware of things like &lt;a href="https://docs.djangoproject.com/en/1.10/ref/models/querysets/#select-related"&gt;&lt;code&gt;select_related&lt;/code&gt;, &lt;code&gt;prefetch_related&lt;/code&gt; and &lt;code&gt;only&lt;/code&gt;&lt;/a&gt; for making queries faster.&lt;/li&gt;
&lt;li&gt;Change from &lt;a href="https://docs.djangoproject.com/en/1.10/topics/http/shortcuts/#render-to-response"&gt;&lt;code&gt;render_to_response&lt;/code&gt;&lt;/a&gt; to &lt;a href="https://docs.djangoproject.com/en/1.10/topics/http/shortcuts/#django.shortcuts.render"&gt;&lt;code&gt;render&lt;/code&gt;&lt;/a&gt;. It will make things easier and the former is soon to be removed.&lt;/li&gt;
&lt;li&gt;If you get stuck because the changes to project layout or syntax have changed so much, try creating a new &lt;code&gt;virtualenv&lt;/code&gt; and project with 1.10 (or similar) and then dragging your apps into the project. You will still need to update a bunch of stuff but it may make things a lot easier and help with your future-proofing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Version-Specific Notes&lt;/h2&gt;

&lt;h3&gt;&lt;a href="https://docs.djangoproject.com/en/1.10/releases/1.10/"&gt;1.10&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.djangoproject.com/en/1.10/releases/1.10/#new-style-middleware"&gt;Major changes to middleware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If you are using MySQL (don't start now), &lt;a href="https://code.djangoproject.com/ticket/15940"&gt;Django recommends&lt;/a&gt; you turn on strict mode. See &lt;a href="https://github.com/django/django/commit/b2aab09fe99b0e6e2e0357a7a794355a631c3039"&gt;project note&lt;/a&gt; about why and &lt;a href="http://stackoverflow.com/a/23023015/7376"&gt;this answer for how&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;django.conf.urls.patterns&lt;/code&gt; is gone and all view references in &lt;code&gt;urls.py&lt;/code&gt; need to be imported views, not string names.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;&lt;a href="https://docs.djangoproject.com/en/1.10/releases/1.9/"&gt;1.9&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The admin got a facelift!&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.djangoproject.com/en/1.10/releases/1.9/#password-validation"&gt;Password validation options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;django.contrib.sites&lt;/code&gt; is no longer included by default, which can cause a &lt;code&gt;RuntimeError: Model class django.contrib.sites.models.Site doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS&lt;/code&gt;. Just add it back to &lt;code&gt;INSTALLED_APPS&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;django.utils.log.NullHandler&lt;/code&gt; was removed, &lt;a href="http://stackoverflow.com/questions/34348360/cannot-resolve-django-utils-log-nullhandler-in-django-1-9"&gt;replace the references with logging.NullHandler&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;&lt;a href="https://docs.djangoproject.com/en/1.10/releases/1.8/"&gt;1.8&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Major settings change: &lt;a href="https://docs.djangoproject.com/en/1.10/ref/templates/upgrading/#the-templates-settings"&gt;the new &lt;code&gt;TEMPLATES&lt;/code&gt; setting replaces all &lt;code&gt;TEMPLATE_*&lt;/code&gt; settings&lt;/a&gt;. This is a bit of PITA as you have to move a bunch of things into their new home in that setting.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;select_related&lt;/code&gt; actually checks that the fields exist on the model you are querying. Previously this just silently ignored the error and you were left thinking you'd improved performance when you weren't doing anything.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;django.contrib.formtools&lt;/code&gt; is replaced by an &lt;a href="https://github.com/django/django-formtools/"&gt;external app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The syntax of &lt;code&gt;urls.py&lt;/code&gt; files changed: you now have to have &lt;code&gt;url(regex, view)&lt;/code&gt; instead of just &lt;code&gt;(regex, view)&lt;/code&gt;, otherwise you will get &lt;code&gt;AttributeError 'tuple' object has no attribute 'regex'&lt;/code&gt;. Make note of the changes in 1.10 to &lt;code&gt;urls.py&lt;/code&gt; files if you're going to be updating all of them anyway.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.djangoproject.com/ticket/18659"&gt;&lt;code&gt;request.REQUEST&lt;/code&gt; was removed&lt;/a&gt;, but you weren't using that anyway, were you?&lt;/li&gt;
&lt;li&gt;Drops support for Postgres &amp;lt; 9.0 (and then 9.0 and 9.1 are dropped in .9 and .10) and MySQL &amp;lt; 5.5&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;&lt;a href="https://docs.djangoproject.com/en/1.10/releases/1.7/"&gt;1.7&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Major update which makes &lt;a href="https://docs.djangoproject.com/en/1.10/topics/migrations/"&gt;database migrations&lt;/a&gt; a built-in part of Django instead of relying on 3rd party apps (usually South). See the &lt;a href="https://realpython.com/blog/python/django-migrations-a-primer/"&gt;differences here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.djangoproject.com/en/1.10/releases/1.7/#app-loading-changes"&gt;App loading changes&lt;/a&gt; may mean needing to reorder or &lt;a href="http://stackoverflow.com/questions/34114427/django-upgrading-to-1-9-error-appregistrynotready-apps-arent-loaded-yet"&gt;move some stuff.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If you are using South, there's a &lt;a href="https://docs.djangoproject.com/en/1.7/topics/migrations/#upgrading-from-south"&gt;guide to changing over&lt;/a&gt;. One thing that's not obvious: in addition to removing &lt;code&gt;'south'&lt;/code&gt; from your &lt;code&gt;INSTALLED_APPS&lt;/code&gt;, you actually need to uninstall it from your &lt;code&gt;virtualenv&lt;/code&gt; or you will get errors like &lt;a href="http://stackoverflow.com/questions/29647602/there-is-no-south-database-module-south-db-postgresql-psycopg2-for-your-databa"&gt;&lt;code&gt;There is no South database module 'south.db.postgresql_psycopg2' for your database.&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.djangoproject.com/en/1.10/releases/1.7/#contrib-middleware-removed-from-default-middleware-classes"&gt;Default middleware changed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The syntax/ imports of the &lt;code&gt;.wsgi&lt;/code&gt; file project use changed. You may run into &lt;code&gt;AppRegistryNotReady: Apps aren't loaded yet&lt;/code&gt;. See this &lt;a href="http://stackoverflow.com/questions/26276397/django-1-7-upgrade-error-appregistrynotready-apps-arent-loaded-yet"&gt;StackOverfloew thread&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RuntimeError: populate() isn't reentrant&lt;/code&gt; - there are a &lt;a href="http://stackoverflow.com/questions/27093746/django-stops-working-with-runtimeerror-populate-isnt-reentrant"&gt;number of possible causes for this&lt;/a&gt; (and I'm not sure if there are all 1.7-specific). In my case it was a dumb error where I had an app listed twice in &lt;code&gt;INSTALLED_APPS&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;&lt;a href="https://docs.djangoproject.com/en/1.10/releases/1.6/"&gt;1.6&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Not much new, simplified setup, swapped a couple of defaults in settings. At least that's how I remember it and its why I chose this as a halfway step in my own update.&lt;/li&gt;
&lt;li&gt;Actually there's one change that will bite you if you have any custom managers: &lt;code&gt;get_query_set&lt;/code&gt; is now &lt;code&gt;get_queryset&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;django.contrib.localflavor&lt;/code&gt; is gone, replaced by a &lt;a href="https://django-localflavor.readthedocs.io/en/latest/"&gt;3rd-party app&lt;/a&gt;. Update your requirments file and your references.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;django.contrib.markup&lt;/code&gt; is gone. You will need a &lt;a href="https://github.com/trentm/django-markdown-deux"&gt;replacement.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;There no longer is a &lt;code&gt;.raw_post_data&lt;/code&gt; attribute on Request objects. Use &lt;code&gt;.body&lt;/code&gt; instead.&lt;/li&gt;
&lt;li&gt;There was a change to session handling. If, after upgrading, you get an error from the &lt;code&gt;SessionMiddleware&lt;/code&gt; telling you a value isn't JSON-serializable, you need to &lt;a href="http://stackoverflow.com/a/24233767/7376"&gt;swap back to the old way of handling sessions&lt;/a&gt; by adding this to your &lt;code&gt;settings.py&lt;/code&gt;: &lt;code&gt;SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;&lt;a href="https://docs.djangoproject.com/en/1.10/releases/1.5/"&gt;1.5&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Introduces a &lt;a href="https://docs.djangoproject.com/en/1.10/releases/1.5/#configurable-user-model"&gt;configurable &lt;code&gt;User&lt;/code&gt; model&lt;/a&gt;. A user in the &lt;a href="https://www.reddit.com/r/django/comments/57gu0e/django_version_upgrade_guide/"&gt;reddit discussion&lt;/a&gt; of this post said it caused them &lt;a href="https://www.reddit.com/r/django/comments/57gu0e/django_version_upgrade_guide/d8t30o3"&gt;problems due to a subclassed &lt;code&gt;User&lt;/code&gt; model in their project.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The syntax of the &lt;a href="https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#url"&gt;&lt;code&gt;{% url %}&lt;/code&gt;&lt;/a&gt; tag changed and now the url name has to be quoted. If you use an editor that supports multi-file search-and-replace, you can &lt;a href="http://jpadilla.com/post/47025152553/shifting-to-new-style-url-tag-in-django-15"&gt;update all your templates&lt;/a&gt; easily. Pro-tip: do this in its own branch or similar for safety's sake.&lt;/li&gt;
&lt;li&gt;Introduces the &lt;a href="https://docs.djangoproject.com/en/1.10/ref/settings/#allowed-hosts"&gt;&lt;code&gt;ALLOWED_HOSTS&lt;/code&gt; setting&lt;/a&gt;. &lt;strong&gt;Make sure to do this&lt;/strong&gt; because it will bite you: the setting only applies if &lt;code&gt;DEBUG = False&lt;/code&gt;, so you won't run into errors locally but then your brand-new, updated site will not respond when you post it live.&lt;/li&gt;
&lt;li&gt;Deprecates &lt;code&gt;django.utils.simplejson&lt;/code&gt;. Can do a search and replace to &lt;code&gt;import json&lt;/code&gt; instead. Unrelated to any upgrade stuff, if you do a lot of JSON processing or a little bit of JSON processing on very big pieces of JSON, take a look at &lt;a href="http://artem.krylysov.com/blog/2015/09/29/benchmark-python-json-libraries/"&gt;&lt;code&gt;ujson&lt;/code&gt;&lt;/a&gt;. I've gotten a lot of free performance improvements from it.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;direct_to_template&lt;/code&gt; is gone. Use &lt;a href="http://stackoverflow.com/questions/15621048/how-can-i-satisfy-an-import-of-direct-to-template"&gt;this solution in its place&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;&lt;a href="https://docs.djangoproject.com/en/1.10/releases/1.4/"&gt;1.4&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Lots of good new stuff introduced in this version, the biggest being &lt;a href="https://docs.djangoproject.com/en/1.10/topics/i18n/timezones/"&gt;timezone support&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The concept of &lt;code&gt;ADMIN_MEDIA&lt;/code&gt; is replaced by static files app from 1.3&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.djangoproject.com/en/1.10/releases/1.4/#django-conf-urls-defaults"&gt;&lt;code&gt;django.conf.urls.defaults&lt;/code&gt; is replaced by &lt;code&gt;django.conf.urls&lt;/code&gt;&lt;/a&gt;. Update your &lt;code&gt;urls.py&lt;/code&gt; files accordingly.&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://docs.djangoproject.com/en/1.10/releases/1.4/#updated-default-project-layout-and-manage-py"&gt;default project structure changed&lt;/a&gt; along with the contents of &lt;code&gt;manage.py&lt;/code&gt;. You may run into some errors like "The system cannot find the file X" until you restructure (or update how you reference urls, etc in the settings).&lt;/li&gt;
&lt;li&gt;Error: &lt;code&gt;"No modules named six"&lt;/code&gt; - this is an annoying one I ran into with a couple 3rd party libraries. I was testing which versions I could easily update to by updating to 1.2.0, 1.3.0, 1.4.0, etc. The problem is &lt;code&gt;six&lt;/code&gt; was introduced in Django 1.4.2 so don't update to anything less than that if you're going to use 1.4.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;&lt;a href="https://docs.djangoproject.com/en/1.10/releases/1.3/"&gt;1.3&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The big thing here is the introduction of &lt;code&gt;staticfiles&lt;/code&gt;. If you've never dealt with that, it's a sea change and you will need to &lt;a href="https://docs.djangoproject.com/en/1.10/howto/static-files/"&gt;read the documentation&lt;/a&gt; about how to change things. Essentially, this was splitting up the idea of media (user-generated uploads) from your site's static assets.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.djangoproject.com/en/1.10/topics/class-based-views/"&gt;Class-based views&lt;/a&gt; are also added here. You're not obligated to use them but if you rely on a lot of generic views, you're going to need to update those.&lt;/li&gt;
&lt;li&gt;CSRF protection now applies to Ajax views as well.&lt;/li&gt;
&lt;/ul&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/upgrading-django</guid></item><item><title>Debugging a Vue.js Error</title><link>http://thosecleverkids.com/thoughts/posts/debugging-vuejs-error</link><description>
Debugging a Vue.js Error&lt;br /&gt;
&lt;p&gt;I know it's been a while and I really should write more often, but this is just a quick one for Google to index in case it happens to someone else: I recently wrote my first &lt;a href="https://vuejs.org/"&gt;vue.js&lt;/a&gt; component and was really pleased with how easy it was to build . . . right up until I deployed it live and it didn't work. It took me about an hour of fiddling with the production version of the site, swapping to the non-minified version, shutting off the CSS and JavaScript compression from &lt;code&gt;django-compressor&lt;/code&gt; and desperately staring into the (really cool) &lt;a href="https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=en"&gt;Vue debugging panel for Chrome&lt;/a&gt;. I thought it was a problem with the REST API data getting to the component too slowly because Vue kept complaining the rows were missing the properties I was referencing, but looking in the debugging panel I could see Vue was properly loading the data. I finally found the problem by viewing the source of local and live side-by-side which was harder than it sounds because the HTML is minfied in production. I was just about to put the two sets of HTML into a pretty-fier when I saw the difference: &lt;a href="https://pypi.python.org/pypi/django-htmlmin"&gt;&lt;code&gt;django-htmlmin&lt;/code&gt;&lt;/a&gt; doesn't just strip whitespace (I suppose it can't do that), it parses the HTML and apparently makes it "valid" which was moving my Vue templates around to places they shouldn't be. After a quick test and putting the URL in &lt;code&gt;EXCLUDE_FROM_MINIFYING&lt;/code&gt; in my settings file, all was right with the world.&lt;/p&gt;

&lt;p&gt;(Ironically, this post took about 30 minutes to get live because I had to run down another rat hole debugging what turned out to be an out-of-date version of &lt;code&gt;django-tagging&lt;/code&gt; as I recently upgraded this site. That is another post though. Hopefully.)&lt;/p&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/debugging-vuejs-error</guid></item><item><title>Worst Pickup Line: A Play in One Act</title><link>http://thosecleverkids.com/thoughts/posts/worst-pickup-line-play-one-act</link><description>
Worst Pickup Line: A Play in One Act&lt;br /&gt;
&lt;p&gt;INT - BEER STORE - DAY&lt;/p&gt;

&lt;p&gt;CREEPY GUY, a man in his late 50s in hiking shorts and an ankle brace is paying for a popsicle at a beer store at 10:30 in the morning with the change from what is either a prescription pill container or a film canister. He holds the canister out so the cashier can return his change without touching him&lt;/p&gt;

&lt;p&gt;CREEPY GUY: You still married to the guy who owns this place?&lt;/p&gt;

&lt;p&gt;CASHIER: Yeah&lt;/p&gt;

&lt;p&gt;CREEPY GUY: He treating you alright?&lt;/p&gt;

&lt;p&gt;CASHIER [_moves to closed register with a pile of newspapers on it_]: I can take you over here sir.&lt;/p&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/worst-pickup-line-play-one-act</guid></item><item><title>Exception Handling</title><link>http://thosecleverkids.com/thoughts/posts/exception-handling</link><description>
Exception Handling&lt;br /&gt;
&lt;p&gt;I've been thinking about exception handling a lot recently. A., because I'm stultifying and B., because it's been a source of contention in the codebase I'm responsible for. I wrote some formal documentation last week to try to normalize our approach, but I'm not happy with it. I'm not good at writing formal documentation&amp;mdash; it always comes out stiffer than I want and feels like all nuance is lost. Also, I'm in the middle of listening to &lt;a href="http://5by5.tv/changelog/100"&gt;this podcast&lt;/a&gt; about the Go Language and they've just touched on exceptions and I think it's helped me crystalize my thoughts. This post will tell if that's true. &lt;/p&gt;

&lt;h2&gt;Exception Enlightenment&lt;/h2&gt;

&lt;h3&gt;Step One: complete newbie&lt;/h3&gt;

&lt;p&gt;No exception handling happens here. The second your code works once, you're done. "No one touch anything, it works." You push the baby bird out of the nest, ask a coworker to try it out and hold your breath. In the worst case, they're a friend and try to use the program the way you think it should work. In the best case, they're a prick and put in numbers where you ask for text and text where you ask for numbers and try to divide everything by zero.&lt;/p&gt;

&lt;h3&gt;Step One Point Five: "I've got to do _something_"&lt;/h3&gt;

&lt;p&gt;You add checks for everything your tester tried and everything else you can think of. You quickly learn you can't think of much because you think like the program (or, more accurately, the program is laid out the way you think through problems). Someone puts in a floating point number for their name and you're right back where you started. Maybe you hear about fuzz testing, maybe you know a lot of assholes. The inevitable conclusion: you can't possibly think of everything and prevent it.&lt;/p&gt;

&lt;h3&gt;Step Two: exception handling&lt;/h3&gt;

&lt;p&gt;Holy shit! You can prevent everything that could ever go bad. It's as simple as this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
try:
    answer = a / b
except:
    # suck it haters!
    answer = 0
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;My guess is this is where a lot of people give up on programming, stop growing as a programmer or relegate programming to a hobby or something they do only when they have to because this approach makes life so much harder.&lt;/p&gt;

&lt;h3&gt;Step Three: a little bit of light&lt;/h3&gt;

&lt;p&gt;It turns out "naked" try/ catch blocks where you don't bother to specify what kind of exception you're handling are much worse than not doing anything. You learn this after smashing your head against your monitor for a day trying to figure out why something doesn't work but doesn't blow up only to finally see the &lt;code&gt;try/ catch&lt;/code&gt; your eyes normally skim past without noticing. "Couldn't be. Nah. Well, maybe . . . " and you rip out the block and there it is: you thought you were catching a type error to stop users passing in strings and maybe handling divide-by-zero while you were at it, but it turns out it's also swallowing a whole host of floating point ugliness, missing variables, an import you forgot and hey, it looks like your network connection is in the crapper.&lt;/p&gt;

&lt;p&gt;So now you need to do some reading and it turns out exception handling is a microcosm of programming. There are multiple styles, opinions about how to use exceptions, whether to use exceptions, whether to expect exceptions (?!) . . . like choosing a language or a platform or anything else in programming, exception handling is one more bar brawl to stick your face into.&lt;/p&gt;

&lt;h3&gt;Step Four: I don't know what step four is yet&lt;/h3&gt;

&lt;p&gt;One of the things I dislike about Python is for a language whose &lt;a href="https://www.python.org/dev/peps/pep-0020/"&gt;founding principles&lt;/a&gt; include "There should be one&amp;mdash;  and preferably only one&amp;mdash; obvious way to do it", it's pretty unopinionated about how you use exceptions. We're told exceptions are inexpensive in Python (maybe said with a bit of a sneer and a knowing look in the direction of statically-typed languages), so much so they're used idiomatically in places you would otherwise be using an &lt;code&gt;if/ else&lt;/code&gt; test. That inexpensiveness is a bit misleading and &lt;a href="http://stackoverflow.com/questions/5589532/try-catch-or-validation-for-speed/5591737#5591737"&gt;you should think about which is the most common case&lt;/a&gt; in the code you're writing when deciding between &lt;code&gt;if/ else&lt;/code&gt; and &lt;code&gt;try/ catch&lt;/code&gt; but unless you're inside a loop inside a bit of code that gets called an awful lot, there are more important things in your code to worry about.&lt;/p&gt;

&lt;p&gt;All of which brings me to today and that podcast wherein one of the maintainers of the Go language at Google turns up his nose at exception handling in general (Go doesn't have it) and Python in particular. My immediate reaction was typical fanboy: start assembling arguments in favor of your chosen gang instead of listening to the other side. When I stopped and thought about it, I realized what they were discussing was probably really close to how I think of exceptions. &lt;/p&gt;

&lt;p&gt;There's a line of argument in the Exception Handling bar fight that goes something like this: "How can you handle exceptions when they're, by definition, &lt;em&gt;exceptional&lt;/em&gt;?" This typically comes from a Theoretical Asshole (somehow they're always assholes in real life too) who took some Comp Sci classes without ever hearing anything. The name means different things to different people: for some they're exceptions like when it rains in summer, for others they're Exceptions like when it rains in the desert. I fall into the former camp: I use exceptions interchangeably with &lt;code&gt;if/ else&lt;/code&gt; tests, most likely because I've been working in Python for too long. But whichever approach you prefer, let's agree you use an exception because you want to log something weird so you can stop it from happening in the future. What was argued against in the podcast is something I'd like to dismiss as a straw man because it's madness, but I've seen enough of it to know better. Whether &lt;code&gt;try/ catch&lt;/code&gt; or &lt;code&gt;if/ else&lt;/code&gt;, the code should look like:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
try:
    return a / b
except ThisOneWierdException:
    logging.exception("WTF?")
    return error_message("You really are an asshole, you know that?")
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Never like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
try:
    answer = a / b
except ThisOneWierdException:
    answer = default
keep_doing_stuff_like_nothing_is_wrong_like_you_always_DO_mom()
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;At this point I do have to pick nits about the word: it's an exception. You're not supposed to keep soldiering on. There are things like "Try to find the user's old data in a file on disk, if that doesn't exist, try looking in the database, if that doesn't exist start with a blank data set." You can use &lt;code&gt;if/ else&lt;/code&gt; or &lt;code&gt;try/ catch&lt;/code&gt; for that kind of thing, I don't care. But if you expect the thing to happen, it's not exceptional. When something exceptional does happen, get out, log everything you can and try to patch the hole tomorrow.&lt;/p&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/exception-handling</guid></item><item><title>Java Version Hell on OSX</title><link>http://thosecleverkids.com/thoughts/posts/java-version-hell-osx</link><description>
Java Version Hell on OSX&lt;br /&gt;
&lt;p&gt;In one of those "Why did I even look at the terminal" moments, I noticed Solr stopped working properly in a local Django setup. Initially I ignored a slew of 404 errors when Haystack tried to reindex because . . . well because who the hell cared? I'm not trying to find anything, I'm trying to build stuff. Which means I immediately got a feature request related to searching. Not only was Solr not reindexing, but trying to visit the Solr console at http://127.0.0.1:8983/solr returned a 404 error page saying&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
No context on this server matched or handled this request. Contexts known to this server are . . .
&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;Now actually looking at the ream of text going by on Solr startup I noticed &lt;code&gt;UnsupportedClassVersionError&lt;/code&gt; was the root problem. This happens when you're trying to run Java code that was compiled for a newer version than you are running. Annoying given I don't actually work with the language so why is it given me such a hassle and strange because I installed Solr with &lt;a href="http://brew.sh/"&gt;homebrew&lt;/a&gt; and homebrew doesn't make mistakes like that (especially since it all worked for a long time after install). Distant bells started ringing about something I installed* that let me know it needed an older version of Java. I said yes because like everyone else, dev or non-dev, I pretty much agree to prompts to get them to leave me alone and who the hell would suspect the thing not only installed an older version of Java but then went on to make it the system version? The nicest thing I can say about a mind that reaches such a solution is there's a reason people crap on Java projects.&lt;/p&gt;

&lt;p&gt;To add a little extra spice to make life extra nice, Apple and Oracle hate each other and so you have to run between the trenches in No Man's Land of their war to get Java installed. Looking for Java 1.7, I started &lt;a href="http://stackoverflow.com/questions/6267392/how-do-i-use-jdk-7-on-mac-osx"&gt;with this Stack Overflow thread&lt;/a&gt; and installed the linked DMG and everything was all better. &lt;/p&gt;

&lt;p&gt;No of course it wasn't, don't be silly. &lt;/p&gt;

&lt;p&gt;Nothing happened as far as I could see. &lt;code&gt;java -version&lt;/code&gt; (BTW, it's awesome Java can't follow the convention of a single dash for shorthand command line switches and a double dash for full name switches) still returned 1.6 and looking in &lt;code&gt;/System/Library/Frameworks/JavaVM.framework/Current/&lt;/code&gt; still showed &lt;code&gt;CurrentJDK&lt;/code&gt; pointing to &lt;code&gt;/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents&lt;/code&gt;. Looking in &lt;code&gt;/System/Library/Java/JavaVirtualMachines/&lt;/code&gt; did not reveal a 1.7 folder waiting there to be found because that would mean any old idiot could solve this mystery instead of requiring a special kind of thickheaded idiot. I renamed the &lt;code&gt;CurrentJDK&lt;/code&gt; symlink to &lt;code&gt;JDK16&lt;/code&gt; for later on in life when this all bites me in the ass the other way 'round and then created a new symlink to the 1.7 version with this: &lt;code&gt;sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents CurrentJDK&lt;/code&gt;. Problem solved, at least until I have to use another piece of Java.&lt;/p&gt;

&lt;p&gt;&amp;lt;sub&amp;gt;* For the curious, I think it was when I installed 12 different versions of jMeter via homebrew in the hopes of getting an old jMeter script to actually open instead of throwing errors about bad counts. If you ever want to know about installing older homebrew formulae, &lt;a href="http://stackoverflow.com/questions/3987683/homebrew-install-specific-version-of-formula"&gt;here's a good start&lt;/a&gt;. &lt;code&gt;brew&lt;/code&gt; even has a &lt;code&gt;brew edit&lt;/code&gt; command so you can easily open the formula to repoint download links when the mirror it wants to use no longer has a copy of the ancient piece of crap you're trying to install.&amp;lt;/sub&amp;gt;&lt;/p&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/java-version-hell-osx</guid></item><item><title>The Garrison City Should Lock From the Outside</title><link>http://thosecleverkids.com/thoughts/posts/garrison-city-should-lock-outside</link><description>
The Garrison City Should Lock From the Outside&lt;br /&gt;
&lt;p&gt;At the beer store just before 3pm. I always get a little nervous when a car pulls in and someone from the backseat gets out.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DUI?&lt;/li&gt;
&lt;li&gt;Underage driver?&lt;/li&gt;
&lt;li&gt;Just plain crazy?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thankfully it was number three. After the young guy got out of the back, the front doors opened and out piled a chunky Lauren Ambrose (circa her &lt;a href="http://previously.tv/law-and-order/defending-lauren-ambroses-dignity/"&gt;&lt;em&gt;Law &amp;amp; Order&lt;/em&gt; star turn&lt;/a&gt;) and The Guy. He probably wasn't even 50, might have been under 40, but it was an &lt;em&gt;Indiana Jones&lt;/em&gt; "It's not the years, it's the miles" situation. The Guy was buying, which meant he felt justified in directing the younger two in what they should be picking up like Fagin with his urchins. For some reason Lauren Ambrose couldn't have her "I'M SICK OF BEING BOSSED AROUND" shit fit in the car and waited until the second her feet hit the threshold, like Burt Lancaster stepping over the baseline in &lt;em&gt;Field of Dreams&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Anyone hoping her storming out would make things less uncomfortable was been bitterly disappointed as The Man walked up to the nice old Indian cashier, asked her, "SPEAK ENGLISH?" and then embarked on a rant suggesting he wanted to learn. The only bits I caught were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when he demanded she touch his wet t-shirt to acknowledge he was working on a Friday even though it was raining&lt;/li&gt;
&lt;li&gt;when he somberly asked the owner for free packs of cigarettes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As Warren Ellis likes to say, "It's a strange world. Let's keep it that way.'&lt;/p&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/garrison-city-should-lock-outside</guid></item><item><title>Thoughts While Lowering a Crib</title><link>http://thosecleverkids.com/thoughts/posts/thoughts-while-lowering-crib</link><description>
Thoughts While Lowering a Crib&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;I get why people with kids feel like they need a bigger house: I'm trying to adjust a crib _in situ_ and it feels like parallel parking a parade float in Rome&lt;/li&gt;
&lt;li&gt;"No hon, I'll do it during the week when the house is quiet." And when it's finally hot out. Good work!&lt;/li&gt;
&lt;li&gt;I bet in the fine print of this Ikea manual there's a _Gremlins_-like warning saying, "Whatever you do, don't try to lower the mattress when it's humid out. Or you'll discover just how shoddy this pressboard fit is. It's only a child's safety, right?"&lt;/li&gt;
&lt;li&gt;What if Ikea is just a conspiracy to convert the US to the metric system?&lt;/li&gt;
&lt;li&gt;How many times has the average fishmonger heard, "&lt;a href="https://www.youtube.com/watch?v=VuNdnKDRSDA"&gt;Tell me all your thoughts on cod&lt;/a&gt;, 'cause I really want to hear 'em?"&lt;/li&gt;
&lt;li&gt;This is pretty close to the floor. I might as well schedule back surgery in advance.&lt;/li&gt;
&lt;li&gt;Wonder if we could get a claw from an old arcade prize machine hooked up here.&lt;/li&gt;
&lt;/ul&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/thoughts-while-lowering-crib</guid></item><item><title>wxPython on OSX Mavericks with or without Homebrew</title><link>http://thosecleverkids.com/thoughts/posts/wxpython-osx-mavericks-or-without-homebrew</link><description>
wxPython on OSX Mavericks with or without Homebrew&lt;br /&gt;
&lt;p&gt;Just a short note for anyone else who runs into this nonsense: I could not get the current version of wxPython to install in a useful way using homebrew. &lt;code&gt;brew install wxmac --python --devel&lt;/code&gt; to install into my Homebrew-controlled Python install worked, but it missed a portion of the code. There should have been a &lt;code&gt;python&lt;/code&gt; directory under &lt;code&gt;/usr/local/Cellar/wxmac/3.0.0/lib&lt;/code&gt; that contained the relevant code and a &lt;code&gt;wx.pth&lt;/code&gt; file I could symlink into virtualenvs. There was not. I don't know if this is a bug or an issue with my setup (some of the links mentioned Homebrew will only install it for use as a "framework" and I honestly have no idea what that means or time to investigate, but I think it may be relevant).&lt;/p&gt;

&lt;p&gt;So I tried using the &lt;a href="http://www.wxpython.org/download.php"&gt;installer provided at wxpython.org&lt;/a&gt; but those were all corrupt according to OSX. I had my suspicions about multiple files being corrupt and they turned out to be correct: the files aren't corrupt, &lt;a href="http://stackoverflow.com/questions/21223717/install-wxpython-on-mac-os-mavericks"&gt;they're not signed the way Apple wants.&lt;/a&gt;. Shutting off the privacy controls temporarily fixed that. Then it was a simple matter to symlink WX into a virtualenv, e.g., &lt;/p&gt;

&lt;p&gt;&lt;code&gt;ln -s /Library/Python/2.7/site-packages/wxredirect.pth ~/.virtualenvs/envname/lib/python2.7/site-packages/.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Update: turns out, once again, &lt;a href="https://github.com/Homebrew/homebrew/issues/28583#issuecomment-40958167"&gt;I am an idiot&lt;/a&gt;; contrary to what I'd read, you need to install &lt;code&gt;wxpython&lt;/code&gt;, which will include &lt;code&gt;wxmac&lt;/code&gt;, not the other way around.&lt;/p&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/wxpython-osx-mavericks-or-without-homebrew</guid></item><item><title>Django Profiling Bug</title><link>http://thosecleverkids.com/thoughts/posts/django-profiling-bug</link><description>
Django Profiling Bug&lt;br /&gt;
&lt;p&gt;I'm doing some work profiling a large Django application and I was running into this weird error when I tried to aggregate the stats with gather_profile_stats.py which comes with Django. It kept throwing &lt;code&gt;TypeError: zip argument #1 must support iteration&lt;/code&gt; if there were two profile files for the same bit of code. Searching for matching results was a ghost town and I was starting to think no one actually used gather_profile_stats.py because it was broken. Turns out there's a &lt;a href="http://bugs.python.org/issue7372"&gt;regression bug&lt;/a&gt; in early versions of Python 2.7. I applied the patch provided in the link and everything works. Posting this little note so it's not such a ghost town for the next person.&lt;/p&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/django-profiling-bug</guid></item><item><title>It's My Party (now)</title><link>http://thosecleverkids.com/thoughts/posts/its-my-party-now</link><description>
It&amp;#39;s My Party (now)&lt;br /&gt;
&lt;p&gt;I'm trying really hard to take parenting magazines seriously, but they seem to be written for a demographic that straddles dense and insecure. The latest unsolicited offering from &lt;em&gt;Parents&lt;/em&gt;&amp;mdash;&lt;/p&gt;

&lt;p&gt;&amp;lt;img src="http://images.meredith.com/parents/images/2014/04/l_ParentsMay2014_cover.jpg" /&amp;gt;&lt;/p&gt;

&lt;p&gt;is apparently for people who don't already know ice cream cake and enough room to run around tests really well with kids age 0 to 5. I suppose I &lt;em&gt;could&lt;/em&gt; spend a bunch of money and time on an incredibly indulgent party for Josie to feel superior to other parents, but wouldn't it be so much simpler and cheaper to ruin the other kids' parties? Weeks of planning and a few hundred bucks versus a few afternoons of distracting jugglers, arguing with clowns and playing "leave a tail for the donkey". No choice at all.&lt;/p&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/its-my-party-now</guid></item><item><title>Résumé Rewrite Services</title><link>http://thosecleverkids.com/thoughts/posts/resume-rewrite-services</link><description>
Résumé Rewrite Services&lt;br /&gt;
&lt;p&gt;&lt;em&gt;Helping people with a job application is not something I do. Unless you accidentally send it to me when asking your friends to review your cover letter before applying to be president of a bank. Especially if the email ends, "Constructive not your usual Tom. Thanks." This exchange is about a year old now so I don't think it's going to do anyone any harm (though I'm sad to report it looks like my help wasn't enough assuming the Management section of the web site is kept up).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The first thing I'd say is sending this to the wrong tclancy does not bespeak great attention to detail. Moving forward from there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Second graf, "For most of my career, I have been second-in-command" - this says the opposite of what you're trying to stress. Rather than suggesting you've been in positions of authority and gained insight into running a business, it makes it sound like you're typecast as a second banana.&lt;/li&gt;
&lt;li&gt;Fourth, "acquisition by US Trust..." don't use an ellipsis instead of a period. It makes you look like an Internet comment troll.&lt;/li&gt;
&lt;li&gt;Fifth, "I am &lt;strong&gt;greatly&lt;/strong&gt; involved with many of the initiatives related to these departments." - take it easy on the adverbs. It doesn't add anything here and feels clumsy&lt;/li&gt;
&lt;li&gt;First sentence in the sixth, I'm just not feeling it. Show, don't tell. You get the point across in the rest of the paragraph, but this just feels like marketing BS&lt;/li&gt;
&lt;li&gt;Eighth, the last sentence ("I take the time to listen . . .") is a car crash, with clauses running into strange punctuation and everybody veering out of control.&lt;/li&gt;
&lt;li&gt;In general, look for instances of the word "that" and see if the sentence still means the same without them and remove them.&lt;/li&gt;
&lt;li&gt;Tenth, REWORK. "I try to proactively manage expectation" - you're better than that. At least, Internet Stranger, I hope you are.&lt;/li&gt;
&lt;li&gt;Community Involvement. Take another swing in this section too:
&lt;ul&gt;
&lt;li&gt;"my community involvement strikes the appropriate balance between managing the outreach initiatives with the efficient functioning of the Credit Union." As opposed to what, running the place into the ground to plant trees?&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;"I participate in a variety of philanthropic events." Show, don't tell. Otherwise it feels like you got dragged to a dinner once. WHAT ARE YOU TRYING TO HIDE, [PERSON'S NAME]?&lt;/li&gt;
&lt;li&gt;General: stop using the word "Philosophy". You're not Plato, you're a guy with some ideas about how to get things done. Tell me what they are.&lt;/li&gt;
&lt;li&gt;Balance Sheet section, "able to provide the type of accurate and comprehensive information that has been routinely disseminated within the various institutions at which I have been employed." That sentence feels like the opposite of clearly communicating info.&lt;/li&gt;
&lt;li&gt;"the balance sheet is very efficient" - the balance sheet isn't a sentient being or a process. Let's reword here. I'd also like to see a deep dive into how you balance assets across M1/ M2/ M3. We can't just get away with hand-waving here, this is the major leagues now, this is your ticket to The Show.&lt;/li&gt;
&lt;li&gt;"I was introduced to entrepreneurship at an early age through my family’s business"&amp;mdash; you know what's coming by now: "Show, don't tell". What was the family business that you're so cagey about it? Was Dad dropping guys into the Boston thruway construction for Whitey or something?&lt;/li&gt;
&lt;li&gt;Not sure how I feel about the lower-case initials in the signature section, feels a little chatty, but you know the corporate culture better than I do.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;And I got a nice response:&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Tom, if I can call you by your first name, you have inspired me to be a better man and given me hope as an underachiever.  I have rarely been presented with a hard hitting, constructive critique of any of my presentations let alone a draft meant for someone else. I thank you for taking the time and opening my eyes to several of my weaknesses although, being reflective, I do believe I have my ego in check and I do want to improve where needed. Never have I had someone as articulate and creative comment on my work, writing or needs improvement areas and given that you are a complete stranger the whole experience is that much more unique. So, thanks again for your comments as they are impressive beyond this layman's capabilities. You definitely made the real Tom proud although a very impressive "peanut gallery" sound bite guy in his own right. I wish you well and I will hopefully mistakenly run other materials by you in the future.&lt;/p&gt;
&lt;/blockquote&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/resume-rewrite-services</guid></item><item><title>Fundraising: A Play in One Act</title><link>http://thosecleverkids.com/thoughts/posts/fundraising-play-one-act</link><description>
Fundraising: A Play in One Act&lt;br /&gt;
&lt;p&gt;&lt;strong&gt;INT - NIGHT - a fundraiser from University of Rochester calls TOM who has the phone on speaker while holding JOSIE. We join the call in progress . . .&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caller: "Sir, no amount is too small."&lt;/li&gt;
&lt;li&gt;Tom: "Well, I make like ten cents a day punching out plates. How about a cent a week?"&lt;/li&gt;
&lt;li&gt;Caller: "One cent?"&lt;/li&gt;
&lt;li&gt;Tom: "Yeah."&lt;/li&gt;
&lt;li&gt;Caller: "Does this organization match donations?"&lt;/li&gt;
&lt;li&gt;Tom: "I dunno. HEY SCREW! Do you guys do matching donations? . . . Whoa. Whoa! WHOA!"&lt;/li&gt;
&lt;li&gt;Tom: "No, it's going to just be the one cent."&lt;/li&gt;
&lt;li&gt;Caller: "Is there a better number to reach you at?"&lt;/li&gt;
&lt;li&gt;Tom: "Well, I got a cell phone in the toilet, but I don't want to give that out."&lt;/li&gt;
&lt;/ul&gt;
</description><guid>http://thosecleverkids.com/thoughts/posts/fundraising-play-one-act</guid></item></channel></rss>