<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>dracoblue.net</title>
    <link>https://dracoblue.net/</link>
    <atom:link href="https://dracoblue.net/rss.xml" rel="self" type="application/rss+xml" />
    <description>DracoBlue's development diary and blog.</description>
    <lastBuildDate>2026-05-07T08:22:22+00:00</lastBuildDate>
    
    <item>
      <title>Docker CLI with Apple Container</title>
      <link>https://dracoblue.net/dev/docker-cli-with-apple-container/</link>
      <guid isPermaLink="true">https://dracoblue.net/dev/docker-cli-with-apple-container/</guid>
      <pubDate>2026-03-24T13:57:00+00:00</pubDate>
      <description><![CDATA[<p>Currently, I am running Rancher Desktop for Docker CLI needs locally. But I've found a viable
solution I wanted to give a try.</p>
<p>It's called <code>container</code> and it is released by Apple at <a href="https://github.com/apple/container">https://github.com/apple/container</a> for
Apple Silicon Mac devices.</p>
]]></description>
    </item>
    
    <item>
      <title>Week 4: Stable Claims with BERTopic</title>
      <link>https://dracoblue.net/dev/topicwatchdog-more-stable-claims-with-bertopic/</link>
      <guid isPermaLink="true">https://dracoblue.net/dev/topicwatchdog-more-stable-claims-with-bertopic/</guid>
      <pubDate>2025-10-15T08:05:00+00:00</pubDate>
      <description><![CDATA[<p>In <a href="./dev/kickoff-topicwatchdog-extracting-topics-and-claims-from-german-politics-videos/">Week 1 (extraction)</a>, <a href="./dev/topicwatchdog-embeddings-and-kmeans-clustering-of-topics-claims/">Week 2 (embeddings + KMeans)</a>, and <a href="./dev/topicwatchdog-more-stable-claims-with-bertopic.md">Week 3 (stable topics with BERTopic)</a> I built the foundations. This week applies the same idea to <strong>claims</strong> — using BERTopic to cluster claim snippets and keep stable <code>claim_id</code>s via a registry + dim table.</p>
<p>This week we explore <strong>BERTopic + stable claim IDs</strong>:</p>
<ul>
<li>Use <strong>pre-computed embeddings</strong> from BigQuery (same pipeline as before).</li>
<li>Fit/Load a <strong>BERTopic</strong> model (UMAP + HDBSCAN) in Python.</li>
<li>Assign <strong>internal</strong> cluster IDs per batch, then map them to <strong>stable</strong> <code>claim_id</code>s.</li>
<li>Persist to <code>video_claims</code>, <code>claim_registry</code>, and <code>dim_claims</code> tables for analysis.</li>
<li>Inspect behavior in Looker Studio and reflect on limitations.</li>
</ul>
]]></description>
    </item>
    
    <item>
      <title>Week 3: Stable Topics with BERTopic</title>
      <link>https://dracoblue.net/dev/topicwatchdog-stable-topics-with-bertopic/</link>
      <guid isPermaLink="true">https://dracoblue.net/dev/topicwatchdog-stable-topics-with-bertopic/</guid>
      <pubDate>2025-09-10T08:05:00+00:00</pubDate>
      <description><![CDATA[<p>In <a href="./dev/kickoff-topicwatchdog-extracting-topics-and-claims-from-german-politics-videos/">Week 1 (extraction)</a> and <a href="./dev/topicwatchdog-embeddings-and-kmeans-clustering-of-topics-claims/">Week 2 (embeddings + KMeans in BigQuery ML)</a> we laid the groundwork. This week I built a <strong>Python BERTopic stage</strong> whose IDs stay stable across runs by mapping BERTopic’s internal clusters to <strong>stable topic IDs</strong> in BigQuery. I use Google Gemini again to generate nice labels for the extracted topic clusters.</p>
<p>This week we explore <strong>BERTopic + stable topic IDs</strong> (via an ID registry):</p>
<ul>
<li>Train a <strong>BERTopic</strong> model in Python (UMAP + HDBSCAN).</li>
<li>Map BERTopic’s internal clusters (model_version, internal_topic_id)</li>
<li>Ensure topic IDs remain <strong>consistent across retraining</strong> (no more ID jumps).</li>
<li>Join human-readable labels and persist results into <code>video_topics</code> for analysis.</li>
<li>Inspect results in <strong>Looker Studio</strong> and reflect on limitations.</li>
</ul>
]]></description>
    </item>
    
    <item>
      <title>Week 2: Embeddings &amp; KMeans Clustering of Topics/Claims</title>
      <link>https://dracoblue.net/dev/topicwatchdog-embeddings-and-kmeans-clustering-of-topics-claims/</link>
      <guid isPermaLink="true">https://dracoblue.net/dev/topicwatchdog-embeddings-and-kmeans-clustering-of-topics-claims/</guid>
      <pubDate>2025-09-03T08:05:00+00:00</pubDate>
      <description><![CDATA[<p>This post documents <strong>Week 2</strong> of the <strong>TopicWatchdog</strong> project.<br>
<a href="./dev/kickoff-topicwatchdog-extracting-topics-and-claims-from-german-politics-videos/">Last week</a> we successfully extracted <strong>topics</strong> and <strong>claims</strong> from German political short videos and persisted them in <strong>BigQuery</strong>.<br>
However, topics often appeared under slightly different names — making aggregation unreliable.</p>
<p>This week we explore <strong>embeddings + clustering</strong>:</p>
<ul>
<li>Generate embeddings of canonical topics and claims with <strong>BigQuery ML</strong>.</li>
<li>Train a <strong>KMeans model</strong> on those embeddings to group semantically similar entries.</li>
<li>Assign clusters back to each topic/claim.</li>
<li>Inspect first results in <strong>Looker Studio</strong> and reflect on limitations.</li>
</ul>
]]></description>
    </item>
    
    <item>
      <title>Kickoff (Week 1): Extracting Topics &amp; Claims from German Politics Videos</title>
      <link>https://dracoblue.net/dev/kickoff-topicwatchdog-extracting-topics-and-claims-from-german-politics-videos/</link>
      <guid isPermaLink="true">https://dracoblue.net/dev/kickoff-topicwatchdog-extracting-topics-and-claims-from-german-politics-videos/</guid>
      <pubDate>2025-08-27T08:05:00+00:00</pubDate>
      <description><![CDATA[<p>This post documents <strong>Week 1</strong> of a research project I call <strong>TopicWatchdog</strong>: an end‑to‑end, reproducible pipeline that (a) collects German political short videos, (b) transcribes them, (c) extracts <strong>topics</strong> and <strong>claims</strong> with timestamps, and (d) persists everything in <strong>BigQuery</strong> for transparent, long‑term analysis.</p>
<p>The focus is on <strong>methods and reproducibility</strong>, not on polished production code. The snippets below are meant as <strong>guidance scaffolding</strong>, but already allow you to build a similar pipeline.</p>
]]></description>
    </item>
    
    <item>
      <title>Show System Collections in Payload CMS</title>
      <link>https://dracoblue.net/dev/show-system-collections-in-payload-cms/</link>
      <guid isPermaLink="true">https://dracoblue.net/dev/show-system-collections-in-payload-cms/</guid>
      <pubDate>2025-01-11T23:36:00+00:00</pubDate>
      <description><![CDATA[<p>When working with <a href="https://payloadcms.com">payload cms</a>, I sometimes need to check what is
in the system collections of payload.</p>
<p>There is e.g. <code>payload-preferences</code> or <code>payload-migrations</code>. Since 3.0 there is also
<code>payload-jobs</code> for the neat queue system and <code>payload-locked-documents</code> for the document locking.</p>
]]></description>
    </item>
    
    <item>
      <title>Debugging Directus Serverside Extensions</title>
      <link>https://dracoblue.net/dev/debugging-directus-serverside-extensions/</link>
      <guid isPermaLink="true">https://dracoblue.net/dev/debugging-directus-serverside-extensions/</guid>
      <pubDate>2023-08-19T10:05:00+00:00</pubDate>
      <description><![CDATA[<p>You can find in the directus docs a good documentation how to <a href="https://docs.directus.io/self-hosted/docker-guide.html">run a build of directus in docker</a>. For developing and contributing to direcuts itself there is a good documentation on running <a href="https://docs.directus.io/contributing/running-locally.html">directus locally</a>.</p>
<p>But if you want to develop a <a href="https://docs.directus.io/extensions/endpoints.html">directus endpoint extension</a> locally, you might want to use the &quot;breakpoint&quot; feature of your IDE (e.g. vscode). Without the need to run the entire directus stack with pnpm in development mode.</p>
]]></description>
    </item>
    
    <item>
      <title>VSCode 100% CPU Usage with WSL1</title>
      <link>https://dracoblue.net/dev/vscode-100-percent-cpu-usage-wsl1/</link>
      <guid isPermaLink="true">https://dracoblue.net/dev/vscode-100-percent-cpu-usage-wsl1/</guid>
      <pubDate>2023-02-22T23:45:00+00:00</pubDate>
      <description><![CDATA[<p>When I am using windows for development reasons in combination with wsl it is usually
pretty good experience. As long as you don't try to mount a windows directory into the
linux subsystem, but use the storage directly there - it's nice!</p>
<p>The official <a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl">vscode extension for wsl</a>
usually integrates nicely with visual code.</p>
<p>But today I experienced a very bad performance of vscode and the windows system. A short
htop / taskmanager call showed: All CPUs have been in use for 100%. The process eating all
resource was called: <code>.vscode-server</code>.</p>
]]></description>
    </item>
    
    <item>
      <title>Make symfony dotenv use putenv</title>
      <link>https://dracoblue.net/dev/make-symfony-dotenv-use-putenv/</link>
      <guid isPermaLink="true">https://dracoblue.net/dev/make-symfony-dotenv-use-putenv/</guid>
      <pubDate>2023-01-16T08:00:01+00:00</pubDate>
      <description><![CDATA[<p>The other day a friend of mine was using <a href="https://github.com/googleapis/google-auth-library-php">google-auth-library-php</a>
in combination with <a href="https://github.com/googleapis/google-cloud-php-pubsub">google-cloud-php-pubsub</a> and wanted to set the
path for the google credentials file via <code>GOOGLE_APPLICATION_CREDENTIALS</code> in <code>.env</code>.</p>
<p>So we figured that this did not work anymore in the newer version of <code>dotenv</code> (<a href="https://github.com/symfony/dotenv/commit/d2fa94d2590be2e640f4d91aad3209618f0ba062">see commit in 4.3</a>)
the default value for <code>use_putenv</code> changed to <code>false</code>. And in symfony 5 there was a breaking change to switch <code>use_putenv</code>
from <code>true</code> to <code>false</code> (see the <a href="https://github.com/symfony/symfony/pull/31062">putenv deprecation pull request</a>.</p>
]]></description>
    </item>
    
    <item>
      <title>Compiling newrelic php agent on mac m1 arm64</title>
      <link>https://dracoblue.net/dev/compiling-newrelic-php-agent-on-mac-m1-arm64/</link>
      <guid isPermaLink="true">https://dracoblue.net/dev/compiling-newrelic-php-agent-on-mac-m1-arm64/</guid>
      <pubDate>2023-01-14T00:05:00+00:00</pubDate>
      <description><![CDATA[<p>According to the <a href="https://docs.newrelic.com/docs/apm/agents/php-agent/installation/php-agent-installation-arm64/">arm64 newrelic php page</a> there
is arm64 support for the php agent, if it is running Amazon Linux or CentOS Linux8, but not for Apple or M1.</p>
<p>However, when I pulled the latest tar.gz (v10.4.0.316 as of 2023/01/13) at https://github.com/newrelic/newrelic-php-agent/archive/refs/tags/v10.4.0.316.tar.gz
and tried to compile - it did nearly work.</p>
<p>The first tries of <code>make agent</code>, will fail with missing <code>pcre_compile</code> or <code>aclocal</code> or <code>glibtoolize</code>. This can be fixed by
installing <code>brew install pcre</code> for <code>pcre_compile</code>, <code>brew install automake</code> for <code>aclocal</code> and <code>brew install libtool</code> for <code>glibtoolize</code>.</p>
<p>Then finally running <code>make agent</code> ends up in:</p>
<pre class="language-text"><code class="language-text">util_hash.c:198:5: error: unannotated fall-through between switch labels [-Werror,-Wimplicit-fallthrough]
    case 2:
    ^
util_hash.c:198:5: note: insert '__attribute__((fallthrough));' to silence this warning
    case 2:
    ^
    __attribute__((fallthrough));
util_hash.c:198:5: note: insert 'break;' to avoid fall-through
    case 2:
    ^
    break;</code></pre>
]]></description>
    </item>
    
  </channel>
</rss>
