Hello! I'm Craig, and I'm a Michigan-based software developer for Zapier.com. In my free time I like to over-engineer email solutions for django, under-engineer Kivy tools, and play lots and lots of ultimate frisbee.
It's interesting to think about how world leaders take lessons from global crises and then apply them to ensuing situations where they may no longer fit. It's even more interesting to wonder which current events will eventually be understood as this phenomenon.READ MORE
Every waking moment, we are surrounded by a multitude of options. Get up and walk around, keep working, shift in our seat, text our friends, let our minds wander — the menu of possible next moves is thicker than an over-ambitious family diner's. Alongside this freedom of action is also a very strong sense of freedom of selection, or as it's most commonly known, "free will". Every time we talk to a friend, ignore an email, or even just lift our arm, we experience the sensation of having made a choice. It really feels like we ignored that email, but also like we could have just as easily earnestly responded. It feels like it so much, in fact, that we almost never try to look behind the curtain.
In looking behind that curtain, I find the concept of a conscious agent exercising genuine free will to be completely incoherent. In this blog post, I will attempt a bite-sized exploration of free will and why human beings very likely don't have it. In short: we might be able to follow our whims, but we cannot architect our whims.READ MORE
Tim Caine: "Governor Pence doesn't think the world is going too well, and he's going to blame it on everyone."
Mike Pence: "Do you?!"
That exchange from the October 4th vice presidential debate is a nice viewport into the entire 2016 political climate. Pence's question certainly represents the outlook of America's conservative right, who after eight years of Obama feel they are living through an era of eroding Christian values and stifling political correctness. This is unsurprising, as the bedrock of a conservative worldview is to resist change.
What's more striking is how many American liberals would agree with Pence (albeit for different reasons). Among Americans ages 18-29, better than one-in-four plan to vote for a third party candidate. That number is around one-in-six for 30-49 year olds.  Even more, the narrative in liberal circles is so uncertain about the status quo that some report planning to vote for Trump to "burn it all down" and "start again".
The message is clear — when deranged super-villains and incompetent third parties start to look appetizing, the normal fare must have spoiled.
But is that justified? Has progress truly stagnated as far as many liberals planning to reluctantly vote for Clinton, or to emphatically vote Trump or third party, would have us believe? Hillary Clinton the president promises four more years of the status quo, so if Hillary Clinton the president is so repugnant, we should expect to find ample rot in the status quo.
Do we?READ MORE
The following is a modest summary of a single chapter of David Deutsch’s book on reason and knowledge, The Beginning of Infinity, and several adjacent concepts. The specific chapter, entitled “Artificial Creativity”, examines a source of possible confusion surrounding artificial intelligence. If this simple summary piques your interest, do yourself a favor and read Deutsch’s full work.
In this blog post, I’ll first summarize David Deutsch’s analysis of the generation of knowledge and all its inherent complexities. After that and with it as a foundation, I’ll pivot into Deutsch’s commentary of artificial intelligence.
One of David Deutsch’s main theses in The Beginning of Infinity is that knowledge is the currency of the universe. With sufficient knowledge, he argues, a person can accomplish any task that does not violate the laws of physics (such as traveling faster than the speed of light). This is true because, as Deutsch writes, "There can be no regularity in nature without an explanation, for to believe in an explanation-less regularity is to invoke the supernatural."
Upon first reading, I had some difficulty parsing this claim. However, with a bit of additional thought I was able to work through it. First, imagine being an early human and stumbling upon some new "regularity" in the world — say, that water seems to always run downhill, or that the four seasons follow a predictable schedule. Such observations may seem hopelessly mysterious while brand new, but with hindsight we know that those two particular regularities each have concrete explanations (gravity1, and the orbit and tilt of Earth, respectively). Deutsch's point, which almost seems too simple to state, is that all regularities will have such explanations (whether we immediately know them or not!). This extrapolation is what unlocks the full power of explanation, and thus knowledge.READ MORE
Recently, I've been spending a lot of time thinking about prayer. Some of its core concepts don't seem to jive with Christianity's other core concepts, and I want to explore those contradictions below. However, before we get into my central question for those that regularly engage in prayer and believe in its power, I want to get clear on the topic of just how ironclad God's will really is.
The first order of business is to ensure we're on the same page about a key detail. Do you believe that God’s will is mutable? Do you think any force in this universe can alter God’s will? It is my understanding that most Christians would answer this question, “No.”, e.g. — God’s will is immutable, and beyond influence.
For instance, as a kid in Sunday school, I remember hearing grand claims to the tune of, “God knows every hair on your head. He knows how many will fall out tomorrow, and how many will grow back.” This is obviously an incredible level of specificity, unlikely to be spelled out in the Bible verbatim, but was (and still is) repeated often enough to make me assume it a reasonable conclusion given the text.
If my understanding of the above is correct, my follow-up question for the prayers among us is:READ MORE
Everyday, I wake up feeling snowed in by emails, and I work at a company (Zapier), that makes every effort to reduce email congestion by favoring other forms of remote communication. Still, the emails are too many, which is why I set out to both filter the signal from the noise, and then send that signal straight to Slack.
I use the following Gmail filters to delineate emails I care about from... the rest. I know that 9 out of 10 relevant emails are from GitHub, so I focus there.
First, I created two labels, GitHub, and GitHub (Mentions).
Then, I added these three filters to route all email from GitHub:
Nothing is for everyone, but if you have any level of interest in learning world history, then Dan Carlin's Hardcore History podcast is an absolute must. His deep dives into topics like World War I, the reign of Ghengis Khan, the fall of the Roman Empire, World War II's eastern front, and more, are long, thorough, and well-paced. They make long drives or plane rides something to look forward to, which is a huge accomplishment!
Obviously the baked-in Apple podcast app is terrible. For a long time I was a Downcast user because they were the first app I heard of with the now ubiquitous speed up feature. However, Overcast has a few other niceties (volume normalization, dead air removal, and overall cleaner speed-up) that make it a runaway winner.READ MORE
I was there last night, at ground zero, on the wrong side of sports history. I watched from the far end of the stadium as everything imploded in the final seconds, and I had the joy of driving back to across the state afterward. Thus, I’m going to share a few thoughts.READ MORE
Recent Internet activity suggests there's some real confusion about age and when various life events are to be expected. Many lengthy guides have been published to help people navigate the confusion -- we've all seen Amy Poehler's face atop "30 Ways to Know You're in your Late 20s" lists. But it's not that complicated! To help simplify the issue, I've compiled 9 very simple tricks to know if you're in your late 20s or early 30s.READ MORE
I think we can all agree that good restaurant Thai food is one of life's true gems. I think we can also all agree that it's not immediately obvious how to make it, and many recipes just don't quite bring home that explosive flavor we've come to know and love.
Today, we're going to squash that problem. My sister's boyfriend cooked at a Thai restaurant through high school and thus knows all the tricks. There are perks to befriending a member of the Illuminati!READ MORE
Correctly mocking external entities in your unit tests is a bit tricky syntactically, and I have to look up the exact incantations to type every single time they're needed. Thus, I'll make a quick sales pitch about mocking, quickly explain it to the best of my current understanding, and end with a sequence of tricks to be updated as I learn more. In essence, it's my own personal cheat sheet, stored in an accessible location I'm unlikely to misplace.READ MORE
Everyone knows about Django's
Q objects and how to chain them together for complex lookups. The syntax is straight forward.
results = MyModel.objects.filter(Q(key1="value1") | Q(key2="value2"))
That generates this unexciting SQL:
SELECT * FROM `my_table` WHERE (`my_table`.`key1` = "value1" OR `my_table`.`key2` = "value2")
But what happens when you have an unknown amount of filters?READ MORE
The experience of sitting through a trailer and thinking, "Looks like I don't need to see that, now that every last plot twist was spoiled", or "New Comedy XYZ was pretty funny, but all the good parts were in the trailer," are too common.
As movies go, the only thing that approaches the awfulness of Jumper is having an otherwise good movie completely spoiled by a trailer that just wouldn't shut up.READ MORE
At Stik.com, we're using Django to supply a RESTful interface to our database. Our support staff is also using its admin for simple ticket items. Fortunately for the business, but unfortunately for the Django admin, we have lots of tables with hundreds of millions of rows, and a few in the billions. We really didn't want to spend the time writing our own admin section for support staff, so the Django admin was a godsend... until we rolled it out to production and saw admin pages never respond ever. Read on to see what our problem was and how we fixed it.
Large tables in InnoDB may not be able to even render their
change_list view due to (possibly 2) expensive
COUNT(*) queries. With tables of 100M+ records, this can take 15+ minutes to complete, even on fast servers.
Unoriginally around these parts, my parents are Christian, all four of my grandparents were devout Christians, my aunts and uncles are Christian, my cousins are Christian, my... whatever else is Christian. All authentically, too. There aren't any phonies in the bunch. Thus, my falling away from not only Christianity, but any form of religion whatsoever, bucked several generations of family tradition.READ MORE
The following is a how-to guide for surviving terrible situations that I wrote with two roommates, Dan Lindeman and Ross Lepine, back in undergrad in 2008 after watching 30 Days of Night. Without further adieu:READ MORE
Before we get started, I'm assuming you've mastered or completed the first part of the tutorial, your site code itself is complete, your virtual environment is functional in local development, and you have your domain name pointed the IP of the EC2 instance we just made. If any of these assumptions are false then you are probably getting ahead of yourself.READ MORE
This is super fast and easy. Here we go:
Create and log into your http://aws.amazon.com account. Yadda yadda yadda.READ MORE
I've had the same debate at every company for which I've ever worked, and the setup is always the same. Legacy tools are in place that technically get the job done but the annoying, but newer programmers are calling for new methods and tools. Some of the older dogs and management don't want to change, citing the overhead and cost of switching gears -- while the voices of change insist that a smoother, faster, easier, and more stable iteration process awaits at the end of that overhead. On healthy teams this leads to a lot of passionate, respectful debate. On unhealthy teams it spawns gnashing of teeth, finger pointing, and name-calling.READ MORE
MySQL-python won't compile because it needs the MySQL headers which are not in the expected location under a MAMP install. Luckily, this isn't hard to remedy.READ MORE