SONY ILCE-7C 40mm f16.0 1/40s ISO1000

Some leaves catch the afternoon sun at China Camp State Park in Marin County.

(Related: Bay View and Shoreline Trails at China Camp State Park; Stars over Lake Tahoe; Creekside Trail to Big Leaf Trail Loop)

(You might also like: Please fix phone spam Google!; Golden Gate Bridge Timelapse; San Francisco New Year's Eve Timelapse)

(Recent Photos)

Time to get rid of the word ROBOT

Time to get rid of the word ROBOT

Robot is problematic. Not because it was originally derived from the Czech word for forced labor but because we commonly use it to describe two distinct classes of machine.

The first is a something that is either fully scripted (a Disney ride) or fully operated by a human (a bomb disposal robot). Most 'robots' are like this.

The second is a machine with some autonomy that makes potentially unpredictable decisions based on its programming. Like a Tesla.

If the first one kills you it's either an industrial accident or a person killing you through more levels of indirection than usual. When the second one kills you it's a little murkier. Was it the driver of the Tesla? The programmer? Elon?

I bring up killing because the San Francisco Police Department is claiming the power to kill people with robots on some state mandated paperwork. I'm being asked to tell my supervisor to stop this kind of thing, but on reflection I'm all for it because SFPDs robots are very much the first kind and not the second and we should be far more worried about self-driving cars running us down than a remote controlled wheelbarrow with a shotgun.

I'd prefer SFPD to use lethal force only when absolutely necessary but I really don't think we should constrain how they pull the trigger. Imagine a hostage situation with an active shooter in an inaccessible location. Would you rather resolve the situation with a SWAT team and potentially large scale loss of life or would you use the shotgun equipped wheelbarrow?

But I'm certainly not in favor of Robocop or pretty much anything out of Runaway and so SFPD shouldn't be able to use the word robot to describe their policy.

(Related: 1,000th Post!; Can I move to a Better Simulation Please?; Sod Searle And Sod His Sodding Room)

(You might also like: Pulling the plug on Facebook and Twitter, Tweet Archive; San Francisco 2014 Ballot Measures; Summer Solstice 2014)

(All Etc Posts)

Sunset #11

Cruise Ship departs San Francisco during incredible sunset

Sunset around the Farallon Islands off the coast of San Francisco. Shot at 500mm, 4k 60fps timelapse. A very bright cruise ship sneaks past near the end.

(Related: Ship Entering San Francisco Bay; San Francisco Shoreline Timelapse; Farallones)

(You might also like: Leaving the Nest; Tree; Meteor)

(More Timelapses)

1,000th Post!


This is the 1,000th (possibly voluntary) post on I Thought He Came With You. To celebrate, here are 17 posts in no particular order from the past 17+ years of blogging.

Methyl L-α-aspartyl-L-fucking-phenylalaninate: What does the UK have against sugar?

How to fix software patents: I co-founded a startup that was killed by a patent lawsuit and so I think it's fair to say I have strong feelings about this. I've had various ideas for improving the system over the years, this one is still the best. It's a radical proposal to stop examining patents altogether, while continuing to protect genuine innovation. Fuck the trolls.

Extreme Environmentalism: Environmentalists are slowly coming around to nuclear power, but is it possible that the greenest thing to do is even more radical?

What do you get when you multiply six by nine? Brexit.: If Douglas Adams were still alive I'm 42% certain this is what he would have written about Brexit. The problems we need to solve a species are better solved together, stop putting the 'B' arkers in power FFS.

The real reason Americans don't have passports: Maybe this is finally going to get fixed, but why can't we overhaul basic government services like other countries seem to manage to do routinely.

ESRI Shapefile Reader in .NET: A shapefile is a common file format for GIS (Geographic Information System) data like county or country borders. I needed to work with this for an update to Catfood Earth and there was nothing that made it easy to just load the data and do something with it. I ended up writing and releasing an open source library which became quite popular. I'm still discovering interesting and/or frightening places where this is used, like laying out power lines or forming evacuation plans.

Response to GGNRA Draft Dog Management Plan: In which I fought the National Park Service and eventually won. It wasn't just me, but it still felt good. Let happy dogs forever roam Fort Funston.

Bishops: Get them off of the kids and out of my government.

I didn't think I'd ever fall for fake news on Facebook: I discover that I'm just as dumb as everyone else which is a bit humbling. Social media sucks and we should all go back to wonderful blogs like this one. It's a problem that only you can fix - do something like this.

Got It: I hate this trend in interaction design.

Export Google Fit Daily Steps, Weight and Distance to a Google Sheet: This is by far the most popular post on my blog. I think that's partly because Google loves it when you do the hard work of supporting their products for them. It also scratches a real itch for a lot of people who want to liberate their data and so something interesting with it. And I just love apps script which gives you free and easy cloud computing, it's Google at their very best.

Sod Searle And Sod His Sodding Room: So much sloppy thinking about AI. I had lectures about this at university when they should have just had us read Gödel, Escher, Bach instead.

Meeting Defragmenter: I have achieved this vision manually via slow nudges and strategic calendar blocks and it's actually pretty great. You end up with some horrible days and some transcendentally good ones. YMMV.

Reviews and links for March 2011: I still read a lot, but I'm not as good as I used to be at taking the time to write a thoughtful review. Whenever I remember the time I tore Eric Carle (RIP) a new one for The Very Quiet Cricket I make a resolution to start again.

Cam of Fortune!: I so nearly got fired for this, when the Managing Director at my first post-University job got the fax instead of me. He thought it was for real. And then I did this when we moved offices. How did I stay employed?

Lock up the Flexible Spending Account Administrators. It turns out that meaningless paperwork is a worse problem for society than actual serial killers.

Bernal Hill: My very first blog post from August 13, 2005. I had just received a GPS for my birthday and was very excited about getting data from hikes but also very embarrassed about writing anything in public on the internet. I had been online for more than a decade at this point. My first email address was 1991 and my first website 1996 (lost even to the Internet Archive, www.catfood.demon.co.uk). The first thing I actually ever published online (in 1997) was this article exposing something very interesting about the Pentium processor. I wrote this with a friend earlier and it ended up in the first issue of Catfood Magazine. It has been a long time since I've used a stand alone GPS, but I have posted a lot of hikes.

(Related: I Love Email; Got It; The Trust Project, Fake News and a Partial Facebook Uninstall)

(You might also like: Bay Model Tide 360 Timelapse; Circles; Home of the Whatevers)

(All Etc Posts)

Fuck the Electoral College

Recent Mistakes

With the depressing news that Trump is running again I reassured myself that he didn't win the popular vote last time and updated my page on the national popular vote interstate compact. We've inched ever so slightly closer to electing the President based on the will of the people but we're still not close enough. Based on 2021 Census population estimates a vote in Wyoming is worth four times as much as a vote in Texas. That should infuriate you regardless of your political persuasion. The President should be accountable to every state. Sign a petition, call your representatives, donate - do everything listed here - and don't let this happen again.

(Related: Liquid Democracy and united.vote; I'm with Him; Thinking about the UK referendum on AV)

(You might also like: Brexit Prize; Remnants in the Sunset; A vacation based proof of the many-worlds interpretation of quantum mechanics)

(All Politics Posts)

Webmention on ITHCWY


ITHCWY now supports a basic webmention implementation. Any inbound mentions will be dropped in the post moderation queue (so may take up to a few hours to appear as I check everything manually to keep the spam out). If an outbound link supports webmention then it will be mentioned. I'm only doing this for new and updated posts, not for the full archive. I'm a little Fediverse curious and this is a first step towards maybe implementing Bridgy Fed or even rolling my own ActivityPub implementation. Mostly I miss trackbacks and hope that we can figure out how to have nice things again.

(Related: Export Google Fit Daily Steps, Weight and Distance to a Google Sheet; Got It; Doing news right with Feedly and Google News)

(You might also like: California 2014 Propositions; Sundial Bridge; Crow Gyre)

(All Etc Posts)

Crow, Sutro Tower

Crow, Sutro Tower

Google Pixel 6 Pro 19mm f3.5 1/280s ISO33

Photo of a crow in front of Sutro Tower at Twin Peaks in San Francisco.

(Related: Moon, Sutro Tower (from Bernal Heights); Crow Gyre; Fog over Twin Peaks)

(You might also like: Marshall's Beach; Clouds Over The Farallones; Fitbit on a bike)

(Recent Photos)

Why did San Francisco Redistrict the Pacific?

Map of San Francisco Board of Supervisor Districts including the Farallon Islands

I am enjoying this interactive map of San Francisco's Board of Supervisors Districts way too much, because it raises more questions that it answers.

List most (many? some?) San Franciscans I'm used to seeing the Supervisorial Districts on a land map of the city, maybe with a shout out to Treasure Island. In 2022 these districts were redrawn with some local drama - a few blocks moved from District 4 to District 7 and vice versa. But I saw no coverage whatsoever of the maritime impact of this process.

When you load the map you probably immediately notice the imperial reach of District 6, sweeping up to the Richmond Bridge and nudging aggressively against Oakland and Alameda. District 2 is brazen in its denial of any part of the Golden Gate to Marin County. But to appreciate the full scope you need to zoom out enough to see that District 4 encompasses the Farallon Islands and surrounding waters, making it the largest district by a pretty good margin. Although it probably also means that it contains more mice than people.

Why are the Farallon Islands in District 4? It looks like these should be a territory of District 7 (this is my district and I'm feeling envious as the Islands are straight out to sea from my house). Things get weird when you go back to the map of 2011 districts. Back then, District 4 had a tiny slice of water off of Ocean Beach, but District 1 extended north and south plugging the Golden Gate and abutting District 7's territorial waters. The Farallon Islands were still part of the city but not demarcated by the map.

So with all the drama around moving a few houses between Supervisors, how was there time for such a maritime land grab by District 4? How did District 1 lose its stranglehold on traffic into the Bay? Why was any of this changed at all? Some half hearted Googling produced no answers. If you know, please leave a comment and if I find out I'll report back.

(Related: Save Mount Davidson; San Francisco November 2016 Propositions; San Francisco November 2020 Ballot Measures)

(You might also like: Bredo; Bumpass Hell; Bald Mountain, Vista and Meadow Trails Loop (Sugarloaf Ridge State Park))

(All Politics Posts)

Send event parameters with every event and multiple tags in Google Analytics 4


There are some event parameters that are useful to send with every event. Google has a helpful guide here which even covers the case where you have multiple tags (I'm running GA4 and UA during the migration and this isn't unusual). You're supposed to call gtag set before calling config on each tag. This isn't working for me though, I see nothing coming through in the debug view.

Calling set before config works fine for user properties (my journey of discovery yesterday) but unless I was doing something stupid that I haven't seen yet no dice for event parameters. The code above uses the config method of initialization with a shared object to prevent duplicating code. This seems to work fine.

(Related: Export Google Fit Daily Steps, Weight and Distance to a Google Sheet; User scoped custom dimensions in Google Analytics 4 using gtag; Using the Azure Monitor REST API from Google Apps Script)

(You might also like: 3D DIY; Bon Tempe Lake; Google Spreadsheets API and Column Names)

(All Code Posts)

User scoped custom dimensions in Google Analytics 4 using gtag

A user parameter in the GA4 debug view

Given that everything in Google Analytics 4 is an event I expected user scoped custom dimensions to be a regular event parameter as well. They're not. And most of the documentation both from Google and others talks about Google Tag Manager which doesn't help if you're just using gtag. It's not that hard to implement, but figuring out all the pieces was way harder than it should be. I hope this helps the next person...

To create a user scoped custom dimension you need a user property. This is different from an event property. In gtag you need to call set on user_properties with an object containing the user properties to set like this:

If you want the user property on the hit sent with page load do this right before the config call when loading your gtag (you can do it as part of the config call if you're just setting up one tag, or as above before the config call which is helpful if using more than one tag). If you don't know the value of the user property at page load time you can also set it and then send an event.

From the client you can inspect the beacon sent to GA4 for an event, for example:

Event parameters get a prefix of ep or epn. In this case I'm using a parameter rc_score set to 0.9 which appears in the beacon as epn.rc_score=0.9. GA auto-detects numeric values and uses epn for these. The user parameter gets a up prefix and in this case is up.user_quality=low. (In this specific case I'm sending a recapture score as both a custom metric and a user scoped dimension so I can segment out high and low quality users, at least from the perspective of recapture).

More visually you can use the debug view in the configure section of GA4 (why there are settings in the reporting interface as well as the settings interface I have no idea). To use this pass { 'debug_mode':true } to your gtag config call. To confirm that you're getting user properties look for an orange icon in the timeline (see screenshot at the top of this post). There is also a helpful user properties active now box at the bottom right of this screen.

Once you have this working you still need to wire it up in GA4. Wait 24 hours... then go to Configure -> Custom definitions. Add a new custom dimension, make sure you pick user scoped and you should then be able to select the user property to use to populate the dimension.

(Related: Using the Azure Monitor REST API from Google Apps Script; Automate Google PageSpeed Insights and Core Web Vitals Logging with Apps Script; Export Google Fit Daily Steps, Weight and Distance to a Google Sheet)

(You might also like: Rapids; Sand Ladder at Fort Funston; Stumpoceros)

(All Code Posts)