tils

Custom SQL query returning 1 row (hide)

Query parameters

json_object('pre', group_concat('* [' || title || '](' || url || ')', ' '))
* [Creating a dynamic line chart with SVG](https://github.com/simonw/til/blob/main/svg/dynamic-line-chart.md)
* [Search across all loaded resources in Firefox](https://github.com/simonw/til/blob/main/firefox/search-across-all-resources.md)
* [Writing tests for the ASGI lifespan protocol with HTTPX](https://github.com/simonw/til/blob/main/asgi/lifespan-test-httpx.md)
* [Adding project links to PyPI](https://github.com/simonw/til/blob/main/pypi/project-links.md)
* [Attaching a bash shell to a running Docker container](https://github.com/simonw/til/blob/main/docker/attach-bash-to-running-container.md)
* [Fixing "compinit: insecure directories" error](https://github.com/simonw/til/blob/main/macos/fixing-compinit-insecure-directories.md)
* [Finding the largest SQLite files on a Mac](https://github.com/simonw/til/blob/main/macos/find-largest-sqlite.md)
* [Using heroku pg:pull to restore a backup to a macOS laptop](https://github.com/simonw/til/blob/main/heroku/pg-pull.md)
* [Programatically accessing Heroku PostgreSQL from GitHub Actions](https://github.com/simonw/til/blob/main/heroku/programatic-access-postgresql.md)
* [Upgrading a Heroku PostgreSQL database with pg:copy](https://github.com/simonw/til/blob/main/heroku/pg-upgrade.md)
* [How to mock httpx using pytest-mock](https://github.com/simonw/til/blob/main/pytest/mock-httpx.md)
* [Registering temporary pluggy plugins inside tests](https://github.com/simonw/til/blob/main/pytest/registering-plugins-in-tests.md)
* [Asserting a dictionary is a subset of another dictionary](https://github.com/simonw/til/blob/main/pytest/assert-dictionary-subset.md)
* [Code coverage using pytest and codecov.io](https://github.com/simonw/til/blob/main/pytest/pytest-code-coverage.md)
* [Start a server in a subprocess during a pytest session](https://github.com/simonw/til/blob/main/pytest/subprocess-server.md)
* [Session-scoped temporary directories in pytest](https://github.com/simonw/til/blob/main/pytest/session-scoped-tmp.md)
* [How to call pip programatically from Python](https://github.com/simonw/til/blob/main/python/call-pip-programatically.md)
* [Outputting JSON with reduced floating point precision](https://github.com/simonw/til/blob/main/python/json-floating-point.md)
* [Build the official Python documentation locally](https://github.com/simonw/til/blob/main/python/build-official-docs.md)
* [Introspecting Python function parameters](https://github.com/simonw/til/blob/main/python/introspect-function-parameters.md)
* [Password hashing in Python with pbkdf2](https://github.com/simonw/til/blob/main/python/password-hashing-with-pbkdf2.md)
* [Installing and upgrading Datasette plugins with pipx](https://github.com/simonw/til/blob/main/python/installing-upgrading-plugins-with-pipx.md)
* [Use setup.py to install platform-specific dependencies](https://github.com/simonw/til/blob/main/python/platform-specific-dependencies.md)
* [Generated a summary of nested JSON data](https://github.com/simonw/til/blob/main/python/generate-nested-json-summary.md)
* [Rendering Markdown with the GitHub Markdown API](https://github.com/simonw/til/blob/main/markdown/github-markdown-api.md)
* [Converting HTML and rich-text to Markdown](https://github.com/simonw/til/blob/main/markdown/converting-to-markdown.md)
* [Packaging a Python CLI tool for Homebrew](https://github.com/simonw/til/blob/main/homebrew/packaging-python-cli-for-homebrew.md)
* [Browsing your local git checkout of homebrew-core](https://github.com/simonw/til/blob/main/homebrew/homebrew-core-local-git-checkout.md)
* [SQLite BLOB literals](https://github.com/simonw/til/blob/main/sqlite/blob-literals.md)
* [Using LD_PRELOAD to run any version of SQLite with Python](https://github.com/simonw/til/blob/main/sqlite/ld-preload.md)
* [Compile a new sqlite3 binary on Ubuntu](https://github.com/simonw/til/blob/main/sqlite/compile-sqlite3-ubuntu.md)
* [Enabling WAL mode for SQLite database files](https://github.com/simonw/til/blob/main/sqlite/enabling-wal-mode.md)
* [List all columns in a SQLite database](https://github.com/simonw/til/blob/main/sqlite/list-all-columns-in-a-database.md)
* [How to deploy a folder with a Dockerfile to Cloud Run](https://github.com/simonw/til/blob/main/cloudrun/ship-dockerfile-to-cloud-run.md)
* [Read the Docs Search API](https://github.com/simonw/til/blob/main/readthedocs/readthedocs-search-api.md)
* [Pointing a custom subdomain at Read the Docs](https://github.com/simonw/til/blob/main/readthedocs/custom-subdomain.md)
* [Paginating through the GitHub GraphQL API with Python](https://github.com/simonw/til/blob/main/github/graphql-pagination-python.md)
* [Accessing repository dependencies in the GitHub GraphQL API](https://github.com/simonw/til/blob/main/github/dependencies-graphql-api.md)
* [Piping echo to a file owned by root using sudo and tee](https://github.com/simonw/til/blob/main/linux/echo-pipe-to-file-su.md)
* [Restricting SSH connections to devices within a Tailscale network](https://github.com/simonw/til/blob/main/tailscale/lock-down-sshd.md)
* [Implementing a "copy to clipboard" button](https://github.com/simonw/til/blob/main/javascript/copy-button.md)
* [Working around the size limit for nodeValue in the DOM](https://github.com/simonw/til/blob/main/javascript/working-around-nodevalue-size-limit.md)
* [Minifying JavaScript with npx uglify-js](https://github.com/simonw/til/blob/main/javascript/minifying-uglify-npx.md)
* [Dynamically loading multiple assets with a callback](https://github.com/simonw/til/blob/main/javascript/dynamically-loading-assets.md)
* [Constant-time comparison of strings in Node](https://github.com/simonw/til/blob/main/node/constant-time-compare-strings.md)
* [Customizing my zsh prompt](https://github.com/simonw/til/blob/main/zsh/custom-zsh-prompt.md)
* [Converting Airtable JSON for use with sqlite-utils using jq](https://github.com/simonw/til/blob/main/jq/reformatting-airtable-json.md)
* [PostgreSQL full-text search in the Django Admin](https://github.com/simonw/til/blob/main/django/postgresql-full-text-search-admin.md)
* [Providing a "subscribe in Google Calendar" link for an ics feed](https://github.com/simonw/til/blob/main/ics/google-calendar-ics-subscribe-link.md)
* [Updating a Markdown table of contents with a GitHub Action](https://github.com/simonw/til/blob/main/github-actions/markdown-table-of-contents.md)
* [Skipping a GitHub Actions step without failing](https://github.com/simonw/til/blob/main/github-actions/continue-on-error.md)
* [Using grep to write tests in CI](https://github.com/simonw/til/blob/main/github-actions/grep-tests.md)
* [Looping over comma-separated values in Bash](https://github.com/simonw/til/blob/main/bash/loop-over-csv.md)
* [Using the gcloud run services list command](https://github.com/simonw/til/blob/main/cloudrun/gcloud-run-services-list.md)
* [Debugging a Click application using pdb](https://github.com/simonw/til/blob/main/python/debug-click-with-pdb.md)
* [Very basic tsc usage](https://github.com/simonw/til/blob/main/typescript/basic-tsc.md)
* [Display EC2 instance costs per month](https://github.com/simonw/til/blob/main/aws/instance-costs-per-month.md)
* [Basic strace to see what a process is doing](https://github.com/simonw/til/blob/main/linux/basic-strace.md)
* [Open a debugging shell in GitHub Actions with tmate](https://github.com/simonw/til/blob/main/github-actions/debug-tmate.md)
* [Talking to a PostgreSQL service container from inside a Docker container](https://github.com/simonw/til/blob/main/github-actions/service-containers-docker.md)
* [Turning on Jinja autoescaping when using Template() directly](https://github.com/simonw/til/blob/main/jinja/autoescape-template.md)
* [Compiling the SQLite spellfix.c module on macOS](https://github.com/simonw/til/blob/main/sqlite/compile-spellfix-osx.md)
* [Understanding option names in Click](https://github.com/simonw/til/blob/main/python/click-option-names.md)
* [Figuring out if a text value in SQLite is a valid integer or float](https://github.com/simonw/til/blob/main/sqlite/text-value-is-integer-or-float.md)
* [Escaping strings in Bash using !:q](https://github.com/simonw/til/blob/main/bash/escaping-a-string.md)
* [Installing Selenium for Python on macOS with ChromeDriver](https://github.com/simonw/til/blob/main/selenium/selenium-python-macos.md)
* [Using async/await in JavaScript in Selenium](https://github.com/simonw/til/blob/main/selenium/async-javascript-in-selenium.md)
* [Manipulating query strings with URLSearchParams](https://github.com/simonw/til/blob/main/javascript/manipulating-query-params.md)
* [Running Datasette on DigitalOcean App Platform](https://github.com/simonw/til/blob/main/digitalocean/datasette-on-digitalocean-app-platform.md)
* [Searching for repositories by topic using the GitHub GraphQL API](https://github.com/simonw/til/blob/main/github/graphql-search-topics.md)
* [Upgrading Python Homebrew packages using pip](https://github.com/simonw/til/blob/main/homebrew/upgrading-python-homebrew-packages.md)
* [Explicit file encodings using click.File](https://github.com/simonw/til/blob/main/python/click-file-encoding.md)
* [Writing JavaScript that responds to media queries](https://github.com/simonw/til/blob/main/javascript/javascript-that-responds-to-media-queries.md)
* [Decorators with optional arguments](https://github.com/simonw/til/blob/main/python/decorators-with-optional-arguments.md)
* [Dropdown menu with details summary](https://github.com/simonw/til/blob/main/javascript/dropdown-menu-with-details-summary.md)
* [Redirects for Datasette](https://github.com/simonw/til/blob/main/datasette/redirects-for-datasette.md)
* [Running Python code in a subprocess with a time limit](https://github.com/simonw/til/blob/main/python/subprocess-time-limit.md)
* [Using custom Sphinx templates on Read the Docs](https://github.com/simonw/til/blob/main/readthedocs/custom-sphinx-templates.md)
* [Controlling the style of dumped YAML using PyYAML](https://github.com/simonw/til/blob/main/python/style-yaml-dump.md)
* [Escaping a SQL query to use with curl and Datasette](https://github.com/simonw/til/blob/main/bash/escaping-sql-for-curl-to-datasette.md)
* [Skipping CSV rows with odd numbers of quotes using ripgrep](https://github.com/simonw/til/blob/main/bash/skip-csv-rows-with-odd-numbers.md)
* [Replicating SQLite with rqlite](https://github.com/simonw/til/blob/main/sqlite/replicating-rqlite.md)
* [Relinquishing control in Python asyncio](https://github.com/simonw/til/blob/main/python/yielding-in-asyncio.md)
* [Using Jest without a package.json](https://github.com/simonw/til/blob/main/javascript/jest-without-package-json.md)
* [Using Prettier to check JavaScript code style in GitHub Actions](https://github.com/simonw/til/blob/main/github-actions/prettier-github-actions.md)
* [Packaging a Python app as a standalone binary with PyInstaller](https://github.com/simonw/til/blob/main/python/packaging-pyinstaller.md)
* [Identifying column combination patterns in a SQLite table](https://github.com/simonw/til/blob/main/sqlite/column-combinations.md)
* [Recovering data from AWS Lightsail using EC2](https://github.com/simonw/til/blob/main/aws/recovering-lightsail-data.md)
* [Bulk fetching repository details with the GitHub GraphQL API](https://github.com/simonw/til/blob/main/github/bulk-repo-github-graphql.md)
* [Fixing broken text encodings with sqlite-transform and ftfy](https://github.com/simonw/til/blob/main/sqlite/fixing-column-encoding-with-ftfy-and-sqlite-transform.md)
* [Syntax highlighting Python console examples with GFM](https://github.com/simonw/til/blob/main/github/syntax-highlighting-python-console.md)
* [Embedding JavaScript in a Jupyter notebook](https://github.com/simonw/til/blob/main/jupyter/javascript-in-a-jupyter-notebook.md)
* [Testing cookiecutter templates with pytest](https://github.com/simonw/til/blob/main/cookiecutter/pytest-for-cookiecutter.md)
* [Conditionally creating directories in cookiecutter](https://github.com/simonw/til/blob/main/cookiecutter/conditionally-creating-directories.md)
* [Splitting on commas in SQLite](https://github.com/simonw/til/blob/main/sqlite/splitting-commas-sqlite.md)
* [Serving MBTiles with datasette-media](https://github.com/simonw/til/blob/main/datasette/serving-mbtiles.md)
* [Downloading MapZen elevation tiles](https://github.com/simonw/til/blob/main/gis/mapzen-elevation-tiles.md)
* [Shrinking PNG files with pngquant and oxipng](https://github.com/simonw/til/blob/main/macos/shrinking-pngs-with-pngquant-and-oxipng.md)
* [Handling CSV files with wide columns in Python](https://github.com/simonw/til/blob/main/python/csv-error-column-too-large.md)
* [Using io.BufferedReader to peek against a non-peekable stream](https://github.com/simonw/til/blob/main/python/io-bufferedreader.md)
* [Loading radio.garden into SQLite using jq](https://github.com/simonw/til/blob/main/jq/radio-garden-jq.md)
* [Using sphinx.ext.extlinks for issue links](https://github.com/simonw/til/blob/main/sphinx/sphinx-ext-extlinks.md)
* [Show the SQL schema for a PostgreSQL database](https://github.com/simonw/til/blob/main/postgresql/show-schema.md)
* [Running tests against PostgreSQL in a service container](https://github.com/simonw/til/blob/main/github-actions/postgresq-service-container.md)
* [Adding extra read-only information to a Django admin change page](https://github.com/simonw/til/blob/main/django/extra-read-only-admin-information.md)
* [Granting a PostgreSQL user read-only access to some tables](https://github.com/simonw/til/blob/main/postgresql/read-only-postgresql-user.md)
* [Writing tests for the Django admin with pytest-django](https://github.com/simonw/til/blob/main/django/testing-django-admin-with-pytest.md)
* [Show the timezone for datetimes in the Django admin](https://github.com/simonw/til/blob/main/django/show-timezone-in-django-admin.md)
* [How to run MediaWiki with SQLite on a macOS laptop](https://github.com/simonw/til/blob/main/mediawiki/mediawiki-sqlite-macos.md)
* [Pretty-printing all read-only JSON in the Django admin](https://github.com/simonw/til/blob/main/django/pretty-print-json-admin.md)
* [Flattening nested JSON objects with jq](https://github.com/simonw/til/blob/main/jq/flatten-nested-json-objects-jq.md)
* [Converting no-decimal-point latitudes and longitudes using jq](https://github.com/simonw/til/blob/main/jq/convert-no-decimal-point-latitude-jq.md)
* [How to almost get facet counts in the Django admin](https://github.com/simonw/til/blob/main/django/almost-facet-counts-django-admin.md)
* [Querying for GitHub issues open for less than 60 seconds](https://github.com/simonw/til/blob/main/datasette/issues-open-for-less-than-x-seconds.md)
* [Querying for items stored in UTC that were created on a Thursday in PST](https://github.com/simonw/til/blob/main/sqlite/utc-items-on-thursday-in-pst.md)
* [Running gdb against a Python process in a running Docker container](https://github.com/simonw/til/blob/main/docker/gdb-python-docker.md)
* [Tracing every executed Python statement](https://github.com/simonw/til/blob/main/python/tracing-every-statement.md)
* [Installing packages from Debian unstable in a Docker image based on stable](https://github.com/simonw/til/blob/main/docker/debian-unstable-packages.md)
* [Closest locations to a point](https://github.com/simonw/til/blob/main/postgresql/closest-locations-to-a-point.md)
* [Redirecting all paths on a Vercel instance](https://github.com/simonw/til/blob/main/zeit-now/redirecting-all-paths-on-vercel.md)
* [Writing an Azure Function that serves all traffic to a subdomain](https://github.com/simonw/til/blob/main/azure/all-traffic-to-subdomain.md)
* [Useful Markdown extensions in Python](https://github.com/simonw/til/blob/main/markdown/markdown-extensions-python.md)
* [Language-specific indentation settings in VS Code](https://github.com/simonw/til/blob/main/vscode/language-specific-indentation-settings.md)
* [Efficient bulk deletions in Django](https://github.com/simonw/til/blob/main/django/efficient-bulk-deletions-in-django.md)
* [Using unnest() to use a comma-separated string as the input to an IN query](https://github.com/simonw/til/blob/main/postgresql/unnest-csv.md)
* [Using json_extract_path in PostgreSQL](https://github.com/simonw/til/blob/main/postgresql/json-extract-path.md)
* [Listing files uploaded to Cloud Build](https://github.com/simonw/til/blob/main/cloudrun/listing-cloudbuild-files.md)
* [Enabling the fuzzystrmatch extension in PostgreSQL with a Django migration](https://github.com/simonw/til/blob/main/django/migration-postgresql-fuzzystrmatch.md)
* [Usable horizontal scrollbars in the Django admin for mouse users](https://github.com/simonw/til/blob/main/django/django-admin-horizontal-scroll.md)
* [Filter by comma-separated values in the Django admin](https://github.com/simonw/til/blob/main/django/filter-by-comma-separated-values.md)
* [Constructing GeoJSON in PostgreSQL](https://github.com/simonw/til/blob/main/postgresql/constructing-geojson-in-postgresql.md)
* [Django Admin action for exporting selected rows as CSV](https://github.com/simonw/til/blob/main/django/export-csv-from-django-admin.md)
* [migrations.RunSQL.noop for reversible SQL migrations](https://github.com/simonw/til/blob/main/django/migrations-runsql-noop.md)
* [Running Datasette on Replit](https://github.com/simonw/til/blob/main/datasette/datasette-on-replit.md)
* [Scroll page to form if there are errors](https://github.com/simonw/til/blob/main/javascript/scroll-to-form-if-errors.md)