<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Eamonn O&#39;Brien-Strain</title>
    <link>https://eamonn.org/</link>
    <description>[LinkedIn](https://www.linkedin.com/in/eobrain/)</description>
    <pubDate>Fri, 03 Apr 2026 21:58:50 +0000</pubDate>
    <item>
      <title>Is there a Theoretical Limit to LLM-based Safety Critics?</title>
      <link>https://eamonn.org/is-there-a-theoretical-limit-to-llm-based-safety-critics</link>
      <description>&lt;![CDATA[A common technique in AI Safety is to use an additional LLM (a “critic”) to verify that a response is safe.&#xA;&#xA;But the “Hallucination Stations” paper (Sikka &amp; Sikka 2025) suggests a hard theoretical limit to this approach.&#xA;&#xA;The paper demonstrates that an LLM cannot strictly solve or verify problems that exceed its internal computational complexity (roughly O(n²)). If asked to solve a more complex problem, it is mathematically forced to hallucinate a statistically probable answer.&#xA;&#xA;The problem for us in AI Safety: Verifying safety is often strictly harder than generating text.&#xA;&#xA;A robust safety check isn&#39;t just a keyword scan. It requires verifying the logical consistency of a response against complex, interacting policies (bias, privacy, jailbreaks, illegal content, hate speech, dangerous weaponry, etc.) across a full conversation history. This creates a combinatorial state explosion, probably pushing the verification task into exponential complexity, or certainly far beyond the O(n²) limit of the critic itself.&#xA;&#xA;The Result: The critic may confidently label a response as “safe” simply because it’s statistically safe, even when it fails a complex logical constraint.&#xA;&#xA;The Way Forward: Rather than rely on &#34;LLMs all the way down.&#34;, the critic can be part of a hybrid system—capable of generating code or calling deterministic tools to offload the high-complexity verification tasks that the LLM theoretically cannot handle.&#xA;&#xA;[1]: https://arxiv.org/pdf/2507.07505&#xA;&#xA;&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>A common technique in AI Safety is to use an additional LLM (a “critic”) to verify that a response is safe.</p>

<p>But the “Hallucination Stations” paper <a href="https://arxiv.org/pdf/2507.07505">(Sikka &amp; Sikka 2025)</a> suggests a hard theoretical limit to this approach.</p>

<p>The paper demonstrates that an LLM cannot strictly solve or verify problems that exceed its internal computational complexity (roughly O(n²)). If asked to solve a more complex problem, it is mathematically forced to hallucinate a statistically probable answer.</p>

<p>The problem for us in AI Safety: Verifying safety is often strictly harder than generating text.</p>

<p>A robust safety check isn&#39;t just a keyword scan. It requires verifying the logical consistency of a response against complex, interacting policies (bias, privacy, jailbreaks, illegal content, hate speech, dangerous weaponry, etc.) across a full conversation history. This creates a combinatorial state explosion, probably pushing the verification task into exponential complexity, or certainly far beyond the O(n²) limit of the critic itself.</p>

<p>The Result: The critic may confidently label a response as “safe” simply because it’s statistically safe, even when it fails a complex logical constraint.</p>

<p>The Way Forward: Rather than rely on “LLMs all the way down.”, the critic can be part of a hybrid system—capable of generating code or calling deterministic tools to offload the high-complexity verification tasks that the LLM theoretically cannot handle.</p>
]]></content:encoded>
      <guid>https://eamonn.org/is-there-a-theoretical-limit-to-llm-based-safety-critics</guid>
      <pubDate>Sun, 25 Jan 2026 06:36:59 +0000</pubDate>
    </item>
    <item>
      <title>What I program when no one is paying me</title>
      <link>https://eamonn.org/what-i-program-when-no-one-is-paying-me</link>
      <description>&lt;![CDATA[Over the years I&#39;ve done a lot of programming for my own amusement or education. I&#39;ve put these together on my main GitHub pages site at&#xA;&#xA;https://eobrain.github.io/&#xA;&#xA;Putting together only the ones that currently work, I was able to list eighteen, but I may be able to add some more if I can manage to revive several more repos using now obsolete frameworks and build systems.&#xA;&#xA;To give a flavor of what&#39;s there, below are some videos and screenshots. See the above link for more details of any of them.&#xA;&#xA;almondbread&#xA;&#xA;videotimewarp&#xA;&#xA;warp&#xA;&#xA;flife&#xA;&#xA;videogestalt&#xA;&#xA;supersekrit&#xA;&#xA;tootgeist&#xA;&#xA;bajel&#xA;&#xA;maxichrome&#xA;&#xA;mergi&#xA;&#xA;tufte&#xA;&#xA;smoothish&#xA;&#xA;funetik&#xA;&#xA;ez-html-elements&#xA;&#xA;passprint&#xA;&#xA;funcgo&#xA;&#xA;simplestblog&#xA;&#xA;hexhistorymap&#xA;&#xA;[1]: https://raw.githubusercontent.com/eobrain/videogestalt/main/resources/vespa-commercial-gestalt.gif&#xA;[1]: https://github.com/eobrain/videogestalt&#xA;[2]: https://eobrain.github.io/flife.gif&#xA;[2]: https://eobrain.github.io/flife/&#xA;[3]: https://eobrain.github.io/tootgeist-screenshot.png&#xA;[3]: https://eobrain.github.io/tootgeist/&#xA;[4]: https://eobrain.github.io/warp.gif&#xA;[4]: https://eobrain.github.io/warp/&#xA;[5]: https://eobrain.github.io/bajel-screenshot.png&#xA;[5]: https://github.com/eobrain/bajel&#xA;[6]: https://eobrain.github.io/video-0.7436438870371587047521915061147740.1318259042053119704931320563851395e-13100000.gif&#xA;[6]: https://mandelbrot.dev/&#xA;[7]: https://eobrain.github.io/videotimewarp.gif&#xA;[7]: https://eobrain.github.io/videotimewarp/&#xA;[8]: https://eobrain.github.io/maxichrome-screenshot.png&#xA;[8]: https://github.com/eobrain/maxichrome&#xA;[9]: https://d33wubrfki0l68.cloudfront.net/475e883b7b5981cd801cc458f0f18fa04a3a56c0/74c2b/images/nounman191218232x32.png&#xA;[9]: https://www.kartoj.com/&#xA;[10]: https://eobrain.github.io/tufte-screenshot.png&#xA;[10]: https://eobrain.github.io/classless-tufte-css/&#xA;[11]: https://eobrain.github.io/smoothish-screenshot.png&#xA;[11]: https://github.com/eobrain/smoothish&#xA;[12]: https://eobrain.github.io/funetik-screenshot.png&#xA;[12]: https://funetik.site/&#xA;[13]: https://eobrain.github.io/ez-html-elements-screenshot.png&#xA;[13]: https://github.com/eobrain/ez-html-elements&#xA;[14]: https://eobrain.github.io/passprint-screenshot.png&#xA;[14]: https://github.com/eobrain/passprint&#xA;[15]: https://eobrain.github.io/funcgo-screenshot.png&#xA;[15]: http://www.funcgo.org/&#xA;[16]: https://eobrain.github.io/blog-screenshot.png&#xA;[16]: https://github.com/eobrain/simplestblog&#xA;[17]: https://eobrain.github.io/hexhistorymap-screenshot.png&#xA;[17]: https://hexhistory.netlify.app/&#xA;[18]: https://eobrain.github.io/supersekrit-screenshot.png&#xA;[18_]: https://www.supersekrit.com/&#xA;&#xA;&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Over the years I&#39;ve done a lot of programming for my own amusement or education. I&#39;ve put these together on my main GitHub pages site at</p>

<p><a href="https://eobrain.github.io/">https://eobrain.github.io/</a></p>

<p>Putting together only the ones that currently work, I was able to list eighteen, but I may be able to add some more if I can manage to revive several more repos using now obsolete frameworks and build systems.</p>

<p>To give a flavor of what&#39;s there, below are some videos and screenshots. See the above link for more details of any of them.</p>

<p><a href="https://mandelbrot.dev/"><img src="https://eobrain.github.io/video_-0.743643887037158704752191506114774_0.131825904205311970493132056385139_5e-13_100000.gif" alt="almondbread"></a></p>

<p><a href="https://eobrain.github.io/videotimewarp/"><img src="https://eobrain.github.io/videotimewarp.gif" alt="videotimewarp"></a></p>

<p><a href="https://eobrain.github.io/warp/"><img src="https://eobrain.github.io/warp.gif" alt="warp"></a></p>

<p><a href="https://eobrain.github.io/flife/"><img src="https://eobrain.github.io/flife.gif" alt="flife"></a></p>

<p><a href="https://github.com/eobrain/videogestalt"><img src="https://raw.githubusercontent.com/eobrain/videogestalt/main/resources/vespa-commercial-gestalt.gif" alt="videogestalt"></a></p>

<p><a href="https://www.supersekrit.com/"><img src="https://eobrain.github.io/supersekrit-screenshot.png" alt="supersekrit"></a></p>

<p><a href="https://eobrain.github.io/tootgeist/"><img src="https://eobrain.github.io/tootgeist-screenshot.png" alt="tootgeist"></a></p>

<p><a href="https://github.com/eobrain/bajel"><img src="https://eobrain.github.io/bajel-screenshot.png" alt="bajel"></a></p>

<p><a href="https://github.com/eobrain/maxichrome"><img src="https://eobrain.github.io/maxichrome-screenshot.png" alt="maxichrome"></a></p>

<p><a href="https://www.kartoj.com/"><img src="https://d33wubrfki0l68.cloudfront.net/475e883b7b5981cd801cc458f0f18fa04a3a56c0/74c2b/images/noun_man_1912182_32x32.png" alt="mergi"></a></p>

<p><a href="https://eobrain.github.io/classless-tufte-css/"><img src="https://eobrain.github.io/tufte-screenshot.png" alt="tufte"></a></p>

<p><a href="https://github.com/eobrain/smoothish"><img src="https://eobrain.github.io/smoothish-screenshot.png" alt="smoothish"></a></p>

<p><a href="https://funetik.site/"><img src="https://eobrain.github.io/funetik-screenshot.png" alt="funetik"></a></p>

<p><a href="https://github.com/eobrain/ez-html-elements"><img src="https://eobrain.github.io/ez-html-elements-screenshot.png" alt="ez-html-elements"></a></p>

<p><a href="https://github.com/eobrain/passprint"><img src="https://eobrain.github.io/passprint-screenshot.png" alt="passprint"></a></p>

<p><a href="http://www.funcgo.org/"><img src="https://eobrain.github.io/funcgo-screenshot.png" alt="funcgo"></a></p>

<p><a href="https://github.com/eobrain/simplestblog"><img src="https://eobrain.github.io/blog-screenshot.png" alt="simplestblog"></a></p>

<p><a href="https://hexhistory.netlify.app/"><img src="https://eobrain.github.io/hexhistorymap-screenshot.png" alt="hexhistorymap"></a></p>
]]></content:encoded>
      <guid>https://eamonn.org/what-i-program-when-no-one-is-paying-me</guid>
      <pubDate>Sun, 15 Jun 2025 05:33:26 +0000</pubDate>
    </item>
    <item>
      <title>Identifying a Written Language</title>
      <link>https://eamonn.org/identifying-a-written-language</link>
      <description>&lt;![CDATA[Here&#39;s a cheat sheet that you can use to determine what language you are looking at:&#xA;&#xA;Language Phenotype Tree&#xA;&#xA;This is only for European languages that use a Latin-based alphabet.&#xA;&#xA;It was adapted from the original diagram What European language am I reading? European language flowchart by melafefon which was based on What European language am I reading? A flow chart by @oysteib@masto.ai . &#xA;&#xA;I call this a “phenotype” tree because it represents the visual appearance of the languages, and is distinct from the true tree of how these languages are related. Some languages are close to one another in this phenotype tree because they borrowed alphabets from neighboring or hegemonic languages, despite being from very different language families.&#xA;&#xA;Appendix&#xA;For reference, non-English letters in the above diagram:&#xA;&#xA;|  | Name | Unicode |&#xA;|---|---|---|&#xA;| à | A with grave | U+00E0 |&#xA;| â | A with circumflex | U+00E2 |&#xA;| ã | A with tilde | U+00E3 |&#xA;| ä | A with diaeresis | U+00E4 |&#xA;| å | A with ring above | U+00E5 |&#xA;| ǎ | A with caron | U+01CE |&#xA;| æ | Æ | U+00E6 |&#xA;| ç | C with cedilla | U+00E7 |&#xA;| ć | C with acute | U+0107 |&#xA;| ĉ | C with circumflex | U+0109 |&#xA;| ċ | C with dot above | U+010B |&#xA;| č | C with caron | U+010D |&#xA;| ð | Eth | U+00F0 |&#xA;| đ | D with stroke | U+0111 |&#xA;| è | E with grave | U+00E8 |&#xA;| é | E with acute | U+00E9 |&#xA;| ë | E with diaeresis | U+00EB |&#xA;| ĕ | E with breve | U+0115 |&#xA;| ė | E with dot above | U+0117 |&#xA;| ę | E with cedilla | U+0229 |&#xA;| ə | Schwa | U+0259 |&#xA;| ĝ | G with circumflex | U+011D |&#xA;| ğ | G with breve | U+011F |&#xA;| ğ | G with breve | U+011F |&#xA;| ġ | G with dot above | U+0121 |&#xA;| ħ | H with stroke | U+0127 |&#xA;| ì | I with grave | U+00EC |&#xA;| ñ | N with tilde | U+00F1 |&#xA;| ŋ | Eng | U+014B |&#xA;| ö | O with diaeresis | U+00F6 |&#xA;| ø | O with stroke | U+00F8 |&#xA;| ō | O with macron | U+014D |&#xA;| ő | O with double acute | U+0151 |&#xA;| ř | R with caron | U+0159 |&#xA;| ś | S with acute | U+015B |&#xA;| ŝ | S with circumflex | U+015D |&#xA;| ş | S with cedilla | U+015F |&#xA;| ß | sharp S | U+00DF |&#xA;| ţ | T with cedilla | U+0163 |&#xA;| ŧ | T with stroke | U+0167 |&#xA;| ü | U with diaeresis | U+00FC |&#xA;| ū | U with macron | U+016B |&#xA;| ů | U with ring above | U+016F |&#xA;| ű | U with double acute | U+0171 |&#xA;| Ŵ | W with circumflex | U+0174 |&#xA;| ź | Z with acute | U+017A |&#xA;| Ż | Z with dot above | U+017B |&#xA;&#xA;[1]: img/lang-pheno.png &#xA;[2]: https://www.reddit.com/r/languagelearning/comments/lmwsw7/whateuropeanlanguageamireadingeuropean/#lightbox&#xA;[3]: https://www.reddit.com/user/melafefon/&#xA;[4]: https://www.reddit.com/r/europe/comments/l9d8sv/whateuropeanlanguageamireadingaflowchart/&#xA;&#xA;&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Here&#39;s a cheat sheet that you can use to determine what language you are looking at:</p>

<p><img src="img/lang-pheno.png" alt="Language Phenotype Tree"></p>

<p>This is only for European languages that use a Latin-based alphabet.</p>

<p>It was adapted from the original diagram <a href="https://www.reddit.com/r/languagelearning/comments/lmwsw7/what_european_language_am_i_reading_european/#lightbox">What European language am I reading? European language flowchart</a> by <a href="https://www.reddit.com/user/mel_afefon/">mel_afefon</a> which was based on <a href="https://www.reddit.com/r/europe/comments/l9d8sv/what_european_language_am_i_reading_a_flow_chart/">What European language am I reading? A flow chart</a> by <a href="https://eamonn.org/@/oysteib@masto.ai" class="u-url mention">@<span>oysteib@masto.ai</span></a> .</p>

<p>I call this a “phenotype” tree because it represents the visual appearance of the languages, and is distinct from the true tree of how these languages are related. Some languages are close to one another in this phenotype tree because they borrowed alphabets from neighboring or hegemonic languages, despite being from very different language families.</p>

<h2 id="appendix" id="appendix">Appendix</h2>

<p>For reference, non-English letters in the above diagram:</p>

<table>
<thead>
<tr>
<th></th>
<th>Name</th>
<th>Unicode</th>
</tr>
</thead>

<tbody>
<tr>
<td>à</td>
<td>A with grave</td>
<td>U+00E0</td>
</tr>

<tr>
<td>â</td>
<td>A with circumflex</td>
<td>U+00E2</td>
</tr>

<tr>
<td>ã</td>
<td>A with tilde</td>
<td>U+00E3</td>
</tr>

<tr>
<td>ä</td>
<td>A with diaeresis</td>
<td>U+00E4</td>
</tr>

<tr>
<td>å</td>
<td>A with ring above</td>
<td>U+00E5</td>
</tr>

<tr>
<td>ǎ</td>
<td>A with caron</td>
<td>U+01CE</td>
</tr>

<tr>
<td>æ</td>
<td>Æ</td>
<td>U+00E6</td>
</tr>

<tr>
<td>ç</td>
<td>C with cedilla</td>
<td>U+00E7</td>
</tr>

<tr>
<td>ć</td>
<td>C with acute</td>
<td>U+0107</td>
</tr>

<tr>
<td>ĉ</td>
<td>C with circumflex</td>
<td>U+0109</td>
</tr>

<tr>
<td>ċ</td>
<td>C with dot above</td>
<td>U+010B</td>
</tr>

<tr>
<td>č</td>
<td>C with caron</td>
<td>U+010D</td>
</tr>

<tr>
<td>ð</td>
<td>Eth</td>
<td>U+00F0</td>
</tr>

<tr>
<td>đ</td>
<td>D with stroke</td>
<td>U+0111</td>
</tr>

<tr>
<td>è</td>
<td>E with grave</td>
<td>U+00E8</td>
</tr>

<tr>
<td>é</td>
<td>E with acute</td>
<td>U+00E9</td>
</tr>

<tr>
<td>ë</td>
<td>E with diaeresis</td>
<td>U+00EB</td>
</tr>

<tr>
<td>ĕ</td>
<td>E with breve</td>
<td>U+0115</td>
</tr>

<tr>
<td>ė</td>
<td>E with dot above</td>
<td>U+0117</td>
</tr>

<tr>
<td>ę</td>
<td>E with cedilla</td>
<td>U+0229</td>
</tr>

<tr>
<td>ə</td>
<td>Schwa</td>
<td>U+0259</td>
</tr>

<tr>
<td>ĝ</td>
<td>G with circumflex</td>
<td>U+011D</td>
</tr>

<tr>
<td>ğ</td>
<td>G with breve</td>
<td>U+011F</td>
</tr>

<tr>
<td>ğ</td>
<td>G with breve</td>
<td>U+011F</td>
</tr>

<tr>
<td>ġ</td>
<td>G with dot above</td>
<td>U+0121</td>
</tr>

<tr>
<td>ħ</td>
<td>H with stroke</td>
<td>U+0127</td>
</tr>

<tr>
<td>ì</td>
<td>I with grave</td>
<td>U+00EC</td>
</tr>

<tr>
<td>ñ</td>
<td>N with tilde</td>
<td>U+00F1</td>
</tr>

<tr>
<td>ŋ</td>
<td>Eng</td>
<td>U+014B</td>
</tr>

<tr>
<td>ö</td>
<td>O with diaeresis</td>
<td>U+00F6</td>
</tr>

<tr>
<td>ø</td>
<td>O with stroke</td>
<td>U+00F8</td>
</tr>

<tr>
<td>ō</td>
<td>O with macron</td>
<td>U+014D</td>
</tr>

<tr>
<td>ő</td>
<td>O with double acute</td>
<td>U+0151</td>
</tr>

<tr>
<td>ř</td>
<td>R with caron</td>
<td>U+0159</td>
</tr>

<tr>
<td>ś</td>
<td>S with acute</td>
<td>U+015B</td>
</tr>

<tr>
<td>ŝ</td>
<td>S with circumflex</td>
<td>U+015D</td>
</tr>

<tr>
<td>ş</td>
<td>S with cedilla</td>
<td>U+015F</td>
</tr>

<tr>
<td>ß</td>
<td>sharp S</td>
<td>U+00DF</td>
</tr>

<tr>
<td>ţ</td>
<td>T with cedilla</td>
<td>U+0163</td>
</tr>

<tr>
<td>ŧ</td>
<td>T with stroke</td>
<td>U+0167</td>
</tr>

<tr>
<td>ü</td>
<td>U with diaeresis</td>
<td>U+00FC</td>
</tr>

<tr>
<td>ū</td>
<td>U with macron</td>
<td>U+016B</td>
</tr>

<tr>
<td>ů</td>
<td>U with ring above</td>
<td>U+016F</td>
</tr>

<tr>
<td>ű</td>
<td>U with double acute</td>
<td>U+0171</td>
</tr>

<tr>
<td>Ŵ</td>
<td>W with circumflex</td>
<td>U+0174</td>
</tr>

<tr>
<td>ź</td>
<td>Z with acute</td>
<td>U+017A</td>
</tr>

<tr>
<td>Ż</td>
<td>Z with dot above</td>
<td>U+017B</td>
</tr>
</tbody>
</table>
]]></content:encoded>
      <guid>https://eamonn.org/identifying-a-written-language</guid>
      <pubDate>Tue, 31 Dec 2024 22:46:00 +0000</pubDate>
    </item>
    <item>
      <title>Can LLMs help solve the biggest problem of privacy?</title>
      <link>https://eamonn.org/can-llms-help-solve-the-biggest-problem-of-privacy</link>
      <description>&lt;![CDATA[There are many trust and safety challenges in the new generative AI technologies, but there is one area where they could increase trust and user empowerment. These technologies provide an opportunity to offer the kind of transparency that will allow meaningful control of how people use complex online systems, including control of privacy.&#xA;&#xA;This opportunity comes from two observations: (1) that the biggest problem in privacy is explaining to the user how their data is used, and (2) that one of the notable abilities of LLMs (large language models) is to summarize complex data understandably.&#xA;&#xA;Over the years working on Internet systems, I have seen big improvements in protecting privacy. Some of this improvement is driven by the increasing public awareness of the importance of privacy and the necessity for companies to address privacy if they want to maintain user trust. Some of this is driven by the need for regulatory compliance, initially with GDPR in Europe, but increasingly with new regulations in various countries and US states. &#xA;&#xA;But what do companies actually do to respond to retain trust and keep in compliance? Let’s divide privacy protection measures into two categories: backend and frontend.&#xA;&#xA;Backend privacy protection is where most of the effort has gone. Much of the work here is around data flows, identifying and controlling how personal data is transmitted through and stored in the complex infrastructure behind large modern Internet systems. While practically doing this can be a difficult engineering task, the requirements are generally well understood.&#xA;&#xA;Frontend privacy protection is much more of an open problem. The areas of understanding and consensus are limited to a few areas such as what “dark patterns” should be avoided and how to create cookie consent UIs (which everyone hates). In particular, there remains the biggest unsolved problem, which is how to give people meaningful agency over how their data is used, given the systems are so complex that it is very difficult even for the engineers building and running the services to explain.&#xA;&#xA;But now we see the opportunity. Explaining complex subjects is one thing that LLMs are good at.&#xA;&#xA;LLM privacy transparency&#xA;&#xA;One approach is, given an existing system that has personal data flowing through it, for a particular person using the system, we generate a comprehensive description of all their data and how it is used, perhaps in the context of a particular feature they are using. This raw description would be voluminous, highly technical, and perhaps might contain references to proprietary information, so it would be not at all useful or appropriate to display to the person. However an LLM, with an appropriate prompt, could summarize this raw dump in a way that could be safely and meaningfully displayed to the person. This could provide transparency, customized to the particular context. With different prompts, the LLM output format could be adjusted to match the reading level of the person, and to the size and formatting constraint of the part of the UI in which it is displayed.&#xA;&#xA;This transparency is good, and it would help give a sense of agency to the person. But is there a way to take this further and additionally use LLMs to provide controls?&#xA;&#xA;LLM privacy controls&#xA;&#xA;Well, yes, in some cases if an LLM is incorporated into the system and helps personalize the output, then we can take advantage of the fact that the “API” of an LLM is natural language. That means that somewhere deep in the data flow is some human-meaningful text that is being ingested into an LLM. So we have an opportunity to reveal that text to the person using the system and allow them to modify it, possibly by simply adding or modifying freeform natural language text.&#xA;&#xA;Of course, there are many challenges and possible hazards to using LLMs in these ways. For the transparency proposal, LLMs can hallucinate and generate incorrect summaries of personal data which could be confusing or possibly disturbing to the person. Even if the summary is factual it could present it in a biased manner, for example using gender or racial stereotypes. There is also the possibility that the summary, even if correct and unbiased, could be alarming to the person, but that is arguably a case of “working as intended”: it is better for long-term trust for the person to learn this sooner rather than later, and to thus be able to take prompt action to control how their data is used.&#xA;&#xA;I’m not aware of any such systems yet launched, but I’m hoping it will happen, and in so doing harness the power of generative AI to empower people to make the appropriate trade-offs in each context for how much personal data they want to be used in return for a particular benefit.&#xA;&#xA;[1]: https://docs.google.com/drawings/d/1yh3apdPfw3SmznSAh850mjCUtJUUAKbiZkJl5Q-OTs/export/png&#xA;[2]: https://docs.google.com/drawings/d/1leF2JYvL5IdZEp7tahWauli3LJ8ejp6sDGzQkP9oTg/export/png&#xA;&#xA;&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>There are many trust and safety challenges in the new generative AI technologies, but there is one area where they could increase trust and user empowerment. These technologies provide an opportunity to offer the kind of transparency that will allow meaningful control of how people use complex online systems, including control of privacy.</p>

<p>This opportunity comes from two observations: (1) that the biggest problem in privacy is explaining to the user how their data is used, and (2) that one of the notable abilities of LLMs (large language models) is to summarize complex data understandably.</p>

<p>Over the years working on Internet systems, I have seen big improvements in protecting privacy. Some of this improvement is driven by the increasing public awareness of the importance of privacy and the necessity for companies to address privacy if they want to maintain user trust. Some of this is driven by the need for regulatory compliance, initially with GDPR in Europe, but increasingly with new regulations in various countries and US states.</p>

<p>But what do companies actually do to respond to retain trust and keep in compliance? Let’s divide privacy protection measures into two categories: backend and frontend.</p>

<p>Backend privacy protection is where most of the effort has gone. Much of the work here is around data flows, identifying and controlling how personal data is transmitted through and stored in the complex infrastructure behind large modern Internet systems. While practically doing this can be a difficult engineering task, the requirements are generally well understood.</p>

<p>Frontend privacy protection is much more of an open problem. The areas of understanding and consensus are limited to a few areas such as what “dark patterns” should be avoided and how to create cookie consent UIs (which everyone hates). In particular, there remains the biggest unsolved problem, which is how to give people meaningful agency over how their data is used, given the systems are so complex that it is very difficult even for the engineers building and running the services to explain.</p>

<p>But now we see the opportunity. Explaining complex subjects is one thing that LLMs are good at.</p>

<p><img src="https://docs.google.com/drawings/d/1yh3apdPfw3SmznSAh850mjCUtJUUAKbiZk_Jl5Q-OTs/export/png" alt="LLM privacy transparency"></p>

<p>One approach is, given an existing system that has personal data flowing through it, for a particular person using the system, we generate a comprehensive description of all their data and how it is used, perhaps in the context of a particular feature they are using. This raw description would be voluminous, highly technical, and perhaps might contain references to proprietary information, so it would be not at all useful or appropriate to display to the person. However an LLM, with an appropriate prompt, could summarize this raw dump in a way that could be safely and meaningfully displayed to the person. This could provide transparency, customized to the particular context. With different prompts, the LLM output format could be adjusted to match the reading level of the person, and to the size and formatting constraint of the part of the UI in which it is displayed.</p>

<p>This transparency is good, and it would help give a sense of agency to the person. But is there a way to take this further and additionally use LLMs to provide controls?</p>

<p><img src="https://docs.google.com/drawings/d/1leF_2JYvL5IdZEp7tahWauli3LJ8ejp6sDGzQkP9oTg/export/png" alt="LLM privacy controls"></p>

<p>Well, yes, in some cases if an LLM is incorporated into the system and helps personalize the output, then we can take advantage of the fact that the “API” of an LLM is natural language. That means that somewhere deep in the data flow is some human-meaningful text that is being ingested into an LLM. So we have an opportunity to reveal that text to the person using the system and allow them to modify it, possibly by simply adding or modifying freeform natural language text.</p>

<p>Of course, there are many challenges and possible hazards to using LLMs in these ways. For the transparency proposal, LLMs can hallucinate and generate incorrect summaries of personal data which could be confusing or possibly disturbing to the person. Even if the summary is factual it could present it in a biased manner, for example using gender or racial stereotypes. There is also the possibility that the summary, even if correct and unbiased, could be alarming to the person, but that is arguably a case of “working as intended”: it is better for long-term trust for the person to learn this sooner rather than later, and to thus be able to take prompt action to control how their data is used.</p>

<p>I’m not aware of any such systems yet launched, but I’m hoping it will happen, and in so doing harness the power of generative AI to empower people to make the appropriate trade-offs in each context for how much personal data they want to be used in return for a particular benefit.</p>
]]></content:encoded>
      <guid>https://eamonn.org/can-llms-help-solve-the-biggest-problem-of-privacy</guid>
      <pubDate>Mon, 09 Sep 2024 02:33:17 +0000</pubDate>
    </item>
    <item>
      <title>Show Upcoming Dangerous Heatwaves: A New Tool to Track Rising Risks</title>
      <link>https://eamonn.org/show-upcoming-dangerous-heatwaves-a-new-tool-to-track-rising-risks</link>
      <description>&lt;![CDATA[sun&#xA;&#xA;As the planet warms due to climate change, the threat of heat waves looms larger than ever. Extreme heat isn&#39;t just uncomfortable; it can be deadly, especially when combined with high humidity.&#xA;&#xA;To help visualize this growing danger, I&#39;ve created a new website: Dangerous Heatwaves&#xA;&#xA;What Makes a Heat Wave Dangerous?&#xA;&#xA;The site focuses on a key metric called the wet-bulb temperature. This isn&#39;t the temperature you see on the thermometer. Instead, it&#39;s the lowest temperature you can reach by evaporating water – a crucial concept for understanding how humans handle heat.&#xA;&#xA;We cool down by sweating, a process that relies on evaporation. When the wet-bulb temperature gets too close to our body temperature, sweating becomes ineffective.  That&#39;s when the risk of heatstroke and other heat-related illnesses skyrockets.&#xA;&#xA;Low humidity: Even with high temperatures, low humidity means a lower wet-bulb temperature, reducing the danger.&#xA;High humidity: This is the worst-case scenario. When it&#39;s both hot and humid, the wet-bulb temperature rises, making conditions extremely hazardous.&#xA;&#xA;How the Site Works&#xA;&#xA;The Dangerous Heatwaves site analyzes weather forecasts for locations around the world. It highlights the areas with the highest predicted wet-bulb temperatures in the coming days, giving you a real-time snapshot of where the risk of dangerous heat is greatest.&#xA;&#xA;Why This Matters&#xA;&#xA;Understanding wet-bulb temperature and its impact is essential for preparedness and planning. Whether you&#39;re concerned about your health, outdoor activities, or the well-being of vulnerable populations, this tool can help you stay informed and make smart decisions in the face of extreme heat.&#xA;&#xA;[1]: https://wetbulb.netlify.app&#xA;[2]: https://wetbulb.netlify.app/img/sun.jpg&#xA;&#xA;&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://wetbulb.netlify.app/img/sun.jpg" alt="sun"></p>

<p>As the planet warms due to climate change, the threat of heat waves looms larger than ever. Extreme heat isn&#39;t just uncomfortable; it can be deadly, especially when combined with high humidity.</p>

<p>To help visualize this growing danger, I&#39;ve created a new website: <strong><a href="https://wetbulb.netlify.app">Dangerous Heatwaves</a></strong></p>

<h2 id="what-makes-a-heat-wave-dangerous" id="what-makes-a-heat-wave-dangerous">What Makes a Heat Wave Dangerous?</h2>

<p>The site focuses on a key metric called the wet-bulb temperature. This isn&#39;t the temperature you see on the thermometer. Instead, it&#39;s the lowest temperature you can reach by evaporating water – a crucial concept for understanding how humans handle heat.</p>

<p>We cool down by sweating, a process that relies on evaporation. When the wet-bulb temperature gets too close to our body temperature, sweating becomes ineffective.  That&#39;s when the risk of heatstroke and other heat-related illnesses skyrockets.</p>
<ul><li><strong>Low humidity</strong>: Even with high temperatures, low humidity means a lower wet-bulb temperature, reducing the danger.</li>
<li><strong>High humidity</strong>: This is the worst-case scenario. When it&#39;s both hot and humid, the wet-bulb temperature rises, making conditions extremely hazardous.</li></ul>

<h2 id="how-the-site-works" id="how-the-site-works">How the Site Works</h2>

<p>The <a href="https://wetbulb.netlify.app">Dangerous Heatwaves</a> site analyzes weather forecasts for locations around the world. It highlights the areas with the highest predicted wet-bulb temperatures in the coming days, giving you a real-time snapshot of where the risk of dangerous heat is greatest.</p>

<h2 id="why-this-matters" id="why-this-matters">Why This Matters</h2>

<p>Understanding wet-bulb temperature and its impact is essential for preparedness and planning. Whether you&#39;re concerned about your health, outdoor activities, or the well-being of vulnerable populations, this tool can help you stay informed and make smart decisions in the face of extreme heat.</p>
]]></content:encoded>
      <guid>https://eamonn.org/show-upcoming-dangerous-heatwaves-a-new-tool-to-track-rising-risks</guid>
      <pubDate>Sun, 02 Jun 2024 05:22:59 +0000</pubDate>
    </item>
    <item>
      <title>Ants!</title>
      <link>https://eamonn.org/ants</link>
      <description>&lt;![CDATA[Fascinating swarm dynamics in this flow of ants down my driveway in Calistoga&#xA;&#xA;video autoplay loop muted src=&#34;https://flickr.com/videodownload.gne?id=53732216310&#34;&#xA;&#xA;video autoplay loop muted src=&#34;https://flickr.com/videodownload.gne?id=53732080564&#34;&#xA;&#xA;&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Fascinating swarm dynamics in this flow of ants down my driveway in Calistoga</p>

<p><video autoplay="" loop="" muted="" src="https://flickr.com/video_download.gne?id=53732216310"></p>

<p><video autoplay="" loop="" muted="" src="https://flickr.com/video_download.gne?id=53732080564"></p>
]]></content:encoded>
      <guid>https://eamonn.org/ants</guid>
      <pubDate>Sat, 18 May 2024 04:58:11 +0000</pubDate>
    </item>
    <item>
      <title>Simplest blog?</title>
      <link>https://eamonn.org/simplest-blog</link>
      <description>&lt;![CDATA[How simple can a blogging platform be?&#xA;&#xA;I tried to build a simple blog for anyone with a GitHib account.&#xA;&#xA;How to use it&#xA;&#xA;All you do is&#xA;&#xA;Fork a repo&#xA;Do a small amount of configuration of your new GitHub repo&#xA;Use the GitHub web UI to edit markdown files&#xA;Your blog gets automatically published as GitHub pages&#xA;&#xA;The GitHub repo with full instructions is at simplestblog&#xA;&#xA;An example of a blog that uses this is eobrain.github.io/mysimplestblog&#xA;&#xA;How it was built&#xA;&#xA;It is a simple Node.js JavaScript app that is built on a simple foundation:&#xA;&#xA;A markdown library that converts markdown to HTML&#xA;The Mustache library for building pages from templates&#xA;&#xA;[1]: https://github.com/eobrain/simplestblog &#xA;[2]: https://eobrain.github.io/mysimplestblog&#xA;&#xA;&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>How simple can a blogging platform be?</p>

<p>I tried to build a simple blog for anyone with a GitHib account.</p>

<h2 id="how-to-use-it" id="how-to-use-it">How to use it</h2>

<p>All you do is</p>
<ol><li>Fork a repo</li>
<li>Do a small amount of configuration of your new GitHub repo</li>
<li>Use the GitHub web UI to edit markdown files</li>
<li>Your blog gets automatically published as GitHub pages</li></ol>

<p>The GitHub repo with full instructions is at <a href="https://github.com/eobrain/simplestblog">simplestblog</a></p>

<p>An example of a blog that uses this is <a href="https://eobrain.github.io/mysimplestblog">eobrain.github.io/mysimplestblog</a></p>

<h2 id="how-it-was-built" id="how-it-was-built">How it was built</h2>

<p>It is a simple Node.js JavaScript app that is built on a simple foundation:</p>
<ul><li>A markdown library that converts markdown to HTML</li>
<li>The Mustache library for building pages from templates</li></ul>
]]></content:encoded>
      <guid>https://eamonn.org/simplest-blog</guid>
      <pubDate>Sat, 11 May 2024 03:19:48 +0000</pubDate>
    </item>
    <item>
      <title>How to Export a Blog from Writefreely</title>
      <link>https://eamonn.org/how-to-export-a-blog-from-writefreely</link>
      <description>&lt;![CDATA[WriteFreely is a fantastic minimalist blogging platform with Fediverse integration. If you&#39;re self-hosting WriteFreely (like this blog!), it&#39;s wise to maintain backups for peace of mind. Here&#39;s how to export your WriteFreely blog using a tool I created called writefreely-export.&#xA;&#xA;Prerequisites:&#xA;&#xA;Shell access to your WriteFreely server&#xA;Node.js installed (I recommend using nvm for managing Node.js versions – installation instructions here)&#xA;&#xA;Steps:&#xA;&#xA;Clone the repository and cd into it:&#xA;&#xA;git clone https://github.com/eobrain/writefreely-export.git&#xA;cd writefreely-export&#xA;Ensure Node.js compatibility (if using nvm):&#xA;&#xA;nvm use&#xA;&#xA;Finally to do the export do&#xA;&#xA;npm install&#xA;npm run export&#xA;&#xA;This creates a content directory containing Markdown files of your WriteFreely posts.&#xA;&#xA;Using the Exported Files&#xA;&#xA;One option is to import your Markdown files into a static site generator like simplestblog. This approach gives you a static backup and an alternate site. For example, this blog is mirrored at mysimplestblog.&#xA;&#xA;Additional Notes:&#xA;&#xA;Consider automating the export process for regular backups.&#xA;&#xA;[1]: https://writefreely.org/ &#xA;[2]: https://github.com/eobrain/writefreely-export&#xA;[3]: https://nodejs.org/en/download/package-manager&#xA;[4]: https://github.com/eobrain/simplestblog&#xA;[5]: https://eobrain.github.io/mysimplestblog/&#xA;&#xA;&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://writefreely.org/">WriteFreely</a> is a fantastic minimalist blogging platform with Fediverse integration. If you&#39;re self-hosting WriteFreely (like this blog!), it&#39;s wise to maintain backups for peace of mind. Here&#39;s how to export your WriteFreely blog using a tool I created called <a href="https://github.com/eobrain/writefreely-export">writefreely-export</a>.</p>

<h2 id="prerequisites" id="prerequisites">Prerequisites:</h2>
<ol><li>Shell access to your WriteFreely server</li>
<li>Node.js installed (I recommend using nvm for managing Node.js versions – <a href="https://nodejs.org/en/download/package-manager">installation instructions here</a>)</li></ol>

<h2 id="steps" id="steps">Steps:</h2>

<p>Clone the repository and cd into it:</p>

<pre><code class="language-sh">git clone https://github.com/eobrain/writefreely-export.git
cd writefreely-export
</code></pre>

<p>Ensure Node.js compatibility (if using nvm):</p>

<pre><code class="language-sh">nvm use
</code></pre>

<p>Finally to do the export do</p>

<pre><code class="language-sh">npm install
npm run export
</code></pre>

<p>This creates a <code>content</code> directory containing Markdown files of your WriteFreely posts.</p>

<h2 id="using-the-exported-files" id="using-the-exported-files">Using the Exported Files</h2>

<p>One option is to import your Markdown files into a static site generator like <a href="https://github.com/eobrain/simplestblog">simplestblog</a>. This approach gives you a static backup and an alternate site. For example, this blog is mirrored at <a href="https://eobrain.github.io/mysimplestblog/">mysimplestblog</a>.</p>

<h2 id="additional-notes" id="additional-notes">Additional Notes:</h2>

<p>Consider automating the export process for regular backups.</p>
]]></content:encoded>
      <guid>https://eamonn.org/how-to-export-a-blog-from-writefreely</guid>
      <pubDate>Fri, 10 May 2024 05:25:10 +0000</pubDate>
    </item>
    <item>
      <title>Classless Tufte CSS</title>
      <link>https://eamonn.org/classless-tufte-css</link>
      <description>&lt;![CDATA[I&#39;ve long admired how the Tufte CSS project allowed you to create web pages in the style the legendary Edward Tufte developed.&#xA;&#xA;One improvement I&#39;ve wished for is the ability to use the Tufte CSS with well-structured semantic HTML, without requiring sprinkling class attributes around the CSS.&#xA;&#xA;So I forked the project and created a new one called, which you can check out at: Classless Tufte CSS.&#xA;&#xA;You can try it out by including this in the head section of your HTML:&#xA;&#xA;link rel=&#34;stylesheet&#34; href=&#34;https://cdn.jsdelivr.net/gh/eobrain/classless-tufte-css@v1.0.1/tufte.min.css&#34;/&#xA;&#xA;Your HTML requires no class attributes but should be in a standard semantic structure like this:&#xA;&#xA;body&#xA;  article&#xA;    h1 title /h1&#xA;    p subtitle /p&#xA;    section&#xA;       h2 section header /h2&#xA;       ... paragraphs, lists, code blocks, figures etc&#xA;    /section&#xA;    section&#xA;    ...&#xA;&#xA;The main features lost in moving to the classless form were&#xA;&#xA;There is no automatic sidenote numbering&#xA;The asides used to implement margin material must be between paragraphs, they cannot be embedded in the middle of a paragraph.&#xA;&#xA;There are some added features though:&#xA;&#xA;Lists that are in between paragraphs are also put in the margin.&#xA;The margin material does not disappear for narrow screens. Instead, it is shown inline, indented.&#xA;Code blocks have a subtle background shading&#xA;Tables have some lines&#xA;&#xA;Here is a comparison of the HTML between Tufte CSS and Classless Tufte CSS, so you can see the simplification.&#xA;&#xA;||Tufte CSS|Classless Tufte CSS|&#xA;|---|---|---|&#xA;|All-caps initial text|...pspan class=&#34;newthought&#34;A new thought/span comes to me...|...sectionpA new thought comes to me...|&#xA;|Epigraph|...div class=&#34;epigraph&#34;blockquotep...|.../h2blockquotep...|&#xA;|Sidenote reference|label for=&#34;sn-extensive-use-of-sidenotes&#34; class=&#34;margin-toggle sidenote-number&#34;/labelinput type=&#34;checkbox&#34; id=&#34;sn-extensive-use-of-sidenotes&#34; class=&#34;margin-toggle&#34;/||sup1/sup.../p|Label (&#34;1&#34; here) must be manually assigned|&#xA;|Sidenote|span class=&#34;sidenote&#34;This is a sidenote./span|.../pasidesup1/sup This is a sidenote./aside|&#xA;|Margin note|label for=&#34;mn-demo&#34; class=&#34;margin-toggle&#34;&amp;#8853;/labelinput type=&#34;checkbox&#34; id=&#34;mn-demo&#34; class=&#34;margin-toggle&#34;/span class=&#34;marginnote&#34;This is a margin note. Notice there isn’t a number preceding the note./span|.../pasideThis is a margin note. Notice there isn’t a number preceding the note./aside|&#xA;|Fullwidth figure|...figure class=&#34;full-width&#34;...|/sectionfigure...|&#xA;|iframe wrapper|figure class=&#34;iframe-wrapper&#34;iframe width=&#34;853&#34; height=&#34;480&#34; src=&#34;https://www.youtube.com/embed/YslQ2625TR4&#34; frameborder=&#34;0&#34; allowfullscreen/iframe/figure|figureiframe width=&#34;853&#34; height=&#34;480&#34; src=&#34;https://www.youtube.com/embed/YslQ2625TR4&#34; frameborder=&#34;0&#34; allowfullscreen/iframe/figure|&#xA;&#xA;What prompted me to do this is that I&#39;m currently working to convert this blog to a static version, and I wanted to use Tufte CSS for plain semantic HTML generated from markdown.&#xA;&#xA;[1]: https://edwardtufte.github.io/tufte-css/&#xA;[2]: https://eobrain.github.io/classless-tufte-css/&#xA;&#xA;&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>I&#39;ve long admired how the <a href="https://edwardtufte.github.io/tufte-css/">Tufte CSS</a> project allowed you to create web pages in the style the legendary Edward Tufte developed.</p>

<p>One improvement I&#39;ve wished for is the ability to use the Tufte CSS with well-structured semantic HTML, without requiring sprinkling <code>class</code> attributes around the CSS.</p>

<p>So I forked the project and created a new one called, which you can check out at: <a href="https://eobrain.github.io/classless-tufte-css/">Classless Tufte CSS</a>.</p>

<p>You can try it out by including this in the <code>&lt;head&gt;</code> section of your HTML:</p>

<pre><code class="language-html">&lt;link rel=&#34;stylesheet&#34; href=&#34;https://cdn.jsdelivr.net/gh/eobrain/classless-tufte-css@v1.0.1/tufte.min.css&#34;/&gt;
</code></pre>

<p>Your HTML requires no <code>class</code> attributes but should be in a standard semantic structure like this:</p>

<pre><code class="language-html">&lt;body&gt;
  &lt;article&gt;
    &lt;h1&gt; title &lt;/h1&gt;
    &lt;p&gt; subtitle &lt;/p&gt;
    &lt;section&gt;
       &lt;h2&gt; section header &lt;/h2&gt;
       ... paragraphs, lists, code blocks, figures etc
    &lt;/section&gt;
    &lt;section&gt;
    ...
</code></pre>

<p>The main features lost in moving to the classless form were</p>
<ul><li>There is no automatic sidenote numbering</li>
<li>The <code>&lt;aside&gt;</code>s used to implement margin material must be between paragraphs, they cannot be embedded in the middle of a paragraph.</li></ul>

<p>There are some added features though:</p>
<ul><li>Lists that are in between paragraphs are also put in the margin.</li>
<li>The margin material does not disappear for narrow screens. Instead, it is shown inline, indented.</li>
<li>Code blocks have a subtle background shading</li>
<li>Tables have some lines</li></ul>

<p>Here is a comparison of the HTML between Tufte CSS and Classless Tufte CSS, so you can see the simplification.</p>

<table>
<thead>
<tr>
<th></th>
<th>Tufte CSS</th>
<th>Classless Tufte CSS</th>
</tr>
</thead>

<tbody>
<tr>
<td>All-caps initial text</td>
<td><code>...&lt;p&gt;&lt;span class=&#34;newthought&#34;&gt;A new thought&lt;/span&gt; comes to me...</code></td>
<td><code>...&lt;section&gt;&lt;p&gt;A new thought comes to me...</code></td>
</tr>

<tr>
<td>Epigraph</td>
<td><code>...&lt;div class=&#34;epigraph&#34;&gt;&lt;blockquote&gt;&lt;p&gt;...</code></td>
<td><code>...&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;...</code></td>
</tr>

<tr>
<td>Sidenote reference</td>
<td><code>&lt;label for=&#34;sn-extensive-use-of-sidenotes&#34; class=&#34;margin-toggle sidenote-number&#34;&gt;&lt;/label&gt;&lt;input type=&#34;checkbox&#34; id=&#34;sn-extensive-use-of-sidenotes&#34; class=&#34;margin-toggle&#34;/&gt;</code></td>
<td></td>
</tr>

<tr>
<td>Sidenote</td>
<td><code>&lt;span class=&#34;sidenote&#34;&gt;This is a sidenote.&lt;/span&gt;</code></td>
<td><code>...&lt;/p&gt;&lt;aside&gt;&lt;sup&gt;1&lt;/sup&gt; This is a sidenote.&lt;/aside&gt;</code></td>
</tr>

<tr>
<td>Margin note</td>
<td><code>&lt;label for=&#34;mn-demo&#34; class=&#34;margin-toggle&#34;&gt;&amp;#8853;&lt;/label&gt;&lt;input type=&#34;checkbox&#34; id=&#34;mn-demo&#34; class=&#34;margin-toggle&#34;/&gt;&lt;span class=&#34;marginnote&#34;&gt;This is a margin note. Notice there isn’t a number preceding the note.&lt;/span&gt;</code></td>
<td><code>...&lt;/p&gt;&lt;aside&gt;This is a margin note. Notice there isn’t a number preceding the note.&lt;/aside&gt;</code></td>
</tr>

<tr>
<td>Fullwidth figure</td>
<td><code>...&lt;figure class=&#34;full-width&#34;&gt;...</code></td>
<td><code>&lt;/section&gt;&lt;figure&gt;...</code></td>
</tr>

<tr>
<td>iframe wrapper</td>
<td><code>&lt;figure class=&#34;iframe-wrapper&#34;&gt;&lt;iframe width=&#34;853&#34; height=&#34;480&#34; src=&#34;https://www.youtube.com/embed/YslQ2625TR4&#34; frameborder=&#34;0&#34; allowfullscreen&gt;&lt;/iframe&gt;&lt;/figure&gt;</code></td>
<td><code>&lt;figure&gt;&lt;iframe width=&#34;853&#34; height=&#34;480&#34; src=&#34;https://www.youtube.com/embed/YslQ2625TR4&#34; frameborder=&#34;0&#34; allowfullscreen&gt;&lt;/iframe&gt;&lt;/figure&gt;</code></td>
</tr>
</tbody>
</table>

<p>What prompted me to do this is that I&#39;m currently working to convert this blog to a static version, and I wanted to use Tufte CSS for plain semantic HTML generated from markdown.</p>
]]></content:encoded>
      <guid>https://eamonn.org/classless-tufte-css</guid>
      <pubDate>Sun, 28 Apr 2024 03:46:19 +0000</pubDate>
    </item>
    <item>
      <title>European Government for Americans</title>
      <link>https://eamonn.org/european-government-for-americans</link>
      <description>&lt;![CDATA[As part of my work on dealing with regulation in the EU, I’ve come to a simplistic understanding of EU governing bodies by analogy with equivalent US governing bodies: &#xA;&#xA;Lower House: The European Parliament is the US House of Representatives. &#xA;Upper House: The European Council is the US Senate from the early US when the states directly appointed senators&#xA;Executive: The European Commission is the US President and Cabinet, except there is exactly one cabinet member from each state&#xA;&#xA;On both sides of the Atlantic, both the lower and upper house must agree on legislation before it is passed.&#xA;&#xA;One difference is that in the EU the executive proposes legislation, but in the US it can also be proposed by the upper or lower house&#xA;&#xA;Another practical difference is the US bodies have only two political parties because of the first-past-the-post voting system. In contrast, the EU bodies have many political parties because of greater diversity and more proportional voting systems.&#xA;&#xA;And of course in Europe, the individual member states retain much more sovereignty than US states do (despite what Texas might think).&#xA;&#xA;Update 2024-03-01, more analogs in response to a comment on BlueSky:&#xA;&#xA;EU conciliation committees are US congressional conference committees, except also including some cabinet members, and with a deadline. &#xA;&#xA;Trilogue is when the president invites leaders of both houses of Congress to the White House for an informal chat to move some legislation forward.&#xA;&#xA;[1]: https://bsky.app/profile/privacat.bsky.social/post/3kmmlqw4fdf2x&#xA;&#xA;&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>As part of my work on dealing with regulation in the EU, I’ve come to a simplistic understanding of EU governing bodies by analogy with equivalent US governing bodies:</p>
<ol><li><strong>Lower House</strong>: The European Parliament is the US House of Representatives.</li>
<li><strong>Upper House</strong>: The European Council is the US Senate from the early US when the states directly appointed senators</li>
<li><strong>Executive</strong>: The European Commission is the US President and Cabinet, except there is exactly one cabinet member from each state</li></ol>

<p>On both sides of the Atlantic, both the lower and upper house must agree on legislation before it is passed.</p>

<p>One difference is that in the EU the executive proposes legislation, but in the US it can also be proposed by the upper or lower house</p>

<p>Another practical difference is the US bodies have only two political parties because of the first-past-the-post voting system. In contrast, the EU bodies have many political parties because of greater diversity and more proportional voting systems.</p>

<p>And of course in Europe, the individual member states retain much more sovereignty than US states do (despite what Texas might think).</p>

<p><em>Update 2024-03-01, more analogs in response to a <a href="https://bsky.app/profile/privacat.bsky.social/post/3kmmlqw4fdf2x">comment on BlueSky</a>:</em></p>

<p>EU conciliation committees are US congressional conference committees, except also including some cabinet members, and with a deadline.</p>

<p>Trilogue is when the president invites leaders of both houses of Congress to the White House for an informal chat to move some legislation forward.</p>
]]></content:encoded>
      <guid>https://eamonn.org/european-government-for-americans</guid>
      <pubDate>Thu, 29 Feb 2024 18:00:45 +0000</pubDate>
    </item>
  </channel>
</rss>