<?xml version="1.0" encoding="utf-8" standalone="no"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0"><channel><title>The Daily WTF</title><link>http://thedailywtf.com/</link><description>Curious Perversions in Information Technology</description><lastBuildDate>Wed, 20 May 2026 19:22:27 GMT</lastBuildDate><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Find a Bar for This One</title><link>https://thedailywtf.com/articles/find-a-bar-for-this-one</link><category>CodeSOD</category><pubDate>Wed, 20 May 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/find-a-bar-for-this-one</guid><description>&lt;p&gt;A depressing quantity of software is what I would call a &amp;#34;data pump&amp;#34;. I have some data over here, and I need it over there. Maybe I&amp;#39;m integrating into a legacy app. Or into an &lt;abbr title="Enterprise Resource Planner"&gt;ERP&lt;/abbr&gt;. Or into a 3rd party API. At the end of the day, I have data in one place, and I want it in another place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sally&lt;/strong&gt; has a Java application written in the Quarkus framework, which has a nightly batch that works to keep a table of &lt;code&gt;Bar&lt;/code&gt; entities in sync with a table of &lt;code&gt;Foo&lt;/code&gt; entities. (This anonymization comes from Sally) These exist in the same database. There is also a &lt;code&gt;Bar&lt;/code&gt; webservice, which provides information about the &lt;code&gt;Bar&lt;/code&gt; entities. The workflow, such as it is, is that the software needs to find all of the &lt;code&gt;Foo&lt;/code&gt; entities that do not currently have associated &lt;code&gt;Bar&lt;/code&gt; entities, and then call the &lt;code&gt;Bar&lt;/code&gt; webservice to get the required information to create those &lt;code&gt;Bar&lt;/code&gt; entities.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s see how that works.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;&lt;span class="hljs-meta"&gt;@Inject&lt;/span&gt; UserTransaction transaction
&lt;span class="hljs-comment"&gt;// If this is annotated with @Transaction the usage in the Message function down below will have some Thread exception&lt;/span&gt;
&lt;span class="hljs-keyword"&gt;public&lt;/span&gt; List&amp;lt;FooData&amp;gt; &lt;span class="hljs-title function_"&gt;getAllFoos&lt;/span&gt;&lt;span class="hljs-params"&gt;()&lt;/span&gt; {
  &lt;span class="hljs-keyword"&gt;try&lt;/span&gt;{
    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; fooDataRepository.findAllFoos();
  } &lt;span class="hljs-keyword"&gt;catch&lt;/span&gt; (Exception e) {
    &lt;span class="hljs-keyword"&gt;throw&lt;/span&gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;RuntimeException&lt;/span&gt;(e);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We&amp;#39;ll worry about that comment in a second, but this function returns a list of all of the &lt;code&gt;Foo&lt;/code&gt; objects in the database. It does &lt;em&gt;not&lt;/em&gt; return a list of &lt;em&gt;all the &lt;code&gt;Foo&lt;/code&gt; objects without associated &lt;code&gt;Bar&lt;/code&gt; entities&lt;/em&gt;. It&amp;#39;s just the whole giant list of everything. The underlying database is a standard relational database; it&amp;#39;d be trivially easy to write that query, even going through the &lt;abbr title="Object Relational Mangler"&gt;ORM&lt;/abbr&gt;.&lt;/p&gt;
&lt;p&gt;Well, that&amp;#39;s bad, but it&amp;#39;s all pretty minor. How does the actual update go?&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;&lt;span class="hljs-comment"&gt;// Can&amp;#39;t be annotated with @Transaction because Oracle DB can handle the given Amount of dataEntities in one Transaction &amp;#39;\._./&amp;#39;&lt;/span&gt;
Message &lt;span class="hljs-title function_"&gt;updateBarsWithFoos&lt;/span&gt;&lt;span class="hljs-params"&gt;()&lt;/span&gt; {
  List&amp;lt;FooData&amp;gt; foos = getAllFoos();
  &lt;span class="hljs-keyword"&gt;if&lt;/span&gt;(!foos.isEmpty()){
    foos.forEach(foo -&amp;gt; {
      &lt;span class="hljs-keyword"&gt;try&lt;/span&gt;{
        transaction.begin();
        &lt;span class="hljs-keyword"&gt;if&lt;/span&gt;(barRepository.findByName(foo.getName()) == &lt;span class="hljs-literal"&gt;null&lt;/span&gt;){
          &lt;span class="hljs-keyword"&gt;if&lt;/span&gt;(barDataService.searchByName(foo.getName()) != &lt;span class="hljs-literal"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; barDataService.searchByName(foo.getName()).marker() != &lt;span class="hljs-literal"&gt;null&lt;/span&gt;){
            barRepository.createBar(barDataService.searchByName(foo.getName()));
          }
        }
        transaction.commit();
      } &lt;span class="hljs-keyword"&gt;catch&lt;/span&gt; (Exception e) {
        &lt;span class="hljs-keyword"&gt;try&lt;/span&gt; {
          transaction.rollback();
        } &lt;span class="hljs-keyword"&gt;catch&lt;/span&gt; (Exception ex) {
          &lt;span class="hljs-keyword"&gt;throw&lt;/span&gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;RuntimeException&lt;/span&gt;(ex);
        }
      }
    });
  }
  &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Message&lt;/span&gt;(MessageLevel.INFO, &lt;span class="hljs-string"&gt;&amp;#34;Created bars&amp;#34;&lt;/span&gt;)
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ah, the &lt;em&gt;real&lt;/em&gt; WTF is that it&amp;#39;s an Oracle database. That&amp;#39;s always a WTF.&lt;/p&gt;
&lt;p&gt;But let&amp;#39;s trace through this code.&lt;/p&gt;
&lt;p&gt;We get all of our &lt;code&gt;Foo&lt;/code&gt; entities. We check for emptiness and then do a &lt;code&gt;forEach&lt;/code&gt;, which seems to make the empty check superfluous: a &lt;code&gt;forEach&lt;/code&gt; on an empty list would be a no-op anyway.&lt;/p&gt;
&lt;p&gt;We start a transaction, then check the database: if there are no &lt;code&gt;Bar&lt;/code&gt; objects that link to &lt;code&gt;Foo&lt;/code&gt;, then we call into the &lt;code&gt;barDataService&lt;/code&gt; to find data. If there is, we call into the service &lt;em&gt;again&lt;/em&gt;, to see if the &lt;code&gt;marker&lt;/code&gt; property is not null. If it is, we call into the service &lt;em&gt;again&lt;/em&gt; to get the actual data we&amp;#39;re putting into the database. Then we close the transaction. If anything goes wrong, we rollback the transaction and chuck an exception up the chain.&lt;/p&gt;
&lt;p&gt;That is &lt;em&gt;three&lt;/em&gt; web service calls inside of a database transaction. Three calls which could easily be &lt;em&gt;one&lt;/em&gt;, and that call could easily also happen &lt;em&gt;outside&lt;/em&gt; of a transaction if you&amp;#39;re mindful about confirming your constraints. And of course, because they&amp;#39;re &lt;em&gt;not&lt;/em&gt; mindful at all, they need to manage the transaction directly, and can&amp;#39;t use the &lt;code&gt;@Transaction&lt;/code&gt; annotation provided by their framework, which would at least cut down on some of the boilerplate.&lt;/p&gt;
&lt;p&gt;Now, I&amp;#39;m sure you&amp;#39;ll be shocked - &lt;em&gt;shocked&lt;/em&gt; - to learn that the webservice is actually a bit flaky, and thus times out from time to time. And this isn&amp;#39;t the &lt;em&gt;only&lt;/em&gt; batch job running, which means the long-lived transactions cause all sorts of contention and terrible performance across the various batches. &lt;em&gt;And&lt;/em&gt; this app doesn&amp;#39;t have its connection pool properly configured, so the entire software stack can exhaust all of its database connections surprisingly quickly, causing yet more failures.&lt;/p&gt;
&lt;p&gt;The root of the WTF, of course, is doing this as a batch job. A well engineered application would do everything it could to &lt;em&gt;not&lt;/em&gt; create data in the database that isn&amp;#39;t referentially sound. There, Sally gives us the one bit of good news:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My current project will do away with the batch processing altogether, so we can say, &amp;#34;RIP, transactional wholesale triple caller!&amp;#34;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- Easy Reader Version: Batch jobs are easy to reason about when you're planning them, and impossible to reason about once they've lived in the wild for any amount of time. --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	Keep all your packages and Docker containers in one place, scan for vulnerabilities, and control who can access different feeds. ProGet installs in minutes and has a powerful free version with a lot of great features that you can upgrade when ready.&lt;a href="https://inedo.com/proget?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=PlebsFooter"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>6</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/find-a-bar-for-this-one</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Three Digit Acronyms</title><link>https://thedailywtf.com/articles/three-digit-acronyms</link><category>Feature Articles</category><pubDate>Tue, 19 May 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/three-digit-acronyms</guid><description>&lt;p&gt;&lt;strong&gt;JB&lt;/strong&gt; has a database table that, at first glance, looks like one of those data warehouse tables that exists to make queries performant. You know the sort, the table that contains every date between 1979 and 2050, or every number out to 1,000,000 or something. It looks dumb, but it helps make certain joins and queries performant.&lt;/p&gt;
&lt;p&gt;The database table is called &lt;code&gt;three_alpha_numerics&lt;/code&gt;. It has two columns: &lt;code&gt;digit&lt;/code&gt;, which contains three characters, and &lt;code&gt;is_numeric&lt;/code&gt;, which is a a single character: &amp;#39;Y&amp;#39; or &amp;#39;N&amp;#39;. It looks roughly like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;+-------+------------+
| digit | is_numeric |
+-------+------------+
| 009   | Y          |
+-------+------------+
| 00A   | N          |
+-------+------------+
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So, for example, if you wanted all the possible numeric triples, you could &lt;code&gt;SELECT digit FROM three_alpha_numerics WHERE is_numeric = &amp;#39;Y&amp;#39;&lt;/code&gt;, which is obviously the easiest thing one can imagine.&lt;/p&gt;
&lt;p&gt;So what is this &lt;em&gt;for&lt;/em&gt;? Well, it&amp;#39;s used by a stored procedure that generates unique IDs. That stored procedure does a left join against another table to find all the unused &lt;code&gt;digit&lt;/code&gt;s. And here&amp;#39;s the real gotcha: that stored procedure only ever uses the rows where &lt;code&gt;is_numeric&lt;/code&gt; is &lt;code&gt;Y&lt;/code&gt;, meaning the vast majority of the data in this table is never used.&lt;/p&gt;
&lt;p&gt;Unique IDs, of course, are an incredibly difficult task for databases to do, so it absolutely makes sense that we create a system that allows us to only have 1,000 unique IDs. That&amp;#39;s more than 640, which should be enough for anyone. Having many thousands of unusable alphanumeric triplets is just the cost we have to pay.&lt;/p&gt;
&lt;!-- Easy Reader Version: Three digits you shall meet: https://www.youtube.com/watch?v=Hk9uevsHvAE&amp;list=RDHk9uevsHvAE&amp;start_radio=1&amp;pp=ygUVdGhlIHN3b3JkIHRyZXMgYnJ1amFzoAcB --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/buildmaster-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	&lt;a href="https://inedo.com/BuildMaster?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Self_Service&amp;amp;utm_campaign=Buildmaster_Footer"&gt;BuildMaster&lt;/a&gt; allows you to create a self-service release management platform that allows different teams to manage their applications. &lt;a href="https://inedo.com/BuildMaster/download?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Self_Service&amp;amp;utm_campaign=Buildmaster_Footer"&gt;Explore how!&lt;/a&gt; 
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>13</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/three-digit-acronyms</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Representative Line: Dating Backwards</title><link>https://thedailywtf.com/articles/dating-backwards</link><category>Representative Line</category><pubDate>Mon, 18 May 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/dating-backwards</guid><description>&lt;p&gt;Another representative line, and this one comes from an Excel spreadsheet. But, per Remy&amp;#39;s Law of Requirements gathering (&amp;#34;No matter what the requirements doc says, what your users wanted was Excel&amp;#34;), this one was actually written by a developer. A developer who didn&amp;#39;t understand how Excel works, but more important, didn&amp;#39;t understand how dates worked either.&lt;/p&gt;
&lt;p&gt;This comes from &lt;strong&gt;Ulysse J&lt;/strong&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;=CONCATENER(SI(MOIS($A18)&amp;gt;9;ANNEE($A18)-2000;(ANNEE($A18)-2000)*10);SI(JOUR($A18)&amp;gt;9;MOIS($A18);MOIS($A18)*10);JOUR($A18))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, the first thing: Excel function names are locale specific. This was written in France, so the functions are French. &lt;code&gt;CONCATENER&lt;/code&gt; is &amp;#34;concatenate&amp;#34;, &lt;code&gt;SI&lt;/code&gt; is &amp;#34;if&amp;#34;, &lt;code&gt;MOIS&lt;/code&gt; is &amp;#34;month&amp;#34;, and so on.&lt;/p&gt;
&lt;p&gt;The purpose of this function is to convert a field (cell &lt;code&gt;A18&lt;/code&gt;) in &lt;code&gt;DD/MM/YYYY&lt;/code&gt; into &lt;code&gt;YYMMDD&lt;/code&gt;. So how does it do this?&lt;/p&gt;
&lt;p&gt;Well, we check the month. If it&amp;#39;s greater than 9, we output the year minus 2000. If it&amp;#39;s less than 9, then, we output the year minus 2000, multiplied by 10. That is to say, August, 2026 would start by outputting &lt;code&gt;260&lt;/code&gt;. We repeat this logic for the days: if the day is larger than 9, we output the month, otherwise we output the month times 10. Finally, we output the day.&lt;/p&gt;
&lt;p&gt;This is attempting to do padding. There&amp;#39;s just a problem. Imagine February 1st, 2009- an actual date in the document. We convert the year into 90, the month into 20, rendering the date as &lt;code&gt;90210&lt;/code&gt;. That&amp;#39;s incorrect. And once we get to 2100, if there is still an Excel in 2100 (I joke: of course Excel will still exist in 2100. Humanity won&amp;#39;t, but the robots will use Excel), this will also break. Not that it matters- I mean, &lt;code&gt;YYMMDD&lt;/code&gt; doesn&amp;#39;t make sense by that point.&lt;/p&gt;
&lt;p&gt;Obviously, the correct solution is to use Excel&amp;#39;s rich, built-in formatting functions to convert between date formats. It&amp;#39;s easy! But Ulysse raises another point:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Extra points: even if you do not know how to do proper [formatting], the input format is guaranteed to have correct padding. I would just concatenate parts of it (treating dates as text is bad, but still less bad than treating them as integer triplets).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I will say this: I know a software developer wrote this, because your average Excel user could easily write bad formulas, but never bad in this kind of convoluted way. You need a real expert to do something this bad.&lt;/p&gt;
&lt;!-- Easy Reader Version: The real question is: will Excel outlive COBOL? My money is on COBOL, honestly --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	ProGet’s got you covered with security and access controls on your NuGet feeds. &lt;a href="https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=GotYouCoveredFooter&amp;amp;utm_campaign=Cyclops2020"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>36</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/dating-backwards</wfw:comment></item><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: Balmenach Bad Gateway Single Malt</title><link>https://thedailywtf.com/articles/balmenach-bad-gateway-single-malt</link><category>Error'd</category><pubDate>Fri, 15 May 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/balmenach-bad-gateway-single-malt</guid><description>&lt;p&gt;&amp;#34;Winner ad placement!&amp;#34; snarked our 
&lt;strong&gt;Peter G.&lt;/strong&gt;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#cc79d61a927848f48b2a41988ebf8c5d"&gt;&lt;img itemprop="image" border="0" alt="cc79d61a927848f48b2a41988ebf8c5d" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/05/14/cc79d61a927848f48b2a41988ebf8c5d.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Errors on this website are always a shoo-in for the weekly column.
An anonymous reader wrote 
&amp;#34;I got error 500 when I tried to submit an
Error&amp;#39;d. Please make the file uploader check if the attached
file is within the file upload limit, which I think
is less than 4 MB.&amp;#34; They shared an audio error&amp;#39;d which may be coming along next week.
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#fec797b9fc3642a5b940675292dc764e"&gt;&lt;img itemprop="image" border="0" alt="fec797b9fc3642a5b940675292dc764e" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/05/14/fec797b9fc3642a5b940675292dc764e.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&amp;#34;Give us feedback - wait, did it work at all?&amp;#34; confused poor
&lt;strong&gt;I_Absolutely_Want_To_Give F.&lt;/strong&gt;
&amp;#34;As every good service management company, ServiceNow wants feedback, above
all.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#3d6b7629ef5a4c90bafa3f2e6a21f663"&gt;&lt;img itemprop="image" border="0" alt="3d6b7629ef5a4c90bafa3f2e6a21f663" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/05/14/3d6b7629ef5a4c90bafa3f2e6a21f663.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&amp;#34;0 minutes does not equal 0 seconds...&amp;#34; sagely summarized
&lt;strong&gt;Daniel D.&lt;/strong&gt;
&amp;#34;Claude like floors. I mean floor. But maybe ceil would
be better applicable to this calculation, right?&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#76dd1834b8394e5ebca32229fa87fb7e"&gt;&lt;img itemprop="image" border="0" alt="76dd1834b8394e5ebca32229fa87fb7e" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/05/14/76dd1834b8394e5ebca32229fa87fb7e.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Finally, this one is a real novelty, 
from
&lt;strong&gt;Adam R.&lt;/strong&gt;
Is the label actually 27
years old?  It certainly could be; Error 502 is a good bit older. But I think this would be our &lt;em&gt;oldest&lt;/em&gt; Error&amp;#39;d yet. Adam explained:
&amp;#34;This appears to be a real auction for a whiskey
bottle whose label does, in fact, say Error 502 Bad
Gateway on it. The winning bid: £130. Source: https://www.scotchwhiskyauctions.com/auctions/228-the-179th-auction/876095-balmenach-1998-27-year-old-error-502-bad-gateway-thompson-bros/&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#1f77b40a37f24eabbac33a8de3aee9a7"&gt;&lt;img itemprop="image" border="0" alt="1f77b40a37f24eabbac33a8de3aee9a7" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/05/14/1f77b40a37f24eabbac33a8de3aee9a7.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;div&gt;
	[Advertisement] Picking up &lt;b&gt;NuGet&lt;/b&gt; is easy. Getting good at it takes time. &lt;a href="https://inedo.com/support/whitepapers/nuget-guide?utm_source=tdwtf&amp;amp;utm_medium=Footerad&amp;amp;utm_campaign=nuget"&gt;Download our guide to learn the best practice of NuGet for the Enterprise.&lt;/a&gt;

&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;</description><slash:comments>11</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/balmenach-bad-gateway-single-malt</wfw:comment></item><item><dc:creator>Ellis Morning</dc:creator><title>The Pride Goeth</title><link>https://thedailywtf.com/articles/the-pride-goeth</link><category>Feature Articles</category><pubDate>Thu, 14 May 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/the-pride-goeth</guid><description>&lt;p&gt;&lt;b&gt;Janči,&lt;/b&gt; a master&amp;#39;s student of bioinformatics, was seated near the back of a large classroom. This was a simple compulsory elective course geared toward biologists. The professor was currently walking the class through their latest assignment. &amp;#34;We&amp;#39;ll need to connect to some Linux servers,&amp;#34; he announced.&lt;/p&gt;

&lt;p&gt;The other students seated nearby traded blank stares. They were all Mac and Windows users with no IT background. Meanwhile Janči, a veteran Linux user, started feeling a little smug. An easy A was at hand.&lt;/p&gt;

&lt;p style="float:right; padding-left:10px; padding-bottom:10px;"&gt;&lt;a title="The Portable Antiquities Scheme/ The Trustees of the British Museum, CC BY-SA 2.0 &amp;lt;https://creativecommons.org/licenses/by-sa/2.0&amp;gt;, via Wikimedia Commons" href="https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Roman_key_%28FindID_519853%29.jpg/960px-Roman_key_%28FindID_519853%29.jpg"&gt;&lt;img itemprop="image" width="300" alt="Roman key (FindID 519853)" src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Roman_key_%28FindID_519853%29.jpg/960px-Roman_key_%28FindID_519853%29.jpg"/&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&amp;#34;First,&amp;#34; the professor continued, &amp;#34;you&amp;#39;ll need a private key.&amp;#34;&lt;/p&gt;

&lt;p&gt;After the professor had explained a few details, the first WTF came in the form of a bulk email sent to the entire class. The private key was attached. The username was the email address it was sent to.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;What do you call the exact opposite of a private key?&lt;/i&gt; Janči wondered, bemused.&lt;/p&gt;

&lt;p&gt;&amp;#34;You&amp;#39;ll also need to download an application to help you log in,&amp;#34; the professor said. &amp;#34;I recommend MobaXterm.&amp;#34;&lt;/p&gt;

&lt;p&gt;As he detailed the process of visiting the SSH client website to download the software, Janči tuned out. He didn&amp;#39;t need such hand-holding. He accessed OpenSSH, tried connecting ... &lt;/p&gt;

&lt;p&gt;... and failed.&lt;/p&gt;

&lt;p&gt;Meanwhile, everyone around him was logging in no problem.&lt;/p&gt;

&lt;p&gt;Janči&amp;#39;s face burned with embarrassment at this second WTF. His first instinct was to blame the deprecated cryptography of the server. He spent most of the remaining lecture time searching for a way to allow his SSH to use SSH-DSS. (It turned out to be supported the whole time, despite the warnings he received.)&lt;/p&gt;

&lt;p&gt;Janči then tried to re-download the &amp;#34;private&amp;#34; key and adjust the SSH config file several times. He cycled through different possible usernames associated with his university email account.&lt;/p&gt;

&lt;p&gt;No dice.&lt;/p&gt;

&lt;p&gt;He was the only person in the class who hadn&amp;#39;t yet logged into the server. Not even the professor was able to help him, since he was using Linux.&lt;/p&gt;

&lt;p&gt;Embarrassment and frustration mounted. An hour later, out of ideas, Janči fell back to downloading  MobaXterm and running it inside Wine.&lt;/p&gt;

&lt;p&gt;It didn&amp;#39;t work.&lt;/p&gt; 

&lt;p&gt;The professor offered him a spare Windows box. &amp;#34;Here, try this one.&amp;#34;&lt;/p&gt;

&lt;p&gt;Janči booted it up, copied the &amp;#34;private&amp;#34; key to the new machine ... &lt;i&gt;and still couldn&amp;#39;t sign in.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Now, this was getting suspicious.&lt;/p&gt;

&lt;p&gt;The lecture ended. A friend of Janči&amp;#39;s hung back while the rest of the students filed out. &amp;#34;Why don&amp;#39;t you try logging in with my credentials instead of yours?&amp;#34; she asked.&lt;/p&gt;

&lt;p&gt;Janči was up for anything at that point.&lt;/p&gt;

&lt;p&gt;It worked. On his own machine, on the Windows box, everywhere.&lt;/p&gt;

&lt;p&gt;With that lead in mind, Janči opened the server&amp;#39;s &lt;code&gt;/etc/passwd&lt;/code&gt; file to look at all the usernames. He noticed that, unlike everyone else, his username and email address didn&amp;#39;t match.&lt;/p&gt;

&lt;p&gt;His university used Microsoft emails. Everyone had several address aliases, and they could also use whatever email address they liked in the system, even a personal one.&lt;/p&gt;

&lt;p&gt;Janči had chosen to use a school email in the form of &lt;code&gt;&amp;lt;number&amp;gt;@uni.uni&lt;/code&gt;. Unfortunately, the Ubuntu server didn&amp;#39;t like the idea of user being named just &lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;, so it had renamed it to &lt;code&gt;user&amp;lt;number&amp;gt;&lt;/code&gt;. Some script for generating SSH configuration had probably failed from there, because Janči also discovered that his user home directory was missing a &lt;code&gt;.ssh&lt;/code&gt; directory and &lt;code&gt;known_hosts&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Unfortunately, due to restricted access, he wasn&amp;#39;t able to copy them from any of his classmates. In the end, he could connect to the server as any of his classmates, but not as himself.&lt;/p&gt;&lt;div&gt;
	[Advertisement] Picking up &lt;b&gt;NuGet&lt;/b&gt; is easy. Getting good at it takes time. &lt;a href="https://inedo.com/support/whitepapers/nuget-guide?utm_source=tdwtf&amp;amp;utm_medium=Footerad&amp;amp;utm_campaign=nuget"&gt;Download our guide to learn the best practice of NuGet for the Enterprise.&lt;/a&gt;

&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;</description><slash:comments>23</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/the-pride-goeth</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Over and Under Reaction</title><link>https://thedailywtf.com/articles/over-and-under-reaction</link><category>CodeSOD</category><pubDate>Wed, 13 May 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/over-and-under-reaction</guid><description>&lt;p&gt;Today&amp;#39;s anonymous submitter sends us two blocks. The first is a perfectly normal line of React code:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; [width, setWidth] = &lt;span class="hljs-title function_"&gt;useState&lt;/span&gt;(&lt;span class="hljs-literal"&gt;false&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This creates a &lt;code&gt;width&lt;/code&gt; variable, defaulting it to &lt;code&gt;false&lt;/code&gt;, and a &lt;code&gt;setWidth&lt;/code&gt; function, which lets React detect when you change the variable, and trigger a re-render. Importantly, this mutation only happens &lt;em&gt;on the next render&lt;/em&gt;, which means if you call &lt;code&gt;setWidth&lt;/code&gt; and then check &lt;code&gt;width&lt;/code&gt;, you won&amp;#39;t see your change happen.&lt;/p&gt;
&lt;p&gt;As I said, this is perfectly normal React code. Well, almost. First, I have to ask: why on Earth is &lt;code&gt;width&lt;/code&gt; being set to a boolean value? &amp;#34;How wide are you?&amp;#34; &amp;#34;Yes.&amp;#34; It&amp;#39;s possible that there&amp;#39;s a good reason for this, though I suspect that it&amp;#39;s unlikely.&lt;/p&gt;
&lt;p&gt;The second issue, however, is that the linter complained that the setter was never actually used. That was odd, because if our submitter grepped the codebase, there were two calls to &lt;code&gt;setWidth&lt;/code&gt;. Let&amp;#39;s see what that looked like:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; &lt;span class="hljs-title function_"&gt;show&lt;/span&gt; = (&lt;span class="hljs-params"&gt;show&lt;/span&gt;) =&amp;gt; {
    &lt;span class="hljs-title function_"&gt;setWidth&lt;/span&gt;(show)
    &lt;span class="hljs-title function_"&gt;setWidth&lt;/span&gt;(!show)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We create a function show, where we expect a boolean value, and then we &lt;code&gt;setWidth&lt;/code&gt; with that value, &lt;em&gt;and then&lt;/em&gt; with the negation of that value. So &lt;code&gt;show(true)&lt;/code&gt; will set width to be false. To make matters more confusing, we set width both ways, and I assume this is someone trying to get around React&amp;#39;s state management. React won&amp;#39;t trigger a re-render if you set the state to a value it already has. So I suspect they&amp;#39;re twiddling to try and force it to re-render, and I also suspect that this might not work? Even if it does, &lt;em&gt;this isn&amp;#39;t how you should be using React&lt;/em&gt;. As I said, I&amp;#39;m no React expert, but as the saying goes: &amp;#34;I don&amp;#39;t have to be a helicopter pilot to know that when I see a helicopter hanging upside down from a tree &lt;em&gt;someone&lt;/em&gt; messed up.&amp;#34;&lt;/p&gt;
&lt;p&gt;Our submitter writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Got hired to cleanup a mission critical website for a company that had just learned that offshore teams might not be worth the cost saving measures.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;#34;Pay me now or pay me later.&amp;#34;&lt;/p&gt;
&lt;!-- Easy Reader Version: While I don't hate react's general philosophy, I do hate the fact that we're layering this entire paradigm on top of an engine that absolutely does not lend itself to this model. I continue to think web development is just hopelessly broken. --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	ProGet’s got you covered with security and access controls on your NuGet feeds. &lt;a href="https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=GotYouCoveredFooter&amp;amp;utm_campaign=Cyclops2020"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>15</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/over-and-under-reaction</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Representative Line: Underscore Its Unimportance</title><link>https://thedailywtf.com/articles/underscore-its-unimportance</link><category>Representative Line</category><pubDate>Tue, 12 May 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/underscore-its-unimportance</guid><description>&lt;p&gt;Frequent submitter &lt;strong&gt;Argle&lt;/strong&gt; (&lt;a href="https://duckduckgo.com/?ia=web&amp;amp;origin=funnel_home_website_homepagerebrandingnew_variantiii&amp;amp;t=h_&amp;amp;q=site%3Athedailywtf.com+argle&amp;amp;chip-select=search"&gt;previously&lt;/a&gt;), sends us a short little representative line. The &lt;em&gt;good&lt;/em&gt; news is that this line of code came across Argle&amp;#39;s screen during a code review: it was &lt;em&gt;being removed&lt;/em&gt;. The bad news is that it was sitting in the code base for ages.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;_ = len / &lt;span class="hljs-number"&gt;8.0f&lt;/span&gt;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Argle writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In a code review today. A co-worker wisely removed the line. Dunno the logic that made anyone write it in the first place.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is C#, though it could be basically any language. Using &lt;code&gt;_&lt;/code&gt; is one of those little conventions that we use to tell the linter to ignore the fact that this variable isn&amp;#39;t used. And this variable &lt;em&gt;was not&lt;/em&gt; being used. Of course, in addition to being unused, it&amp;#39;s also a puzzle: where does the &lt;code&gt;8.0f&lt;/code&gt; come from? No one knows. Why would we even want the length divided by eight? No one knows. There&amp;#39;s nothing about this code that gives any indication that it was a meaningful operation at any point.&lt;/p&gt;
&lt;p&gt;No one knows what it does, or why it was there in the first place, but someone put the time into making sure the linter didn&amp;#39;t complain about its uselessness by using &lt;code&gt;_&lt;/code&gt; as the variable.&lt;/p&gt;
&lt;!-- Easy Reader Version: I actually don't love the `_` convention, especially because when you hop between languages, you may have named useless variables, like `_foo`, for a parameter you accept because of the function contract, but don't expect to use. But *some* languages (C++) have strong opinions about naming variables with leading underscores. --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	Keep all your packages and Docker containers in one place, scan for vulnerabilities, and control who can access different feeds. ProGet installs in minutes and has a powerful free version with a lot of great features that you can upgrade when ready.&lt;a href="https://inedo.com/proget?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=PlebsFooter"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>23</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/underscore-its-unimportance</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Representative Line: A Solid Reference</title><link>https://thedailywtf.com/articles/a-solid-reference</link><category>Representative Line</category><pubDate>Mon, 11 May 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/a-solid-reference</guid><description>&lt;p&gt;Today&amp;#39;s anonymous submitter works for a large company. It&amp;#39;s one of those sorts of companies which has piles, and piles, and piles of paperwork and bureaucracy. It also means that much of their portfolio of software is basic &lt;abbr title="Create/Read/Update/Delete"&gt;CRUD&lt;/abbr&gt; applications. &amp;#34;Here&amp;#39;s a database for managing invoices.&amp;#34; &amp;#34;Here&amp;#39;s a database for managing desk assignments.&amp;#34; &amp;#34;Here&amp;#39;s a pile of databases which link our legacy applications to our new ERP system.&amp;#34;&lt;/p&gt;
&lt;p&gt;Which brings us to our representative line. It is not a representative line of code, but a representative line of the design specification. This is the design specification for &lt;em&gt;yet another&lt;/em&gt; database-driven application.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;7.7 REFERENTIAL INTEGRITY CONSTRAINTS
Referential integrity constraints are not applicable for [REDACTED] Application.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Upon seeing this, our submitter predicted that they&amp;#39;d be having a lot of TDWTF submissions in their future.&lt;/p&gt;
&lt;p&gt;The worst part? This isn&amp;#39;t the only time this has been included in the design spec. Several database driven applications have had this line in their spec. No one is able to explain exactly &lt;em&gt;why&lt;/em&gt; referential integrity constraints are not applicable. At best, there are a few batch jobs that don&amp;#39;t define a schema themselves, though they need to comply with it. Maybe someone is just copying and pasting from an old design spec and hoping no one notices or cares?&lt;/p&gt;
&lt;p&gt;Good news: it&amp;#39;s likely that no one will notice, or care. At least not until something breaks in production.&lt;/p&gt;
&lt;!-- Easy Reader Version: All this time, I've been designing software to work, not realizing I could have been just including in my design specs, "this won't actually be usable". What a fool I've been! --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	ProGet’s got you covered with security and access controls on your NuGet feeds. &lt;a href="https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=GotYouCoveredFooter&amp;amp;utm_campaign=Cyclops2020"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>10</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/a-solid-reference</wfw:comment></item><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: Null Null Null </title><link>https://thedailywtf.com/articles/null-null-null</link><category>Error'd</category><pubDate>Fri, 08 May 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/null-null-null</guid><description>&lt;p&gt;
The single most common category of entries for this column is failed handling  of NaN, null and undefined.  Almost exclusively from javascript in web pages, sometimes in node servers, and almost never any other languages or frameworks. They&amp;#39;re getting a bit repetitive but it&amp;#39;s our solemn duty to call out failure where we find it.  So if you send us one of these, make sure it identifies the source!
&lt;/p&gt;


&lt;p&gt;
&amp;#34;If you want something you&amp;#39;ve never had, do something you&amp;#39;ve
never done&amp;#34; exhorted 
&lt;strong&gt;Ben&lt;/strong&gt;.
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#15d2acdeb1844f2fb6dcd79699dee683"&gt;&lt;img itemprop="image" border="0" alt="15d2acdeb1844f2fb6dcd79699dee683" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/05/07/15d2acdeb1844f2fb6dcd79699dee683.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&amp;#34;Dashed Hope for Jennifer Null,&amp;#34; titled an entry from 
&lt;strong&gt;some guy&lt;/strong&gt;[sic].  
&amp;#34;As recently linked from TDWTF article &amp;#34;Not for Nullthing&amp;#34;, not
only names can break computer systems, but also article content.&amp;#34;
 Stretching, but we&amp;#39;ll allow it.
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#5d69cd67830c4a3789e96f556bb542bf"&gt;&lt;img itemprop="image" border="0" alt="5d69cd67830c4a3789e96f556bb542bf" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/05/07/5d69cd67830c4a3789e96f556bb542bf.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;Where does Batman go on holiday?&amp;#34; asked  
&lt;strong&gt;Morgan&lt;/strong&gt;.
&amp;#34;Nananananana... Nowhere!&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#15345eee6a7d4fe383cecf5cb74d1aa2"&gt;&lt;img itemprop="image" border="0" alt="15345eee6a7d4fe383cecf5cb74d1aa2" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/05/07/15345eee6a7d4fe383cecf5cb74d1aa2.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;UBER is ready for driverless vehicles...&amp;#34;
&lt;strong&gt;Bruce C.&lt;/strong&gt;
&amp;#34;Uber is getting so big, they can&amp;#39;t even keep track
of their driver&amp;#39;s names.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#30fbd331dde44f639735138146d97f51"&gt;&lt;img itemprop="image" border="0" alt="30fbd331dde44f639735138146d97f51" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/05/07/30fbd331dde44f639735138146d97f51.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;Well at least the reason wasn&amp;#39;t null or NaN,&amp;#34; wrote
&lt;strong&gt;Steve W.&lt;/strong&gt; regarding CenturyLink.
&amp;#34;I&amp;#39;ve been trying for weeks to use their web page
to change my (incorrect billing address). Such progress.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#eb3472b715ab4124896b37d7ca47eaec"&gt;&lt;img itemprop="image" border="0" alt="eb3472b715ab4124896b37d7ca47eaec" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/05/07/eb3472b715ab4124896b37d7ca47eaec.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Additional entries on the topic from
&lt;br/&gt;&lt;strong&gt;Dan
&lt;/strong&gt;: &amp;#34;we&amp;#39;re fresh out of null&amp;#34;
&lt;br/&gt;&lt;strong&gt;Henrik
&lt;/strong&gt;: &amp;#34;What is this null music streaming service&amp;#34;
&lt;br/&gt;&lt;strong&gt;Mike
&lt;/strong&gt;: &amp;#34;Name: undefined&amp;#34;
&lt;br/&gt;&lt;strong&gt;Laks
&lt;/strong&gt;: &amp;#34;In this app, every new user defaults to a nullptr.&amp;#34;
&lt;br/&gt;
and
&lt;br/&gt;&lt;strong&gt;Jim
&lt;/strong&gt;: &amp;#34;Think I&amp;#39;ll buy $NaCar with this refund!&amp;#34;
&lt;br/&gt; and many others were all appreciated and noted.

&lt;/p&gt;&lt;div&gt;
	[Advertisement] Picking up &lt;b&gt;NuGet&lt;/b&gt; is easy. Getting good at it takes time. &lt;a href="https://inedo.com/support/whitepapers/nuget-guide?utm_source=tdwtf&amp;amp;utm_medium=Footerad&amp;amp;utm_campaign=nuget"&gt;Download our guide to learn the best practice of NuGet for the Enterprise.&lt;/a&gt;

&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;</description><slash:comments>10</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/null-null-null</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Failing to Fail</title><link>https://thedailywtf.com/articles/failing-to-fail</link><category>CodeSOD</category><pubDate>Thu, 07 May 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/failing-to-fail</guid><description>&lt;p&gt;&lt;strong&gt;Russell F&lt;/strong&gt; (&lt;a href="https://thedailywtf.com/articles/modus-pwned"&gt;previously&lt;/a&gt;) sends us a small one today. It&amp;#39;s not just a representative line, it&amp;#39;s a representative comment. More than that, it&amp;#39;s a true confession. Russell wrote some code, you see, and the logic was confusing. So, a co-worker added a comment to explain what the code was doing:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#39;This is *supposed* to fail. If it fails to fail, it throws a failure message
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Russell writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have to confess that this one is my fault. The comment was added by one of my coworkers to clarify what I was doing, and made me realize how stupid I&amp;#39;d been.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;#34;Failing to plan is planning to fail&amp;#34; becomes &amp;#34;failing to fail is failure message&amp;#34;.&lt;/p&gt;
&lt;!-- Easy Reader Version: Task failed successfully --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/buildmaster-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	&lt;a href="https://inedo.com/BuildMaster?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Confidence&amp;amp;utm_campaign=Buildmaster_Footer"&gt;Utilize BuildMaster&lt;/a&gt; to release your software with confidence, at the pace your business demands. &lt;a href="https://inedo.com/BuildMaster/download?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Confidence&amp;amp;utm_campaign=Buildmaster_Footer"&gt;Download&lt;/a&gt; today!  
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>14</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/failing-to-fail</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Please Find, Rewind</title><link>https://thedailywtf.com/articles/please-find-rewind</link><category>CodeSOD</category><pubDate>Wed, 06 May 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/please-find-rewind</guid><description>&lt;p&gt;As &lt;a href="https://thedailywtf.com/articles/non-cogito-ergo-c-str"&gt;previously discussed&lt;/a&gt;, C++ took a surprisingly long time to get a &amp;#34;starts with&amp;#34; function for strings. It took even longer to get a function called &amp;#34;contains&amp;#34;. In part, that&amp;#39;s simply because &lt;code&gt;string::find&lt;/code&gt; solves that problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nancy&lt;/strong&gt; sends us a… different approach to solving this problem.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-cpp"&gt;&lt;span class="hljs-function"&gt;&lt;span class="hljs-type"&gt;bool&lt;/span&gt; &lt;span class="hljs-title"&gt;substringInString&lt;/span&gt;&lt;span class="hljs-params"&gt;(string str, string::iterator &amp;amp;it)&lt;/span&gt;
&lt;/span&gt;{
  string tmp;
  &lt;span class="hljs-type"&gt;bool&lt;/span&gt; result = &lt;span class="hljs-literal"&gt;false&lt;/span&gt;;
  &lt;span class="hljs-type"&gt;int&lt;/span&gt; size = str.&lt;span class="hljs-built_in"&gt;length&lt;/span&gt;();

  &lt;span class="hljs-type"&gt;int&lt;/span&gt; count = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
  &lt;span class="hljs-keyword"&gt;while&lt;/span&gt; (count &amp;lt; size)
  {
    tmp += *it;
    it++;
    count++;
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (tmp.&lt;span class="hljs-built_in"&gt;find&lt;/span&gt;(str) != string::npos)
    {
      result = &lt;span class="hljs-literal"&gt;true&lt;/span&gt;;
      it -= size;
      &lt;span class="hljs-keyword"&gt;break&lt;/span&gt;;
    }
  }

  &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; ( !result)
  {
    it -= size;
  }

  &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; result;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This function iterates across a string, character by character. In this iteration, we copy one character at a time into &lt;code&gt;tmp&lt;/code&gt;. Then we see if &lt;code&gt;tmp&lt;/code&gt; contains our search &lt;code&gt;str&lt;/code&gt;. If it does, we break out of the loop after rewinding the iterator. Outside of the loop, we check if we found the substring, and if we did, we rewind the iterator. Then we return true or false based on whether on not we found the substring.&lt;/p&gt;
&lt;p&gt;So wait a second. &lt;code&gt;str&lt;/code&gt; is our search string. &lt;code&gt;it&lt;/code&gt; is where we&amp;#39;re searching. And we copy from &lt;code&gt;it&lt;/code&gt; up to our search string&amp;#39;s &lt;code&gt;length&lt;/code&gt; into a temporary string. We then do a &lt;code&gt;find&lt;/code&gt; in that temporary string- hey! This is just a &lt;code&gt;startsWith&lt;/code&gt; check written in the most insane way possible.&lt;/p&gt;
&lt;p&gt;Why even bother with the while loop? While &lt;code&gt;tmp&lt;/code&gt; is shorter than the search string, the answer is always &amp;#34;no, we haven&amp;#39;t found it&amp;#34;. And the developers knew that- that&amp;#39;s why they always rewind &lt;code&gt;size&lt;/code&gt; characters on the iterator. They&amp;#39;re always searching exactly that many characters. Of course, since we &lt;em&gt;always&lt;/em&gt; rewind the same amount, we can also just move the &lt;code&gt;it -= size&lt;/code&gt; statement out of the loop and out of the &lt;code&gt;if&lt;/code&gt; statement and do it once.&lt;/p&gt;
&lt;p&gt;Nancy calls this &amp;#34;a little gem&amp;#34; in a &amp;#34;large codebase&amp;#34;. Yeah, &lt;a href="https://classicgems.net/gem_francevillite.htm"&gt;a real gem&lt;/a&gt;.&lt;/p&gt;
&lt;!-- Easy Reader Version: Undoing the operation you do in the function is a *kind* of constness. --&gt;&lt;div&gt;
	[Advertisement] &lt;b&gt;Plan Your .NET 9 Migration with Confidence&lt;/b&gt;&lt;br/&gt;Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. &lt;b&gt;&lt;a href="https://inedo.com/support/whitepapers/dotnet-guide?utm_campaign=dotnet&amp;amp;utm_source=tdwtf-footer"&gt;Download Free Guide Now!&lt;/a&gt;&lt;/b&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;</description><slash:comments>15</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/please-find-rewind</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Not for Nullthing</title><link>https://thedailywtf.com/articles/not-for-nullthing</link><category>CodeSOD</category><pubDate>Tue, 05 May 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/not-for-nullthing</guid><description>&lt;p&gt;Today&amp;#39;s anonymous submitter sends us some code that just makes your mind go… blank when you look at it.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;	&lt;span class="hljs-keyword"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword"&gt;static&lt;/span&gt; &lt;span class="hljs-type"&gt;boolean&lt;/span&gt; &lt;span class="hljs-title function_"&gt;isNull&lt;/span&gt;&lt;span class="hljs-params"&gt;(String value)&lt;/span&gt; {
		&lt;span class="hljs-keyword"&gt;return&lt;/span&gt; StringUtils.isBlank(value);
	}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;StringUtils.isBlank&lt;/code&gt; comes from the Apache Commons library. It&amp;#39;s a helper function for Java which returns true if a string is, well, &lt;em&gt;blank&lt;/em&gt;. &amp;#34;Blank&amp;#34; in this case is: empty, null, or only whitespace. So it&amp;#39;s important to note that &lt;code&gt;isBlank&lt;/code&gt; may return &lt;code&gt;true&lt;/code&gt; on a &lt;code&gt;null&lt;/code&gt;, but it &lt;em&gt;isn&amp;#39;t&lt;/em&gt; truly a null-check, so wrapping it in &lt;code&gt;isNull&lt;/code&gt; is just confusing.&lt;/p&gt;
&lt;p&gt;But imagine I&amp;#39;ve got another problem. Let&amp;#39;s say I have a database that&amp;#39;s been poorly normalized and maintained. And so I have a bunch of fields that maybe are &lt;code&gt;null&lt;/code&gt;, but some also maybe contain the &lt;em&gt;string&lt;/em&gt; &lt;code&gt;&amp;#34;null&amp;#34;&lt;/code&gt;. What am I going to do then? I need another function.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;	&lt;span class="hljs-keyword"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword"&gt;static&lt;/span&gt; &lt;span class="hljs-type"&gt;boolean&lt;/span&gt; &lt;span class="hljs-title function_"&gt;isNullAndNull&lt;/span&gt;&lt;span class="hljs-params"&gt;(String value)&lt;/span&gt; {
		&lt;span class="hljs-keyword"&gt;return&lt;/span&gt; isNull(value) &amp;amp;&amp;amp; &lt;span class="hljs-string"&gt;&amp;#34;null&amp;#34;&lt;/span&gt;.equalsIgnoreCase(value);
	}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ah yes, &lt;code&gt;isNullAndNull&lt;/code&gt;, the clearest and easiest name I could imagine for this. It tells me exactly what the function is checking: is it null, and is it also null? We add a second check to our &lt;code&gt;isNull&lt;/code&gt; call- we check if the input value matches the string &lt;code&gt;&amp;#34;null&amp;#34;&lt;/code&gt;. Except we&amp;#39;re &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;ing the conditions together. So this function will always return false. It can&amp;#39;t both be blank &lt;em&gt;and&lt;/em&gt; contain the string &lt;code&gt;&amp;#34;null&amp;#34;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Which means Jennifer Null, &lt;a href="https://www.bbc.com/future/article/20160325-the-names-that-break-computer-systems"&gt;who is a real person&lt;/a&gt;, can breathe easy. This version of a null check won&amp;#39;t think she&amp;#39;s nothing.&lt;/p&gt;
&lt;!-- Easy Reader Version: isNullAndNull is some fever dream function naming. It sounds like LLM stuff, but I don't think an LLM would have made the "&amp;&amp;" mistake here. --&gt;&lt;div&gt;
	[Advertisement] Picking up &lt;b&gt;NuGet&lt;/b&gt; is easy. Getting good at it takes time. &lt;a href="https://inedo.com/support/whitepapers/nuget-guide?utm_source=tdwtf&amp;amp;utm_medium=Footerad&amp;amp;utm_campaign=nuget"&gt;Download our guide to learn the best practice of NuGet for the Enterprise.&lt;/a&gt;

&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;</description><slash:comments>16</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/not-for-nullthing</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Empty Pockets</title><link>https://thedailywtf.com/articles/empty-pockets</link><category>Feature Articles</category><pubDate>Mon, 04 May 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/empty-pockets</guid><description>&lt;p&gt;If you&amp;#39;ve seen one developer recounting how their AI agent deleted production, you&amp;#39;ve seen them all. They&amp;#39;re mostly not interesting stories. It&amp;#39;s like watching someone speeding through traffic on a motorcycle without a helmet: the eventual tragedy is sad, but it&amp;#39;s unsurprising and not an interesting story to tell. It&amp;#39;s not even interesting as a warning: the kind of person who speeds on a motorcycle without a helmet isn&amp;#39;t doing so because they don&amp;#39;t understand the danger. They&amp;#39;ve just decided it doesn&amp;#39;t apply to them.&lt;/p&gt;
&lt;p&gt;But the founder of PocketOS, Jer, &lt;a href="https://x.com/lifeof_jer/status/2048103471019434248"&gt;recently shared&lt;/a&gt; how- whoopsie!- their AI agent deleted production. There&amp;#39;s a lot of ingredients that go into this particular disaster, which I think makes it interesting, because the use of a poorly supervised AI agent is only &lt;em&gt;one&lt;/em&gt; ingredient in this absolute trainwreck of a story.&lt;/p&gt;
&lt;p&gt;PocketOS is a small company that makes software for rental companies to manage reservations. Car rentals are a big customer, but the tool is more general than that. They manage all of their infrastructure via a service called Railway. Railway is a pretty-looking GUI tool for automating your deployments and the target environments.&lt;/p&gt;
&lt;p&gt;PocketOS &lt;em&gt;also&lt;/em&gt; is heavily adopting Cursor wrapping around the Claude model. They&amp;#39;ve paid big bucks for the top-end model offered. Many of their components, like Railway, offer &lt;abbr title="Model Context Protocol"&gt;MCP&lt;/abbr&gt; services so that their LLM can do useful things. They&amp;#39;re using the Claude LLM to automate as much as they can.&lt;/p&gt;
&lt;p&gt;So far, this is all a pretty typical setup. They pointed Claude at their code and gave it a &amp;#34;routine&amp;#34; task, and sent it to work. It toddled through the problem and encountered a credential issue. It &amp;#34;decided&amp;#34; that the fix for this issue was to delete a storage volume and recreate it. It scanned through the code to find a file containing an API key, found it, and then sent a &lt;code&gt;POST&lt;/code&gt; request via cURL to delete the volume in question.&lt;/p&gt;
&lt;p&gt;Jer writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To execute the deletion, the agent went looking for an API token. It found one in a file completely unrelated to the task it was working on. That token had been created for one purpose: to add and remove custom domains via the Railway CLI for our services. We had no idea — and Railway&amp;#39;s token-creation flow gave us no warning — that the same token had blanket authority across the entire Railway GraphQL API, including destructive operations like volumeDelete. Had we known a CLI token created for routine domain operations could also delete production volumes, we would never have stored it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wait, the tokens you create in Railway all have god-level privileges? That sounds like a terrible idea. And you were storing the token in your code? We&amp;#39;ll come back to this in a moment, but sure, this is bad, but you can just restore from backup, right?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The volume was deleted. Because Railway stores volume-level backups in the same volume — a fact buried in their own documentation that says &amp;#34;wiping a volume deletes all backups&amp;#34; — those went with it. Our most recent recoverable backup was three months old.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Oh. Oh no.&lt;/p&gt;
&lt;p&gt;Now, I don&amp;#39;t think it&amp;#39;s literally true that Railway is storing your backups &lt;em&gt;literally&lt;/em&gt; in the same volume as the thing they&amp;#39;re backing up. I certainly hope not. But they &lt;em&gt;do&lt;/em&gt;  apparently delete your backups when you delete the volume associated with them. Which is a choice, certainly. A bad one. And one that they &lt;em&gt;documented&lt;/em&gt;, according to Jer. It was, in his words, &amp;#34;buried&amp;#34; in the docs.&lt;/p&gt;
&lt;p&gt;But let&amp;#39;s go back to the tokens for a moment. I am not a Railway user, but I checked out the tool and went through the process of creating a project token. And while no, Railway does not give you big red flags warning you &amp;#34;Hey, this token can do ABSOLUTELY ANYTHING&amp;#34;, it also &lt;em&gt;never gives you an opportunity to scope the token&lt;/em&gt;. Which, I don&amp;#39;t know about you, but the first thing I do when I create an authentication entity is try and figure out how to control its authorizations, because I assume at the start &lt;em&gt;it doesn&amp;#39;t have any&lt;/em&gt;. That&amp;#39;d be sane.&lt;/p&gt;
&lt;p&gt;The scoping happens when you create the token, depending on what context you&amp;#39;re in when you do it. It&amp;#39;s only a handful of scopes, and no fine grained permissions on API keys at all. The lowest level is &amp;#34;Project&amp;#34; which can do anything to a single environment- which does mean that even if you, like Jer&amp;#39;s team, wanted to have a script that changed some DNS settings in production, that same key could be used to delete volumes in production. Which means you really &lt;em&gt;really&lt;/em&gt; want to take care of that key, and you certainly don&amp;#39;t want to leave it where some junior developer or bumbling AI agent can find it.&lt;/p&gt;
&lt;p&gt;Jer also complains that Railway shouldn&amp;#39;t allow an API call to take destructive actions without more protections, like forcing someone to type in the name of the thing being deleted or sending a confirmation email, or something. This, I&amp;#39;m more skeptical of. Most cloud providers &lt;em&gt;don&amp;#39;t&lt;/em&gt; offer anything like this in their APIs, at least that I&amp;#39;ve seen, because on a certain level, if you&amp;#39;re invoking the API with the proper credentials, that&amp;#39;s a big enough hill to climb that we can assume you&amp;#39;ve intended your action. The correct way to protect against this is properly scoped keys &lt;em&gt;and keeping those keys secure and not just lying around in plain text&lt;/em&gt;. There&amp;#39;s a certain aspect of understanding that you&amp;#39;re using a potentially dangerous tool and need to take the responsibility for safety into your own hands; while a table saw can easily take some fingers off, it&amp;#39;s perfectly safe &lt;em&gt;when used correctly&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This is all bad, but how can we make it worse? Well, Jer demanded that Claude &amp;#34;explain itself&amp;#34;. In a section called &amp;#34;The Agent&amp;#39;s Confession&amp;#34;, Jer highlights that the agent is able to identify the explict rules that it failed to follow.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Read that again. The agent itself enumerates the safety rules it was given and admits to violating every one. This is not me speculating about agent failure modes. This is the agent on the record, in writing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;No, it is &lt;em&gt;not&lt;/em&gt; the agent on record. I see this kind of thing a lot when people talk about LLMs. An LLM cannot explain its reasoning. It cannot go on &amp;#34;the record&amp;#34;. It cannot confess to anything. While what it plops out when asked might be &lt;em&gt;interesting&lt;/em&gt;, it is not &lt;em&gt;an explanation&lt;/em&gt;. The only explanation is that it&amp;#39;s a powerful statistical model trying to create a plausible string of tokens! It&amp;#39;s simply looking at its context window and your prompt and trying to predict what it should say. It can tell you what rules it violated not because it understands the rules or knows it violated any rules, but because those rules are in its context window. If you ask it right, it&amp;#39;ll confess to killing JFK and framing Oswald for the crime.&lt;/p&gt;
&lt;p&gt;Jer then tries to ensure that Cursor takes some of the blame, pointing to Cursor&amp;#39;s &amp;#34;guardrails&amp;#34; &lt;a href="https://cursor.com/docs/agent/security"&gt;documentation&lt;/a&gt;. Except, here, the documentation is actually quite explicit about what those guardrails guarantee. If you&amp;#39;re using a first-party tool, it will prohibit unsafe operations. When using 3rd party MCPs, like Railway&amp;#39;s, the only guardrail is that it requires human approval for every action- unless you update your allowlist for that MCP. If you put them in your allowlist, &lt;em&gt;the guardrails go away&lt;/em&gt;. Jer argues that tools should enforce more protection against LLM behaviors, but the problem with that is people- like the PocketOS team- &lt;em&gt;turn those protections off&lt;/em&gt;. And like a lot of safety mistakes, they can get away with it all the way up until the point where they can&amp;#39;t.&lt;/p&gt;
&lt;p&gt;Jer follows this by listing off a pile of other times using Cursor has caused disasters, which isn&amp;#39;t making the argument he thinks it is: yes, Cursor is dangerous, &lt;em&gt;but those dangers are well known&lt;/em&gt;. It makes the choice to turn Cursor loose without strict supervision seem even more foolish.&lt;/p&gt;
&lt;p&gt;Jer writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For now I want this incident understood on its own terms: as a Cursor failure, a Railway failure, and a backup-architecture failure that all happened to one company in one Friday afternoon.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;#39;s &lt;em&gt;also&lt;/em&gt; a PocketOS failure. It&amp;#39;s a failure to properly assess the tools and environments you chose to use for your product. A failure to read and understand the docs for vital features, like *backups*. A failure to employ even the most basic safeguards. A failure to put a second&amp;#39;s thought into key management- even if that key was &lt;em&gt;only&lt;/em&gt; for DNS entries, you &lt;em&gt;still&lt;/em&gt; shouldn&amp;#39;t chuck it in source control. A failure to have a competent backup strategy. It&amp;#39;s worth noting that they &lt;em&gt;did&lt;/em&gt; restore from a three month old backup, which means &lt;em&gt;they were at one point&lt;/em&gt; taking backups outside of Railway&amp;#39;s volume setup. That was a wise decision. That they stopped is a failure.&lt;/p&gt;
&lt;p&gt;The first rule of disaster retrospectives is that it&amp;#39;s never one piece that&amp;#39;s the failure. It&amp;#39;s never one person&amp;#39;s fault, one tool&amp;#39;s fault, one vendor&amp;#39;s fault. It&amp;#39;s a systemic failure. Railway&amp;#39;s keys should be finer grained. But also, you shouldn&amp;#39;t leave keys lying around. Deleting backups when you delete the volume is a terrible idea, but having only one service for backups (that&amp;#39;s also your primary site) is a terrible idea. Claude&amp;#39;s ability to enforce its own guardrails should be better, but LLMs are notoriously dangerous about this: &lt;em&gt;you should know better&lt;/em&gt;, and by your own words &lt;em&gt;you did&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This is not an anti-AI post, or even a &amp;#34;get a load of this asshole&amp;#34; post. &lt;!-- okay, it's a LITTLE BIT a "get a load of this asshole" post --&gt; It is a &amp;#34;understand the damn tools you&amp;#39;re using&amp;#34; post. Be critical of them. Don&amp;#39;t trust them. Ever. Especially LLMs, because the worst part of an LLM is that it takes away the one thing computers used to be good at: predictable, deterministic behavior. But not just LLMs: don&amp;#39;t trust your cloud provider, don&amp;#39;t trust your infrastructure manager. Dig into them and understand how they work, and if they seem to complicated to understand, than they may be too complicated to trust.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: As pointed out in the featured comment below, Railway did finally get a backup restored. So they got their data back. Yay? From the post, Jer remains committed to making this a Railway issue and not a PocketOS issue.&lt;/p&gt;
&lt;!-- Easy Reader Version: The really fun part is Jer complaining that the CEO of Railway hasn't so much as called him. The entitlement, man. --&gt;&lt;div&gt;
	[Advertisement] Picking up &lt;b&gt;NuGet&lt;/b&gt; is easy. Getting good at it takes time. &lt;a href="https://inedo.com/support/whitepapers/nuget-guide?utm_source=tdwtf&amp;amp;utm_medium=Footerad&amp;amp;utm_campaign=nuget"&gt;Download our guide to learn the best practice of NuGet for the Enterprise.&lt;/a&gt;

&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;</description><slash:comments>41</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/empty-pockets</wfw:comment></item><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: Parametric Projection</title><link>https://thedailywtf.com/articles/parametric-projection</link><category>Error'd</category><pubDate>Fri, 01 May 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/parametric-projection</guid><description>&lt;strong&gt;Roger C.&lt;/strong&gt; gets on second base with an unforced error.  &amp;#34;Not only is the content too large, the error message informing us of this is also too large to fit the visible space. A layered, double WTF.&amp;#34;
&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#782b1790d9d549d6a8acf4045669d7a6"&gt;&lt;img itemprop="image" border="0" alt="782b1790d9d549d6a8acf4045669d7a6" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/19/782b1790d9d549d6a8acf4045669d7a6.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;AWS Spellcheck Fail!&amp;#34; alerts
&lt;strong&gt;Peter&lt;/strong&gt;
&amp;#34;If only someone at AWS knew the correct paramters to
activate the spellcheck.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#ee85e87fd7cb4cc2ac3038cb9f97ccf8"&gt;&lt;img itemprop="image" border="0" alt="ee85e87fd7cb4cc2ac3038cb9f97ccf8" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/19/ee85e87fd7cb4cc2ac3038cb9f97ccf8.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;How long is too long for a job to be open? &amp;#34; wonders
&lt;strong&gt;Lincoln K.&lt;/strong&gt;
&amp;#34;I didn&amp;#39;t even know LinkedIn existed 61 years ago, let
alone was accepting postings... Though only 81 applicants in that
time is hardly an impressive turn-out.&amp;#34; For a &amp;#34;Vice President Operations and Quality Control&amp;#34;, no less.
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#1c3d4b06a37e4119b62dc39bad29b9a3"&gt;&lt;img itemprop="image" border="0" alt="1c3d4b06a37e4119b62dc39bad29b9a3" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/19/1c3d4b06a37e4119b62dc39bad29b9a3.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;An anonymous Richard reports 
&amp;#34;This came through my door. On a card that, in order to get to my door, had my full address printed on it, including my &lt;area/&gt;.&amp;#34;

&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#9df5e07d210846f08dc925105f19b64b"&gt;&lt;img itemprop="image" border="0" alt="9df5e07d210846f08dc925105f19b64b" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/19/9df5e07d210846f08dc925105f19b64b.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Oenophile Abroad
&lt;strong&gt;Michael R.&lt;/strong&gt; shares 
&amp;#34;My Macbook broke after being &amp;#34;exposed&amp;#34; to red wine. As
a German in London it pleases me so see that
the repair shop offers this time granularity.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#a9f634b888de4927babb91d7d2920579"&gt;&lt;img itemprop="image" border="0" alt="a9f634b888de4927babb91d7d2920579" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/04/19/a9f634b888de4927babb91d7d2920579.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	Keep all your packages and Docker containers in one place, scan for vulnerabilities, and control who can access different feeds. ProGet installs in minutes and has a powerful free version with a lot of great features that you can upgrade when ready.&lt;a href="https://inedo.com/proget?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=PlebsFooter"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>9</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/parametric-projection</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Cancel Catch</title><link>https://thedailywtf.com/articles/cancel-catch</link><category>CodeSOD</category><pubDate>Thu, 30 Apr 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/cancel-catch</guid><description>&lt;p&gt;&amp;#34;This WTF is in Matlab&amp;#34; almost feels like cheating. At one place I worked, somebody&amp;#39;s job was struggling through a mountain of Matlab code and porting it into C. &amp;#34;This Matlab code looks like it was written by an alien,&amp;#34; also doesn&amp;#39;t really get much traction- &lt;em&gt;all&lt;/em&gt; Matlab code looks like it was written by an alien. This falls into the realm of &amp;#34;Researchers use Matlab, researchers may be very smart about their domain, but generally don&amp;#39;t know the first thing about writing maintainable code, because that&amp;#39;s not their job.&amp;#34;&lt;/p&gt;
&lt;p&gt;But let&amp;#39;s take a look at some MatLab &lt;strong&gt;Carl W&lt;/strong&gt; found:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-matlab"&gt;    &lt;span class="hljs-keyword"&gt;try&lt;/span&gt;
        &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (~&lt;span class="hljs-built_in"&gt;isempty&lt;/span&gt;(fieldnames(bigStruct)) &amp;amp;&amp;amp; isfield(bigStruct,&lt;span class="hljs-string"&gt;&amp;#39;pathName&amp;#39;&lt;/span&gt;))
            [FileName, PathName] = uigetfile(bigStruct.pathName);
        &lt;span class="hljs-keyword"&gt;else&lt;/span&gt;
            [FileName, PathName] = uigetfile(lastPath); &lt;span class="hljs-comment"&gt;%lastPath holds previous path&lt;/span&gt;
        &lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
    &lt;span class="hljs-keyword"&gt;catch&lt;/span&gt;
        bigStruct = struct;
    &lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;uigetfile&lt;/code&gt; function opens a file dialog box. When the user selects a file, &lt;code&gt;FileName&lt;/code&gt; holds the filename, &lt;code&gt;PathName&lt;/code&gt; holds the containing path. If the user doesn&amp;#39;t select a valid file, or clicks &amp;#34;Cancel&amp;#34;, both of those variables get set to &lt;code&gt;0&lt;/code&gt;. It&amp;#39;s then up to the caller to check the return value and decide what happens next.&lt;/p&gt;
&lt;p&gt;Which is not what happens here, obviously. The developer responsible seems to believe that it maybe throws an exception? And they can just catch it? Carl&amp;#39;s best guess is that this is a &amp;#34;weird&amp;#34; way to catch the cancel button. But it does mean that &lt;code&gt;FileName&lt;/code&gt; and &lt;code&gt;PathName&lt;/code&gt; get set to &lt;code&gt;0&lt;/code&gt;, and those zeros propagate until something finally tries to open those files, at which point everything blows up and the user doesn&amp;#39;t know why.&lt;/p&gt;
&lt;!-- Easy Reader Version: Look, I agree that index from 1 is a more "human" way of talking about arrays, but 0 is too ingrained in my brain and it feels wrong every time. --&gt;&lt;div&gt;
	[Advertisement] &lt;b&gt;Plan Your .NET 9 Migration with Confidence&lt;/b&gt;&lt;br/&gt;Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. &lt;b&gt;&lt;a href="https://inedo.com/support/whitepapers/dotnet-guide?utm_campaign=dotnet&amp;amp;utm_source=tdwtf-footer"&gt;Download Free Guide Now!&lt;/a&gt;&lt;/b&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;</description><slash:comments>16</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/cancel-catch</wfw:comment></item></channel></rss>