{"id":13472266,"url":"https://github.com/simonw/til","last_synced_at":"2025-04-13T08:56:46.738Z","repository":{"id":37291875,"uuid":"257022147","full_name":"simonw/til","owner":"simonw","description":"Today I Learned","archived":false,"fork":false,"pushed_at":"2025-04-05T22:46:34.000Z","size":3577,"stargazers_count":1205,"open_issues_count":27,"forks_count":103,"subscribers_count":41,"default_branch":"main","last_synced_at":"2025-04-06T05:07:52.845Z","etag":null,"topics":["datasette","til"],"latest_commit_sha":null,"homepage":"https://til.simonwillison.net","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/simonw.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"simonw"}},"created_at":"2020-04-19T14:35:59.000Z","updated_at":"2025-04-05T22:46:37.000Z","dependencies_parsed_at":"2023-12-12T01:39:33.698Z","dependency_job_id":"6ddf62c4-4f49-4afd-aad2-8232384017b6","html_url":"https://github.com/simonw/til","commit_stats":{"total_commits":2047,"total_committers":16,"mean_commits":127.9375,"dds":"0.28187591597459694","last_synced_commit":"e31ada2d4b7762dc70289a1d0c9ba78611b6f897"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonw%2Ftil","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonw%2Ftil/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonw%2Ftil/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonw%2Ftil/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/simonw","download_url":"https://codeload.github.com/simonw/til/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248688544,"owners_count":21145764,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["datasette","til"],"created_at":"2024-07-31T16:00:53.413Z","updated_at":"2025-04-13T08:56:46.713Z","avatar_url":"https://github.com/simonw.png","language":"HTML","funding_links":["https://github.com/sponsors/simonw"],"categories":["HTML"],"sub_categories":[],"readme":"# Today I Learned\n\nMy Today I Learned snippets. Inspired by [jbranchaud/til](https://github.com/jbranchaud/til), which I spotted [on Hacker News](https://news.ycombinator.com/item?id=22908044).\n\nSearch these TILs at https://til.simonwillison.net/\n\n\u003c!-- count starts --\u003e552\u003c!-- count ends --\u003e TILs so far. \u003ca href=\"https://til.simonwillison.net/til/feed.atom\"\u003eAtom feed here\u003c/a\u003e.\n\n\u003c!-- index starts --\u003e\n## github-actions\n\n* [Only run GitHub Action on push to master / main](https://github.com/simonw/til/blob/main/github-actions/only-master.md) - 2020-04-19\n* [Dump out all GitHub Actions context](https://github.com/simonw/til/blob/main/github-actions/dump-context.md) - 2020-04-19\n* [Set environment variables for all steps in a GitHub Action](https://github.com/simonw/til/blob/main/github-actions/set-environment-for-all-steps.md) - 2020-04-19\n* [Commit a file if it changed](https://github.com/simonw/til/blob/main/github-actions/commit-if-file-changed.md) - 2020-04-19\n* [Running different steps on a schedule](https://github.com/simonw/til/blob/main/github-actions/different-steps-on-a-schedule.md) - 2020-04-20\n* [Updating a Markdown table of contents with a GitHub Action](https://github.com/simonw/til/blob/main/github-actions/markdown-table-of-contents.md) - 2020-07-22\n* [Using grep to write tests in CI](https://github.com/simonw/til/blob/main/github-actions/grep-tests.md) - 2020-08-19\n* [Skipping a GitHub Actions step without failing](https://github.com/simonw/til/blob/main/github-actions/continue-on-error.md) - 2020-08-22\n* [Open a debugging shell in GitHub Actions with tmate](https://github.com/simonw/til/blob/main/github-actions/debug-tmate.md) - 2020-09-14\n* [Talking to a PostgreSQL service container from inside a Docker container](https://github.com/simonw/til/blob/main/github-actions/service-containers-docker.md) - 2020-09-18\n* [Using Prettier to check JavaScript code style in GitHub Actions](https://github.com/simonw/til/blob/main/github-actions/prettier-github-actions.md) - 2020-12-31\n* [Running tests against PostgreSQL in a service container](https://github.com/simonw/til/blob/main/github-actions/postgresq-service-container.md) - 2021-02-23\n* [Installing different PostgreSQL server versions in GitHub Actions](https://github.com/simonw/til/blob/main/github-actions/different-postgresql-versions.md) - 2021-07-05\n* [Attaching a generated file to a GitHub release using Actions](https://github.com/simonw/til/blob/main/github-actions/attach-generated-file-to-release.md) - 2021-09-07\n* [Storing files in an S3 bucket between GitHub Actions runs](https://github.com/simonw/til/blob/main/github-actions/s3-bucket-github-actions.md) - 2021-12-07\n* [Testing against Python 3.11 preview using GitHub Actions](https://github.com/simonw/til/blob/main/github-actions/python-3-11.md) - 2022-02-02\n* [Using the GitHub Actions cache with npx and no package.json](https://github.com/simonw/til/blob/main/github-actions/npm-cache-with-npx-no-package.md) - 2022-03-22\n* [Deploying a live Datasette demo when the tests pass](https://github.com/simonw/til/blob/main/github-actions/deploy-live-demo-when-tests-pass.md) - 2022-03-27\n* [GitHub Actions job summaries](https://github.com/simonw/til/blob/main/github-actions/job-summaries.md) - 2022-05-17\n* [Optimizing PNGs in GitHub Actions using Oxipng](https://github.com/simonw/til/blob/main/github-actions/oxipng.md) - 2022-05-18\n* [Conditionally running a second job in a GitHub Actions workflow](https://github.com/simonw/til/blob/main/github-actions/conditionally-run-a-second-job.md) - 2022-07-11\n* [Ensure labels exist in a GitHub repository](https://github.com/simonw/til/blob/main/github-actions/ensure-labels.md) - 2022-09-25\n* [actions/setup-python caching for setup.py projects](https://github.com/simonw/til/blob/main/github-actions/cache-setup-py.md) - 2022-11-28\n* [Running tests against multiple versions of a Python dependency in GitHub Actions](https://github.com/simonw/til/blob/main/github-actions/running-tests-against-multiple-verisons-of-dependencies.md) - 2023-09-15\n* [Serving a JavaScript project built using Vite from GitHub Pages](https://github.com/simonw/til/blob/main/github-actions/vite-github-pages.md) - 2023-10-23\n* [GitHub Actions, Issues and Pages to build a daily planner](https://github.com/simonw/til/blob/main/github-actions/daily-planner.md) - 2024-01-01\n* [Creating GitHub repository labels with an Actions workflow](https://github.com/simonw/til/blob/main/github-actions/creating-github-labels.md) - 2024-02-09\n* [Running cog automatically against GitHub pull requests](https://github.com/simonw/til/blob/main/github-actions/cog.md) - 2024-11-06\n* [Building and deploying a custom site using GitHub Actions and GitHub Pages](https://github.com/simonw/til/blob/main/github-actions/github-pages.md) - 2025-03-18\n\n## python\n\n* [Convert a datetime object to UTC without using pytz](https://github.com/simonw/til/blob/main/python/convert-to-utc-without-pytz.md) - 2020-04-19\n* [macOS Catalina sort-of includes Python 3](https://github.com/simonw/til/blob/main/python/macos-catalina-sort-of-ships-with-python3.md) - 2020-04-21\n* [Generated a summary of nested JSON data](https://github.com/simonw/til/blob/main/python/generate-nested-json-summary.md) - 2020-04-28\n* [Installing and upgrading Datasette plugins with pipx](https://github.com/simonw/til/blob/main/python/installing-upgrading-plugins-with-pipx.md) - 2020-05-04\n* [Use setup.py to install platform-specific dependencies](https://github.com/simonw/til/blob/main/python/platform-specific-dependencies.md) - 2020-05-05\n* [Build the official Python documentation locally](https://github.com/simonw/til/blob/main/python/build-official-docs.md) - 2020-05-08\n* [Introspecting Python function parameters](https://github.com/simonw/til/blob/main/python/introspect-function-parameters.md) - 2020-05-27\n* [Password hashing in Python with pbkdf2](https://github.com/simonw/til/blob/main/python/password-hashing-with-pbkdf2.md) - 2020-07-13\n* [How to call pip programatically from Python](https://github.com/simonw/til/blob/main/python/call-pip-programatically.md) - 2020-08-11\n* [Outputting JSON with reduced floating point precision](https://github.com/simonw/til/blob/main/python/json-floating-point.md) - 2020-08-21\n* [Debugging a Click application using pdb](https://github.com/simonw/til/blob/main/python/debug-click-with-pdb.md) - 2020-09-03\n* [Understanding option names in Click](https://github.com/simonw/til/blob/main/python/click-option-names.md) - 2020-09-22\n* [Explicit file encodings using click.File](https://github.com/simonw/til/blob/main/python/click-file-encoding.md) - 2020-10-16\n* [Decorators with optional arguments](https://github.com/simonw/til/blob/main/python/decorators-with-optional-arguments.md) - 2020-10-28\n* [Running Python code in a subprocess with a time limit](https://github.com/simonw/til/blob/main/python/subprocess-time-limit.md) - 2020-12-06\n* [Controlling the style of dumped YAML using PyYAML](https://github.com/simonw/til/blob/main/python/style-yaml-dump.md) - 2020-12-07\n* [Relinquishing control in Python asyncio](https://github.com/simonw/til/blob/main/python/yielding-in-asyncio.md) - 2020-12-29\n* [Packaging a Python app as a standalone binary with PyInstaller](https://github.com/simonw/til/blob/main/python/packaging-pyinstaller.md) - 2021-01-04\n* [Handling CSV files with wide columns in Python](https://github.com/simonw/til/blob/main/python/csv-error-column-too-large.md) - 2021-02-15\n* [Using io.BufferedReader to peek against a non-peekable stream](https://github.com/simonw/til/blob/main/python/io-bufferedreader.md) - 2021-02-15\n* [Tracing every executed Python statement](https://github.com/simonw/til/blob/main/python/tracing-every-statement.md) - 2021-03-21\n* [Check spelling using codespell](https://github.com/simonw/til/blob/main/python/codespell.md) - 2021-08-03\n* [Find local variables in the traceback for an exception](https://github.com/simonw/til/blob/main/python/find-local-variables-in-exception-traceback.md) - 2021-08-09\n* [Using Fabric with an SSH public key](https://github.com/simonw/til/blob/main/python/fabric-ssh-key.md) - 2021-10-06\n* [Using the sqlite3 Python module in Pyodide - Python WebAssembly](https://github.com/simonw/til/blob/main/python/sqlite-in-pyodide.md) - 2021-10-18\n* [Planning parallel downloads with TopologicalSorter](https://github.com/simonw/til/blob/main/python/graphlib-topologicalsorter.md) - 2021-11-16\n* [Using cog to update --help in a Markdown README file](https://github.com/simonw/til/blob/main/python/cog-to-update-help-in-readme.md) - 2021-11-18\n* [Ignoring a line in both flake8 and mypy](https://github.com/simonw/til/blob/main/python/ignore-both-flake8-and-mypy.md) - 2021-11-30\n* [__init_subclass__](https://github.com/simonw/til/blob/main/python/init-subclass.md) - 2021-12-03\n* [Using C_INCLUDE_PATH to install Python packages](https://github.com/simonw/til/blob/main/python/using-c-include-path-to-install-python-packages.md) - 2021-12-09\n* [Safely outputting JSON](https://github.com/simonw/til/blob/main/python/safe-output-json.md) - 2021-12-17\n* [Annotated explanation of David Beazley's dataklasses](https://github.com/simonw/til/blob/main/python/annotated-dataklasses.md) - 2021-12-19\n* [Streaming indented output of a JSON array](https://github.com/simonw/til/blob/main/python/output-json-array-streaming.md) - 2022-01-17\n* [Generating a calendar week grid with the Python Calendar module](https://github.com/simonw/til/blob/main/python/calendar-weeks.md) - 2022-03-31\n* [Efficiently copying a file](https://github.com/simonw/til/blob/main/python/copy-file.md) - 2022-05-13\n* [Freezing requirements with pip-tools](https://github.com/simonw/til/blob/main/python/pip-tools.md) - 2022-07-14\n* [struct endianness in Python](https://github.com/simonw/til/blob/main/python/struct-endianness.md) - 2022-07-28\n* [Defining setup.py dependencies using a URL](https://github.com/simonw/til/blob/main/python/setup-py-from-url.md) - 2022-08-13\n* [Running PyPy on macOS using Homebrew](https://github.com/simonw/til/blob/main/python/pypy-macos.md) - 2022-09-14\n* [Using psutil to investigate \"Too many open files\"](https://github.com/simonw/til/blob/main/python/too-many-open-files-psutil.md) - 2022-10-13\n* [Simple load testing with Locust](https://github.com/simonw/til/blob/main/python/locust.md) - 2022-10-22\n* [os.remove() on Windows fails if the file is already open](https://github.com/simonw/til/blob/main/python/os-remove-windows.md) - 2022-10-25\n* [The pdb interact command](https://github.com/simonw/til/blob/main/python/pdb-interact.md) - 2022-10-31\n* [Upgrading a pipx application to an alpha version](https://github.com/simonw/til/blob/main/python/pipx-alpha.md) - 2023-01-11\n* [Installing lxml for Python on an M1/M2 Mac](https://github.com/simonw/til/blob/main/python/lxml-m1-mac.md) - 2023-01-27\n* [Calculating embeddings with gtr-t5-large in Python](https://github.com/simonw/til/blob/main/python/gtr-t5-large.md) - 2023-01-31\n* [A few notes on Rye](https://github.com/simonw/til/blob/main/python/rye.md) - 2023-04-26\n* [The location of the pip cache directory](https://github.com/simonw/til/blob/main/python/pip-cache.md) - 2023-04-28\n* [TOML in Python](https://github.com/simonw/til/blob/main/python/toml.md) - 2023-06-26\n* [CLI tools hidden in the Python standard library](https://github.com/simonw/til/blob/main/python/stdlib-cli-tools.md) - 2023-06-28\n* [Python packages with pyproject.toml and nothing else](https://github.com/simonw/til/blob/main/python/pyproject.md) - 2023-07-07\n* [Quickly testing code in a different Python version using pyenv](https://github.com/simonw/til/blob/main/python/quick-testing-pyenv.md) - 2023-07-10\n* [Using tree-sitter with Python](https://github.com/simonw/til/blob/main/python/tree-sitter.md) - 2023-07-13\n* [Protocols in Python](https://github.com/simonw/til/blob/main/python/protocols.md) - 2023-07-26\n* [Checking if something is callable or async callable in Python](https://github.com/simonw/til/blob/main/python/callable.md) - 2023-08-04\n* [A simple pattern for inlining binary content in a Python script](https://github.com/simonw/til/blob/main/python/inlining-binary-data.md) - 2023-08-19\n* [Using pprint() to print dictionaries while preserving their key order](https://github.com/simonw/til/blob/main/python/pprint-no-sort-dicts.md) - 2024-01-14\n* [Getting Python MD5 to work with FIPS systems](https://github.com/simonw/til/blob/main/python/md5-fips.md) - 2024-02-13\n* [Programmatically comparing Python version strings](https://github.com/simonw/til/blob/main/python/comparing-version-numbers.md) - 2024-03-17\n* [Trying out free-threaded Python on macOS](https://github.com/simonw/til/blob/main/python/trying-free-threaded-python.md) - 2024-07-12\n* [Using uv to develop Python command-line applications](https://github.com/simonw/til/blob/main/python/uv-cli-apps.md) - 2024-10-23\n* [Installing flash-attn without compiling it](https://github.com/simonw/til/blob/main/python/installing-flash-attention.md) - 2024-10-24\n* [Fixes for datetime UTC warnings in Python](https://github.com/simonw/til/blob/main/python/utc-warning-fix.md) - 2024-12-12\n* [Geocoding from Python on macOS using pyobjc-framework-CoreLocation](https://github.com/simonw/til/blob/main/python/pyobjc-framework-corelocation.md) - 2025-01-26\n* [Trying out Python packages with ipython and uvx](https://github.com/simonw/til/blob/main/python/itry.md) - 2025-02-13\n\n## zeit-now\n\n* [Running a Python ASGI app on Vercel](https://github.com/simonw/til/blob/main/zeit-now/python-asgi-on-now-v2.md) - 2020-04-19\n* [Redirecting all paths on a Vercel instance](https://github.com/simonw/til/blob/main/zeit-now/redirecting-all-paths-on-vercel.md) - 2021-03-27\n\n## sqlite\n\n* [Lag window function in SQLite](https://github.com/simonw/til/blob/main/sqlite/lag-window-function.md) - 2020-04-19\n* [Null case comparisons in SQLite](https://github.com/simonw/til/blob/main/sqlite/null-case.md) - 2020-04-21\n* [Compile a new sqlite3 binary on Ubuntu](https://github.com/simonw/til/blob/main/sqlite/compile-sqlite3-ubuntu.md) - 2020-04-30\n* [List all columns in a SQLite database](https://github.com/simonw/til/blob/main/sqlite/list-all-columns-in-a-database.md) - 2020-05-06\n* [Using LD_PRELOAD to run any version of SQLite with Python](https://github.com/simonw/til/blob/main/sqlite/ld-preload.md) - 2020-06-17\n* [SQLite BLOB literals](https://github.com/simonw/til/blob/main/sqlite/blob-literals.md) - 2020-07-29\n* [Enabling WAL mode for SQLite database files](https://github.com/simonw/til/blob/main/sqlite/enabling-wal-mode.md) - 2020-08-09\n* [Compiling the SQLite spellfix.c module on macOS](https://github.com/simonw/til/blob/main/sqlite/compile-spellfix-osx.md) - 2020-09-19\n* [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) - 2020-09-27\n* [Replicating SQLite with rqlite](https://github.com/simonw/til/blob/main/sqlite/replicating-rqlite.md) - 2020-12-28\n* [Identifying column combination patterns in a SQLite table](https://github.com/simonw/til/blob/main/sqlite/column-combinations.md) - 2021-01-12\n* [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) - 2021-01-18\n* [Splitting on commas in SQLite](https://github.com/simonw/til/blob/main/sqlite/splitting-commas-sqlite.md) - 2021-02-01\n* [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) - 2021-03-12\n* [Using pysqlite3 on macOS](https://github.com/simonw/til/blob/main/sqlite/pysqlite3-on-macos.md) - 2021-07-10\n* [Importing CSV data into SQLite with .import](https://github.com/simonw/til/blob/main/sqlite/import-csv.md) - 2021-07-13\n* [SQLite aggregate filter clauses](https://github.com/simonw/til/blob/main/sqlite/sqlite-aggregate-filter-clauses.md) - 2021-08-04\n* [Building a specific version of SQLite with pysqlite on macOS/Linux](https://github.com/simonw/til/blob/main/sqlite/build-specific-sqlite-pysqlite-macos.md) - 2021-08-14\n* [Track timestamped changes to a SQLite table using triggers](https://github.com/simonw/til/blob/main/sqlite/track-timestamped-changes-to-a-table.md) - 2021-08-19\n* [json_extract() path syntax in SQLite](https://github.com/simonw/til/blob/main/sqlite/json-extract-path.md) - 2022-01-18\n* [Ordered group_concat() in SQLite](https://github.com/simonw/til/blob/main/sqlite/ordered-group-concat.md) - 2022-02-06\n* [Combining substr and instr to extract text](https://github.com/simonw/til/blob/main/sqlite/substr-instr.md) - 2022-02-15\n* [The simplest recursive CTE](https://github.com/simonw/til/blob/main/sqlite/simple-recursive-cte.md) - 2022-03-20\n* [Counting SQLite virtual machine operations](https://github.com/simonw/til/blob/main/sqlite/counting-vm-ops.md) - 2022-03-20\n* [One-liner for running queries against CSV files with SQLite](https://github.com/simonw/til/blob/main/sqlite/one-line-csv-operations.md) - 2022-06-20\n* [Related content with SQLite FTS and a Datasette template function](https://github.com/simonw/til/blob/main/sqlite/related-content.md) - 2022-07-31\n* [Trying out SQLite extensions on macOS](https://github.com/simonw/til/blob/main/sqlite/trying-macos-extensions.md) - 2022-08-03\n* [Sort by number of JSON intersections](https://github.com/simonw/til/blob/main/sqlite/sort-by-number-of-json-intersections.md) - 2022-08-17\n* [Seeing which functions are unique to a specific SQLite / Datasette instance](https://github.com/simonw/til/blob/main/sqlite/function-list.md) - 2022-08-23\n* [SQLite VACUUM: database or disk is full](https://github.com/simonw/til/blob/main/sqlite/vacum-disk-full.md) - 2022-08-29\n* [Returning related rows in a single SQL query using JSON](https://github.com/simonw/til/blob/main/sqlite/related-rows-single-query.md) - 2022-09-16\n* [Finding the SQLite version used by Web SQL in Chrome](https://github.com/simonw/til/blob/main/sqlite/sqlite-version-websql-chrome.md) - 2022-10-28\n* [SQLite can use more than one index for a query](https://github.com/simonw/til/blob/main/sqlite/multiple-indexes.md) - 2022-12-11\n* [Comparing database rows before and after with SQLite JSON functions](https://github.com/simonw/til/blob/main/sqlite/compare-before-after-json.md) - 2022-12-14\n* [Geopoly in SQLite](https://github.com/simonw/til/blob/main/sqlite/geopoly.md) - 2023-01-04\n* [Loading SQLite extensions in Python on macOS](https://github.com/simonw/til/blob/main/sqlite/sqlite-extensions-python-macos.md) - 2023-01-07\n* [SQLite pragma_function_list()](https://github.com/simonw/til/blob/main/sqlite/pragma-function-list.md) - 2023-01-27\n* [Combining CTEs and VALUES in SQLite](https://github.com/simonw/til/blob/main/sqlite/cte-values.md) - 2023-01-29\n* [The SQLite now argument is stable within the same query](https://github.com/simonw/til/blob/main/sqlite/now-argument-stability.md) - 2023-02-05\n* [Subqueries in select expressions in SQLite - also window functions](https://github.com/simonw/til/blob/main/sqlite/subqueries-in-select.md) - 2023-02-08\n* [Copy tables between SQLite databases](https://github.com/simonw/til/blob/main/sqlite/copy-tables-between-databases.md) - 2023-04-03\n* [Saving an in-memory SQLite database to a file in Python](https://github.com/simonw/til/blob/main/sqlite/python-sqlite-memory-to-file.md) - 2023-04-08\n* [Unix timestamp in milliseconds in SQLite](https://github.com/simonw/til/blob/main/sqlite/unix-timestamp-milliseconds-sqlite.md) - 2023-04-08\n* [Comparing two training datasets using sqlite-utils](https://github.com/simonw/til/blob/main/sqlite/comparing-datasets.md) - 2023-05-23\n* [A one-liner to output details of the current Python's SQLite](https://github.com/simonw/til/blob/main/sqlite/python-sqlite-environment.md) - 2023-08-19\n* [Calculating the size of a SQLite database file using SQL](https://github.com/simonw/til/blob/main/sqlite/database-file-size.md) - 2023-08-21\n* [Compile and run a new SQLite version with the existing sqlite3 Python library on macOS](https://github.com/simonw/til/blob/main/sqlite/sqlite-version-macos-python.md) - 2023-08-22\n* [Trying out cr-sqlite on macOS](https://github.com/simonw/til/blob/main/sqlite/cr-sqlite-macos.md) - 2023-09-12\n* [Geospatial SQL queries in SQLite using TG, sqlite-tg and datasette-sqlite-tg](https://github.com/simonw/til/blob/main/sqlite/sqlite-tg.md) - 2023-09-25\n* [Running Steampipe extensions in sqlite-utils and Datasette](https://github.com/simonw/til/blob/main/sqlite/steampipe.md) - 2023-12-20\n* [Tracking SQLite table history using a JSON audit log](https://github.com/simonw/til/blob/main/sqlite/json-audit-log.md) - 2024-02-26\n* [SQLite timestamps with floating point seconds](https://github.com/simonw/til/blob/main/sqlite/floating-point-seconds.md) - 2024-03-13\n* [Using sqlite-vec with embeddings in sqlite-utils and Datasette](https://github.com/simonw/til/blob/main/sqlite/sqlite-vec.md) - 2024-08-11\n* [Compiling and running sqlite3-rsync](https://github.com/simonw/til/blob/main/sqlite/compile-sqlite3-rsync.md) - 2024-10-04\n\n## presenting\n\n* [Using macOS stickies to display a workshop link on the screen](https://github.com/simonw/til/blob/main/presenting/stickies-for-workshop-links.md) - 2020-04-20\n\n## macos\n\n* [Running pip install -e .[test] in zsh on macOS Catalina](https://github.com/simonw/til/blob/main/macos/zsh-pip-install.md) - 2020-04-21\n* [Get Skitch working on Catalina](https://github.com/simonw/til/blob/main/macos/skitch-catalina.md) - 2020-04-21\n* [Close terminal window on Ctrl+D for macOS](https://github.com/simonw/til/blob/main/macos/close-terminal-on-ctrl-d.md) - 2020-04-21\n* [Fixing \"compinit: insecure directories\" error](https://github.com/simonw/til/blob/main/macos/fixing-compinit-insecure-directories.md) - 2020-04-26\n* [Finding the largest SQLite files on a Mac](https://github.com/simonw/til/blob/main/macos/find-largest-sqlite.md) - 2020-08-19\n* [Shrinking PNG files with pngquant and oxipng](https://github.com/simonw/til/blob/main/macos/shrinking-pngs-with-pngquant-and-oxipng.md) - 2021-02-07\n* [Running Docker on an M1 Mac](https://github.com/simonw/til/blob/main/macos/running-docker-on-remote-m1.md) - 2021-05-25\n* [Using lsof on macOS](https://github.com/simonw/til/blob/main/macos/lsof-macos.md) - 2021-12-11\n* [Installing Python on macOS with the official Python installer](https://github.com/simonw/til/blob/main/macos/python-installer-macos.md) - 2022-02-28\n* [Trick Apple Photos into letting you access your video files](https://github.com/simonw/til/blob/main/macos/apple-photos-large-files.md) - 2022-04-12\n* [Seeing files opened by a process using opensnoop](https://github.com/simonw/til/blob/main/macos/open-files-with-opensnoop.md) - 2022-04-26\n* [Atuin for zsh shell history in SQLite](https://github.com/simonw/til/blob/main/macos/atuin.md) - 2022-04-26\n* [Driving an external display from a Mac laptop](https://github.com/simonw/til/blob/main/macos/external-display-laptop.md) - 2022-09-10\n* [Browse files (including SQLite databases) on your iPhone with ifuse](https://github.com/simonw/til/blob/main/macos/ifuse-iphone.md) - 2022-09-13\n* [sips: Scriptable image processing system](https://github.com/simonw/til/blob/main/macos/sips.md) - 2023-02-18\n* [Using fs_usage to see what files a process is using](https://github.com/simonw/til/blob/main/macos/fs-usage.md) - 2023-06-15\n* [Syncing slide images and audio in iMovie](https://github.com/simonw/til/blob/main/macos/imovie-slides-and-audio.md) - 2023-06-15\n* [Local wildcard DNS on macOS with dnsmasq](https://github.com/simonw/til/blob/main/macos/wildcard-dns-dnsmasq.md) - 2023-06-30\n* [Downloading partial YouTube videos with ffmpeg](https://github.com/simonw/til/blob/main/macos/downloading-partial-youtube-videos.md) - 2023-08-26\n* [Grabbing a transcript of a short snippet of a YouTube video with MacWhisper](https://github.com/simonw/til/blob/main/macos/quick-whisper-youtube.md) - 2023-11-30\n* [Editing an iPhone home screen using macOS](https://github.com/simonw/til/blob/main/macos/edit-ios-home-screen.md) - 2023-12-11\n* [impaste: pasting images to piped commands on macOS](https://github.com/simonw/til/blob/main/macos/impaste.md) - 2024-04-04\n* [A script to capture frames from a QuickTime video](https://github.com/simonw/til/blob/main/macos/quicktime-capture-script.md) - 2024-04-16\n* [Transcribing MP3s with whisper-cpp on macOS](https://github.com/simonw/til/blob/main/macos/whisper-cpp.md) - 2024-04-26\n* [Accessing 1Password items from the terminal](https://github.com/simonw/til/blob/main/macos/1password-terminal.md) - 2024-07-09\n\n## cloudrun\n\n* [Use labels on Cloud Run services for a billing breakdown](https://github.com/simonw/til/blob/main/cloudrun/use-labels-for-billing-breakdown.md) - 2020-04-21\n* [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) - 2020-08-04\n* [Using the gcloud run services list command](https://github.com/simonw/til/blob/main/cloudrun/gcloud-run-services-list.md) - 2020-09-01\n* [Listing files uploaded to Cloud Build](https://github.com/simonw/til/blob/main/cloudrun/listing-cloudbuild-files.md) - 2021-04-14\n* [Switching between gcloud accounts](https://github.com/simonw/til/blob/main/cloudrun/multiple-gcloud-accounts.md) - 2021-05-18\n* [Increasing the time limit for a Google Cloud Scheduler task](https://github.com/simonw/til/blob/main/cloudrun/increase-cloud-scheduler-time-limit.md) - 2021-07-08\n* [Tailing Google Cloud Run request logs and importing them into SQLite](https://github.com/simonw/til/blob/main/cloudrun/tailing-cloud-run-request-logs.md) - 2021-08-09\n* [Using build-arg variables with Cloud Run deployments](https://github.com/simonw/til/blob/main/cloudrun/using-build-args-with-cloud-run.md) - 2021-11-19\n\n## tailscale\n\n* [Restricting SSH connections to devices within a Tailscale network](https://github.com/simonw/til/blob/main/tailscale/lock-down-sshd.md) - 2020-04-23\n* [Using a Tailscale exit node with GitHub Actions](https://github.com/simonw/til/blob/main/tailscale/tailscale-github-actions.md) - 2025-02-22\n\n## pytest\n\n* [Session-scoped temporary directories in pytest](https://github.com/simonw/til/blob/main/pytest/session-scoped-tmp.md) - 2020-04-26\n* [How to mock httpx using pytest-mock](https://github.com/simonw/til/blob/main/pytest/mock-httpx.md) - 2020-04-29\n* [Asserting a dictionary is a subset of another dictionary](https://github.com/simonw/til/blob/main/pytest/assert-dictionary-subset.md) - 2020-05-28\n* [Registering temporary pluggy plugins inside tests](https://github.com/simonw/til/blob/main/pytest/registering-plugins-in-tests.md) - 2020-07-21\n* [Code coverage using pytest and codecov.io](https://github.com/simonw/til/blob/main/pytest/pytest-code-coverage.md) - 2020-08-15\n* [Start a server in a subprocess during a pytest session](https://github.com/simonw/til/blob/main/pytest/subprocess-server.md) - 2020-08-31\n* [Using VCR and pytest with pytest-recording](https://github.com/simonw/til/blob/main/pytest/pytest-recording-vcr.md) - 2021-11-02\n* [Quick and dirty mock testing with mock_calls](https://github.com/simonw/til/blob/main/pytest/pytest-mock-calls.md) - 2021-11-02\n* [Writing pytest tests against tools written with argparse](https://github.com/simonw/til/blob/main/pytest/pytest-argparse.md) - 2022-01-08\n* [Testing a Click app with streaming input](https://github.com/simonw/til/blob/main/pytest/test-click-app-with-streaming-input.md) - 2022-01-09\n* [Opt-in integration tests with pytest --integration](https://github.com/simonw/til/blob/main/pytest/only-run-integration.md) - 2022-01-26\n* [pytest coverage with context](https://github.com/simonw/til/blob/main/pytest/coverage-with-context.md) - 2022-03-04\n* [Async fixtures with pytest-asyncio](https://github.com/simonw/til/blob/main/pytest/async-fixtures.md) - 2022-03-19\n* [Treating warnings as errors in pytest](https://github.com/simonw/til/blob/main/pytest/treat-warnings-as-errors.md) - 2022-04-01\n* [Using pytest and Playwright to test a JavaScript web application](https://github.com/simonw/til/blob/main/pytest/playwright-pytest.md) - 2022-07-24\n* [Mocking a Textract LimitExceededException with boto](https://github.com/simonw/til/blob/main/pytest/mocking-boto.md) - 2022-08-07\n* [Show files opened by pytest tests](https://github.com/simonw/til/blob/main/pytest/show-files-opened-by-tests.md) - 2022-12-11\n* [Mocking subprocess with pytest-subprocess](https://github.com/simonw/til/blob/main/pytest/pytest-subprocess.md) - 2023-03-08\n* [Snapshot testing with Syrupy](https://github.com/simonw/til/blob/main/pytest/syrupy.md) - 2023-09-26\n* [Mocking Stripe signature checks in a pytest fixture](https://github.com/simonw/til/blob/main/pytest/pytest-stripe-signature.md) - 2024-07-01\n* [Using namedtuple for pytest parameterized tests](https://github.com/simonw/til/blob/main/pytest/namedtuple-parameterized-tests.md) - 2024-08-31\n* [Running pytest against a specific Python version with uv run](https://github.com/simonw/til/blob/main/pytest/pytest-uv.md) - 2025-02-04\n\n## github\n\n* [Accessing repository dependencies in the GitHub GraphQL API](https://github.com/simonw/til/blob/main/github/dependencies-graphql-api.md) - 2020-04-30\n* [Paginating through the GitHub GraphQL API with Python](https://github.com/simonw/til/blob/main/github/graphql-pagination-python.md) - 2020-07-09\n* [Searching for repositories by topic using the GitHub GraphQL API](https://github.com/simonw/til/blob/main/github/graphql-search-topics.md) - 2020-10-09\n* [Bulk fetching repository details with the GitHub GraphQL API](https://github.com/simonw/til/blob/main/github/bulk-repo-github-graphql.md) - 2021-01-17\n* [Syntax highlighting Python console examples with GFM](https://github.com/simonw/til/blob/main/github/syntax-highlighting-python-console.md) - 2021-01-18\n* [Transferring a GitHub issue from a private to a public repository](https://github.com/simonw/til/blob/main/github/transfer-issue-private-to-public.md) - 2021-12-22\n* [Configuring Dependabot for a Python project](https://github.com/simonw/til/blob/main/github/dependabot-python-setup.md) - 2022-01-14\n* [Setting up a custom subdomain for a GitHub Pages site](https://github.com/simonw/til/blob/main/github/custom-subdomain-github-pages.md) - 2022-05-04\n* [Reporting bugs in GitHub to GitHub](https://github.com/simonw/til/blob/main/github/reporting-bugs.md) - 2022-07-07\n* [Migrating a GitHub wiki from one repository to another](https://github.com/simonw/til/blob/main/github/migrate-github-wiki.md) - 2022-07-28\n* [Clone, edit and push files that live in a Gist](https://github.com/simonw/til/blob/main/github/clone-and-push-gist.md) - 2022-09-08\n* [GitHub Pages: The Missing Manual](https://github.com/simonw/til/blob/main/github/github-pages.md) - 2022-10-31\n* [Finding uses of an API with the new GitHub Code Search](https://github.com/simonw/til/blob/main/github/github-code-search-api-uses.md) - 2022-12-08\n* [Bulk editing status in GitHub Projects](https://github.com/simonw/til/blob/main/github/bulk-edit-github-projects.md) - 2023-06-29\n* [Running a Django and PostgreSQL development environment in GitHub Codespaces](https://github.com/simonw/til/blob/main/github/django-postgresql-codespaces.md) - 2023-08-10\n* [Assistance with release notes using GitHub Issues](https://github.com/simonw/til/blob/main/github/release-note-assistance.md) - 2024-08-05\n\n## node\n\n* [Constant-time comparison of strings in Node](https://github.com/simonw/til/blob/main/node/constant-time-compare-strings.md) - 2020-05-01\n\n## firefox\n\n* [Search across all loaded resources in Firefox](https://github.com/simonw/til/blob/main/firefox/search-across-all-resources.md) - 2020-05-05\n\n## markdown\n\n* [Converting HTML and rich-text to Markdown](https://github.com/simonw/til/blob/main/markdown/converting-to-markdown.md) - 2020-05-09\n* [Rendering Markdown with the GitHub Markdown API](https://github.com/simonw/til/blob/main/markdown/github-markdown-api.md) - 2020-08-22\n* [Useful Markdown extensions in Python](https://github.com/simonw/til/blob/main/markdown/markdown-extensions-python.md) - 2021-04-03\n\n## pypi\n\n* [Adding project links to PyPI](https://github.com/simonw/til/blob/main/pypi/project-links.md) - 2020-05-11\n* [Publish releases to PyPI from GitHub Actions without a password or token](https://github.com/simonw/til/blob/main/pypi/pypi-releases-from-github.md) - 2024-01-14\n\n## asgi\n\n* [Writing tests for the ASGI lifespan protocol with HTTPX](https://github.com/simonw/til/blob/main/asgi/lifespan-test-httpx.md) - 2020-06-29\n\n## heroku\n\n* [Using heroku pg:pull to restore a backup to a macOS laptop](https://github.com/simonw/til/blob/main/heroku/pg-pull.md) - 2020-07-10\n* [Upgrading a Heroku PostgreSQL database with pg:copy](https://github.com/simonw/til/blob/main/heroku/pg-upgrade.md) - 2020-07-20\n* [Programatically accessing Heroku PostgreSQL from GitHub Actions](https://github.com/simonw/til/blob/main/heroku/programatic-access-postgresql.md) - 2020-08-18\n\n## javascript\n\n* [Implementing a \"copy to clipboard\" button](https://github.com/simonw/til/blob/main/javascript/copy-button.md) - 2020-07-23\n* [Working around the size limit for nodeValue in the DOM](https://github.com/simonw/til/blob/main/javascript/working-around-nodevalue-size-limit.md) - 2020-08-21\n* [Dynamically loading multiple assets with a callback](https://github.com/simonw/til/blob/main/javascript/dynamically-loading-assets.md) - 2020-08-21\n* [Minifying JavaScript with npx uglify-js](https://github.com/simonw/til/blob/main/javascript/minifying-uglify-npx.md) - 2020-08-30\n* [Manipulating query strings with URLSearchParams](https://github.com/simonw/til/blob/main/javascript/manipulating-query-params.md) - 2020-10-04\n* [Writing JavaScript that responds to media queries](https://github.com/simonw/til/blob/main/javascript/javascript-that-responds-to-media-queries.md) - 2020-10-21\n* [Dropdown menu with details summary](https://github.com/simonw/til/blob/main/javascript/dropdown-menu-with-details-summary.md) - 2020-10-31\n* [Using Jest without a package.json](https://github.com/simonw/til/blob/main/javascript/jest-without-package-json.md) - 2020-12-30\n* [Scroll page to form if there are errors](https://github.com/simonw/til/blob/main/javascript/scroll-to-form-if-errors.md) - 2021-05-08\n* [Preventing double form submissions with JavaScript](https://github.com/simonw/til/blob/main/javascript/preventing-double-form-submission.md) - 2021-07-08\n* [Loading lit from Skypack](https://github.com/simonw/til/blob/main/javascript/lit-with-skypack.md) - 2021-09-21\n* [Using Tesseract.js to OCR every image on a page](https://github.com/simonw/til/blob/main/javascript/tesseract-ocr-javascript.md) - 2021-11-09\n* [JavaScript date objects](https://github.com/simonw/til/blob/main/javascript/javascript-date-objects.md) - 2022-01-16\n* [Creating a tiled zoomable image with OpenSeadragon and vips](https://github.com/simonw/til/blob/main/javascript/openseadragon.md) - 2022-08-12\n* [Copy rich text to the clipboard](https://github.com/simonw/til/blob/main/javascript/copy-rich-text-to-clipboard.md) - 2023-03-10\n* [Using packages from JSR with esbuild](https://github.com/simonw/til/blob/main/javascript/jsr-esbuild.md) - 2024-03-02\n\n## django\n\n* [PostgreSQL full-text search in the Django Admin](https://github.com/simonw/til/blob/main/django/postgresql-full-text-search-admin.md) - 2020-07-25\n* [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) - 2021-02-25\n* [Writing tests for the Django admin with pytest-django](https://github.com/simonw/til/blob/main/django/testing-django-admin-with-pytest.md) - 2021-03-02\n* [Show the timezone for datetimes in the Django admin](https://github.com/simonw/til/blob/main/django/show-timezone-in-django-admin.md) - 2021-03-02\n* [Pretty-printing all read-only JSON in the Django admin](https://github.com/simonw/til/blob/main/django/pretty-print-json-admin.md) - 2021-03-07\n* [How to almost get facet counts in the Django admin](https://github.com/simonw/til/blob/main/django/almost-facet-counts-django-admin.md) - 2021-03-11\n* [Efficient bulk deletions in Django](https://github.com/simonw/til/blob/main/django/efficient-bulk-deletions-in-django.md) - 2021-04-09\n* [Enabling the fuzzystrmatch extension in PostgreSQL with a Django migration](https://github.com/simonw/til/blob/main/django/migration-postgresql-fuzzystrmatch.md) - 2021-04-18\n* [Usable horizontal scrollbars in the Django admin for mouse users](https://github.com/simonw/til/blob/main/django/django-admin-horizontal-scroll.md) - 2021-04-20\n* [Filter by comma-separated values in the Django admin](https://github.com/simonw/til/blob/main/django/filter-by-comma-separated-values.md) - 2021-04-21\n* [Django Admin action for exporting selected rows as CSV](https://github.com/simonw/til/blob/main/django/export-csv-from-django-admin.md) - 2021-04-25\n* [migrations.RunSQL.noop for reversible SQL migrations](https://github.com/simonw/til/blob/main/django/migrations-runsql-noop.md) - 2021-05-02\n* [Enabling a gin index for faster LIKE queries](https://github.com/simonw/til/blob/main/django/enabling-gin-index.md) - 2021-05-16\n* [Django data migration using a PostgreSQL CTE](https://github.com/simonw/til/blob/main/django/migration-using-cte.md) - 2021-05-17\n* [Using just with Django](https://github.com/simonw/til/blob/main/django/just-with-django.md) - 2022-06-06\n* [Adding a Datasette ASGI app to Django](https://github.com/simonw/til/blob/main/django/datasette-django.md) - 2022-10-20\n* [Building a blog in Django](https://github.com/simonw/til/blob/main/django/building-a-blog-in-django.md) - 2023-08-15\n* [Using pytest-django with a reusable Django application](https://github.com/simonw/til/blob/main/django/pytest-django.md) - 2024-08-07\n* [Building an automatically updating live blog in Django](https://github.com/simonw/til/blob/main/django/live-blog.md) - 2024-10-02\n\n## docker\n\n* [Attaching a bash shell to a running Docker container](https://github.com/simonw/til/blob/main/docker/attach-bash-to-running-container.md) - 2020-08-10\n* [Running gdb against a Python process in a running Docker container](https://github.com/simonw/til/blob/main/docker/gdb-python-docker.md) - 2021-03-21\n* [Installing packages from Debian unstable in a Docker image based on stable](https://github.com/simonw/til/blob/main/docker/debian-unstable-packages.md) - 2021-03-22\n* [Docker Compose for Django development](https://github.com/simonw/til/blob/main/docker/docker-compose-for-django-development.md) - 2021-05-24\n* [Allowing a container in Docker Desktop for Mac to talk to a PostgreSQL server on the host machine](https://github.com/simonw/til/blob/main/docker/docker-for-mac-container-to-postgresql-on-host.md) - 2022-03-31\n* [Testing things in Fedora using Docker](https://github.com/simonw/til/blob/main/docker/test-fedora-in-docker.md) - 2022-07-27\n* [Emulating a big-endian s390x with QEMU](https://github.com/simonw/til/blob/main/docker/emulate-s390x-with-qemu.md) - 2022-07-29\n* [Run pytest against a specific Python version using Docker](https://github.com/simonw/til/blob/main/docker/pytest-docker.md) - 2022-09-05\n* [Using pipenv and Docker](https://github.com/simonw/til/blob/main/docker/pipenv-and-docker.md) - 2022-11-28\n\n## homebrew\n\n* [Packaging a Python CLI tool for Homebrew](https://github.com/simonw/til/blob/main/homebrew/packaging-python-cli-for-homebrew.md) - 2020-08-11\n* [Browsing your local git checkout of homebrew-core](https://github.com/simonw/til/blob/main/homebrew/homebrew-core-local-git-checkout.md) - 2020-08-27\n* [Upgrading Python Homebrew packages using pip](https://github.com/simonw/til/blob/main/homebrew/upgrading-python-homebrew-packages.md) - 2020-10-14\n* [Running a MySQL server using Homebrew](https://github.com/simonw/til/blob/main/homebrew/mysql-homebrew.md) - 2021-06-11\n* [Running the latest SQLite in Datasette using Homebrew](https://github.com/simonw/til/blob/main/homebrew/latest-sqlite.md) - 2022-02-28\n* [Automatically maintaining Homebrew formulas using GitHub Actions](https://github.com/simonw/til/blob/main/homebrew/auto-formulas-github-actions.md) - 2023-06-21\n* [Upgrading Homebrew and avoiding the failed to verify attestation error](https://github.com/simonw/til/blob/main/homebrew/no-verify-attestations.md) - 2024-10-09\n\n## zsh\n\n* [Customizing my zsh prompt](https://github.com/simonw/til/blob/main/zsh/custom-zsh-prompt.md) - 2020-08-12\n* [Passing command arguments using heredoc syntax](https://github.com/simonw/til/blob/main/zsh/argument-heredoc.md) - 2022-07-07\n\n## readthedocs\n\n* [Pointing a custom subdomain at Read the Docs](https://github.com/simonw/til/blob/main/readthedocs/custom-subdomain.md) - 2020-08-14\n* [Read the Docs Search API](https://github.com/simonw/til/blob/main/readthedocs/readthedocs-search-api.md) - 2020-08-16\n* [Using custom Sphinx templates on Read the Docs](https://github.com/simonw/til/blob/main/readthedocs/custom-sphinx-templates.md) - 2020-12-07\n* [Promoting the stable version of the documentation using rel=canonical](https://github.com/simonw/til/blob/main/readthedocs/documentation-seo-canonical.md) - 2022-01-20\n* [Linking from /latest/ to /stable/ on Read The Docs](https://github.com/simonw/til/blob/main/readthedocs/link-from-latest-to-stable.md) - 2022-01-20\n* [Updating stable docs in ReadTheDocs without pushing a release](https://github.com/simonw/til/blob/main/readthedocs/stable-docs.md) - 2023-08-20\n* [Running pip install '.[docs]' on ReadTheDocs](https://github.com/simonw/til/blob/main/readthedocs/pip-install-docs.md) - 2023-11-24\n\n## ics\n\n* [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) - 2020-08-21\n\n## svg\n\n* [Creating a dynamic line chart with SVG](https://github.com/simonw/til/blob/main/svg/dynamic-line-chart.md) - 2020-08-22\n\n## linux\n\n* [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) - 2020-08-24\n* [Basic strace to see what a process is doing](https://github.com/simonw/til/blob/main/linux/basic-strace.md) - 2020-09-07\n* [Enabling a user to execute a specific command as root without a password](https://github.com/simonw/til/blob/main/linux/allow-sudo-without-password-specific-command.md) - 2022-02-13\n* [Using iconv to convert the text encoding of a file](https://github.com/simonw/til/blob/main/linux/iconv.md) - 2022-06-14\n\n## jq\n\n* [Converting Airtable JSON for use with sqlite-utils using jq](https://github.com/simonw/til/blob/main/jq/reformatting-airtable-json.md) - 2020-08-28\n* [Loading radio.garden into SQLite using jq](https://github.com/simonw/til/blob/main/jq/radio-garden-jq.md) - 2021-02-17\n* [Flattening nested JSON objects with jq](https://github.com/simonw/til/blob/main/jq/flatten-nested-json-objects-jq.md) - 2021-03-11\n* [Converting no-decimal-point latitudes and longitudes using jq](https://github.com/simonw/til/blob/main/jq/convert-no-decimal-point-latitude-jq.md) - 2021-03-11\n* [Turning an array of arrays into objects with jq](https://github.com/simonw/til/blob/main/jq/array-of-array-to-objects.md) - 2021-05-25\n* [Extracting objects recursively with jq](https://github.com/simonw/til/blob/main/jq/extracting-objects-recursively.md) - 2021-07-24\n* [Convert git log output to JSON using jq](https://github.com/simonw/til/blob/main/jq/git-log-json.md) - 2023-03-25\n* [Combined release notes from GitHub with jq and paginate-json](https://github.com/simonw/til/blob/main/jq/combined-github-release-notes.md) - 2023-08-12\n\n## bash\n\n* [Looping over comma-separated values in Bash](https://github.com/simonw/til/blob/main/bash/loop-over-csv.md) - 2020-09-01\n* [Escaping strings in Bash using !:q](https://github.com/simonw/til/blob/main/bash/escaping-a-string.md) - 2020-10-01\n* [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) - 2020-12-08\n* [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) - 2020-12-11\n* [Finding CSV files that start with a BOM using ripgrep](https://github.com/simonw/til/blob/main/bash/finding-bom-csv-files-with-ripgrep.md) - 2021-05-28\n* [nullglob in bash](https://github.com/simonw/til/blob/main/bash/nullglob-in-bash.md) - 2022-02-14\n* [Using awk to add a prefix](https://github.com/simonw/til/blob/main/bash/use-awk-to-add-a-prefix.md) - 2022-04-08\n* [Ignoring errors in a section of a Bash script](https://github.com/simonw/til/blob/main/bash/ignore-errors.md) - 2022-06-27\n* [Start, test, then stop a localhost web server in a Bash script](https://github.com/simonw/til/blob/main/bash/start-test-then-stop-server.md) - 2022-12-17\n* [Running multiple servers in a single Bash script](https://github.com/simonw/til/blob/main/bash/multiple-servers.md) - 2023-08-16\n* [A shell script for running Go one-liners](https://github.com/simonw/til/blob/main/bash/go-script.md) - 2023-08-20\n\n## typescript\n\n* [Very basic tsc usage](https://github.com/simonw/til/blob/main/typescript/basic-tsc.md) - 2020-09-06\n\n## aws\n\n* [Display EC2 instance costs per month](https://github.com/simonw/til/blob/main/aws/instance-costs-per-month.md) - 2020-09-06\n* [Recovering data from AWS Lightsail using EC2](https://github.com/simonw/til/blob/main/aws/recovering-lightsail-data.md) - 2021-01-16\n* [Adding a CORS policy to an S3 bucket](https://github.com/simonw/til/blob/main/aws/s3-cors.md) - 2022-01-04\n* [Helper function for pagination using AWS boto3](https://github.com/simonw/til/blob/main/aws/helper-for-boto-aws-pagination.md) - 2022-01-19\n* [Running OCR against a PDF file with AWS Textract](https://github.com/simonw/til/blob/main/aws/ocr-pdf-textract.md) - 2022-06-28\n* [Using boto3 from the command line](https://github.com/simonw/til/blob/main/aws/boto-command-line.md) - 2022-08-02\n* [Athena error: The specified key does not exist](https://github.com/simonw/til/blob/main/aws/athena-key-does-not-exist.md) - 2022-09-27\n* [Querying newline-delimited JSON logs using AWS Athena](https://github.com/simonw/til/blob/main/aws/athena-newline-json.md) - 2022-10-06\n* [Using S3 triggers to maintain a list of files in DynamoDB](https://github.com/simonw/til/blob/main/aws/s3-triggers-dynamodb.md) - 2025-02-19\n\n## jinja\n\n* [Turning on Jinja autoescaping when using Template() directly](https://github.com/simonw/til/blob/main/jinja/autoescape-template.md) - 2020-09-18\n* [Formatting thousands in Jinja](https://github.com/simonw/til/blob/main/jinja/format-thousands.md) - 2022-06-08\n* [Custom Jinja template tags with attributes](https://github.com/simonw/til/blob/main/jinja/custom-jinja-tags-with-attributes.md) - 2023-07-01\n\n## selenium\n\n* [Installing Selenium for Python on macOS with ChromeDriver](https://github.com/simonw/til/blob/main/selenium/selenium-python-macos.md) - 2020-10-02\n* [Using async/await in JavaScript in Selenium](https://github.com/simonw/til/blob/main/selenium/async-javascript-in-selenium.md) - 2020-10-02\n\n## digitalocean\n\n* [Running Datasette on DigitalOcean App Platform](https://github.com/simonw/til/blob/main/digitalocean/datasette-on-digitalocean-app-platform.md) - 2020-10-06\n\n## datasette\n\n* [Redirects for Datasette](https://github.com/simonw/til/blob/main/datasette/redirects-for-datasette.md) - 2020-11-25\n* [Serving MBTiles with datasette-media](https://github.com/simonw/til/blob/main/datasette/serving-mbtiles.md) - 2021-02-03\n* [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) - 2021-03-12\n* [Running Datasette on Replit](https://github.com/simonw/til/blob/main/datasette/datasette-on-replit.md) - 2021-05-02\n* [Searching all columns of a table in Datasette](https://github.com/simonw/til/blob/main/datasette/search-all-columns-trick.md) - 2021-08-23\n* [Reusing an existing Click tool with register_commands](https://github.com/simonw/til/blob/main/datasette/reuse-click-for-register-commands.md) - 2021-11-29\n* [Crawling Datasette with Datasette](https://github.com/simonw/til/blob/main/datasette/crawling-datasette-with-datasette.md) - 2022-02-27\n* [Registering new Datasette plugin hooks by defining them in other plugins](https://github.com/simonw/til/blob/main/datasette/register-new-plugin-hooks.md) - 2022-06-17\n* [Writing a Datasette CLI plugin that mostly duplicates an existing command](https://github.com/simonw/til/blob/main/datasette/plugin-modifies-command.md) - 2022-10-22\n* [Writing a CLI utility that is also a Datasette plugin](https://github.com/simonw/til/blob/main/datasette/cli-tool-that-is-also-a-plugin.md) - 2022-11-21\n* [Scraping Reddit and writing data to the Datasette write API](https://github.com/simonw/til/blob/main/datasette/reddit-datasette-write.md) - 2023-03-13\n* [Interactive row selection prototype with Datasette](https://github.com/simonw/til/blob/main/datasette/row-selection-prototype.md) - 2023-03-30\n* [Exploring Baseline with Datasette Lite](https://github.com/simonw/til/blob/main/datasette/baseline.md) - 2023-05-12\n* [Syntax highlighted code examples in Datasette](https://github.com/simonw/til/blob/main/datasette/syntax-highlighted-code-examples.md) - 2023-07-01\n* [Using pytest-httpx to run intercepted requests through an in-memory Datasette instance](https://github.com/simonw/til/blob/main/datasette/pytest-httpx-datasette.md) - 2023-07-24\n* [Remember to commit when using datasette.execute_write_fn()](https://github.com/simonw/til/blob/main/datasette/remember-to-commit.md) - 2023-08-31\n* [Running Datasette on Hugging Face Spaces](https://github.com/simonw/til/blob/main/datasette/hugging-face-spaces.md) - 2023-09-08\n* [Writing Playwright tests for a Datasette Plugin](https://github.com/simonw/til/blob/main/datasette/playwright-tests-datasette-plugin.md) - 2024-01-08\n\n## jupyter\n\n* [Embedding JavaScript in a Jupyter notebook](https://github.com/simonw/til/blob/main/jupyter/javascript-in-a-jupyter-notebook.md) - 2021-01-22\n* [Running jupyterlab via uv tool install](https://github.com/simonw/til/blob/main/jupyter/jupyterlab-uv-tool-install.md) - 2025-03-08\n\n## cookiecutter\n\n* [Testing cookiecutter templates with pytest](https://github.com/simonw/til/blob/main/cookiecutter/pytest-for-cookiecutter.md) - 2021-01-27\n* [Conditionally creating directories in cookiecutter](https://github.com/simonw/til/blob/main/cookiecutter/conditionally-creating-directories.md) - 2021-01-27\n\n## gis\n\n* [Downloading MapZen elevation tiles](https://github.com/simonw/til/blob/main/gis/mapzen-elevation-tiles.md) - 2021-02-04\n* [Natural Earth in SpatiaLite and Datasette](https://github.com/simonw/til/blob/main/gis/natural-earth-in-spatialite-and-datasette.md) - 2022-03-04\n* [Using SQL with GDAL](https://github.com/simonw/til/blob/main/gis/gdal-sql.md) - 2023-03-09\n* [Serving a custom vector web map using PMTiles and maplibre-gl](https://github.com/simonw/til/blob/main/gis/pmtiles.md) - 2023-10-23\n\n## sphinx\n\n* [Using sphinx.ext.extlinks for issue links](https://github.com/simonw/til/blob/main/sphinx/sphinx-ext-extlinks.md) - 2021-02-17\n* [Adding Sphinx autodoc to a project, and configuring Read The Docs to build it](https://github.com/simonw/til/blob/main/sphinx/sphinx-autodoc.md) - 2021-08-10\n* [Format code examples in documentation with blacken-docs](https://github.com/simonw/til/blob/main/sphinx/blacken-docs.md) - 2022-04-24\n* [literalinclude with markers for showing code in documentation](https://github.com/simonw/til/blob/main/sphinx/literalinclude-with-markers.md) - 2024-01-10\n\n## postgresql\n\n* [Show the SQL schema for a PostgreSQL database](https://github.com/simonw/til/blob/main/postgresql/show-schema.md) - 2021-02-23\n* [Granting a PostgreSQL user read-only access to some tables](https://github.com/simonw/til/blob/main/postgresql/read-only-postgresql-user.md) - 2021-02-26\n* [Closest locations to a point](https://github.com/simonw/til/blob/main/postgresql/closest-locations-to-a-point.md) - 2021-03-22\n* [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) - 2021-04-10\n* [Using json_extract_path in PostgreSQL](https://github.com/simonw/til/blob/main/postgresql/json-extract-path.md) - 2021-04-13\n* [Constructing GeoJSON in PostgreSQL](https://github.com/simonw/til/blob/main/postgresql/constructing-geojson-in-postgresql.md) - 2021-04-24\n* [Upgrade Postgres.app on macOS](https://github.com/simonw/til/blob/main/postgresql/upgrade-postgres-app.md) - 2024-06-15\n\n## mediawiki\n\n* [How to run MediaWiki with SQLite on a macOS laptop](https://github.com/simonw/til/blob/main/mediawiki/mediawiki-sqlite-macos.md) - 2021-03-06\n\n## azure\n\n* [Writing an Azure Function that serves all traffic to a subdomain](https://github.com/simonw/til/blob/main/azure/all-traffic-to-subdomain.md) - 2021-03-27\n\n## vscode\n\n* [Language-specific indentation settings in VS Code](https://github.com/simonw/til/blob/main/vscode/language-specific-indentation-settings.md) - 2021-04-04\n* [Search and replace with regular expressions in VS Code](https://github.com/simonw/til/blob/main/vscode/vs-code-regular-expressions.md) - 2021-08-02\n\n## wikipedia\n\n* [The Wikipedia page stats API](https://github.com/simonw/til/blob/main/wikipedia/page-stats-api.md) - 2021-05-13\n\n## vega\n\n* [Vega-Lite bar charts in the same order as the data](https://github.com/simonw/til/blob/main/vega/bar-chart-ordering.md) - 2021-05-15\n\n## spatialite\n\n* [KNN queries with SpatiaLite](https://github.com/simonw/til/blob/main/spatialite/knn.md) - 2021-05-16\n* [Creating a minimal SpatiaLite database with Python](https://github.com/simonw/til/blob/main/spatialite/minimal-spatialite-database-in-python.md) - 2021-12-17\n* [GUnion to combine geometries in SpatiaLite](https://github.com/simonw/til/blob/main/spatialite/gunion-to-combine-geometries.md) - 2022-04-12\n* [Viewing GeoPackage data with SpatiaLite and Datasette](https://github.com/simonw/til/blob/main/spatialite/viewing-geopackage-data-with-spatialite-and-datasette.md) - 2022-12-11\n\n## sql\n\n* [Finding duplicate records by matching name and nearby distance](https://github.com/simonw/til/blob/main/sql/finding-dupes-by-name-and-distance.md) - 2021-05-19\n* [Building a Markdown summary of Django group permissions](https://github.com/simonw/til/blob/main/sql/django-group-permissions-markdown.md) - 2021-06-03\n* [Cumulative total over time in SQL](https://github.com/simonw/til/blob/main/sql/cumulative-total-over-time.md) - 2021-09-13\n* [Using recursive CTEs to explore hierarchical Twitter threads](https://github.com/simonw/til/blob/main/sql/recursive-cte-twitter-threads.md) - 2023-01-30\n* [Consecutive groups in SQL using window functions](https://github.com/simonw/til/blob/main/sql/consecutive-groups.md) - 2023-06-08\n\n## amplitude\n\n* [Exporting Amplitude events to SQLite](https://github.com/simonw/til/blob/main/amplitude/export-events-to-datasette.md) - 2021-06-06\n\n## vim\n\n* [Mouse support in vim](https://github.com/simonw/til/blob/main/vim/mouse-support-in-vim.md) - 2021-06-19\n\n## reddit\n\n* [Scraping Reddit via their JSON API](https://github.com/simonw/til/blob/main/reddit/scraping-reddit-json.md) - 2021-06-21\n\n## nginx\n\n* [Using nginx to proxy to a Unix domain socket](https://github.com/simonw/til/blob/main/nginx/proxy-domain-sockets.md) - 2021-07-10\n\n## tesseract\n\n* [Using the tesseract CLI tool](https://github.com/simonw/til/blob/main/tesseract/tesseract-cli.md) - 2021-07-18\n\n## imagemagick\n\n* [Set a GIF to loop using ImageMagick](https://github.com/simonw/til/blob/main/imagemagick/set-a-gif-to-loop.md) - 2021-08-03\n* [Compressing an animated GIF with gifsicle or ImageMagick mogrify](https://github.com/simonw/til/blob/main/imagemagick/compress-animated-gif.md) - 2021-08-05\n\n## observable-plot\n\n* [Histogram with tooltips in Observable Plot](https://github.com/simonw/til/blob/main/observable-plot/histogram-with-tooltips.md) - 2021-08-21\n* [Wider tooltip areas for Observable Plot](https://github.com/simonw/til/blob/main/observable-plot/wider-tooltip-areas.md) - 2022-11-21\n\n## purpleair\n\n* [Calculating the AQI based on the Purple Air API for a sensor](https://github.com/simonw/til/blob/main/purpleair/purple-air-aqi.md) - 2021-08-31\n\n## electron\n\n* [Using the Chrome DevTools console as a REPL for an Electron app](https://github.com/simonw/til/blob/main/electron/electron-debugger-console.md) - 2021-08-31\n* [Open external links in an Electron app using the system browser](https://github.com/simonw/til/blob/main/electron/electron-external-links-system-browser.md) - 2021-09-02\n* [Signing and notarizing an Electron app for distribution using GitHub Actions](https://github.com/simonw/til/blob/main/electron/sign-notarize-electron-macos.md) - 2021-09-08\n* [Bundling Python inside an Electron app](https://github.com/simonw/til/blob/main/electron/python-inside-electron.md) - 2021-09-08\n* [Configuring auto-update for an Electron app](https://github.com/simonw/til/blob/main/electron/electrion-auto-update.md) - 2021-09-13\n* [Testing Electron apps with Playwright and GitHub Actions](https://github.com/simonw/til/blob/main/electron/testing-electron-playwright.md) - 2022-07-13\n\n## googlecloud\n\n* [Publishing to a public Google Cloud bucket with gsutil](https://github.com/simonw/til/blob/main/googlecloud/gsutil-bucket.md) - 2021-09-20\n* [Google OAuth for a CLI application](https://github.com/simonw/til/blob/main/googlecloud/google-oauth-cli-application.md) - 2022-02-16\n* [Recursively fetching metadata for all files in a Google Drive folder](https://github.com/simonw/til/blob/main/googlecloud/recursive-fetch-google-drive.md) - 2022-02-16\n* [Analyzing Google Cloud spend with Datasette](https://github.com/simonw/til/blob/main/googlecloud/google-cloud-spend-datasette.md) - 2022-08-16\n* [Workaround for google-github-actions/setup-gcloud errors](https://github.com/simonw/til/blob/main/googlecloud/gcloud-error-workaround.md) - 2022-12-01\n* [Reading thermometer temperatures over time from a video](https://github.com/simonw/til/blob/main/googlecloud/video-frame-ocr.md) - 2023-04-02\n\n## git\n\n* [Removing a git commit and force pushing to remove it from history](https://github.com/simonw/til/blob/main/git/remove-commit-and-force-push.md) - 2021-10-22\n* [Rewriting a repo to contain the history of just specific files](https://github.com/simonw/til/blob/main/git/rewrite-repo-specific-files.md) - 2022-03-22\n* [git bisect](https://github.com/simonw/til/blob/main/git/git-bisect.md) - 2022-10-29\n* [How to create a tarball of a git repository using \"git archive\"](https://github.com/simonw/til/blob/main/git/git-archive.md) - 2022-11-15\n* [Rewriting a Git repo to remove secrets from the history](https://github.com/simonw/til/blob/main/git/rewrite-repo-remove-secrets.md) - 2023-01-24\n* [Using git-filter-repo to set commit dates to author dates](https://github.com/simonw/til/blob/main/git/git-filter-repo.md) - 2023-07-10\n* [Back-dating Git commits based on file modification dates](https://github.com/simonw/til/blob/main/git/backdate-git-commits.md) - 2024-08-01\n* [Calculating the size of all LFS files in a repo](https://github.com/simonw/til/blob/main/git/size-of-lfs-files.md) - 2024-12-25\n\n## web-components\n\n* [Understanding Kristofer Joseph's Single File Web Component](https://github.com/simonw/til/blob/main/web-components/understanding-single-file-web-component.md) - 2021-10-27\n\n## kubernetes\n\n* [Basic Datasette in Kubernetes](https://github.com/simonw/til/blob/main/kubernetes/basic-datasette-in-kubernetes.md) - 2021-11-05\n* [kubectl proxy](https://github.com/simonw/til/blob/main/kubernetes/kubectl-proxy.md) - 2021-12-28\n\n## deno\n\n* [Annotated code for a demo of WebSocket chat in Deno Deploy](https://github.com/simonw/til/blob/main/deno/annotated-deno-deploy-demo.md) - 2021-11-06\n* [Deno KV](https://github.com/simonw/til/blob/main/deno/deno-kv.md) - 2023-04-28\n* [Running Python code in a Pyodide sandbox via Deno](https://github.com/simonw/til/blob/main/deno/pyodide-sandbox.md) - 2023-05-10\n\n## fly\n\n* [Assigning a custom subdomain to a Fly app](https://github.com/simonw/til/blob/main/fly/custom-subdomain-fly.md) - 2021-11-20\n* [Using the undocumented Fly GraphQL API](https://github.com/simonw/til/blob/main/fly/undocumented-graphql-api.md) - 2022-01-21\n* [Using the Fly Docker registry](https://github.com/simonw/til/blob/main/fly/fly-docker-registry.md) - 2022-05-21\n* [Writing Fly logs to S3](https://github.com/simonw/til/blob/main/fly/fly-logs-to-s3.md) - 2022-05-25\n* [Wildcard DNS and SSL on Fly](https://github.com/simonw/til/blob/main/fly/wildcard-dns-ssl.md) - 2022-05-25\n* [Deploying a redbean app to Fly](https://github.com/simonw/til/blob/main/fly/redbean-on-fly.md) - 2022-07-24\n* [How to scp files to and from Fly](https://github.com/simonw/til/blob/main/fly/scp.md) - 2022-09-02\n* [Configuring Django SQL Dashboard for Fly PostgreSQL](https://github.com/simonw/til/blob/main/fly/django-sql-dashboard.md) - 2023-08-21\n* [Deploying the CLIP embedding model on Fly](https://github.com/simonw/til/blob/main/fly/clip-on-fly.md) - 2023-10-18\n* [Running Varnish on Fly](https://github.com/simonw/til/blob/main/fly/varnish-on-fly.md) - 2024-01-08\n\n## caddy\n\n* [Pausing traffic and retrying in Caddy](https://github.com/simonw/til/blob/main/caddy/pause-retry-traffic.md) - 2021-11-24\n\n## npm\n\n* [Publishing a Web Component to npm](https://github.com/simonw/til/blob/main/npm/publish-web-component.md) - 2021-11-28\n* [Annotated package.json for idb-keyval](https://github.com/simonw/til/blob/main/npm/annotated-package-json.md) - 2022-02-10\n* [Upgrading packages with npm](https://github.com/simonw/til/blob/main/npm/upgrading-packages.md) - 2022-07-13\n* [Running self-hosted QuickJS in a browser](https://github.com/simonw/til/blob/main/npm/self-hosted-quickjs.md) - 2024-03-20\n* [Running Prettier against Django or Jinja templates](https://github.com/simonw/til/blob/main/npm/prettier-django.md) - 2024-06-19\n* [Publishing a simple client-side JavaScript package to npm with GitHub Actions](https://github.com/simonw/til/blob/main/npm/npm-publish-github-actions.md) - 2024-12-07\n\n## pluggy\n\n* [Registering the same Pluggy hook multiple times in a single file](https://github.com/simonw/til/blob/main/pluggy/multiple-hooks-same-file.md) - 2021-12-16\n\n## cloudflare\n\n* [Adding a robots.txt using Cloudflare workers](https://github.com/simonw/til/blob/main/cloudflare/robots-txt-cloudflare-workers.md) - 2021-12-21\n* [How to get Cloudflare to cache HTML](https://github.com/simonw/til/blob/main/cloudflare/cloudflare-cache-html.md) - 2024-01-08\n* [Redirecting a whole domain with Cloudflare](https://github.com/simonw/til/blob/main/cloudflare/redirect-whole-domain.md) - 2024-03-15\n* [Cloudflare redirect rules with dynamic expressions](https://github.com/simonw/til/blob/main/cloudflare/redirect-rules.md) - 2024-05-29\n* [Setting cache-control: max-age=31536000 with a Cloudflare Transform Rule](https://github.com/simonw/til/blob/main/cloudflare/cache-control-transform-rule.md) - 2024-10-23\n* [GitHub OAuth for a static site using Cloudflare Workers](https://github.com/simonw/til/blob/main/cloudflare/workers-github-oauth.md) - 2024-11-28\n\n## webauthn\n\n* [WebAuthn browser support](https://github.com/simonw/til/blob/main/webauthn/webauthn-browser-support.md) - 2021-12-29\n\n## pixelmator\n\n* [Pixel editing a favicon with Pixelmator](https://github.com/simonw/til/blob/main/pixelmator/pixel-editing-favicon.md) - 2022-01-20\n\n## graphql\n\n* [get-graphql-schema](https://github.com/simonw/til/blob/main/graphql/get-graphql-schema.md) - 2022-02-01\n* [Using curl to run GraphQL queries from the command line](https://github.com/simonw/til/blob/main/graphql/graphql-with-curl.md) - 2022-02-21\n* [GraphQL fragments](https://github.com/simonw/til/blob/main/graphql/graphql-fragments.md) - 2022-09-30\n\n## google-sheets\n\n* [Concatenating strings and newlines in Google Sheets](https://github.com/simonw/til/blob/main/google-sheets/concatenate.md) - 2022-03-15\n\n## twitter\n\n* [Exporting and editing a Twitter Spaces recording](https://github.com/simonw/til/blob/main/twitter/export-edit-twitter-spaces.md) - 2022-03-23\n* [How to get credentials for a new Twitter bot](https://github.com/simonw/til/blob/main/twitter/credentials-twitter-bot.md) - 2022-04-17\n* [Loading Twitter Birdwatch into SQLite for analysis with Datasette](https://github.com/simonw/til/blob/main/twitter/birdwatch-sqlite.md) - 2022-09-03\n* [Collecting replies to tweets using JavaScript](https://github.com/simonw/til/blob/main/twitter/collecting-replies.md) - 2024-10-08\n\n## shot-scraper\n\n* [Extracting web page content using Readability.js and shot-scraper](https://github.com/simonw/til/blob/main/shot-scraper/readability.md) - 2022-03-24\n* [shot-scraper for a subset of table columns](https://github.com/simonw/til/blob/main/shot-scraper/subset-of-table-columns.md) - 2022-10-14\n* [Scraping the Sky News Westminster Accounts, a Flourish application](https://github.com/simonw/til/blob/main/shot-scraper/scraping-flourish.md) - 2023-01-10\n* [Social media cards generated with shot-scraper](https://github.com/simonw/til/blob/main/shot-scraper/social-media-cards.md) - 2023-04-29\n* [axe-core and shot-scraper for accessibility audits](https://github.com/simonw/til/blob/main/shot-scraper/axe-core.md) - 2023-07-30\n\n## auth0\n\n* [Simplest possible OAuth authentication with Auth0](https://github.com/simonw/til/blob/main/auth0/oauth-with-auth0.md) - 2022-03-26\n* [Logging users out of Auth0](https://github.com/simonw/til/blob/main/auth0/auth0-logout.md) - 2022-04-03\n\n## webassembly\n\n* [Compiling to WASM with llvm on macOS](https://github.com/simonw/til/blob/main/webassembly/compile-to-wasm-llvm-macos.md) - 2022-03-28\n* [Run Python code in a WebAssembly sandbox](https://github.com/simonw/til/blob/main/webassembly/python-in-a-wasm-sandbox.md) - 2023-02-02\n\n## service-workers\n\n* [Intercepting fetch in a service worker](https://github.com/simonw/til/blob/main/service-workers/intercept-fetch.md) - 2022-04-30\n\n## networking\n\n* [Making HTTP calls using IPv6](https://github.com/simonw/til/blob/main/networking/http-ipv6.md) - 2022-06-08\n* [Running Ethernet over existing coaxial cable](https://github.com/simonw/til/blob/main/networking/ethernet-over-coaxial-cable.md) - 2024-02-12\n\n## gpt3\n\n* [Using GPT-3 to figure out jq recipes](https://github.com/simonw/til/blob/main/gpt3/jq.md) - 2022-08-10\n* [Guessing Amazon image URLs using GitHub Copilot](https://github.com/simonw/til/blob/main/gpt3/guessing-amazon-urls.md) - 2022-10-15\n* [Generating OpenAPI specifications using GPT-3](https://github.com/simonw/til/blob/main/gpt3/open-api.md) - 2022-11-13\n* [Writing tests with Copilot](https://github.com/simonw/til/blob/main/gpt3/writing-test-with-copilot.md) - 2022-11-14\n* [Reformatting text with Copilot](https://github.com/simonw/til/blob/main/gpt3/reformatting-text-with-copilot.md) - 2022-12-09\n* [A simple Python wrapper for the ChatGPT API](https://github.com/simonw/til/blob/main/gpt3/chatgpt-api.md) - 2023-03-02\n* [Using ChatGPT to write AppleScript](https://github.com/simonw/til/blob/main/gpt3/chatgpt-applescript.md) - 2023-03-08\n* [Using the ChatGPT streaming API from Python](https://github.com/simonw/til/blob/main/gpt3/python-chatgpt-streaming-api.md) - 2023-04-01\n* [GPT-4 for API design research](https://github.com/simonw/til/blob/main/gpt3/gpt4-api-design.md) - 2023-04-06\n* [Using ChatGPT Browse to name a Python package](https://github.com/simonw/til/blob/main/gpt3/picking-python-project-name-chatgpt.md) - 2023-06-18\n* [Using OpenAI functions and their Python library for data extraction](https://github.com/simonw/til/blob/main/gpt3/openai-python-functions-data-extraction.md) - 2023-07-09\n\n## quarto\n\n* [Trying out Quarto on macOS](https://github.com/simonw/til/blob/main/quarto/trying-out-quarto.md) - 2022-08-18\n\n## duckdb\n\n* [Using DuckDB in Python to access Parquet data](https://github.com/simonw/til/blob/main/duckdb/parquet.md) - 2022-09-16\n* [Use DuckDB to convert parquet to JSON and then open it in Datasette Lite](https://github.com/simonw/til/blob/main/duckdb/parquet-to-json.md) - 2023-03-21\n* [Summing columns in remote Parquet files using DuckDB](https://github.com/simonw/til/blob/main/duckdb/remote-parquet.md) - 2023-11-14\n\n## awslambda\n\n* [Deploying Python web apps as AWS Lambda functions](https://github.com/simonw/til/blob/main/awslambda/asgi-mangum.md) - 2022-09-18\n\n## cocktails\n\n* [Whisky sour](https://github.com/simonw/til/blob/main/cocktails/whisky-sour.md) - 2022-09-25\n* [Tommy's Margarita](https://github.com/simonw/til/blob/main/cocktails/tommys-margarita.md) - 2022-10-02\n* [Pisco sour](https://github.com/simonw/til/blob/main/cocktails/pisco-sour.md) - 2022-10-08\n\n## html\n\n* [HTML video that loads when the user clicks play](https://github.com/simonw/til/blob/main/html/video-preload-none.md) - 2022-09-29\n* [HTML datalist](https://github.com/simonw/til/blob/main/html/datalist.md) - 2022-11-14\n* [Lazy loading images in HTML](https://github.com/simonw/til/blob/main/html/lazy-loading-images.md) - 2022-11-26\n* [Scroll to text fragments](https://github.com/simonw/til/blob/main/html/scroll-to-text.md) - 2023-08-08\n* [HTML video with subtitles](https://github.com/simonw/til/blob/main/html/video-with-subtitles.md) - 2024-07-31\n\n## mastodon\n\n* [Getting Mastodon running on a custom domain](https://github.com/simonw/til/blob/main/mastodon/custom-domain-mastodon.md) - 2022-11-02\n* [Export a Mastodon timeline to SQLite](https://github.com/simonw/til/blob/main/mastodon/export-timeline-to-sqlite.md) - 2022-11-04\n* [Verifying your GitHub profile on Mastodon](https://github.com/simonw/til/blob/main/mastodon/verifying-github-on-mastodon.md) - 2022-11-16\n* [Building Mastodon bots with GitHub Actions and toot](https://github.com/simonw/til/blob/main/mastodon/mastodon-bots-github-actions.md) - 2023-02-02\n\n## json\n\n* [JSON Pointer](https://github.com/simonw/til/blob/main/json/json-pointer.md) - 2022-11-14\n* [Processing a stream of chunks of JSON with ijson](https://github.com/simonw/til/blob/main/json/ijson-stream.md) - 2023-08-15\n* [Streaming output of an indented JSON array](https://github.com/simonw/til/blob/main/json/streaming-indented-json-array.md) - 2023-08-29\n\n## clickhouse\n\n* [Querying the GitHub archive with the ClickHouse playground](https://github.com/simonw/til/blob/main/clickhouse/github-explorer.md) - 2022-12-31\n* [Reviewing your history of public GitHub repositories using ClickHouse](https://github.com/simonw/til/blob/main/clickhouse/github-public-history.md) - 2024-03-20\n\n## cooking\n\n* [Breakfast tacos with eggs, vegetarian sausages and avocado sauce](https://github.com/simonw/til/blob/main/cooking/breakfast-tacos.md) - 2023-01-02\n\n## llms\n\n* [Running nanoGPT on a MacBook M2 to generate terrible Shakespeare](https://github.com/simonw/til/blob/main/llms/nanogpt-shakespeare-m2.md) - 2023-02-01\n* [Training nanoGPT entirely on content from my blog](https://github.com/simonw/til/blob/main/llms/training-nanogpt-on-my-blog.md) - 2023-02-09\n* [Running LLaMA 7B and 13B on a 64GB M2 MacBook Pro with llama.cpp](https://github.com/simonw/til/blob/main/llms/llama-7b-m2.md) - 2023-03-10\n* [A simple Python implementation of the ReAct pattern for LLMs](https://github.com/simonw/til/blob/main/llms/python-react-pattern.md) - 2023-03-17\n* [Running Dolly 2.0 on Paperspace](https://github.com/simonw/til/blob/main/llms/dolly-2.md) - 2023-04-12\n* [Expanding ChatGPT Code Interpreter with Python packages, Deno and Lua](https://github.com/simonw/til/blob/main/llms/code-interpreter-expansions.md) - 2023-04-30\n* [mlc-chat - RedPajama-INCITE-Chat-3B on macOS](https://github.com/simonw/til/blob/main/llms/mlc-chat-redpajama.md) - 2023-05-22\n* [Running OpenAI's large context models using llm](https://github.com/simonw/til/blob/main/llms/larger-context-openai-models-llm.md) - 2023-06-13\n* [Storing and serving related documents with openai-to-sqlite and embeddings](https://github.com/simonw/til/blob/main/llms/openai-embeddings-related-content.md) - 2023-08-14\n* [Embedding paragraphs from my blog with E5-large-v2](https://github.com/simonw/til/blob/main/llms/embed-paragraphs.md) - 2023-09-08\n* [Summarizing Hacker News discussion themes with Claude and LLM](https://github.com/simonw/til/blob/main/llms/claude-hacker-news-themes.md) - 2023-09-09\n* [Using llama-cpp-python grammars to generate JSON](https://github.com/simonw/til/blob/main/llms/llama-cpp-python-grammars.md) - 2023-09-12\n* [Exploring ColBERT with RAGatouille](https://github.com/simonw/til/blob/main/llms/colbert-ragatouille.md) - 2024-01-27\n* [Piping from rg to llm to answer questions about code](https://github.com/simonw/til/blob/main/llms/rg-pipe-llm-trick.md) - 2024-02-11\n* [How streaming LLM APIs work](https://github.com/simonw/til/blob/main/llms/streaming-llm-apis.md) - 2024-09-21\n* [Running prompts against images, PDFs, audio and video with Google Gemini](https://github.com/simonw/til/blob/main/llms/prompt-gemini.md) - 2024-10-23\n* [Generating documentation from tests using files-to-prompt and LLM](https://github.com/simonw/til/blob/main/llms/docs-from-tests.md) - 2024-11-05\n* [Named Entity Resolution with dslim/distilbert-NER](https://github.com/simonw/til/blob/main/llms/bert-ner.md) - 2024-12-23\n\n## ab\n\n* [Avoiding \"length\" errors in Apache Bench with the -l option](https://github.com/simonw/til/blob/main/ab/apache-bench-length-errors.md) - 2023-02-08\n\n## hacker-news\n\n* [How to read Hacker News threads with most recent comments first](https://github.com/simonw/til/blob/main/hacker-news/recent-comments.md) - 2023-03-12\n\n## observable\n\n* [Using jq in an Observable notebook](https://github.com/simonw/til/blob/main/observable/jq-in-observable.md) - 2023-03-25\n\n## midjourney\n\n* [Creating desktop backgrounds using Midjourney](https://github.com/simonw/til/blob/main/midjourney/desktop-backgrounds.md) - 2023-04-10\n\n## exif\n\n* [Interpreting photo orientation and locations in EXIF data](https://github.com/simonw/til/blob/main/exif/orientation-and-location.md) - 2023-04-22\n\n## misc\n\n* [hexdump and hexdump -C](https://github.com/simonw/til/blob/main/misc/hexdump.md) - 2023-05-22\n* [Cloning my voice with ElevenLabs](https://github.com/simonw/til/blob/main/misc/voice-cloning.md) - 2023-11-15\n\n## http\n\n* [Testing the Access-Control-Max-Age CORS header](https://github.com/simonw/til/blob/main/http/testing-cors-max-age.md) - 2023-05-25\n\n## discord\n\n* [A Discord bot to expand issue links to a private GitHub repository](https://github.com/simonw/til/blob/main/discord/discord-github-issues-bot.md) - 2023-06-29\n\n## yaml\n\n* [Auto-formatting YAML files with yamlfmt](https://github.com/simonw/til/blob/main/yaml/yamlfmt.md) - 2023-07-13\n\n## overture-maps\n\n* [Exploring the Overture Maps places data using DuckDB, sqlite-utils and Datasette](https://github.com/simonw/til/blob/main/overture-maps/overture-maps-parquet.md) - 2023-07-27\n\n## cosmopolitan\n\n* [Catching up with the Cosmopolitan ecosystem](https://github.com/simonw/til/blob/main/cosmopolitan/ecosystem.md) - 2023-08-10\n\n## google\n\n* [Limited JSON API for Google searches using Programmable Search Engine](https://github.com/simonw/til/blob/main/google/json-api-programmable-search-engine.md) - 2023-09-16\n* [Generating URLs to a Gmail compose window](https://github.com/simonw/til/blob/main/google/gmail-compose-url.md) - 2024-03-12\n\n## machinelearning\n\n* [Trying out the facebook/musicgen-small sound generation model](https://github.com/simonw/til/blob/main/machinelearning/musicgen.md) - 2023-09-23\n\n## css\n\n* [Understanding the CSS auto-resizing textarea trick](https://github.com/simonw/til/blob/main/css/resizing-textarea.md) - 2023-09-30\n* [A simple two column CSS grid](https://github.com/simonw/til/blob/main/css/simple-two-column-grid.md) - 2023-10-26\n* [Styling an HTML dialog modal to take the full height of the viewport](https://github.com/simonw/til/blob/main/css/dialog-full-height.md) - 2025-03-14\n\n## pyodide\n\n* [Cryptography in Pyodide](https://github.com/simonw/til/blob/main/pyodide/cryptography-in-pyodide.md) - 2023-11-26\n\n## playwright\n\n* [Using expect() to wait for a selector to match multiple items](https://github.com/simonw/til/blob/main/playwright/expect-selector-count.md) - 2024-01-13\n* [Testing HTML tables with Playwright Python](https://github.com/simonw/til/blob/main/playwright/testing-tables.md) - 2024-09-03\n\n## httpx\n\n* [Logging OpenAI API requests and responses using HTTPX](https://github.com/simonw/til/blob/main/httpx/openai-log-requests-responses.md) - 2024-01-26\n\n## valtown\n\n* [Running a scheduled function on Val Town to import Atom feeds into Datasette Cloud](https://github.com/simonw/til/blob/main/valtown/scheduled.md) - 2024-02-20\n\n## chrome\n\n* [Google Chrome --headless mode](https://github.com/simonw/til/blob/main/chrome/headless.md) - 2024-03-24\n\n## go\n\n* [Installing tools written in Go](https://github.com/simonw/til/blob/main/go/installing-tools.md) - 2024-03-25\n\n## ham-radio\n\n* [How I studied for my Ham radio general exam](https://github.com/simonw/til/blob/main/ham-radio/general.md) - 2024-05-11\n\n## ios\n\n* [Listen to a web page in Mobile Safari](https://github.com/simonw/til/blob/main/ios/listen-to-page.md) - 2024-05-21\n\n## youtube\n\n* [Livestreaming a community election event on YouTube](https://github.com/simonw/til/blob/main/youtube/livestreaming.md) - 2024-10-09\n\n## hugo\n\n* [The most basic possible Hugo site](https://github.com/simonw/til/blob/main/hugo/basic.md) - 2024-10-22\n\n## tiktok\n\n* [Downloading every video for a TikTok account](https://github.com/simonw/til/blob/main/tiktok/download-all-videos.md) - 2025-01-18\n\u003c!-- index ends --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimonw%2Ftil","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsimonw%2Ftil","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimonw%2Ftil/lists"}