It’s harder to put a simple honey tap on a bee hive than you’d think. Brilliant evolution in bee-keeping technology – so elegant.

Morro Bay Lighthouse Century

A summer of hard bicycle training finally paid off! I had done several metric century (65 mile) rides over the past decade, but both of my previous full century attempts had been thwarted. Two years ago, I overtrained and developed a tendon problem behind the knee that could have resulted in serious/permanent damage if I had pressed on. Then the next year, an illness in the family resulted in a logistical problem that forced me to do yet another metric.


This year, I wasn’t going to be stopped. Started serious training in the spring, ramping up slowly from 25 miles to 40, then 65, then a couple of 75 mile days toward the end of summer. Also focused on elevation, tackling both Mt. Tam and Mt. Diablo in August and September.


Started to learn more about the importance of sodium and electrolyte replacement too, trying half of the ride supplement packets on the market. And I introduced a weekly time trial into the mix, doing exactly the same 8-mile, 1000-ft sprint after work twice a week.


Continue reading

Why It’s Time to Repeal the Second Amendment

Orlando is kind of a perfect storm of American hot-buttons. Terrorism, homophobia, racism, politics, mental health, and guns all in one monumental tragedy. The gay issue is complicated by the fact that there are so many homophobes on the right who are secretly (or not so secretly) happy to see gay people slaughtered. The Islam issue is complicated by the fact that the shooter is an American. The mental health issue is complicated because so many people “on the verge” aren’t identified even by those closest to them. The gun issue is complicated because it always is. There is an element of exhaustion – we’ve all been down the Mass Shooting road too many times, and all of our arguments are all worn out. We each rant and plead in our own ways, but nothing ever changes. And this time, we’re having ten different arguments at once. But we can’t stop talking, because the alternative is apathy.

Meanwhile, we’re not even focused on the bigger part of this tragedy. 50 people all in one place is horrific, yes, but people are overlooking the larger fact that, on average, we lose 91 people per day to gun violence. That’s almost two Orlandos every freaking day.


One of the reasons we end up focusing so hard on guns is that it’s something concrete we can address with the force of law. We can’t “fix” mental health by throwing money at it. We can’t “fix” religious extremism by closing our borders, because it grows in our own soil and is fed by the internet. But we can, at least potentially, “fix” the gun situation by recognizing that the Constitution is a fluid document that was designed to adapt to the times. We can stop thinking of gun ownership as an “inalienable” right and treat it as a privilege instead – one that has to be earned or bestowed (to hunters and law enforcement), not one granted willy nilly to every bozo who wants a human-killing machine for “reasons.”


The current interpretation of the 2nd Amendment is not one the Founders would ever have imagined or wanted. Better background checks, banning assault rifles… all well and good, but I think that’s splitting hairs, and won’t have much impact in the long run. I’ve been ranting for the past year about how it’s time to repeal or rewrite the 2nd Amendment. The sentiment is finally gaining traction. Thank you, Rolling Stone, for this excellent piece by Constitutional scholar David S. Cohen: Why It’s Time to Repeal the Second Amendment


Just think of what would have happened in the Orlando night-club Saturday night if there had been many others armed. In a crowded, dark, loud dance club, after the shooter began firing, imagine if others took out their guns and started firing back. Yes, maybe they would have killed the shooter, but how would anyone else have known what exactly was going on? How would it not have devolved into mass confusion and fear followed by a large-scale shootout without anyone knowing who was the good guy with a gun, who was the bad guy with a gun, and who was just caught in the middle? The death toll could have been much higher if more people were armed.


Please read: Why It’s Time to Repeal the Second Amendment

RIP Olaff Itoff

Just lost someone special who hovered on the periphery of my life. Diagnosed with cancer in April, told he had a few weeks to live, gone by the end of May. Life is so fleeting. He was a geocacher who went by the name Olaff Itoff (“Oh, laugh it off!”). He once gathered me and five other people who had had trouble finding a cache together for a group hike and discovery. A few weeks later, he and his son went out caching with me and my son. For years after, we kept seeing each other’s names in logs, leaving little notes for each other. The other day I published a new cache, and the first finder’s log entry said “RIP Olaff Itoff 2016.” Contacted the finder and heard the sad news. So sad, so unfair. Wish I’d gotten to know him better.

Maker Faire 2016

Our tenth annual father-son excursion to the world’s largest convention of inventors, sculptors and weirdos. Different every year – both as the fair changes and as we change. Spent more time this year having conversations with makers, which makes it so much richer. Unfortunately, the trend of making the fair safer every year also makes it a bit less exciting every time. Still, this trip is always one of the highlights of our year, and has become an important bonding time. Here’s to the next 10!

Flickr set

Django template tag to display latest git commit, date and tag in template

I found a few references to bits and pieces of this in various places, but this snippet ties all three bits of information together in a single string, and accounts for calling the path to the git repo from anywhere (which tends to work “magically” on localhost but breaks on servers).

If you don’t use git tags, season to taste.

def git_ver():
    Retrieve and return the latest git commit hash ID and tag as a dict.

    git_dir = os.path.dirname(settings.BASE_DIR)

        # Date and hash ID
        head = subprocess.Popen(
            "git -C {dir} log -1 --pretty=format:\"%h on %cd\" --date=short".format(dir=git_dir),
            shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        version = head.stdout.readline().strip().decode('utf-8')

        # Latest tag
        head = subprocess.Popen(
            "git -C {dir} describe --tags $(git -C {dir} rev-list --tags --max-count=1)".format(dir=git_dir),
            shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        latest_tag = head.stdout.readline().strip().decode('utf-8')

        git_string = "{v}, {t}".format(v=version, t=latest_tag)
        git_string = u'unknown'

    return git_string

Then, in your template, you can simply:

{% if user.is_superuser %}{% git_ver %}{% endif %}

GoPro Time Lapse: Stinson Beach

Last weekend at Stinson Beach I attached a GoPro to a tree and had it shoot one image every 5 seconds for a couple of hours. Later compiled the image into a 29fps half-speed video in GoPro Studio. Not sure why I enjoy making these so much; something oddly satisfying about the process.

View 403, 404, 500 with media in Django DEBUG mode

When working with Django in DEBUG mode, it can be tough to see your 403, 404, and 500 views, since they raise visible stack traces instead of the UX the end user will see. But if you turn DEBUG off, runserver’s local media serving is disabled because it’s designed to work only with DEBUG = True. The solution is scattered throughout the Django docs, and I couldn’t find it compiled into one compact code block anywhere – just reference the handling functions directly from the end of your urls.py:

if settings.DEBUG:
    from django.views.defaults import server_error, page_not_found, permission_denied
    urlpatterns += [
        url(r'^500/$', server_error),
        url(r'^403/$', permission_denied, kwargs={'exception': Exception("Permission Denied")}),
        url(r'^404/$', page_not_found, kwargs={'exception': Exception("Page not Found")}),

And voila, your 403.html, 404.html, and 500.html templates will be displayed in full glory for developers.