<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: patrick-mckenzie</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/patrick-mckenzie.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2021-02-28T05:40:28+00:00</updated><author><name>Simon Willison</name></author><entry><title>Trying to end the pandemic a little earlier with VaccinateCA</title><link href="https://simonwillison.net/2021/Feb/28/vaccinateca/#atom-tag" rel="alternate"/><published>2021-02-28T05:40:28+00:00</published><updated>2021-02-28T05:40:28+00:00</updated><id>https://simonwillison.net/2021/Feb/28/vaccinateca/#atom-tag</id><summary type="html">
    &lt;p&gt;This week I got involved with the &lt;a href="https://www.vaccinateca.com/"&gt;VaccinateCA&lt;/a&gt; effort. We are trying to end the pandemic a little earlier, by building the most accurate database possible of vaccination locations and availability in California.&lt;/p&gt;

&lt;h4&gt;VaccinateCA&lt;/h4&gt;
&lt;p&gt;I’ve been following this project for a while through Twitter, mainly via &lt;a href="https://twitter.com/patio11"&gt;Patrick McKenzie&lt;/a&gt; - here’s &lt;a href="https://twitter.com/patio11/status/1351942635682816002"&gt;his tweet&lt;/a&gt; about the project from January 20th.&lt;/p&gt;

&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;&lt;a href="https://t.co/JrD5mb4TAN"&gt;https://t.co/JrD5mb4TAN&lt;/a&gt; calls medical professionals daily to ask who they could vaccinate and how to get in line. We publish this, covering the entire state of California, to help more people get their vaccines faster. Please tell your friends and networks.&lt;/p&gt;- Patrick McKenzie (@patio11) &lt;a href="https://twitter.com/patio11/status/1351942635682816002?ref_src=twsrc%5Etfw"&gt;January 20, 2021&lt;/a&gt;&lt;/blockquote&gt;

&lt;p&gt;The core idea is one of those things that sounds obviously correct the moment you hear it. The Covid vaccination roll-out is decentralized and pretty chaotic. VaccinateCA figured out that the best way to figure out where the vaccine is available is to call the places that are distributing it - pharmacies, hospitals, clinics - as often as possible and ask if they have any in stock, who is eligible for the shot and how people can sign up for an appointment.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.vaccinateca.com/what-weve-learned-so-far/"&gt;What We've Learned (So Far)&lt;/a&gt; by Patrick talks about lessons learned in the first 42 days of the project.&lt;/p&gt;
&lt;p&gt;There are three public-facing components to VaccinateCA:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.vaccinateca.com/"&gt;www.vaccinateca.com&lt;/a&gt; is a website to help you find available vaccines near you.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;help.vaccinateca&lt;/code&gt; is the web app used by volunteers who make calls - it provides a script and buttons to submit information gleaned from the call. If you’re interested in volunteering there’s &lt;a href="https://www.vaccinateca.com/about-us"&gt;information on the website&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;api.vaccinateca&lt;/code&gt; is the public API, which is &lt;a href="https://docs.vaccinateca.com/reference"&gt;documented here&lt;/a&gt; and is also used by the end-user facing website. It provides a full dump of collected location data, plus information on county policies and large-scale providers (pharmacy chains, health care providers).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The system currently mostly runs on &lt;a href="https://airtable.com/"&gt;Airtable&lt;/a&gt;, and takes advantage of pretty much every feature of that platform.&lt;/p&gt;
&lt;h4&gt;Why I got involved&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://twitter.com/obra"&gt;Jesse Vincent&lt;/a&gt; convinced me to get involved. It turns out to be a perfect fit for both my interests and my skills and experience.&lt;/p&gt;
&lt;p&gt;I’ve built crowdsourcing platforms before - for &lt;a href="https://simonwillison.net/2009/Dec/20/crowdsourcing/"&gt;MP’s expense reports at the Guardian&lt;/a&gt;, and then for conference and event listings with our startup, Lanyrd.&lt;/p&gt;
&lt;p&gt;VaccinateCA is a very data-heavy organization: the key goal is to build a comprehensive database of vaccine locations and availability. My background in data journalism and the last three years I’ve spent working on &lt;a href="https://datasette.io/"&gt;Datasette&lt;/a&gt; have given me a wealth of relevant experience here.&lt;/p&gt;
&lt;p&gt;And finally… VaccinateCA are quickly running up against the limits of what you can sensibly do with Airtable - especially given Airtable’s hard limit at 100,000 records. They need to port critical tables to a custom PostgreSQL database, while maintaining as much as possible the agility that Airtable has enabled for them.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.djangoproject.com/"&gt;Django&lt;/a&gt; is a great fit for this kind of challenge, and I know quite a bit about both Django and using Django to quickly build robust, scalable and maintainable applications!&lt;/p&gt;
&lt;p&gt;So I spent this week starting a Django replacement for the Airtable backend used by the volunteer calling application. I hope to get to feature parity (at least as an API backend that the application can write to) in the next few days, to demonstrate that a switch-over is both possible and a good idea.&lt;/p&gt;
&lt;h4&gt;What about Datasette?&lt;/h4&gt;
&lt;p&gt;On Monday I spun up a Datasette instance at &lt;a href="https://vaccinateca.datasette.io/"&gt;vaccinateca.datasette.io&lt;/a&gt; (&lt;a href="https://github.com/simonw/vaccinate-ca-datasette/"&gt;underlying repository&lt;/a&gt;) against data from the public VaccinateCA API. The map visualization of &lt;a href="https://vaccinateca.datasette.io/vaccinateca/locations?_facet=Affiliation&amp;amp;_facet=Latest+report+yes%3F&amp;amp;_facet_array=Availability+Info"&gt;all of the locations&lt;/a&gt; instantly proved useful in helping spot locations that had incorrectly been located with latitudes and longitudes outside of California.&lt;/p&gt;
&lt;p&gt;I hope to use Datasette for a variety of tasks like this, but it shouldn’t be the core of the solution. VaccinateCA is the perfect example of a problem that needs to be solved with &lt;a href="http://boringtechnology.club/"&gt;Boring Technology&lt;/a&gt; - it needs to Just Work, and time that could be spent learning exciting new technologies needs to be spent building what’s needed as quickly, robustly and risk-free as possible.&lt;/p&gt;
&lt;p&gt;That said, I’m already starting to experiment with the new &lt;a href="https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.JSONField"&gt;JSONField&lt;/a&gt; introduced in Django 3.1 - I’m hoping that a few JSON columns can help compensate for the lack of flexibility compared to Airtable, which makes it ridiculously easy for anyone to add additional columns.&lt;/p&gt;
&lt;p&gt;(To be fair JSONField has been a feature of the Django PostgreSQL Django extension since &lt;a href="https://docs.djangoproject.com/en/3.1/releases/1.9/"&gt;version 1.9 in 2015&lt;/a&gt; so it’s just about made it into the boring technology bucket by now.)&lt;/p&gt;
&lt;h4&gt;Also this week&lt;/h4&gt;
&lt;p&gt;Working on VaccinateCA has given me a chance to use some of my tools in new and interesting ways, so I got to ship a bunch of small fixes, detailed in &lt;a href="#releases-2021-feb-27"&gt;Releases this week&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;On Friday I gave a talk at &lt;a href="https://speakeasyjs.com/"&gt;Speakeasy JS&lt;/a&gt;, "the JavaScript meetup for &lt;g-emoji class="g-emoji" alias="lab_coat" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/1f97c.png"&gt;🥼&lt;/g-emoji&gt; mad science, &lt;g-emoji class="g-emoji" alias="mage_man" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/1f9d9-2642.png"&gt;🧙‍♂️&lt;/g-emoji&gt; hacking, and &lt;g-emoji class="g-emoji" alias="test_tube" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/1f9ea.png"&gt;🧪&lt;/g-emoji&gt; experiments" about why "SQL in your client-side JavaScript is a great idea". The video for that &lt;a href="https://www.youtube.com/watch?v=JyOYqJGrWak"&gt;is on YouTube&lt;/a&gt; and I plan to provide a full write-up soon.&lt;/p&gt;
&lt;p&gt;I also recorded a five minute lightning talk about &lt;a href="https://simonwillison.net/2020/Oct/9/git-scraping/"&gt;Git Scraping&lt;/a&gt; for next week's &lt;a href="https://www.ire.org/training/conferences/nicar-2021/"&gt;NICAR 2021&lt;/a&gt; data journalism conference.&lt;/p&gt;
&lt;p&gt;I also made a few small cosmetic upgrades to the way tags are displayed on my blog - they now show with a rounded border and purple background, and include a count of items published with that tag. My &lt;a href="https://simonwillison.net/tags/"&gt;tags page&lt;/a&gt; is one example of where I've now applied this style.&lt;/p&gt;
&lt;h4&gt;TIL this week&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/til/til/sphinx_sphinx-ext-extlinks.md"&gt;Using sphinx.ext.extlinks for issue links&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/til/til/postgresql_show-schema.md"&gt;Show the SQL schema for a PostgreSQL database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/til/til/github-actions_postgresq-service-container.md"&gt;Running tests against PostgreSQL in a service container&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/til/til/django_extra-read-only-admin-information.md"&gt;Adding extra read-only information to a Django admin change page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/til/til/postgresql_read-only-postgresql-user.md"&gt;Granting a PostgreSQL user read-only access to some tables&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="releases-2021-feb-27"&gt;Releases this week&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/flatten-single-item-arrays"&gt;flatten-single-item-arrays&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/flatten-single-item-arrays/releases/tag/0.1"&gt;0.1&lt;/a&gt; - 2021-02-25
&lt;br /&gt;Given a JSON list of objects, flatten any keys which always contain single item arrays to just a single value&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/datasette-auth-github"&gt;datasette-auth-github&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/datasette-auth-github/releases/tag/0.13.1"&gt;0.13.1&lt;/a&gt; - (&lt;a href="https://github.com/simonw/datasette-auth-github/releases"&gt;25 releases total&lt;/a&gt;) - 2021-02-25
&lt;br /&gt;Datasette plugin that authenticates users against GitHub&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/datasette-block"&gt;datasette-block&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/datasette-block/releases/tag/0.1.1"&gt;0.1.1&lt;/a&gt; - (&lt;a href="https://github.com/simonw/datasette-block/releases"&gt;2 releases total&lt;/a&gt;) - 2021-02-25
&lt;br /&gt;Block all access to specific path prefixes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/github-contents"&gt;github-contents&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/github-contents/releases/tag/0.2"&gt;0.2&lt;/a&gt; - 2021-02-24
&lt;br /&gt;Python class for reading and writing data to a GitHub repository&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/csv-diff"&gt;csv-diff&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/csv-diff/releases/tag/1.1"&gt;1.1&lt;/a&gt; - (&lt;a href="https://github.com/simonw/csv-diff/releases"&gt;9 releases total&lt;/a&gt;) - 2021-02-23
&lt;br /&gt;Python CLI tool and library for diffing CSV and JSON files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/sqlite-transform"&gt;sqlite-transform&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/sqlite-transform/releases/tag/0.4"&gt;0.4&lt;/a&gt; - (&lt;a href="https://github.com/simonw/sqlite-transform/releases"&gt;5 releases total&lt;/a&gt;) - 2021-02-22
&lt;br /&gt;Tool for running transformations on columns in a SQLite database&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/airtable-export"&gt;airtable-export&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/airtable-export/releases/tag/0.5"&gt;0.5&lt;/a&gt; - (&lt;a href="https://github.com/simonw/airtable-export/releases"&gt;7 releases total&lt;/a&gt;) - 2021-02-22
&lt;br /&gt;Export Airtable data to YAML, JSON or SQLite files on disk&lt;/li&gt;
&lt;/ul&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/crowdsourcing"&gt;crowdsourcing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/postgresql"&gt;postgresql&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/patrick-mckenzie"&gt;patrick-mckenzie&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/weeknotes"&gt;weeknotes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/covid19"&gt;covid19&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vaccinate-ca"&gt;vaccinate-ca&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/personal-news"&gt;personal-news&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jesse-vincent"&gt;jesse-vincent&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="crowdsourcing"/><category term="django"/><category term="postgresql"/><category term="patrick-mckenzie"/><category term="datasette"/><category term="weeknotes"/><category term="covid19"/><category term="vaccinate-ca"/><category term="personal-news"/><category term="jesse-vincent"/></entry><entry><title>Quoting Patrick McKenzie</title><link href="https://simonwillison.net/2020/Apr/29/patrick-mckenzie/#atom-tag" rel="alternate"/><published>2020-04-29T06:39:55+00:00</published><updated>2020-04-29T06:39:55+00:00</updated><id>https://simonwillison.net/2020/Apr/29/patrick-mckenzie/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://twitter.com/patio11/status/1255371954443505665"&gt;&lt;p&gt;The biggest thing people don’t appreciate about large companies is the basic productive unit isn’t an individual it is an engineering team with about ~8 members.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://twitter.com/patio11/status/1255371954443505665"&gt;Patrick McKenzie&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/management"&gt;management&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/patrick-mckenzie"&gt;patrick-mckenzie&lt;/a&gt;&lt;/p&gt;



</summary><category term="management"/><category term="patrick-mckenzie"/></entry><entry><title>Quoting Patrick McKenzie</title><link href="https://simonwillison.net/2017/Dec/2/knowledge/#atom-tag" rel="alternate"/><published>2017-12-02T15:17:19+00:00</published><updated>2017-12-02T15:17:19+00:00</updated><id>https://simonwillison.net/2017/Dec/2/knowledge/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://twitter.com/patio11/status/936626931562299394"&gt;&lt;p&gt;Significant advances shipped by the tech industry in the last 20 years include putting the majority of human knowledge in the hands of 40%++ of the world's population, available on-demand, for "coffee money" not "university money."&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://twitter.com/patio11/status/936626931562299394"&gt;Patrick McKenzie&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/patrick-mckenzie"&gt;patrick-mckenzie&lt;/a&gt;&lt;/p&gt;



</summary><category term="patrick-mckenzie"/></entry><entry><title>Quoting Patrick McKenzie</title><link href="https://simonwillison.net/2017/Oct/23/patrick-mckenzie/#atom-tag" rel="alternate"/><published>2017-10-23T17:45:12+00:00</published><updated>2017-10-23T17:45:12+00:00</updated><id>https://simonwillison.net/2017/Oct/23/patrick-mckenzie/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://twitter.com/patio11/status/922491782583037953"&gt;&lt;p&gt;We made a sale for Appointment Reminder from someone whose only way of getting data into the system was to fax it to us. Guess the cheat. If you guess "CEO signs up for HelloFax, receives the fax, and types 600 patient names and phone numbers by hand" you have good instincts.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://twitter.com/patio11/status/922491782583037953"&gt;Patrick McKenzie&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/sales"&gt;sales&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/patrick-mckenzie"&gt;patrick-mckenzie&lt;/a&gt;&lt;/p&gt;



</summary><category term="sales"/><category term="patrick-mckenzie"/></entry><entry><title>Getting Your First 10 Customers</title><link href="https://simonwillison.net/2017/Oct/23/your-first-10-customers/#atom-tag" rel="alternate"/><published>2017-10-23T17:36:19+00:00</published><updated>2017-10-23T17:36:19+00:00</updated><id>https://simonwillison.net/2017/Oct/23/your-first-10-customers/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://stripe.com/atlas/guides/starting-sales"&gt;Getting Your First 10 Customers&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
There is so much good advice embedded in this article by Patrick McKenzie, and it constantly comes back to the theme of doing whatever it takes to get to your first ten paying customers.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/patio11/status/922484716510486528"&gt;Patrick McKenzie&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/startups"&gt;startups&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sales"&gt;sales&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/patrick-mckenzie"&gt;patrick-mckenzie&lt;/a&gt;&lt;/p&gt;



</summary><category term="startups"/><category term="sales"/><category term="patrick-mckenzie"/></entry></feed>