41554 blogs · [ { "id": "01a0ca4f-e3a2-7234-8721-d6e30ef59ef6", "title": "How to back up multiple Macs to one Time Machine drive", "url": "https://www.seanh.cc/2026/09/21/time-machine-multiple-macs-to-one-hdd/", "published_at": "2026-09-20T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca5cc377f6", "title": "Transactional Job Queues and the Two Generals’ Problem", "url": "https://www.seanh.cc/2026/01/29/transactional-job-queues/", "published_at": "2026-01-29T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca5d079e5c", "title": "Ruff Python formatting in Vim without plugins", "url": "https://www.seanh.cc/2026/01/18/ruff-format-in-vim/", "published_at": "2026-01-18T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca5decf849", "title": "Helix, language servers, and Python virtual environments", "url": "https://www.seanh.cc/2025/10/13/helix-lsp-virtualenv/", "published_at": "2025-10-12T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca5eb3898b", "title": "How to Use Vim’s Built-in Package Manager", "url": "https://www.seanh.cc/2024/09/10/vim-packages/", "published_at": "2024-09-09T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca5f92b74c", "title": "How I Use Bitwarden", "url": "https://www.seanh.cc/2023/01/14/bitwarden/", "published_at": "2023-01-14T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca5fa43212", "title": "How to Make Your Own Encrypted Backup of Your Bitwarden Vault", "url": "https://www.seanh.cc/2023/01/13/bitward-backup/", "published_at": "2023-01-13T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca5fc00f6e", "title": "Todo.txt", "url": "https://www.seanh.cc/2022/11/04/todo.txt/", "published_at": "2022-11-04T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca6051f33d", "title": "How to Publish a Python Package from GitHub Actions", "url": "https://www.seanh.cc/2022/05/21/publishing-python-packages-from-github-actions/", "published_at": "2022-05-20T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca60f3a7c6", "title": "How I Use Restic to Back up My Files to Backblaze B2", "url": "https://www.seanh.cc/2022/04/03/restic/", "published_at": "2022-04-02T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca61c57f37", "title": "How to Backup Your Fastmail & Gmail Accounts with isync", "url": "https://www.seanh.cc/2021/08/22/backup-fastmail-and-gmail-with-isync/", "published_at": "2021-08-21T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca61e8eb05", "title": "Change Between Light and Dark Themes in tmux", "url": "https://www.seanh.cc/2021/01/02/change-between-light-and-dark-themes-in-tmux/", "published_at": "2021-01-02T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca62379425", "title": "Browser-like Search Shortcuts for tmux", "url": "https://www.seanh.cc/2020/12/31/browser-like-search-shortcuts-for-tmux/", "published_at": "2020-12-31T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca62ea7962", "title": "How to Make tmux’s “Windows” Behave like Browser Tabs", "url": "https://www.seanh.cc/2020/12/30/how-to-make-tmux's-windows-behave-like-browser-tabs/", "published_at": "2020-12-30T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca63e782dd", "title": "Binding Keys in tmux", "url": "https://www.seanh.cc/2020/12/28/binding-keys-in-tmux/", "published_at": "2020-12-28T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca640f6a21", "title": "Setting Options in tmux", "url": "https://www.seanh.cc/2020/12/28/setting-options-in-tmux/", "published_at": "2020-12-28T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca643b14e0", "title": "Copy and Paste in tmux", "url": "https://www.seanh.cc/2020/12/27/copy-and-paste-in-tmux/", "published_at": "2020-12-27T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca65128ded", "title": "Operate on an Indented Block of Lines with vim-indent-object", "url": "https://www.seanh.cc/2020/08/08/vim-indent-object/", "published_at": "2020-08-07T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca65ed29bc", "title": "How to Use Vim’s Built-in Help", "url": "https://www.seanh.cc/2020/08/02/how-to-use-vim's-built-in-help/", "published_at": "2020-08-01T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca65f20235", "title": "Comment and Uncomment Lines with commentary.vim", "url": "https://www.seanh.cc/2020/07/25/how-to-comment-and-uncomment-lines-in-vim/", "published_at": "2020-07-24T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca669ed498", "title": "Breadcrumbs in Jekyll", "url": "https://www.seanh.cc/2020/01/01/jekyll-breadcrumbs/", "published_at": "2020-01-01T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca66fec65c", "title": "Liquid Templating Crash Course", "url": "https://www.seanh.cc/2019/09/29/liquid/", "published_at": "2019-09-28T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca67bb8ce0", "title": "Designing Python Exception Classes", "url": "https://www.seanh.cc/2019/06/20/python-custom-exception-classes/", "published_at": "2019-06-19T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca684c25c1", "title": "Python Web App Code Design at Hypothesis", "url": "https://www.seanh.cc/2019/01/28/python-web-app-code-design-at-hypothesis/", "published_at": "2019-01-28T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca6863dd78", "title": "An Opinionated tox.ini File", "url": "https://www.seanh.cc/2018/11/14/tox/", "published_at": "2018-11-14T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca68cc3f4d", "title": "Managing a Project’s Virtualenvs with tox", "url": "https://www.seanh.cc/2018/09/01/tox-tutorial/", "published_at": "2018-08-31T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca698c4378", "title": "Unattended Upgrades on Ubuntu", "url": "https://www.seanh.cc/2018/02/19/unattended-upgrades/", "published_at": "2018-02-19T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca69e059b7", "title": "Mozilla Thunderbird Keyboard Shortcuts", "url": "https://www.seanh.cc/2018/01/21/thunderbird-keyboard-shortcuts/", "published_at": "2018-01-21T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca6a735c6b", "title": "PDF Fingerprinting", "url": "https://www.seanh.cc/2017/11/22/pdf-fingerprinting/", "published_at": "2017-11-22T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca6b1042d1", "title": "Matcher Objects in Python Tests", "url": "https://www.seanh.cc/2017/05/12/matchers/", "published_at": "2017-05-11T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca6b58b680", "title": "When and When Not to Use Mocks", "url": "https://www.seanh.cc/2017/04/25/when-to-use-mocks/", "published_at": "2017-04-24T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca6b9d747b", "title": "Python’s unittest.mock", "url": "https://www.seanh.cc/2017/03/17/mock/", "published_at": "2017-03-17T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca6c3c0c14", "title": "Hypothesis’s patch Fixture", "url": "https://www.seanh.cc/2017/03/17/patch/", "published_at": "2017-03-17T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca6d34f300", "title": "sentinel: Unique Objects for Tests", "url": "https://www.seanh.cc/2017/03/17/sentinel/", "published_at": "2017-03-17T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca6e1c2e2a", "title": "The Problem with Mocks", "url": "https://www.seanh.cc/2017/03/17/the-problem-with-mocks/", "published_at": "2017-03-17T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca6e82386e", "title": "usefixtures as a Class Decorator", "url": "https://www.seanh.cc/2017/03/17/usefixtures-class-decorator/", "published_at": "2017-03-17T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca6efa785e", "title": "Advanced pytest Fixtures", "url": "https://www.seanh.cc/2017/02/12/advanced-fixtures/", "published_at": "2017-02-12T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca6f9890bc", "title": "Basic pytest Fixtures", "url": "https://www.seanh.cc/2017/02/02/fixtures/", "published_at": "2017-02-02T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca6fb919f4", "title": "Parametrizing Python Tests", "url": "https://www.seanh.cc/2017/01/31/parametrize/", "published_at": "2017-01-31T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca70605313", "title": "Arrange, Act, Assert", "url": "https://www.seanh.cc/2017/01/29/arrange-act-assert/", "published_at": "2017-01-29T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca713faef1", "title": "Python Test Factories with factory_boy", "url": "https://www.seanh.cc/2017/01/29/factories/", "published_at": "2017-01-29T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca71bf4d42", "title": "Testing that an Exception is Raised with pytest.raises", "url": "https://www.seanh.cc/2017/01/29/testing-that-exceptions-are-raised/", "published_at": "2017-01-29T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca71fac737", "title": "Debugging Failing Tests with pytest", "url": "https://www.seanh.cc/2017/01/28/debugging-tests/", "published_at": "2017-01-28T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca726a1d70", "title": "Writing Simple Python Unit Tests", "url": "https://www.seanh.cc/2017/01/28/writing-tests/", "published_at": "2017-01-28T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca72898eb0", "title": "Running the Hypothesis Python Tests", "url": "https://www.seanh.cc/2017/01/16/running-the-h-tests/", "published_at": "2017-01-16T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca72cd8e4a", "title": "Python Unit Tests at Hypothesis", "url": "https://www.seanh.cc/2017/01/15/python-unit-tests-at-hypothesis/", "published_at": "2017-01-15T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca73060305", "title": "Code Review", "url": "https://www.seanh.cc/2016/10/04/code-review/", "published_at": "2016-10-03T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca732b3023", "title": "Pyblosxom on Ubuntu with Gunicorn & Nginx", "url": "https://www.seanh.cc/2015/10/04/how-to-install-pyblosxom-on-ubuntu-with-gunicorn-and-nginx/", "published_at": "2015-10-03T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca737f9047", "title": "git-crypt", "url": "https://www.seanh.cc/2015/09/18/git-crypt/", "published_at": "2015-09-17T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca74396363", "title": "Background Tasks as Simple Web Services", "url": "https://www.seanh.cc/2014/10/14/background-tasks-as-simple-web-services/", "published_at": "2014-10-13T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca74a9c209", "title": "A Broken Link Checker Plugin for CKAN", "url": "https://www.seanh.cc/2014/10/13/ckanext-deadoralive/", "published_at": "2014-10-12T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca74f62d67", "title": "Functional Core, Imperative Shell", "url": "https://www.seanh.cc/2014/07/27/functional-core-imperative-shell/", "published_at": "2014-07-26T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca751da37c", "title": "The Network as the Database", "url": "https://www.seanh.cc/2014/06/09/the-network-as-the-database/", "published_at": "2014-06-08T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca75457bcb", "title": "The Open Knowledge Data Packager", "url": "https://www.seanh.cc/2014/05/27/datapackager/", "published_at": "2014-05-26T23:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca7630cfcd", "title": "SuperDuper & FileVault on OS X Lion", "url": "https://www.seanh.cc/2014/03/01/lion-bootable-encrypted-superduper-clone/", "published_at": "2014-03-01T00:00:00+00:00" }, { "id": "01a087dd-4c96-7381-bcb7-10ca76ca4a92", "title": "A Mozilla Persona Plugin for CKAN", "url": "https://www.seanh.cc/2014/01/31/ckanext-persona/", "published_at": "2014-01-31T00:00:00+00:00" } ] posts Claim your blog
Back to seanh.cc
Blog · corpus.blog/blogs/seanh.cc/posts

seanh.cc

seanh.cc

2026

2025

2024

2023

2022

2021

2020

2019

2018

2017

2016

2015

2014