Compare commits

...

148 Commits

Author SHA1 Message Date
ravenscroftj 188786d6c9 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 18s Details
2024-09-09 15:43:13 +01:00
ravenscroftj 4a42e9e897 Update brainsteam/data/mentions.json
Deploy Website / build (push) Has been cancelled Details
2024-09-09 15:43:11 +01:00
ravenscroftj de3bbd58ff Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 20s Details
2024-09-09 15:11:44 +01:00
ravenscroftj f9fd284f29 Add brainsteam/content/notes/2024/09/09/1725890129.md
Deploy Website / build (push) Successful in 20s Details
2024-09-09 14:55:29 +01:00
ravenscroftj 8f72d31c0e Add brainsteam/content/bookmarks/2024/09/09/reclaim-the-stack1725887346.md
Deploy Website / build (push) Successful in 19s Details
2024-09-09 14:09:07 +01:00
James Ravenscroft a80c8f17f0 Merge branch 'main' of ssh://thanos.rvns.xyz:222/ravenscroftj/brainsteam.co.uk
Deploy Website / build (push) Successful in 20s Details
2024-09-09 12:57:52 +01:00
James Ravenscroft 069f6f2028 update theme 2024-09-09 12:57:48 +01:00
James Ravenscroft 30f566507c update card gen script 2024-09-09 12:57:25 +01:00
ravenscroftj 60b0cf3b31 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 19s Details
2024-09-09 12:13:50 +01:00
ravenscroftj 6bbf4f5dbb Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 18s Details
2024-09-09 10:42:29 +01:00
ravenscroftj 922fbca16c Update brainsteam/data/mentions.json
Deploy Website / build (push) Has been cancelled Details
2024-09-09 10:42:10 +01:00
ravenscroftj 24a3596cd5 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 19s Details
2024-09-09 10:41:48 +01:00
ravenscroftj 94414becd5 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 19s Details
2024-09-09 10:24:54 +01:00
ravenscroftj 70082965cc Add brainsteam/content/notes/2024/09/09/1725873283.md
Deploy Website / build (push) Successful in 20s Details
2024-09-09 10:14:43 +01:00
ravenscroftj c2689a4c31 Delete brainsteam/content/notes/2024/09/08/1725827553.md
Deploy Website / build (push) Successful in 19s Details
2024-09-08 21:33:35 +01:00
ravenscroftj f86d06118d Add brainsteam/content/notes/2024/09/08/1725827553.md
Deploy Website / build (push) Successful in 20s Details
2024-09-08 21:32:33 +01:00
ravenscroftj 06f172e56d Delete brainsteam/content/posts/2024/09/08/yum1725827038.md
Deploy Website / build (push) Successful in 20s Details
2024-09-08 21:24:55 +01:00
ravenscroftj a3c39f0c49 Add brainsteam/content/posts/2024/09/08/yum1725827038.md
Deploy Website / build (push) Successful in 19s Details
2024-09-08 21:24:00 +01:00
James Ravenscroft 229870e97d fix things
Deploy Website / build (push) Successful in 20s Details
2024-09-08 18:06:18 +01:00
ravenscroftj b449c15174 Add brainsteam/content/notes/2024/09/08/1725814465.md
Deploy Website / build (push) Successful in 19s Details
2024-09-08 17:54:25 +01:00
James Ravenscroft 228b36f718 add mp for sling post
Deploy Website / build (push) Successful in 18s Details
2024-09-08 17:46:31 +01:00
James Ravenscroft 37f66dde3b update page slugs
Deploy Website / build (push) Successful in 21s Details
2024-09-08 17:23:07 +01:00
James Ravenscroft 0cbc2bdca1 Merge branch 'main' of ssh://thanos.rvns.xyz:222/ravenscroftj/brainsteam.co.uk 2024-09-08 17:01:47 +01:00
James Ravenscroft 42a1da0caa add wp2hugo script 2024-09-08 17:01:43 +01:00
ravenscroftj a0cbf4382b Update .gitea/workflows/publish.yml
Deploy Website / build (push) Successful in 28s Details
2024-09-08 16:56:24 +01:00
ravenscroftj 3d2d2f3dc8 Update .gitea/workflows/publish.yml
Deploy Website / build (push) Failing after 2s Details
2024-09-08 16:52:39 +01:00
ravenscroftj 3679cbcaf4 Update .gitea/workflows/publish.yml
Deploy Website / build (push) Has been cancelled Details
2024-09-08 16:51:21 +01:00
ravenscroftj a4d2c02ae0 Update brainsteam/content/notes/2024/09/08/Moody sky this morning on a walk along ....md
Deploy Website / build (push) Has been cancelled Details
2024-09-08 16:49:11 +01:00
James Ravenscroft d59575f8b2 update all content
Deploy Website / build (push) Successful in 19s Details
2024-09-08 15:00:57 +01:00
James Ravenscroft 9d279b3edc Merge branch 'main' of ssh://thanos.rvns.xyz:222/ravenscroftj/brainsteam.co.uk
Deploy Website / build (push) Successful in 18s Details
2024-09-08 12:10:41 +01:00
James Ravenscroft 915c8f11da update theme 2024-09-08 12:10:40 +01:00
James Ravenscroft 9fbef06682 grabbed titles for a bunch of content 2024-09-08 12:09:57 +01:00
James Ravenscroft 7376dc4dc9 implement title getter for bookmarks 2024-09-08 12:09:41 +01:00
James Ravenscroft 59ed5c4f1f remove docker container hugo
Deploy Website / build (push) Successful in 18s Details
2024-09-08 10:53:51 +00:00
James Ravenscroft 3354021cbd make build executable
Deploy Website / build (push) Failing after 29s Details
2024-09-08 11:50:15 +01:00
James Ravenscroft ed229b1a7e remove -it from docker run step
Deploy Website / build (push) Failing after 17s Details
2024-09-08 11:48:56 +01:00
James Ravenscroft 08a18b1200 update path on noprobe
Deploy Website / build (push) Failing after 16s Details
2024-09-08 11:46:09 +01:00
James Ravenscroft 2eb6f53fca revert label
Deploy Website / build (push) Failing after 15s Details
2024-09-08 11:35:58 +01:00
James Ravenscroft 2d0e9bd247 add ssh
Deploy Website / build (push) Has been cancelled Details
2024-09-08 11:27:41 +01:00
James Ravenscroft a5e471825e add ssh
Deploy Website / build (push) Failing after 19s Details
2024-09-08 11:25:58 +01:00
James Ravenscroft e28a6e1f28 fix checkout
Deploy Website / build (push) Failing after 18s Details
2024-09-08 11:16:21 +01:00
James Ravenscroft 7113196d6e tidy up
Deploy Website / build (push) Failing after 12s Details
2024-09-08 11:14:49 +01:00
James Ravenscroft 3139a517a0 Merge branch 'main' of ssh://thanos.rvns.xyz:222/ravenscroftj/brainsteam.co.uk
Deploy Website / build (push) Failing after 35s Details
2024-09-07 09:23:03 +01:00
James Ravenscroft 3f0c28daf8 fix some stuff 2024-09-07 09:22:56 +01:00
James Ravenscroft d5e97e4413 new layout 2024-09-04 20:56:18 +01:00
ravenscroftj 610f894d1e Update brainsteam/data/mentions.json
Deploy Website / build (push) Failing after 10s Details
2023-10-30 21:30:40 +00:00
ravenscroftj dcb03680d5 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 20s Details
2023-10-30 21:30:29 +00:00
ravenscroftj 3bfb4160fd Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 15s Details
2023-10-30 19:45:16 +00:00
ravenscroftj 5d442266f6 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 26s Details
2023-10-30 19:30:10 +00:00
ravenscroftj 80bd77b55e Add brainsteam/content/posts/2023/10/30/dealing-with-interruption-when-it-arises1698656338.md
Deploy Website / build (push) Successful in 21s Details
2023-10-30 08:58:59 +00:00
ravenscroftj 085653fe53 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 17s Details
2023-10-29 11:57:30 +00:00
ravenscroftj 5fc6009fea Update brainsteam/content/posts/2023/10/29/weeknote-cw43-20231698573691.md
Deploy Website / build (push) Successful in 16s Details
2023-10-29 10:02:36 +00:00
ravenscroftj 092e4ffd37 Add brainsteam/content/posts/2023/10/29/weeknote-cw43-20231698573691.md
Deploy Website / build (push) Successful in 20s Details
2023-10-29 10:01:31 +00:00
ravenscroftj f471374eeb Update brainsteam/content/posts/2023/10/28/a-musical-interlude-last-dinner-party-and-dream-theater1698481925.md
Deploy Website / build (push) Successful in 14s Details
2023-10-28 09:34:24 +01:00
ravenscroftj 465f450777 Update brainsteam/content/posts/2023/10/28/a-musical-interlude-last-dinner-party-and-dream-theater1698481925.md
Deploy Website / build (push) Successful in 15s Details
2023-10-28 09:34:08 +01:00
ravenscroftj 6161c0013f Add brainsteam/content/posts/2023/10/28/a-musical-interlude-last-dinner-party-and-dream-theater1698481925.md
Deploy Website / build (push) Successful in 14s Details
2023-10-28 09:32:06 +01:00
James Ravenscroft 287e053623 update now pages
Deploy Website / build (push) Successful in 32s Details
2023-10-28 07:56:01 +01:00
ravenscroftj 10583d5458 Update brainsteam/content/posts/2023/10/22/weeknote-cw42-20231697959719.md
Deploy Website / build (push) Successful in 14s Details
2023-10-22 08:30:06 +01:00
ravenscroftj 324e67f562 Add brainsteam/content/posts/2023/10/22/weeknote-cw42-20231697959719.md
Deploy Website / build (push) Successful in 21s Details
2023-10-22 08:28:40 +01:00
ravenscroftj ab5553611c Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 24s Details
2023-10-19 06:35:16 +01:00
ravenscroftj 1964f94a8b Add brainsteam/content/posts/2023/10/18/dealing-with-death-by-a-thousand-questions-at-work1697619891.md
Deploy Website / build (push) Successful in 34s Details
2023-10-18 10:04:51 +01:00
ravenscroftj 190a54cd87 Update brainsteam/content/posts/2023/10/15/weeknote-cw-41-20231697388830.md
Deploy Website / build (push) Successful in 14s Details
2023-10-15 18:02:42 +01:00
ravenscroftj d243b8a465 Update brainsteam/content/posts/2023/10/15/weeknote-cw-41-20231697388830.md
Deploy Website / build (push) Successful in 15s Details
2023-10-15 17:58:03 +01:00
ravenscroftj 238fc506ab Update brainsteam/content/posts/2023/10/15/weeknote-cw-41-20231697388830.md
Deploy Website / build (push) Successful in 14s Details
2023-10-15 17:57:17 +01:00
ravenscroftj 888513a648 Add brainsteam/content/posts/2023/10/15/weeknote-cw-41-20231697388830.md
Deploy Website / build (push) Successful in 24s Details
2023-10-15 17:53:51 +01:00
ravenscroftj 00a2b5bb67 Update brainsteam/content/posts/2023/10/08/weeknote-week-40-20231696772464.md
Deploy Website / build (push) Successful in 15s Details
2023-10-08 14:46:54 +01:00
ravenscroftj d46ac2b848 Update brainsteam/content/posts/2023/10/08/weeknote-week-40-20231696772464.md
Deploy Website / build (push) Successful in 14s Details
2023-10-08 14:43:04 +01:00
ravenscroftj 47279a7dfb Add brainsteam/content/posts/2023/10/08/weeknote-week-40-20231696772464.md
Deploy Website / build (push) Successful in 1m6s Details
2023-10-08 14:41:04 +01:00
James Ravenscroft 98f7698ee5 add thumbnail
Deploy Website / build (push) Successful in 15s Details
2023-10-06 07:36:46 +01:00
ravenscroftj 1be800b6dd Update brainsteam/content/watches/2023/10/06/1696573940.md
Deploy Website / build (push) Successful in 15s Details
2023-10-06 07:33:47 +01:00
ravenscroftj 2b1bbb1bb7 Update brainsteam/content/watches/2023/10/06/1696573940.md
Deploy Website / build (push) Successful in 15s Details
2023-10-06 07:33:07 +01:00
ravenscroftj a0934506b1 Add brainsteam/content/watches/2023/10/06/1696573940.md
Deploy Website / build (push) Successful in 28s Details
2023-10-06 07:32:21 +01:00
ravenscroftj ddcb229bd8 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 22s Details
2023-10-01 18:17:07 +01:00
James Ravenscroft 372b97b05b add weeknote
Deploy Website / build (push) Successful in 18s Details
2023-10-01 15:26:43 +01:00
James Ravenscroft 2d5fb9fbf3 push up to date mentions data
Deploy Website / build (push) Successful in 35s Details
2023-10-01 08:21:10 +01:00
James Ravenscroft 12a5b0336d correct link to recommendation
Deploy Website / build (push) Successful in 23s Details
2023-09-30 09:18:08 +01:00
James Ravenscroft 0cb594244f add turbopilot post
Deploy Website / build (push) Successful in 30s Details
2023-09-30 09:13:30 +01:00
ravenscroftj 65ac243753 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 24s Details
2023-09-28 20:41:38 +01:00
ravenscroftj 12366e46c7 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 25s Details
2023-09-27 23:20:53 +01:00
ravenscroftj 27f52e4d7b Update brainsteam/content/posts/2023/09/27/crappy-printers-and-crappy-content1695806638.md
Deploy Website / build (push) Successful in 17s Details
2023-09-27 10:32:48 +01:00
ravenscroftj 38399321b8 Add brainsteam/content/posts/2023/09/27/crappy-printers-and-crappy-content1695806638.md
Deploy Website / build (push) Successful in 24s Details
2023-09-27 10:23:58 +01:00
ravenscroftj 928dba4194 Add brainsteam/content/replies/2023/09/26/1695711480.md
Deploy Website / build (push) Successful in 22s Details
2023-09-26 07:58:00 +01:00
ravenscroftj 71de3c95fe Add brainsteam/content/bookmarks/2023/09/25/elegant-and-powerful-new-result-that-seriously-undermines-large-language-models1695627930.md
Deploy Website / build (push) Successful in 23s Details
2023-09-25 08:45:30 +01:00
James Ravenscroft b6c192cc43 add weeknote
Deploy Website / build (push) Successful in 24s Details
2023-09-24 20:06:18 +01:00
ravenscroftj 26fef24222 Add brainsteam/content/watches/2023/09/16/1694896952.md
Deploy Website / build (push) Successful in 37s Details
2023-09-16 21:42:32 +01:00
ravenscroftj 7e10404931 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 19s Details
2023-09-16 19:24:03 +01:00
ravenscroftj 35d2dcce66 Update brainsteam/content/posts/2023/09/16/we-went-on-holiday1694878285.md
Deploy Website / build (push) Successful in 22s Details
2023-09-16 16:34:19 +01:00
ravenscroftj 2a575af4a3 Add brainsteam/content/posts/2023/09/16/we-went-on-holiday1694878285.md
Deploy Website / build (push) Successful in 27s Details
2023-09-16 16:31:26 +01:00
ravenscroftj 2417fb9ee3 Add brainsteam/content/bookmarks/2023/08/29/the-squeeze-herbert-lui1693287298.md
Deploy Website / build (push) Successful in 18s Details
2023-08-29 06:34:59 +01:00
ravenscroftj b0795e3132 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 14s Details
2023-08-28 19:50:39 +01:00
ravenscroftj e6775cae43 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 20s Details
2023-08-28 19:50:35 +01:00
ravenscroftj 53fb876205 Update brainsteam/content/posts/2023/08/28/we-moved-offices1693231919.md
Deploy Website / build (push) Successful in 18s Details
2023-08-28 15:18:54 +01:00
ravenscroftj bd0bfc3f5b Update brainsteam/content/posts/2023/08/28/we-moved-offices1693231919.md
Deploy Website / build (push) Successful in 17s Details
2023-08-28 15:17:32 +01:00
ravenscroftj 22f0a07eda Add brainsteam/content/posts/2023/08/28/we-moved-offices1693231919.md
Deploy Website / build (push) Successful in 19s Details
2023-08-28 15:12:00 +01:00
James Ravenscroft 03f2162963 sync latest theme stuff
Deploy Website / build (push) Successful in 17s Details
2023-08-28 14:11:36 +01:00
James Ravenscroft b58a00bc4d fix main sections
Deploy Website / build (push) Successful in 16s Details
2023-08-28 14:07:44 +01:00
James Ravenscroft 46f31b8c5b update twitter meta
Deploy Website / build (push) Successful in 25s Details
2023-08-28 14:06:41 +01:00
ravenscroftj 8a39c9a00b Add brainsteam/content/notes/2023/08/26/1693087433.md
Deploy Website / build (push) Successful in 25s Details
2023-08-26 23:03:53 +01:00
ravenscroftj 1b86d00f4f Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 27s Details
2023-08-21 09:48:21 +01:00
ravenscroftj 549ebb1b76 Add brainsteam/content/bookmarks/2023/08/20/reading-philosophy-and-17-reading-guidelines1692558560.md
Deploy Website / build (push) Successful in 18s Details
2023-08-20 20:09:20 +01:00
James Ravenscroft 0e572f0349 tidy up weeknote a bit more
Deploy Website / build (push) Successful in 18s Details
2023-08-20 18:17:36 +01:00
James Ravenscroft f7974362f6 add post thumbnail
Deploy Website / build (push) Successful in 16s Details
2023-08-20 18:12:42 +01:00
James Ravenscroft e93195df20 replace embedded image with linked one
Deploy Website / build (push) Successful in 17s Details
2023-08-20 18:09:23 +01:00
ravenscroftj 614ba6ef9d Add brainsteam/content/posts/2023/08/20/weeknote-13-19-august-20231692550760.md
Deploy Website / build (push) Successful in 25s Details
2023-08-20 17:59:21 +01:00
James Ravenscroft 423dca6139 update post
Deploy Website / build (push) Successful in 19s Details
2023-08-15 09:04:37 +01:00
James Ravenscroft 259b3e2518 add airbyte post
Deploy Website / build (push) Successful in 24s Details
2023-08-14 17:24:40 +01:00
ravenscroftj 89b0838b1f Delete brainsteam/content/likes/2023/08/13/1691919049.md
Deploy Website / build (push) Successful in 16s Details
2023-08-13 10:31:54 +01:00
ravenscroftj 50017e47de Add brainsteam/content/likes/2023/08/13/1691919049.md
Deploy Website / build (push) Successful in 23s Details
2023-08-13 10:30:49 +01:00
ravenscroftj 7dd0b81bfb Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 18s Details
2023-08-06 12:08:40 +01:00
ravenscroftj dfc8870a26 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 15s Details
2023-08-06 10:58:00 +01:00
ravenscroftj 811cbda016 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 16s Details
2023-08-06 10:57:56 +01:00
ravenscroftj 8c3dbecf3a Update brainsteam/content/notes/2023/08/06/1691312975.md
Deploy Website / build (push) Successful in 17s Details
2023-08-06 10:27:35 +01:00
ravenscroftj b9428fef38 Add brainsteam/content/notes/2023/08/06/1691312975.md
Deploy Website / build (push) Successful in 22s Details
2023-08-06 10:09:35 +01:00
ravenscroftj 932b02f98a Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 23s Details
2023-08-05 20:05:41 +01:00
ravenscroftj af4d91bec8 Add brainsteam/content/notes/2023/08/05/1691261846.md
Deploy Website / build (push) Successful in 22s Details
2023-08-05 19:57:26 +01:00
James Ravenscroft 84829afe90 update in-reply-to
Deploy Website / build (push) Successful in 21s Details
2023-08-01 21:48:01 +01:00
James Ravenscroft 300c16028b Merge branch 'main' of ssh://thanos.rvns.xyz:222/ravenscroftj/brainsteam.co.uk
Deploy Website / build (push) Successful in 18s Details
2023-08-01 21:45:41 +01:00
James Ravenscroft a680faf250 update in-reply-to 2023-08-01 21:45:40 +01:00
ravenscroftj 296ca7f885 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 16s Details
2023-08-01 21:42:48 +01:00
ravenscroftj a4a429a5fd Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 16s Details
2023-08-01 21:42:37 +01:00
ravenscroftj d370ca4de5 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 16s Details
2023-08-01 21:42:07 +01:00
ravenscroftj e8420265e3 Update brainsteam/data/mentions.json
Deploy Website / build (push) Successful in 17s Details
2023-08-01 21:39:11 +01:00
James Ravenscroft 7415c31ab3 include replies in main feed
Deploy Website / build (push) Successful in 15s Details
2023-08-01 21:28:00 +01:00
ravenscroftj 379ff3048f Add brainsteam/content/replies/2023/08/01/1690921453.md
Deploy Website / build (push) Successful in 19s Details
2023-08-01 21:24:14 +01:00
James Ravenscroft 70c56f484f update post archtetype
Deploy Website / build (push) Successful in 28s Details
2023-08-01 17:36:48 +01:00
James Ravenscroft b582fd4656 add stress post 2023-08-01 17:36:40 +01:00
James Ravenscroft 01551fba3d add screenshot near top of post
Deploy Website / build (push) Successful in 15s Details
2023-07-30 15:51:13 +01:00
James Ravenscroft 25d0a6f973 correct type of post
Deploy Website / build (push) Successful in 15s Details
2023-07-30 15:49:37 +01:00
James Ravenscroft 7dcea01fa5 remove draft flag
Deploy Website / build (push) Successful in 15s Details
2023-07-30 15:45:09 +01:00
James Ravenscroft 1a8de4f885 remove draft flag
Deploy Website / build (push) Successful in 14s Details
2023-07-30 15:39:54 +01:00
James Ravenscroft ac33025fde addd telemetry bit
Deploy Website / build (push) Successful in 15s Details
2023-07-30 15:39:14 +01:00
James Ravenscroft 2410044161 add picgo post
Deploy Website / build (push) Successful in 15s Details
2023-07-30 15:36:50 +01:00
James Ravenscroft 08c3376943 replace dpeloy domain
Deploy Website / build (push) Successful in 19s Details
2023-07-30 12:12:33 +01:00
James Ravenscroft 610936befa update about and my work pages
Deploy Website / build (push) Has been cancelled Details
2023-07-30 12:08:26 +01:00
James Ravenscroft 7d2d5c221f fix layouts
Deploy Website / build (push) Failing after 4m29s Details
2023-07-23 20:58:24 +01:00
James Ravenscroft 6e671a7765 fix order of widgets
Deploy Website / build (push) Failing after 4m29s Details
2023-07-23 20:53:20 +01:00
James Ravenscroft ef9223b9a9 update config with socials
Deploy Website / build (push) Failing after 4m32s Details
2023-07-23 20:51:45 +01:00
James Ravenscroft a4621aceed update theme
Deploy Website / build (push) Failing after 5m2s Details
2023-07-23 20:50:43 +01:00
ravenscroftj 8c9d44db78 Update brainsteam/content/notes/2023/07/03/1688419112.md
Deploy Website / build (push) Successful in 23s Details
2023-07-09 15:45:22 +01:00
ravenscroftj b661f29d7d Update brainsteam/content/notes/2023/07/09/1688912402.md
Deploy Website / build (push) Successful in 20s Details
2023-07-09 15:26:36 +01:00
ravenscroftj a1579c70d8 Update brainsteam/content/notes/2023/07/09/1688912402.md
Deploy Website / build (push) Failing after 18s Details
2023-07-09 15:23:28 +01:00
ravenscroftj 53dd9832e8 Add brainsteam/content/notes/2023/07/09/1688912402.md
Deploy Website / build (push) Successful in 19s Details
2023-07-09 15:20:03 +01:00
James Ravenscroft 38812bd1ef update thumb from talk
Deploy Website / build (push) Successful in 18s Details
2023-07-09 14:53:19 +01:00
James Ravenscroft 7f0d831f6a update config file
Deploy Website / build (push) Failing after 16s Details
2023-07-09 14:50:50 +01:00
James Ravenscroft 68b2a8832b some content tweaks
Deploy Website / build (push) Successful in 20s Details
2023-07-09 14:50:28 +01:00
James Ravenscroft a55ee2fed4 pull latest mainroad
Deploy Website / build (push) Successful in 22s Details
2023-07-09 14:50:15 +01:00
ravenscroftj b49d60284f Merge pull request 'newtheme' (#4) from newtheme into main
Deploy Website / build (push) Successful in 23s Details
Reviewed-on: #4
2023-07-09 14:48:59 +01:00
ravenscroftj 2d4ec85266 Add brainsteam/content/notes/2023/07/03/1688419112.md
Deploy Website / build (push) Successful in 30s Details
2023-07-03 22:18:32 +01:00
199 changed files with 13887 additions and 4085 deletions

View File

@ -8,18 +8,16 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- name: check out repo
uses: actions/checkout@v3
uses: https://gitea.com/actions/checkout@v3
#uses: actions/checkout@v3
# - name: install python+pip
# run: |
# apt-get update -y
# apt-get install -y python3 python3-pip
# - name: setup bstools
# run: pip install --index-url https://git.jamesravey.me/api/packages/ravenscroftj/pypi/simple/ bstools
- name: Deploy Site
run: |
mkdir -p ~/.ssh/
@ -28,15 +26,13 @@ jobs:
echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts
ssh \
-i ~/.ssh/id_rsa \
-t james@newprobe.jamesravey.me \
"cd /data/applications/brainsteam.co.uk; git pull; cd brainsteam; ./build.sh"
-t james@noprobe.rvns.xyz \
"cd /home/james/brainsteam.co.uk; git pull; cd brainsteam; ./build.sh"
shell: bash
env:
SSH_PRIVATE_KEY: ${{secrets.SSH_KEY}}
SSH_KNOWN_HOSTS: ${{secrets.SSH_KNOWN_HOSTS}}
# - name: Deploy Notes
# run: |
# mkdir -p ~/.ssh/
@ -48,4 +44,3 @@ jobs:
# env:
# SSH_PRIVATE_KEY: ${{secrets.SSH_KEY}}
# SSH_KNOWN_HOSTS: ${{secrets.SSH_KNOWN_HOSTS}}

3
.gitmodules vendored
View File

@ -4,3 +4,6 @@
[submodule "brainsteam/themes/Mainroad"]
path = brainsteam/themes/Mainroad
url = ssh://git@git.jamesravey.me:222/ravenscroftj/Mainroad.git
[submodule "brainsteam/themes/plague"]
path = brainsteam/themes/plague
url = https://github.com/brianreumere/plague.git

View File

@ -3,8 +3,8 @@ title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: true
description: short summary
url: {{ time.Format "/2006/1/2/" .Date }}/{{.Name}}
type: post
url: {{ time.Format "/2006/1/2" .Date }}/{{.Name}}
type: posts
mp-syndicate-to:
- https://brid.gy/publish/mastodon
- https://brid.gy/publish/twitter

2
brainsteam/build.sh Normal file → Executable file
View File

@ -1,2 +1,2 @@
#!/bin/bash
docker run --rm -it -v `pwd`:/src -u $UID:$GID klakegg/hugo
hugo

View File

@ -2,12 +2,19 @@ baseURL = "https://brainsteam.co.uk/"
languageCode = "en-us"
title = "Brainsteam"
#theme='hugo-ink'
theme='Mainroad'
#theme='Mainroad'
theme='plague'
paginate=10
disqusShortname = "brainsteam"
copyright = "© James Ravenscroft"
[module]
[[module.imports]]
disable = false
ignoreConfig = false
ignoreImports = true
path = 'plague' # Theme
pygmentsstyle = "vs"
@ -31,31 +38,78 @@ post_meta = ["author", "date", "categories", "translations"] # Order of post met
[markup.goldmark.renderer]
unsafe= true
[Params]
summaryLength=50
[params]
authorbox= true
subtitle = "Digital Home of James Ravenscroft Machine Learning and NLP specialist and software generalist"
avatar = "/images/avatar_small.png"
favicon = "/images/favicon.png"
mainSections = ["post","note","reply","like","repost","bookmark", "watch"]
[Author] # Used in authorbox
name = "James Ravenscroft"
bio = "James is an NLP and Machine Learning specialist and software generalist, currently CTO at Filament and previously an IBMer"
avatar = "img/avatar.png"
[Params.Logo]
image = "/images/avatar_small.png"
siteHeaderText = "Brainsteam"
siteFooterText = "Powered by [Hugo](https://gohugo.io/) and the [plague](https://github.com/brianreumere/plague) theme."
[Params.sidebar]
home = "right" # Configure layout for home page
list = "right" # Configure layout for list pages
single = false # Configure layout for single pages
# Enable widgets in given order
widgets = ["search", "recent", "categories", "taglist", "social", "languages"]
# subtitle = "Digital Home of James Ravenscroft Machine Learning and NLP specialist and software generalist"
# avatar = "/images/avatar_small.png"
# favicon = "/images/avatar_small.png"
# copyright = "James Ravenscroft"
recentSections = ["posts"]
colors = "default"
#mainSections = ["posts","notes","replies","likes","reposts","bookmarks", "watches"]
mainSections = ["posts"]
[params.hcard]
avatar = "images/avatar_small.png"
fullName = "James Ravenscroft"
pronouns = ["he", "him"]
nickname = "jamesravey"
city = "Portsmouth"
region = "Hants"
country = "United Kingdom"
showLocation = true
social = [
{ platform = "github", identity = "ravenscroftj", url_pattern = "https://github.com/%s" },
{ platform = "mastodon", identity = "jamesravey", url_pattern = "https://fosstodon.org/%s"},
{ platform = "bluesky", identity = "jamesravey", url_pattern = "https://bsky.app/profile/%s"}
]
# [Author] # Used in authorbox
# name = "James Ravenscroft"
# bio = "James is an NLP and Machine Learning specialist and software generalist, currently CTO at Filament and previously an IBMer"
# avatar = "/images/avatar.png"
# [Params.Logo]
# image = "/images/avatar_small.png"
# [Params.sidebar]
# home = "right" # Configure layout for home page
# list = "right" # Configure layout for list pages
# single = false # Configure layout for single pages
# # Enable widgets in given order
# widgets = ["search", "recent", "types", "social", "categories", "taglist", "languages"]
# [Params.widgets.social]
# # Enable parts of social widget
# #facebook = "username"
# #twitter = "username"
# #instagram = "username"
# #linkedin = "username"
# #telegram = "username"
# github = "ravenscroftj"
# mastodon = "https://fosstodon.org/@jamesravey"
# #gitlab = "username"
# #bitbucket = "username"
# #email = "example@example.com"
[[menu.main]]
name = "Home"
@ -69,19 +123,14 @@ weight = 2
[[menu.main]]
name = "About Me"
url = "/pages/about"
name = "Notes"
url = "/notes/"
weight = 3
[[menu.main]]
name = "Web Activity"
url = "/webfeed"
weight = 4
[[menu.main]]
name = "My Work"
url = "/pages/my-work"
name = "Links"
url = "/bookmarks/"
weight = 5
[[menu.main]]
@ -90,26 +139,6 @@ url = "/search"
weight = 6
[[params.social]]
name = "Twitter"
icon = "twitter"
url = "https://twitter.com/jamesravey/"
[[params.social]]
name = "Mastodon"
url ="https://fosstodon.org/@jamesravey"
icon = "message-circle"
[[params.social]]
name = "Github"
icon = "github"
url = "https://github.com/ravenscroftj"
[[params.social]]
name = "RSS"
icon = "rss"
url = "/pages/feeds/"
[taxonomies]
tag = "tags"

View File

@ -0,0 +1,16 @@
---
---
Welcome to the Digital Home of James Ravenscroft Machine Learning and NLP specialist and software generalist.
<img src="/images/avatar_small.png" style="max-width:250px;">
I am a Chief Technology Officer and Software Engineer specialising in Machine Learning and in particular, Natural Language Processing. I am an amateur musician, cook and photographer and I love to read fiction and watch box sets and movies. I live with my wife and cats in the south of England.
On this site you will find:
- A selection of [essays and long-form posts](/posts/) that I have written about software engineering, philosophy, machine learning and AI, and personal topics.
- A [microblog of shorter content](/notes/) in response to things that interest me, including some photos.
- [Links](/bookmarks/) to content that I've found and read along with my comments and responses.
You can find more of my thoughts and in-progress writing over on my [Digital Garden](https://notes.jamesravey.me)

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://glyph.twistedmatrix.com/2016/08/attrs.html
bookmark-of:
title: "Deciphering Glyph ::\n The One Python Library Everyone Needs\n "
url: https://glyph.twistedmatrix.com/2016/08/attrs.html
date: '2021-12-24T18:30:50.176573'
post_meta:
- date

View File

@ -1,5 +1,9 @@
---
bookmark-of: https://github.com/willmcgugan/textual
bookmark-of:
title: 'GitHub - Textualize/textual: The lean application framework for Python. Build
sophisticated user interfaces with a simple Python API. Run your apps in the terminal
and a web browser.'
url: https://github.com/willmcgugan/textual
date: '2021-12-24T18:26:50.352463'
post_meta:
- date

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://www.greatbritishchefs.com/how-to-cook/how-to-ice-a-christmas-cake
bookmark-of:
title: How to ice a Christmas cake - Great British Chefs
url: https://www.greatbritishchefs.com/how-to-cook/how-to-ice-a-christmas-cake
date: '2021-12-24T11:28:40.351129'
post_meta:
- date

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://bofh.org.uk/2020/05/12/oembed-for-hugo/
bookmark-of:
title: Adding a generic oembed handler for Hugo // Just a Summary
url: https://bofh.org.uk/2020/05/12/oembed-for-hugo/
date: '2021-12-31T08:27:03.780707'
mp-syndicate-to:
- https://brid.gy/publish/mastodon

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://misskey.bubbletea.dev/notes/8v0czo0b54
bookmark-of:
title: bubbletea.dev
url: https://misskey.bubbletea.dev/notes/8v0czo0b54
date: '2022-01-02T03:22:41.967918'
post_meta:
- date

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://wakatime.com/
bookmark-of:
title: WakaTime - Dashboards for developers
url: https://wakatime.com/
date: '2022-01-02T04:40:56.310877'
post_meta:
- date

View File

@ -1,5 +1,8 @@
---
bookmark-of: http://jalammar.github.io/illustrated-retrieval-transformer/
bookmark-of:
title: The Illustrated Retrieval Transformer Jay Alammar Visualizing machine
learning one concept at a time.
url: http://jalammar.github.io/illustrated-retrieval-transformer/
date: '2022-01-03T12:50:55.571137'
mp-syndicate-to:
- https://brid.gy/publish/mastodon

View File

@ -1,5 +1,8 @@
---
bookmark-of: https://www.theguardian.com/culture/2022/jan/05/thematically-richer-than-the-bible-what-i-learned-at-the-first-annual-boss-baby-symposium
bookmark-of:
title: 'Thematically richer than the Bible: what I learned at the first annual
Boss Baby symposium | The Boss Baby | The Guardian'
url: https://www.theguardian.com/culture/2022/jan/05/thematically-richer-than-the-bible-what-i-learned-at-the-first-annual-boss-baby-symposium
date: '2022-01-05T01:35:14.779242'
mp-syndicate-to:
- https://brid.gy/publish/mastodon

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://www.bookstackapp.com/#features
bookmark-of:
title: "\n BookStack\n "
url: https://www.bookstackapp.com/#features
date: '2022-01-08T10:15:22.304952'
post_meta:
- date

View File

@ -1,5 +1,8 @@
---
bookmark-of: https://github.com/goldbergyoni/nodebestpractices
bookmark-of:
title: 'GitHub - goldbergyoni/nodebestpractices: :white_check_mark: The Node.js
best practices list (July 2024)'
url: https://github.com/goldbergyoni/nodebestpractices
date: '2022-01-08T04:15:15.481865'
post_meta:
- date

View File

@ -1,5 +1,10 @@
---
bookmark-of: https://github.com/BoltzmannEntropy/interviews.ai
bookmark-of:
title: 'GitHub - BoltzmannEntropy/interviews.ai: It is my belief that you, the postgraduate
students and job-seekers for whom the book is primarily meant will benefit from
reading it; however, it is my hope that even the most experienced researchers
will find it fascinating as well.'
url: https://github.com/BoltzmannEntropy/interviews.ai
date: '2022-01-10T14:14:15.259058'
post_meta:
- date

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://firepad.io/
bookmark-of:
title: Firepad - An open source collaborative code and text editor
url: https://firepad.io/
date: '2022-01-16T15:41:43.969974'
post_meta:
- date

View File

@ -1,5 +1,8 @@
---
bookmark-of: https://blog.ipfs.io/2021-11-03-understanding-fundamentals-of-ipfs/
bookmark-of:
title: Understanding the Three Fundamental Principles of How IPFS Works | IPFS Blog
& News
url: https://blog.ipfs.io/2021-11-03-understanding-fundamentals-of-ipfs/
date: '2022-01-16T15:36:20.515274'
post_meta:
- date

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://copyq.readthedocs.io/en/latest/
bookmark-of:
title: Welcome to CopyQs documentation! — CopyQ documentation
url: https://copyq.readthedocs.io/en/latest/
date: '2022-01-17T14:31:06.263731'
post_meta:
- date

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://www.focalboard.com/
bookmark-of:
title: ' Focalboard: Open source alternative to Trello, Asana, and Notion'
url: https://www.focalboard.com/
date: '2022-01-21T11:28:22.135830'
post_meta:
- date

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://github.com/MathieuCayssol/Item2Vec
bookmark-of:
title: GitHub - MathieuCayssol/Item2Vec
url: https://github.com/MathieuCayssol/Item2Vec
date: '2022-01-21T02:22:27.643325'
post_meta:
- date

View File

@ -1,5 +1,8 @@
---
bookmark-of: https://github.com/singlesourcepub/community
bookmark-of:
title: 'GitHub - singlesourcepub/community: A community site around scholarly single
source publishing #SiSoPub'
url: https://github.com/singlesourcepub/community
date: '2022-01-28T08:35:18.299464'
post_meta:
- date

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://github.com/DaveGamble/cJSON
bookmark-of:
title: 'GitHub - DaveGamble/cJSON: Ultralightweight JSON parser in ANSI C'
url: https://github.com/DaveGamble/cJSON
date: '2022-02-13T03:24:54.251596'
post_meta:
- date

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://github.com/GuLinux/ScreenRotator
bookmark-of:
title: 'GitHub - GuLinux/ScreenRotator: Automatic screen rotation daemon for X11'
url: https://github.com/GuLinux/ScreenRotator
date: '2022-02-24T06:12:56.713087'
post_meta:
- date

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://search.marginalia.nu/explore/random
bookmark-of:
title: Marginalia Search - browse:random
url: https://search.marginalia.nu/explore/random
date: '2022-03-04T06:11:42.697613'
post_meta:
- date

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://lapce.dev/#downloads-all
bookmark-of:
title: Lapce
url: https://lapce.dev/#downloads-all
date: '2022-03-17T04:04:00.893398'
post_meta:
- date

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://flower.dev/
bookmark-of:
title: 'Flower: A Friendly Federated Learning Framework'
url: https://flower.dev/
date: '2022-03-28T16:25:56.008046'
post_meta:
- date

View File

@ -1,5 +1,7 @@
---
bookmark-of: http://webseitz.fluxent.com/wiki/HowWillKeepingANotebookHelpYouHackYourLife
bookmark-of:
title: "\n\n\tHow Will Keeping A Notebook Help You Hack Your Life - \n\nWebSeitz/wiki\n"
url: http://webseitz.fluxent.com/wiki/HowWillKeepingANotebookHelpYouHackYourLife
date: '2022-04-01T12:07:45.854807'
post_meta:
- date

View File

@ -1,5 +1,8 @@
---
bookmark-of: https://github.com/MaggieAppleton/digital-gardeners
bookmark-of:
title: 'GitHub - MaggieAppleton/digital-gardeners: Resources, links, projects, and
ideas for gardeners tending their digital notes on the public interwebs'
url: https://github.com/MaggieAppleton/digital-gardeners
date: '2022-04-01T12:08:15.893717'
post_meta:
- date

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://github.com/tensorflow/models/tree/master/official/projects/token_dropping
bookmark-of:
title: models/official/projects/token_dropping at master · tensorflow/models · GitHub
url: https://github.com/tensorflow/models/tree/master/official/projects/token_dropping
date: '2022-04-02T01:25:42.935585'
post_meta:
- date

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://www.mrmoneymustache.com/2022/05/20/2022-stock-market-crash/?utm_source=mmmapp&utm_medium=mmmapp&utm_content=browser
bookmark-of:
title: Finally, a Stock Market Crash!
url: https://www.mrmoneymustache.com/2022/05/20/2022-stock-market-crash/?utm_source=mmmapp&utm_medium=mmmapp&utm_content=browser
date: '2022-05-22T15:44:28.367599'
post_meta:
- date

View File

@ -1,5 +1,7 @@
---
bookmark-of: https://allenpike.com/2022/giving-a-shit
bookmark-of:
title: Giving a Shit as a Service - Allen Pike
url: https://allenpike.com/2022/giving-a-shit
date: '2022-07-12T15:35:39.969101'
post_meta:
- date

View File

@ -1,5 +1,8 @@
---
bookmark-of: https://news.ycombinator.com/item?id=32149989
bookmark-of:
title: 'Show HN: I made some ambient music generators that run in your browser |
Hacker News'
url: https://news.ycombinator.com/item?id=32149989
date: '2022-07-19T10:21:01.008429'
post_meta:
- date

View File

@ -0,0 +1,21 @@
---
bookmark-of:
title: My Reading Philosophy in 17 Guidelines Tracy Durnell's Mind Garden
url: https://tracydurnell.com/2023/08/19/my-reading-philosophy-and-17-reading-guidelines/
date: '2023-08-20T19:09:20.357609'
post_meta:
- date
tags:
- reading
title: Reading Philosophy and 17 Reading Guidelines
type: bookmarks
url: /bookmarks/2023/08/20/reading-philosophy-and-17-reading-guidelines1692558560
---
I love this post by Tracy. I think that it's easy to fall into the trap of "I've started so I'll finish" as a badge of honour when it comes to books, even when I'm not enjoying them any more.
I also echo the sentiment about knowing what you like. Whilst I enjoy a good pop-sci non fiction book, biographies trigger my "air raid siren".
I also like having multiple non fiction books on the go whilst I power through one good story.
Reading what you want, when you want is also a great directive. I find that if I'm feeling industrious, I might want to sit and make notes on a non fic but sometimes if I'm tired or anxious (e.g. Sunday scaries), a good story is great escapism.

View File

@ -0,0 +1,19 @@
---
bookmark-of: https://herbertlui.net/the-squeeze/
date: '2023-08-29T05:34:58.819512'
post_meta:
- date
tags:
- enshittification
- business
title: The squeeze - Herbert Lui
type: bookmarks
url: /bookmarks/2023/08/29/the-squeeze-herbert-lui1693287298
---
Herbert writes about companies squeezing good deals once they've lured enough customers in (aka enshittification)
> You can bet that the better a deal sounds, the more likely its temporary. The company is going to squeeze at some point
As an end customer, make hay while the sun shines and look out for good deals but also take heed of anything that could prevent you from leaving when something goes south. That could be as explicit as an in-contract price hikes or simply a lack of interoperability that would make you think twice about leaving a service after all the time and effort you put in to organising your siloed information.

View File

@ -0,0 +1,23 @@
---
bookmark-of:
title: Elegant and powerful new result that seriously undermines large language
models
url: https://garymarcus.substack.com/p/elegant-and-powerful-new-result-that
date: '2023-09-25T07:45:30.033651'
post_meta:
- date
tags:
- llms
- ai
title: Elegant and powerful new result that seriously undermines large language models
type: bookmarks
url: /bookmarks/2023/09/25/elegant-and-powerful-new-result-that-seriously-undermines-large-language-models1695627930
---
Gary's article dropped on Friday and has been widely circulated and commented upon over the weekend.
It shows that LLMs struggle to generalise outside of their prompt (they know that Tom Cruise's mum is Mary Lee Pfeifer but don't know that Mary Lee Pfeiffer's son is Tom Cruise - but there are many more examples). This is a known weakness of neural networks that I wrote about in my [EACL2021 paper](https://aclanthology.org/2021.eacl-main.21.pdf) and that has previously been documented as far back as the 90s. What's interesting is that it still holds today for these massive models with billions of parameters.
For me, the message here isn't "LLMs aren't intelligent so let's write them off as a technology" but rather it's more evidence that they're a powerful and yet limited tool in our arsenal and that they're not a silver bullet. It vindicates and validates approaches that combine technologies to get to the desired output (for example, pairing an LLM with a graph database could help with the mum/son thing).
For me this is a stake in the heart for the whole " there's the spark of general intelligence there" argument too. I find these kinds of probing/diagnostic tests done on models really interesting too.

View File

@ -0,0 +1,19 @@
---
categories:
- Personal
date: "2024-08-27 20:11:00"
draft: true
tags: [indiehacking, entrepeneurship]
title:
Bookmarked https://phrack.org/issues/71/17.html#article. A primer on how hacking
mentality ...
type: bookmarks
---
<!-- wp:indieblocks/context -->
<div class="wp-block-indieblocks-context"><i>Bookmarked <a class="u-bookmark-of" href="https://phrack.org/issues/71/17.html#article">https://phrack.org/issues/71/17.html#article</a>.</i></div>
<!-- /wp:indieblocks/context -->
<!-- wp:group {"className":"e-content"} -->
<div class="wp-block-group e-content"><!-- wp:freeform --><p>A primer on how hacking mentality can be applied to business</p>
<!-- /wp:freeform --></div>
<!-- /wp:group -->

View File

@ -0,0 +1,16 @@
---
categories:
- Engineering Leadership
- Software Development
date: "2024-09-04 12:06:18"
draft: false
tags: []
title: Bookmarked The Art of Finishing | ByteDrum by ...
type: bookmarks
---
<!-- wp:indieblocks/bookmark {"empty":false} -->
<div class="wp-block-indieblocks-bookmark"><div class="u-bookmark-of h-cite"><p><i>Bookmarked <a class="u-url p-name" href="https://www.bytedrum.com/posts/art-of-finishing/">The Art of Finishing | ByteDrum</a> by <span class="p-author">Tomas Stropus</span>.</i></p></div><div class="e-content"><!-- wp:paragraph -->
<p>An incredibly relatable essay with a lot of sensible advice and suggestions for issues I struggle with. I think I'm getting better at shipping MVPs but the hard bit is not getting distracted by new shiny ideas when you get stuck with something else. This philosophy is in direct opposition to <a href="https://tilde.town/~dozens/sofa/">the SOFA principle</a>.</p>
<!-- /wp:paragraph --></div></div>
<!-- /wp:indieblocks/bookmark -->

View File

@ -0,0 +1,28 @@
---
categories:
- AI and Machine Learning
- Software Development
date: "2024-09-04 16:01:51"
draft: false
tags:
- AI
- database
- postgresql
- vectors
title: Bookmarked Where does Postgres fit in a world ...
type: bookmarks
---
<!-- wp:indieblocks/bookmark {"empty":false} -->
<div class="wp-block-indieblocks-bookmark"><div class="u-bookmark-of h-cite"><p><i>Bookmarked <a class="u-url p-name" href="https://stackoverflow.blog/2024/08/27/postgres-genai-vector-databases-timescale-open-source-db/">Where does Postgres fit in a world of GenAI and vector databases? - Stack Overflow</a>.</i></p></div><div class="e-content"><!-- wp:paragraph -->
<p>The title and framing of this talk are weird and it's bugging me</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>The question could be paraphrased as "why would we need to efficiently store and retrieve data in a deterministic way when we have GenAI?" This is like asking "why do we need cars when we have speedboats?" or "Why do we need butter knives now that we've invented the chainsaw?".</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>The actual subject matter is "PostgreSQL with a couple of plugins can do pretty good nearest neighbour search". I've long been a big fan of Postgres. You probably don't need separate vector database engines, you can just <a href="https://www.amazingcto.com/postgres-for-everything/">use postgres for everything</a>.</p>
<!-- /wp:paragraph --></div></div>
<!-- /wp:indieblocks/bookmark -->

View File

@ -0,0 +1,21 @@
---
bookmark-of: https://reclaim-the-stack.com/
date: '2024-09-09T13:09:06.855883'
post_meta:
- date
tags:
- devops
- paas
title: Reclaim The Stack
type: bookmarks
url: /bookmarks/2024/09/09/reclaim-the-stack1725887346
---
Another self-hosted paas type platform similar to [Dokku](https://dokku.com/) and [Coolify](https://coolify.io/).
An interesting distinction is that RtS seems to specifically use kubernetes orchestration whereas Dokku and Coolify tend to prefer docker. Since kubernetes is on my list to dive into a little bit more.
I've started a [digital garden page](https://notes.jamesravey.me/Software/Reclaim-The-Stack) about it for taking notes.

View File

@ -0,0 +1,13 @@
---
categories: []
date: '2023-12-04 14:29:00'
draft: false
tags: []
title: Likes https://snarfed.org/2023-12-03_51578 by Ryan Barrett.
type: likes
---
<!-- wp:indieblocks/like -->
<div class="wp-block-indieblocks-like"><div class="u-like-of h-cite"><p><i>Likes <a class="u-url" href="https://snarfed.org/2023-12-03_51578">https://snarfed.org/2023-12-03_51578</a> by <span class="p-author">Ryan Barrett</span>.</i></p></div>
</div>
<!-- /wp:indieblocks/like -->

View File

@ -0,0 +1,12 @@
---
categories: []
date: '2023-12-26 19:24:00'
draft: false
tags: []
title: "Likes Indiewebifying a WordPress Site \u2013 2023 Edition ..."
type: likes
---
<!-- wp:indieblocks/like -->
<div class="wp-block-indieblocks-like"><div class="u-like-of h-cite"><p><i>Likes <a class="u-url p-name" href="https://david.shanske.com/2023/12/19/indiewebifying-a-wordpress-site-2023-edition/">Indiewebifying a WordPress Site 2023 Edition</a> by <span class="p-author">David Shanske</span>.</i></p></div></div>
<!-- /wp:indieblocks/like -->

View File

@ -0,0 +1,12 @@
---
categories: []
date: '2023-12-29 10:05:00'
draft: true
tags: []
title: "Likes The Web is Fantastic \u2022 Robb Knight."
type: likes
---
<!-- wp:indieblocks/like -->
<div class="wp-block-indieblocks-like"><div class="u-like-of h-cite"><p><i>Likes <a class="u-url p-name" href="https://rknight.me/blog/the-web-is-fantastic/">The Web is Fantastic • Robb Knight</a>.</i></p></div></div>
<!-- /wp:indieblocks/like -->

View File

@ -0,0 +1,13 @@
---
categories: []
date: '2024-08-27 22:31:00'
draft: false
tags: []
title: Likes Productivity gains in Software Development through AI ...
type: likes
---
<!-- wp:indieblocks/like -->
<div class="wp-block-indieblocks-like"><div class="u-like-of h-cite"><p><i>Likes <a class="u-url p-name" href="https://tante.cc/2024/08/27/5312/">Productivity gains in Software Development through AI</a> by <span class="p-author">tante</span>.</i></p></div>
</div>
<!-- /wp:indieblocks/like -->

View File

@ -4,6 +4,7 @@ mp-syndicate-to:
- https://brid.gy/publish/mastodon
photo:
- /media/2023/04/21/1682060700_0.jpg
thumbnail: /media/2023/04/21/1682060700_0.jpg
post_meta:
- date
tags:

View File

@ -4,6 +4,7 @@ mp-syndicate-to:
- https://brid.gy/publish/mastodon
photo:
- /media/2023/06/03/1685811118_0.jpg
thumbnail: https://brainsteam.co.uk/media/2023/06/03/1685811118_0.jpg
post_meta:
- date
tags:

View File

@ -1,19 +1,18 @@
---
date: '2023-06-19T21:44:34.280750'
date: "2023-06-19T21:44:34.280750"
mp-syndicate-to:
- https://brid.gy/publish/mastodon
- https://brid.gy/publish/mastodon
photo:
- https://brainsteam.co.uk/media/2023/06/19/1687211074_0.jpg
- url: https://brainsteam.co.uk/media/2023/06/19/1687211074_0.jpg
alt: a tiny mouse staring through the bars of a humane trap next to a large pile of peanut butter
post_meta:
- date
- date
tags:
- personal
- humour
- personal
- humour
thumbnail: https://brainsteam.co.uk/media/2023/06/19/1687211074_0.jpg
type: notes
url: /notes/2023/06/19/1687211074
---
<img src="/media/2023/06/19/1687211074_0.jpg" alt="a tiny mouse staring through the bars of a humane trap next to a large pile of peanut butter" class="u-photo" />
Had a run in with this little guy this morning. He's been living in our garage eating bird seed out of a sack I bought for our bird feeders for a few weeks. I set up infrared cameras and humane traps and I've been watching him scurrying around cutely at night.we released him into a hedgerow next to a big field this morning and I'm kind of going to miss him.
Had a run in with this little guy this morning. He's been living in our garage eating bird seed out of a sack I bought for our bird feeders for a few weeks. I set up infrared cameras and humane traps and I've been watching him scurrying around cutely at night.we released him into a hedgerow next to a big field this morning and I'm kind of going to miss him.

View File

@ -0,0 +1,14 @@
---
date: '2023-07-03T21:18:32.453462'
post_meta: ["date"]
tags:
- personal
- gaming
type: notes
url: /notes/2023/07/03/1688419112
---
Started playing [Tiny Life]( https://store.steampowered.com/app/1651490/Tiny_Life/), an isometric pixel art remake of The Sims 1 which is still in early access on steam but is already amazingly rounded out and cute. Getting some serious nostalgia vibes. Highly recommended.

View File

@ -0,0 +1,13 @@
---
date: "2023-07-09T14:20:02.886483"
post_meta: ["date"]
photo:
- https://brainsteam.co.uk/media/2023/07/09/1688912402_0.jpg
tags:
- personal
thumbnail: https://brainsteam.co.uk/media/2023/07/09/1688912402_0.jpg
type: notes
url: /notes/2023/07/09/1688912402
---
Welcome to my new look website. I've spent my Sunday morning getting the site looking nice and setting up webmentions. I'm now just testing that I can still make new posts

View File

@ -0,0 +1,17 @@
---
date: '2023-08-05T18:57:26.159573'
mp-syndicate-to:
- https://brid.gy/publish/mastodon
post_meta:
- date
tags:
- movies
- thoughts
- ai
type: notes
url: /notes/2023/08/05/1691261846
---
Went to see Mission Impossible Dead Reckoning. It was ok as a cheesy action film. The AI storyline was a bit irksome but there was a bit where everyone went "yeah the biggest problem is gonna be who ends up controlling this AI and how they use it" and I was like "yea..."
<a href="https://brid.gy/publish/mastodon"></a>

View File

@ -0,0 +1,19 @@
---
date: "2023-08-06T09:09:35.376904"
mp-syndicate-to:
- https://brid.gy/publish/mastodon
photo:
- /media/2023/08/06/1691312975_0.jpg
post_meta:
- date
tags:
- personal
thumbnail: /media/2023/08/06/1691312975_0.jpg
type: notes
url: /notes/2023/08/06/1691312975
---
<img src="/media/2023/08/06/1691312975_0.jpg" alt="James walking along a beach wearing sunglasses. the sky is clear and blue." class="u-photo" />
a quick walk along Lee-on-the-Solent beach to burn some morning lark energy this morning
<a href="https://brid.gy/publish/mastodon"></a>

View File

@ -0,0 +1,13 @@
---
date: '2023-08-26T22:03:53.234301'
post_meta:
- date
tags:
- movies
- personal
type: notes
url: /notes/2023/08/26/1693087433
---
Just got back from watching The Meg 2. It got really bad reviews on pretty much every major review site so I was expecting it to be just plain bad but, like the first movie, it was so-bad-its-good. Statham was on form and some of the one liners were great. I'd highly recommend it to folks who like cheesy action flicks.

View File

@ -0,0 +1,15 @@
---
categories:
- Personal
date: "2023-12-04 12:39:00"
draft: false
photo:
- url: /media/1701693562222_d752939e.jpg
alt: a british shorthair cat in a bin
tags:
- caturday
title: It was lovely to visit my parents over ...
type: notes
---
<div class="e-content">It was lovely to visit my parents over the weekend and say hi to my dad's naughty cat Bertie who decided to climb into the kitchen bin for a photo op</div>

View File

@ -0,0 +1,12 @@
---
categories:
- Personal
date: '2023-12-20 17:55:00'
draft: false
tags: []
title: Feeling handy after fixing an airlock in our ...
type: notes
---
<!-- wp:freeform --><p>Feeling handy after fixing an airlock in our heating system by painstakingly standing with a bucket and draining water out of a radiator until it started hissing and cursing like a scene out of The Exorcist. Phew, no need to call out a plumber after all! #SmallWin</p>
<!-- /wp:freeform -->

View File

@ -0,0 +1,18 @@
---
categories:
- Personal
date: '2023-12-20 11:46:37'
draft: false
tags:
- music
title: I spent some time updating my digital garden ...
type: notes
---
<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>I spent some time updating <a href="https://wiki.jamesravey.me/books/seed-propagator/page/music">my digital garden page on music</a> with some bands that I recommend. My taste is somewhat eclectic so you have been warned!</p>
<!-- /wp:paragraph -->

View File

@ -0,0 +1,35 @@
---
categories:
- Personal
date: "2023-12-21 15:26:00"
tags:
- trips
title: Took a trip out to Koh Thai at ...
type: notes
---
<!-- wp:paragraph -->
<p>Took a trip out to Koh Thai at Port Solent for lunch for Mrs R's birthday</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Restaurant was lovely and the food was top notch. I especially enjoyed the spice ratings on the menu from a little tingle up to life changing</p>
<!-- /wp:paragraph -->
<!-- wp:gallery {"linkTo":"none"} -->
<figure class="wp-block-gallery has-nested-images columns-default is-cropped"><!-- wp:image {"id":1082,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="/media/1703172369782-e1703173142457-771x1024_1eede797.jpg" alt="an excerpt from a menu with a spice rating scale from slightly tingly to life changing" class="wp-image-1082"/></figure>
<!-- /wp:image -->
<!-- wp:image {"id":1083,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="/media/1703172369910-771x1024_96af34a6.jpg" alt="a photo of a green thai curry" class="wp-image-1083"/></figure>
<!-- /wp:image -->
<!-- wp:image {"id":1081,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="/media/1703172369661-1024x771_4de5a766.jpg" alt="a tastefully decorated restaurant" class="wp-image-1081"/></figure>
<!-- /wp:image -->
<!-- wp:image {"id":1080,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="/media/1703172369518-771x1024_83558535.jpg" alt="James sat in a restaurant smiling" class="wp-image-1080"/></figure>
<!-- /wp:image --></figure>
<!-- /wp:gallery -->

View File

@ -0,0 +1,17 @@
---
categories:
- Software Development
date: '2023-12-22 13:50:34'
draft: false
tags: []
title: I was pretty horrified to be greeted by ...
type: notes
---
<!-- wp:image {"id":1125,"width":"645px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="/media/image-6_ee0053ab.png" alt="" class="wp-image-1125" style="width:645px;height:auto"/></figure>
<!-- /wp:image -->
<!-- wp:paragraph -->
<p>I was pretty horrified to be greeted by this message whilst running #ubuntu today. I've always enjoyed Ubuntu as a distro that "just works" but I'm starting to get pretty frustrated with Canonical #enshittifying the experience over time. Thinking about jumping back to Mint or possibly #fedora - I think #arch is too high maintenance.</p>
<!-- /wp:paragraph -->

View File

@ -0,0 +1,15 @@
---
categories: []
date: "2023-12-24 15:13:00"
draft: false
photo:
- url: /media/1703430793977_a7199d9c.jpg
alt: "An Irish coffee in a festive mug in front of a gaggia coffee machine"
tags:
- coffee
- drinks
title: Drinking Irish coffee with Jonnie Walker whisky and ...
type: notes
---
<p>Drinking Irish coffee with Jonnie Walker whisky and HICS coffee beans</p>

View File

@ -0,0 +1,18 @@
---
categories: []
date: "2023-12-26 08:45:00"
draft: false
tags:
- coffee
- drinks
title: Drinking HICS El Salvador blend coffee Smooth medium ...
photo:
- url: /media/1703580025838_8188525b.jpg
alt: a bag of coffee in a person's hand
type: notes
---
<!-- wp:freeform --><p>Drinking HICS El Salvador blend coffee</p>
<p>Smooth medium roast</p>
<!-- /wp:freeform -->

View File

@ -0,0 +1,14 @@
---
categories:
- Personal
date: "2023-12-31 12:55:00"
draft: false
photo:
- url: /media/1704027302456_a403ee18.jpg
alt: A standing desk with a couple of monitors and a light on it in an office room with blue walls
tags: []
title: New year, new desk
type: notes
---
New year, new desk

View File

@ -0,0 +1,24 @@
---
categories:
- Personal
date: "2024-01-01 21:15:00"
draft: false
tags:
- movies
title: Today we saw Anyone But You, a romcom ...
type: notes
---
{{< youtube gbjdSlTHFts >}}
<!-- wp:paragraph -->
<p>Today we saw Anyone But You, a romcom starring Glen Powell and Sydney Sweet which was a retelling of much ado about nothing. The character names were a giveaway: Ben as in Benedict and Bea as in Beatrice. Overall it was a fun, silly film set in very scenic parts of Australia. The Aussie setting also meant that there was quite a lot of strong language used. It didn't take itself too seriously as the gag reel at the end showed.</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>I enjoyed it but it wasn't a masterpiece.</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>3.5/5</p>
<!-- /wp:paragraph -->

View File

@ -0,0 +1,14 @@
---
categories: []
date: "2024-01-11 07:03:00"
draft: false
tags:
- coffee
title: Drinking Volcano Island blend coffee from hics
type: notes
photo:
- url: /media/1704956520871_b891e6bc.jpg
alt: "a bag of coffee on a white counter top"
---
Drinking Volcano Island blend coffee from [hics](https://hics.biz)

View File

@ -0,0 +1,13 @@
---
categories: []
date: "2024-03-16 08:57:31"
draft: false
tags: []
title: Edinburgh castle with a touch of lens flare ...
type: notes
photo:
- url: /media/g5GRr39PRCR27dQd7R3OkgSCJqF2PRedQ0EWZXDU_98514577.jpg
alt: Edinburgh castle with a touch of lens flare from the street lighting
---
Edinburgh castle with a touch of lens flare #edinburgh #castle #streetlights

View File

@ -0,0 +1,13 @@
---
categories: []
date: "2024-05-04 10:30:20"
draft: false
tags: []
title: "home for the weekend, Passford House Hotel #newforest ..."
photo:
- url: /media/NTYJmS9XZBj16uCVrtdwGL38JE8Y6pOKs8NEmcFS_2129e733.jpg
alt: an old looking English country house with purple wisteria growing around it and the sun shining
type: notes
---
home for the weekend, Passford House Hotel #newforest #sunshine #countryhouse

View File

@ -0,0 +1,21 @@
---
categories:
- Personal
date: "2024-08-10 20:40:48"
draft: false
photo:
- url: /media/img-20240810-wa00012515327513561028989-768x1024_50a1ef11.jpg
alt: James and Daniel selfie looking at camera sat in the national library
tags:
- personal
title: It was lovely to head up to London ...
type: notes
---
<!-- wp:paragraph -->
<p>It was lovely to head up to London today to meet up with my friend and fellow NLP nerd Daniel. We spent some time discussing some ideas we had for side projects and talked in depth about how web development has become too complex and our desire to build new software with simple stacks with html templates and limited frontend code.</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>We spent quite a lot of time hanging out in the National Library where there's plenty of space to study and conspire over ideas and schemes. Daniel is something of a digital nomad so it's always nice to get some in-person time when possible. Unfortunately none of our contacts at the Alan Turning Institute were available to let us in today (I mean who can blame them, it's the weekend after all).</p>
<!-- /wp:paragraph -->

View File

@ -0,0 +1,13 @@
---
categories: []
date: "2024-08-18 08:08:12"
draft: false
tags: []
title: Had the pleasure of visiting Bletchley Park yesterday ...
type: notes
photo:
- url: /media/WxKAbJ8jLRAwF3iE1LmP3ISzYt5mIEyXgI3wiB2M_cc70c64a.jpg
alt: A statue of Alan Turing fashioned from slate set against a black and white photo of an office in Bletchley park
---
<p style="padding:10px;">Had the pleasure of visiting Bletchley Park yesterday to see where Alan Turing and many others did amazing work on early computers and cryptanalysis. As a computer scientist it has been on my bucket list for a really long time so I'm glad to have finally gotten around to it. The bombe machines were fascinating. Mechanical machines (not computers as they were not general purpose/programmable) that brute forced enigma code cyphers by trying different combinations of circuits. They could try 37k combinations in 12 minutes. <a href="https://pixelfed.social/discover/tags/BletchleyPark?src=hash" title="#BletchleyPark" class="u-url hashtag" rel="external nofollow noopener">#BletchleyPark</a> <a href="https://pixelfed.social/discover/tags/AlanTuring?src=hash" title="#AlanTuring" class="u-url hashtag" rel="external nofollow noopener">#AlanTuring</a> <a href="https://pixelfed.social/discover/tags/computers?src=hash" title="#computers" class="u-url hashtag" rel="external nofollow noopener">#computers</a></p>

View File

@ -0,0 +1,14 @@
---
categories:
- Personal
date: "2024-08-27 20:09:00"
draft: false
tags: []
title: Breakfast with a view during our stay in ...
type: notes
photo:
- url: "/media/1724785714404_26e2b97f.jpg"
alt: "a bowl of cereal and coffee in the foreground and a view out over a park and sunrise"
---
Breakfast with a view during our stay in Milton Keynes after visiting Bletchley Park

View File

@ -0,0 +1,16 @@
---
categories: []
date: '2024-08-27 22:30:00'
draft: false
tags:
- AI
- hype
title: Productivity gains in Software Development through AI
type: notes
---
<!-- wp:indieblocks/bookmark {"empty":false} -->
<div class="wp-block-indieblocks-bookmark"><div class="u-bookmark-of h-cite"><p><i>Bookmarked <a class="u-url p-name" href="https://tante.cc/2024/08/27/5312/">Productivity gains in Software Development through AI</a> by <span class="p-author">tante</span>.</i></p></div>
<div class="e-content"><!-- wp:freeform --><p>A fairly good rebuttal of the 4500 hours saved piece by Amazon - I had some similar thoughts.</p>
<!-- /wp:freeform --></div></div>
<!-- /wp:indieblocks/bookmark -->

View File

@ -0,0 +1,14 @@
---
categories:
- Personal
date: "2024-08-30 23:27:00"
draft: false
tags: [personal]
photo:
- url: /media/1725056765290_632449d8.jpg
alt: A picture of a beautiful golden sunset over the motorway as photographed from inside a car.
title: The sunset was beautiful today as we drove ...
type: notes
---
<p>The sunset was beautiful today as we drove up north to visit my family for the weekend. </p>

View File

@ -0,0 +1,14 @@
---
categories:
- Personal
date: '2024-09-01 20:30:00'
draft: true
photo:
- url: /media/1725219019267_009ab453.jpg
tags: []
title: Long cat is long
type: notes
---
<!-- wp:freeform --><p>Long cat is long</p>
<!-- /wp:freeform -->

View File

@ -0,0 +1,13 @@
---
categories: []
date: '2024-09-01 20:45:00'
draft: true
photo:
- url: /media/1725219912483_55765ba2.jpg
tags: []
title: "Test Hidden: Snowdon Drive, Catisfield, HAM 19 \xB0C ..."
type: notes
---
<!-- wp:freeform --><p>Test</p>
<!-- /wp:freeform -->

View File

@ -0,0 +1,16 @@
---
date: '2024-09-08T16:54:25.320010'
mp-syndicate-to:
- https://brid.gy/publish/mastodon
post_meta:
- date
tags:
- personal
- website
type: notes
url: /notes/2024/09/08/1725814465
---
I'm trying out moving back to hugo and webmention stuff again. I was getting a bit frustrated with the bulk involved with wordpress.
<a href="https://brid.gy/publish/mastodon"></a>

View File

@ -0,0 +1,15 @@
---
categories:
- Personal
date: '2024-09-08 12:52:00'
draft: false
photo:
- url: /media/1725796327250_c8c555b4.jpg
tags:
- personal
title: Moody sky this morning on a walk along ...
type: notes
---
<!-- wp:freeform --><p>Moody sky this morning on a walk along the seafront in Lee on the Solent.</p>
<!-- /wp:freeform -->

View File

@ -0,0 +1,17 @@
---
date: '2024-09-09T09:14:43.658687'
mp-syndicate-to:
- https://brid.gy/publish/mastodon
post_meta:
- date
tags:
- ai
- hype
- llms
type: notes
url: /notes/2024/09/09/1725873283
---
So it's looking pretty bad for the creator of Reflection-70B who posted amazing results. Turns out they really were too good to be true. [it looks like they were proxying api requests to their model through to Anthropic](https://news.ycombinator.com/item?id=41484981). The AI space is full of fraudsters but if this is substantiated, it's the most brazen example I know of so far.
<a href="https://brid.gy/publish/mastodon"></a>

View File

@ -0,0 +1,17 @@
---
date: '2024-09-09T13:55:29.671927'
mp-syndicate-to:
- https://brid.gy/publish/mastodon
post_meta:
- date
tags:
- personal
- gaming
- music
type: notes
url: /notes/2024/09/09/1725890129
---
I started playing Hardspace Shipbreakers last night, it's a really fun space sim game which is quite relaxed and not too aggressie. However, the standout feature is definitely the soundtrack which is absolutely amazing americana/bluegrass style instrumental music https://www.youtube.com/watch?v=JxTyMVPaOXY
<a href="https://brid.gy/publish/mastodon"></a>

View File

@ -1,6 +1,6 @@
---
post_meta:
- date
- date
title: About Me
type: pages
url: /pages/about
@ -8,9 +8,9 @@ url: /pages/about
I'm James, I am a Chief Technology Officer and Software Engineer specialising in Machine Learning and in particular, Natural Language Processing. I am an amateur musician, cook and photographer and I love to read fiction and watch box sets and movies. I live with my wife and cats in the south of England.
- [What I do for work](#what-i-do-for-work)
- [What I do for fun](#what-i-do-for-fun)
- [What I'm up to right now](#what-im-up-to-right-now)
- [What I do for work](#what-i-do-for-work)
- [What I do for fun](#what-i-do-for-fun)
## What I'm up to right now
@ -18,18 +18,17 @@ I keep my [now](/now) page up to date with exactly where I'm at.
## What I do for work
- I've been freelancing and [building websites](https://web.archive.org/web/20051102052726/http://www.simssource.net/) since the mid 00s
- I started my full time career at IBM in 2011 in their [CICS transaction processing product](https://www.ibm.com/it-infrastructure/z/cics) before moving over to Watson where I was a customer-facing solutions architect which entailed helping other techies to use Watson APIs and services.
- In 2016 I left IBM to co-found [Filament AI](https://filament.ai), an AI & ML consultancy where I am currently CTO and Chief Data Scientist. I oversee and manage our technical roadmap and strategy, but I also keep my hands dirty and regularly deliver code for customers and for our products.
- I am also wrapping up my part-time PhD which I've been working on under the dual supervision of [Prof. Maria Liakata](https://www.turing.ac.uk/people/researchers/maria-liakata) at the [Alan Turing Institute](https://www.turing.ac.uk/) [Dr Amanda Clare](https://users.aber.ac.uk/afc/) at Aberystwth University (where I finished my BSc in 2013).
- My main academic affiliation is with [University of Warwick](https://warwick.ac.uk/fac/sci/dcs/) but, I often crash Turing events and, I've been known to visit Aberystwyth to give talks at careers events and departmental seminars.
- I've been freelancing and [building websites](https://web.archive.org/web/20051102052726/http://www.simssource.net/) since the mid 00s
- I started my full time career at IBM in 2011 in their [CICS transaction processing product](https://www.ibm.com/it-infrastructure/z/cics) before moving over to Watson where I was a customer-facing solutions architect which entailed helping other techies to use Watson APIs and services.
- In 2016 I left IBM to co-found [Filament AI](https://filament.ai), formerly an AI & ML consultancy and now a software product business where I am currently CTO and Chief Data Scientist. I oversee and manage our technical roadmap and strategy, but I also keep my hands dirty and regularly deliver code for customers and for our products.
- In 2022 I wrapped up up my part-time PhD which I've been working on under the dual supervision of [Prof. Maria Liakata](https://www.turing.ac.uk/people/researchers/maria-liakata) at the [Alan Turing Institute](https://www.turing.ac.uk/) [Dr Amanda Clare](https://users.aber.ac.uk/afc/) at Aberystwth University (where I finished my BSc in 2013).
- My main academic affiliation was with [University of Warwick](https://warwick.ac.uk/fac/sci/dcs/) but, I often crash Turing events and, I've been known to visit Aberystwyth to give talks at careers events and departmental seminars.
## What I do for fun
- I'm a big fan of food - both cooking and eating it.
- I like to tinker with software and hardware (like [this talking moose head](/2016/06/05/blackgangpi-a-raspberry-pi-hack-at-blackgang-chine/)) in my spare time. I'm a big fan of open source culture including efforts to decentralise the web like [indieweb](https://indieweb.org/) and [the fediverse](https://fediverse.party/en/fediverse).
- I like to read, frequently science fiction and fantasy but the occasional pop-sci title or general fiction. I have historically tracked some of my reading over at [Goodreads](https://www.goodreads.com/user/show/4547536-james-ravenscroft) but I now keep track with [Bookwyrm](https://bookwyrm.social/user/jamesravey) and eventually I plan to start tracking this stuff here via [bookwyrm](https://indiebookclub.biz/) and micropub.
- I like to watch box sets and movies - my wife and I are [Cineworld Unlimited card](cineworld.co.uk/) holders.
- I've been playing saxophone (Alto and Tenor mainly) off-and-on since the early 2000s. I can also play a few chords on a guitar and I'll happily tinker with a piano/keyboard, harmonica and clarinet although don't ask me to play you a full track!
- Although I've not had time recently I did really enjoy [Lindyhop](/2015/06/28/bedford-place-vintage-festival/) - a 1920s style swing dance.
- I'm a big fan of food - both cooking and eating it.
- I like to tinker with software and hardware (like [this talking moose head](/2016/06/05/blackgangpi-a-raspberry-pi-hack-at-blackgang-chine/)) in my spare time. I'm a big fan of open source culture including efforts to decentralise the web like [indieweb](https://indieweb.org/) and [the fediverse](https://fediverse.party/en/fediverse).
- I like to read, frequently science fiction and fantasy but the occasional pop-sci title or general fiction. I have historically tracked some of my reading over at [Goodreads](https://www.goodreads.com/user/show/4547536-james-ravenscroft) but I now keep track with [Bookwyrm](https://bookwyrm.social/user/jamesravey) and eventually I plan to start tracking this stuff here via [bookwyrm](https://indiebookclub.biz/) and micropub.
- I like to watch box sets and movies - my wife and I are [Cineworld Unlimited card](cineworld.co.uk/) holders.
- I've been playing saxophone (Alto and Tenor mainly) off-and-on since the early 2000s. I can also play a few chords on a guitar and I'll happily tinker with a piano/keyboard, harmonica and clarinet although don't ask me to play you a full track!
- Although I've not had time recently I did really enjoy [Lindyhop](/2015/06/28/bedford-place-vintage-festival/) - a 1920s style swing dance.

View File

@ -8,64 +8,56 @@ type: pages
On this page you will find summaries of projects that I've worked on including both software and scientific research.
### Contents
## Software
- [Software](#software)
- [General/Open Source](#generalopen-source)
- [TimeTrack](#timetrack)
- [NLP / ML](#nlp--ml)
- [CDCRTool](#cdcrtool)
- [Partridge](#partridge)
- [Sapienta](#sapienta)
- [Academic Publications](#academic-publications)
- [2021](#2021)
- [2019](#2019)
- [2018](#2018)
- [2017](#2017)
- [2016](#2016)
- [2013](#2013)
### Turbopilot
# Software
[<img src="https://img.shields.io/github/stars/ravenscroftj/turbopilot?style=social" alt="github repository" style="display:inline; margin: 0px;" />](https://github.com/ravenscroftj/turbopilot)
## General/Open Source
A weekend experiment where I attempted to use [GGML](https://github.com/ggerganov/ggml/) quantized tensors to run a state-of-the-art code completion model on commodity hardware including laptops, desktops, ARM machines like Macbooks and even Raspberry Pis. As the GGML library matures, I'm adding support for things like Nvidia GPU support too.
### TimeTrack
[<img src="https://img.shields.io/github/watchers/ravenscroftj/timetrack?style=social" alt="github repository" style="display:inline; margin: 0px;" />](https://github.com/ravenscroftj/timetrack)
A small command-line tool I wrote for monitoring my time spent on projects - it has API integration with the popular SaaS timesheet tool [Harvest](https://www.getharvest.com/)
## NLP / ML
### CDCRTool
[<img src="https://img.shields.io/github/watchers/ravenscroftj/cdcrtool?style=social" alt="github repository" style="display:inline; margin: 0px;" />](https://github.com/ravenscroftj/cdcrtool)
A tool for annotating co-references of entities that occur in linked news paper article/scientific paper pairings. Some 'sharp' code but this was my first venture into 'full stack' using ReactJS on the frontend and Flask on the backend. The repository also contains the final corpus which we made available as part of our EACL21 publication.
### Partridge
[Website](https://papro.org.uk/) | [<img src="https://img.shields.io/github/watchers/ravenscroftj/partridge?style=social" alt="github repository" style="display:inline; margin: 0px;" />](https://github.com/ravenscroftj/partridge)
[Website](https://papro.org.uk/) | [<img src="https://img.shields.io/github/stars/ravenscroftj/partridge?style=social" alt="github repository" style="display:inline; margin: 0px;" />](https://github.com/ravenscroftj/partridge)
A scientific paper indexing system that uses machine learning to enrich papers in order to make them more easy to search and filter. Originally written in Python 2 with xml-rpc worker processes and recently updated to use Python 3 and [dramatiq](https://dramatiq.io/) for concurrency.
### Sapienta
[Website](http://www.sapientaproject.com/) | [Live Instance](https://sapienta.papro.org.uk/) | [<img src="https://img.shields.io/github/watchers/ravenscroftj/sapienta?style=social" alt="github repository" style="display:inline; margin: 0px;" />](https://github.com/ravenscroftj/sapienta)
[Website](http://www.sapientaproject.com/) | [Live Instance](https://sapienta.dcs.aber.ac.uk/) | [<img src="https://img.shields.io/github/stars/ravenscroftj/sapienta?style=social" alt="github repository" style="display:inline; margin: 0px;" />](https://github.com/ravenscroftj/sapienta)
An NLP pipeline for processing and enriching scientific papers with sentence-level information about their core scientific concepts (CoreSCs). This is a Python 3 implementation of Prof Maria Liakata's 2010 paper. We provide a free web service for low volume requests and a simple to use docker configuration for those who want to run the software over a larger number of papers.
# Academic Publications
### CDCRTool
[<img src="https://img.shields.io/github/stars/ravenscroftj/cdcrtool?style=social" alt="github repository" style="display:inline; margin: 0px;" />](https://github.com/ravenscroftj/cdcrtool)
A tool for annotating co-references of entities that occur in linked news paper article/scientific paper pairings. Some 'sharp' code but this was my first venture into 'full stack' using ReactJS on the frontend and Flask on the backend. The repository also contains the final corpus which we made available as part of our EACL21 publication.
### TimeTrack
[<img src="https://img.shields.io/github/stars/ravenscroftj/timetrack?style=social" alt="github repository" style="display:inline; margin: 0px;" />](https://github.com/ravenscroftj/timetrack)
A small command-line tool I wrote for monitoring my time spent on projects - it has API integration with the popular SaaS timesheet tool [Harvest](https://www.getharvest.com/)
## Academic Publications
Below are links to my various publishing profiles in case you prefer to follow me on an external site/silo:
- [ORCID](https://orcid.org/0000-0003-0293-9452)
- [Google Scholar Profile](https://scholar.google.co.uk/citations?user=e43P2foAAAAJ&hl=en)
- [Semantic Scholar](https://www.semanticscholar.org/author/145681615)
### 2022
<ul>
<li>Maufe, M., <strong>Ravenscroft, J.</strong>, Procter, R., & Liakata, M. (2022, December). <a href="">A Pipeline for Generating, Annotating and Employing Synthetic Data for Real World Question Answering.</a> In Proceedings of the The 2022 Conference on Empirical Methods in Natural Language Processing: System Demonstrations (pp. 80-97).
</li>
</ul>
### 2021
<ul>
<li><strong>Ravenscroft J.</strong>, Cattan A., Clare A., Dagan I., Liakata M. <a href="https://aclanthology.org/2021.eacl-main.21.pdf">CD<sup>2</sup>CR: Co-reference Resolution Across Documents and Domains</a></li>
<li><strong>Ravenscroft J.</strong>, Cattan A., Clare A., Dagan I., Liakata M. <a href="https://aclanthology.org/2021.eacl-main.21.pdf">CD<sup>2</sup>CR: Co-reference Resolution Across Documents and Domains</a> In Proceedings of the 16th Conference of the European Chapter of the Association for Computational Linguistics: Main Volume (pp. 270-280).</li>
</ul>
### 2019
@ -75,12 +67,12 @@ Below are links to my various publishing profiles in case you prefer to follow m
### 2018
<ul>
<li><strong>Ravenscroft, J.</strong>, Clare, A., &amp; Liakata, M. <a href="http://aclweb.org/anthology/P18-4004">HarriGT: Linking news articles to scientific literature.</a></li>
<li><strong>Ravenscroft, J.</strong>, Clare, A., &amp; Liakata, M. <a href="http://aclweb.org/anthology/P18-4004">HarriGT: Linking news articles to scientific literature.</a> In Proceedings of ACL 2018, System Demonstrations (pp. 19-24).</li>
</ul>
### 2017
<ul>
<li><strong>Ravenscroft, J.</strong>, Clare, A., Duma, D., Liakata, M. <a href="https://doi.org/10.1371/journal.pone.0173152">Measuring scientific impact beyond academia: An assessment of existing impact metrics and proposed improvements</a></li>
<li><strong>Ravenscroft, J.</strong>, Clare, A., Duma, D., Liakata, M. <a href="https://doi.org/10.1371/journal.pone.0173152">Measuring scientific impact beyond academia: An assessment of existing impact metrics and proposed improvements</a> PloS one, 12(3), e0173152.</li>
</ul>

View File

@ -11,15 +11,26 @@ What I'm up to at the moment as inspired by Derek Sivers' [NowNowNow](https://no
----
#### June 2023
#### October 2023
It's been a busy few months. We landed some funding at work which has allowed us to grow the company and hire a number of new team members.
- My company won [Emerging Tech Company of the year](https://thebusinessmagazine.co.uk/business_events/south-coast-tech-awards-2023/) at the South Coast Tech Awards.
#### September 2023
- After meeting a whole bunch of cool people, I decided to retire turbopilot. I wrote about that decision [here](https://brainsteam.co.uk/posts/2023/09/30/turbopilot-obit/).
- [My company won Best AI Product](https://filament.ai/2023/09/06/cogx-award-2023/) at CogX 2023
#### May 2023
- We [moved offices](https://brainsteam.co.uk/posts/2023/08/28/we-moved-offices1693231919/) from Southampton University Science Park to Whiteley Business park.
### April 2023
- It's been a busy few months. We landed some funding at work which has allowed us to grow the company and hire a number of new team members.
- I started [turbopilot](https://github.com/ravenscroftj/turbopilot), a local runtime that allows you to run near "state-of-the-art" code completion models locally without racks of expensive GPUs.
#### October 2022
After 7 years I have [finished my PhD thesis](https://brainsteam.co.uk/2022/09/25/phinished/) and [submitted it](https://brainsteam.co.uk/notes/2022/09/09/1662742877/). My PHD has been a huge part of my life and identity and it's been weird adapting to not working on it during every free moment any more.
I'm still living in the South of England with my wife and our cats. We're spending a lot of time on house maintenance type activities now that my PHD is done.
I am still CTO at [Filament AI](https://www.filament.ai/) - exciting things are afoot in our product development areas - hopefully I can share more publicly in the near future.
- After 7 years I have [finished my PhD thesis](https://brainsteam.co.uk/2022/09/25/phinished/) and [submitted it](https://brainsteam.co.uk/notes/2022/09/09/1662742877/). My PHD has been a huge part of my life and identity and it's been weird adapting to not working on it during every free moment any more.
- I'm still living in the South of England with my wife and our cats. We're spending a lot of time on house maintenance type activities now that my PHD is done.
- I am still CTO at [Filament AI](https://www.filament.ai/) - exciting things are afoot in our product development areas - hopefully I can share more publicly in the near future.

View File

@ -1,4 +0,0 @@
---
post_meta:
- date
---

View File

@ -1,4 +0,0 @@
---
post_meta:
- date
---

View File

@ -2,16 +2,15 @@
date: 2023-02-01 09:39:03+00:00
description: Why you shouldn't use async in your new Promise()
mp-syndicate-to:
- https://brid.gy/publish/mastodon
- https://brid.gy/publish/twitter
- https://brid.gy/publish/mastodon
- https://brid.gy/publish/twitter
post_meta:
- date
- date
tags:
- nodejs
- typescript
- javascript
- softeng
- null
- nodejs
- typescript
- javascript
- softeng
title: Async Promise Constructors
type: posts
url: /2023/2/1/async-promise-constructors
@ -22,24 +21,22 @@ I ran into an interesting typescript/js problem yesterday at work.
The following code snippet was generating an error and a stack trace that was never being propagated up to the caller:
```typescript
return new Promise(async (resolve, reject) =>{
return new Promise(async (resolve, reject) => {
const data = await this.client.getObject(bucket, path);
const data = await this.client.getObject(bucket, path)
const buf: any[] = [];
const buf : any[] = []
data.on("data", (data) => {
buf.push(data);
});
data.on('data', (data) => {
buf.push(data)
})
data.on('error', (err) => {
reject(err)
})
data.on('end', ()=>{
resolve(JSON.parse(Buffer.concat(buf).toString()))
})
data.on("error", (err) => {
reject(err);
});
data.on("end", () => {
resolve(JSON.parse(Buffer.concat(buf).toString()));
});
});
```
@ -56,22 +53,23 @@ As it turns out, [eslint has a rule for this](https://eslint.org/docs/latest/rul
I could make the getObject outer function async and then do the `getObject()` call in the outer layer:
```typescript
async function someFunction() {
const data = await this.client.getObject(bucket, path);
async function someFunction(){
return new Promise((resolve, reject) => {
const buf: any[] = [];
const data = await this.client.getObject(bucket, path)
return new Promise((resolve, reject) =>{
const buf : any[] = []
data.on('data', (data) => { buf.push(data) })
data.on('error', (err) => { reject(err) })
data.on('end', ()=>{
resolve(JSON.parse(Buffer.concat(buf).toString()))
})
data.on("data", (data) => {
buf.push(data);
});
data.on("error", (err) => {
reject(err);
});
data.on("end", () => {
resolve(JSON.parse(Buffer.concat(buf).toString()));
});
});
}
```
Now if the `getObject` call fails the whole `someFunction()` fails (effectively the promise that is generated by use of the await/async syntactic sugar is rejected).

View File

@ -10,6 +10,7 @@ post_meta:
resources:
- name: feature
src: images/language.jpg
thumbnail: images/language.jpg
tags:
- nlp
- llms

View File

@ -12,7 +12,7 @@ tags:
- personal
- ai
- ml
thumbnail: /2023/6/17/xavier-the-spotify-dj/images/dj.png
thumbnail: images/dj.png
title: Xavier the Spotify AI DJ
type: posts
url: /2023/6/17/xavier-the-spotify-dj

View File

@ -0,0 +1,113 @@
---
title: "TIL: PicGo"
date: 2023-07-30T12:33:40+01:00
description: Using PicGo to quickly upload photos to my site
url: /2023/7/30/til-picgo
type: posts
mp-syndicate-to:
- https://brid.gy/publish/mastodon
thumbnail: https://brainsteam.co.uk/media/2023/07/202307301533057.png
tags:
- post
- TIL
- indieweb
- opensource
---
Today I learned about [PicGo](https://github.com/Molunerfinn/PicGo) an open source project which provides a relatively lightweight tool (it is an electron app so... 😬) which runs in the background and can upload images from your clipboard or filesystem to a host of your choice. The main README for the project is written in chinese which unfortunately I can't read. However, I was able to fumble my way through with some use of Google Translate and some guesswork.
![a screenshot of the default view of PicGo](https://brainsteam.co.uk/media/2023/07/202307301533057.png)
A bunch of services are supported out of the box or via plugins listed [here](https://github.com/PicGo/Awesome-PicGo) including Nextcloud, SFTP and S3 upload.
### Motivation
I find posting new content to my site a little bit of a pain. I have my own [micropub](https://indieweb.org/micropub) implementation and server which means I can quickly fire off the odd photo or note pretty easily, but when I'm writing a long form post, I find it quite irritating to have to manually do file management with images. PicGo + SFTP means that I can stop worrying about that and with the touch of a few keys, I can have images in my clipboard uploaded to my website and replaced with relevant markdown image embed code.
### Telemetry
Before I launch into this, I noticed that PicGo does seem to collect telemetry. As far as I can tell it's anonymised "users tend to click on this button after 10 seconds" type of telemetry rather than sending a copy of all your images to some dodgy server type of telemetry. However, if you're concerned you might want to have a [dig through the code](https://github.com/Molunerfinn/PicGo) before making a decision.
### Installing
Installation is a breeze for Linux users who are happy to work with [AppImage](https://appimage.org/) format. I imagine it's easy enough on Mac and Windows too.
Firstly, I downloaded the latest AppImage for linux from the [release page](https://github.com/Molunerfinn/PicGo/releases/tag/v2.3.1). Then I ran it via the [AppImage Launcher](https://github.com/TheAssassin/AppImageLauncher). Hey presto, it started.
### Set the Language
If you, like me, are unable to read chinese. You might want to change the language.
The app opens in chinese on first run so you have to fumble your way around in the GUI to switch to English. First click on the tray icon and click on the first menu item to bring up the main window. The menu option with the cog next to it is the settings pane and then Language is the first option - the select/dropdown box.
Restart the app so that the context menu reloads in English.
### Setting up SFTP
I run my website on a VPS which I normally upload stuff to via SFTP. I wanted to make it easy to paste images and have them uploaded to my website via SFTP and get a URL.
#### Install the Plugin
Open up the Plugins tab in the main dialog and search "sftp" - install the first plugin that appears:
![a screenshot of the plugin page showing the sftp plugin](https://brainsteam.co.uk/media/2023/07/202307301510641.png)
#### Write a config file
Next we write a JSON config file that we can use to tell the SFTP plugin how to log in to the server, where to store the files and how the path in SFTP maps on to the website path.
I created mine in my home dir and called it `.picgo-sftp.json`:
```json
{
"mysite": {
"url": "https://mysite.com",
"path": "/media/{year}/{month}/{fullName}",
"uploadPath": "/var/www/mysite.com/media/{year}/{month}/{fullName}",
"host": "somehost.com",
"port": 22,
"username": "vpsuser",
"privateKey": "/home/user/.ssh/id_rsa",
"passphrase": "",
"fileUser": "vpsuser",
"dirMode": "0755"
},
}
```
The config format is straight forward and pretty easy to understand.
- **url** is the root url of your site (where your images will be visible from).
- **path** is the folder path that will be appended to the root url in order to generate your image url.
- **uploadPath** is the actual filesystem path inside SFTP where the image will be stored. This should reflect the URL path based on your web server config.
- In the above example, I have have nginx set to serve `/var/www/mysite.com/media/` when someone hits `https://mysite.com/media/`.
- In both `path` and `uploadPath We use special variables which get replaced with actual information at the time of upload:
- `{year}` - the current year i.e. 2023
- `{month}` - the current month i.e. 07
- `{fullName}` - the name of the image e.g. `mypicture.jpg`
- If I were to upload `mypicture.jpg` on the 1st of April 2023:
- the file would be written to `/var/www/mysite.com/media/2023/04/mypicture.jpg`
- the url returned by picgo to my clipboard would be `https://mysite.com/media/2023/04/mypicture.jpg`
Once you save your config json, you'll need to go to Picbeds -> SFTP and enter the path to the json file in the 2nd box and the name of the site in the first box (this corresponds to the top level key in the json which is `mysite` in the example above. In theory you could have multiple sites configured).
![a screenshot of the sftp plugin config](https://brainsteam.co.uk/media/2023/07/202307301521306.png)
### Final Tweaks
#### Filename Clashes
I enabled a couple of options to make it easier to avoid name clashes on my server (i.e. uploading 2 files called image.png on the same day ends up overwriting the older one).
![Settings pane showing rename before upload and timestamp rename options](https://brainsteam.co.uk/media/2023/07/202307301523755.png)
- **Rename Before Upload** - PicGo seems to prompt me to enter a new filename at the time of upload whenever I upload anything
- **Timestamp Rename** - by default PicGo will replace the filename with the current timestamp down to seconds so I don't need to necessarily do anything to rename the file unless I want to give it a more descriptive name.
#### Keyboard Shortcut
For some reason the default keyboard combination for uploading from clipboard is set to `CTRL + SHIFT + P` which is the same as bringing up the command prompt in VSCode which I do *a lot*. I found the widget for remapping the key combination was a bit janky so I remapped this by going into the `Open Config File` setting and changing it manualy
![A screenshot of the config file where I've manually changed the keyboard combo to CTRL + SHIFT + U](https://brainsteam.co.uk/media/2023/07/202307301530838.png)

View File

@ -0,0 +1,52 @@
---
title: "Stress and Unwinding"
date: 2023-08-01T17:13:59+01:00
description: Making some changes to give myself a break
url: /2023/7/31/stress-and-unwinding
type: posts
thumbnail: https://brainsteam.co.uk/media/2023/07/202307312037880.png
mp-syndicate-to:
- https://brid.gy/publish/mastodon
- https://brid.gy/publish/twitter
tags:
- personal
- mentalhealth
---
I recently noticed that every time I have some downtime - be it a long weekend or a two week holiday - I end up getting sick with coughs and colds. I also feel tired a lot. Not only is this inconvenient, it can severely impact my enjoyment of my time off or even prevent me from going to things I was looking forward to. I decided that I need to get better at relaxing and unwinding so that my body doesn't force me to do it in the least enjoyable way (from my bed sniffling and coughing).
I've been thinking about some of my habits and behaviours and how I can try to change them to get some more rest and hopefully improve my health a little bit.
{{< figure caption="a relaxing scene by <a href='https://unsplash.com/photos/u_z0X-yrJIE'>Alisa Anton on Unsplash</a>" src="https://brainsteam.co.uk/media/2023/07/202307312037880.png" >}}
## Stop Taking my Phone Everywhere
I, like many millenials and zoomers, am glued to my phone. Every time I have a sense of curiosity I am straight to google. Every time I am bored or in an awkward situation I scroll Mastodon. I'll often sit and 'doomscroll' on my phone at home rather than doing something relaxing.
So the solution I've come up with is to set up a "charging corner" in my house and to leave my phone there when I'm home unless I have a specific reason not to. That way it's a pain to get to and that might just be the friction I need to think to myself "wait why am I reaching for my phone?" rather than regaining consciousness an hour later having achieved nothing.
I take a lot of notes in [Logseq](https://logseq.com/), so it might be a bit challenging not having my phone with me. Therefore, I've got an old tablet which I've installed Logseq on and very little else in order to make it as unappealing to my dopamine-addicted brain as possible.
## Stop Trying to be Productive All the Time!
I struggle to disconnect from the feeling that I always need to be busy or productive. I rarely allow myself more than an hour or so a day of time to truly relax because I feel guilty that I'm not doing something useful or that if I don't do the thing it'll never get done. This is a complex one that's deeply engrained into my psyche, so it's going to take a multipronged attack I think.
I need to try to enforce time-boxing for project work outside work hours. I book meetings with myself at work to get things done, so I could book some meetings with myself during evenings and weekends in which to get nothing done. Or, if I want to do some project work I could set limits and alarm clocks to make sure that I don't spend all of my downtime doing something that might feel "fun" but isn't particularly regenerative.
## Meditation
I am already a big fan of [Headspace](https://www.headspace.com/), and I've been doing their exercises most days for a couple of years to help me go to sleep at night. I want to try and get a morning breathing exercise in as well and maybe make more use of the ap during the day too where appropriate.
I'm quite empathic and passionate about what I do and get very emotionally invested in my work and wanting my friends, family and work colleagues to succeed. If I'm going through a crisis of some description I often find myself ruminating and worrying about it, even when it's not helpful (no point worrying about that difficult conversation you've got pencilled in for Monday whilst you're out for lunch with your wife on Saturday).
## Exercise and Diet
If you read any book or article about mental or physical health diet and exercise always come up. I can't say my diet is particularly good - we try to cook fresh meals from [Pinch of Nom](https://pinchofnom.com/) most nights but often order takeaway if we're tired or have had a rough day at work. We recently started HelloFresh which is slightly more expensive than buying groceries the 'normal' way but significantly cheaper than eating out or buying takeaway. The ingredients come pre-measured and sometimes pre-prepared so I consider it a bit of a cooking 'hack'. If we save money and eat more healthily by not buying dinner out as much, then I'm happy to keep it up for a bit.
In terms of exercise, I try to do a 20-25 minute walk every day. However, we also recently got free access to [Hussle](https://www.hussle.com/) gyms via our work, so I've taken up swimming again. In both cases, I find it an excellent opportunity to get some headspace. Perhaps more so swimming because I can't even take my phone and listen to podcasts or music. I'm also planning to start cycling to work now that we moved offices much closer to my house.
## Summary
I guess the point of this post was to talk openly about some of the stuff I'm trying out to help me with my health and general welfare, possibly with the intention to inspire others but mainly as a way to hold myself to account. I'll try and do a review post about how I got on in a few months time. Hopefully next time I go on holiday I won't get poorly!

View File

@ -0,0 +1,16 @@
---
title: "Turbopilot"
date: 2023-08-05T19:40:53+01:00
draft: true
description: short summary
url: /2023/8/5/turbopilot
type: posts
mp-syndicate-to:
- https://brid.gy/publish/mastodon
- https://brid.gy/publish/twitter
tags:
- post
---
In April I caught COVID and while I was stuck at home I got bored with sitting around feeling sorry for myself, so I decided to play around with

View File

@ -0,0 +1,73 @@
---
categories:
- Personal
date: '2023-08-08 11:33:16'
draft: false
tags: []
title: We moved offices!
type: posts
url: /2023/08/08/we-moved-offices/
---
<p>
I've been meaning to write about this for a while - we actually moved offices at the end of May!
<br />
</p>
<p>
My company <a href="https://filament.ai/">Filament</a> has, since 2017, had two UK offices. One up in London and one on the South Coast in the <a href="https://en.wikipedia.org/wiki/The_Solent">solent</a> area. I live on the south coast and I spend most of my time at the latter office. I've always been a huge advocate of hybrid or even full remote working - since long before COVID made remote working more "socially acceptable." All of our staff have always had the option to work from home when they want or come in and spend time on site if they prefer. We have a small number of fully remote staff who live on the other side of the country from our office space. People who live near one of our hub offices tend to balance their time between home and the office according to what works for them.
<br />
</p>
<h2>
Our Pre-COVID Setup
<br />
</h2>
<figure>
<img src="/media/1693229548__34f5b998" height="500px" alt="an large and airy office space with a few desks, some potted plants in the foreground" />
<figcaption>Our old USSP was large and airy and had breakout areas and a kitchenette.</figcaption>
</figure>
<p>Most of our tech team are located on the south coast and I was given the mandate to
make our Solent office as much of a "developers' paradise" as possible - a place where people would want to come and spend time solving problems together and socialising.</p>
<p>From 2017 to May we were based at the University of Southampton's Science Park (USSP) nestled away near a small village, Chilworth, just north of Southampton and surrounded by woodland.</p>
<p>
The science park itself is a pretty nice spot, you can do loads of walks and there's a really lovely on site cafe. If you want a bit of variation, there's a pub within walking distance with a large beer garden and the team and I spent many extended lunch breaks  sat out there on a sunny afternoon.
<br />
</p>
<p>Pre-covid we had a really nice big office space on the science park with a pool table and a little kitchen area. People like being there and most of the time, local-based folks would come in a few days a week and we'd hang out, play some games of pool, get lunch together, that kind of stuff.</p>
<h2>
During and Post-COVID
<br />
</h2>
<figure>
<img src="/media/1693230404__eb2d29ac" height="500px" alt="a cluttered office space full of desks and too many chairs" />
<figcaption>Our post-covid USSP office was small and full of furniture from our rush to downsize</figcaption>
</figure>
<p>Unfortunately, we ended up downsizing during lockdown and that was sub-optimal for a few reasons. There wasn't anything wrong with the space per-se, but it was small and uninspiring and when it got busy, it was really hard to concentrate. It probably didn't help that it was half full with flat-packed furniture from our older larger space making it feel cluttered and scruffy. Also, post-COVID working patterns have changed a lot. </p>
<p>Now people want to spend more time at home but tend to congregate in the office when there's a big in-person meeting, a birthday meal or a well-liked full-remoter is in town for a few days. This leads to a bit of a weird pattern where the office is at maybe 50-60% capacity most of the time and then suddenly experiences big bursts where everyone wants to be in at the same time. In the "small" USSP office these bursts probably meant you weren't going to get any work done that day and there wasn't really anywhere to go and take calls unless you paced in the corridor, booked a meeting room, or as I started doing towards the end of our stay there, lurk in the mail room. </p>
<p>When we raised some money in April, we decided to start looking for a new space. We figured that we probably wanted some kind of new "hybrid" deal to facilitate these new ways of working. Ideally, a smallish office with access to a communal breakout space/lounge area and ideally some small phone pods where we can take calls. We spoke to the USSP and unfortunately they were not able to offer a deal like this although they did tell us that they're working on revamping the building that we were in to provide some of these amenities. So we widened our search.</p>
<h2>
Our new Space and Whiteley Village
<br />
</h2>
<p>We looked at a few local offices before settling on Spaces Whiteley. It's about 20 minutes down the motorway from the old office location and it's a modern co-working setup managed by <a href="https://work.iwgplc.com/">IWG</a> (the guys who also own Regus). </p>
<figure>
<img src="/media/1693231831__63af1340" height="500px" alt="James standing with his back to the camera in a light breezy office space" />
</figure>
<figure>
<img src="/media/1693231832__6fe09491" height="500px" alt="A sofa and chairs in a large open breakout area" />
</figure>
<figure>
<img src="/media/1693231833__e1e05685" height="500px" alt="A breakout space with a coffee bar and a pool table" />
</figure>
<p>There's a pool table (ah we missed you pool), loads of communal break-out space with comfy seating and a couple of sound-proofed phone booths for us to take calls from when the office gets busy.</p>
<p>Like USSP it has loads of really nice scenery and walks nearby but it definitely wins in terms of amenities. It's a 15 minute walk from an outdoor mall with a bunch of different restaurants and coffee shops.</p>
<br />
<figure>
<img src="/media/1693228881__e26626fc" height="500px" alt="A square with some cafes and restaurants" />
</figure>
<figure>
<img src="/media/1693228880__96175b24" height="500px" alt="A lake with some ducks and swans in the foreground" />
</figure>
<p>
I think the team have generally been enjoying the new space more too. People tend to want to come in more frequently and make use of the new space a few days a week. I've been enjoying going in more regularly too. The new office location means that I no longer need to drive on the motorway to get to work so I'm considering starting to cycle in a couple of times a week instead.
<br />
</p>

View File

@ -0,0 +1,14 @@
---
title: "FreshRSS Updates"
date: 2023-08-13T08:39:05+01:00
description: Troubleshooting some freshrss maaintenance issues
url: /2023/8/13/freshrss-updates
type: posts
mp-syndicate-to:
- https://brid.gy/publish/mastodon
- https://brid.gy/publish/twitter
tags:
- rss
- selfhosting
---

View File

@ -0,0 +1,310 @@
---
categories:
- AI and Machine Learning
- Data Science
date: '2023-08-14 11:57:25'
draft: false
tags: []
title: Prod-Ready Airbyte Sync
type: posts
url: /2023/08/14/stable-airbyte-sync/
---
<!-- wp:paragraph -->
<p>Airbyte is a tool that allows you to periodically extract data from one database and then load and transform it into another. It provides a performant way to clone data between databases and gives us the flexibility to dictate what gets shared at field level (for example we can copy the users table but we can omit name, address, phone number etc). There are a bunch of use cases where this kind of thing might be useful. For example, say you have a data science team who want to generate reports on how many sales your e-shop made this month and train predictive models for next months revenue. You wouldnt want to give your data team direct access to your e-shop database because:</p>
<!-- /wp:paragraph -->
<!-- wp:list {"ordered":true} -->
<ol><!-- wp:list-item -->
<li>there might be sensitive personal information (SPI) in there (think names, addresses, bank details, links to what individual users ordered)</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
<li>running this kind of analysis might impact the performance of your shop database and customers might start churning.</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->
<!-- wp:paragraph -->
<p>Instead, we can use a tool, such as airbyte, regularly make copies of a subset of the production database minus the SPI and load it into an external analytics database. The data team can then use this external database to make complex queries all day long without affecting application performance. This pattern is called Extract Load Transform or ELT.</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>In this post Ill summarise some strategies for using airbyte in a production environment and share some tips for navigating some of its “rough edges” based on my own experience of setting up this tool as a pilot project for some of my clients in my day job.</p>
<!-- /wp:paragraph -->
<!-- wp:heading -->
<h2 class="wp-block-heading" id="general-requirements">General Requirements</h2>
<!-- /wp:heading -->
<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>We <strong>need</strong> to <em>securely</em> copy data from our “live” application database to our “analytics” database</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
<li>We <strong>need</strong> to do this without impacting the performance of the application</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
<li>We <strong>need</strong> to be able to do this daily so that the analytics db contains the latest information</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
<li>We <strong>need</strong> to be able to control which tables and columns get sent</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
<li>We <strong>need</strong> to limit who is able to configure airbyte and incorporate checks to prevent accidental data leakage or loss</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
<li>We <strong>want</strong> to be able to do this relatively cheaply</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->
<!-- wp:heading -->
<h2 class="wp-block-heading" id="database-technologies">Database Technologies</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>Airbyte has a large number of mature data “Source” plugins for a bunch of standard SQL databases like MySQL/MariaDB, PostgreSQL, MSSQL and so on. Its Source plugins for data warehouse systems like BigQuery are still in alpha. The reverse appears to be true for “Destination” plugins. Airbyte provides mature destination implementations for data warehouse products like Google BigQuery and Snowflake but immature alpha and beta support for syncing to a traditional RDBMS.</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>The full list of supportect source and destination connectors is available <a href="https://airbyte.com/connectors">here</a>. We are able to use the MySQL source to pull data from the core application and store our data in Google BigQuery.</p>
<!-- /wp:paragraph -->
<!-- wp:heading -->
<h2 class="wp-block-heading" id="picking-an-edition-of-airbyte">Picking an Edition of Airbyte</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>Airbyte comes in two “flavours”:</p>
<!-- /wp:paragraph -->
<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>A hosted cloud version where you pay Airbyte to host an instance of their application on your behalf and they copy all your data around</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
<li>A self-hosted version where you install Airbyte yourself in your own infrastructure and you debug it yourself when you inevitably mess up installation instructions.</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->
<!-- wp:paragraph -->
<p>I have a risk averse client-base who have strong data protection requirements so we opted for self-hosted instances that sit in the same region and virtual network in our Google Cloud instance as our application. The target database is Google BigQuery in the same data centre region and the involved clients were ok with that.</p>
<!-- /wp:paragraph -->
<!-- wp:heading -->
<h2 class="wp-block-heading" id="picking-a-virtual-machine-spec">Picking a Virtual Machine Spec</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>If you opt for the self-hosted version like we did youll need to pick a VM that has enough resources to run Airbyte. We went for googles <code>n2-standard-4</code> machine spec which has 4 CPU cores and 16GB of RAM. This was actually our second choice after picking an <code>e2-standard-2</code> which only had 8GB of RAM which was not enough to run Airbyte optimally and caused thrashing/spiking issues.</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Although all the data does pass through the VM, its done in buffered chunks so your VM doesnt need a lot of storage space - 50GiB was sufficient for our setup.</p>
<!-- /wp:paragraph -->
<!-- wp:heading -->
<h2 class="wp-block-heading" id="setting-up-airbyte">Setting up Airbyte</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>We deployed Airbyte using docker-compose by following their <a href="https://docs.airbyte.com/quickstart/deploy-airbyte/">quick start guide</a>. We locked down access to the machine over HTTPS so that it only accepts requests from inside our corporate VPN.</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>We were able to create a database connection to the MySQL database via its internal Google Cloud IP address which meant that no production data is routed outside of the virtual network during the first leg of the extraction (everything is encrypted with TLS anyway).</p>
<!-- /wp:paragraph -->
<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="cdc-versus-full-refresh">CDC versus Full Refresh</h3>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>When you configure a MySQL source (or indeed a bunch of other compatible sources), you can turn on either full refresh or incremental sync via change data capture. The latter makes use of logs from the SQL server to play back all of the SQL queries that have been run since the last sync and reduce the amount of data that is transferred. If you have a large database (of the order of 10s to 100s of GiB), this may be worthwhile as it is likely to accelerate the sync process significantly after the first run.</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>However, the current implementation of CDC/incremental sync for MySQL appears to get stuck and continue to run if you have ongoing changes being made to the system. For example, if you have a high availability application that is always in use or if you have automated processes making changes to the data around the clock, the sync driver will continue to pick up these new changes and append them on an ongoing basis unless youre able to turn off the workers or create an isolated copy of the source database (as described below).</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>We opted to stick with basic “full sync” as were only copying around 10GiB of data on a daily basis and our Airbyte setup is able to do this in about 30-45 mins under normal circumstances.</p>
<!-- /wp:paragraph -->
<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="when-to-sync">When to Sync</h3>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>Ideally you want to run the sync when the system is not in use or when it is least likely to impact the ongoing operation of your primary business application. Since most of our clients operate between 9am-6pm GMT we have a nice big “out of hours” window during which we can run this sync.</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>If you dont have that luxury because you have a high-availability application, Google Cloud SQL has the ability to take disk snapshots that dont appear to significantly impact the database performance. We did sketch out a potential workflow that would involve using the Google Cloud SQL Admin API to:</p>
<!-- /wp:paragraph -->
<!-- wp:list {"ordered":true} -->
<ol><!-- wp:list-item -->
<li>Create a new disk dump of the client db</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
<li>“Restore” the disk dump to a secondary database replica</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
<li>Run the airbyte sync, targetting the secondary replica as the “sync”</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
<li>Turn off the replica db</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
<li>Rinse & repeat</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->
<!-- wp:paragraph -->
<p>However, we were able to get full sync (without incremental CDC) working on a nightly basis without adding these extra complications. This would have required us to use an external orchestrator like <a href="https://airflow.apache.org/">Airflow</a> which has <a href="https://airflow.apache.org/docs/apache-airflow-providers-airbyte/stable/operators/airbyte.html">Airbyte operators</a> to execute our process. Thanksfully, we were able to use the built in cron scheduler to have Airbyte run the sync nightly before our application maintenance window.</p>
<!-- /wp:paragraph -->
<!-- wp:heading -->
<h2 class="wp-block-heading" id="securing-the-process">Securing the Process</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>As outlined, it can be important to make sure that certain fields are not shared via airbyte. Airbyte does provide a UI for toggling fields and indeed whole tables on and off as part of sync but for schemas with large numbers of tables and columns this is time-consuming and unwieldy and is likely to lead to human error.</p>
<!-- /wp:paragraph -->
<!-- wp:image {"id":53,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="/media/image-1-1024x472_0a5a8dcc.png" alt="" class="wp-image-53"/><figcaption class="wp-element-caption">The UI in airbyte allows us to turn syncing on or off at field level granularity a given table but gets unwieldy at scale</figcaption></figure>
<!-- /wp:image -->
<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="octavia-cli">Octavia CLI</h3>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>Airbytes answer to this problem is a command line tool named <a href="https://github.com/airbytehq/airbyte/tree/master/octavia-cli">Octavia</a>. Octavia communicates with Airbyte via a REST API and generates YAML configuration files that contain all tables, fields and configurations.</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>This is a game changer as it means we can script the fields that get synchronized and we can version control and quality control both the script and the config file itself. We can also gate changes to the sync config via CI tooling and “lint” the config for potential errors (e.g. by providing a script that compares the config against a blacklist of columns that are never allowed).</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Below is an excerpt from one such script that might give readers some inspiration for implementing a similar process themselves:</p>
<!-- /wp:paragraph -->
<!-- wp:enlighter/codeblock {"language":"python"} -->
<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import yaml
import click
@cli.command()
@click.option("--connection-file", "-c", type=click.Path(exists=True, file_okay=True, dir_okay=False, readable=True, writable=True), required=True)
@click.option("--fix/--no-fix", type=bool, default=False)
def lint_connection(connection_file, fix):
with open(connection_file,'r') as f:
config = yaml.safe_load(f)
print(f"Reading config file for {config['resource_name']}")
print(f"Checking Connection Resource: {config['resource_name']}")
streams = config['configuration']['sync_catalog']['streams']
print(f"Found {len(streams)} configured streams (tables) from source")
errors = []
for i, stream in enumerate(streams):
name = stream['stream']['name']
if ("admin" in name) or (name in BLOCKED):
print(f"Checking {name} is not enabled for sync...")
if stream['config']['selected']:
err_string = f"ERROR: {name} must not be synced but is being synced"
errors.append(err_string)
if fix:
streams[i]['config']['selected'] = False
print(f"Found {len(errors)} problems")
for error in errors:
print(f"\t - {error}")
if len(errors) &gt; 0:
if fix:
config['configuration']['sync_catalog']['streams'] = streams
print("Fix=True, writing updated config")
with open(connection_file, 'w') as f:
yaml.safe_dump(config, f)
else:
print("Fix=False, please manually fix any problems or rerun with --fix to resolve automatically")
else:
print("No problems found! 😊")
</pre>
<!-- /wp:enlighter/codeblock -->
<!-- wp:paragraph -->
<p>The idea here is that we run the script as part of CI and have the pipeline fail to deploy if it catches any errors and have a <code>--fix</code> mode that attempts to automatically rectify any problems which our maintainer can run locally.</p>
<!-- /wp:paragraph -->
<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="octavia-bug">Octavia “Bug”</h3>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>When I started using Octavia, I noticed that it would bug out and print error messages when I started to use change which fields are selected for sync. I found <a href="https://github.com/airbytehq/airbyte/issues/27473">a bug ticket</a> about this issue and then eventually realised that the Airbyte documentation for Octavia is quite out of date and by default it installs an old version of Octavia that is not compatible with the current version of the Airbyte server itself. In order to make it work, I simply changed my <code>.zshrc</code> file (or <code>.bashrc</code> file for some) to use the latest version of the tool - which at time of writing is <code>0.50.7</code>:</p>
<!-- /wp:paragraph -->
<!-- wp:enlighter/codeblock {"language":"bash"} -->
<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">OCTAVIA_ENV_FILE=/home/james/.octavia
export OCTAVIA_ENABLE_TELEMETRY=True
alias octavia="docker run -i --rm -v \$(pwd):/home/octavia-project --network host --env-file \${OCTAVIA_ENV_FILE} --user \$(id -u):\$(id -g) airbyte/octavia-cli:0.50.7"
</pre>
<!-- /wp:enlighter/codeblock -->
<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="octavia-and-ssl">Octavia and SSL</h3>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>Unfortunately I couldnt find an easy way to get Octavia to play nicely with self-signed SSL certificates which meant we had to load in an externally “signed” SSL cert. Octavia is written in Python and uses <a href="https://pypi.org/project/requests/">requests</a> to interact with Airbyte so you could theoretically configure it to trust a self-signing certificate authority (as per <a href="https://stackoverflow.com/questions/30405867/how-to-get-python-requests-to-trust-a-self-signed-ssl-certificate">this stackoverflow post</a>).</p>
<!-- /wp:paragraph -->
<!-- wp:heading -->
<h2 class="wp-block-heading" id="keeping-an-eye-on-things">Keeping an Eye on Things</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>Once you have your sync up and running you probably want to make sure it keeps running regularly. Airflow has slack webhook integration which means that its easy enough to have it automatically notify you when sync has passed or failed.</p>
<!-- /wp:paragraph -->
<!-- wp:image {"id":54,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="/media/image-2-1024x131_69775e32.png" alt="" class="wp-image-54"/></figure>
<!-- /wp:image -->
<!-- wp:heading -->
<h2 class="wp-block-heading" id="conclusion">Conclusion</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>There are a lot of variables and moving parts to consider when using Airbyte, especially when data security and privacy are so important. In this post I outlined some hints and tips for using airbyte successfully based on my own experience of setting up the tool. Hopefully some of my observations were useful or interesting to any readers who are thinking about picking up Airbyte.</p>
<!-- /wp:paragraph -->

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View File

@ -0,0 +1,188 @@
---
title: "Prod-Ready Airbyte Sync"
date: 2023-08-14T14:37:19+01:00
description: Some tips for configuring airbyte for production-ready sync
url: /2023/8/14/stable-airbyte-sync
type: posts
thumbnail: /2023/8/14/stable-airbyte-sync/images/airbyte-inc-logo-vector.png
mp-syndicate-to:
- https://brid.gy/publish/mastodon
- https://brid.gy/publish/twitter
tags:
- airbyte
- work
- data-engineering
- softeng
---
{{<figure src="images/airbyte-inc-logo-vector.png" width="800" alt="the logo for airbyte inc" caption="Airbyte is an ELT tool for syncing data between two databases">}}
## Introduction
Airbyte is a tool that allows you to periodically extract data from one database and then load and transform it into another. It provides a performant way to clone data between databases and gives us the flexibility to dictate what gets shared at field level (for example we can copy the users table but we can omit name, address, phone number etc). There are a bunch of use cases where this kind of thing might be useful. For example, say you have a data science team who want to generate reports on how many sales your e-shop made this month and train predictive models for next month's revenue. You wouldn't want to give your data team direct access to your e-shop database because:
1. there might be sensitive personal information (SPI) in there (think names, addresses, bank details, links to what individual users ordered)
2. running this kind of analysis might impact the performance of your shop database and customers might start churning.
Instead, we can use a tool, such as airbyte, regularly make copies of a subset of the production database minus the SPI and load it into an external analytics database. The data team can then use this external database to make complex queries all day long without affecting application performance. This pattern is called Extract Load Transform or ELT.
In this post I'll summarise some strategies for using airbyte in a production environment and share some tips for navigating some of it's "rough edges" based on my own experience of setting up this tool as a pilot project for some of my clients in my day job.
## General Requirements
- We **need** to *securely* copy data from our "live" application database to our "analytics" database
- We **need** to do this without impacting the performance of the application
- We **need** to be able to do this daily so that the analytics db contains the latest information
- We **need** to be able to control which tables and columns get sent
- We **need** to limit who is able to configure airbyte and incorporate checks to prevent accidental data leakage or loss
- We **want** to be able to do this relatively cheaply
## Database Technologies
Airbyte has a large number of mature data "Source" plugins for a bunch of standard SQL databases like MySQL/MariaDB, PostgreSQL, MSSQL and so on. It's Source plugins for data warehouse systems like BigQuery are still in alpha. The reverse appears to be true for "Destination" plugins. Airbyte provides mature destination implementations for data warehouse products like Google BigQuery and Snowflake but immature alpha and beta support for syncing to a traditional RDBMS.
The full list of supportect source and destination connectors is available [here](https://airbyte.com/connectors). We are able to use the MySQL source to pull data from the core application and store our data in Google BigQuery.
## Picking an Edition of Airbyte
Airbyte comes in two "flavours":
- A hosted cloud version where you pay Airbyte to host an instance of their application on your behalf and they copy all your data around
- A self-hosted version where you install Airbyte yourself in your own infrastructure and you debug it yourself when you inevitably mess up installation instructions.
I have a risk averse client-base who have strong data protection requirements so we opted for self-hosted instances that sit in the same region and virtual network in our Google Cloud instance as our application. The target database is Google BigQuery in the same data centre region and the involved clients were ok with that.
## Picking a Virtual Machine Spec
If you opt for the self-hosted version like we did you'll need to pick a VM that has enough resources to run Airbyte. We went for google's `n2-standard-4` machine spec which has 4 CPU cores and 16GB of RAM. This was actually our second choice after picking an `e2-standard-2` which only had 8GB of RAM which was not enough to run Airbyte optimally and caused thrashing/spiking issues.
Although all the data does pass through the VM, it's done in buffered chunks so your VM doesn't need a lot of storage space - 50GiB was sufficient for our setup.
## Setting up Airbyte
We deployed Airbyte using docker-compose by following their [quick start guide](https://docs.airbyte.com/quickstart/deploy-airbyte/). We locked down access to the machine over HTTPS so that it only accepts requests from inside our corporate VPN.
We were able to create a database connection to the MySQL database via it's internal Google Cloud IP address which meant that no production data is routed outside of the virtual network during the first leg of the extraction (everything is encrypted with TLS anyway).
### CDC versus Full Refresh
When you configure a MySQL source (or indeed a bunch of other compatible sources), you can turn on either full refresh or incremental sync via change data capture. The latter makes use of logs from the SQL server to play back all of the SQL queries that have been run since the last sync and reduce the amount of data that is transferred. If you have a large database (of the order of 10s to 100s of GiB), this may be worthwhile as it is likely to accelerate the sync process significantly after the first run.
However, the current implementation of CDC/incremental sync for MySQL appears to get stuck and continue to run if you have ongoing changes being made to the system. For example, if you have a high availability application that is always in use or if you have automated processes making changes to the data around the clock, the sync driver will continue to pick up these new changes and append them on an ongoing basis unless you're able to turn off the workers or create an isolated copy of the source database (as described below).
We opted to stick with basic "full sync" as we're only copying around 10GiB of data on a daily basis and our Airbyte setup is able to do this in about 30-45 mins under normal circumstances.
### When to Sync
Ideally you want to run the sync when the system is not in use or when it is least likely to impact the ongoing operation of your primary business application. Since most of our clients operate between 9am-6pm GMT we have a nice big "out of hours" window during which we can run this sync.
If you don't have that luxury because you have a high-availability application, Google Cloud SQL has the ability to take disk snapshots that don't appear to significantly impact the database performance. We did sketch out a potential workflow that would involve using the Google Cloud SQL Admin API to:
1. Create a new disk dump of the client db
2. "Restore" the disk dump to a secondary database replica
3. Run the airbyte sync, targetting the secondary replica as the "sync"
4. Turn off the replica db
5. Rinse & repeat
However, we were able to get full sync (without incremental CDC) working on a nightly basis without adding these extra complications. This would have required us to use an external orchestrator like [Airflow](https://airflow.apache.org/) which has [Airbyte operators](https://airflow.apache.org/docs/apache-airflow-providers-airbyte/stable/operators/airbyte.html) to execute our process. Thanksfully, we were able to use the built in cron scheduler to have Airbyte run the sync nightly before our application maintenance window.
## Securing the Process
As outlined, it can be important to make sure that certain fields are not shared via airbyte. Airbyte does provide a UI for toggling fields and indeed whole tables on and off as part of sync but for schemas with large numbers of tables and columns this is time-consuming and unwieldy and is likely to lead to human error.
{{<figure src="images/table_options.png" width="800" alt="a screenshot of the airbyte ui with lots of columns and toggle buttons" caption="The UI in airbyte allows us to turn syncing on or off at field level granularity a given table but gets unwieldy at scale">}}
### Octavia CLI
Airbyte's answer to this problem is a command line tool named [Octavia](https://github.com/airbytehq/airbyte/tree/master/octavia-cli). Octavia communicates with Airbyte via a REST API and generates YAML configuration files that contain all tables, fields and configurations.
This is a game changer as it means we can script the fields that get synchronized and we can version control and quality control both the script and the config file itself. We can also gate changes to the sync config via CI tooling and "lint" the config for potential errors (e.g. by providing a script that compares the config against a blacklist of columns that are never allowed).
Below is an excerpt from one such script that might give readers some inspiration for implementing a similar process themselves:
```python
import yaml
import click
@cli.command()
@click.option("--connection-file", "-c", type=click.Path(exists=True, file_okay=True, dir_okay=False, readable=True, writable=True), required=True)
@click.option("--fix/--no-fix", type=bool, default=False)
def lint_connection(connection_file, fix):
with open(connection_file,'r') as f:
config = yaml.safe_load(f)
print(f"Reading config file for {config['resource_name']}")
print(f"Checking Connection Resource: {config['resource_name']}")
streams = config['configuration']['sync_catalog']['streams']
print(f"Found {len(streams)} configured streams (tables) from source")
errors = []
for i, stream in enumerate(streams):
name = stream['stream']['name']
if ("admin" in name) or (name in BLOCKED):
print(f"Checking {name} is not enabled for sync...")
if stream['config']['selected']:
err_string = f"ERROR: {name} must not be synced but is being synced"
errors.append(err_string)
if fix:
streams[i]['config']['selected'] = False
print(f"Found {len(errors)} problems")
for error in errors:
print(f"\t - {error}")
if len(errors) > 0:
if fix:
config['configuration']['sync_catalog']['streams'] = streams
print("Fix=True, writing updated config")
with open(connection_file, 'w') as f:
yaml.safe_dump(config, f)
else:
print("Fix=False, please manually fix any problems or rerun with --fix to resolve automatically")
else:
print("No problems found! 😊")
```
The idea here is that we run the script as part of CI and have the pipeline fail to deploy if it catches any errors and have a `--fix` mode that attempts to automatically rectify any problems which our maintainer can run locally.
### Octavia "Bug"
When I started using Octavia, I noticed that it would bug out and print error messages when I started to use change which fields are selected for sync. I found [a bug ticket](https://github.com/airbytehq/airbyte/issues/27473) about this issue and then eventually realised that the Airbyte documentation for Octavia is quite out of date and by default it installs an old version of Octavia that is not compatible with the current version of the Airbyte server itself. In order to make it work, I simply changed my `.zshrc` file (or `.bashrc` file for some) to use the latest version of the tool - which at time of writing is `0.50.7`:
```shell
OCTAVIA_ENV_FILE=/home/james/.octavia
export OCTAVIA_ENABLE_TELEMETRY=True
alias octavia="docker run -i --rm -v \$(pwd):/home/octavia-project --network host --env-file \${OCTAVIA_ENV_FILE} --user \$(id -u):\$(id -g) airbyte/octavia-cli:0.50.7"
```
### Octavia and SSL
Unfortunately I couldn't find an easy way to get Octavia to play nicely with self-signed SSL certificates which meant we had to load in an externally "signed" SSL cert. Octavia is written in Python and uses [requests](https://pypi.org/project/requests/) to interact with Airbyte so you could theoretically configure it to trust a self-signing certificate authority (as per [this stackoverflow post](https://stackoverflow.com/questions/30405867/how-to-get-python-requests-to-trust-a-self-signed-ssl-certificate)).
## Keeping an Eye on Things
Once you have your sync up and running you probably want to make sure it keeps running regularly. Airflow has slack webhook integration which means that it's easy enough to have it automatically notify you when sync has passed or failed.
{{<figure src="images/slack_notif.png" alt="a screenshot of a slack notification describing a successful airflow run">}}
## Conclusion
There are a lot of variables and moving parts to consider when using Airbyte, especially when data security and privacy are so important. In this post I outlined some hints and tips for using airbyte successfully based on my own experience of setting up the tool. Hopefully some of my observations were useful or interesting to any readers who are thinking about picking up Airbyte.

View File

@ -0,0 +1,36 @@
---
categories:
- Personal
date: '2023-08-20 21:24:31'
draft: false
tags:
- weeknotes
title: Weeknote 13-19 August 2023
type: posts
url: /2023/08/20/posts-2023-08-20-weeknote-13-19-august-20231692550760/
---
<figure>
<img width="600px" src="/media/202308201808678_597ea9da.jpeg" alt="James looking pretty happy sat with a tray of cake in front of him" /><figcaption>High Tea taking on a double meaning at the top of the Spinaker Tower</figcaption></figure>
Stuff that happened this week:
<ul>
<li>
I worked on some internal projects and wrote about my experiences of setting up <a href="https://brainsteam.co.uk/2023/8/14/stable-airbyte-sync/">Airbyte</a> for some client use cases.</li>
<li>Mrs R and I celebrated our 2nd wedding anniversary with an afternoon tea at the top of Portsmouth's <a href="https://www.spinnakertower.co.uk/">Spinnaker tower</a>. The food was delicious and the view was spectacular. Thankfully it was a lovely sunny day for it.</li>
<li>
I spent some time in our Whiteley office and went up to our London office on Friday for a couple of  meetings.</li>
<li>
On the way home from London I made the very expensive mistake of losing my car keys which meant walking 30 minutes home to get my spare key and walking back to the station to get the car. I then had to shell out £400 for a new key from the car dealership after being advised by an independent auto locksmith that my car's lock is "too fancy" for them to be able to reliably break into. I won't be doing that again in a hurry.</li>
<li>Mrs R and I finished Season 2 in our Justified rewatch as we prepare for Justified: City Primeval. Margo Martindale certainly deserved <a href="https://youtube.com/watch?v=HAyO0QNFifE">her award</a> for her portrayal of a bone-chillingly cold villain.</li>
<li>
I found some cool new feeds to follow:
<ul>
<li>
<a href="https://tracydurnell.com/mind-garden/">Tracy Durnell</a> - a freelance sustainability consultant who writes about all sorts of interesting stuff in her digital garden</li>
<li><a href="https://elizabethtai.com/">Elizabeth Tai </a>- an essayist, sci-fi writer and digital garden</li>
<li>Shout out to <a href="https://thoughtshrapnel.com/">Doug Belshaw's Thought Shrapnel </a>which I've been following for a while but which has recently come out of hiatus.</li>
</ul>
</li>
<li>I've just finished the 2nd book in William Gibson's Sprawl series</li>
</ul>
This week we have a few office days planned and a few house chores to do. I'll be up in London attending the <a href="https://www.meetup.com/london-apache-airflow-meetup/events/295297770">Airflow Meetup</a> on Thursday evening.

View File

@ -0,0 +1,61 @@
---
description: Stuff that happened this week
date: '2023-08-20T16:59:20.864696'
post_meta:
- date
tags:
- personal
- weeknotes
title: Weeknote 13-19 August 2023
type: posts
url: /posts/2023/08/20/weeknote-13-19-august-20231692550760
params:
title: Weeknote 13-19 August 2023
description: Stuff that happened this week
images:
- https://brainsteam.co.uk/media/2023/08/202308201808678.jpeg
thumbnail: https://brainsteam.co.uk/media/2023/08/202308201808678.jpeg
mp-syndicate-to:
- https://brid.gy/publish/mastodon
- https://brid.gy/publish/twitter
---
<figure>
<img width="600px" src="https://brainsteam.co.uk/media/2023/08/202308201808678.jpeg" alt="James looking pretty happy sat with a tray of cake in front of him" />
<figcaption>High Tea taking on a double meaning at the top of the Spinaker Tower</figcaption>
</figure>
<p>Stuff that happened this week:</p>
<ul>
<li>
I worked on some internal projects and wrote about my experiences of setting up <a href="https://brainsteam.co.uk/2023/8/14/stable-airbyte-sync/">Airbyte</a> for some client use cases.
<br />
</li>
<li>Mrs R and I celebrated our 2nd wedding anniversary with an afternoon tea at the top of Portsmouth's <a href="https://www.spinnakertower.co.uk/">Spinnaker tower</a>. The food was delicious and the view was spectacular. Thankfully it was a lovely sunny day for it.</li>
<li>
I spent some time in our Whiteley office and went up to our London office on Friday for a couple of  meetings.
<br />
</li>
<li>
On the way home from London I made the very expensive mistake of losing my car keys which meant walking 30 minutes home to get my spare key and walking back to the station to get the car. I then had to shell out £400 for a new key from the car dealership after being advised by an independent auto locksmith that my car's lock is "too fancy" for them to be able to reliably break into. I won't be doing that again in a hurry.
<br />
</li>
<li>Mrs R and I finished Season 2 in our Justified rewatch as we prepare for Justified: City Primeval. Margo Martindale certainly deserved <a href="https://youtube.com/watch?v=HAyO0QNFifE">her award</a> for her portrayal of a bone-chillingly cold villain.</li>
<li>
I found some cool new feeds to follow:
<ul>
<li>
<a href="https://tracydurnell.com/mind-garden/">Tracy Durnell</a> - a freelance sustainability consultant who writes about all sorts of interesting stuff in her digital garden
<br />
</li>
<li><a href="https://elizabethtai.com/">Elizabeth Tai </a>- an essayist, sci-fi writer and digital garden</li>
<li>Shout out to <a href="https://thoughtshrapnel.com/">Doug Belshaw's Thought Shrapnel </a>which I've been following for a while but which has recently come out of hiatus.</li>
</ul>
</li>
<li>I've just finished the 2nd book in William Gibson's Sprawl series</li>
</ul>
<p>
This week we have a few office days planned and a few house chores to do. I'll be up in London attending the <a href="https://www.meetup.com/london-apache-airflow-meetup/events/295297770">Airflow Meetup</a> on Thursday evening.
<br />
</p>

View File

@ -0,0 +1,83 @@
---
date: '2023-08-28T14:11:59.874991'
post_meta:
- date
tags:
- personal
- work
- filament
title: We moved offices!
type: posts
url: /posts/2023/08/28/we-moved-offices1693231919
images:
- http://brainsteam.co.uk/media/2023/08/28/1693228881_
thumbnail: http://brainsteam.co.uk/media/2023/08/28/1693228881_
mp-syndicate-to:
- https://brid.gy/publish/mastodon
- https://brid.gy/publish/twitter
---
<p>
I've been meaning to write about this for a while - we actually moved offices at the end of May!
<br />
</p>
<p>
My company <a href="https://filament.ai/">Filament</a> has, since 2017, had two UK offices. One up in London and one on the South Coast in the <a href="https://en.wikipedia.org/wiki/The_Solent">solent</a> area. I live on the south coast and I spend most of my time at the latter office. I've always been a huge advocate of hybrid or even full remote working - since long before COVID made remote working more "socially acceptable." All of our staff have always had the option to work from home when they want or come in and spend time on site if they prefer. We have a small number of fully remote staff who live on the other side of the country from our office space. People who live near one of our hub offices tend to balance their time between home and the office according to what works for them.
<br />
</p>
<h2>
Our Pre-COVID Setup
<br />
</h2>
<figure>
<img src="http://brainsteam.co.uk/media/2023/08/28/1693229548_" height="500px" alt="an large and airy office space with a few desks, some potted plants in the foreground" />
<figcaption>Our old USSP was large and airy and had breakout areas and a kitchenette.</figcaption>
</figure>
<p>Most of our tech team are located on the south coast and I was given the mandate to
make our Solent office as much of a "developers' paradise" as possible - a place where people would want to come and spend time solving problems together and socialising.</p>
<p>From 2017 to May we were based at the University of Southampton's Science Park (USSP) nestled away near a small village, Chilworth, just north of Southampton and surrounded by woodland.</p>
<p>
The science park itself is a pretty nice spot, you can do loads of walks and there's a really lovely on site cafe. If you want a bit of variation, there's a pub within walking distance with a large beer garden and the team and I spent many extended lunch breaks  sat out there on a sunny afternoon.
<br />
</p>
<p>Pre-covid we had a really nice big office space on the science park with a pool table and a little kitchen area. People like being there and most of the time, local-based folks would come in a few days a week and we'd hang out, play some games of pool, get lunch together, that kind of stuff.</p>
<h2>
During and Post-COVID
<br />
</h2>
<figure>
<img src="http://brainsteam.co.uk/media/2023/08/28/1693230404_" height="500px" alt="a cluttered office space full of desks and too many chairs" />
<figcaption>Our post-covid USSP office was small and full of furniture from our rush to downsize</figcaption>
</figure>
<p>Unfortunately, we ended up downsizing during lockdown and that was sub-optimal for a few reasons. There wasn't anything wrong with the space per-se, but it was small and uninspiring and when it got busy, it was really hard to concentrate. It probably didn't help that it was half full with flat-packed furniture from our older larger space making it feel cluttered and scruffy. Also, post-COVID working patterns have changed a lot. </p>
<p>Now people want to spend more time at home but tend to congregate in the office when there's a big in-person meeting, a birthday meal or a well-liked full-remoter is in town for a few days. This leads to a bit of a weird pattern where the office is at maybe 50-60% capacity most of the time and then suddenly experiences big bursts where everyone wants to be in at the same time. In the "small" USSP office these bursts probably meant you weren't going to get any work done that day and there wasn't really anywhere to go and take calls unless you paced in the corridor, booked a meeting room, or as I started doing towards the end of our stay there, lurk in the mail room. </p>
<p>When we raised some money in April, we decided to start looking for a new space. We figured that we probably wanted some kind of new "hybrid" deal to facilitate these new ways of working. Ideally, a smallish office with access to a communal breakout space/lounge area and ideally some small phone pods where we can take calls. We spoke to the USSP and unfortunately they were not able to offer a deal like this although they did tell us that they're working on revamping the building that we were in to provide some of these amenities. So we widened our search.</p>
<h2>
Our new Space and Whiteley Village
<br />
</h2>
<p>We looked at a few local offices before settling on Spaces Whiteley. It's about 20 minutes down the motorway from the old office location and it's a modern co-working setup managed by <a href="https://work.iwgplc.com/">IWG</a> (the guys who also own Regus). </p>
<figure>
<img src="http://brainsteam.co.uk/media/2023/08/28/1693231831_" height="500px" alt="James standing with his back to the camera in a light breezy office space" />
</figure>
<figure>
<img src="http://brainsteam.co.uk/media/2023/08/28/1693231832_" height="500px" alt="A sofa and chairs in a large open breakout area" />
</figure>
<figure>
<img src="http://brainsteam.co.uk/media/2023/08/28/1693231833_" height="500px" alt="A breakout space with a coffee bar and a pool table" />
</figure>
<p>There's a pool table (ah we missed you pool), loads of communal break-out space with comfy seating and a couple of sound-proofed phone booths for us to take calls from when the office gets busy.</p>
<p>Like USSP it has loads of really nice scenery and walks nearby but it definitely wins in terms of amenities. It's a 15 minute walk from an outdoor mall with a bunch of different restaurants and coffee shops.</p>
<br />
<figure>
<img src="http://brainsteam.co.uk/media/2023/08/28/1693228881_" height="500px" alt="A square with some cafes and restaurants" />
</figure>
<figure>
<img src="http://brainsteam.co.uk/media/2023/08/28/1693228880_" height="500px" alt="A lake with some ducks and swans in the foreground" />
</figure>
<p>
I think the team have generally been enjoying the new space more too. People tend to want to come in more frequently and make use of the new space a few days a week. I've been enjoying going in more regularly too. The new office location means that I no longer need to drive on the motorway to get to work so I'm considering starting to cycle in a couple of times a week instead.
<br />
</p>

View File

@ -0,0 +1,53 @@
---
date: '2023-09-16T15:31:25.501556'
post_meta:
- date
tags:
- personal
- vacation
title: We went on holiday
type: posts
url: /posts/2023/09/16/we-went-on-holiday1694878285
thumbnail: http://brainsteam.co.uk/media/2023/09/16/1694876599_
images:
- http://brainsteam.co.uk/media/2023/09/16/1694876599_
mp-syndicate-to:
- https://brid.gy/publish/mastodon
- https://brid.gy/publish/twitter
---
<p>Last week we were on holiday in Cyprus. It was lovely. The trip was supposed to be a relaxing "lie by the swimming pool and do very little" kind of trip to try to force us to relax and reset after what's been a pretty busy year. I think we successfully achieved it.</p>
<figure>
<img height="500" src="http://brainsteam.co.uk/media/2023/09/16/1694876599_" alt="a swimming pool on a fine summer's day with various shades and parasols. The water looks cool and inviting." />
<figcaption>The Pool Area at the King Jason Hotel in Protaras, Cyprus</figcaption>
</figure>
<p>We flew from London to Cyprus and got a coach to our hotel. We stayed at <a href="https://thekingjasonprotaras.com/">The King Jason</a>, an adults-only all inclusive resort in Protaras a few miles up the coast from Ayia Napa. We are not really "party people" so I didn't want to be too close to the late night revelers. The hotel was superb and from the moment we arrived to the moment we left I felt looked after and relaxed.</p>
<p>Neither myself or Mrs R are particularly heavy drinkers so apart from the odd Piña colada, I didn't realy make use of the "unlimited drinks" but the food was absolutely amazing. The hotel put out amazingly diverse and fresh buffet spreads every day and presented them beautifully.</p>
<figure>
<img src="http://brainsteam.co.uk/media/2023/09/16/1694877230_" alt="a beautifully arranged assortment of sushi, salads and sauces" width="600" />
<figcaption>Asian Fusion Night at the King Jason restaurant - fresh california rolls galore!</figcaption>
</figure>
<p>We could have probably eaten ourselves silly but we tried to be relatively controlled, only going to the buffet at meal times and avoiding ordering snacks during the day. On Sunday the restaurant did a Sunday Roast which seemed weirdly anglophilic but probably made sense given the target audience and customer-base (I never will understand British holidaymakers who travel to foreign countries and want to eat cooked breakfasts and chicken dinners). The rest of the nights rotated through different themes and we got to try lots of Greek and Turkish style cuisines.</p>
<p>We didn't really leave the resort very much except for attending a drag variety show called <a href="https://www.stardustvarietyshow.co.uk/">Stardust</a> where the drag artists sang, did stand up comedy and danced, a very entertaining evening (also included in the price was unlimited drinks and <i>quelle supris</i> a roast chicken dinner - which, in fairness, was delicious).</p>
<p>
We also went for a walk up and down the Protaras coastline a couple of times. We went for a swim in the sea near a bay where we'd been told we might see sea turtles. We didn't see any turtles but we did make friends with some of the stray cats near the hotel. Mrs R wanted to bring the cats home with us but I didn't think our cats would get along with the new additions to the family.
<br />
</p>
<figure>
<img src="http://brainsteam.co.uk/media/2023/09/16/1694877793_" alt="a tabby cat sat on a wooden boardwalk" height="500" />
<figcaption>
One of the stray cats we befriended
<br />
</figcaption>
</figure>
<p>
In between exploring, swimming, eating and napping I spent a lot of time reading. I finally finished William Gibson's sprawl trilogy which I thoroughly enjoyed. I DNFed <a href="https://bookwyrm.social/book/838723/s/cryptonomicon">Neal Stephenson's Cryptonomicon</a> (I just didn't get on with his style of worldbuilding) and I got about half way through Larry Niven's <a href="https://bookwyrm.social/book/457019/s/ringworld">Ringworld</a> which I understand is the spiritual precursor to the Halo series. I also read and made notes on some few articles in my <a href="https://omnivore.app/">Omnivore</a> backlog and kept up with my RSS feeds.
<br />
</p>
<p>I did take my steam deck but I managed to avoid playing it very much and preferred to read or peoplewatch.</p>
<p>
Overall I think we both had a really great time and we'd probably consider going back to the King Jason again for a "do nothing" sort of holiday although normally we prefer active breaks where we go and visit stuff. It was a very restorative and much needed break after a very manic few weeks and months at work. I came home feeling refreshed and ready to make<a href="https://creativefuel.substack.com/p/the-return-to-everyday-life"> la rentree </a>and to start something new.
<br />
</p>

View File

@ -0,0 +1,34 @@
---
title: "Weeknote 18-24 Sept"
date: 2023-09-24T19:22:17+01:00
description: short summary
url: /2023/9/24/weeknote-18-24-sept
type: posts
mp-syndicate-to:
- https://brid.gy/publish/mastodon
- https://brid.gy/publish/twitter
tags:
- post
- personal
- weeknotes
---
Another week has flown by and September is coming to an end. Autumn, incidentally, my favourite season, is here. As ever, September is a monumentally busy month at work as clients and colleagues alike come back from summer holidays. It's also the time of year when I like to kickstart personal projects and chores around the house.
Due to some bad timing with colleague holidays this week, I spent some time doing some front-line data science work and I welcomed the opportunity to get my hands dirty and reflected on how python package management is still nightmarish in 2023. I think my own advice from a couple of years back is [still pretty relevant](https://brainsteam.co.uk/2021/04/01/opinionated-guide-to-virtualenvs/).
As we approach the end of the third quarter, it's also time to review what we did over the summer amidst all the disruption of pretty much doubling the size of our team. The next quarter is going to probably be about building and embedding scalable ways of working into the team so that we can really ramp up the number of clients we can look after. I've been digging around in [the platform](https://syfter.ai), attempting to uncover some metrics around processing throughput and hopefully start to drive them up. In order to do this, I've been playing with different types of clustered indices in MySQL which was good fun.
It's been a pretty busy week on the home front with various extraordinary chores going on: dentist visits, trips to the garage with the car and a plumber visiting to do some work on our central heating. The combination of work and home tasks has felt a little overwhelming at times and I've ended up asleep on the sofa by 9pm a couple of nights.
While I wait for [an Nvidia Linux driver fix so that I can run Starfield](https://forums.developer.nvidia.com/t/starfield-does-not-launch-on-most-nvidia-gpus-on-linux-and-not-at-all-on-pascal-gpus/265483/37), I've been playing my way through Mass Effect Legendary Edition. I finished the first game last week and I've been putting a few hours into ME2 during evenings this week. I'm also reading Rimworld by Larry Niven which I've noticed has some pretty bad misogynistic stuff in it that's put me off a little bit.
Last week I purchased [a new router](https://www.asus.com/networking-iot-servers/wifi-routers/asus-wifi-routers/rt-ac85p/) with the intention of installing and running [OpenWRT](https://openwrt.org/) on it. I managed to flash the device but when I ran a speedtest, I noticed I was only getting 300 MBPs on our 1 GBPS home internet (first world problems I know). After some reading, it turns out that OpenWRT doesn't seem to have hardware support for some of the network kit in the router, so it was CPU throttling the connection. I ended up spending some time reflashing the stock firmware onto the router. The ASUS firmware is reasonably good out of the box anyway. It supports all the standard port forwarding I need for my home server plus DynDNS and a VPN client (so I can force all traffic on my home network to run via a VPN if I want to).
Today we spent some time decluttering my home office. It's needed a good tidy for a few months so it was nice to finally get around to spending some time doing that. I did find a huge number of blank paper journals and notebooks that I've yet to fill. I think I may have a slight addiction...
## Next Week
I've got another busy September week coming up with a company retreat, an appearance at our board meeting and a visit to my parents in Shropshire next weekend.
I am aiming to try to keep up more consistent journaling practice this coming week.

View File

@ -0,0 +1,71 @@
---
date: '2023-09-27T09:23:58.448114'
post_meta:
- date
tags:
- nlp
- ai
- llms
- philosophy
title: Crappy Printers and Crappy Content
type: posts
url: /posts/2023/09/27/crappy-printers-and-crappy-content1695806638
---
<p>
<b><i>Fair warning: Some of the quotes in this post are a bit sweary.</i></b>
</p>
<p>
I've been reflecting on a few articles that I've read over the last couple of days about consumer trends in devices and parallels with generated content. I'm sure everyone's sick of "yet another hot take on <a href="https://pluralistic.net/2023/01/21/potemkin-ai/#hey-guys">enshittification</a>" - but what about an optimistic one?
<br />
</p>
<p>
Anyone who's had to interact with a printer in the last few years will have noticed how painful the experience was. <a href="https://www.tumblr.com/foone/729481656357044224/why-are-printers-so-hated-its-simple-computers">FWIW I think this is the </a><a href="https://www.theverge.com/23642073/best-printer-2023-brother-laser-wi-fi-its-fine">best printer review </a>and actual printer. However, t<a href="https://www.tumblr.com/foone/729481656357044224/why-are-printers-so-hated-its-simple-computers">his post by foone</a> on tumblr summarises the current state of the consumer-grade printing industry rather well:
<br />
<br />
</p>
<blockquote>
there's a fundamental limit of how much you can optimize an inkjet printer, and we got near to it in like the late 90s. Every printer since then has just been a tad smaller, a tad faster, and added some gimmicks like printing from WIFI or bluetooth instead of needing to plug in a cable...
<br />
<br />
...that's the worst place to be in, for a computer component. The "I don't care how fancy it is, just give me one that works" zone....
<br />
<br />
...Printers fell into that zone long, long ago, when people stopped getting excited about "desktop publishing". So with printers shoved into the "make them as cheap as possible" zone, they have gotten exponentially shittier. Can you cut costs by 5$ a printer by making them jam more often? good. make them only last a couple years to save a buck or two per unit? absolutely. Can you make the printer cost 10$ less and make that back on the proprietary ink cartridges? oh, they've been doing that since Billy Clinton was in office
</blockquote>
<p>
This post stuck in my head because I'm seeing some parallels here between printing and media. Social media companies sell ads and to get people to look at ads, they need cheap content. The content doesn't need to be a masterpiece or a classic or really have anything interesting going for it other than "keep the reader on the page for 10 seconds so that they look at this ad". Just as with printers, this "market-driven" need to make content "just good enough" is bad news. We <a href="https://www.cnbc.com/2023/04/20/buzzfeed-will-lay-off-15percent-of-staff-shutter-its-news-unit.html">already passed peak listicles and quizzes </a>and now we have models that can churn out coherent-yet-bland long form "content". Search engine results are going down the pan and AI generated books are already wreaking havoc and <a href="https://www.theguardian.com/technology/2023/sep/01/mushroom-pickers-urged-to-avoid-foraging-books-on-amazon-that-appear-to-be-written-by-ai">giving people terrible advice</a>.
<br />
</p>
<p>
So then should we just lie down, defeated and adopt a doom and gloom philosophy here? As<a href="https://www.newyorker.com/books/page-turner/rethinking-the-luddites-in-the-age-of-ai"> Kyle Chayka recently wrote,</a> there are parallels here with industrial automation and the Luddite movement and this quote in particular stands out to me (via <a href="https://simonwillison.net/2023/Sep/27/kyle-chayka/">Simon Willison</a>):
<br />
</p>
<blockquote>
<p>The market was being flooded with cheaper, inferior goods such as “cut-ups,” stockings made from two pieces of cloth joined together, rather than knit as one continuous whole... At the time of the Luddites, many hoped the subpar products would prove unacceptable to consumers or to the government. Instead, social norms adjusted.</p>
</blockquote>
<p>Do we think that social norms will adjust? Well that's interesting because the comparison between what was happening then and what is happening now isn't straight forward. Whilst the industrial revolution changed a lot and made many jobs redundant, it also meant <a href="https://rootsofprogress.org/cost-quality-and-the-efficient-frontier">things became cheaper for end consumers </a>and made things more accessible for a large volume of people. In other words, it generated a quality-of-life improvement for everyday people.</p>
<p>On the other hand, most of the benefits of "generative" AI currently being touted by those in the tech industry relate to cost reduction on the supply side rather than providing increased quality of reduced price on the consumer side. Most people already have smartphones, social media accounts and social media accounts and access to huge libraries of content for the price of their attention or some nominal fee. As platforms enshittify, reducing the quality of their "product" and in the same breath increasing their fees, they are actually giving consumers worsening deals.</p>
<p>
At the same time, we're seeing a huge resurgence in indie blogs and federated self-hosted social platforms where people own the content and produce hand-written articles and film videos because they're passionate about what they do. As much as the social media silos try to hide it, <a href="https://yr.media/tech/twitter-threads-spill-bluesky-instagram-facebook-elon-musk/">people are leaving in droves </a>and <a href="https://inews.co.uk/news/technology/threads-meta-twitter-killer-what-went-wrong-2548526">corporate replacements are flopping</a>.
</p><p>People are sick of low-quality content and having ads rammed down their throat with increasing aggression and avarice.
<br />
</p>
<p>
The post on printers finishes with a dose of optimism:
<br />
</p>
<blockquote>
<p>
So, in conclusion: Printers suck, but this is both an innate problem caused by them having to deal with so much fucking Real World, and a local minima of reliability that we're currently stuck in. Eventually we'll get out of this valley on the graph and printers will bother people a lot less.
<br />
</p>
</blockquote>
<p>
In my, perhaps overly optimistic conclusion, we're likely in a local minimum of quality for arts and media but this is unlikely to last forever and society is already showing signs that we won't be accepting this norm like we did low-quality stockings. Maybe then we can get back to using AI and NLP for <a href="https://brainsteam.co.uk/2023/3/25/nlp-is-more-than-just-llms/">useful and interesting things</a> like curing disease, helping people, tracking and highlighting interesting and useful trends in scientific research or making factories safer and consumer devices more reliable.
<br />
</p>

Some files were not shown because too many files have changed in this diff Show More