<rss xmlns:source="http://source.scripting.com/" version="2.0">
  <channel>
    <title>Ted&#39;s Tidbits</title>
    <link>https://tidbits.tedchoward.com/</link>
    <description></description>
    
    <language>en</language>
    
    <lastBuildDate>Sat, 06 Jun 2026 12:01:39 -0500</lastBuildDate>
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2026/06/06/i-finally-got-around-to.html</link>
      <pubDate>Sat, 06 Jun 2026 12:01:39 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2026/06/06/i-finally-got-around-to.html</guid>
      <description>&lt;p&gt;I finally got around to reading the Ted Chiang piece in The Atlantic about how LLMs aren&amp;rsquo;t conscious. It is excellent. Everyone should read it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theatlantic.com/philosophy/2026/06/no-artificial-intelligence-is-not-conscious/687378/&#34;&gt;www.theatlantic.com/philosoph&amp;hellip;&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>I finally got around to reading the Ted Chiang piece in The Atlantic about how LLMs aren&#39;t conscious. It is excellent. Everyone should read it.

[www.theatlantic.com/philosoph...](https://www.theatlantic.com/philosophy/2026/06/no-artificial-intelligence-is-not-conscious/687378/) 
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2026/06/06/cory-doctorow-what-we-make.html</link>
      <pubDate>Sat, 06 Jun 2026 11:15:39 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2026/06/06/cory-doctorow-what-we-make.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pluralistic.net/2026/06/05/defining-humanity/&#34;&gt;Cory Doctorow&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What we make of this new fact is controversial. For many people (myself included), this is a refinement: it tells me that behaviors that are indistinguishable from &amp;ldquo;creativity&amp;rdquo; can, at least some of the time, be created by mechanical processes, and the mere fact that a machine does something that appears &amp;ldquo;creative&amp;rdquo; doesn&amp;rsquo;t mean that machines are human.&lt;/p&gt;
&lt;p&gt;For others, the fact that a mechanical system can evince a behavior that we would call &amp;ldquo;creative&amp;rdquo; in a human doesn&amp;rsquo;t mean that we defined &amp;ldquo;creativity&amp;rdquo; too broadly, it means that we defined &amp;ldquo;human&amp;rdquo; too narrowly, and now we have made a machine that is, at least partially, a person.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
      <source:markdown>[Cory Doctorow](https://pluralistic.net/2026/06/05/defining-humanity/):
&gt; What we make of this new fact is controversial. For many people (myself included), this is a refinement: it tells me that behaviors that are indistinguishable from &#34;creativity&#34; can, at least some of the time, be created by mechanical processes, and the mere fact that a machine does something that appears &#34;creative&#34; doesn&#39;t mean that machines are human.
&gt;
&gt; For others, the fact that a mechanical system can evince a behavior that we would call &#34;creative&#34; in a human doesn&#39;t mean that we defined &#34;creativity&#34; too broadly, it means that we defined &#34;human&#34; too narrowly, and now we have made a machine that is, at least partially, a person.
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2026/05/22/jake-savin-the-hard-part.html</link>
      <pubDate>Fri, 22 May 2026 09:08:41 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2026/05/22/jake-savin-the-hard-part.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://jakesav.in/2026/05/21/the-new-frontier-the-real-start/&#34;&gt;Jake Savin&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The hard part is finding all the invisible details, and the bargains that were made with the environment it came from.&lt;/p&gt;
&lt;p&gt;And Frontier had a lot of those.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As someone who has attempted a few times to port Frontier to modern platforms, I can confidently say that he nails it. I love that phrase: &amp;ldquo;bargains that were made with the environment it came from.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been enjoying watching his progress, which far surpasses anything I ever did with it.&lt;/p&gt;
</description>
      <source:markdown>[Jake Savin](https://jakesav.in/2026/05/21/the-new-frontier-the-real-start/):
&gt; The hard part is finding all the invisible details, and the bargains that were made with the environment it came from.
&gt; 
&gt; And Frontier had a lot of those.

As someone who has attempted a few times to port Frontier to modern platforms, I can confidently say that he nails it. I love that phrase: &#34;bargains that were made with the environment it came from.&#34;

I&#39;ve been enjoying watching his progress, which far surpasses anything I ever did with it.
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2025/02/03/todays-dallas-morning-news-front.html</link>
      <pubDate>Mon, 03 Feb 2025 10:36:13 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2025/02/03/todays-dallas-morning-news-front.html</guid>
      <description>&lt;p&gt;Today&amp;rsquo;s Dallas Morning News front page 😢&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2025/ece1bb30d5.png&#34; width=&#34;463&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</description>
      <source:markdown>Today&#39;s Dallas Morning News front page 😢

&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2025/ece1bb30d5.png&#34; width=&#34;463&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2025/02/02/the-reason-type-coercion-is.html</link>
      <pubDate>Sun, 02 Feb 2025 18:41:56 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2025/02/02/the-reason-type-coercion-is.html</guid>
      <description>&lt;p&gt;The reason type coercion is important is that it provides an answer to the question: &amp;ldquo;What happens when you try to add two values of different types?&amp;rdquo; Let&amp;rsquo;s say you have a &lt;code&gt;number&lt;/code&gt; and a &lt;code&gt;string&lt;/code&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;3 + &amp;quot;test&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;What should happen?&lt;/p&gt;
&lt;p&gt;When you make the language you get to decide.&lt;/p&gt;
</description>
      <source:markdown>The reason type coercion is important is that it provides an answer to the question: &#34;What happens when you try to add two values of different types?&#34; Let&#39;s say you have a `number` and a `string`

```
3 + &#34;test&#34;
```

What should happen?

When you make the language you get to decide.
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2025/02/01/type-coercion-is-one-of.html</link>
      <pubDate>Sat, 01 Feb 2025 18:07:02 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2025/02/01/type-coercion-is-one-of.html</guid>
      <description>&lt;p&gt;Type coercion is one of those language features that is really powerful because, when done well, the programmer using the language doesn&amp;rsquo;t even notice it.&lt;/p&gt;
</description>
      <source:markdown>Type coercion is one of those language features that is really powerful because, when done well, the programmer using the language doesn&#39;t even notice it.
</source:markdown>
    </item>
    
    <item>
      <title>9 years, 6 months, and 4 days</title>
      <link>https://tidbits.tedchoward.com/2025/01/31/years-months-and-days.html</link>
      <pubDate>Fri, 31 Jan 2025 10:21:41 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2025/01/31/years-months-and-days.html</guid>
      <description>&lt;p&gt;9 years, 6 months, and 4 days ago, I started a new job with a scrappy, but growing company doing really cool things. Today is my last day as an employee of this company, but not because I&amp;rsquo;m leaving.&lt;/p&gt;
&lt;p&gt;Two years ago, were acquired by a much larger company. So far, we&amp;rsquo;ve been able (actually encouraged) to preserve our culture: our ways of working together and treating each other.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m hopeful for what the future may bring. But today, I&amp;rsquo;m also a little sad. The beginning of a new era is also the end of an old one.&lt;/p&gt;
</description>
      <source:markdown>9 years, 6 months, and 4 days ago, I started a new job with a scrappy, but growing company doing really cool things. Today is my last day as an employee of this company, but not because I&#39;m leaving.

Two years ago, were acquired by a much larger company. So far, we&#39;ve been able (actually encouraged) to preserve our culture: our ways of working together and treating each other. 

I&#39;m hopeful for what the future may bring. But today, I&#39;m also a little sad. The beginning of a new era is also the end of an old one.
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2025/01/27/i-dont-like-doing-test.html</link>
      <pubDate>Mon, 27 Jan 2025 10:00:52 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2025/01/27/i-dont-like-doing-test.html</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t like doing test posts, but I need to see if this gets posted to my Mastodon account.&lt;/p&gt;
</description>
      <source:markdown>I don&#39;t like doing test posts, but I need to see if this gets posted to my Mastodon account.
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2025/01/21/achievement-unlocked-audible-fan-noise.html</link>
      <pubDate>Tue, 21 Jan 2025 16:35:59 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2025/01/21/achievement-unlocked-audible-fan-noise.html</guid>
      <description>&lt;p&gt;Achievement unlocked: audible fan noise on my MacBook Pro M3.&lt;/p&gt;
&lt;p&gt;The secret is to use Excel and max out its row size.&lt;/p&gt;
</description>
      <source:markdown>Achievement unlocked: audible fan noise on my MacBook Pro M3.

The secret is to use Excel and max out its row size.
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2025/01/21/finished-reading-entrances-and-exits.html</link>
      <pubDate>Tue, 21 Jan 2025 12:35:11 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2025/01/21/finished-reading-entrances-and-exits.html</guid>
      <description>&lt;img src=&#34;https://cdn.micro.blog/books/9781637589144/cover.jpg&#34; align=&#34;left&#34; class=&#34;microblog_book&#34; style=&#34;max-width: 60px; margin-right: 20px; margin-top: 0px; padding-top: 0px;&#34;&gt;
&lt;p&gt;Finished reading: &lt;a href=&#34;https://micro.blog/books/9781637589144&#34;&gt;Entrances and Exits&lt;/a&gt; by Michael Richards.&lt;/p&gt;
&lt;p&gt;As a Seinfeld fan who had written him off after his outburst at the Laugh Factory years ago, I appreciated hearing his story. He has lived a fascinating life and has an incredibly thoughtful perspective.&lt;/p&gt;
&lt;p&gt;📚&lt;/p&gt;
</description>
      <source:markdown>&lt;img src=&#34;https://cdn.micro.blog/books/9781637589144/cover.jpg&#34; align=&#34;left&#34; class=&#34;microblog_book&#34; style=&#34;max-width: 60px; margin-right: 20px; margin-top: 0px; padding-top: 0px;&#34;&gt;

Finished reading: [Entrances and Exits](https://micro.blog/books/9781637589144) by Michael Richards.

As a Seinfeld fan who had written him off after his outburst at the Laugh Factory years ago, I appreciated hearing his story. He has lived a fascinating life and has an incredibly thoughtful perspective.

📚
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2025/01/21/im-trying-out-the-vivaldi.html</link>
      <pubDate>Tue, 21 Jan 2025 11:37:26 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2025/01/21/im-trying-out-the-vivaldi.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;m trying out the Vivaldi web browser, and I&amp;rsquo;m just blown away by the number of configuration options. I&amp;rsquo;m going to stick with the defaults for a while, but it seems that if there&amp;rsquo;s something I don&amp;rsquo;t like about the browser, I could probably change it.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2025/image.png&#34; width=&#34;600&#34; height=&#34;496&#34; alt=&#34;&#34;&gt;
</description>
      <source:markdown>I&#39;m trying out the Vivaldi web browser, and I&#39;m just blown away by the number of configuration options. I&#39;m going to stick with the defaults for a while, but it seems that if there&#39;s something I don&#39;t like about the browser, I could probably change it.

&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2025/image.png&#34; width=&#34;600&#34; height=&#34;496&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>Building a Programming Language: What is a Tokenizer?</title>
      <link>https://tidbits.tedchoward.com/2025/01/15/building-a-programming-language-what.html</link>
      <pubDate>Wed, 15 Jan 2025 10:31:31 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2025/01/15/building-a-programming-language-what.html</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s say you want to make a programming language. The first thing your implementation needs to do is &lt;em&gt;tokenize&lt;/em&gt; the input. What does that mean?&lt;/p&gt;
&lt;p&gt;Your implementation will be a program that reads an input string and interprets its meaning, analogous to the way we read sentences and interpret their meanings. Consider the following sentence:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The quick brown fox jumps over the lazy dog.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When a human reads this sentence, they look at it and see words. But when a
computer reads the same sentence, it just sees a bunch of characters:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#39;T&#39;, &#39;h&#39;, &#39;e&#39;, &#39; &#39;, &#39;q&#39;, &#39;u&#39;, &#39;i&#39;, &#39;c&#39;, &#39;k&#39;, &#39; &#39;, &#39;b&#39;, &#39;r&#39;, &#39;o&#39;, &#39;w&#39;, &#39;n&#39;, &#39; &#39;, &#39;f&#39;, &#39;o&#39;, &#39;x&#39;, &#39; &#39;, &#39;j&#39;, &#39;u&#39;, &#39;m&#39;, &#39;p&#39;, &#39;s&#39;, &#39; &#39;, &#39;o&#39;, &#39;v&#39;, &#39;e&#39;, &#39;r&#39;, &#39; &#39;, &#39;t&#39;, &#39;h&#39;, &#39;e&#39;, &#39; &#39;, &#39;l&#39;, &#39;a&#39;, &#39;z&#39;, &#39;y&#39;, &#39; &#39;, &#39;d&#39;, &#39;o&#39;, &#39;g&#39;, &#39;.&#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The process of &lt;em&gt;tokenizing&lt;/em&gt; is the process of interpreting a series of
characters as a sentence of words.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#39;The&#39;, &#39;quick&#39;, &#39;brown&#39;, &#39;fox&#39;, &#39;jumps&#39;, &#39;over&#39;, &#39;the&#39;, &#39;lazy&#39;, &#39;dog&#39;, &#39;.&#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That&amp;rsquo;s much easier to understand now, but we&amp;rsquo;re not done yet. A list of words
followed by a period does not necessarily make a valid sentence. To know if the
sentence is valid and what it might mean, we need to know what part of speech
each of the words are. Something like:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{ type: Article, source: &#39;The&#39; },
{ type: Adjective, source: &#39;quick&#39; },
{ type: Adjective, source: &#39;brown&#39; },
{ type: Noun, source: &#39;fox&#39; },
{ type: Verb, source: &#39;jumps&#39; },
{ type: Preposition, source: &#39;over&#39; },
{ type: Article, source: &#39;the&#39; },
{ type: Adjective, source: &#39;lazy&#39; },
{ type: Noun, source: &#39;dog&#39; },
{ type: Period, source: &#39;.&#39; }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now we have something that a computer program could begin to interpret. Each of
those items listed above is called a &lt;em&gt;token&lt;/em&gt;. It has a &lt;em&gt;type&lt;/em&gt; in addition to
its &lt;em&gt;source&lt;/em&gt; which is the original string of characters.&lt;/p&gt;
&lt;p&gt;Just because we have a list of tokens doesn&amp;rsquo;t necessarily mean that we have a
valid sentence, but we now have enough information to be able to determine if
this sentence follows the rules of the grammar of the language.&lt;/p&gt;
&lt;p&gt;Of course, we&amp;rsquo;re making a programming language, so the &amp;ldquo;sentences&amp;rdquo; look more
like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;local (text = op.getsuboutline ());
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And the tokens look like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{ type: Local, source: &amp;quot;local&amp;quot; },
{ type: LeftParen, source: &amp;quot;(&amp;quot; },
{ type: Identifier, source: &amp;quot;texttosearch&amp;quot; },
{ type: Equal, source: &amp;quot;=&amp;quot; },
{ type: Identifier, source: &amp;quot;op&amp;quot; },
{ type: Dot, source: &amp;quot;.&amp;quot; },
{ type: Identifier, source: &amp;quot;getsuboutline&amp;quot; },
{ type: LeftParen, source: &amp;quot;(&amp;quot; },
{ type: RightParen, source: &amp;quot;)&amp;quot; },
{ type: RightParen, source: &amp;quot;)&amp;quot; },
{ type: Semicolon, source: &amp;quot;;&amp;quot; }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;But the concept is the same. The job of a tokenizer is to scan through the
input string and convert it into a list of tokens.&lt;/p&gt;
&lt;p&gt;Once we have a tokenizer, we can start building a &lt;em&gt;compiler&lt;/em&gt; which takes the
list of tokens, interprets it according to the rules of the language&amp;rsquo;s grammar,
and generates instructions for the computer to execute. But that&amp;rsquo;s for another
day.&lt;/p&gt;
</description>
      <source:markdown>Let&#39;s say you want to make a programming language. The first thing your implementation needs to do is *tokenize* the input. What does that mean?

Your implementation will be a program that reads an input string and interprets its meaning, analogous to the way we read sentences and interpret their meanings. Consider the following sentence:

&gt; The quick brown fox jumps over the lazy dog.

When a human reads this sentence, they look at it and see words. But when a
computer reads the same sentence, it just sees a bunch of characters:

```
&#39;T&#39;, &#39;h&#39;, &#39;e&#39;, &#39; &#39;, &#39;q&#39;, &#39;u&#39;, &#39;i&#39;, &#39;c&#39;, &#39;k&#39;, &#39; &#39;, &#39;b&#39;, &#39;r&#39;, &#39;o&#39;, &#39;w&#39;, &#39;n&#39;, &#39; &#39;, &#39;f&#39;, &#39;o&#39;, &#39;x&#39;, &#39; &#39;, &#39;j&#39;, &#39;u&#39;, &#39;m&#39;, &#39;p&#39;, &#39;s&#39;, &#39; &#39;, &#39;o&#39;, &#39;v&#39;, &#39;e&#39;, &#39;r&#39;, &#39; &#39;, &#39;t&#39;, &#39;h&#39;, &#39;e&#39;, &#39; &#39;, &#39;l&#39;, &#39;a&#39;, &#39;z&#39;, &#39;y&#39;, &#39; &#39;, &#39;d&#39;, &#39;o&#39;, &#39;g&#39;, &#39;.&#39;
```
The process of *tokenizing* is the process of interpreting a series of
characters as a sentence of words.

```
&#39;The&#39;, &#39;quick&#39;, &#39;brown&#39;, &#39;fox&#39;, &#39;jumps&#39;, &#39;over&#39;, &#39;the&#39;, &#39;lazy&#39;, &#39;dog&#39;, &#39;.&#39;
```
That&#39;s much easier to understand now, but we&#39;re not done yet. A list of words
followed by a period does not necessarily make a valid sentence. To know if the
sentence is valid and what it might mean, we need to know what part of speech
each of the words are. Something like:

```
{ type: Article, source: &#39;The&#39; },
{ type: Adjective, source: &#39;quick&#39; },
{ type: Adjective, source: &#39;brown&#39; },
{ type: Noun, source: &#39;fox&#39; },
{ type: Verb, source: &#39;jumps&#39; },
{ type: Preposition, source: &#39;over&#39; },
{ type: Article, source: &#39;the&#39; },
{ type: Adjective, source: &#39;lazy&#39; },
{ type: Noun, source: &#39;dog&#39; },
{ type: Period, source: &#39;.&#39; }
```
Now we have something that a computer program could begin to interpret. Each of
those items listed above is called a *token*. It has a *type* in addition to
its *source* which is the original string of characters.

Just because we have a list of tokens doesn&#39;t necessarily mean that we have a
valid sentence, but we now have enough information to be able to determine if
this sentence follows the rules of the grammar of the language.

Of course, we&#39;re making a programming language, so the &#34;sentences&#34; look more
like this:

```
local (text = op.getsuboutline ());
```
And the tokens look like this:

```
{ type: Local, source: &#34;local&#34; },
{ type: LeftParen, source: &#34;(&#34; },
{ type: Identifier, source: &#34;texttosearch&#34; },
{ type: Equal, source: &#34;=&#34; },
{ type: Identifier, source: &#34;op&#34; },
{ type: Dot, source: &#34;.&#34; },
{ type: Identifier, source: &#34;getsuboutline&#34; },
{ type: LeftParen, source: &#34;(&#34; },
{ type: RightParen, source: &#34;)&#34; },
{ type: RightParen, source: &#34;)&#34; },
{ type: Semicolon, source: &#34;;&#34; }
```
But the concept is the same. The job of a tokenizer is to scan through the
input string and convert it into a list of tokens.

Once we have a tokenizer, we can start building a *compiler* which takes the
list of tokens, interprets it according to the rules of the language&#39;s grammar,
and generates instructions for the computer to execute. But that&#39;s for another
day.
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2024/10/07/happy-th-anniversary.html</link>
      <pubDate>Mon, 07 Oct 2024 19:55:45 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2024/10/07/happy-th-anniversary.html</guid>
      <description>&lt;p&gt;Happy 30th anniversary to Dave Winer’s &lt;a href=&#34;http://scripting.com&#34;&gt;Scripting News&lt;/a&gt;!&lt;/p&gt;
</description>
      <source:markdown>Happy 30th anniversary to Dave Winer’s [Scripting News](http://scripting.com)!
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2023/11/02/dallas-morning-news.html</link>
      <pubDate>Thu, 02 Nov 2023 15:46:22 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2023/11/02/dallas-morning-news.html</guid>
      <description>&lt;p&gt;Dallas Morning News front page today&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2023/ddd7f22488.jpg&#34; width=&#34;316&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</description>
      <source:markdown>Dallas Morning News front page today

&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2023/ddd7f22488.jpg&#34; width=&#34;316&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>VGA Followup</title>
      <link>https://tidbits.tedchoward.com/2023/07/02/vga-followup.html</link>
      <pubDate>Sun, 02 Jul 2023 16:58:39 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2023/07/02/vga-followup.html</guid>
      <description>&lt;p&gt;I need to remember how valuable writing is as a thought tool. The other night I was truly
stumped as to how to solve my VGA problem.&lt;/p&gt;
&lt;p&gt;As I was finishing writing my &lt;a href=&#34;https://tidbits.tedchoward.com/2023/07/02/debugging-a-vga.html&#34;&gt;previous post&lt;/a&gt;, I began to get an idea of where to start
debugging my problem. I even said so in the post:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Remember, there’s a break at the end of every line. This means that I need to start
loading the character data for the start of the next line at the end of this blank
period. There’s also a longer break at the end of each screen. This means that I need to
load the data for the first character of the screen at the end of this blank period.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I think this is where the bug is. All the characters in the first column are one
half-line (at 320x240) lower than the rest of the screen. My best guess is that I need
to start the data load a little sooner during the blank period.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, I looked for the code that calculates which row of pixels to load, and I found this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-verilog&#34; data-lang=&#34;verilog&#34;&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;wire&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] rom_adr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; { pattern_num, vga_vpos[&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] };
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This line says, &amp;ldquo;the location in ROM is composed of the &lt;code&gt;pattern_num&lt;/code&gt; (i.e. the ASCII
character) and bits 3, 2, and 1 of the &lt;strong&gt;current line&lt;/strong&gt;&amp;rdquo;. Apologies to anyone still
reading this that isn&amp;rsquo;t familiar with binary numbers, but those details don&amp;rsquo;t really
matter. What matters is what I put in bold above. We are using the value of the
current line to calculate the value of the next character. This works for every character
in a row, except for the first character.&lt;/p&gt;
&lt;p&gt;When we read the font data for the first character in a row, we are using a value based on
the previous row. We need a special case for when we read the first character.&lt;/p&gt;
&lt;p&gt;This is what I ended up with&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-verilog&#34; data-lang=&#34;verilog&#34;&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;wire&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] rom_adr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; { pattern_num, (display_on &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; vga_vpos[&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; next_rom_row) };
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Basically this says that if the display is on, use the current line position. If the
display is off, (i.e. the blank period at the end of the line) use the next line position.&lt;/p&gt;
&lt;p&gt;There was some other work I had to to do calculate that value properly, but it works now!&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2023/image.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;Monitor showing text. The first column is properly aligned with the rest of the columns.&#34;&gt;
</description>
      <source:markdown>I need to remember how valuable writing is as a thought tool. The other night I was truly
stumped as to how to solve my VGA problem.

As I was finishing writing my [previous post][prev], I began to get an idea of where to start
debugging my problem. I even said so in the post:

&gt; Remember, there’s a break at the end of every line. This means that I need to start
&gt; loading the character data for the start of the next line at the end of this blank
&gt; period. There’s also a longer break at the end of each screen. This means that I need to
&gt; load the data for the first character of the screen at the end of this blank period.

&gt; I think this is where the bug is. All the characters in the first column are one
&gt; half-line (at 320x240) lower than the rest of the screen. My best guess is that I need
&gt; to start the data load a little sooner during the blank period.

So, I looked for the code that calculates which row of pixels to load, and I found this:

```verilog
wire [11:0] rom_adr = { pattern_num, vga_vpos[3:1] };
```

This line says, &#34;the location in ROM is composed of the `pattern_num` (i.e. the ASCII
character) and bits 3, 2, and 1 of the **current line**&#34;. Apologies to anyone still
reading this that isn&#39;t familiar with binary numbers, but those details don&#39;t really
matter. What matters is what I put in bold above. We are using the value of the
current line to calculate the value of the next character. This works for every character
in a row, except for the first character.

When we read the font data for the first character in a row, we are using a value based on
the previous row. We need a special case for when we read the first character.

This is what I ended up with

```verilog
wire [10:0] rom_adr = { pattern_num, (display_on ? vga_vpos[3:1] : next_rom_row) };
```

Basically this says that if the display is on, use the current line position. If the
display is off, (i.e. the blank period at the end of the line) use the next line position.

There was some other work I had to to do calculate that value properly, but it works now!

&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2023/image.jpg&#34; width=&#34;600&#34; height=&#34;450&#34; alt=&#34;Monitor showing text. The first column is properly aligned with the rest of the columns.&#34;&gt;

[prev]: https://tidbits.tedchoward.com/2023/07/02/debugging-a-vga.html
</source:markdown>
    </item>
    
    <item>
      <title>Debugging a VGA Issue</title>
      <link>https://tidbits.tedchoward.com/2023/07/02/debugging-a-vga.html</link>
      <pubDate>Sun, 02 Jul 2023 13:23:37 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2023/07/02/debugging-a-vga.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;m building an 8-bit computer. I should probably write an overview of the project, why I decided to do it, how I got started, etc, but today I have a problem to solve.&lt;/p&gt;
&lt;p&gt;Take a look at the following image:&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2023/computer-and-display.jpg&#34; width=&#34;450&#34; height=&#34;600&#34; alt=&#34;LCD Monitor with text on a messy desk with a breadboard full of wires and chips&#34;&gt;
&lt;p&gt;This shows a VGA monitor displaying text at a resolution of 40 columns x 30 rows. Each character is an 8x8 block, giving an overall screen resolution of 320x240 pixels.&lt;/p&gt;
&lt;p&gt;Now, what&amp;rsquo;s the problem?&lt;/p&gt;
&lt;p&gt;Look closely at the first column. Does it look a little off to you? It did do me, which caused me to zoom in.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2023/col-1-issue.jpg&#34; width=&#34;600&#34; height=&#34;526&#34; alt=&#34;text on a monitor, with a yellow line under the second row to show the character in the first column is lower than the rest&#34;&gt;
&lt;p&gt;The first column is one half-line lower than all the following columns.&lt;/p&gt;
&lt;p&gt;How can this be?&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s time to talk about how this is &lt;em&gt;supposed&lt;/em&gt; to work.&lt;/p&gt;
&lt;p&gt;I have an &lt;a href=&#34;https://nandland.com/lesson-1-what-is-an-fpga-what-is-an-asic/&#34;&gt;FPGA&lt;/a&gt; that is acting as a video processor (like the &lt;a href=&#34;https://en.wikipedia.org/wiki/MOS_Technology_VIC-II&#34;&gt;VIC II&lt;/a&gt; in the Commodore or the &lt;a href=&#34;https://en.wikipedia.org/wiki/ANTIC&#34;&gt;ANTIC&lt;/a&gt;/&lt;a href=&#34;https://en.wikipedia.org/wiki/CTIA_and_GTIA&#34;&gt;GTIA&lt;/a&gt; combo in the Atari). I have a character font stored in &lt;abbr title=&#34;Read-Only Memory&#34;&gt;ROM&lt;/abbr&gt;. There&amp;rsquo;s also a section of &lt;abbr title=&#34;Random-Access Memory&#34;&gt;RAM&lt;/abbr&gt; that stores the &lt;a href=&#34;https://en.wikipedia.org/wiki/ASCII&#34;&gt;ASCII&lt;/a&gt; values of the characters to display on the screen in order. The first byte in this section of RAM controls the character in the top-left corner of the screen. The last byte controls the character displayed in the bottom-right corner of the screen.&lt;/p&gt;
&lt;p&gt;In order to control a VGA monitor, the video processor sends the pixel data (either on or off in my case) for each pixel on the display starting at the top-left, one line at a time, moving left-to-right. This happens at a constant rate, with a fixed-length break at the end of each line, and a slightly longer break at the end of each screen. This process happens 60 times every second.&lt;sup id=&#34;fnr1-2023-07-02&#34;&gt;&lt;a href=&#34;#fn1-2023-07-02&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;In order to display the expected values on the screen, the video processor must do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Load the next character from RAM.&lt;/li&gt;
&lt;li&gt;Combine the value from RAM with the vertical position on the screen to look up the font data from ROM. (Remember each font is 8 lines tall, so we need to know which line of the font to draw.)&lt;/li&gt;
&lt;li&gt;Send the font data out one pixel at a time.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As you can imagine, the timing of these operations is critical. We need to load the next character from RAM and the font data from ROM while we are in the process of sending the pixel data to the monitor for the last character.&lt;/p&gt;
&lt;p&gt;Oh yeah, one other thing. VGA doesn&amp;rsquo;t technically support a screen resolution of 320x240, but it does support 640x480. So I&amp;rsquo;m drawing every pixel twice per line, and drawing every line twice.&lt;sup id=&#34;fnr2-2023-07-02&#34;&gt;&lt;a href=&#34;#fn2-2023-07-02&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;When the processor is outputting the 5th pixel for a character, it starts loading the data for the next character. This seems to work just fine for almost the entire screen, except for the first column.&lt;/p&gt;
&lt;p&gt;Remember, there&amp;rsquo;s a break at the end of every line. This means that I need to start loading the character data for the start of the next line at the end of this blank period. There&amp;rsquo;s also a longer break at the end of each screen. This means that I need to load the data for the first character of the screen at the end of this blank period.&lt;/p&gt;
&lt;p&gt;I think this is where the bug is. All the characters in the first column are one half-line (at 320x240) lower than the rest of the screen. My best guess is that I need to start the data load a little sooner during the blank period.&lt;/p&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn1-2023-07-02&#34;&gt;For a much better explanation of how VGA works, I recommend &lt;a href=&#34;https://www.youtube.com/watch?v=l7rce6IQDWs&#34;&gt;Ben Eater&#39;s excellent video&lt;/a&gt;.&lt;a href=&#34;#fnr1-2023-07-02&#34;&gt;↩︎&lt;/a&gt;&lt;/li&gt;
&lt;li id=&#34;fn2-2023-07-02&#34;&gt;I want a 320x240 screen size because my 8-bit system doesn&#39;t have enough memory to support a 640x480 size screen.&lt;a href=&#34;#fnr2-2023-07-02&#34;&gt;↩︎&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</description>
      <source:markdown>I&#39;m building an 8-bit computer. I should probably write an overview of the project, why I decided to do it, how I got started, etc, but today I have a problem to solve.

Take a look at the following image:

&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2023/computer-and-display.jpg&#34; width=&#34;450&#34; height=&#34;600&#34; alt=&#34;LCD Monitor with text on a messy desk with a breadboard full of wires and chips&#34;&gt;

This shows a VGA monitor displaying text at a resolution of 40 columns x 30 rows. Each character is an 8x8 block, giving an overall screen resolution of 320x240 pixels. 

Now, what&#39;s the problem?

Look closely at the first column. Does it look a little off to you? It did do me, which caused me to zoom in.

&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2023/col-1-issue.jpg&#34; width=&#34;600&#34; height=&#34;526&#34; alt=&#34;text on a monitor, with a yellow line under the second row to show the character in the first column is lower than the rest&#34;&gt;

The first column is one half-line lower than all the following columns.

How can this be?

It&#39;s time to talk about how this is *supposed* to work.

I have an [FPGA] that is acting as a video processor (like the [VIC II][VIC] in the Commodore or the [ANTIC]/[GTIA] combo in the Atari). I have a character font stored in &lt;abbr title=&#34;Read-Only Memory&#34;&gt;ROM&lt;/abbr&gt;. There&#39;s also a section of &lt;abbr title=&#34;Random-Access Memory&#34;&gt;RAM&lt;/abbr&gt; that stores the [ASCII] values of the characters to display on the screen in order. The first byte in this section of RAM controls the character in the top-left corner of the screen. The last byte controls the character displayed in the bottom-right corner of the screen.

In order to control a VGA monitor, the video processor sends the pixel data (either on or off in my case) for each pixel on the display starting at the top-left, one line at a time, moving left-to-right. This happens at a constant rate, with a fixed-length break at the end of each line, and a slightly longer break at the end of each screen. This process happens 60 times every second.&lt;sup id=&#34;fnr1-2023-07-02&#34;&gt;[1]&lt;/sup&gt;

In order to display the expected values on the screen, the video processor must do the following:

1. Load the next character from RAM.
2. Combine the value from RAM with the vertical position on the screen to look up the font data from ROM. (Remember each font is 8 lines tall, so we need to know which line of the font to draw.)
3. Send the font data out one pixel at a time.

As you can imagine, the timing of these operations is critical. We need to load the next character from RAM and the font data from ROM while we are in the process of sending the pixel data to the monitor for the last character.

Oh yeah, one other thing. VGA doesn&#39;t technically support a screen resolution of 320x240, but it does support 640x480. So I&#39;m drawing every pixel twice per line, and drawing every line twice.&lt;sup id=&#34;fnr2-2023-07-02&#34;&gt;[2]&lt;/sup&gt;

When the processor is outputting the 5th pixel for a character, it starts loading the data for the next character. This seems to work just fine for almost the entire screen, except for the first column.

Remember, there&#39;s a break at the end of every line. This means that I need to start loading the character data for the start of the next line at the end of this blank period. There&#39;s also a longer break at the end of each screen. This means that I need to load the data for the first character of the screen at the end of this blank period.

I think this is where the bug is. All the characters in the first column are one half-line (at 320x240) lower than the rest of the screen. My best guess is that I need to start the data load a little sooner during the blank period.


----
&lt;ol&gt;
&lt;li id=&#34;fn1-2023-07-02&#34;&gt;For a much better explanation of how VGA works, I recommend &lt;a href=&#34;https://www.youtube.com/watch?v=l7rce6IQDWs&#34;&gt;Ben Eater&#39;s excellent video&lt;/a&gt;.&lt;a href=&#34;#fnr1-2023-07-02&#34;&gt;↩︎&lt;/a&gt;&lt;/li&gt;
&lt;li id=&#34;fn2-2023-07-02&#34;&gt;I want a 320x240 screen size because my 8-bit system doesn&#39;t have enough memory to support a 640x480 size screen.&lt;a href=&#34;#fnr2-2023-07-02&#34;&gt;↩︎&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

[1]: #fn1-2023-07-02
[2]: #fn2-2023-07-02
[FPGA]: https://nandland.com/lesson-1-what-is-an-fpga-what-is-an-asic/
[VIC]: https://en.wikipedia.org/wiki/MOS_Technology_VIC-II
[ANTIC]: https://en.wikipedia.org/wiki/ANTIC
[GTIA]: https://en.wikipedia.org/wiki/CTIA_and_GTIA
[ASCII]: https://en.wikipedia.org/wiki/ASCII
</source:markdown>
    </item>
    
    <item>
      <title>Layoffs Will Continue Until Morale Decreases</title>
      <link>https://tidbits.tedchoward.com/2023/04/14/layoffs-will-continue.html</link>
      <pubDate>Fri, 14 Apr 2023 13:55:16 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2023/04/14/layoffs-will-continue.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pluralistic.net/2023/04/12/algorithmic-wage-discrimination/#fishers-of-men&#34;&gt;Cory Doctorow&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The tech worker layoffs are best understood as an all-out war on tech worker morale, because that morale is the source of tech workers&#39; confidence and thus their demands for a larger share of the value generated by their labor. The current tech layoff template is very different from previous tech layoffs: today&amp;rsquo;s layoffs are taking place over a period of months, long after they are announced, and laid off tech worker is likely to be offered a months of paid post-layoff work, rather than severance. This means that tech workplaces are now haunted by the walking dead, workers who have been laid off but need to come into the office for months, even as the threat of layoffs looms over the heads of the workers who remain. As an old friend, recently laid off from Microsoft after decades of service, wrote to me, this is &amp;ldquo;a new arrow in the quiver of bringing tech workers to heel and ensuring that we&amp;rsquo;re properly thankful for the jobs we have (had?).&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
      <source:markdown>[Cory Doctorow](https://pluralistic.net/2023/04/12/algorithmic-wage-discrimination/#fishers-of-men):
&gt;The tech worker layoffs are best understood as an all-out war on tech worker morale, because that morale is the source of tech workers&#39; confidence and thus their demands for a larger share of the value generated by their labor. The current tech layoff template is very different from previous tech layoffs: today&#39;s layoffs are taking place over a period of months, long after they are announced, and laid off tech worker is likely to be offered a months of paid post-layoff work, rather than severance. This means that tech workplaces are now haunted by the walking dead, workers who have been laid off but need to come into the office for months, even as the threat of layoffs looms over the heads of the workers who remain. As an old friend, recently laid off from Microsoft after decades of service, wrote to me, this is &#34;a new arrow in the quiver of bringing tech workers to heel and ensuring that we&#39;re properly thankful for the jobs we have (had?).&#34;
</source:markdown>
    </item>
    
    <item>
      <title>Five Dallas Council Members Call for Independent Study of I-345 Removal</title>
      <link>https://tidbits.tedchoward.com/2023/04/11/five-dallas-council.html</link>
      <pubDate>Tue, 11 Apr 2023 09:10:09 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2023/04/11/five-dallas-council.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.dmagazine.com/frontburner/2023/04/five-dallas-council-members-call-for-independent-study-of-i-345-removal/&#34;&gt;Matt Goodman&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That’s the difficulty in this debate. It’s about the city’s future, a generational chance to trade eight elevated lanes of highway for an eventual new neighborhood. The members who added their names to the memo have expressed more interest in analyzing the opportunities removal could present; after all, traffic data cannot account for changes in technology and behavior, both of which inform how frequently people drive. As Councilwoman Willis asked last year, what happens if the city’s economic development plan creates jobs in southern Dallas so residents there no longer have to drive as far to get to work?&lt;/p&gt;
&lt;/blockquote&gt;
</description>
      <source:markdown>[Matt Goodman](https://www.dmagazine.com/frontburner/2023/04/five-dallas-council-members-call-for-independent-study-of-i-345-removal/):
&gt; That’s the difficulty in this debate. It’s about the city’s future, a generational chance to trade eight elevated lanes of highway for an eventual new neighborhood. The members who added their names to the memo have expressed more interest in analyzing the opportunities removal could present; after all, traffic data cannot account for changes in technology and behavior, both of which inform how frequently people drive. As Councilwoman Willis asked last year, what happens if the city’s economic development plan creates jobs in southern Dallas so residents there no longer have to drive as far to get to work?
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2023/04/05/this-just-came.html</link>
      <pubDate>Wed, 05 Apr 2023 11:44:52 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2023/04/05/this-just-came.html</guid>
      <description>&lt;p&gt;This just came in the mail. It’s about time I started trying to understand computers! 😜 📚&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2023/7c254d8939.jpg&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</description>
      <source:markdown>This just came in the mail. It’s about time I started trying to understand computers! 😜 📚

&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2023/7c254d8939.jpg&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2023/04/01/im-finally-learning.html</link>
      <pubDate>Sat, 01 Apr 2023 17:00:56 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2023/04/01/im-finally-learning.html</guid>
      <description>&lt;p&gt;I’m finally learning how to solder. I think I’m doing pretty good.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2023/a60544a165.jpg&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2023/b1ea5ae7d4.jpg&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
</description>
      <source:markdown>I’m finally learning how to solder. I think I’m doing pretty good.

&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2023/a60544a165.jpg&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/26264/2023/b1ea5ae7d4.jpg&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2023/03/28/i-just-started.html</link>
      <pubDate>Tue, 28 Mar 2023 21:21:06 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2023/03/28/i-just-started.html</guid>
      <description>&lt;img src=&#34;https://cdn.micro.blog/books/9780226816524/cover.jpg&#34; align=&#34;left&#34; class=&#34;microblog_book&#34; style=&#34;max-width: 60px; margin-right: 20px; margin-top: 0px; padding-top: 0px;&#34;&gt;
&lt;p&gt;I just started reading: &lt;a href=&#34;https://micro.blog/books/9780226816524&#34;&gt;The Apple II Age&lt;/a&gt; by Laine Nooney. This is going to be an interesting read.📚&lt;/p&gt;
</description>
      <source:markdown>&lt;img src=&#34;https://cdn.micro.blog/books/9780226816524/cover.jpg&#34; align=&#34;left&#34; class=&#34;microblog_book&#34; style=&#34;max-width: 60px; margin-right: 20px; margin-top: 0px; padding-top: 0px;&#34;&gt;

I just started reading: [The Apple II Age](https://micro.blog/books/9780226816524) by Laine Nooney. This is going to be an interesting read.📚
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2022/12/06/i-really-enjoyed.html</link>
      <pubDate>Tue, 06 Dec 2022 12:43:09 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2022/12/06/i-really-enjoyed.html</guid>
      <description>&lt;p&gt;I really enjoyed reading &lt;a href=&#34;https://www.newyorker.com/culture/the-new-yorker-interview/cory-doctorow-wants-you-to-know-what-computers-can-and-cant-do&#34;&gt;this interview with Cory Doctorow&lt;/a&gt;.&lt;/p&gt;
</description>
      <source:markdown>I really enjoyed reading [this interview with Cory Doctorow](https://www.newyorker.com/culture/the-new-yorker-interview/cory-doctorow-wants-you-to-know-what-computers-can-and-cant-do).
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2022/12/04/have-you-ever.html</link>
      <pubDate>Sun, 04 Dec 2022 16:07:26 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2022/12/04/have-you-ever.html</guid>
      <description>&lt;p&gt;Have you ever wanted to start composting, but have been too lazy? Do you have gutters? Are you equally as lazy about cleaning your gutters? I may have some good news for you.&lt;/p&gt;
</description>
      <source:markdown>Have you ever wanted to start composting, but have been too lazy? Do you have gutters? Are you equally as lazy about cleaning your gutters? I may have some good news for you.
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2022/12/04/things-they-dont.html</link>
      <pubDate>Sun, 04 Dec 2022 15:51:07 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2022/12/04/things-they-dont.html</guid>
      <description>&lt;p&gt;Things they don’t tell you about owning a home: you will periodically need to sweep your roof.&lt;/p&gt;
</description>
      <source:markdown>Things they don’t tell you about owning a home: you will periodically need to sweep your roof.
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://tidbits.tedchoward.com/2022/11/17/in-the-early.html</link>
      <pubDate>Fri, 18 Nov 2022 00:16:44 -0500</pubDate>
      
      <guid>http://tedchoward.micro.blog/2022/11/17/in-the-early.html</guid>
      <description>&lt;p&gt;In the early days of Twitter, all people posted about was Twitter. We have now come full-circle.&lt;/p&gt;
</description>
      <source:markdown>In the early days of Twitter, all people posted about was Twitter. We have now come full-circle.
</source:markdown>
    </item>
    
  </channel>
</rss>
