<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: paul-ford</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/paul-ford.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2026-02-23T16:00:32+00:00</updated><author><name>Simon Willison</name></author><entry><title>Quoting Paul Ford</title><link href="https://simonwillison.net/2026/Feb/23/paul-ford/#atom-tag" rel="alternate"/><published>2026-02-23T16:00:32+00:00</published><updated>2026-02-23T16:00:32+00:00</updated><id>https://simonwillison.net/2026/Feb/23/paul-ford/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://ftrain.com/leading-thoughts"&gt;&lt;p&gt;The paper asked me to explain vibe coding, and I did so, because I think something big is coming there, and I'm deep in, and I worry that normal people are not able to see it and I want them to be prepared. But people can't just read something and hate you quietly; they can't see that you have provided them with a utility or a warning; they need their screech. You are distributed to millions of people, and become the local proxy for the emotions of maybe dozens of people, who disagree and demand your attention, and because you are the one in the paper you need to welcome them with a pastor's smile and deep empathy, and if you speak a word in your own defense they'll screech even louder.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://ftrain.com/leading-thoughts"&gt;Paul Ford&lt;/a&gt;, on writing about vibe coding for the New York Times&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/new-york-times"&gt;new-york-times&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/paul-ford"&gt;paul-ford&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vibe-coding"&gt;vibe-coding&lt;/a&gt;&lt;/p&gt;



</summary><category term="new-york-times"/><category term="paul-ford"/><category term="vibe-coding"/></entry><entry><title>The A.I. Disruption We’ve Been Waiting for Has Arrived</title><link href="https://simonwillison.net/2026/Feb/18/the-ai-disruption/#atom-tag" rel="alternate"/><published>2026-02-18T17:07:31+00:00</published><updated>2026-02-18T17:07:31+00:00</updated><id>https://simonwillison.net/2026/Feb/18/the-ai-disruption/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.nytimes.com/2026/02/18/opinion/ai-software.html?unlocked_article_code=1.NFA.UkLv.r-XczfzYRdXJ&amp;amp;smid=url-share"&gt;The A.I. Disruption We’ve Been Waiting for Has Arrived&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
New opinion piece from Paul Ford in the New York Times. Unsurprisingly for a piece by Paul it's packed with quoteworthy snippets, but a few stood out for me in particular.&lt;/p&gt;
&lt;p&gt;Paul describes the &lt;a href="https://simonwillison.net/2026/Jan/4/inflection/"&gt;November moment&lt;/a&gt; that so many other programmers have observed, and highlights Claude Code's ability to revive old side projects:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[Claude Code] was always a helpful coding assistant, but in November it suddenly got much better, and ever since I’ve been knocking off side projects that had sat in folders for a decade or longer. It’s fun to see old ideas come to life, so I keep a steady flow. Maybe it adds up to a half-hour a day of my time, and an hour of Claude’s.&lt;/p&gt;
&lt;p&gt;November was, for me and many others in tech, a great surprise. Before, A.I. coding tools were often useful, but halting and clumsy. Now, the bot can run for a full hour and make whole, designed websites and apps that may be flawed, but credible. I spent an entire session of therapy talking about it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And as the former CEO of a respected consultancy firm (Postlight) he's well positioned to evaluate the potential impact:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When you watch a large language model slice through some horrible, expensive problem — like migrating data from an old platform to a modern one — you feel the earth shifting. I was the chief executive of a software services firm, which made me a professional software cost estimator. When I rebooted my messy personal website a few weeks ago, I realized: I would have paid $25,000 for someone else to do this. When a friend asked me to convert a large, thorny data set, I downloaded it, cleaned it up and made it pretty and easy to explore. In the past I would have charged $350,000.&lt;/p&gt;
&lt;p&gt;That last price is full 2021 retail — it implies a product manager, a designer, two engineers (one senior) and four to six months of design, coding and testing. Plus maintenance. Bespoke software is joltingly expensive. Today, though, when the stars align and my prompts work out, I can do hundreds of thousands of dollars worth of work for fun (fun for me) over weekends and evenings, for the price of the Claude $200-a-month plan.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He also neatly captures the inherent community tension involved in exploring this technology:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;All of the people I love hate this stuff, and all the people I hate love it. And yet, likely because of the same personality flaws that drew me to technology in the first place, I am annoyingly excited.&lt;/p&gt;
&lt;/blockquote&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/new-york-times"&gt;new-york-times&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/paul-ford"&gt;paul-ford&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/careers"&gt;careers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-assisted-programming"&gt;ai-assisted-programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-ethics"&gt;ai-ethics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/coding-agents"&gt;coding-agents&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/claude-code"&gt;claude-code&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/deep-blue"&gt;deep-blue&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/november-2025-inflection"&gt;november-2025-inflection&lt;/a&gt;&lt;/p&gt;



</summary><category term="new-york-times"/><category term="paul-ford"/><category term="careers"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="ai-assisted-programming"/><category term="ai-ethics"/><category term="coding-agents"/><category term="claude-code"/><category term="deep-blue"/><category term="november-2025-inflection"/></entry><entry><title>Quoting Paul Ford</title><link href="https://simonwillison.net/2020/Dec/16/paul-ford/#atom-tag" rel="alternate"/><published>2020-12-16T05:35:47+00:00</published><updated>2020-12-16T05:35:47+00:00</updated><id>https://simonwillison.net/2020/Dec/16/paul-ford/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://www.wired.com/story/databases-coding-real-programming-myth/"&gt;&lt;p&gt;I get asked a lot about learning to code. Sure, if you can. It's fun. But the real action, the crux of things, is there in the database. Grab a tiny, free database like SQLite. Import a few million rows of data. Make them searchable. It's one of the most soothing activities known to humankind, taking big piles of messy data and massaging them into the rigid structure required of a relational database. It's true power.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://www.wired.com/story/databases-coding-real-programming-myth/"&gt;Paul Ford&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/databases"&gt;databases&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/paul-ford"&gt;paul-ford&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;&lt;/p&gt;



</summary><category term="databases"/><category term="paul-ford"/><category term="sqlite"/></entry><entry><title>Fun with binary data and SQLite</title><link href="https://simonwillison.net/2020/Jul/30/fun-binary-data-and-sqlite/#atom-tag" rel="alternate"/><published>2020-07-30T23:22:17+00:00</published><updated>2020-07-30T23:22:17+00:00</updated><id>https://simonwillison.net/2020/Jul/30/fun-binary-data-and-sqlite/#atom-tag</id><summary type="html">
    &lt;p&gt;This week I've been mainly experimenting with binary data storage in SQLite. &lt;a href="https://sqlite-utils.datasette.io/"&gt;sqlite-utils&lt;/a&gt; can now insert data from binary files, and &lt;a href="https://datasette.io/plugins/datasette-media"&gt;datasette-media&lt;/a&gt; can serve content over HTTP that originated as binary BLOBs in a database file.&lt;/p&gt;

&lt;p&gt;Paul Ford piqued my interest in this when he tweeted about loading thousands of PDF documents into a SQLite database:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2020/paul-ford-slides.jpg" alt="Garish slides in a grid" style="max-width: 100%" /&gt;&lt;/p&gt;
&lt;p lang="en" dir="ltr"&gt;I made a shell script that loads thousands of PDF docs into SQLite databases. That means I can have a web server that produces infinite randomly chosen US Military PowerPoint slides that I can scroll on my phone when I&amp;#39;m around the house.&lt;/p&gt;&amp;#8212; Paul Ford (@ftrain) &lt;a href="https://twitter.com/ftrain/status/1287183861785473027?ref_src=twsrc%5Etfw"&gt;July 26, 2020&lt;/a&gt;&lt;/blockquote&gt;

&lt;p&gt;The SQLite documentation claims that serving smaller binary files from BLOB columns can be &lt;a href="https://www.sqlite.org/fasterthanfs.html"&gt;35% faster than the filesystem&lt;/a&gt;. I've done a little bit of work with binary files in SQLite - the &lt;a href="https://github.com/simonw/datasette-render-binary"&gt;datasette-render-binary&lt;/a&gt; and &lt;a href="https://github.com/simonw/datasette-render-images"&gt;datasette-render-images&lt;/a&gt; both help display BLOB data - but I'd never really dug into it in much detail.&lt;/p&gt;

&lt;h4&gt;sqlite-utils insert-files&lt;/h4&gt;

&lt;p&gt;The first step was to make it easier to build database files that include binary data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sqlite-utils.readthedocs.io/"&gt;sqlite-utils&lt;/a&gt; is my combination Python library and CLI tool for building SQLite databases. I've been steadily evolving it for a couple of years now, and it's the engine behind my &lt;a href="https://dogsheep.github.io/"&gt;Dogsheep&lt;/a&gt; collection of tools for personal analytics.&lt;/p&gt;

&lt;p&gt;The new &lt;a href="https://sqlite-utils.datasette.io/en/stable/cli.html#inserting-data-from-files"&gt;insert-files command&lt;/a&gt; can be used to insert content from binary files into a SQLite database, along with file metadata.&lt;/p&gt;

&lt;p&gt;The most basic usage looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sqlite-utils insert-files gifs.db images *.gif&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;By default, this creates a database table like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;CREATE TABLE [images] (
    [path] TEXT PRIMARY KEY,
    [content] BLOB,
    [size] INTEGER
);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can customize this table to include other file metadata using the &lt;code&gt;-c&lt;/code&gt; (short for &lt;code&gt;--column&lt;/code&gt;) option:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sqlite-utils insert-files gifs.db images *.gif \
    -c path -c md5 -c last_modified:mtime -c size --pk=path&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This creates a table with the following schema:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;CREATE TABLE [images] (
    [path] TEXT PRIMARY KEY,
    [md5] TEXT,
    [last_modified] FLOAT,
    [size] INTEGER
);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you pass a directory instead of a file name the command will recursively add every file in that directory.&lt;/p&gt;

&lt;p&gt;I also improved &lt;code&gt;sqlite-utils&lt;/code&gt; with respect to outputting binary data. The new &lt;code&gt;--raw&lt;/code&gt; option dumps the binary contents of a column directly to standard out, so you can read an image back out of one of the above tables like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sqlite-utils photos.db \
    "select content from images where path=:path" \
    -p path 'myphoto.jpg' \
    --raw &amp;gt; myphoto.jpg&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This example also demonstrates the new support for &lt;code&gt;:parameters&lt;/code&gt; passed using the new &lt;code&gt;-p&lt;/code&gt; option, see &lt;a href="https://github.com/simonw/sqlite-utils/issues/124"&gt;#124&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sqlite-utils&lt;/code&gt; usually communicates using JSON, but JSON doesn't have the ability to represent binary values. Datasette outputs binary values &lt;a href="https://datasette-render-images-demo.datasette.io/favicons/favicons.json?_shape=array&amp;amp;_size=1"&gt;like so&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"data": {
  "$base64": true,
  "encoded": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAY..."
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I added support for the same format to &lt;code&gt;sqlite-utils&lt;/code&gt; - so you can now query binary columns and get out that nested object, or pipe JSON with that nested structure in to &lt;code&gt;sqlite-utils insert&lt;/code&gt; and have it stored as a binary BLOB in the database.&lt;/p&gt;

&lt;h4&gt;datasette-media&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/simonw/datasette-media"&gt;datasette-media&lt;/a&gt; is a plugin for serving binary content directly from Datasette on a special URL. I originally built it while working on &lt;a href="https://github.com/dogsheep/dogsheep-photos"&gt;Dogsheep Photos&lt;/a&gt; - given a SQLite file full of Apple Photos metadata I wanted to be able to serve thumbnails of the actual images via my Datasette web server.&lt;/p&gt;

&lt;p&gt;Those photos were still stored on disk - the plugin lets you configure a SQL query like this which will cause hits to &lt;code&gt;/-/media/photos/$UUID&lt;/code&gt; to serve that file from disk:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
    "plugins": {
        "datasette-media": {
            "photo": {
                "sql": "select filepath from apple_photos where uuid=:key"
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="https://github.com/simonw/datasette-media/issues/14"&gt;Issue #14&lt;/a&gt; added support for &lt;code&gt;BLOB&lt;/code&gt; columns as well. You can now configure the plugin like this to serve binary content that was stored in the database:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
    "plugins": {
        "datasette-media": {
            "thumb": {
                "sql": "select content from thumbnails where uuid=:key"
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This would serve content from a BLOB column in a &lt;code&gt;thumbnails&lt;/code&gt; table from the URL &lt;code&gt;/-/media/thumb/$UUID&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I really like this pattern of configuring plugins using SQL queries, where the returned column names have special meaning that is interpreted by the plugin. &lt;a href="https://github.com/simonw/datasette-atom"&gt;datasette-atom&lt;/a&gt; and &lt;a href="https://github.com/simonw/datasette-ics"&gt;datasette-ics&lt;/a&gt; use a similar trick.&lt;/p&gt;

&lt;p&gt;I expanded &lt;code&gt;datasette-media&lt;/code&gt; with a few other related features:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Return a &lt;code&gt;content_url&lt;/code&gt; column and it will proxy content from that URL&lt;/li&gt;&lt;li&gt;Set &lt;code&gt;"enable_transform": true&lt;/code&gt; for a media bucket to enable &lt;code&gt;?w=&lt;/code&gt; and &lt;code&gt;?h=&lt;/code&gt; and &lt;code&gt;?format=&lt;/code&gt; parameters for transforming the image before it is served to the user&lt;/li&gt;&lt;li&gt;Return a &lt;code&gt;content_filename&lt;/code&gt; column to &lt;a href="https://github.com/simonw/datasette-media#setting-a-download-file-name"&gt;set a download file name&lt;/a&gt; (in a &lt;code&gt;content-disposition&lt;/code&gt; HTTP header) prompting the user's browser to download the file&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;See the &lt;a href="https://github.com/simonw/datasette-media#readme"&gt;README&lt;/a&gt; or &lt;a href="https://github.com/simonw/datasette-media/releases"&gt;release notes&lt;/a&gt; for more details.&lt;/p&gt;

&lt;h4&gt;Also this week&lt;/h4&gt;

&lt;p&gt;I renamed &lt;code&gt;datasette-insert-api&lt;/code&gt; to just &lt;a href="https://github.com/simonw/datasette-insert"&gt;datasette-insert&lt;/a&gt;, reflecting my plans to add non-API features to that plugin in the future.&lt;/p&gt;

&lt;p&gt;In doing so I had to figure out how to rename a PyPI package such that dependent projects would continue to work. I ended up building a &lt;a href="https://github.com/simonw/pypi-rename"&gt;pypi-rename cookiecutter template&lt;/a&gt; encoding what I learned.&lt;/p&gt;

&lt;p&gt;I enabled PostgreSQL full-text search for my blog's Django Admin interface, and wrote &lt;a href="https://github.com/simonw/til/blob/master/django/postgresql-full-text-search-admin.md"&gt;a TIL on how I did it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I &lt;a href="https://github.com/simonw/db-to-sqlite/issues/26"&gt;added compound primary key support&lt;/a&gt; to &lt;code&gt;db-to-sqlite&lt;/code&gt;, so now it can convert PostgreSQL or MySQL databases to SQLite if they use compound primary keys.&lt;/p&gt;

&lt;h4&gt;TIL this week&lt;/h4&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/simonw/til/blob/master/javascript/copy-button.md"&gt;Implementing a "copy to clipboard" button&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/simonw/til/blob/master/django/postgresql-full-text-search-admin.md"&gt;PostgreSQL full-text search in the Django Admin&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/simonw/til/blob/master/sqlite/blob-literals.md"&gt;SQLite BLOB literals&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;h4&gt;Releases this week&lt;/h4&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/simonw/sqlite-utils/releases/tag/2.13"&gt;sqlite-utils 2.13&lt;/a&gt; - 2020-07-30&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/simonw/datasette-media/releases/tag/0.5"&gt;datasette-media 0.5&lt;/a&gt; - 2020-07-29&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/simonw/db-to-sqlite/releases/tag/1.3"&gt;db-to-sqlite 1.3&lt;/a&gt; - 2020-07-27&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/simonw/datasette-media/releases/tag/0.4"&gt;datasette-media 0.4&lt;/a&gt; - 2020-07-27&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/simonw/sqlite-utils/releases/tag/2.12"&gt;sqlite-utils 2.12&lt;/a&gt; - 2020-07-27&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/simonw/datasette-render-images/releases/tag/0.3.1"&gt;datasette-render-images 0.3.1&lt;/a&gt; - 2020-07-27&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/simonw/datasette-render-images/releases/tag/0.3"&gt;datasette-render-images 0.3&lt;/a&gt; - 2020-07-27&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/simonw/datasette-auth-passwords/releases/tag/0.3.1"&gt;datasette-auth-passwords 0.3.1&lt;/a&gt; - 2020-07-26&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/simonw/datasette-insert/releases/tag/0.5"&gt;datasette-insert 0.5&lt;/a&gt; - 2020-07-25&lt;/li&gt;&lt;/ul&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/paul-ford"&gt;paul-ford&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/plugins"&gt;plugins&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/projects"&gt;projects&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&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/sqlite-utils"&gt;sqlite-utils&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="paul-ford"/><category term="plugins"/><category term="projects"/><category term="sqlite"/><category term="datasette"/><category term="weeknotes"/><category term="sqlite-utils"/></entry><entry><title>Why I (Still) Love Tech: In Defense of a Difficult Industry</title><link href="https://simonwillison.net/2019/May/15/in-defense-of-a-difficult-industry/#atom-tag" rel="alternate"/><published>2019-05-15T15:45:20+00:00</published><updated>2019-05-15T15:45:20+00:00</updated><id>https://simonwillison.net/2019/May/15/in-defense-of-a-difficult-industry/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.wired.com/story/why-we-love-tech-defense-difficult-industry/"&gt;Why I (Still) Love Tech: In Defense of a Difficult Industry&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
If you only read one longform piece this week, make it this one. Utterly delightful prose and a bunch of different messages that resonated with me deeply.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://daringfireball.net/linked/2019/05/14/ford-loves-tech"&gt;Daring Fireball&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


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



</summary><category term="paul-ford"/></entry><entry><title>Quoting Paul Ford</title><link href="https://simonwillison.net/2019/May/15/paul-ford/#atom-tag" rel="alternate"/><published>2019-05-15T15:44:01+00:00</published><updated>2019-05-15T15:44:01+00:00</updated><id>https://simonwillison.net/2019/May/15/paul-ford/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://www.wired.com/story/why-we-love-tech-defense-difficult-industry/"&gt;&lt;p&gt;Imagine if you were really into the group Swervedriver in the mid-’90s but by 2019 someone was on CNBC telling you that Swervedriver represented, I don’t know, 10 percent of global economic growth, outpacing returns in oil and lumber. That’s the tech industry.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://www.wired.com/story/why-we-love-tech-defense-difficult-industry/"&gt;Paul Ford&lt;/a&gt;&lt;/p&gt;

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



</summary><category term="paul-ford"/></entry><entry><title>Usable Data</title><link href="https://simonwillison.net/2019/Jan/11/usable-data/#atom-tag" rel="alternate"/><published>2019-01-11T18:33:18+00:00</published><updated>2019-01-11T18:33:18+00:00</updated><id>https://simonwillison.net/2019/Jan/11/usable-data/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://medium.com/@ftrain/usable-data-eb7234d64309"&gt;Usable Data&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
A Paul Ford essay from February 2016 in which he advocates for SQLite as the ideal format for sharing interesting data. I don’t know how I missed this one—it predates Datasette, but it perfectly captures the benefits that I’m trying to expose with the project. “In my dream universe, there would be a massive searchable torrent site filled with open, explorable data sets, in SQLite format, some with full text search indexes already in place.”

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/simonw/status/1083793391631032320"&gt;Twitter&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/open-data"&gt;open-data&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/paul-ford"&gt;paul-ford&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;&lt;/p&gt;



</summary><category term="open-data"/><category term="paul-ford"/><category term="sqlite"/><category term="datasette"/></entry><entry><title>Quoting Paul Ford</title><link href="https://simonwillison.net/2018/Mar/10/paul-ford/#atom-tag" rel="alternate"/><published>2018-03-10T11:34:30+00:00</published><updated>2018-03-10T11:34:30+00:00</updated><id>https://simonwillison.net/2018/Mar/10/paul-ford/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://www.bloomberg.com/news/features/2018-03-09/bitcoin-is-ridiculous-blockchain-is-dangerous-paul-ford"&gt;&lt;p&gt;Consider Bitcoin a grand middle finger. It’s a prank, almost a parody of the global financial system, that turned into a bubble. “You plutocrats of Davos may think you control the global money supply,” the pranksters seem to say. “But humans will make an economy out of anything. Even this!”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://www.bloomberg.com/news/features/2018-03-09/bitcoin-is-ridiculous-blockchain-is-dangerous-paul-ford"&gt;Paul Ford&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/economics"&gt;economics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/paul-ford"&gt;paul-ford&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/bitcoin"&gt;bitcoin&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/blockchain"&gt;blockchain&lt;/a&gt;&lt;/p&gt;



</summary><category term="economics"/><category term="paul-ford"/><category term="bitcoin"/><category term="blockchain"/></entry><entry><title>How I made a Who's On First subset database</title><link href="https://simonwillison.net/2018/Feb/3/whosonfirst/#atom-tag" rel="alternate"/><published>2018-02-03T05:25:25+00:00</published><updated>2018-02-03T05:25:25+00:00</updated><id>https://simonwillison.net/2018/Feb/3/whosonfirst/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://gist.github.com/simonw/425ede4e8453b89aef00e095dee4f3d3"&gt;How I made a Who&amp;#x27;s On First subset database&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Inspired by Paul Ford on Twitter, I tried out a new trick with SQLite: connect to a database containing JSON, attach a brand new empty database file using “attach database”, then populate it using INSERT INTO ... SELECT plus the json_extract() function to extract out a subset of the JSON properties into a new table in the new database.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/json"&gt;json&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/paul-ford"&gt;paul-ford&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/whosonfirst"&gt;whosonfirst&lt;/a&gt;&lt;/p&gt;



</summary><category term="json"/><category term="paul-ford"/><category term="sqlite"/><category term="whosonfirst"/></entry><entry><title>Quoting Paul Ford</title><link href="https://simonwillison.net/2018/Jan/29/paul-ford/#atom-tag" rel="alternate"/><published>2018-01-29T16:29:36+00:00</published><updated>2018-01-29T16:29:36+00:00</updated><id>https://simonwillison.net/2018/Jan/29/paul-ford/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://twitter.com/ftrain/status/958009875497472005"&gt;&lt;p&gt;[On SQLite] The JSON interface is like, "we save the text and when you retrieve it we parse the JSON at several hundred MB/s and let you do path queries against it please stop overthinking it, this is filing cabinet."&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://twitter.com/ftrain/status/958009875497472005"&gt;Paul Ford&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/json"&gt;json&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/paul-ford"&gt;paul-ford&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;&lt;/p&gt;



</summary><category term="json"/><category term="paul-ford"/><category term="sqlite"/></entry><entry><title>Datasette: Ability to customize presentation of specific columns in HTML view</title><link href="https://simonwillison.net/2017/Nov/30/customize-presentation-of-specific-columns/#atom-tag" rel="alternate"/><published>2017-11-30T07:27:58+00:00</published><updated>2017-11-30T07:27:58+00:00</updated><id>https://simonwillison.net/2017/Nov/30/customize-presentation-of-specific-columns/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/simonw/datasette/issues/153"&gt;Datasette: Ability to customize presentation of specific columns in HTML view&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Still a work in progress, but Datasette master now allows you to inject links to one or more additional CSS and JavaScript resources (optionally with SRI hashes) which will be included on every page. Each template also&lt;br&gt;now provides CSS classes on the body element derived from the current database and table names to provide hooks for custom styling. Next up: custom template support.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/css"&gt;css&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/paul-ford"&gt;paul-ford&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;&lt;/p&gt;



</summary><category term="css"/><category term="paul-ford"/><category term="datasette"/></entry><entry><title>Quoting Paul Ford</title><link href="https://simonwillison.net/2017/Nov/17/paul-ford/#atom-tag" rel="alternate"/><published>2017-11-17T01:10:49+00:00</published><updated>2017-11-17T01:10:49+00:00</updated><id>https://simonwillison.net/2017/Nov/17/paul-ford/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://trackchanges.postlight.com/big-data-small-effort-b62607a43a8c"&gt;&lt;p&gt;If you’re a public data provider—and many large NGOs, government organizations, cultural organizations, historical archives, media organizations, medical orgs, and academic institutions are exactly that—you can publish gigabytes of data, and make it available as an API, and make it easy to browse on the web, too, with extremely low effort. Put it into SQLite, point this little guy at it, and you’ve just radically increased the accessibility and utility of your data. Because messing around in SQL from a web browser is orders of magnitude more immediately useful than downloading a CSV, processing it, and figuring out what comes next.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://trackchanges.postlight.com/big-data-small-effort-b62607a43a8c"&gt;Paul Ford&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/paul-ford"&gt;paul-ford&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;&lt;/p&gt;



</summary><category term="paul-ford"/><category term="sqlite"/><category term="datasette"/></entry><entry><title>Learning to Fear the Semantic Web</title><link href="https://simonwillison.net/2008/Oct/23/learning/#atom-tag" rel="alternate"/><published>2008-10-23T16:14:03+00:00</published><updated>2008-10-23T16:14:03+00:00</updated><id>https://simonwillison.net/2008/Oct/23/learning/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://ftrain.com/a-semantic-web-fear.html"&gt;Learning to Fear the Semantic Web&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Paul Ford raises the liability issue with regards to building sites around other people’s metadata, pointing out that OpenCalais is owned by Thomson Reuters who have a bad track record with regards to intellectual property lawsuits elsewhere in the organisation.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/intellectualproperty"&gt;intellectualproperty&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/opencalais"&gt;opencalais&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/paul-ford"&gt;paul-ford&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/semanticweb"&gt;semanticweb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/thomson-reuters"&gt;thomson-reuters&lt;/a&gt;&lt;/p&gt;



</summary><category term="intellectualproperty"/><category term="opencalais"/><category term="paul-ford"/><category term="semanticweb"/><category term="thomson-reuters"/></entry><entry><title>Harper's Magazine</title><link href="https://simonwillison.net/2007/Apr/14/harpers/#atom-tag" rel="alternate"/><published>2007-04-14T00:05:37+00:00</published><updated>2007-04-14T00:05:37+00:00</updated><id>https://simonwillison.net/2007/Apr/14/harpers/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.harpers.org/"&gt;Harper&amp;#x27;s Magazine&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The site with the best metadata on the Web just relaunched, with even MORE metadata.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://ftrain.com/SiteLaunch.html"&gt;Launch (Ftrain.com)&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/harpers"&gt;harpers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/metadata"&gt;metadata&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/paul-ford"&gt;paul-ford&lt;/a&gt;&lt;/p&gt;



</summary><category term="harpers"/><category term="metadata"/><category term="paul-ford"/></entry><entry><title>Quoting Paul Ford</title><link href="https://simonwillison.net/2007/Jan/8/ftrain/#atom-tag" rel="alternate"/><published>2007-01-08T13:46:04+00:00</published><updated>2007-01-08T13:46:04+00:00</updated><id>https://simonwillison.net/2007/Jan/8/ftrain/#atom-tag</id><summary type="html">
    &lt;blockquote cite="http://www.ftrain.com/RealEmpiresShip.html"&gt;&lt;p&gt;If your average iPod weighs five ounces with packaging, then Apple has moved about 21,875,000 pounds of them, equivalent in weight to 1,325 full-grown male African elephants, 35 times as many as Hannibal's force.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="http://www.ftrain.com/RealEmpiresShip.html"&gt;Paul Ford&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/apple"&gt;apple&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hannibal"&gt;hannibal&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ipod"&gt;ipod&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/paul-ford"&gt;paul-ford&lt;/a&gt;&lt;/p&gt;



</summary><category term="apple"/><category term="hannibal"/><category term="ipod"/><category term="paul-ford"/></entry><entry><title>Gothamist Interviews: Paul Ford</title><link href="https://simonwillison.net/2004/Feb/25/gothamist/#atom-tag" rel="alternate"/><published>2004-02-25T23:47:10+00:00</published><updated>2004-02-25T23:47:10+00:00</updated><id>https://simonwillison.net/2004/Feb/25/gothamist/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.gothamist.com/interview/archives/2004/02/24/paul_ford_writerprogrammer.php"&gt;Gothamist Interviews: Paul Ford&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
“the only way to ignore advertising is to die”


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



</summary><category term="paul-ford"/></entry></feed>