<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel><title>Tempered Works Ltd.</title><description>Software and Data Consulting Services</description><link>https://tempered.works/</link><atom:link href="https://tempered.works/feed_rss_created.xml" rel="self" type="application/rss+xml" /><managingEditor>brabster</managingEditor><language>en</language> <pubDate>Sat, 20 Dec 2025 20:41:24 -0000</pubDate> <lastBuildDate>Sat, 20 Dec 2025 20:41:24 -0000</lastBuildDate> <ttl>1440</ttl> <generator>MkDocs RSS plugin - v1.16.0</generator> <item> <title>How to get pwned with --extra-index-url</title> <author>brabster</author> <category>automation</category> <category>operations</category> <category>security</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;figure&gt; &lt;img alt=&#34;A diagram illustrating a dependency confusion attack using Python&#39;s pip. The layout compares a &amp;quot;private registry&amp;quot; hosting a safe package (version 0.0.1) against a &amp;quot;public registry&amp;quot; hosting a malicious package of the same name (version 1.0.0). An arrow from the private registry is labeled &amp;quot;nope, too old,&amp;quot; while an arrow from the public registry is labeled &amp;quot;winner!&amp;quot; pointing to the user&#39;s computer. The computer is stamped &amp;quot;COMPROMISED&amp;quot; because pip prioritized the higher version number found on the public index.&#34; src=&#34;https://tempered.works/2025-12-06-how-to-get-pwned-with---extra-index-url/assets/scenario.webp&#34;&gt;&lt;/figure&gt;&lt;p&gt;Python&#39;s built-in pip package manager is unsafe when used with the &lt;code&gt;--extra-index-url&lt;/code&gt; flag (there are other dangerous variants too). An attacker can publish a malicious package with the same name and a higher version to PyPI, and their package will be installed.&lt;/p&gt;&lt;p&gt;This post confirms that the vulnerability (&lt;a href=&#34;https://nvd.nist.gov/vuln/detail/cve-2018-20225&#34;&gt;CVE-2018-20225&lt;/a&gt;) is still a problem today. &lt;a href=&#34;https://github.com/pypa/pip/issues/12874&#34;&gt;Despite the CVSS 7.8 (High) CVSS score, the maintainers have refused to change the behaviour&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I also introduce &lt;a href=&#34;https://github.com/brabster/cve-2018-20225&#34;&gt;a test suite and publicly-available test packages&lt;/a&gt; that you can use to more easily confirm the safety - or not - of your own setup.&lt;/p&gt;</description><link>https://tempered.works/posts/2025/12/06/how-to-get-pwned-with---extra-index-url/</link> <pubDate>Sat, 06 Dec 2025 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2025/12/06/how-to-get-pwned-with---extra-index-url/</guid> </item> <item> <title>UDAFs, stored procedures and more in dbt</title> <author>brabster</author> <category>insights</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;A screenshot showing a stored procedure in the BigQuery console, with dbt compilation details in a comment block.&#34; src=&#34;https://tempered.works/2025-08-04-udafs-stored-procedures-and-more-in-dbt/assets/sp.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;It&#39;s been over a year since I first wrote about &lt;a href=&#34;https://tempered.works/posts/2024/02/19/materialized-udfs-in-a-dbt-world/&#34;&gt;managing UDFs using custom dbt materializations&lt;/a&gt;. The approach has held up well, but a recent project required me to go further and bring UDAFs (user-defined aggregate functions) and stored procedures into the fold. The same approach worked well, and &lt;a href=&#34;https://github.com/dbt-labs/dbt-core/blob/main/docs/roadmap/2025-05-new-engine-same-language.md#out-of-the-box-support-for-udfs&#34;&gt;dbt Labs are considering adding formal support for UDFs&lt;/a&gt;!&lt;/p&gt;</description><link>https://tempered.works/posts/2025/08/04/udafs-stored-procedures-and-more-in-dbt/</link> <pubDate>Mon, 04 Aug 2025 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2025/08/04/udafs-stored-procedures-and-more-in-dbt/</guid> </item> <item> <title>BigQuery, safer by default from September 2025</title> <author>brabster</author> <category>insights</category> <category>operations</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;A snippet of an email from Google, showing the change in BigQuery project quota defaults&#34; src=&#34;https://tempered.works/2025-07-17-bigquery-will-be-safer-by-default/assets/mail.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;On September 1st 2025, Google will make BigQuery a lot safer by default, changing the default quotas for projects under the default on-demand pricing model. Instead of unlimited financial damage, the default for new projects will be around $1000 per day. Existing projects will be updated to a custom limit based on prior 30-day usage. No changes to existing limits.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Thanks to &lt;a href=&#34;https://equalexperts.com&#34;&gt;&lt;img alt=&#34;Equal Experts logo&#34; src=&#34;https://tempered.works/assets/images/equal-experts-logo-colour-100px.webp&#34;&gt;&lt;/a&gt; for supporting this content.&lt;/li&gt;&lt;/ul&gt;</description><link>https://tempered.works/posts/2025/07/17/bigquery-safer-by-default-from-september-2025/</link> <pubDate>Thu, 17 Jul 2025 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2025/07/17/bigquery-safer-by-default-from-september-2025/</guid> </item> <item> <title>GitHub Codespaces, one year later</title> <author>brabster</author> <category>operations</category> <category>security</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;A screenshot of the GitHub web UI option to create a new Codespace on main&#34; src=&#34;https://tempered.works/2025-06-07-my-year-with-github-codespaces/assets/codespaces_hero.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;Back in early 2024 I tried GitHub Codespaces, and quickly ditched my local dev setup entirely. This post shares my experience going cloud-native for development: benefits for onboarding, agility, and security, alongside the real-world snags like network dependency and unexpected billing quirks.&lt;/p&gt;</description><link>https://tempered.works/posts/2025/06/07/github-codespaces-one-year-later/</link> <pubDate>Sat, 07 Jun 2025 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2025/06/07/github-codespaces-one-year-later/</guid> </item> <item> <title>GROUP BY ALL solves a really annoying SQL problem</title> <author>brabster</author> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;hero image&#34; src=&#34;https://tempered.works/2025-05-29-group-by-all-solves-a-really-annoying-sql-problem/assets/modified_query.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;Does your SQL still copy most of your columns from &lt;code&gt;SELECT&lt;/code&gt; after &lt;code&gt;GROUP BY&lt;/code&gt;?&lt;/p&gt;&lt;p&gt;Behold: &lt;code&gt;GROUP BY ALL&lt;/code&gt;.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Thanks to &lt;a href=&#34;https://equalexperts.com&#34;&gt;&lt;img alt=&#34;Equal Experts logo&#34; src=&#34;https://tempered.works/assets/images/equal-experts-logo-colour-100px.webp&#34;&gt;&lt;/a&gt; for supporting this content.&lt;/li&gt;&lt;/ul&gt;</description><link>https://tempered.works/posts/2025/05/29/group-by-all-solves-a-really-annoying-sql-problem/</link> <pubDate>Thu, 29 May 2025 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2025/05/29/group-by-all-solves-a-really-annoying-sql-problem/</guid> </item> <item> <title>My path to consultancy</title> <author>brabster</author> <category>operations</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;A country road stretches off into the sunny, leafy distance as my little boy cycles his favourite route home from school&#34; src=&#34;https://tempered.works/2025-05-11-my-consulting-story/assets/country_road.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;I had big doubts about becoming a consultant or contractor. Could I do it? Would I find work? Could I run my own business? Would I need to change who I am, wear a suit, or buy a briefcase? Seven years have flown by since I took the plunge, so I&#39;m going to share my story in case it&#39;s helpful for you!&lt;/p&gt;</description><link>https://tempered.works/posts/2025/05/11/my-path-to-consultancy/</link> <pubDate>Sun, 11 May 2025 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2025/05/11/my-path-to-consultancy/</guid> </item> <item> <title>Rethinking the guest network to improve my home network security</title> <author>brabster</author> <category>operations</category> <category>security</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;Network diagram showing the internet connected to a router, linked to four devices: tablet, mobile phone, laptop, and IoT device.&#34; src=&#34;https://tempered.works/2025-03-23-rethinking-the-guest-network-to-improve-my-home-network-security/assets/schematic_guest_network.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;I believe that making my guest network my default network reduces the potential harm a compromised app or device can cause. What was my &#34;trusted&#34; network is now my &#34;untrusted&#34; network, with only a few low-risk devices that &lt;strong&gt;really&lt;/strong&gt; need local network connectivity connected to it, isolated from other devices that matter like my phone and work laptop.&lt;/p&gt;&lt;p&gt;It&#39;s a simple change in how I use my home network, and does not require in-depth knowledge and experience. Having operated this way at home for a few months now, I&#39;ve found little impact on day-to-day usability, but it&#39;s really helped me sleep better at night. I&#39;ll explain what I changed, why, and how I&#39;ve adjusted my wider thinking on my home network security to take better advantage of this approach.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Thanks to &lt;a href=&#34;https://equalexperts.com&#34;&gt;&lt;img alt=&#34;Equal Experts logo&#34; src=&#34;https://tempered.works/assets/images/equal-experts-logo-colour-100px.webp&#34;&gt;&lt;/a&gt; for supporting this content.&lt;/li&gt;&lt;/ul&gt;</description><link>https://tempered.works/posts/2025/03/23/rethinking-the-guest-network-to-improve-my-home-network-security/</link> <pubDate>Sun, 23 Mar 2025 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2025/03/23/rethinking-the-guest-network-to-improve-my-home-network-security/</guid> </item> <item> <title>Generating portable and user-friendly identifiers</title> <author>brabster</author> <category>insights</category> <category>operations</category> <category>performance</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;A screenshot of the BigQuery console, with example SQL for generating an identfier from a string value as I outline below&#34; src=&#34;https://tempered.works/2025-03-08-generating-portable-and-user-friendly-identifiers/assets/image.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;I&#39;ll share how I generate unique identifiers from data in 2025, avoiding the pitfalls I&#39;ve seen along the way. TL;DR: I&#39;m using &lt;a href=&#34;https://en.wikipedia.org/wiki/MD5&#34;&gt;MD5&lt;/a&gt; to produce a digest from a string or bytes value, then I&#39;m using plain old &lt;a href=&#34;https://en.wikipedia.org/wiki/Hexadecimal&#34;&gt;hexadecimal&lt;/a&gt; encoding of that digest, specifying upper or lowercase for the alpha characters. This solution meets the needs I describe next.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Thanks to &lt;a href=&#34;https://equalexperts.com&#34;&gt;&lt;img alt=&#34;Equal Experts logo&#34; src=&#34;https://tempered.works/assets/images/equal-experts-logo-colour-100px.webp&#34;&gt;&lt;/a&gt; for supporting this content.&lt;/li&gt;&lt;/ul&gt;</description><link>https://tempered.works/posts/2025/03/08/generating-portable-and-user-friendly-identifiers/</link> <pubDate>Sat, 08 Mar 2025 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2025/03/08/generating-portable-and-user-friendly-identifiers/</guid> </item> <item> <title>Using AWS billing to track down lost resources</title> <author>brabster</author> <category>operations</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;hero image&#34; src=&#34;https://tempered.works/2025-02-09-using-aws-billing-to-track-down-lost-resources/assets/aws_billing_console.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;My AWS bill was higher than I expected, and it wasn&#39;t immediately clear what was driving the cost. Here&#39;s how I tracked down the culprits.&lt;/p&gt;</description><link>https://tempered.works/posts/2025/02/09/using-aws-billing-to-track-down-lost-resources/</link> <pubDate>Sun, 09 Feb 2025 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2025/02/09/using-aws-billing-to-track-down-lost-resources/</guid> </item> <item> <title>Testing stored procedures</title> <author>brabster</author> <category>insights</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;hero image&#34; src=&#34;https://tempered.works/2025-01-18-testing-stored-procedures/assets/hero.webp&#34;&gt;&lt;/p&gt;&lt;h2 id=&#34;update-august-2025&#34;&gt;Update August 2025&lt;a class=&#34;headerlink&#34; href=&#34;https://tempered.works/posts/2025/01/18/testing-stored-procedures/#update-august-2025&#34; title=&#34;Permanent link&#34;&gt;¶&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Since writing this post, I&#39;ve found a clean way to handle stored procedures and their outputs for dbt users by treating them as materializations. This makes testing them as straightforward as testing any other dbt model. Read more in &lt;a href=&#34;https://tempered.works/posts/2025/08/04/udafs-stored-procedures-and-more-in-dbt/&#34;&gt;UDAFs, stored procedures and more in dbt&lt;/a&gt;.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;Whilst I&#39;ve used and written about UDFs a lot, I can&#39;t recall ever having a reason to work with stored procedures. When I was asked how I&#39;d go about wrapping them in automation and testing, I thought it&#39;d be a good excuse to take a look and see how I might go about testing them!&lt;/p&gt;</description><link>https://tempered.works/posts/2025/01/18/testing-stored-procedures/</link> <pubDate>Sat, 18 Jan 2025 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2025/01/18/testing-stored-procedures/</guid> </item> <item> <title>Avoiding CAST ROW in AWS Athena SQL</title> <author>brabster</author> <category>insights</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;The Trino issue that makes row aggregations so much easier to work with&#34; src=&#34;https://tempered.works/2024-11-18-avoiding-cast-row-in-aws-athena-sql/assets/row_subqueries.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;There is more than one way to build a &lt;code&gt;ROW&lt;/code&gt; in AWS Athena and the underlying Trino engine. It turns out I was doing it the verbose, brittle and really annoying way. Row subqueries are so much better!&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Thanks to &lt;a href=&#34;https://equalexperts.com&#34;&gt;&lt;img alt=&#34;Equal Experts logo&#34; src=&#34;https://tempered.works/assets/images/equal-experts-logo-colour-100px.webp&#34;&gt;&lt;/a&gt; for supporting this content.&lt;/li&gt;&lt;/ul&gt;</description><link>https://tempered.works/posts/2024/11/18/avoiding-cast-row-in-aws-athena-sql/</link> <pubDate>Mon, 18 Nov 2024 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2024/11/18/avoiding-cast-row-in-aws-athena-sql/</guid> </item> <item> <title>dbt-core vulnerability PVE-2024-73530</title> <author>brabster</author> <category>insights</category> <category>security</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;SafetyCLI check output for the vulnerability&#34; src=&#34;https://tempered.works/2024-11-06-dbt-core-vulnerability-pve-2024-73530/assets/vuln_report.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;I noticed failing builds this week, with a dbt-core vulnerability flagged by SafetyCLI as the culprit. There was no actionable information in the command line output, so here&#39;s what I found and my action.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Thanks to &lt;a href=&#34;https://equalexperts.com&#34;&gt;&lt;img alt=&#34;Equal Experts logo&#34; src=&#34;https://tempered.works/assets/images/equal-experts-logo-colour-100px.webp&#34;&gt;&lt;/a&gt; for supporting this content.&lt;/li&gt;&lt;/ul&gt;</description><link>https://tempered.works/posts/2024/11/06/dbt-core-vulnerability-pve-2024-73530/</link> <pubDate>Wed, 06 Nov 2024 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2024/11/06/dbt-core-vulnerability-pve-2024-73530/</guid> </item> <item> <title>Google Chrome Oct 15 update broke GitHub Codespaces</title> <author>brabster</author> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;Codespaces error &#39;Connection error unauthorised client refused&#39; appears when connecting to Codespace&#34; src=&#34;https://tempered.works/2024-10-20-google-chrome-oct-15-update-break/assets/codespaces_broken.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;The Oct 15, 2024 update of Google Chrome stable (130.0.6723.58) suddenly broke some sites, such as GitHub Codespaces and 1Password, due to a JavaScript-related setting.&lt;/p&gt;</description><link>https://tempered.works/posts/2024/10/27/google-chrome-oct-15-update-broke-github-codespaces/</link> <pubDate>Sun, 27 Oct 2024 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2024/10/27/google-chrome-oct-15-update-broke-github-codespaces/</guid> </item> <item> <title>Time travelling with change data capture</title> <author>brabster</author> <category>insights</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;Visualisation of effects of end timestamps on a series of transactions&#34; src=&#34;https://tempered.works/2024-08-15-time-travel-change-data-capture/assets/end_timestamp_viz.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;In the last article of the series, I ran into difficulties as I tried to &#34;time-travel&#34; back to earlier points in time. That&#39;s an important capability for correct functioning and reproducing results. This article shows how to use window functions (also known as analytic functions) to simplify handling of processing time and avoid the previous problems.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Thanks to &lt;a href=&#34;https://equalexperts.com&#34;&gt;&lt;img alt=&#34;Equal Experts logo&#34; src=&#34;https://tempered.works/assets/images/equal-experts-logo-colour-100px.webp&#34;&gt;&lt;/a&gt; for supporting this content.&lt;/li&gt;&lt;/ul&gt;</description><link>https://tempered.works/posts/2024/08/18/time-travelling-with-change-data-capture/</link> <pubDate>Sun, 18 Aug 2024 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2024/08/18/time-travelling-with-change-data-capture/</guid> </item> <item> <title>Map over an array in BigQuery</title> <author>brabster</author> <category>insights</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;SQL snippet for map explained in post&#34; src=&#34;https://tempered.works/2024-07-31-map-over-array-in-bigquery/assets/map_sql.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;This walkthrough shows how I can use the functional programming techniques &lt;code&gt;map&lt;/code&gt; and &lt;code&gt;filter&lt;/code&gt; that I already know and love in SQL engines like BigQuery. These techniques give me a lot of processing power whilst keeping my SQL simple and relatively easy to understand. Unlike custom code, I can use the same SQL and infratructure I&#39;d use to process ten rows to process ten billion rows in seconds.&lt;/p&gt;</description><link>https://tempered.works/posts/2024/07/31/map-over-an-array-in-bigquery/</link> <pubDate>Wed, 31 Jul 2024 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2024/07/31/map-over-an-array-in-bigquery/</guid> </item> <item> <title>Preventing data theft with GCP service controls</title> <author>brabster</author> <category>operations</category> <category>security</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;The error message indicating that VPC service controls are protecting&#34; src=&#34;https://tempered.works/2024-07-06-preventing-data-theft-with-gcp-service-controls/assets/controls_protecting.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;I recently discovered and responsibly disclosed &lt;a href=&#34;https://www.equalexperts.com/blog/tech-focus/are-you-at-risk-from-this-critical-dbt-vulnerability/&#34;&gt;a vulnerability in the dbt analytics engineering solution&lt;/a&gt;. Google Cloud services are my default choice to process data, so I looked into how I could protect myself from data theft when I&#39;m using BigQuery.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Thanks to &lt;a href=&#34;https://equalexperts.com&#34;&gt;&lt;img alt=&#34;Equal Experts logo&#34; src=&#34;https://tempered.works/assets/images/equal-experts-logo-colour-100px.webp&#34;&gt;&lt;/a&gt; for supporting this content.&lt;/li&gt;&lt;/ul&gt;</description><link>https://tempered.works/posts/2024/07/06/preventing-data-theft-with-gcp-service-controls/</link> <pubDate>Sat, 06 Jul 2024 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2024/07/06/preventing-data-theft-with-gcp-service-controls/</guid> </item> <item> <title>Latest and historical state from change data capture</title> <author>brabster</author> <category>insights</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;Athena console showing no results for query&#34; src=&#34;https://tempered.works/2024-06-30-cdc-latest-and-historical/assets/cdc_no_results.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;In previous posts, I &lt;a href=&#34;https://tempered.works/posts/2024/06/04/disambiguating-transactions-in-change-data-capture/&#34;&gt;disambiguated transactions by filtering out any transient statements&lt;/a&gt; and noted that &lt;a href=&#34;https://tempered.works/posts/2024/06/12/breaking-change-data-capture-with-primary-keys/&#34;&gt;changes in primary key values cause big problems&lt;/a&gt;. Now I can start to answer useful questions about the current and historical changes in a source table, learning something important about window functions along the way.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Thanks to &lt;a href=&#34;https://equalexperts.com&#34;&gt;&lt;img alt=&#34;Equal Experts logo&#34; src=&#34;https://tempered.works/assets/images/equal-experts-logo-colour-100px.webp&#34;&gt;&lt;/a&gt; for supporting this content.&lt;/li&gt;&lt;/ul&gt;</description><link>https://tempered.works/posts/2024/06/28/latest-and-historical-state-from-change-data-capture/</link> <pubDate>Fri, 28 Jun 2024 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2024/06/28/latest-and-historical-state-from-change-data-capture/</guid> </item> <item> <title>Breaking change data capture with primary keys</title> <author>brabster</author> <category>insights</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;A SQL statement that updates a row&#39;s primary key&#34; src=&#34;https://tempered.works/2024-06-12-breaking-cdc-with-primary-keys/assets/break_pk.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;My work on dealing with multiple tables was interrupted when I discovered a subtle scenario that leads to DMS CDC output that cannot be correctly interpreted. I was unable to find a solution, but I will update this post if new information emerges.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Thanks to &lt;a href=&#34;https://equalexperts.com&#34;&gt;&lt;img alt=&#34;Equal Experts logo&#34; src=&#34;https://tempered.works/assets/images/equal-experts-logo-colour-100px.webp&#34;&gt;&lt;/a&gt; for supporting this content.&lt;/li&gt;&lt;/ul&gt;</description><link>https://tempered.works/posts/2024/06/12/breaking-change-data-capture-with-primary-keys/</link> <pubDate>Wed, 12 Jun 2024 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2024/06/12/breaking-change-data-capture-with-primary-keys/</guid> </item> <item> <title>Disambiguating transactions in change data capture</title> <author>brabster</author> <category>insights</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;Example query against disambiguated view&#34; src=&#34;https://tempered.works/2024-06-04-disambiguating-transactions-in-change-data-capture/assets/disambiguated_sql.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;In the CDC output, I get a row for each statement executing in the transaction. Each row reflects the state of the database when that statement is executed. How do I filter out all the transient statements to get the final state of the row when a transaction has finished?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Thanks to &lt;a href=&#34;https://equalexperts.com&#34;&gt;&lt;img alt=&#34;Equal Experts logo&#34; src=&#34;https://tempered.works/assets/images/equal-experts-logo-colour-100px.webp&#34;&gt;&lt;/a&gt; for supporting this content.&lt;/li&gt;&lt;/ul&gt;</description><link>https://tempered.works/posts/2024/06/04/disambiguating-transactions-in-change-data-capture/</link> <pubDate>Tue, 04 Jun 2024 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2024/06/04/disambiguating-transactions-in-change-data-capture/</guid> </item> <item> <title>Handling CVE-2019-8341 for dbt and mkdocs</title> <author>brabster</author> <category>automation</category> <category>operations</category> <category>security</category> <description>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img alt=&#34;Safety output for CVE-2019-8341&#34; src=&#34;https://tempered.works/2024-06-02-handling-cve-2019-8341-for-dbt-and-mkdocs/assets/cve-2019-8341.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;Yesterday, Safety told me about CVE-2019-8341, a security issue affecting Jinja2. I&#39;ll walk through how I investigated and assessed the risk to my website and a dbt pipeline I operate in the public domain. I finish up with a commentary on why I think this vulnerability is real and should be fixed, and why I think we need to risk breaking potentially insecure usage to make vulnerability management manageable in the real world.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Thanks to &lt;a href=&#34;https://equalexperts.com&#34;&gt;&lt;img alt=&#34;Equal Experts logo&#34; src=&#34;https://tempered.works/assets/images/equal-experts-logo-colour-100px.webp&#34;&gt;&lt;/a&gt; for supporting this content.&lt;/li&gt;&lt;/ul&gt;</description><link>https://tempered.works/posts/2024/06/02/handling-cve-2019-8341-for-dbt-and-mkdocs/</link> <pubDate>Sun, 02 Jun 2024 00:00:00 +0000</pubDate><source url="https://tempered.works/feed_rss_created.xml">Tempered Works Ltd.</source><guid isPermaLink="true">https://tempered.works/posts/2024/06/02/handling-cve-2019-8341-for-dbt-and-mkdocs/</guid> </item> </channel></rss>