<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9151880169490356401</id><updated>2026-04-18T03:13:43.724-07:00</updated><category term="Joke"/><category term="climate change"/><category term="Ethernet"/><category term="Germany"/><category term="C Programming"/><category term="bestof"/><category term="social"/><category term="embedded"/><category term="Management"/><category term="de-googlification"/><category term="CPU"/><category term="architecture"/><category term="Engineering Life"/><category term="Product Development"/><category term="mobile"/><category term="Jupyter"/><category term="websites"/><category term="Administrivia"/><category term="LLM"/><category term="Python"/><category term="dataviz"/><category term="CPE"/><category term="filesystem"/><category term="Virtual Machines"/><category term="wifi"/><category term="AppEngine"/><category term="GPL"/><category term="astrostuff"/><category term="blogroll"/><category term="control plane"/><category term="dna"/><category term="security"/><category term="ELF"/><category term="Javascript"/><category term="bitcoin"/><category term="blackmail"/><category term="vaccination"/><title type='text'>Coding Relic</title><subtitle type='html'>Random musings on software in an embedded world.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codingrelic.geekhold.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>444</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-2110837126994120935</id><published>2026-01-05T06:00:00.000-08:00</published><updated>2026-01-05T06:00:00.113-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="climate change"/><title type='text'>Twenty Eight Kilowatts</title><content type='html'>&lt;img alt=&quot;SolarEdge CCS charging cord&quot; style=&quot;display: block; padding: 0; text-align: center; clear: right; float: right;&quot; border=&quot;0&quot; width=&quot;150&quot; data-original-height=&quot;3024&quot; data-original-width=&quot;4032&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNZHox83I6HeMGxLD0mEYcL3f_8BGUscCV_ooF6HAD5Ia7vwcYKgYmM_qaT7JGpIpWt1XmaP_TusWv1pNJ0VOfYaJRIlUTGm9T3z7A5ZQXtkJrUyTKQEn2PVAXTi6ezs6hmydITBp2_nxoa5oR1WF0SSe9EAoHpxwfeOZmMfxC341EairBMtHYAQ2SV7rs/s200/solaredge-charger-cord.jpg&quot;/&gt;
&lt;p&gt;Our 2016 Kia Soul EV is able to charge at about 7 KWatts using our charger at home, a level2 EV charger built into the SolarEdge solar inverter. It has a CCS plug.&lt;/p&gt;

&lt;br clear=&quot;right&quot;/&gt;&amp;nbsp;&lt;br/&gt;

&lt;img alt=&quot;Larger CHAdeMO plug hooked to a white Kia Soul&quot; style=&quot;display: block; padding: 0; text-align: center; clear: right; float: right;&quot; border=&quot;0&quot; width=&quot;150&quot; data-original-height=&quot;3072&quot; data-original-width=&quot;4080&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTv4_IUtfO5iJau7O4wU5ylxyshL9s6TXjHQ7hD2LsmefUpvtN6EwWtHU8l6jww_xCgp1T5HzgU1pUgvxoTnXvXU1N5MNXJbB_Y7SLMgDqNHnKjbA9L-BAiZhj8-d6uo8jxMLU2OAVzNjvyUN2-wz8dxvoV8nRi2BqLQgtvckgGGwx4OXtEGnkuQTshqzC/s200/CHAdeMO.jpg&quot;/&gt;
&lt;p&gt;Today I charged the car while out and about, using the other charging port on the Kia: CHAdeMO, a DC high power charging standard. I should put &quot;high power&quot; in scare quotes as it is quite pedestrian by today&#39;s standards, it is a standard from years ago.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;CHAdeMO managed to deliver 28 KWatts to this car.&lt;/li&gt;
  &lt;li&gt;Twenty. Eight. Kilowatts.&lt;/li&gt;
  &lt;li&gt;Four times more power than the CCS charger at home.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It charged from 62% to 90% in 22 minutes, when it began to slow as the battery approached full. I unplugged it at 90% and continued on my merry way.&lt;/p&gt;

&lt;img alt=&quot;EVgo charging control screen showing 28 KWatts power delivered, 1.441 kWh energy dispensed in 3 minutes 14 seconds&quot; style=&quot;display: block; padding: 0; text-align: center; &quot; border=&quot;0&quot; height=&quot;600&quot; data-original-height=&quot;4080&quot; data-original-width=&quot;3072&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNTOHucw0bgFR_njPxupoy-6GyyKN7XC0XyufBO7Ubf5HyY4lrmLwokCqmy-Zu2JfKtqlCPJJNZzTt6f-xUWGI9723YeSuT5LHnlwFfXHWvJZC6ISYWCbixqpqSZzs3VyqZOHSFz6KNT8OstD5fwh_1q7Rav2UkT1KM4ASo-cdiTEBpUPCp1TDYDyaEuGK/s600/evgo-ramona.jpg&quot;/&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/2110837126994120935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/2110837126994120935'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2026/01/twenty-eight-kilowatts.html' title='Twenty Eight Kilowatts'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNZHox83I6HeMGxLD0mEYcL3f_8BGUscCV_ooF6HAD5Ia7vwcYKgYmM_qaT7JGpIpWt1XmaP_TusWv1pNJ0VOfYaJRIlUTGm9T3z7A5ZQXtkJrUyTKQEn2PVAXTi6ezs6hmydITBp2_nxoa5oR1WF0SSe9EAoHpxwfeOZmMfxC341EairBMtHYAQ2SV7rs/s72-c/solaredge-charger-cord.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-8572250435690422703</id><published>2025-12-09T07:00:00.000-08:00</published><updated>2025-12-09T07:00:00.113-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Germany"/><title type='text'>FBI Clearance in Citizenship Processes</title><content type='html'>&lt;p&gt;A number of citizenship processes require a certificate of good conduct that one does not have a criminal record in another country. Within the US this is generally an FBI Identify and History Summary Check (IdHSC). One can have the FBI IdHSC within a day, it is not a complex process.&lt;/p&gt;

&lt;p&gt;One starts by applying at &lt;a href=&quot;https://www.fbi.gov/how-we-can-help-you/more-fbi-services-and-information/identity-history-summary-checks/identity-history-summary-checks-faqs&quot;&gt;the FBI IdHSC page&lt;/a&gt; and you get back a file number immediately. You give the file number to the Post Office when they take your fingerprints. Not all US Post Offices have the needed equipment, check at &lt;a href=&quot;https://ips.usps.com/IdentityCapture&quot;&gt;the USPS IdentityCapture page&lt;/a&gt; to find the nearest office which does. The post office charges $50 to take the fingerprints, but submits them digitally and you get the result in an email from the FBI within hours.&lt;/p&gt;

&lt;p&gt;We printed the PDF file we received from the FBI to mail to the Bundesverwaltungsamt (BVA) in Germany. It does not need Apostille.&lt;/p&gt;

&lt;p&gt;In terms of timelines: we got a request for the FBI clearances when the caseworker began looking at our file. The letter with our FBI papers arrived in Köln Oct 10, 2023, the BVA accepted the declaration November 15, 2023. The Consulate informed us that they had the Urkunde ready for pickup Nov 29, 2023.&lt;/p&gt;

&lt;br/&gt;

&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;img alt=&quot;US Department of Justice, Federal Bureau of Investigation, Criminal Justice Information Services Division, Clarksburg, WV 26306&quot; style=&quot;display: block; padding: 0; text-align: center; &quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;328&quot; data-original-width=&quot;1604&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguuYS0xFh5drMO50p79qsL1XRN9xASOKNBw9s5nfVGH6i4PJcDPmlq2aOHpdKGi2qBsrvMv6y44Ty9KbzUXJ0K2H6ZVZnVovgKXKtziJiXVPElUDqndbf6GbWsCM2PKwD-5ylzfRrGqihX_0khyphenhyphen10aw2qdUFB47pant0pkaMylHuq9-av0XbL4krznDjC6/s600/FBI-IdHSC.jpg&quot;/&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/8572250435690422703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/8572250435690422703'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/12/fbi-clearance-in-citizenship-processes.html' title='FBI Clearance in Citizenship Processes'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguuYS0xFh5drMO50p79qsL1XRN9xASOKNBw9s5nfVGH6i4PJcDPmlq2aOHpdKGi2qBsrvMv6y44Ty9KbzUXJ0K2H6ZVZnVovgKXKtziJiXVPElUDqndbf6GbWsCM2PKwD-5ylzfRrGqihX_0khyphenhyphen10aw2qdUFB47pant0pkaMylHuq9-av0XbL4krznDjC6/s72-c/FBI-IdHSC.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-7944652334757891299</id><published>2025-12-05T07:00:00.000-08:00</published><updated>2025-12-05T07:00:00.121-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Germany"/><title type='text'>German Mother Pathways to Citizenship</title><content type='html'>&lt;blockquote&gt;&lt;i style=&quot;font-size: large;&quot;&gt;My mother was German, am I a German citizen?&lt;/i&gt;&lt;/blockquote&gt;

&lt;br/&gt;&lt;hr width=&quot;60%&quot;/&gt;&lt;br/&gt;

&lt;img alt=&quot;a German flag&quot; style=&quot;display: block; padding: 1em 0; text-align: center; clear: right; float: right;&quot; border=&quot;0&quot; width=&quot;150&quot; data-original-height=&quot;80&quot; data-original-width=&quot;250&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoYY9U5tMf-FMVl9C9GFaKRPuAwAz1YtB3JHfXdaduvgLirau6RATZZxBho4bcK76Zj1zl2qLJpv9KxgoWTpViRs7MxQy7NKT5KS37PuZKCuHRRIyL8R7NzQhAmyOQjDiyViRGhghjFy3PpXxcfaUWSkiUfVfyy4m3NK8X1tmUEooJ2D6xkb3gSzwwADjG/s200/german-flag.png&quot;/&gt;
&lt;br/&gt;&lt;p&gt;That depends on when you were born a whether your parents were married. It notably does not depend on &lt;i&gt;where&lt;/i&gt; you were born, whether in Germany or not.&lt;/p&gt;

&lt;br clear=&quot;both&quot;/&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;b&gt;If your parents were not married and never married:&lt;/b&gt; German mothers have always passed on German citizenship to children born out of wedlock.&lt;br/&gt;&amp;nbsp;&lt;br/&gt;
    
This question commonly comes up in the context of a German mother who moved to the US, it matters how old you were and whether you were a minor when she did so. In the US naturalization process, minors naturalize automatically without anyone making the conscious choice that they should naturalize. This means that though the parent forfeits their German citizenship, the minor child does not. If this is your situation you likely remain a German citizen to this day.&lt;/li&gt;
  
  &lt;br/&gt;

  &lt;li&gt;&lt;b&gt;If your parents were married at the time of your birth:&lt;/b&gt; German mothers did not pass on German citizenship to children born in wedlock before 1/1/1975, but German fathers did. If your parents were married at the time of your birth, then you were not born a German citizen. However the modern state of Germany has decided that this gender discriminatory policy was unconstitutional, and defined a declaration process called Staatsangehörigkeitsgesetz § 5 (StAG5) by which descendants of such persons can declare their German citizenship, which you would be eligible for.&lt;/li&gt;

  &lt;br/&gt;

  &lt;li&gt;&lt;b&gt;If your parents were not married at the time of your birth but later married:&lt;/b&gt; you were born a German citizen, but that citizenship was revoked upon their marriage as your birth was legitimized and treated as though they had been married. HOWEVER, a 2006 court case in Germany reversed this revocation upon legitimization for children born after 1953 when a relevant law went into effect. Retroactively, such children are considered to have been German citizens for their entire lives.&lt;/li&gt;
&lt;/ol&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/7944652334757891299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/7944652334757891299'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/12/german-mother-pathways-to-citizenship.html' title='German Mother Pathways to Citizenship'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoYY9U5tMf-FMVl9C9GFaKRPuAwAz1YtB3JHfXdaduvgLirau6RATZZxBho4bcK76Zj1zl2qLJpv9KxgoWTpViRs7MxQy7NKT5KS37PuZKCuHRRIyL8R7NzQhAmyOQjDiyViRGhghjFy3PpXxcfaUWSkiUfVfyy4m3NK8X1tmUEooJ2D6xkb3gSzwwADjG/s72-c/german-flag.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-5542410079851711520</id><published>2025-12-02T16:45:00.000-08:00</published><updated>2025-12-02T16:59:06.756-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Engineering Life"/><title type='text'>Probers for SSL Certificate Validity</title><content type='html'>&lt;p&gt;On services I run, I make sure that we have a prober to check how long the site&#39;s certificate has remaining to allow AlertManager rules to be written if it is getting close.&lt;/p&gt;

&lt;p&gt;Hey LabCorp hit me up, we should talk.&lt;/p&gt;

&lt;img alt=&quot;Chrome browser certificate viewer for patientws.labcorp.com showing that the certificate was valid from November 5, 2024 at 4:00:00 PM until Tuesday, December 2, 2025 at 3:59:59 PM, which at the time this screenshot was taken was about 45 minutes in the past.&quot; border=&quot;0&quot; height=&quot;600&quot; style=&quot;display: block; border: 1px solid #555;
 padding: 0; text-align: center;&quot; data-original-height=&quot;1142&quot; data-original-width=&quot;1096&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-qUUecineBNDYde17CpEo6I-Eh7TE-XlsyUj5iTZfxfdL24S7CYX0OKrKdW5tS1VkyZz05uhNrhUpxZbibuZVsBZf3ZbjNZbPZGs-UDedEgm82Y0iFhCQgNdNl_H8tHNWS-07_7FiiPAygBKjqH6y7m8C2R_c5VFx8e6Cj0z7GLitSbR46d2v6Ruk6ETZ/s600/labcorp.png&quot;/&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/5542410079851711520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/5542410079851711520'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/12/probers-for-ssl-certificate-validity.html' title='Probers for SSL Certificate Validity'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-qUUecineBNDYde17CpEo6I-Eh7TE-XlsyUj5iTZfxfdL24S7CYX0OKrKdW5tS1VkyZz05uhNrhUpxZbibuZVsBZf3ZbjNZbPZGs-UDedEgm82Y0iFhCQgNdNl_H8tHNWS-07_7FiiPAygBKjqH6y7m8C2R_c5VFx8e6Cj0z7GLitSbR46d2v6Ruk6ETZ/s72-c/labcorp.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-3323848996776115659</id><published>2025-11-14T13:00:00.000-08:00</published><updated>2025-11-15T09:31:46.420-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="de-googlification"/><title type='text'>LG ThinQ App Notification Advertisement</title><content type='html'>&lt;p&gt;I let our LG Washer-Dryer connect to Wi-Fi, but blocked its access to the Internet. I don&#39;t want it communicating with whatever cloud service they run, I just hoped there would be a local web page to scrape or some other port open so I could build a &amp;quot;Send a Signal message when the dryer finishes&amp;quot; service.&lt;/p&gt;

&lt;p&gt;Alas, no, it only makes outgoing connections to its cloud service. I&#39;m not ready to commit the time to trick it into communicating with something I develop.&lt;/p&gt;

&lt;img alt=&quot;Android screenshot with a notification from the LG Thin-Q app reading: Black Friday prices guaranteed, TV + soundbar or xboom speaker bundle. Exclusive to ...&quot; style=&quot;display: block; padding: 0 0 1em 1em; text-align: center; clear: right; float: right;&quot; border=&quot;0&quot; width=&quot;252&quot; data-original-height=&quot;308&quot; data-original-width=&quot;504&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWxZwmjrkgnVgAvKdCdMpHluE0egGarkpC1H6nHXpnJhtJfe9T0JhGSAd8rLPw4pSlNz17SZ3QCxxqRTwvpNDmKrF4J2JT6_BwM1CUfhKLivbt4WHrGjAFpjYorsY2t06SzJDhAkHQ-jsx7ZpocTtHwE_0q-3Bx7FSVGBk8np1Lz4G0PIsZtbGT8LwkowH/s400/lg-thinq-notification-advertisement.jpg&quot;/&gt;

&lt;p&gt;Installing the app was required to get the unit to connect to Wi-fi. I had blocked the app&#39;s Location permission so they can&#39;t sell my data to an aggregator, denied the Microphone permission, and took away Camera and Nearby Devices after it scanned the barcode on the washer/dryer.&lt;/p&gt;

&lt;p&gt;Now this. It sends advertisements in an Android notification.&lt;/p&gt;

&lt;p&gt;I do appreciate &lt;i&gt;some&lt;/i&gt; Internet of Things devices. I like being able to graph production data from the rooftop solar panels over time, and the status of the home&#39;s battery, for example. But so much of IoT is just in service to enshittification. It is maddening.&lt;/p&gt;

&lt;br clear=&quot;right&quot;/&gt;&lt;hr width=&quot;60%&quot;/&gt;&lt;br/&gt;

&lt;p&gt;LG, if you&#39;re listening: I&#39;m sure you track the number of people who click on that notification, maybe with some attempt to estimate conversions and attribute revenue. You need to also track the loss of goodwill.&lt;/p&gt;

&lt;p&gt;I rage-uninstalled the app right after taking this screenshot, you need to correlate app store install metrics with when your ad campaigns run. That should feed in somehow to a loss of future revenue estimate, by souring attitudes amongst your installed base.&lt;/p&gt;

&lt;p&gt;Lighting goodwill on fire to generate heat can result in revenue, but not without a cost.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/3323848996776115659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/3323848996776115659'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/11/lg-thinq-app-notification-advertisement.html' title='LG ThinQ App Notification Advertisement'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWxZwmjrkgnVgAvKdCdMpHluE0egGarkpC1H6nHXpnJhtJfe9T0JhGSAd8rLPw4pSlNz17SZ3QCxxqRTwvpNDmKrF4J2JT6_BwM1CUfhKLivbt4WHrGjAFpjYorsY2t06SzJDhAkHQ-jsx7ZpocTtHwE_0q-3Bx7FSVGBk8np1Lz4G0PIsZtbGT8LwkowH/s72-c/lg-thinq-notification-advertisement.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-1060493434422576610</id><published>2025-11-10T04:26:00.000-08:00</published><updated>2025-11-10T04:26:19.699-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Germany"/><title type='text'>Hannover Stadtarchiv geöffnet</title><content type='html'>&lt;p&gt;The Personenstandsgesetz (PStG) specifies the privacy protection periods for civil records in Germany, after which the records move to an archive where they become publicly available for anyone to access.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;110 years after a birth&lt;/li&gt;
  &lt;li&gt;80 years after a marriage&lt;/li&gt;
  &lt;li&gt;30 years after a death&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Hannover Stadtarchiv closed in March of 2025 to move to a new building. The archive had gradually fallen behind: where requests in 2023 took about a week to receive a response, requests in 2024 routinely took several months.&lt;/p&gt;

&lt;p&gt;I sent a request on the day the archive re-opened on November 3, and received a response today on November 10. The queue may grow as the archive resumes its normal operation, but the initial impression is much improved responsiveness.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/1060493434422576610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/1060493434422576610'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/11/hannover-stadtarchiv-geoffnet.html' title='Hannover Stadtarchiv geöffnet'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-7513836621310487352</id><published>2025-11-09T07:00:00.000-08:00</published><updated>2025-11-10T03:49:47.686-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="de-googlification"/><title type='text'>Android Airtag Detection</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; float: right;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUI7vwhxS_0FnT5i0n5Yns8D-RtFIBCbAhbhFzF2m01DhIBa9hX64nFoWD3ZojZQlNRcMpjt_iu_dao3BQX_VBu-dK2WXoJDa3u6SnBZki4uMdmnkFgc8Vm-wJlM9ZuFnyQLbQ7IVl9jw1aA2j_g-2DgDy4nyHuCNIGfl4fSOsqn81iX3eJjOSh0_tqT1i/s1117/android-airtag.jpg&quot; style=&quot;display: block; padding: 0;&quot;&gt;&lt;img alt=&quot;Android notification screen reads: Tracker Traveling With You. Unknown Apple Airtag detected. The owner of this tracker can see its location.&quot; border=&quot;0&quot; height=&quot;300&quot; data-original-height=&quot;1117&quot; data-original-width=&quot;1008&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUI7vwhxS_0FnT5i0n5Yns8D-RtFIBCbAhbhFzF2m01DhIBa9hX64nFoWD3ZojZQlNRcMpjt_iu_dao3BQX_VBu-dK2WXoJDa3u6SnBZki4uMdmnkFgc8Vm-wJlM9ZuFnyQLbQ7IVl9jw1aA2j_g-2DgDy4nyHuCNIGfl4fSOsqn81iX3eJjOSh0_tqT1i/s300/android-airtag.jpg&quot;/&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;I really do appreciate that recent Android releases notice and notify a user when an &lt;a href=&quot;https://www.apple.com/airtag/&quot;&gt;Airtag is accompanying them&lt;/a&gt;. Stalking via surreptitious Airtag is a real thing which happens.&lt;/p&gt;

&lt;p&gt;One might think that the specific phrasing of &amp;quot;unknown Apple Airtag&amp;quot; implies the existence of a &lt;i&gt;known&lt;/i&gt; Apple Airtag, but if such functionality exists I have not found it. I would really love to have a &amp;quot;it&#39;s ok, that one is mine&amp;quot; function to suppress repeated notifications about the Airtag in my luggage.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/7513836621310487352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/7513836621310487352'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/11/android-airtag-detection.html' title='Android Airtag Detection'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUI7vwhxS_0FnT5i0n5Yns8D-RtFIBCbAhbhFzF2m01DhIBa9hX64nFoWD3ZojZQlNRcMpjt_iu_dao3BQX_VBu-dK2WXoJDa3u6SnBZki4uMdmnkFgc8Vm-wJlM9ZuFnyQLbQ7IVl9jw1aA2j_g-2DgDy4nyHuCNIGfl4fSOsqn81iX3eJjOSh0_tqT1i/s72-c/android-airtag.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-3828340415959422067</id><published>2025-10-26T07:00:00.000-07:00</published><updated>2025-10-26T07:38:17.732-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Germany"/><title type='text'>This is a Good Week to Look Into German Citizenship</title><content type='html'>&lt;figure style=&quot;display: block; padding: 0; text-align: center; float: right;&quot;&gt;
  &lt;img alt=&quot;Ornate, gilded clock atop a set of drawers&quot; border=&quot;0&quot; height=&quot;150&quot; data-original-height=&quot;1360&quot; data-original-width=&quot;1024&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6XyULmbtvUPvAKggmqw_eBHZ_nborU3wcEqea8jbyaauMWodqhkqH_tLJIHZ-rkOaGelm437ThbldeF5DiiwyLgOy6iOx8ej38wD1ToEjBwp1NwfPziyBe1hdLDYBEy_iE5gPJzlmaZ7fUI1oZA3Zuflv01jquCzoY5rQFwx4i1sok8dYHLNGHmqX4Oee/s200/sansucci-clock.jpg&quot;/&gt;
  &lt;figcaption&gt;&lt;i&gt;Clock at Sansucci in Potsdam&lt;/i&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This coming week is special. You might know it as &amp;quot;intercontinental meeting scheduling goes sideways&amp;quot; week. Most of Europe adjusted their clocks for daylight savings this morning, the US does so in a week.&lt;/p&gt;

&lt;p&gt;German Consulates around the world add new appointments at midnight &lt;b&gt;in Germany.&lt;/b&gt; Polling for an appointment right before midnight has the best chance of grabbing one, and this week midnight in Germany is at a different time in the US. Lots of people miss this, your chances of getting an appointment are better this week by checking at the correct time.&lt;/p&gt;

&lt;p&gt;If your family emigrated from Germany in the 20th century, you might have a path to German citizenship. Grandparents, great-grandparents, etc are all possible. 1904 is the significant cutoff, emigration before that almost always forfeited German citizenship.&lt;/p&gt;

&lt;p&gt;Your ancestor might have been told they had to choose one citizenship or another at age 18 or 21 or 23. That is a longstanding myth, people born as dual citizens were always able to retain both and pass it down to their children.&lt;/p&gt;

&lt;p&gt;Your ancestor might not have inherited citizenship from a German mother prior to 1975. Staatsangehörigkeit § 5 is a declaration process to address this former gender discriminatory policy, allowing descendants of German mothers to declare their citizenship.&lt;/p&gt;

&lt;p&gt;If you&#39;ve idly wondered whether there is a path to Europe for your family, this week is a good week to look into it.&lt;/p&gt;

&lt;p&gt;Everything I&#39;ve written about this process and related matters is linked from &lt;a href=&quot;https://codingrelic.geekhold.com/2025/08/survey-of-my-germany-related-blog-posts.html&quot;&gt;this blog post.&lt;/a&gt;&lt;/p&gt;

&lt;img alt=&quot;Hannover Rathaus, the local government building in Hannover Germany, is a gothic architecture building with aged green copper roofing&quot; style=&quot;display: block; padding: 0; text-align: center; &quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1274&quot; data-original-width=&quot;2040&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJLWxwVuHvVI1438MedlHJCiUMAEHsxX74tqGhHTCh7NL4TO4vj7WK0cFYi7ErGo-4TrNPdx_LTWHFC-bBiJsO6YWfsvkx5_0ZKSSQdkvzhD1mv8RoMSXdv5O5-PsL8xC6QU8q_p0X03qv1AkfQYaUU5ibYLTdtmr4nfACmSnnKT-HQ79Go5Z2hWgbiq_j/s600/hannover-rathaus.jpg&quot;/&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/3828340415959422067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/3828340415959422067'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/10/good-week-for-german-citizenship.html' title='This is a Good Week to Look Into German Citizenship'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6XyULmbtvUPvAKggmqw_eBHZ_nborU3wcEqea8jbyaauMWodqhkqH_tLJIHZ-rkOaGelm437ThbldeF5DiiwyLgOy6iOx8ej38wD1ToEjBwp1NwfPziyBe1hdLDYBEy_iE5gPJzlmaZ7fUI1oZA3Zuflv01jquCzoY5rQFwx4i1sok8dYHLNGHmqX4Oee/s72-c/sansucci-clock.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-28486933011939300</id><published>2025-10-25T22:00:00.000-07:00</published><updated>2025-10-25T22:23:47.887-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Germany"/><title type='text'>Daylight Savings and Consular appointments</title><content type='html'>&lt;p&gt;German Consulates around the world &lt;a href=&quot;https://codingrelic.geekhold.com/2025/09/konsulatstermine-fur-reisepasse.html&quot;&gt;add new appointments every weekday at midnight in Germany&lt;/a&gt;. For example, that is 3pm in California &amp;mdash; or rather, it &lt;i&gt;was&lt;/i&gt; at 3pm in California. Europe moves the clocks by an hour for Daylight Savings Time on October 26th, which happened a few hours ago at the time of this writing.&lt;/p&gt;

&lt;p&gt;The US moves its clocks one week from now, on November 2. So for this one week, midnight in Germany is &lt;b&gt;4pm&lt;/b&gt; in California. This might be a good week for finding an appointment, slightly fewer people will likely be polling as some will be checking at the wrong time.&lt;/p&gt;

&lt;figure style=&quot;display: block; padding: 0; text-align: center; &quot;&gt;
  &lt;img alt=&quot;Ornate, gilded clock on a set of drawers&quot; border=&quot;0&quot; height=&quot;600&quot; data-original-height=&quot;1360&quot; data-original-width=&quot;1024&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6XyULmbtvUPvAKggmqw_eBHZ_nborU3wcEqea8jbyaauMWodqhkqH_tLJIHZ-rkOaGelm437ThbldeF5DiiwyLgOy6iOx8ej38wD1ToEjBwp1NwfPziyBe1hdLDYBEy_iE5gPJzlmaZ7fUI1oZA3Zuflv01jquCzoY5rQFwx4i1sok8dYHLNGHmqX4Oee/s600/sansucci-clock.jpg&quot;/&gt;
  &lt;figcaption&gt;&lt;i&gt;Clock at Sansucci in Potsdam&lt;/i&gt;&lt;/figcaption&gt;
&lt;/figure&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/28486933011939300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/28486933011939300'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/10/daylight-savings-and-consular.html' title='Daylight Savings and Consular appointments'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6XyULmbtvUPvAKggmqw_eBHZ_nborU3wcEqea8jbyaauMWodqhkqH_tLJIHZ-rkOaGelm437ThbldeF5DiiwyLgOy6iOx8ej38wD1ToEjBwp1NwfPziyBe1hdLDYBEy_iE5gPJzlmaZ7fUI1oZA3Zuflv01jquCzoY5rQFwx4i1sok8dYHLNGHmqX4Oee/s72-c/sansucci-clock.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-1395115036771365361</id><published>2025-10-23T05:00:00.000-07:00</published><updated>2025-10-23T05:00:00.111-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="climate change"/><title type='text'>Electric short-haul vehicles</title><content type='html'>&lt;img alt=&quot;An electric forklift parked near a wall and plugged into a charger.&quot; style=&quot;display: block; padding: 0; padding-left: 1em; text-align: center; clear: right; float: right;&quot; border=&quot;0&quot; width=&quot;200&quot; data-original-height=&quot;505&quot; data-original-width=&quot;549&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQvUHF5h6esYB8vZts7K0FwsTdUooXqtoc6-6UWYhDEjMf9rmmPpJBFGolxmVytWBIJPz9DT33h7bRBRDFDtdsshDcA7KJWoFeLQ3OVrRHjVyG0r1ZGJ-0sbOrbTqeM4aCkGnA3f7sUFAcliXTH6r0D_gcLqIXddtPjyvtL1NN3LyT6v8jj6wAubFLUOeK/s200/forklift-charging.jpg&quot;/&gt;
&lt;p&gt;The market for forklifts and similar lift trucks electrified early. The market for Class I lift trucks intended mainly for use inside warehouses crossed 50% electric in approximately 2010. In indoor environments there is a substantial advantage for a vehicle which produces no exhaust fumes. The early models used lead-acid batteries, gradually shifting to Lithium chemistries as batteries aimed at electric vehicles improved.&lt;/p&gt;

&lt;p&gt;More recently, other classes of forklift which handle heavier loads and outdoor use have been electrifying, as batteries have reached a capacity to operate all day without charging and electricity is less expensive than the equivalent propane for internal combustion forklifts.&lt;/p&gt;

&lt;p&gt;Electric lift trucks have several inherent advantages over propane:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Efficiency:&lt;/b&gt; electric vehicles excel with frequent starts and stops, which a forklift spends all day doing.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Regenerative lowering:&lt;/b&gt; it takes energy to lift a heavy load, but regenerative braking techniques can recover energy while lowering a heavy load. Anything lifted up will (eventually) be lowered back down, over time the fleet of forklifts will recover a good portion of the energy spent lifting.&lt;/li&gt;
&lt;/ul&gt;

&lt;br/&gt;

&lt;h3&gt;Short haul trucking&lt;/h3&gt;
&lt;p&gt;Drayage trucks, heavy vehicles intended for short distance duty such as to and from transport hubs, are at the start of their electrification process now. They also have several inherent advantages:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Idling:&lt;/b&gt; even with a decade of effort in schedule optimization and just-in-time arrival, such vehicles spend a substantial amount of time waiting for loading and unloading. Internal combustion vehicles consume fuel while idling, electric trucks do not.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Emissions:&lt;/b&gt; air quality near ports and transportation hubs has been a concern for decades, and have resulted in ever more strict limits on emissions in the vicinity of the port. A zero emission electric drayage vehicle more easily meets these requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;br/&gt;

&lt;h3&gt;Vehicle to Grid?&lt;/h3&gt;
&lt;p&gt;To me, one of the interesting potential developments for electric vehicles is to take advantage of the battery capacity available in fleets of electric vehicles with one common owner and fairly stable usage patterns. Warehouses and ports mostly do not operate at 100% capacity 24/7. Noise ordinances and the economics of three shift work means they will often not be fully staffed overnight. There will be hours where some of the equipment is plugged into chargers and mostly sitting idle.&lt;/p&gt;

&lt;p&gt;These are the same hours where solar production is not available. Might the fleet owner be able to make some amount of revenue while the equipment sits idle? The equipment does need to end the night with a mostly full battery for the first shift&#39;s work, but there may be an opportunity to charge while power is cheap and, knowing usage patterns in advance, participate in virtual power plants to bid into the day-ahead market.&lt;/p&gt;

&lt;p&gt;School buses remain the best example of Fleet-V2G potential. They can charge after dropping off children after school, at a time when solar power is still generally feeding the grid. They will sit all night, and can supply some amount of power in the late evening hours.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/1395115036771365361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/1395115036771365361'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/10/electric-short-haul-vehicles.html' title='Electric short-haul vehicles'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQvUHF5h6esYB8vZts7K0FwsTdUooXqtoc6-6UWYhDEjMf9rmmPpJBFGolxmVytWBIJPz9DT33h7bRBRDFDtdsshDcA7KJWoFeLQ3OVrRHjVyG0r1ZGJ-0sbOrbTqeM4aCkGnA3f7sUFAcliXTH6r0D_gcLqIXddtPjyvtL1NN3LyT6v8jj6wAubFLUOeK/s72-c/forklift-charging.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-1321442455141884062</id><published>2025-10-14T12:00:00.000-07:00</published><updated>2025-10-14T12:24:27.493-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="climate change"/><title type='text'>Virtual Power Plants and the California Grid</title><content type='html'>&lt;p&gt;The California Independent System Operator (CAISO) has &lt;a href=&quot;https://www.caiso.com/content/summer-loads-resources-assessment/2025/index.html&quot;&gt;published a report regarding electricity generation in the summer of 2025,&lt;/a&gt; which includes data through the end of September 2025. They provide a nifty interactive chart at that link, and the underlying data is easy to find in the source of the web page. I&#39;ve included the data for July and September at the bottom of this post, as we&#39;re going to dive into those details in a moment.&lt;/p&gt;

&lt;p&gt;Below is the graph of the sources of energy on the California electrical grid in September of 2025, the period ending about two weeks ago at the time of this writing. Importantly, the Solar resources shown are only utility connected solar arrays. Rooftop solar is behind the meter, reducing demand for electricity rather than adding to the supply measured here. There is approximately another 19 Gigawatts of solar capacity installed behind the meter.&lt;/p&gt;

&lt;img alt=&quot;Graph of energy sources in California in September 2025 with Methane providing 25 Gigawatts, Hydro 7 Gigawatts, Nuclear 3 Gigawatts, with Solar peaking to 12 Gigawatts in the middle of the day and Battery sustaining Solar contribution for a few more hours after the Sun sets&quot; style=&quot;display: block; padding: 0; text-align: center;&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;371&quot; data-original-width=&quot;600&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnMWZqruPAAPW7KSDqq06oQjktSrSngnQIbiCCeEQAO-a0cVSWH7PBy4QT4B2R6Dza5VJ5WzM7VwUcgxNHgVF5wVk3IdvEh0lKD7SV6-bH7ysL_TF0G4qQMfiTDWX6aLpbeQs_CNrnWcyAQpXUO2snTU0WBksU_s6Vr6_q6iLwrVi6lauv-eNDbja_Xha2/s600/CAISO-energy-sources-by-hour-mwatts-9-2025.jpg&quot;/&gt;

&lt;br/&gt;&lt;hr width=&quot;50%&quot;&gt;&lt;br/&gt;

&lt;p&gt;This is the same data, shown as a percentage of the total. Because total electricity consumption varies throughout the day, the contribution of baseload sources like Methane-fired generators varies as a percentage of the total even though their output is constant.&lt;/p&gt;

&lt;img alt=&quot;Graph of energy sources in California in September 2025 with Methane providing roughly 50%, Hydro 13%, Nuclear 5%, with Solar peaking to 20% in the middle of the day and Battery sustaining Solar contribution for a few more hours after the Sun sets&quot; style=&quot;display: block; padding: 0; text-align: center;&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;371&quot; data-original-width=&quot;600&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYCFHu3zNuCnelJK2h1-KK01g6ZRX258z4TjOiRZFR6WOAKvFzY4ZYPNc_kKV8YTWIlIR82epUJXlUfU-GBj77Tfssq6NUl1Yuhrw5_M5PVtzBIgeIJ741L_WmfadNtnEjt5IV-xb8lO2PmNARJpwP0Tl9A-6PQDGSdR8CaAs-DSCW2F_RtQH66IK0s3w3/s600/CAISO-energy-sources-by-hour-percent-9-2025.jpg&quot;/&gt;

&lt;p&gt;A few observations:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;The contribution of wind power is smaller than I expected. I may get a skewed view of the prevalence of wind generation in California as I pass through the &lt;a href=&quot;https://en.wikipedia.org/wiki/Altamont_Pass_wind_farm&quot;&gt;Altamont Pass wind farm&lt;/a&gt; regularly, but I expected wind to be a larger percentage.&lt;/li&gt;
  &lt;li&gt;It is too small to be visible in the graph, but Solar power never actually drops to zero. It continues to supply about 4 Megawatts all night. I believe this might be &lt;a href=&quot;https://en.wikipedia.org/wiki/Ivanpah_Solar_Power_Facility&quot;&gt;Ivanpah, a solar thermal generation plant in the desert&lt;/a&gt;, which continues generating power from stored heat even after the sun has set.&lt;/li&gt;
&lt;/ul&gt;

&lt;br/&gt;&lt;hr width=&quot;50%&quot;&gt;&lt;br/&gt;

&lt;p&gt;I tried to incorporate behind-the-meter solar into a similar graph, below. This is a crude estimate:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;In 2024, 19 Gigawatts of rooftop solar was installed versus 21 GWatts of utility-scale. I made the assumption that the production from rooftop solar would be approximately 19/21 of the utility number.&lt;/li&gt;
  &lt;li&gt;Prior studies show that rooftop solar is not installed in ideal locations nor properly angled toward the sun, I made the additional assumption that it would be 80% as productive as utility solar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result hews considerably closer to the &lt;a href=&quot;https://www.gov.ca.gov/2025/07/14/in-historic-first-california-powered-by-two-thirds-clean-energy-becoming-largest-economy-in-the-world-to-achieve-milestone/&quot;&gt;67% renewable result announced by the state last year&lt;/a&gt;.&lt;/p&gt;

&lt;img alt=&quot;Graph of energy sources in California in September 2025 with Methane providing roughly 40%, Hydro 10%, Nuclear 4%, with the combination of utility-scale and rooftop Solar peaking to 32% in the middle of the day and Battery sustaining Solar contribution for a few more hours after the Sun sets&quot; style=&quot;display: block; padding: 0; text-align: center; &quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;371&quot; data-original-width=&quot;600&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxGwqpmJFOZxADgZ1iwUPT7FEnIOPDq6-djwGGKn3z9UHNpwqSDJ3-IHGDvbj_tH3GEusvdvCT_ra9PjgWd7CEmRuviREWsYSsuz7XiCgT8LNH7cYZzjryiAGZaGLfQLxvg7aJDzQyvE9oql3irGRRO0rVWAthGuadPAiYjQCPEm4qqubZ-rB2CEDPM2HT/s600/extrapolated-energy-sources-by-hour-9-2025.jpg&quot;/&gt;

&lt;br/&gt;&lt;hr width=&quot;50%&quot;&gt;&lt;br/&gt;

&lt;h3&gt;Virtual Power Plants&lt;/h3&gt;
&lt;p&gt;I have combined the categories which CAISO reported separately as Batteries and Demand Response, because &lt;a href=&quot;https://www.tesla.com/support/energy/virtual-power-plant/sce#:~:text=As%20of%20April%2C%202024%2C%20Tesla,%2C%20eligibility%2C%20compensation%20and%20more.Demand Side Grid Support (DSGS)&quot;&gt;until 4/2024 Virtual Power Plants formed via aggregation of residential batteries like Powerwalls&lt;/a&gt; were contracted as Demand Response. Only utility-scale battery installations like Megapacks were accounted for as Batteries. Splitting into two categories obscures and substantially minimizes the true contribution of battery power to the grid.&lt;/p&gt;

&lt;p&gt;We participate in a Virtual Power Plant in northern California, allocating about half of the 27 KWh of capacity installed at the house. For a number of days this summer in the late afternoon and early evening, the house supplied about 6 kilowatts of power back to the grid. It is quite smooth, we don&#39;t even notice unless we look at the app to see what it is doing.&lt;/p&gt;

&lt;br/&gt;&lt;hr width=&quot;50%&quot;&gt;&lt;br/&gt;

&lt;p&gt;Raw data from &lt;a href=&quot;https://www.caiso.com/content/summer-loads-resources-assessment/2025/index.html&quot;&gt;the CAISO report web page&lt;/a&gt;.&lt;/p&gt;

&lt;pre style=&quot;font-family: monospace; font-size: x-small; line-height: 1.3em; margin-left: 1em; margin-bottom: 1em; padding: 1em; background-color: WhiteSmoke;&quot;&gt;&quot;September&quot;: [
  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1392.000662, 1319.840318,            &lt;b&gt;// Demand Response&lt;/b&gt;
   1239.827827, 1177.653666, 1023.942241, 287.33, 0, 0],                                &lt;b&gt;// Demand Response&lt;/b&gt;

  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2264.012689, 6312.981683,            &lt;b&gt;// Battery Storage&lt;/b&gt;
   10219.53932, 9740.80126, 7382.450552, 5789.963039, 2869.891625, 0],                  &lt;b&gt;// Battery Storage&lt;/b&gt;

  [11665, 11665, 11665, 11665, 11665, 11665, 11665, 11665, 11665, 11665, 11665,         &lt;b&gt;// Imports&lt;/b&gt;
   11665, 11665, 11665, 11665, 11665, 5500, 5500, 5500, 5500, 5500, 5500, 5500,         &lt;b&gt;// Imports&lt;/b&gt;
   11665],                                                                              &lt;b&gt;// Imports&lt;/b&gt;

  [742.4458, 725.114696, 719.58188, 591.859728, 356.992952, 328.293048, 330.9584,       &lt;b&gt;// Wind&lt;/b&gt;
   323.6145657, 277.992424, 205.762648, 221.590544, 199.863504, 216.38616,              &lt;b&gt;// Wind&lt;/b&gt;
   311.644072, 316.5584821, 324.313968, 396.1921449, 535.622064, 785.470392,            &lt;b&gt;// Wind&lt;/b&gt;
   905.120696, 1081.627632, 1164.064064, 1096.58392, 1058.725816],                      &lt;b&gt;// Wind&lt;/b&gt;

  [3.7224, 3.7224, 3.95928, 4.43304, 5.02524, 7.1064, 155.30868, 3417.63696,            &lt;b&gt;// Solar&lt;/b&gt;
   8622.78732, 11304.55656, 12390.19452, 12923.98668, 13035.8448, 12592.86717,          &lt;b&gt;// Solar&lt;/b&gt;
   12166.76592, 11529.86232, 8779.161639, 5405.92308, 1148.5296, 12.79152,              &lt;b&gt;// Solar&lt;/b&gt;
   5.34672, 4.01004, 3.8916, 3.84084],                                                  &lt;b&gt;// Solar&lt;/b&gt;

  [1755.632861, 1755.632861, 1755.632861, 1755.632861, 1755.632861, 1755.632861,        &lt;b&gt;// Other renewables&lt;/b&gt;
   1755.632861, 1755.632861, 1755.632861, 1755.632861, 1755.632861, 1755.632861,        &lt;b&gt;// Other renewables&lt;/b&gt;
   1755.632861, 1755.632861, 1755.632861, 1755.632861, 1755.632861, 1755.632861,        &lt;b&gt;// Other renewables&lt;/b&gt;
   1755.632861, 1755.632861, 1755.632861, 1755.632861, 1755.632861, 1755.632861],       &lt;b&gt;// Other renewables&lt;/b&gt;

  [1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,        &lt;b&gt;// Other&lt;/b&gt;
   1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682],                   &lt;b&gt;// Other&lt;/b&gt;

  [7014, 7014, 7014, 7014, 7014, 7014, 7014, 7014, 7014, 7014, 7014, 7014, 7014,        &lt;b&gt;// Hydro&lt;/b&gt;
   7014, 7014, 7014, 7014, 7014, 7014, 7014, 7014, 7014, 7014, 7014],                   &lt;b&gt;// Hydro&lt;/b&gt;

  [2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280,        &lt;b&gt;// Nuclear&lt;/b&gt;
   2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280],                   &lt;b&gt;// Nuclear&lt;/b&gt;

  [26188, 26188, 26188, 26188, 26188, 26188, 26188, 26188, 26188, 26188, 26188,         &lt;b&gt;// Methane&lt;/b&gt;
   26188, 26188, 26188, 26188, 26188, 26188, 26188, 26188, 26188, 26188, 26188,         &lt;b&gt;// Methane&lt;/b&gt;
   26188, 26188],                                                                       &lt;b&gt;// Methane&lt;/b&gt;

  ...
]&lt;/pre&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/1321442455141884062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/1321442455141884062'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/10/virtual-power-plants-and-california-grid.html' title='Virtual Power Plants and the California Grid'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnMWZqruPAAPW7KSDqq06oQjktSrSngnQIbiCCeEQAO-a0cVSWH7PBy4QT4B2R6Dza5VJ5WzM7VwUcgxNHgVF5wVk3IdvEh0lKD7SV6-bH7ysL_TF0G4qQMfiTDWX6aLpbeQs_CNrnWcyAQpXUO2snTU0WBksU_s6Vr6_q6iLwrVi6lauv-eNDbja_Xha2/s72-c/CAISO-energy-sources-by-hour-mwatts-9-2025.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-8077933997912085856</id><published>2025-10-12T07:00:00.000-07:00</published><updated>2025-10-14T06:08:23.283-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Germany"/><title type='text'>Germany Photos Then and Now</title><content type='html'>&lt;p&gt;In our collection of family photos we have a number of sets taken in Germany over the decades:&lt;/p&gt;
&lt;ul&gt;
  &lt;li style=&quot;line-height: 1.0;&quot;&gt;in the early 1950s by my spouse&#39;s grandparents&lt;/li&gt;
  &lt;li style=&quot;line-height: 1.0;&quot;&gt;in the late 1960s by my father while stationed in Germany&lt;/li&gt;
  &lt;li style=&quot;line-height: 1.0;&quot;&gt;in 1995 by my spouse&lt;/li&gt;
  &lt;li style=&quot;line-height: 1.0;&quot;&gt;in summer 2024 on our first family trip to Germany&lt;/li&gt;
  &lt;li style=&quot;line-height: 1.0;&quot;&gt;in summer 2025 on our second family trip to Germany&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In our trips of the last several summers we&#39;ve made an effort to take photos of places our parents visited, allowing side-by-side comparison. The main thing one notes is the evolution of camera technology and its handling of colors, amusingly enough.&lt;/p&gt;

&lt;br/&gt;&amp;nbsp;&lt;br/&gt;

&lt;h3&gt;Göbelstraße 2, Hannover&lt;/h3&gt;
&lt;p&gt;My spouse&#39;s grandparents owned a house on this land decades ago. That house has since been replaced by larger buildings.&lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHkuCwfou_zwJTY8ho0zBpXfHcc8YiAJupr8-5HeKMFf0lwBunIFwshT8kgs9ShPV5oj17hwPXWZ1XsKhYJX9DWYYIECR1p-Ne1V9UQC4GjsShYqII8hs2gk-SNA68_9srzCDWqvNCN2ekUWKTvQGqw6XkvaR2oheMssEnTDxGtZmjesAZ67DAtOkJ9EpI/s8455/Go%CC%88belstra%C3%9Fe-1950-1995-2025.jpg&quot; style=&quot;display: block; padding: 1em 0; text-align: center; &quot;&gt;&lt;img alt=&quot;Göbelstraße 2, Hannover&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;3000&quot; data-original-width=&quot;8455&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHkuCwfou_zwJTY8ho0zBpXfHcc8YiAJupr8-5HeKMFf0lwBunIFwshT8kgs9ShPV5oj17hwPXWZ1XsKhYJX9DWYYIECR1p-Ne1V9UQC4GjsShYqII8hs2gk-SNA68_9srzCDWqvNCN2ekUWKTvQGqw6XkvaR2oheMssEnTDxGtZmjesAZ67DAtOkJ9EpI/s600/Go%CC%88belstra%C3%9Fe-1950-1995-2025.jpg&quot;/&gt;&lt;/a&gt;&lt;/div&gt;

&lt;br/&gt;&amp;nbsp;&lt;br/&gt;

&lt;h3&gt;Burg Pfaltzgrafstein, Rhine River&lt;/h3&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijjW1p3Z5DXLPQqxMCXtEQM3ALgQjqihiCm5viKnrfFJEJ35T4L4AhsH3L3ZDugaxuSokplTcYNfG5ipT6ICtjyRPLZaeftGadsKiGBEQB8HP-W4jWt7HvqQulM6-f6hDsFEu7pGhCccZqyHKnUoyb_RHlMa1YY2eHz7ZHFP3LRmc-N6sZL8Gh1AdoLl-W/s5948/Burg-Pfaltzgrafstein-1995-2025.jpg&quot; style=&quot;display: block; padding: 1em 0; text-align: center; &quot;&gt;&lt;img alt=&quot;Burg Pfaltzgrafstein, Rhine River&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;2511&quot; data-original-width=&quot;5948&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijjW1p3Z5DXLPQqxMCXtEQM3ALgQjqihiCm5viKnrfFJEJ35T4L4AhsH3L3ZDugaxuSokplTcYNfG5ipT6ICtjyRPLZaeftGadsKiGBEQB8HP-W4jWt7HvqQulM6-f6hDsFEu7pGhCccZqyHKnUoyb_RHlMa1YY2eHz7ZHFP3LRmc-N6sZL8Gh1AdoLl-W/s600/Burg-Pfaltzgrafstein-1995-2025.jpg&quot;/&gt;&lt;/a&gt;&lt;/div&gt;

&lt;br/&gt;&amp;nbsp;&lt;br/&gt;

&lt;h3&gt;Gasthaus Rheingold, Rhine River&lt;/h3&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0rwEbWNfq2MckLYaAFOxn-8HOmNStKsufHPpjBgOCwj67l_tly0jwB4H-eN0agUJd_EKbwH9Xyz73_cB4E4UzCFPIxZMfu8dzFhu83GoGVzzt2JQKpjbHzFtTIoQsICR5jBaSJ6USRBZWZYOqibdNAmttAa1Zv9D9TGZm-1vNdShbb0Z390uyq108ceAf/s8230/Gasthaus-Rheingold-1969-2024.jpg&quot; style=&quot;display: block; padding: 1em 0; text-align: center; &quot;&gt;&lt;img alt=&quot;Gasthaus Rheingold, Rhine River&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;3072&quot; data-original-width=&quot;8230&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0rwEbWNfq2MckLYaAFOxn-8HOmNStKsufHPpjBgOCwj67l_tly0jwB4H-eN0agUJd_EKbwH9Xyz73_cB4E4UzCFPIxZMfu8dzFhu83GoGVzzt2JQKpjbHzFtTIoQsICR5jBaSJ6USRBZWZYOqibdNAmttAa1Zv9D9TGZm-1vNdShbb0Z390uyq108ceAf/s600/Gasthaus-Rheingold-1969-2024.jpg&quot;/&gt;&lt;/a&gt;&lt;/div&gt;

&lt;br/&gt;&amp;nbsp;&lt;br/&gt;

&lt;h3&gt;Assmanhausen, Rhine River&lt;/h3&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp21l794dIQZ3xvl4icsHSKtm83aFopxAPQMfY1hCHC-YTSbppgtaBCcQu4K5Rasv2qvoUvcE7Uc0RO763oZvJJLIGVnakDVGrriLIt9tNZhihmDG7atJlULuaRekYe2sMgDC7ymudK2jjZcgpWY0fFLNRhxJ2aA_mRMvmVrWrSxLrIVDfrFitWEmYGfnM/s7648/Assmanhausen-1969-2024.jpg&quot; style=&quot;display: block; padding: 1em 0; text-align: center; &quot;&gt;&lt;img alt=&quot;Assmanhausen, Rhine River&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;2895&quot; data-original-width=&quot;7648&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp21l794dIQZ3xvl4icsHSKtm83aFopxAPQMfY1hCHC-YTSbppgtaBCcQu4K5Rasv2qvoUvcE7Uc0RO763oZvJJLIGVnakDVGrriLIt9tNZhihmDG7atJlULuaRekYe2sMgDC7ymudK2jjZcgpWY0fFLNRhxJ2aA_mRMvmVrWrSxLrIVDfrFitWEmYGfnM/s600/Assmanhausen-1969-2024.jpg&quot;/&gt;&lt;/a&gt;&lt;/div&gt;

&lt;br/&gt;&amp;nbsp;&lt;br/&gt;

&lt;h3&gt;Glockenspiel in Munich&lt;/h3&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAymqav-ZUCtnd_ADHXDW8Qr0MbskgAD1MbA7Qlm8yP6vaZ_sAHsKyUrRgs4TgG_HrT8lQ_u_AmHsuc3n5jC24yP-MZErdmCRgcQTZn57XCidXXdETcUd2ejgiYXNkxuc3NeYcjxeoIq-a-a1FcV90Sjxgb8A8FyIK_SjOyhnv5HPke0LqOaVmrwnQsHwD/s5986/Munich-Glockenspiel-1969-1995-2025.jpg&quot; style=&quot;display: block; padding: 1em 0; text-align: center; &quot;&gt;&lt;img alt=&quot;Glockenspiel in Munich&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;2804&quot; data-original-width=&quot;5986&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAymqav-ZUCtnd_ADHXDW8Qr0MbskgAD1MbA7Qlm8yP6vaZ_sAHsKyUrRgs4TgG_HrT8lQ_u_AmHsuc3n5jC24yP-MZErdmCRgcQTZn57XCidXXdETcUd2ejgiYXNkxuc3NeYcjxeoIq-a-a1FcV90Sjxgb8A8FyIK_SjOyhnv5HPke0LqOaVmrwnQsHwD/s600/Munich-Glockenspiel-1969-1995-2025.jpg&quot;/&gt;&lt;/a&gt;&lt;/div&gt;

&lt;br/&gt;&amp;nbsp;&lt;br/&gt;

&lt;h3&gt;Odeonsplatz in Munich&lt;/h3&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJa088QyPNwEcjOuPO-VEHRiu61kHaSPbKqWZXAO2h_V3nkZh0ALG9-zH2yGG1c1HHlekomHONVLGnTygtQivBdm991KdumkYD8HjqGjtu9Lt4uJ5rtefAHg7DrA8EysYSwMyoC74mFRR1PwxxVZ_YTc-tFilGHn7pO2NcI-BPKbSHNJcsEzEZvSDC3z1x/s7246/Munich-Odeonsplatz-1969-2025.jpg&quot; style=&quot;display: block; padding: 1em 0; text-align: center; &quot;&gt;&lt;img alt=&quot;Odeonsplatz in Munich&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;3010&quot; data-original-width=&quot;7246&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJa088QyPNwEcjOuPO-VEHRiu61kHaSPbKqWZXAO2h_V3nkZh0ALG9-zH2yGG1c1HHlekomHONVLGnTygtQivBdm991KdumkYD8HjqGjtu9Lt4uJ5rtefAHg7DrA8EysYSwMyoC74mFRR1PwxxVZ_YTc-tFilGHn7pO2NcI-BPKbSHNJcsEzEZvSDC3z1x/s600/Munich-Odeonsplatz-1969-2025.jpg&quot;/&gt;&lt;/a&gt;&lt;/div&gt;

&lt;br/&gt;&amp;nbsp;&lt;br/&gt;

&lt;h3&gt;Karlsplatz in Munich&lt;/h3&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0CwRXZk7t7iVx1hHEToVMYjTIpGtDaFknpoewAVhFjdXiM_B75rl4GhTz4qhg3FX2QVJ3iHcoZ7QNp88YKLyokuJuTqIpKiZgqXWSQnEy0FYD57CYTteXfK0bjbq8fvRCSOFDap_a2kZHdPSkrunuTp1mo_ZRwOM2_0f4Dq4ppwv33zjUHRZEm9KA5LLb/s2407/Munich-Karlsplatz-1969-2025.jpg&quot; style=&quot;display: block; padding: 1em 0; text-align: center; &quot;&gt;&lt;img alt=&quot;Karlsplatz in Munich&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1998&quot; data-original-width=&quot;2407&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0CwRXZk7t7iVx1hHEToVMYjTIpGtDaFknpoewAVhFjdXiM_B75rl4GhTz4qhg3FX2QVJ3iHcoZ7QNp88YKLyokuJuTqIpKiZgqXWSQnEy0FYD57CYTteXfK0bjbq8fvRCSOFDap_a2kZHdPSkrunuTp1mo_ZRwOM2_0f4Dq4ppwv33zjUHRZEm9KA5LLb/s600/Munich-Karlsplatz-1969-2025.jpg&quot;/&gt;&lt;/a&gt;&lt;/div&gt;

&lt;br/&gt;&amp;nbsp;&lt;br/&gt;

&lt;h3&gt;Heidelberg Bridge&lt;/h3&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLNWHV9-Fcz5DizaHqsvwXAVUPV2ftjsACmCKLqKuHgeKcTUEskmBnw6kHBLpA70w0obPOW31menrjaWGx0v6iw2UgNOQnS-wSCJIF_hz4a9XEAky9pgMW1feUmtTVcVF94RioYenVH5Tmw-RYBciIzeH5F8KsRGI39Ow8Zkit32IkdDh4YY1S6G7zDs8X/s2000/Heidelberg%20Bridge%201969-2024.jpg&quot; style=&quot;display: block; padding: 1em 0; text-align: center; &quot;&gt;&lt;img alt=&quot;Heidelberg Bridge&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;2000&quot; data-original-width=&quot;2000&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLNWHV9-Fcz5DizaHqsvwXAVUPV2ftjsACmCKLqKuHgeKcTUEskmBnw6kHBLpA70w0obPOW31menrjaWGx0v6iw2UgNOQnS-wSCJIF_hz4a9XEAky9pgMW1feUmtTVcVF94RioYenVH5Tmw-RYBciIzeH5F8KsRGI39Ow8Zkit32IkdDh4YY1S6G7zDs8X/s600/Heidelberg%20Bridge%201969-2024.jpg&quot;/&gt;&lt;/a&gt;&lt;/div&gt;

&lt;br/&gt;&amp;nbsp;&lt;br/&gt;

&lt;h3&gt;Heidelberg Castle&lt;/h3&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZmRv9WoE6UTQyYSKt7V4AUdcOlRLzunwbATZZKj30z6MWZ8ZtudpgyvX-JBwKOQbnfmE_iFJzjUopEybCj3hl2i0kAqO0CQQnfUR6RUbG2C8B2PjWucno0WTxUFmKXBKwv-60eP8m865zo4lBGrWFPEzsBjco1i_jgeiV0CBAJYedjdNeSGr2WCyqW79y/s6598/Heidelberg-1969-2024.jpg&quot; style=&quot;display: block; padding: 1em 0; text-align: center; &quot;&gt;&lt;img alt=&quot;Heidelberg&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;3072&quot; data-original-width=&quot;6598&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZmRv9WoE6UTQyYSKt7V4AUdcOlRLzunwbATZZKj30z6MWZ8ZtudpgyvX-JBwKOQbnfmE_iFJzjUopEybCj3hl2i0kAqO0CQQnfUR6RUbG2C8B2PjWucno0WTxUFmKXBKwv-60eP8m865zo4lBGrWFPEzsBjco1i_jgeiV0CBAJYedjdNeSGr2WCyqW79y/s600/Heidelberg-1969-2024.jpg&quot;/&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/8077933997912085856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/8077933997912085856'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/10/germany-photos-then-and-now.html' title='Germany Photos Then and Now'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHkuCwfou_zwJTY8ho0zBpXfHcc8YiAJupr8-5HeKMFf0lwBunIFwshT8kgs9ShPV5oj17hwPXWZ1XsKhYJX9DWYYIECR1p-Ne1V9UQC4GjsShYqII8hs2gk-SNA68_9srzCDWqvNCN2ekUWKTvQGqw6XkvaR2oheMssEnTDxGtZmjesAZ67DAtOkJ9EpI/s72-c/Go%CC%88belstra%C3%9Fe-1950-1995-2025.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-872986019338159771</id><published>2025-10-11T07:00:00.000-07:00</published><updated>2025-10-11T07:00:00.129-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Joke"/><title type='text'>New Ohio Exonym Just Dropped</title><content type='html'>&lt;p&gt;Tell me your game development is done outside of the United States without telling me your game development is done outside of the United States.&lt;/p&gt;

&lt;img style=&quot;display: block; padding: 0; text-align: center; &quot; alt=&quot;Cartoonish map of the upper midwest of the United States with Colombus, Ohio spelled Calambus&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;872&quot; data-original-width=&quot;1798&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEionuMKOVhfxTgw129K5o0jjuuq6ZF12Azd8o9_MBd_jbNvc5JrWqcAsZlIO63FJIxJQZXi4oj8q869at9pvKQCX8fmrx3DVOvuDzd72g5pQpukNQCeFl6_eIstpWTXp6qRAU5o89HhyTflCldMPRo4wYHot4gpYKQGaLvRC9rghElb91B_iXt2MMsJ0R59/s600/calambus-ohio.jpg&quot;/&gt;

&lt;p&gt;As an alumnus of the University of Michigan, I approve of the association of Ohio with &quot;Calamity&quot;.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/872986019338159771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/872986019338159771'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/10/new-ohio-exonym-just-dropped.html' title='New Ohio Exonym Just Dropped'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEionuMKOVhfxTgw129K5o0jjuuq6ZF12Azd8o9_MBd_jbNvc5JrWqcAsZlIO63FJIxJQZXi4oj8q869at9pvKQCX8fmrx3DVOvuDzd72g5pQpukNQCeFl6_eIstpWTXp6qRAU5o89HhyTflCldMPRo4wYHot4gpYKQGaLvRC9rghElb91B_iXt2MMsJ0R59/s72-c/calambus-ohio.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-3168375040830276991</id><published>2025-10-10T10:11:00.000-07:00</published><updated>2025-10-10T10:11:27.917-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Joke"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><title type='text'>New Google Blogger Features ?!?</title><content type='html'>&lt;div style=&quot;margin: 0 2em 0 2em; padding: 1em; background-color: lightblue; font-size: 12px;&quot;&gt;&lt;p&gt;&lt;b&gt;**Try our New Beta Features**: Create a more engaging reading experience with the help of Google&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Google Search previews:&lt;/b&gt; Easily insert visual Google Search previews for popular people, locations, pop-culture and more directly in your blog! In Compose View, look for the ‘G’ button in the editor tool bar to get started.&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;That is the notice greeting me at the top of draft.blogger.com today. After years of not noticing any change in the service at all, it is now getting search previews.&lt;/p&gt;

&lt;p&gt;Honestly I would have expected any sudden burst of activity in Google Blogger to be more distinctly AI-related, part of someone&#39;s promotion packet to sprinkle LLMs anywhere and everywhere.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/3168375040830276991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/3168375040830276991'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/10/new-google-blogger-features.html' title='New Google Blogger Features ?!?'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-1443405143618345419</id><published>2025-10-07T05:00:00.000-07:00</published><updated>2025-10-07T14:20:35.034-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Germany"/><title type='text'>EasyPASS and entering Germany</title><content type='html'>&lt;p&gt;If you&#39;ve ever flown into Germany you&#39;ve seen the two lines at customs and immigration, one for citizens of the European Union and one for non-EU citizens. The non-EU line is often longer and slower, though not exceptionally so at the times I&#39;ve been through. Nonetheless in a family like ours, where the rest of them go through the EU line and I wait in the non-EU line, it leads to some extra complexities in travel.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.easypass.de/EasyPass/EN/What_is_EasyPASS/home_node.html&quot;&gt;EasyPASS is a program to enroll passports from several non-EU countries including the United States, South Korea, and Taiwan&lt;/a&gt; to be able to use the electronic readers in the EU line at German airports. One fills out a form to submit at an airport with an EasyPASS office, including Berlin (Brandenburg), Köln/Cologne/Bonn, Dusseldorf, Frankfurt, Hamburg, Hanover, München/Munich, and Stuttgart.&lt;/p&gt;

&lt;p&gt;I enrolled at the Munich airport in July 2025, where EasyPASS is handled at the police substation. Follow the signs for the Politzei office, which is at the far end of the airport where there are a number of restaurants and shops. You ring the buzzer for admittance.&lt;/p&gt;

&lt;img style=&quot;display: block; padding: 0; text-align: center; &quot; alt=&quot;Shopping court at the Munich airport, with an arrow pointing to the police substation&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;768&quot; data-original-width=&quot;1020&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMA9e2LijemC5ZvIch7YL6KRSc1sSikh6lH5XcfX_yH4Oe8jtyRTYT2Xi09pNSpGjQhd39NYAQvooABWPiP16ZLWWrUfz45QERuIahFa3sJZnijlJyyv-z-xbUaQK-Wq5pNTnaCmFeIR0gt3JvCM80_DMFfwKShU_LuiEx3bNmfFnYoCGxS7BQidy10vGm/s600/Muenchen-Polizei.jpg&quot;/&gt;

&lt;br/&gt;

&lt;p&gt;It is helpful if you speak a bit of German, but the police stationed at the airport have to deal with international travellers every day and understand English well. They were quite helpful in correcting a mistake I&#39;d made in filling out the form. They then took my US passport to enroll in EasyPASS.&lt;/p&gt;

&lt;p&gt;I don&#39;t have an outcome to report yet, it will likely be some months until our next trip to Germany to try using the EU line at the airport.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/1443405143618345419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/1443405143618345419'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/10/easypass-and-entering-germany.html' title='EasyPASS and entering Germany'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMA9e2LijemC5ZvIch7YL6KRSc1sSikh6lH5XcfX_yH4Oe8jtyRTYT2Xi09pNSpGjQhd39NYAQvooABWPiP16ZLWWrUfz45QERuIahFa3sJZnijlJyyv-z-xbUaQK-Wq5pNTnaCmFeIR0gt3JvCM80_DMFfwKShU_LuiEx3bNmfFnYoCGxS7BQidy10vGm/s72-c/Muenchen-Polizei.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-7185698061613386098</id><published>2025-09-26T06:00:00.000-07:00</published><updated>2025-09-26T09:52:44.926-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Management"/><category scheme="http://www.blogger.com/atom/ns#" term="Product Development"/><title type='text'>On the Nature of Microservices</title><content type='html'>&lt;img alt=&quot;a series of interlocking sawtoothed gears, intended to represent a set of microservices&quot; style=&quot;display: block; padding: 1em 0; text-align: center; clear: right; float: right;&quot; border=&quot;0&quot; width=&quot;300&quot; data-original-height=&quot;363&quot; data-original-width=&quot;390&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq6n8F0ahxLODqkC2iNbiNiXxK1Xw69CQD5UAtIw5zaY9NydXYlHqhGEIUdWYSx45mF93YAEjpnnzIlrZaQYi7Evn0dmWchqJ7ZAvKSVrAnbOQ4V1mGuB3Mkum0DaMzNrjkkcUQfS6CZ2VulDd4mtMyOXGKZjP-9b1cYpnyWhkRU3sZGiipZbN8hub-G4X/s320/microservices.jpg&quot;/&gt;

&lt;p&gt;Microservices entered the lexicon of systems engineering a number of years ago, breaking up a system which might once have been delivered as a single large binary &amp;mdash; though usually with separate relational database at least &amp;mdash; to instead consist of a series of small microservices each performing a specific function and communicating amongst themselves to provide an overall service.&lt;/p&gt;

&lt;p&gt;In my experience at least, moving to a microservices architecture &lt;b&gt;does&lt;/b&gt; solve real problems but the nature of the problems it solves are as much organizational as technical.&lt;/p&gt;

&lt;p&gt;In a very large engineering team all trying to work together to deliver a solution, one frequently loses velocity simply because of the number of teams jostling against each other:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The release process grows over time, and tends to add process of the form &amp;quot;make sure &lt;i&gt;that&lt;/i&gt; problem never happens again.&amp;quot;&lt;/li&gt;
  &lt;li&gt;Rollbacks roll back everything. When every team has &lt;span style=&quot;font-family: monospace; background-color: WhiteSmoke;&quot;&gt;P0&lt;/span&gt; deliverables, no team has &lt;span style=&quot;font-family: monospace; background-color: WhiteSmoke;&quot;&gt;P0&lt;/span&gt; deliverables.&lt;/li&gt;
  &lt;li&gt;The internal architecture might have been carefully planned... or might not. Even without a &amp;quot;if I can call it, I can use it&amp;quot; mentality, there still can be significant underspecification.&lt;/li&gt;
&lt;/ol&gt;

&lt;br/&gt;&amp;nbsp;&lt;br/&gt;

&lt;h3&gt;Moving to Microservices&lt;/h3&gt;
&lt;p&gt;A team which moves to microservices, devoting considerable effort to do so, has every incentive to solve these issues:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;The release process for each microservice can be (mostly) decoupled with disciplined versioning of API between producers and consumers.&lt;/li&gt;
  &lt;li&gt;Rollbacks impact only a portion of the overall service.&lt;/li&gt;
  &lt;li&gt;The interfaces between microservices will have an API boundary, &lt;a href=&quot;https://www.hyrumslaw.com/&quot;&gt;though Hyrum&#39;s Law still applies&lt;/a&gt; that un-promised behavior can become a load-bearing dependency.&lt;/li&gt;
&lt;/ol&gt;

&lt;br/&gt;
&lt;p&gt;The tradeoff is that one now has a distributed system, and distributed systems are hard.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Debugging is much more likely to cross multiple processes.&lt;/li&gt;
  &lt;li&gt;The 95% and 99% tail latency will suffer, as long code paths likely incur extra cross-process messaging.&lt;/li&gt;
  &lt;li&gt;A robust design will degrade if subsystems are unavailable, transforming the potential for outage into more frequent partial systems failure.&lt;/li&gt;
&lt;/ul&gt;

&lt;br/&gt;
&lt;img alt=&quot;Kubernetes logo, a ship&#39;s wheel&quot; style=&quot;display: block; padding: 0; text-align: center; clear: right; float: right;&quot; border=&quot;0&quot; width=&quot;120&quot; data-original-height=&quot;830&quot; data-original-width=&quot;830&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitpZlwd1UIjJ3Oh6cAIvhgMLCqLR7huDbHwCzomknLiDJhMlV7ZgwRW6pU03INgmEGScsqmfta_b8GJKxa2G5Y6D5cxwuyDZeEqWMQC9NzrjIYOLFn2pmb2eRb7iC7tPMAm8PjsRIaeyIS2XdVoXJLntfaNTwW3ZeZ1jB4WMwwmUb0psm4Sxw4qLsUko6v/s200/kubernetes.png&quot;/&gt;
&lt;p&gt;If the problem being solved is &amp;quot;maximize effectiveness of a large engineering team&amp;quot; then these are perhaps good tradeoffs. One has the resources to develop tooling for debugging and latency and reliability. If one has further chosen to deploy those services via an orchestration system like Kubernetes, one has the personnel to cover the operational burden of that too.&lt;/p&gt;

&lt;p&gt;If one &lt;i&gt;doesn&#39;t&lt;/i&gt; have the personnel to cover the cost, microservices become a more questionable choice. Fundamentally: delivering via monolithic binary is not inherently bad. It isn&#39;t automatically a poor choice. It isn&#39;t poor engineering.&lt;/p&gt;

&lt;p&gt;How to deliver software is influenced by the size and composition of the team delivering it.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/7185698061613386098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/7185698061613386098'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/09/on-nature-of-microservices.html' title='On the Nature of Microservices'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq6n8F0ahxLODqkC2iNbiNiXxK1Xw69CQD5UAtIw5zaY9NydXYlHqhGEIUdWYSx45mF93YAEjpnnzIlrZaQYi7Evn0dmWchqJ7ZAvKSVrAnbOQ4V1mGuB3Mkum0DaMzNrjkkcUQfS6CZ2VulDd4mtMyOXGKZjP-9b1cYpnyWhkRU3sZGiipZbN8hub-G4X/s72-c/microservices.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-8629260272914363279</id><published>2025-09-25T17:00:00.000-07:00</published><updated>2025-09-25T17:06:37.747-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Joke"/><title type='text'>Try Turning the Train Off and Back On</title><content type='html'>&lt;img  alt=&quot;BART train stopped at an outdoor station&quot; style=&quot;display: block; padding: 0; text-align: center; clear: right; float: right;&quot; border=&quot;0&quot; width=&quot;240&quot; data-original-height=&quot;1161&quot; data-original-width=&quot;1512&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGKdQFepvV15Pzfas7wvVlJCXrkrI_nri6n2aqMJIyU3l4rB5qOKvGO28BTS3urgh4VO2z_6bmmVHii3FQkbauhk8RP1JMh7u5VJ3QGCQc5z6g89q5TtlwtrJ_D-0YvZ4pRND4j9oBf7Duzlo98fXPhJ29y-2VjqNsyvfpPw0bCwXLlq2mK6eZ8IDoqmHr/s240/bart-train.jpg&quot;/&gt;

&lt;p&gt;Today I rode the &lt;a href=&quot;https://www.bart.gov/&quot;&gt;Bay Area Rapid Transit train&lt;/a&gt; from the peninsula up to San Francisco. Our stop at the 24th and Mission station was unusually long. The conductor announced on the speaker that they were rebooting part of the train computer.&lt;/p&gt;

&lt;p&gt;The universal first troubleshooting step now extends to turning the train off and back on.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/8629260272914363279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/8629260272914363279'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/09/try-turning-train-off-and-back-on.html' title='Try Turning the Train Off and Back On'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGKdQFepvV15Pzfas7wvVlJCXrkrI_nri6n2aqMJIyU3l4rB5qOKvGO28BTS3urgh4VO2z_6bmmVHii3FQkbauhk8RP1JMh7u5VJ3QGCQc5z6g89q5TtlwtrJ_D-0YvZ4pRND4j9oBf7Duzlo98fXPhJ29y-2VjqNsyvfpPw0bCwXLlq2mK6eZ8IDoqmHr/s72-c/bart-train.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-7217524985453571016</id><published>2025-09-21T07:00:00.000-07:00</published><updated>2025-09-21T07:45:21.538-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="climate change"/><title type='text'>One Year of Electrified Caltrain</title><content type='html'>&lt;img alt=&quot;Electric Caltrain engine, destination San Francisco&quot; border=&quot;0&quot; height=&quot;200&quot; data-original-height=&quot;1020&quot; data-original-width=&quot;768&quot; style=&quot;display: block; padding: 0; text-align: center; clear: right; float: right;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx45NaXIMGGLckEbMgJpQO4GEAwUttPd-56VaRZLgL6h-0SFt_qao1xOvmD2O67WXm_dLycVQ8iJHwANB-vt0jwqeaihOm_3Pw2nZAvaFDClm1-00LOrO4XE4AKb7kPWeV9JyAW_Qi-qUqeHO6nOhOwnrupAtxCF4AjREicdY-Ol1al4PjfsIGid9y3dE7/s200/caltrain-san-francisco-apr-2025.jpg&quot;/&gt;

&lt;p&gt;In November 2020 &lt;a href=&quot;https://ballotpedia.org/Caltrain,_California,_Proposition_RR,_Rail_Service_Tax_(November_2020)&quot;&gt;California voters passed Measure RR to fund electrification of Caltrain&lt;/a&gt; down the San Francisco Peninsula. After several years of construction, the new electrified trains entered service on September 21, 2024: exactly one year ago at the time of this writing.&lt;/p&gt;

&lt;p&gt;The electrification measure was an audacious plan for Caltrain to recover from the Covid-driven disruption in travel patterns by radically improving the service. The electrified fleet would provide more frequent service because the new engines would accelerate and decelerate far more strongly than the diesel locomotives did. The rolling stock would additionally be refreshed with new passenger cars.&lt;/p&gt;

&lt;br style=&quot;clear: right;&quot; /&gt;
&lt;p&gt;So: did it work? Based on &lt;a href=&quot;https://www.caltrain.com/about-caltrain/statistics-reports/ridership/fare-media-based&quot;&gt;ridership data from the last year&lt;/a&gt;, to me it certainly appears so.&lt;/p&gt;

&lt;img alt=&quot;Ridership numbers drop suddenly in 3/2020 at the start of Covid, climb slowly until 8/2024, and then climb rapidly from 9/2024 through 8/2025&quot; style=&quot;display: block; padding: 0; text-align: center;&quot; border=&quot;0&quot; width=&quot;640&quot; data-original-height=&quot;1222&quot; data-original-width=&quot;1692&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZvev5bHmC97ZVpCd0Fk_Uzo13cZYNNJ-qBwrZ8nO0h4GzrRN8J_pxzGlLpYpuZFZ9yEMIBsIGrGUP9LAKZQmH6BXa9yY0gOOu1fAsi55DunVWy3RvMcii-0Y5x8WNCTXWHY0IGp92UubpRjKlnCcMZm9bkpvRb1nl9o7LeNWAwn5LufaGqhUZZ7rkSnOh/s800/caltrain-ridership-2017-2025.jpg&quot;/&gt;

&lt;p&gt;The large drop in ridership in 2020 is due to Covid. I tried to show the slope by drawing red lines in the few years between Covid and electrification, and between electrification and now. The rate of increase in ridership changed markedly for the better in almost exactly 9/2024 when the lines were electrified.&lt;/p&gt;

&lt;p&gt;Ridership has not yet returned to pre-Covid levels, but now appears to be on track to do so if trends continue.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/7217524985453571016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/7217524985453571016'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/09/one-year-of-electrified-caltrain.html' title='One Year of Electrified Caltrain'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx45NaXIMGGLckEbMgJpQO4GEAwUttPd-56VaRZLgL6h-0SFt_qao1xOvmD2O67WXm_dLycVQ8iJHwANB-vt0jwqeaihOm_3Pw2nZAvaFDClm1-00LOrO4XE4AKb7kPWeV9JyAW_Qi-qUqeHO6nOhOwnrupAtxCF4AjREicdY-Ol1al4PjfsIGid9y3dE7/s72-c/caltrain-san-francisco-apr-2025.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-5472539040670060901</id><published>2025-09-15T07:00:00.000-07:00</published><updated>2025-09-18T19:03:20.182-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="de-googlification"/><title type='text'>Android Signal Keyboard Privacy</title><content type='html'>&lt;p&gt;Android keyboards can be quite sophisticated, including learning of commonly used words or languages. Some of these result in uploading what you enter to a service you may not know about. The Signal app on Android includes a setting to say that its keyboard input should not be uploaded.&lt;/p&gt;

&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDfgk5kQQL6iD7gdqjnM7ac-7d4WmTEeodubY1tt71MD4PYTPtCPYAxRsh2EPIOP6jWBn0D3tfDs8SBUOrS-Nfu8W-5nIiOf4qow00DzWOUuBMOrC25H0pMaVM3eVSPTmuQcfOkaCK7VNVN37-XU0oUSVBmkcZp4jUZtduvflcTnUyycSU4I8FXZBW5uqP/s1459/signal-android-keyboard.png&quot; style=&quot;display: block; padding: 1em 0; text-align: center; &quot;&gt;&lt;img alt=&quot;Privacy settings for Android Signal app with Incognito Keyboard enabled&quot; border=&quot;0&quot; height=&quot;400&quot; data-original-height=&quot;1459&quot; data-original-width=&quot;1008&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDfgk5kQQL6iD7gdqjnM7ac-7d4WmTEeodubY1tt71MD4PYTPtCPYAxRsh2EPIOP6jWBn0D3tfDs8SBUOrS-Nfu8W-5nIiOf4qow00DzWOUuBMOrC25H0pMaVM3eVSPTmuQcfOkaCK7VNVN37-XU0oUSVBmkcZp4jUZtduvflcTnUyycSU4I8FXZBW5uqP/s400/signal-android-keyboard.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p style=&quot;clear: both;&quot;&gt;Malicious keyboard apps can ignore this, but if a malicious keyboard has made its way onto your device I think you have bigger problems.&lt;/p&gt;

&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNRrmr0XfGQJsI6wB0xOfpZSnHX2rAfs1F9YVyRHysdNwLl611JGiYdyKTXpK2N5oUf_ryEsrXz_1-KmOOezQBDj4ipOAKSDJc9XjML08loCroGaKOnY7LGEeHYLg-42WC_6TJUdsgZ9yyr_YcsKzcYIGR32FOqDggOBx85xHm-qUOd6SNAmnLVscpQ8IQ/s1600/android-keyboard-no-voice.png&quot; style=&quot;display: block; padding: 0; text-align: center; clear: right; float: right;&quot;&gt;&lt;img alt=&quot;Android keyboard with overlaid dialog: This app doesn&#39;t support voice input&quot; border=&quot;0&quot; data-original-height=&quot;838&quot; data-original-width=&quot;1006&quot; width=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNRrmr0XfGQJsI6wB0xOfpZSnHX2rAfs1F9YVyRHysdNwLl611JGiYdyKTXpK2N5oUf_ryEsrXz_1-KmOOezQBDj4ipOAKSDJc9XjML08loCroGaKOnY7LGEeHYLg-42WC_6TJUdsgZ9yyr_YcsKzcYIGR32FOqDggOBx85xHm-qUOd6SNAmnLVscpQ8IQ/s400/android-keyboard-no-voice.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The tradeoff: if you use speech-to-text on the Android keyboard, it will no longer work. The microphone will be greyed out and will bring up a small message saying &amp;quot;This app doesn&#39;t support voice input.&amp;quot; The stock Android keyboard apparently has no on-device voice processing.&lt;/p&gt;


&lt;p style=&quot;clear: both;&quot;&gt;I learned of this &lt;a href=&quot;https://bsky.app/profile/lizthegrey.com/post/3lgiu7kmzgk25&quot;&gt;from Liz Fong-Jones&#39; Bluesky feed&lt;/a&gt;.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/5472539040670060901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/5472539040670060901'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/09/android-signal-keyboard-privacy.html' title='Android Signal Keyboard Privacy'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDfgk5kQQL6iD7gdqjnM7ac-7d4WmTEeodubY1tt71MD4PYTPtCPYAxRsh2EPIOP6jWBn0D3tfDs8SBUOrS-Nfu8W-5nIiOf4qow00DzWOUuBMOrC25H0pMaVM3eVSPTmuQcfOkaCK7VNVN37-XU0oUSVBmkcZp4jUZtduvflcTnUyycSU4I8FXZBW5uqP/s72-c/signal-android-keyboard.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-7499981462770442321</id><published>2025-09-10T06:00:00.000-07:00</published><updated>2025-09-10T06:00:00.113-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><title type='text'>Continuous Improvement in LLM Code Generation</title><content type='html'>&lt;p&gt;&lt;a href=&quot;https://codingrelic.geekhold.com/2025/09/llms-to-blaze-trail.html&quot;&gt;One week ago, I wrote:&lt;/a&gt;&lt;/p&gt;

&lt;p style=&quot;font-style: italic; padding-left: 3em; padding-right: 8em;&quot;&gt;&amp;quot;I wish wish wish that Claude Code would automatically populate a .gitignore for node_modules. Not for the first time, I checked 437 Megabytes of code into git and had to rewrite the history to remove it.&amp;quot;&lt;/p&gt;

&lt;p&gt;I used Claude Code to create a new frontend project, using Qwik this time, and what do I see?&lt;/p&gt;

&lt;pre style=&quot;font-family: monospace; font-size: x-small; line-height: 1.3em; margin-left: 1em; margin-bottom: 1em; padding: 1em; background-color: WhiteSmoke;&quot;&gt;dgentry@llm:frontend$ cat .gitignore
# Build
/dist
/lib
/lib-types
/server

# Development
&lt;b&gt;node_modules&lt;/b&gt;
.env
*.local

...&lt;/pre&gt;

&lt;br/&gt;


&lt;p&gt;&lt;img alt=&quot;A classic hacker stock photo in a darkened room sitting in front of a laptop wearing a hoodie and mask, except the person typing is a robot&quot; style=&quot;display: block; padding-left: 1em; clear: right; float: right;&quot; border=&quot;0&quot; width=&quot;250&quot; data-original-height=&quot;101&quot; data-original-width=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkYMu9iwt-4D7dLrKbdS3XPVbdR6xuJBj7w9Fl1_UMFF09vUmeYl1EJvUDuWB9pTzkxM6oZ1FUxHR-kAUYHqe4WKb2HwbDpDbObcTrstxNVrnAzx3-mlMeXeu-fvnAxXV-8ixMhT3la9QCA_GWS-tclXXu5VlLFY1797LKJ7dE3OtHKAHylalAvSRVNTDv/s400/robo-hacker.jpg&quot;/&gt;
I don&#39;t know if this represents something which the Claude Code team specifically made happen since the last time I had it generate code like this, or if the training data of Qwik codebases is so much more likely to have included node_modules in their &lt;span style=&quot;font-family: monospace; font-size: small; padding: 3px; background-color: Gainsboro;&quot;&gt;.gitignore&lt;/span&gt; file.&lt;/p&gt;

&lt;p&gt;It is one of the perverse things about use of tools like this: we tend to give credit to the tool, and not the community which created the information upon which it relies.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/7499981462770442321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/7499981462770442321'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/09/continuous-improvement-in-llm-code.html' title='Continuous Improvement in LLM Code Generation'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkYMu9iwt-4D7dLrKbdS3XPVbdR6xuJBj7w9Fl1_UMFF09vUmeYl1EJvUDuWB9pTzkxM6oZ1FUxHR-kAUYHqe4WKb2HwbDpDbObcTrstxNVrnAzx3-mlMeXeu-fvnAxXV-8ixMhT3la9QCA_GWS-tclXXu5VlLFY1797LKJ7dE3OtHKAHylalAvSRVNTDv/s72-c/robo-hacker.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-8194597503513816362</id><published>2025-09-09T00:30:00.000-07:00</published><updated>2025-09-09T00:30:00.114-07:00</updated><title type='text'>Passport Cards as Proof of Citizenship</title><content type='html'>&lt;a href=&quot;https://travel.state.gov/content/travel/en/passports/need-passport/card.html&quot; style=&quot;display: block; padding: 0; text-align: center; clear: right; float: right;&quot;&gt;&lt;img alt=&quot;Passport card issued November 2024&quot; border=&quot;0&quot; width=&quot;200&quot; data-original-height=&quot;527&quot; data-original-width=&quot;826&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGuij_KpkfvVlBAdUKLNczf74celc221BckePXPUcxmCI9sG9hZ0Dvr-NpTo2EH3L4K40yda8H2ptx9WFwk_z3rZE6eKbfW2cn6qNXZenC97_i3bR0IIgjLfeYY1XNwpTpKQBgMIZ05kjlWs-5GMkx_dEfCiCuYBjd42mM9pO9vXG6gik13eWA-Olth7At/s200/passport-card.jpg&quot;/&gt;&lt;/a&gt;

&lt;p&gt;In &lt;a href=&quot;https://codingrelic.geekhold.com/2024/12/renewing-us-passports-early.html&quot;&gt;November 2024 we ordered&lt;/a&gt; &lt;a href=&quot;https://en.wikipedia.org/wiki/United_States_passport_card&quot;&gt;Passport Cards&lt;/a&gt; for the first time. The cards arrived 18 days after we mailed in the forms, without paying for expedited service nor even for express mail.&lt;/p&gt;

&lt;p&gt;The Passport Card is a stiff plastic card, slightly thicker than our driver&#39;s licenses. It is specifically not valid for international air travel, though it can be used to board a domestic flight and is &lt;a href=&quot;https://www.dhs.gov/real-id&quot;&gt;Real-ID compliant&lt;/a&gt;. It cost $30, versus $130 for a Passport Book, at least as of the timeframe we ordered in late 2024.&lt;/p&gt;

&lt;p&gt;Most importantly though: it is much more reasonable to have a Passport Card with you at all times than it would be to carry around a Passport Book, and the card is a valid proof of citizenship. It can be used within the United States, can be used for travel within the Americas, and will allow re-entry into the US even if you have lost the regular Passport Book.&lt;/p&gt;

&lt;p&gt;One caution: when it comes time to renew, both the Passport Book and Card will need to be turned in for renewal. Keep good care of both, if one is lost then the renewal of the other becomes a &lt;a href=&quot;https://travel.state.gov/content/travel/en/passports/have-passport/lost-stolen.html&quot;&gt;Lost Passport event which requires DS-64 and DS-11 forms to replace&lt;/a&gt;. The DS-11 requires birth certificates and other proof of citizenship, just like getting the passport for the first time required.&lt;/p&gt;

&lt;p&gt;A Passport Card is a good way to have proof of citizenship with you at all times.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/8194597503513816362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/8194597503513816362'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/09/passport-cards-as-proof-of-citizenship.html' title='Passport Cards as Proof of Citizenship'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGuij_KpkfvVlBAdUKLNczf74celc221BckePXPUcxmCI9sG9hZ0Dvr-NpTo2EH3L4K40yda8H2ptx9WFwk_z3rZE6eKbfW2cn6qNXZenC97_i3bR0IIgjLfeYY1XNwpTpKQBgMIZ05kjlWs-5GMkx_dEfCiCuYBjd42mM9pO9vXG6gik13eWA-Olth7At/s72-c/passport-card.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-1570008977972830917</id><published>2025-09-08T07:00:00.000-07:00</published><updated>2025-09-08T07:00:00.115-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Germany"/><title type='text'>Konsulatstermine für Reisepässe</title><content type='html'>&lt;p&gt;&lt;img alt=&quot;Hand holding four German Reispässe&quot; border=&quot;0&quot; width=&quot;120&quot; data-original-height=&quot;300&quot; data-original-width=&quot;300&quot; style=&quot;display: block; padding: 0; text-align: center; clear: right; float: right;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgatQstiVfLmmcpbpDiMQB96DVkK4dvOR5hfIIS32mPPFhmaLa9WPRaNQzaHlyhVEMR8DIrfwl0YkpKPlH8c3sIu286jABLkPlmljI_6aDc9RLz98sXRYUWlf5xBUfYOzWcteFWo6TQGK8choG81xHzj5Vjf_O2sS08FN0QL0F9RWtKhkL-jjcEDfrkaEe1/s200/PXL_20240419_022723481.jpg&quot;/&gt;
 Upon acceptance of a &lt;a href=&quot;https://codingrelic.geekhold.com/2025/03/german-mothers-prior-to-1975.html&quot;&gt;Staatsangehörigkeit § 5 declaration,&lt;/a&gt; making one a German citizen, the next step is generally to order a German passport called a Reisepass. This requires filling out the form and &lt;a href=&quot;https://www.germany.info/us-en/service/02-passportsandidcards/passport-adult-951294&quot;&gt;bringing the &lt;i&gt;Urkunde über den Erwerb der deutschen Staatsangehörigkeit durch Erklärung&lt;/i&gt;&lt;/a&gt; and passport photos to the &lt;a href=&quot;https://www.germany.info/us-en/consulate-finder-895706&quot;&gt;responsible Consulate&lt;/a&gt; in a passport appointment.&lt;/p&gt;

&lt;p&gt;It can be difficult &lt;a href=&quot;https://service2.diplo.de/rktermin/extern/choose_locationList.do&quot;&gt;to get a passport appointment&lt;/a&gt;. You keep checking the site and there are never any appointment slots available.&lt;/p&gt;

&lt;p&gt;German Consulates around the world add new appointments every weekday at midnight &lt;i&gt;in Germany.&lt;/i&gt; For example, that is 3pm in California. If you start polling the appointment site at 2:59pm on Sunday, you have the best chance of seeing new appointments appear and grabbing one before they are all gone. Note that Daylight Savings Time differs by several weeks between Europe and the US, they aren&#39;t the same number of hours apart all year.&lt;/p&gt;

&lt;p&gt;There are &lt;a href=&quot;https://www.germany.info/us-en/service/12-honorarkonsuln&quot;&gt;Honorary Consuls in a number of cities who can make copies of your documentation and forward it to the Consulate&lt;/a&gt;, which might be easier to get an appointment with if your Consulate is swamped.&lt;/p&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/1570008977972830917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/1570008977972830917'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/09/konsulatstermine-fur-reisepasse.html' title='Konsulatstermine für Reisepässe'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgatQstiVfLmmcpbpDiMQB96DVkK4dvOR5hfIIS32mPPFhmaLa9WPRaNQzaHlyhVEMR8DIrfwl0YkpKPlH8c3sIu286jABLkPlmljI_6aDc9RLz98sXRYUWlf5xBUfYOzWcteFWo6TQGK8choG81xHzj5Vjf_O2sS08FN0QL0F9RWtKhkL-jjcEDfrkaEe1/s72-c/PXL_20240419_022723481.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-391160162182322995</id><published>2025-09-02T04:00:00.000-07:00</published><updated>2025-09-15T04:54:21.762-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><title type='text'>LLMs to Blaze a Trail</title><content type='html'>&lt;p&gt;As an engineering executive there are a few ideas and practices which I reinforce via repetition to the team, either explicitly at the start of a recurring meeting or implicitly by bringing it up whenever relevant. The first of these ideas is:&lt;/p&gt;

&lt;p style=&quot;padding-left: 2em; font-style: italic;&quot;&gt;The product is not the code, not the features, not the designs.&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The product is that people can use the service for things that are &lt;u&gt;important&lt;/u&gt; to them.&lt;br/&gt;
The business is not the code, not the features, not the designs.&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The business is that people can use the service for things that are &lt;u&gt;valuable&lt;/u&gt; to them.&lt;/p&gt;

&lt;br/&gt;

&lt;p&gt;But the topic of this post is not that. The topic is the second thing I frequently reinforce via repetition:&lt;/p&gt;

&lt;p style=&quot;padding-left: 2em; font-style: italic;&quot;&gt;Get something, anything, working end to end as quickly as you can.&lt;br/&gt;
  Not even a minimum viable thing. &lt;b&gt;Any&lt;/b&gt; thing.&lt;/p&gt;

&lt;br/&gt;

&lt;p&gt;It has been my experience that, as developers, we tend to focus in on one area of a system to explore its requirements and build it out sufficiently until we feel confident that we understand what else will need to be done before moving on to the next piece. This results in a system where the understanding and the plan for development is grown by accretion, each piece layered atop the previous which is left undisturbed by later developments. We might go back and harmonize all of them later... maybe.&lt;/p&gt;

&lt;p&gt;It has also been my experience that &lt;i&gt;everything&lt;/i&gt; starts progressing more quickly once the system does something, &lt;u&gt;anything&lt;/u&gt; end-to-end.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;We gain perspective on how the whole system will work and apply it to everything we do subsequently.&lt;/li&gt;
  &lt;li&gt;One can make a change and see it function all the way through. &lt;a href=&quot;https://codingrelic.geekhold.com/2017/09/software-engineering-maxims-which-may.html#maxim_2&quot;&gt;Enthusiasm improves productivity.&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;It is far more effective when multiple people work on a system in parallel if they can all see the impacts of each other&#39;s work.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Thus:&lt;/p&gt;
&lt;p style=&quot;padding-left: 2em; font-style: italic;&quot;&gt;Get something, anything, working end to end as quickly as you can.&lt;br/&gt;
  Not even a minimum viable thing. &lt;b&gt;Any&lt;/b&gt; thing.&lt;/p&gt;


&lt;br/&gt;
&lt;h1&gt;LLMs to Blaze a Trail&lt;/h1&gt;
&lt;p&gt;With the maturing capabilities of LLM code generation, I tried an experiment with Claude Code. At Google one of the classes in orientation was to construct a web scraper. I asked Claude Code to build a scraper, but an even simpler one: scrape a metric.&lt;/p&gt;

&lt;pre style=&quot;font-family: monospace; font-size: x-small; line-height: 1.3em; margin-left: 1em; margin-bottom: 1em; padding: 1em; background-color: WhiteSmoke;&quot;&gt;
In a new scraper directory, create a go program which will scrape a web page formatted
in prometheus metrics format, and extract a floating point value labeled &amp;quot;example&amp;quot;

Create an SQL schema for a timeseries, with columns for a timestamp and a floating point value.

Have scraper connect to a Postgres database and write each sample it collects to the database.

In a new webui/frontend directory, create a web page using React and typescript which will
poll a backend server for changes in a loop and display rows of timeseries data with timestamp,
sample name, and value.

In a new webui/backend directory, create a go program which will handle queries from
webui/frontend and fetch timeseries data from the postgres database.
&lt;/pre&gt;

&lt;br/&gt;

&lt;img alt=&quot;A classic hacker stock photo in a darkened room sitting in front of a laptop wearing a hoodie and mask, except the person typing is a robot&quot; style=&quot;display: block; padding-left: 1em; clear: right; float: right;&quot; border=&quot;0&quot; width=&quot;250&quot; data-original-height=&quot;101&quot; data-original-width=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkYMu9iwt-4D7dLrKbdS3XPVbdR6xuJBj7w9Fl1_UMFF09vUmeYl1EJvUDuWB9pTzkxM6oZ1FUxHR-kAUYHqe4WKb2HwbDpDbObcTrstxNVrnAzx3-mlMeXeu-fvnAxXV-8ixMhT3la9QCA_GWS-tclXXu5VlLFY1797LKJ7dE3OtHKAHylalAvSRVNTDv/s400/robo-hacker.jpg&quot;/&gt;
&lt;p&gt;It produced a small, functional implementation.&lt;/p&gt;

&lt;table border=&quot;1&quot; style=&quot;border-collapse: collapse; margin-left: 3em;&quot;&gt;
  &lt;tr&gt;&lt;td style=&quot;padding: 8px;&quot;&gt;scraper&lt;/td&gt;&lt;td style=&quot;padding: 8px;&quot;&gt;123 lines&lt;/td&gt;&lt;td style=&quot;padding: 8px;&quot;&gt;Go&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td style=&quot;padding: 8px;&quot;&gt;backend&lt;/td&gt;&lt;td style=&quot;padding: 8px;&quot;&gt;169 lines&lt;/td&gt;&lt;td style=&quot;padding: 8px;&quot;&gt;Go&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td style=&quot;padding: 8px;&quot;&gt;frontend&lt;/td&gt;&lt;td style=&quot;padding: 8px;&quot;&gt;127 lines&lt;/td&gt;&lt;td style=&quot;padding: 8px;&quot;&gt;Typescript&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td style=&quot;padding: 8px;&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td style=&quot;padding: 8px;&quot;&gt;100 lines&lt;/td&gt;&lt;td style=&quot;padding: 8px;&quot;&gt;CSS&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td style=&quot;padding: 8px;&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td style=&quot;padding: 8px;&quot;&gt;43 lines&lt;/td&gt;&lt;td style=&quot;padding: 8px;&quot;&gt;HTML&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;A few interesting tidbits:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;It produced no unit tests for the Go code. I didn&#39;t tell it to.&lt;/li&gt;
  &lt;li&gt;It &lt;b&gt;did&lt;/b&gt; produce unit tests for the TypeScript code, even though I did not tell it to. I think this speaks well for the TypeScript community, the training data is infused wth testing as an expected practice.&lt;/li&gt;
  &lt;li&gt;I wish wish wish that Claude Code would automatically populate a .gitignore for node_modules. Not for the first time, I checked 437 Megabytes of code into git and had to rewrite the history to remove it.&lt;/li&gt;
&lt;/ul&gt;

&lt;br/&gt;&amp;nbsp;&lt;br/&gt;

&lt;h1&gt;Unit Tests&lt;/h1&gt;
&lt;p&gt;Having no tests at all sets a bad example. I don&#39;t actually want to encourage the construction of large system test suites at this stage of a project, as the effort to keep updating a large test as the system evolves is likely to outweigh the value of the test at this stage. Yet I do want to set the example by ensuring there is &lt;i&gt;something.&lt;/i&gt;&lt;/p&gt;

&lt;pre style=&quot;font-family: monospace; font-size: x-small; line-height: 1.3em; margin-left: 1em; margin-bottom: 1em; padding: 1em; background-color: WhiteSmoke;&quot;&gt;
In the scraper directory, keep the main() function in main.go but move the rest of the code
to a scrape.go file. Write tests for scrape.go with a local prometheus server and in-memory
database. Check that metrics are correctly stored in the database.
&lt;/pre&gt;

&lt;p&gt;Claude Code generated 377 lines of test cases, including scraping one value and several
values. Most of the code was to set up an in-memory database using sqlite and to run a
local Prometheus server.&lt;/p&gt;

&lt;p&gt;The cost of the first prompt to generate the system and the second prompt to add unit tests: 93 cents.&lt;/p&gt;


&lt;br/&gt;&amp;nbsp;&lt;br/&gt;

&lt;h1&gt;Non-trivial example&lt;/h1&gt;
&lt;p&gt;That example was pretty contrived. How about an example of a more realistic system which:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Implements a protocol connecting to a legacy communications system.&lt;/li&gt;
  &lt;li&gt;Implements a set of modern protocols connecting to current Internet communications infrastructure, to forward messages to and from the legacy protocol.&lt;/li&gt;
  &lt;li&gt;Has a management layer watching all of the connections and can stop or restart them as needed.&lt;/li&gt;
  &lt;li&gt;Has a dashboard and console showing the status and configuration of the system.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Can it produce this? Well... not exactly. I kindof cheated: this is the first thing I attempted, I made up the contrived system later.&lt;/p&gt;

&lt;p&gt;The problem is that first step. Claude Code was not much help in producing the first piece, connecting to the legacy system. The tasks there were more like engineering archaeology:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Trying variations on the digest hash function until the remote system suddenly returned 200 OK.&lt;/li&gt;
  &lt;li&gt;Figuring out what portions of the the poorly documented header fields were actually implemented.&lt;/li&gt;
  &lt;li&gt;Diagnosing failures when the only indication we get is &amp;quot;Invalid&amp;quot; with no further information about &lt;u&gt;what&lt;/u&gt; was invalid.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There just isn&#39;t any training data for this, and so trying to rapidly get to a functioning end-to-end system entirely via code generation didn&#39;t work. I was able to work on the management layer and the dashboard and so on while still debugging the first piece, but it only started working when that first piece was done.&lt;/p&gt;

&lt;p&gt;Could I have set that first piece aside with a mockup, and worked on the rest? Probably, but it was just me not a team and the first piece was the biggest risk. I focussed on eliminating the risk.&lt;/p&gt;

&lt;p&gt;In an engineering team, I think I would approach this with a small team whose job is to sketch out the overall system. It might be entirely senior engineers or at least led by a quite senior engineer, and tasked to identify and quantify risks and to plan out a system. That team could multiply its efforts using LLMs to help generate the more well understood portions of the system.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/391160162182322995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/391160162182322995'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/09/llms-to-blaze-trail.html' title='LLMs to Blaze a Trail'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkYMu9iwt-4D7dLrKbdS3XPVbdR6xuJBj7w9Fl1_UMFF09vUmeYl1EJvUDuWB9pTzkxM6oZ1FUxHR-kAUYHqe4WKb2HwbDpDbObcTrstxNVrnAzx3-mlMeXeu-fvnAxXV-8ixMhT3la9QCA_GWS-tclXXu5VlLFY1797LKJ7dE3OtHKAHylalAvSRVNTDv/s72-c/robo-hacker.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-3438190958594328861</id><published>2025-09-01T05:00:00.000-07:00</published><updated>2025-09-01T20:20:50.635-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><title type='text'>On the Persistence of Human Memory</title><content type='html'>&lt;p&gt;Tell me this looks wrong to you, too.&lt;/p&gt;

&lt;center&gt;&lt;img style=&quot;display: block; padding: 0; text-align: center; &quot; alt=&quot;A screenshot of green Save and red Cancel buttons where the Save button is quite obviously lower on the screen than Cancel&quot; border=&quot;0&quot; data-original-height=&quot;286&quot; data-original-width=&quot;798&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYr8gy85FasDdAF-WZDVaE34t8CRZPHIbrXENccFRFxf42__wglbikQoRo0Qc1pILJC4TL2y3xNIZe9VyLh3QWIiseN-zy6fBYeOx0Qa2kjrnH6RVyLRplQ34bFSOdcLlworVm327kUBO3yLTK5vv259xP6zLqB0ah5wQOjPViVycyfL_hSNMZ4Hr37_tf/s400/buttons.png&quot;/&gt;&lt;/center&gt;

&lt;br/&gt;

&lt;p&gt;Claude Code doesn&#39;t see it. I mean, of course Claude Code doesn&#39;t see it, it has no eyes or other senses. Nonetheless I tried to get Claude Code to fix it by leading it to a solution.&lt;/p&gt;

&lt;pre style=&quot;font-family: monospace; font-size: x-small; line-height: 1.3em; margin-left: 1em; margin-bottom: 1em; padding: 1em; background-color: WhiteSmoke;&quot;&gt;
In frontend/ in the Delivery page, align the Save and Cancel buttons vertically.
&lt;/pre&gt;

&lt;pre style=&quot;font-family: monospace; font-size: x-small; line-height: 1.3em; margin-left: 1em; margin-bottom: 1em; padding: 1em; background-color: WhiteSmoke;&quot;&gt;
In frontend/ in the Delivery page, remove the height property from the Save and Cancel
buttons. Put both buttons inside a div, and set the height of the div to 40px.
&lt;/pre&gt;

&lt;br/&gt;

&lt;p&gt;Neither of these fixed it, because these were not the problem. The actual problem was:&lt;/p&gt;

&lt;pre style=&quot;font-family: monospace; font-size: x-small; line-height: 1.3em; margin-left: 1em; margin-bottom: 1em; padding: 1em; background-color: WhiteSmoke;&quot;&gt;
233 .save-button,
234 .add-button {
235   background-color: #48bb78;
236   &lt;b&gt;margin-top: 1rem;&lt;/b&gt;
237 }
&lt;/pre&gt;

&lt;p&gt;This was leftover from when the button was elsewhere on the page, and not removed when it moved to be next to the Cancel button. Poking around with Chrome&#39;s Developer Tools and looking at the Elements on the page identified it.&lt;/p&gt;

&lt;br/&gt;

&lt;h1&gt;On the Persistence of Human Memory&lt;/h1&gt;
&lt;p&gt;One thing I am finding is that memory of code generated with the help of an LLM fades much more quickly. Some portions of this system were not amenable to getting help from Claude Code &amp;mdash; things which involve low level interoperability with existing and legacy systems. There is no relevant material in the training set, Claude Code could not help in iterative debugging in staring at the errors from the legacy system to figure out what to do next.&lt;/p&gt;

&lt;p&gt;Those portions of the codebase, those developed with blood and sweat and tears, remain clear in my memory. Even months later I can predict how they will be impacted by other changes and what will need to be done.&lt;/p&gt;

&lt;p&gt;That is not true of the portions which the LLM generated. Continuing with the analogy of &lt;a href=&quot;https://codingrelic.geekhold.com/2025/07/vibe-coding-and-wisdom.html&quot;&gt;treating it as an early career developer&lt;/a&gt;, I only reviewed the code I didn&#39;t write it. As with any code review, the memory of how it works fades much more quickly compared with actually digging in to the work.&lt;/p&gt;

&lt;p&gt;(This is better than Claude Code, though, which retains no memory at all of how code has evolved and instead discovers it all afresh at the start of each session).&lt;/p&gt;

&lt;p&gt;Treating an LLM like an early career programming partner can provide large increases in productivity, but it also means that one has less personal recollection of the windy path the code took to get to its current state. One must be able to go spelunking. This isn&#39;t that much different from a codebase which one has worked on over a long period: little detailed memory of specific portions of the code remain, but an overall sense of the codebase is retained much longer.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/3438190958594328861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/3438190958594328861'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/09/on-persistence-of-human-memory.html' title='On the Persistence of Human Memory'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYr8gy85FasDdAF-WZDVaE34t8CRZPHIbrXENccFRFxf42__wglbikQoRo0Qc1pILJC4TL2y3xNIZe9VyLh3QWIiseN-zy6fBYeOx0Qa2kjrnH6RVyLRplQ34bFSOdcLlworVm327kUBO3yLTK5vv259xP6zLqB0ah5wQOjPViVycyfL_hSNMZ4Hr37_tf/s72-c/buttons.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-9151880169490356401.post-5202226337402373054</id><published>2025-08-25T06:00:00.000-07:00</published><updated>2025-08-30T04:00:14.204-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><title type='text'>Claude Code&#39;s 19 cent Parser</title><content type='html'>&lt;p&gt;A brief prompt:&lt;/p&gt;

&lt;pre style=&quot;font-family: monospace; font-size: x-small; line-height: 1.3em; margin-left: 1em; margin-bottom: 1em; padding: 1em; background-color: WhiteSmoke;&quot;&gt;
In authheader.go write a function to parse a SIP WWW-Authenticate header for Digest
authentication. It should return a map[string]string of key:value pairs which are
present. It should handle the case of valueless parameter with no &amp;quot;=&amp;quot; by populating
an empty string in the map.

Write unit tests, including these WWW-Authenticate headers:
1. WWW-Authenticate: Digest algorithm=MD5,realm=&quot;example.com&quot;,nonce=&quot;abcd=&quot;
2. WWW-Authenticate: Digest realm=&quot;example.com&quot;, nonce=&quot;efgh=&quot;, opaque=&quot;1234__&quot;, algorithm=MD5, qop=&quot;auth&quot;
&lt;/pre&gt;

&lt;br/&gt;

&lt;img alt=&quot;A classic hacker stock photo in a darkened room sitting in front of a laptop wearing a hoodie and mask, except the person typing is a robot&quot; style=&quot;display: block; padding-left: 1em; clear: right; float: right;&quot; border=&quot;0&quot; width=&quot;250&quot; data-original-height=&quot;101&quot; data-original-width=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkYMu9iwt-4D7dLrKbdS3XPVbdR6xuJBj7w9Fl1_UMFF09vUmeYl1EJvUDuWB9pTzkxM6oZ1FUxHR-kAUYHqe4WKb2HwbDpDbObcTrstxNVrnAzx3-mlMeXeu-fvnAxXV-8ixMhT3la9QCA_GWS-tclXXu5VlLFY1797LKJ7dE3OtHKAHylalAvSRVNTDv/s400/robo-hacker.jpg&quot;/&gt;

&lt;p&gt;From this, Claude Code generated quite reasonable parsing code for a SIP WWW-Authenticate header. It did this in approximately one minute of wall-clock time at a cost of 19 cents. This is &lt;i&gt;considerably&lt;/i&gt; more quickly and cheaply than I could have produced a similar function.&lt;/p&gt;

&lt;p&gt;I made one manual fix: the string comparison for &amp;quot;Digest&amp;quot; and for parameter field names are supposed to be be case-insensitive, and I added unit tests for it. I hadn&#39;t specified this in the prompt, and Claude Code didn&#39;t figure that out from the mention of SIP.&lt;/p&gt;

&lt;p&gt;I remain of the opinion that vibe coding can be a force multiplier for expertise, not a complete replacement for expertise.&lt;/p&gt;


&lt;br/&gt;&amp;nbsp;&lt;br/&gt;

&lt;h1&gt;Wisdom&lt;/h1&gt;
&lt;p&gt;Returning to an earlier topic: &lt;a href=&quot;https://codingrelic.geekhold.com/2025/07/vibe-coding-and-wisdom.html&quot;&gt;does the code which Claude Code generated exhibit wisdom?&lt;/a&gt; Did it have shortcomings which would be harmful? Claude Code came up with the following test cases, and wrote a Go table-driven test case for them.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;The two I explicitly gave it.&lt;/li&gt;
  &lt;li&gt;Header with valueless parameter&lt;/li&gt;
  &lt;li&gt;Header with unquoted values&lt;/li&gt;
  &lt;li&gt;Empty header&lt;/li&gt;
  &lt;li&gt;Header with comma in quoted value&lt;/li&gt;
  &lt;li&gt;Header with extra spaces&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I looked into the handling of unquoted values. The SIP standard says that fields like &lt;span style=&quot;font-family: monospace; font-size: small; padding: 3px; background-color: Gainsboro;&quot;&gt;algorithm&lt;/span&gt; or &lt;span style=&quot;font-family: monospace; font-size: small; padding: 3px; background-color: Gainsboro;&quot;&gt;qop&lt;/span&gt; which are enumerated in specifications can be left unquoted. What Claude Code generated would allow any field to be unquoted, including arbitrary text strings like &lt;span style=&quot;font-family: monospace; font-size: small; padding: 3px; background-color: Gainsboro;&quot;&gt;realm&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;The spec says these values &lt;b&gt;must&lt;/b&gt; be quoted. Yet there is also the Robustness Principle, to be liberal in what you accept and strict in what you send.&lt;/p&gt;

&lt;br/&gt;&amp;nbsp;&lt;br/&gt;

&lt;h1&gt;Postel&#39;s Law Considered Harmful&lt;/h1&gt;
&lt;p&gt;Nowadays I think this principle has ultimately been more harmful than good. Over time we end up with a protocol which is only partially specified, where real implementations require a neverending series of quirks handling to work around the behaviors of widely deployed yet incorrect implementations which other implementations have liberally accepted. For new protocols I&#39;m a fan of be strict in what you send and &lt;u&gt;strict in what you accept&lt;/u&gt;, to not allow quirks to accumulate. Like barnacles, quirks slow the forward progress over time and tend to cause standrds to bog down and eventually stop even trying to evolve.&lt;/p&gt;

&lt;p&gt;But SIP is ancient. In &lt;i&gt;Internet Years&lt;/i&gt; it is a centennarian. What should one do about SIP? Being strict in what one accepts would lead to a series of relaxations being added during deployment when engineering philosophy meets harsh reality that there are a lot of barely-compliant production services run by vendors far too large to care what some Internet Rando thinks of their implementation.&lt;/p&gt;

&lt;br/&gt;&amp;nbsp;&lt;br/&gt;

&lt;h1&gt;Epilogue&lt;/h1&gt;
&lt;p&gt;I did consider whether to just leave it this way, and allow unquoted strings for all fields. Life is too short to fight the weight of Internet Protocol Inertia... but I couldn&#39;t do it. That would make my little corner of the SIP world be part of the problem. I made it only accept unquoted strings for &lt;span style=&quot;font-family: monospace; font-size: small; padding: 3px; background-color: Gainsboro;&quot;&gt;algorithm&lt;/span&gt; and &lt;span style=&quot;font-family: monospace; font-size: small; padding: 3px; background-color: Gainsboro;&quot;&gt;qop&lt;/span&gt;, the two enumerated fields which my system deals with.&lt;/p&gt;

&lt;pre style=&quot;font-family: monospace; font-size: x-small; line-height: 1.3em; margin-left: 1em; margin-bottom: 1em; padding: 1em; background-color: WhiteSmoke;&quot;&gt;
In authheader.go:parseWWWAuthenticate() fields named “algorithm” or “qop” may be
quoted or unquoted. Any other field name must have its value quoted to be accepted.

In authheader_test.go add test cases:
1. fields named “algorithm” or “qop” may be quoted or unquoted.
2. Any other field name must have its value quoted to be accepted.
&lt;/pre&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/5202226337402373054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9151880169490356401/posts/default/5202226337402373054'/><link rel='alternate' type='text/html' href='http://codingrelic.geekhold.com/2025/08/claude-codes-19-cent-parser.html' title='Claude Code&#39;s 19 cent Parser'/><author><name>Denton Gentry</name><uri>http://www.blogger.com/profile/11782508603268183191</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkYMu9iwt-4D7dLrKbdS3XPVbdR6xuJBj7w9Fl1_UMFF09vUmeYl1EJvUDuWB9pTzkxM6oZ1FUxHR-kAUYHqe4WKb2HwbDpDbObcTrstxNVrnAzx3-mlMeXeu-fvnAxXV-8ixMhT3la9QCA_GWS-tclXXu5VlLFY1797LKJ7dE3OtHKAHylalAvSRVNTDv/s72-c/robo-hacker.jpg" height="72" width="72"/></entry></feed>