Author Archives: kevin

About kevin

I write the posts

Transcript of Oval Office meeting between Volodymyr Zelensky, JD Vance, and Donald Trump – February 28, 2025

Source: CSPAN

Transcript was generated using OpenAI Whisper and then cleaned up using ChatGPT o1 pro. All errors are mine.

Volodymyr Zelensky
Do you, and now I’m talking with my friends in Poland, and they are worried that you align yourself too much with Putin.
What’s your message for them?

Donald Trump
Well, if I didn’t align myself with both of them, you’d never have a deal.
You want me to say really terrible things about Putin and then say, “Hi Vladimir, how are we doing on the deal?”
That doesn’t work that way.
I’m not aligned with Putin, and I’m not aligned with anybody.
I’m aligned with the United States of America and for the good of the world.
I’m aligned with the world, and I want to get this thing over with.
You see the hatred he’s got for Putin.
It’s very tough for me to make a deal with that kind of thing.
He’s got tremendous hatred, and I understand that, but I can tell you the other side isn’t exactly in love with him either.
So it’s not a question of alignment.
I’m aligned with the world.
I want to get the things that—I’m aligned with Europe.
I want to see if we can get this thing done.
You want me to be tough? I could be tougher than any human being you’ve ever seen.
I’d be so tough, but you’re never going to get a deal that way.
So that’s the way it goes. One more question.

JD Vance
I want to respond to this.
For four years in the United States of America, we had a president who stood up at press conferences and talked tough about Vladimir Putin, and then Putin invaded Ukraine and destroyed a significant chunk of the country.
The path to peace and the path to prosperity is maybe engaging in diplomacy.
We tried the pathway of Joe Biden of thumping our chest and pretending that the president of the United States’ words mattered more than the president’s actions.
What makes America a good country is America engaging in diplomacy.
That’s what President Trump is doing.

Volodymyr Zelensky
Can I ask you?

JD Vance
Sure.
Yeah?
Yeah.

Volodymyr Zelensky
He occupied our parts, big parts of Ukraine—parts of the east and Crimea—in 2014.
For a lot of years, I’m not speaking just about Biden, but during that time it was President Obama, then President Trump, then President Biden, and now President Trump again.
God bless, now President Trump will stop him.
But during 2014, nobody stopped him.
He just occupied and took.
He killed people.
You know what the contact line is? 2014, 2015.
During 2014 till 2022, people have been dying on the contact line, and nobody stopped him.
We had a lot of conversations with him—my bilateral conversations—and when I was a new president in 2019, I signed with him, Macron, and Merkel a ceasefire.
All of them told me that he would never go.
We also signed a gas contract.
Yes, but after that, he broke the ceasefire.
He killed our people, and he didn’t exchange prisoners.
We signed the exchange of prisoners, but he didn’t do it.
What kind of diplomacy are you speaking about?
What do you mean?

JD Vance
I’m talking about the kind of diplomacy that’s going to end the destruction of your country.
Mr. President, with respect, I think it’s disrespectful for you to come into the Oval Office and try to litigate this in front of the American media.
Right now, you guys are going around and forcing conscripts to the front lines because you have manpower problems.
You should be thanking the president for trying to bring an end to this conflict.

Volodymyr Zelensky
Have you ever been to Ukraine?
Do you see what problems we have? Then come once.

JD Vance
I have actually watched and seen the stories, and I know what happens is you bring people on a propaganda tour, Mr. President.
Do you disagree that you’ve had problems bringing people into your military?
And do you think that it’s respectful to come to the Oval Office of the United States of America and attack the administration that is trying to prevent the destruction of your country?

Volodymyr Zelensky
A lot of questions. Let’s start from the beginning.
First of all, during the war, everybody has problems.
Even you, but you have a nice ocean and don’t feel it now, but you will feel it in the future.
You don’t know that. You don’t know that.
You’re trying to solve a problem—don’t tell us what we’re going to feel.

JD Vance
I’m not telling you, but you’re in no position to dictate that.
You’re in no position to dictate what we’re going to feel.

Volodymyr Zelensky
That’s exactly what you are.

Donald Trump
We’re going to feel very good and very strong.

Volodymyr Zelensky
You will feel influenced.

Donald Trump
You’re right now not in a very good position.
You’ve allowed yourself to be in a very bad position from the very beginning of the war.
You don’t have the cards right now. With us, you don’t have the cards.
You’re gambling with the lives of millions of people.
You’re gambling with World War III.
You’re gambling with World War III, and what you’re doing is very disrespectful to this country.
This country has backed you far more than a lot of people said they should have.
Have you said thank you once in this entire meeting?

JD Vance
You went to Pennsylvania and campaigned for the opposition in October.
Offer some words of appreciation for the United States of America and the president who’s trying to save your country.
Please.

Volodymyr Zelensky
You think that if you speak very loudly about the war…
My country is in big trouble, but we are staying strong from the beginning of the war.
We’ve been alone, and we are thankful.
I said thanks in this cabinet.

Donald Trump
You haven’t been alone.
We gave you, through your stupid president, 350 billion dollars.
We gave you military equipment, and your men are brave, but they had to use our military equipment.
If you didn’t have our military equipment, this war would have been over in two weeks—maybe three days, maybe less.
It’s going to be a very hard thing to do business like this.
Just say thank you.

Volodymyr Zelensky
I said it at all times, except that there are disagreements.

JD Vance
Except that there are disagreements, and let’s go litigate those disagreements rather than trying to fight it out in the American media when you’re wrong.
We know that you’re wrong.

Donald Trump
But you see, I think it’s good for the American people to see what’s going on.
I think it’s very important.
That’s why I kept this going so long.
You have to be thankful.
You don’t have the cards.
You’re buried there. You have people who died.
You’re running low on soldiers. You’re running low on soldiers.
Then you tell us, “I don’t want a ceasefire.”
Look, if you could get a ceasefire right now, I’d tell you to take it so the bullets would stop flying and your men would stop getting killed.

Volodymyr Zelensky
Of course, we want to stop the war.
But I said to you, I want a ceasefire with guarantees, because you’ll get a ceasefire faster than an agreement.
Ask our people about a ceasefire—what they think.
It doesn’t matter to you what they think.

Donald Trump
That wasn’t with me. It wasn’t with you.
That was with a guy named Biden who was not a smart person.
That was with Obama, who gave you sheets, while I gave you Javelins.
I gave you Javelins to take out all those tanks. Obama gave you sheets.
“Obama gave sheets, and Trump gave Javelins.”
You’ve got to be more thankful, because let me tell you, you don’t have the cards.
With us, you have the cards, but without us, you don’t have any cards.

Volodymyr Zelensky
One more question to the Vice President…

Donald Trump
I’m sorry. It’s going to be a tough deal to make because the attitudes have to change.

Volodymyr Zelensky
What if Russia breaks this fire?
What if Russia breaks these talks?
What if the bomb drops on your head right now?

Donald Trump
Okay, what if they broke it? I don’t know.
They broke it with Biden because Biden didn’t respect him.
They didn’t respect Obama. They respect me.
Putin went through a hell of a lot with me.
He went through a phony witch hunt where they used him in “Russia, Russia, Russia.”
You ever hear of that deal?
That was a phony Hunter Biden, Joe Biden scam—Hillary Clinton, shifty Adam Schiff.
It was a Democrat scam, and he had to go through that.
We didn’t end up in a war. He was accused of all that stuff. He had nothing to do with it.
It came out of Hunter Biden’s bathroom, out of Hunter Biden’s bedroom. It was disgusting.
Then they said, “Oh, the laptop from hell was made by Russia,” the 51 agents.
The whole thing was a scam.
Maybe he broke deals with Obama and Bush, and maybe he broke them with Biden—he did, maybe. Maybe he didn’t. I don’t know.
He’s not breaking with me. He wants to make a deal. I don’t know if you can make a deal.
The problem is I’ve empowered you to be a tough guy, and I don’t think you’d be a tough guy without the United States.
Your people are very brave, but you’re either going to make a deal or we’re out.
If we’re out, you’ll fight it out. I don’t think it’s going to be pretty, but you’ll fight it out.
You don’t have the cards. Once we sign that deal, you’re in a much better position.
But you’re not acting at all thankful, and that’s not a nice thing. I’ll be honest—that’s not a nice thing.

JD Vance
All right, I think we’ve seen enough.
What do you think? This is going to be great television.
We’ll see what we can do about putting it together.
Thanks, sir.

Volodymyr Zelensky
Thanks, sir.

Liked what you read? I am available for hire.

Cities Can Cost Effectively Start Their Own Utilities Now

Most PG&E ratepayers don't understand how much higher the rates they pay are than what it actually costs PG&E to generate and transmit the electricity to their house. When I looked into this recently I was shocked. The average PG&E electricity charge now starts at 40 cents per kilowatt hour and goes up from there. Silicon Valley Power, Santa Clara's utility company, is getting power to customers for 17 cents per kilowatt hour. Sacramento's utility company charges about the same.

PG&E's rates are high enough that, even with the massive headache and expense involved, it's feasible for cities to create their own utility and undercut PG&E's rates. When the savings per household are around $800-$1200 per year, though, they should take it seriously.

Here are the basic components of how much it costs to get electricity to your house.

  • Generation: The cost to actually generate the electricity in a power plant or utility-scale solar farm. This varies by time of day but typically costs about 4 cents per kilowatt hour; you can see the current wholesale rate on the CAISO website.

  • Transmission: How much it costs to move the power from the power source to a local substation/transformer, over large transmission lines. PG&E breaks this out in its detailed rate chart at about 4 cents per kilowatt hour.

  • Distribution: How much to get the power from your local substation to your house over local power lines. In PG&E's rate chart, they charge 20 cents per kilowatt hour for this. That just does not match up with how much it actually costs them to transmit power over local lines and keep the lines maintained.

  • Everything else: Operations, maintenance, profit. This is where PG&E is actually seeing large expenses, because their coverage area is massive, it costs a lot of money to deliver power to rural customers, and they are also undertaking a massive project to underground utility lines in fire-prone areas.

The high price and design of the electricity system have a number of bad effects:

  • People really hate inflation. When utility bills spike, it makes people unhappy and also fuels the (not incorrect) perception that California is poorly governed.

  • Lower income people spend a higher percentage of their income on electricity, so higher utility bills disproportionately hurt them.

  • The net effect of charging higher rates to everyone to pay for undergrounding is that people who live in urban areas are paying more money to subsidize energy transmission for people who live in $2 million houses in places like the Berkeley and Orinda hills. This makes no sense.

  • Higher rates for electricity make electricity less competitive vs. gasoline when people are considering a car purchase. It makes electricity less competitive vs. natural gas for heating a house, heating water, or choosing a laundry machine. As gas is warming the planet and electricity is substantially easier to generate in abundance from renewable sources, it's just bad policy to have high electricity rates.

Let's walk through what this might look like for a particular city to undercut PG&E's rates. I will pick Walnut Creek because it's a reasonably big city with a good mix of detached homes and multifamily. Walnut Creek also has experience with public ownership of amenities - the City operates a golf course and a downtown parking garage with ground floor retail.

There are a number of particular problems with applying PG&E's rates to Walnut Creek:

  • Walnut Creek is an urban area with a compact footprint that has little acreage in a high severity wildfire zone. It has two transmission lines as well as a local transformer grid along Ygnacio Valley Road. It is very cheap to transmit power from power plants to Walnut Creek, and from transmission lines to every house in Walnut Creek.

  • Walnut Creek has an above average number of apartments. Apartments do not have as much space for rooftop solar, and landlords don't have an incentive to provide rooftop solar because they typically pass through utility costs. This means NEM1 and NEM2 subsidies — 12% of the average non-solar bill — disproportionately hurt Walnut Creek renters.

  • Local businesses have disproportionately high energy costs. Safeway and Whole Foods need to keep a row of refrigerators and freezers running 24/7. When they pay PG&E's rates to do that, those high energy costs are passed through as higher food prices.

We are going to adapt Palo Alto's income statement, found on page 50 of their annual report, to Walnut Creek's situation. For each category, I am going to try to shade the numbers assuming we can't be as efficient as Palo Alto.

Usage, Revenue, Expenses

Palo Alto's total electric consumption was 830 gigawatt hours in 2024 - 19% of this usage was residential, and 81% was businesses and industry uses. Applying some adjustments for Walnut Creek - our population is bigger, it's a bit hotter here, and energy use has increased - let's say Walnut Creek uses about 1150 gigawatt hours per year.

Palo Alto earned $172 million in revenue for 830 gigawatt hours, which is about 20 cents per kilowatt hour.

Expenses

Here's where Palo Alto's utility company spends money:

Acquisition of the network and financing cost

The first thing you need to do is buy out PG&E's distribution network - all of the power poles and local equipment that sits between the transmission lines and people's houses. San Francisco proposed buying this for $2.5 billion in 2019; PG&E rejected this offer for being too low. Adjusted for inflation and Walnut Creek's population, this is about $230 million, let's round up and say $350 million. Let's also assume it costs $50 million in startup costs and one time expenses to hire utility staff, buy equipment, marketing expense.

Cities with an AA credit rating can issue a 30 year loan at about 4% interest. Borrowing $400 million would cost about $23 million per year in interest and principal payments.

$23 million per year of financing cost spread across 1150 gigawatt hours is only about 2 cents per kilowatt hour.

Generation and distribution

Palo Alto spent $114 million buying energy in 2024, about 14 cents per kilowatt hour. Let's assume Walnut Creek can get power for about 17 cents per kWh.

Operations

This covers customer service, financial management, billing, engineering work for maintenance (tree trimming etc), and resource management. Palo Alto spent $65 million on these expenses in 2023. Let's assume Walnut Creek's costs are much higher at $90 million per year. This is about 8 cents per kilowatt hour.

Capital Improvements

Another $25 million per year is allocated for grid modernization, undergrounding, and reliability work. Let's assume this is $35 million per year for Walnut Creek, which would be about 3 cents per kilowatt hour.

Total

Adding this up, we get 30 cents per kilowatt hour, which is ten cents lower than PG&E's base rate and about 15 cents lower than PG&E's blended rate. At 1150 gigawatt hours, this would save Walnut Creek residential ratepayers about $23 million per year in total, about $800 per ratepayer, and Walnut Creek businesses about $92 million per year. That is a huge amount of money that could go toward much more productive uses - paying higher salaries, lowering prices for goods, spending more at local businesses.

Most elected officials would jump at the chance to mail every household a $800 check every year. The next best thing is to put $800 back in their pocket.

Other Benefits for Walnut Creek

There are huge ancilliary benefits for Walnut Creek to running its own utility network.

  • Green infrastructure investments: Walnut Creek has made sustainability a key priority. Palo Alto owns a share in a hydroelectric dam, and Santa Clara owns a share in a geothermal plant. At a time when there are exciting new technologies that have the potential to reduce greenhouse gas emissions and deliver clean, cheap energy to residents - things like Fervo Energy that use the tech behind fracking to deliver geothermal power - Walnut Creek can use its very low cost of capital to finance these investments. This is something PG&E cannot do as effectively, because as a public utility with massive amounts of debt and wildfire liability, their borrowing cost is much higher. Public ownership would enable transformative green energy investments with a low borrowing cost.
  • Encouraging the green transition: A 25% reduction in the cost of electricity relative to natural gas would make electric upgrades like heat pump water heaters or electric cars much more financially prudent investments.

  • Fiscal stabilizer: Like every city in California, Walnut Creek has boom and bust cycles. Utilities have much more stable revenues than cities. Walnut Creek could borrow from its utility in recessions, and loan money during booms.

  • Encourage incorporation: Walnut Creek has a number of unincorporated pockets (San Miguel CDP, Shell Ridge CDP) that administratively make little sense - they are served by different police, they have different tax rules. If these homes could save $800 per year on their utility bill by joining Walnut Creek, this may provide an incentive to incorporate, which would ultimately lead to better governance.

  • The best alternatives are good: PG&E is terrified of cities leaving its service network. Look at the concessions they are offering to South San Jose to try to prevent them from starting their own utility.

    Even if Walnut Creek doesn't ultimately pursue its own utility, just investigating the possibility may lead PG&E to offer concessions such as undergrounding the transmission line over downtown. Because you can't build under a transmission line, this makes a 100 foot wide strip of very valuable land undevelopable. St. Paul's would love to redevelop its parking lot under the transmission line for affordable housing, but can only develop tiny corners of the lot with the transmission line overhead. Undergrounding the line would deliver huge benefits to Walnut Creek.

    Transmission
line over downtown Walnut Creek

  • Lowering the cost of urban living in safe places: PG&E's current rate structure has urban rate payers subsidize rural rate payers and people who live in wildfire zones in e.g. the Orinda Hills, who need substantial investment in order to receive power without sparking wildfires. This is bad policy - instead of subsidizing fire zones, it should be cheap to live in safe places and more expensive to live in dangerous places. Lower cost of electricity would reverse these trends.

California is kneecapping its own climate transition with high electricity prices. The resulting inflation hurts our state's ability to retain a high class, diverse workforce. Perversely, it also serves as a subsidy to wildfire zones at the expense of infill areas. It's time to reverse those trends and deliver lower energy prices in places we want more Californians to live.

What should I do if I want this to happen? Cities around the region are doing "priority setting" exercises for 2025. Contact your Mayor or City Council and ask them to explore the possibility of creating their own utility, potentially partnering with other cities. I would probably select cities that do not have large fire zones (ie, not Orinda or Moraga).

Liked what you read? I am available for hire.

How to Ventilate Your House

Every day we learn more about the importance of good air quality. Here are some tips to help you improve air quality inside your house.

How to Measure

First, you are going to want to be able to measure air quality in your house. There are a few different things you want to measure:

  • PM2.5 measures the amount of particles that are 2.5 micrometers or smaller. Compared with larger particles, PM 2.5 does the most damage because they are so small that they can get embedded far into your lungs, which is why they are measured and tracked. You want to keep this value as low as possible.

  • AQI is an aggregate index that measures PM 2.5, PM 10 (10 micrometer particles), carbon monoxide, sulfur dioxide, and nitrogen dioxide in the air. The formula for calculating it is complicated but basically takes the largest value out of those. You want to keep this value below 50.

  • Carbon dioxide builds up in a stuffy room with no ventilation and can affect cognitive performance, make you sleepy, and have other bad side effects. 400 is the ambient air; a value over 1000 is bad.

To measure PM2.5 and AQI, I like the Temtop M10, though it's very easy to buy a more expensive piece of gear that you can connect to Wifi, or smart devices.

To measure CO2, I like the Aranet4, which can run forever on a single battery.

If you don't want to buy them, try to borrow one from a friend, or see if your library will buy them and loan them out; you'll get a sense for the ranges of air quality in your house after a few days.

When it's nice outside

The easiest case is when the weather is nice outside, and there's no fires or smoky air, and you don't live near a freeway. Open your windows! Bringing in outside air is the only way to lower CO2 counts (you can't just run an air purifier).

The best way to ventilate quickly is to open windows on both sides of your house, called "cross ventilation," so a breeze can flow from one end to the other. A good sign that this is working is that doors between the two windows are slamming shut.

If it's not nice outside

Sometimes you can't or shouldn't keep your windows open - it's too hot or too cold, or the air quality outside is too bad. If you live within 1000 feet of a freeway, you are likely breathing in polluted air almost all the time you are outside or have your windows open, which has been linked to lower birth weight, worse cognitive performance, higher rates of respiratory illness.

You are going to want to pump in outside air anyway. If it's hot or cold, you can use your AC, or your heat, which will take care of this for you, by swapping in new air and swapping out old air.

If you have either of these and can't or don't want to change the temperature, they should have a "fan" mode, which does not apply heat but will just bring in new air. You should be running this mode almost all of the time you have your windows closed.

Your heat or your AC will have a filter between the outside air and the fan. Mine is 16x25x1, and looks like this:

Filter for heating
system

You need to buy a good filter. Filters are rated on the MERV system, which sorts by how much particles they are supposed to catch. Your average filter will be about MERV 5. You want to buy a MERV 13 level filter, which is only a little bit more expensive but is going to be vastly better at stopping particulates.

Plan to replace your filter every 2-3 months, more if you run the fan more often, less if you run the fan less often.

You can supplement outside air with an air purifier like the Coway AP1512-HH. Each air purifier comes with a rating for how big of a room it is designed to clear; this one is for 360 square feet. When it ships to you, the filters are already in the purifier, but covered in plastic. Be sure to remove the plastic or the filters won't work.

I keep my air purifiers (we have four) on the lowest level all of the time. Note that these will be ineffective at lowering carbon dioxide levels; you need outside air for that. Plan to change the odor filter every 6 months and the HEPA filter once a year, more often if you live in a particularly polluted area.

Sources of bad air inside your house

The primary source of bad air inside your house is your stovetop. When we cook, the AQI inside our house spikes up above 300, which is worse than in Beijing. If the fan above your stove vents to the outside, you almost always want to run this at the highest level, in addition to opening your windows and doors, and running your house fan, in order to bring the air quality back to a decent level as quickly as possible.

Other sources of bad air include cleaning products and using the toilet. Understand if bathroom fans vent to the outside (they should, if your house is up to code) and run them. Open windows when you clean.

Your stove, your oven, and your shower will also make your kitchen hot, which can be uncomfortable if you are trying to keep the windows closed. On hot days consider using the BBQ instead, if you have one.

That's it

Modern homes in particular are designed not to leak any air if you don't want to. While this is good news for efficiently heating or cooling your house, it is bad news for air quality inside. Measure air quality inside your house and understand which tools are best for bringing in better air.

Liked what you read? I am available for hire.

How much does a San Francisco Chronicle subscription cost?

The San Francisco Chronicle charges for subscriptions. How much does a subscription cost? This is an impossible question to answer, even for current subscribers. The Chronicle advertises several different prices for new subscribers.

The only public information the Chronicle shares about its permanent subscription rates raises more questions than answers.

Chronicle pricing
page

No one at the Chronicle has ever read through this section.

  • The digital-only rate is $34.50 per week, which means that it is about twice the price of getting the Chronicle delivered to your house every single day.

  • If you get the Chronicle delivered, you can get a free digital subscription so you if you want a digital subscription you should opt for delivery.

  • The "home delivery" prices are listed twice and you have to look particularly close to figure out that one of them includes a digital subscription.

  • No one is paying, or going to pay, $34 a week for digital access to the Chronicle!??

I only started looking into this because after three years, the Chronicle decided to more than double the price of my subscription, from $149 a year to $358 per year. The terms of service say that they are supposed to notify me when they change the price ("We will notify you of any changes if the regular fee for your subscription changes from what was stated at the time of your initial order."). They sent no notification, the first I found out was on my credit card bill.

How much I paid for
the Chronicle

I then tried to find any public information the Chronicle had posted about its subscription pricing, whether they had announced recently that they were raising their prices to invest in the newsroom, anything.

The only thing I found was that FAQ page that says a digital subscription costs $34 a week. This is the only public information anywhere that the Chronicle offers about its rates. There is no notion of a "subscription plan." I couldn't really believe this, so I called the Chronicle customer service line. They confirmed that the Chronicle could decide at any time to charge you $34 per week, or about $1800 per year, for a Chronicle subscription, and anyone who got a lower price than that was just lucky to have it.

By contrast the New York Times clearly shows the introductory price and the standard price.

The Washington Post also clearly explains how much you are going to pay.

By contrast someone at the Chronicle must have looked at my 3 year old subscription and decided I should pay more and charge me for that, without any notification, or justification, or even explanation that "this is the rate most people are paying."

Anyway, if you are a Chronicle subscriber you should be aware that:

  • The Chronicle can and will change the price of your subscription at any time

  • According to the Chronicle, everyone who buys a subscription is getting a discount from the $1800/year rate, and should feel lucky.

  • The Chronicle will not tell you why you're paying the rate you're paying.

Liked what you read? I am available for hire.

Sour Punch Strawberry changed their formula

I have a sweet tooth and one candy I really enjoy is Strawberry Sour Punch.

Unfortunately after twenty years of having the same formula it seems that the company has decided to change the formula for Sour Punch. The new candy has more of a cherry flavor and isn't as sour. It does not taste good at all.

The company confirmed that the formula changed in a DM:

Due to the global supply chain crisis, we’ve had to temporarily tweak our formula. We know the current product isn’t what you’ve come to expect from SOUR PUNCH, which is why we are doing everything we can to return it to its original deliciousness so that you can enjoy the candy you know and love.

People on Reddit have confirmed the new flavor is hitting shelves. Recent reviews on Amazon are not pretty.

Have you had a bad batch of Sour Punch, or a batch with a different flavor? Leave a note in the comments, or contact the American Licorice Company and ask them to bring the old flavor back.

Liked what you read? I am available for hire.

Get Urgent Care from One Medical

On Sunday morning at 1am I had a lot of stomach pain. I am a One Medical customer, had heard that they offered urgent care, and so I searched on their website for information.

Unfortunately their urgent care option does not show up in the list of care options on their website:

I concluded that their urgent care offering didn't actually exist and paid for a competing provider's product, so I could talk to a doctor at 1am.

This morning I was informed that their urgent care option does exist, but only in their mobile apps. So you have to go into the iOS app and then you will see "Video Call Now" as an option.

This is a baffling design choice to me. I don't understand why, as a company, you'd only put features in one of the several ways customers can use your product. Or at the very least you could put "Video Call" in the list of options on the website, and then have a popup that says "open the app." But they didn't do that.

So if you are looking to get urgent care or use any One Medical feature try the app.

If this post was useful please send the One Medical twitter account a DM saying so so they can update their product.

Liked what you read? I am available for hire.

You Can Build a Skyscraper Anywhere in Davis Right Now

Update: Everything in this article about Davis is also currently true in the following cities:

  • Redondo Beach
  • Beverly Hills
  • Manhattan Beach
  • South Pasadena
  • Santa Monica
  • Anaheim
  • Oxnard

To get a full list, visit the HCD website, click "Compliance Report," and filter for "Compliance Status" => "OUT". I would also guess that San Francisco will make it onto this list, but not until much later in the year.

Right now it's legal to build a skyscraper anywhere in Davis, California (a college town outside of Sacramento). Unlimited height, anywhere in city limits, as long as you promise to dedicate 20% of the apartments to people with lower incomes. Well, it's legal in theory, no one has ever tested it. But you could be the one to test it! And hopefully make a boatload of money along the way, and help prevent more sprawl into wildfire zones.

Every eight years, every city in California gets an "allocation" from the state government for very low, low, moderate, and above income housing. Each city then needs to show it has a good plan - typically, a zoning map with some spare capacity - to meet the goals in the allocation. Generally this involves identifying sites in the city - places like empty lots, parking lots, abandoned buildings - and rezoning them for additional density.

Davis, California

There's lots of "cheating" - cities pretending that a site will turn into housing when there's no chance it will turn into housing. However, the state has in recent years A) cracked down on cheating by adding stricter requirements and B) set much larger allocations for each city, especially wealthier cities. So a lot of cities that have historically not welcomed housing are struggling this time around.

Davis (population 65,000, plus about 10,000 college students at UC Davis) is one of those cities - it is the wealthiest city in the area, and has for decades had a 1% cap on growth. This was not enough to meet its aggressive new goal of 2075 new homes. Davis submitted a plan to the state's Department of Housing and Community Development (HCD) for how it would meet the goal, but HCD said the plan was inadequate - it didn't do enough to advance "fair housing" (ie. it dumped all of the new housing in the lowest income parts of town), and HCD disagreed that the plan included enough sites to meet the allocation goal.

Because of this, Davis has what's called a "noncompliant housing element." This subjects them to a different state law that says, while your housing element is noncompliant, you can't legally reject an application for housing that offers 20% of the apartments for low incomes. That's any application, anywhere in the city. This isn't some loophole, this was the explicit intent of the (30 year old) law at the time it was written, and both supporters and opponents understood it.

So it's legal right now to buy any lot in Davis and submit a proposal to build a skyscraper on it.1 You would need to meet Davis's other rules - for example, if Davis has rules about parking or fire egress or whatever, you would have to abide by those. But any rules Davis had about density on a site would not apply. Crucially, Davis can't change the rules after your application. As long as you submit it now, while their housing element is noncompliant, they have to be bound by the rules on the books now.

The problem is that big buildings are expensive and the law has never been tested. If you built it you'd be looking at a legal fight for about 4-5 years. I think you would have a good chance of winning - the California courts have in recent years swatted down local NIMBYism at Vallco Mall, in San Mateo and in Los Altos. But you would still have to go through the process.

Why hasn't someone tested it? Because most developers are playing a repeated game with cities, housing applications have historically relied on a lot of goodwill to get through the planning process, and they haven't wanted to upset the apple cart for one big and uncertain return. So there is room for a brash outsider who doesn't care what people or planning staff in Davis think about them.

Here are some notes from Chris Elmendorf, a law professor at UC Davis, about the legal hurdles you'd likely face.

I know a lot of venture capitalists who hate California NIMBYism, care about climate change, and don't care much what opponents of progress think about them. This is a huge opportunity to do something really big, really valuable for the community and make a lot of money along the way. Also I would guess the return from this project is uncorrelated with the rest of your portfolio so would probably be a good source of alpha. I can put you in touch with talented technical people.

If you are interested in helping but don't have a lifechanging amount of money, a number of groups are auditing the Bay Area's "housing elements" this year (the deadlines are staggered, so the Bay Area cities come later) so cities aren't cheating their numbers.2 If you'd like to help, or to get involved, please donate to, or sign up with, East Bay for Everyone.

1 It's also legal in Redondo Beach in Southern California, and possibly additional cities in the Bay Area, soon.

2 Given how important this process is to getting cities to rezone for additional housing, you would hope that there were lots of professional organizations dedicating lots of staff time to analyzing Housing Elements and ensure compliance with the law. In reality there are a lot of volunteers who are spending their spare time writing letters and hoping for the best. One of the key Housing Element volunteers in Los Angeles County is a radiologist.

Liked what you read? I am available for hire.

Ten years of experience, still failing phone screens

I fail phone screens pretty often, which limits my job prospects and is embarrassing for someone with ten years of industry experience, a pretty extensive Github account and a publicly available list of difference-making projects. 1 In theory a phone screen is supposed to evaluate whether a) this person would be good at the job being hired for and b) whether it's worth investing another five hours in trying to hire this person.2 In practice I think phone screens are pretty poor at screening candidates for fixable reasons.

I spend a lot of time setting up my development environment to get a fast feedback loop. If I write a little bit of code I want to know immediately whether it works or not. There are a lot of components that go into this, but generally, this involves being able to type quickly, have builtin editor support for building code, checking function definitions, and being able to background and foreground the terminal constantly to run tests or test scripts. All of that means I'm constantly able to exercise the code I'm running and get feedback about whether I'm headed in the right direction or where problems are. This is a pretty significant advantage for me and I can work more quickly than most engineers I know.

A lot of this effort was inspired by Gary Bernhardt, who has a video series that really changed the trajectory of my career and might change yours as well. Gary is extremely fast and is obsessed with test speed. Fast tests mean that he can get feedback on whether the code he wrote works a few hundred milliseconds after typing it.

Most phone screens involve implementing some fairly complex algorithm3 in one or multiple steps on Coderpad, an online text editing tool. With Coderpad you get a single file that you have to put all of your code in, and you can't load data from any external files. Most companies don't let look at any reference documentation either so you have to know the standard library API's cold or guess until you get them right.

Coderpad must work for some people since companies are able to hire a nonzero number of engineers, but it is definitely not a good fit for me. I'm not fast at reasoning about code, and I often make trivial mistakes just trying to get a "first draft" of a program out. If I get behind or the interviewer starts interrupting to ask about the bad code I'm writing I get very stressed and have trouble both listening to the interviewer and trying to address the issues with the code.4

The lack of any sort of feedback loop just totally compounds the problems. Most of the questions you are asked don't have a lot of different inputs, and have outputs that are 100% a function of the inputs, which are perfect for writing fast, table driven tests. But a lot of interviewers will explicitly tell you not to write tests, or in some cases even disable the ability to run the code, a Coderpad "feature." So you have to keep the different branches in your head and the different states the code can be in as you re-enter a for loop or whatever, and then figure out which of these changed when you did any sort of refactoring.

Objectively the screeners are making a good decision to fail me,5 I probably look like I have no idea what I'm doing and I'm only sometimes able to get a good result by the end of the interview. But this is a bit like declaring someone a bad sous chef after asking them to bake a rare pastry without a recipe. I am more likely to get an offer from an onsite interview than I am to pass an initial phone screen, which seems backwards.

I don't think that "can you code" algorithm implementation is the best thing to spend your entire hour evaluating during a phone screen, but even if you think it is, there are ways you can improve it significantly. Actually add a set of tests or allow the candidate to write or run a test suite, or run code in their own text editor and paste it into the Coderpad at the end. Offer the option of a harder question that still has a time limit but can be completed without having someone watching over their shoulder and asking whether that variable name is really necessary.

Anyway, I think a better idea would be to try to spend a shorter amount of time evaluating a larger range of topics. Triplebyte has a quiz that actually does a pretty good job of this; you get asked thirty or so questions about databases, networking, and simple coding questions ("what is the value of 'a' when you get to line 17?"). The last time I interviewed I took their quiz and did well enough that I was able to skip directly to onsites at every company they work with. Most of the value that Triplebyte provides comes from ensuring companies don't bounce good candidates by a bad phone screen or poorly calibrated interviewer; it's essentially a way to hack bad internal processes.

Besides the fact that people like me get extremely stressed implementing a new algorithm in a time limit without being able to exercise the code, while someone is watching and asking questions, there are diminishing returns to spending the 30th or 40th minute on the same topic, and this is such a tiny part of your job anyway. It would be better to try to ask a larger number of easily gradable questions that represent stuff most people will do in their jobs, and will give you more signal in a number of different directions. Some ideas:

  • Clone this source code repo and tell me (what timeout is set for X third party API/what endpoint you'd need to hit to do Z/any other information in the repo that can be determined with a yes/no answer).

  • Say you have a function that checks whether three integers are even numbers that increase. What tests would you want to write to tell whether it's true or not?

  • Why is it bad to write a file to the disk one byte at a time?

  • What can happen if you leave a database transaction open for a long time?

  • Here's a CRUD app, copy existing code patterns to implement a new CRUD endpoint (to be honest this is like a huge part of the job at most companies.)

  • Here's a stack trace from an open source project, can you tell me what went wrong?

  • What's a data race? Here's some simple code with a data race, can you tell me where the problem is?

  • Let's say you have a database table with a user ID and a balance denominated in integer numbers of cents, what's a SQL query that could charge ten dollars to the user's account?

  • What are some examples of good and bad production alerts?

  • In a few sentences, how does UTF-8 represent different types of characters?

  • Here's a HTML template with an XSS, what would you need to type into in the email address form to get an alert to pop up on the screen?

And others.6 You could have a rubric for each question, then add up the scores or require X number of nonzero answers. I think you'd get a better sense from those questions than you would a single 45 minute algorithm question of whether someone would do a good job at your company.7

1. Recently I had a phone screen at a company you've heard of go poorly and then have a VP intervene internally because the phone screen feedback made no sense based on my track record.

2. Another fallacy people tell themselves about the phone screen is "it's just to tell whether candidates can program" but if this was true interviewers would not fail people for correctly coding the brute force solution, or they'd more often provide the instructions for implementing an algorithm, which they never do.

3. I'm far from the first person to talk about this but the focus on algorithms just baffles me given how rarely you need to implement a complex algorithm in actual production code. Here's a job queue and a scheduler that's about 5000 lines of Go code and probably the most complex thing that happens is a for loop. There is a lot of thought that had to go into the API design to avoid long running transactions, and a lot of work that went into finding a fast and correct version of the dequeue query, but you'd never test for those in a phone screen, as currently designed. Another project I worked on for a client is a fully featured Twilio API browser, 9000 lines, that again does really not have any code that's as complex as would be tested in a phone screen. I used an LRU cache in one place, but I used an implementation that Brad Fitzpatrick wrote, there's no reason to write that myself.

4. This also happens when people ask me to write code on a whiteboard but that doesn't happen anymore due to COVID, and anyway I just tell companies that I need to write code on my laptop or I'm not going to do the interview and they will generally let me do that.

5. I shouldn't rule out the possibility that they are making the right decision and I am in fact bad at engineering. Certainly there are a lot of confident, mediocre tall white men in the tech industry. That said, I ran a successful one-person consulting business for several years, and presumably if I was not delivering more value to each company than I was invoicing, the companies I was working with (Segment, Notion, ngrok, One Medical) would not have renewed my contract multiple times.

6. If this sounds interesting, and you'd like help designing a phone screen experience that's tailored for your company and the types of experience you want to screen for, get in touch!

7. I have a bunch of ideas around testing how quickly and how accurately people can type, or accurately transcribe text from a second screen, that I think could be decent predictors of job performance but I'm not sure are fair to test out in a professional context without academic research that could validate them at least a little bit.

Liked what you read? I am available for hire.

Different Realms, Different TLD’s

Many companies break up their internal environments into different realms. A typical setup might look like:

  • The prod realm is where production servers live.
  • The dev or stage realm is a live testing environment, where code gets deployed before it goes into production, or long-running features are tested.
  • The local realm is for code that's developed on your laptop, or in Docker, or in a cloud server provided to each developer.

The names each company assigns to each realm might be different, but that doesn't matter. I strongly recommend purchasing a different TLD for each realm that you operate, and then deploying them everywhere your company accesses sites over HTTP. So following the example above:

  • acme.com serves your production site.
  • acme.dev serves your development realm.
  • acme.app, acme.site or acme.website is reserved for your local realm.

You might need to change the TLD's based on which ones are available, but since there are hundreds, you should be able to snag three. The key is you need to be able to buy the same hostname for every TLD. You want things to be as simple as possible for your team - no needing to remember that the prod website is acme.com and the dev website is acmetest.dev or whatever. Then it becomes dead easy to remember how to navigate to each site - you combine the hostname and the TLD for that realm, and then you get to the right place.

For local development, you're probably going to be redirecting traffic to your local machine, instead of using the public Internet to serve it. You want to buy the domain anyway because you don't want someone who forgot to redirect traffic to end up sending requests to a server you don't control.

There is a special TLD named .test that is designed for local development and DNS testing. However, Google forbids the use of that domain for e.g. SSO authentication, so I recommend buying a live domain and then black-holing the traffic.

I wrote a tool called hostsfile that you can use to automatically add entries to the /etc/hosts file on employee laptops, to redirect their traffic from your "local" domain to localhost.

sudo hostsfile add acme.app 127.0.0.1
sudo hostsfile add acme.app fe80::1%lo0

Why are separate TLD's so important? Besides the fact that it's drop dead easy to remember, there are a few good security reasons. The goal with many security measures is to make entire classes of problems impossible, and that's what this strategy does.

It's impossible to "leak" a production cookie to your dev environment, or vice versa, if you have completely separate TLD's for each realm. If you use www.acme.com for prod and dev.acme.com for dev, you need to host the DNS records for each realm in the same place, which makes it difficult to test changes, and increases the likelihood of accidentally shipping a breaking change. With different TLD's you can use different Route53 realms, or different accounts with your hosting provider. These make it easier to test changes without accidentally breaking production.

Another way that cookies break is because your prod dashboard is served at the root - acme.com - while your dev and staging servers add an additional subdomain, for example dev.acme.com. This can cause subtle breakage; if you use the same hostname scheme in every realm, it's impossible.

I encourage teams to use TLS for local development, for the same "just keep everything the same between all realms" reason. If you are reusing TLD's, you could potentially issue a cert that's valid for a production domain, or be tempted to reuse your production certs for local development. If you own acme.website and only use it for local development, and use acme.com for prod, it doesn't matter if you leak the .website certs accidentally, because you can't use them to do anything that matters.

Finally, it makes it very difficult for people to accidentally confuse what realm they think they are on. If you make a request to .website you know you are not in prod, for example.

Liked what you read? I am available for hire.

Fast, Parallel Database Tests

Here are some of the different strategies you can use to write tests that read or write data from a database, and the benefits and drawbacks of each. I'm usually writing Go code, so the examples here are for Go, but the notes should generalize to any language that runs tests against Postgres, MySQL, or any other database.

At a high level my goal is for the tests to take a minimum of programmer time. Programmer time is spent on the tests in a few different places:

  • Writing tests.
  • Running the tests.
  • Troubleshooting test flakes.
  • Troubleshooting written tests that don't behave the way you expect.

Our goal is to minimize the amount of time spent across all four of these areas, from which I have the following principles for a test suite:

  • Tests should be fast. Each test should do only what it has to do, which for database tests primarily means it should only create the objects it needs to test the behavior it needs to test, and no more.

  • Tests, and test packages, should run in parallel, which usually helps the test suite complete more quickly.

  • Tests should be predictable; if tests return unpredictable results, or interact in bad ways, this leads to wasted time tracking down why the tests are failing.

Obviously these are in conflict - parallel tests are less predictable than sequential tests - but there are some things we can do to make tests fast and predictable, and some common techniques that make them slower and unpredictable.

Don't: Reuse the same fixture objects in each test

You might have a set of "standard" test objects that get written to the database — Alice and Bob, and maybe Alice is a power user and Bob just signed up. If you try to create them in a test and they exist in the database already, the tests will upsert them.

This is fine, and you can do it, but it tends to break down in two ways:

  • "Default" fixtures tend to accumulate new database objects any time you create a new table, like a snowball rolling downhill. This means any new table makes all of your tests slower.

  • If you run tests in parallel, any test that updates or deletes any fixture that other tests rely on can cause unexpected behavior.

Because we are optimizing for programmer time - fast tests, and no unexpected behavior during tests - I tend to want each test to create the objects it needs, and make them each unique.

Don't: Reuse the same set of ~500 names

When you use a library like "Faker" to create objects that are sort of similar but have a common set of variations, for example, a last name derived from the same set of 500 last names, you are bound to run into trouble. It's way too easy to accidentally create two test objects that have the same birthday or same last name, when you didn't expect that to happen, and as a result, end up with one result when you wanted two, or otherwise get test failures that only occur once every 500 runs.

I've previously discussed why Faker is a bad idea, read the post for more.

Do: Use UUID's for anything that needs a "random" or unique input

Instead of creating "Alice" with 1 of 500 pre-seeded last names, or always with the email address "alice@example.com", use UUID's (or a part of a UUID), anywhere you need unique data. So "Alice Jones-a9706630", with email "alice-7cce0183@example.com". The first 8 characters of a UUID have 4294967296 different values; these objects will not conflict with each other during your lifetime.

Don't: Truncate the database after each test

At the end of each test, you could issue a command to truncate or delete all database tables. So each test is something like:

t.Run("TestAccountCreate", func(t *testing.T) {
    assertEquals(t, user.ID, 7) // or whatever
    cleanup(t)
})

The advantage to doing this is that each test cleans up after itself - you can create the same objects in multiple tests even if they might fail a uniqueness constraint, since it gets destroyed between each test instance. The disadvantage to doing this is that you can't run tests in parallel, because one test might issue a truncate right when the other test is writing to the database.

Further, it's not uncommon for tests to hang, or crash, while they run. If that happens, your truncate-after-test runner will not actually run, and the next test will encounter an inconsistent state. These types of failures can be tough to troubleshoot because the failure was actually in the previous test, which your test output might not make clear.

Don't: Truncate the database before each test

This has most of the benefits and drawbacks of the previous section, except you need to truncate everything in the database, because you don't know what test ran before this one. In theory, if you delete after, you only need to delete from tables that you wrote to.

Don't: Truncate the database after each package

You could enclose all of the tests in a parent test, something like this:

t.Run("Package", func(t *testing.T) {
    setUp(t)
    t.Run("Test1", func(t *testing.T) {
    })
    t.Run("Test2", func(t *testing.T) {
    })
    t.Run("Test3", func(t *testing.T) {
    })
    cleanup(t)
})

This way, you only pay the penalty of database setup and cleanup once per package.

However, the default for Go tests is to run as many package tests in parallel as you have CPU's available. So one package may be just finishing on one CPU (and truncating the database) when another package is starting on a different CPU, which causes failures that are hard to troubleshoot. You can set -p 1 to disable package parallelism, but the test suite gets a lot slower if you can only run one package's tests at a time.

Don't: Truncate the database before each package

This has most of the benefits and drawbacks of the previous section, except you need to truncate everything in the database, because you don't know what test ran before this one.

Maybe: Run all tests in their own transaction, then roll it back

The idea here is that you start a transaction in your test suite, then you run the application code, then you invoke a ROLLBACK in the test suite, restoring the database to its pristine state. The application code needs a pointer to the transaction, so the objects it creates exist inside of that.

Conceptually, there's nothing wrong with this method, but if you have any application code that starts a transaction, you will get in trouble with Postgres and MySQL, and you may not have a great time with other database flavors. In theory, you could make BEGIN and COMMIT a no-op in application code called from tests, but you are adding a lot of complexity there and the cost starts to outweigh the benefit.

Do: Avoid truncating the database at all

If each test is creating objects that it needs, and those objects don't conflict with anything else, you basically don't need to truncate the database ever. Sure you can add a command to clean it out if it gets too unwieldy, but you don't need to automatically do it between test runs.

This method is very consistent - tests behave the same way every time, they write the objects they need to the database. It also allows you to run all of your tests in parallel.

This requires a small change to the way you write tests - you can't make any assertions about the total number of objects in a given table, for example. If you want to test upserts by trying to write two records and then running SELECT COUNT(1) FROM table and ensuring only one record exists, that will fail because all of your tests are going to be writing to that table simultaneously. Instead, check for the number of records scoped to an account that's created for that test, or similar.

Maybe: Run each test in its own schema

Before running each test, copy the schema from a 'default' schema, and then run the test against the new schema. When the test completes, drop the schema. There's an example function to clone schema available on the Postgres wiki.

This is certainly a technique that provides you full isolation for each test, which allows you to run tests in parallel and ensure each test has a clean database. However, you have to pay the schema clone cost for each test, plus you have to create a new connection for each test. In my experiments on a 2.5 GHz core i7 Macbook Pro, cloning the database schema took about 200ms, and cloning the entire database took about 400ms. To me, these are too high of startup costs to pay to run a single test.

You could imagine having a background job with the sole purpose of creating enough schemas that you don't have to incur the 200ms latency when you actually run the tests - you could just find one of the already created schemas, though you'd need to wipe created schemas when you ran a migration, and that's getting pretty complex.

Assorted notes

  • If each test is creating the objects it needs, and tests don't rely on a clean database state, then you should be able to invoke t.Parallel() at the top of each database test. t.Parallel() will truly try to run each test in parallel, so you may have too much parallelism, but that's a better problem to have than too little. Experiment with the number of connections you have open to the database (or add benchmarks) to find a number that makes the most sense.

  • Prepared queries run about 30-40% faster than normal (fast) unprepared queries, because you don't have to pay the overhead of parsing the query statement. The Go *sql.DB object is thread safe, so you want to reuse it across all of your tests, instead of creating a new one in each test and paying the overhead to establish a connection to the database.

    A library like sqlc will help make it easy for you to get prepared queries.

Thanks to Phips Peter, Kyle Conroy, Alan Shreve, and David Strauß for reviewing drafts of this post.

Liked what you read? I am available for hire.