<?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>Sun, 11 Oct 2026 17:34:27 GMT</lastBuildDate><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: Fast Quick</title><link>https://thedailywtf.com/articles/fast-quick</link><category>Error'd</category><pubDate>Fri, 09 Oct 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/fast-quick</guid><description>&lt;p&gt;
&lt;strong&gt;Matias&lt;/strong&gt; shared a standard sort of flubstituted fail-merge error&amp;#39;d; not really egregious, just routine.
&amp;#34;I am {{emotionType}} to hear this.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#38cbfe9d47c3447790831d94826212c8"&gt;&lt;img itemprop="image" border="0" alt="38cbfe9d47c3447790831d94826212c8" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/09/28/38cbfe9d47c3447790831d94826212c8.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;And another mail-not-merged from
&lt;strong&gt;Reinier B.&lt;/strong&gt;
&amp;#34;When the package from [SELLER] seemed to be lost in
the mail, I was very [EMOTIONAL_STATE] with the refund of
[AMOUNT]. I can now buy another [ITEM] instead.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#566b877339174759b96eaa3aa5b8a032"&gt;&lt;img itemprop="image" border="0" alt="566b877339174759b96eaa3aa5b8a032" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/09/28/566b877339174759b96eaa3aa5b8a032.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;
&lt;strong&gt;Dave A.&lt;/strong&gt; didn&amp;#39;t care for this mail flub, though it&amp;#39;s hardly egregious in my opinion. He suggested we just label it with
&amp;#34;A short description of snarky comments.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#6e07443194d549519ed3cff7ddfba009"&gt;&lt;img itemprop="image" border="0" alt="6e07443194d549519ed3cff7ddfba009" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/09/28/6e07443194d549519ed3cff7ddfba009.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&amp;#34;I&amp;#39;ve_missed_you_too&amp;#34; 
&lt;strong&gt;Willy&lt;/strong&gt; wrote in response to this earnest email.
&amp;#34;Long lasting relationships with car dealers are built on the
personal touchÖ.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#7fb868d3282c4229aff2d94814247705"&gt;&lt;img itemprop="image" border="0" alt="7fb868d3282c4229aff2d94814247705" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/09/28/7fb868d3282c4229aff2d94814247705.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;This is a title&amp;#34;
&lt;strong&gt;Peter&lt;/strong&gt; said about a polyglot web page.
&amp;#34;This is a comment.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#492453f2f3c741dcbd0d0b194a4a2815"&gt;&lt;img itemprop="image" border="0" alt="492453f2f3c741dcbd0d0b194a4a2815" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/09/28/492453f2f3c741dcbd0d0b194a4a2815.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&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>7</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/fast-quick</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Racing Trains</title><link>https://thedailywtf.com/articles/racing-trains</link><category>Feature Articles</category><pubDate>Thu, 08 Oct 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/racing-trains</guid><description>&lt;p&gt;&lt;strong&gt;Robert G&lt;/strong&gt; sends us a WTF from the outside, but I think we can come up with some hypotheses about what actually happened.&lt;/p&gt;
&lt;p&gt;Robert was traveling by train. For complicated train reasons, the car he was seated on was not actually scheduled to continue with the train he was booked to ride, the replacement car missed its scheduled arrival, and the result was that Robert was left at a station needing to rebook his travel.&lt;/p&gt;
&lt;p&gt;Now, given that this is in a region of the world with a fairly robust train network, this represented a hiccup of thirty minutes in a many hour trip. Not a particularly big deal. But Robert didn&amp;#39;t want to get stranded any longer than he had to, so he took out his phone, fired up the train company&amp;#39;s app, and made sure he had a reservation on the next train. He got the confirmation, and grabbed a coffee while he waited.&lt;/p&gt;
&lt;p&gt;Not quite thirty minutes later, Robert boarded the train and went towards his reserved seat. Another passenger approached from the opposite direction, and they met at the seat. &amp;#34;Excuse me,&amp;#34; Robert said, &amp;#34;but I reserved this one.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;No, &lt;em&gt;I&lt;/em&gt; reserved this one.&amp;#34;&lt;/p&gt;
&lt;p&gt;Being reasonable people, they both pulled out their phones and pulled up their apps. Sure enough, each one of them was confirmed for that seat. Since the email confirmation had more details than the app provided, they both pulled up the email. Same seat. Both confirmed. The timestamp of the reservation? The same, down to the second.&lt;/p&gt;
&lt;p&gt;&amp;#34;I don&amp;#39;t think the conductor will let us sit in each other&amp;#39;s laps,&amp;#34; the other passenger said.&lt;/p&gt;
&lt;p&gt;As it turned out, there was enough room on the train that no lap sitting was required. Everyone got a seat, even if it wasn&amp;#39;t the one they reserved.&lt;/p&gt;
&lt;p&gt;But the story stuck with Robert. A major transit provider had a reservation system that clearly had a race condition. It seemed like the most basic example of race conditions too, the kind you&amp;#39;re shown in college to explain the basic concept.&lt;/p&gt;
&lt;p&gt;&amp;#34;Check if the seat is reserved, and if it&amp;#39;s not, reserve it.&amp;#34; Because that sequence isn&amp;#39;t atomic, two different threads could do the check, see it&amp;#39;s not reserved, and then reserve it. I suppose it&amp;#39;s at least something that one reservation doesn&amp;#39;t &lt;em&gt;overwrite&lt;/em&gt; the other, which at least indicates that a reservation is its own record.&lt;/p&gt;
&lt;p&gt;The real question is this: this has to happen with some frequency, so &lt;em&gt;how has nobody fixed it&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;The real answer: they probably just don&amp;#39;t care, either because they literally don&amp;#39;t care, or because their software is such a trashfire that this doesn&amp;#39;t even rise to the top ten bugs. It&amp;#39;s likely a mix of both.&lt;/p&gt;
&lt;!-- Easy Reader Version: Look, I'm in the US, and by US standards I'm a top decile train user, in that I ride Amtrak a few times a year for trips, so I'm not going to make snarky comments about some other country's train system, what with glass houses and stones thrown. Amtrak is actually pretty nice, all things considered, but the US *hates trains* and they try and make the experience as bad as possible. --&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>26</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/racing-trains</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: A Tool for You</title><link>https://thedailywtf.com/articles/a-tool-for-you</link><category>CodeSOD</category><pubDate>Wed, 07 Oct 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/a-tool-for-you</guid><description>&lt;p&gt;A junior dev on the team had a simple question: in Java, how do I correctly read user input from the CLI and act on it?&lt;/p&gt;
&lt;p&gt;Now, we can wonder about a junior dev not having such basic knowledge, but maybe they&amp;#39;re new to &lt;em&gt;Java&lt;/em&gt; specifically. Who knows. But &lt;strong&gt;Robert&lt;/strong&gt;&amp;#39;s team has a senior on it who &amp;#34;likes to mentor&amp;#34;. This senior has strong opinions about how to write software, extreme confidence in those opinions, and has somehow been around the company long enough that he knows where the bodies are buried and no one will fire him.&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s his sample application for reading input.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;&lt;span class="hljs-keyword"&gt;import&lt;/span&gt; java.nio.charset.StandardCharsets;
&lt;span class="hljs-keyword"&gt;import&lt;/span&gt; java.util.*;

&lt;span class="hljs-keyword"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword"&gt;class&lt;/span&gt; &lt;span class="hljs-title class_"&gt;ScannerTool&lt;/span&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-keyword"&gt;void&lt;/span&gt; &lt;span class="hljs-title function_"&gt;main&lt;/span&gt;&lt;span class="hljs-params"&gt;(String[] args)&lt;/span&gt; {
    Map&amp;lt;Optional&amp;lt;Character&amp;gt;, Map.Entry&amp;lt;String, Boolean&amp;gt;&amp;gt; map = &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;HashMap&lt;/span&gt;&amp;lt;&amp;gt;();
    map.put(Optional.of(&lt;span class="hljs-string"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;), &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;AbstractMap&lt;/span&gt;.SimpleEntry&amp;lt;&amp;gt;(&lt;span class="hljs-string"&gt;&amp;#34;You entered A.&amp;#34;&lt;/span&gt;, &lt;span class="hljs-literal"&gt;true&lt;/span&gt;));
    map.put(Optional.of(&lt;span class="hljs-string"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;), &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;AbstractMap&lt;/span&gt;.SimpleEntry&amp;lt;&amp;gt;(&lt;span class="hljs-string"&gt;&amp;#34;You entered B.&amp;#34;&lt;/span&gt;, &lt;span class="hljs-literal"&gt;true&lt;/span&gt;));
    map.put(Optional.empty(), &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;AbstractMap&lt;/span&gt;.SimpleEntry&amp;lt;&amp;gt;(&lt;span class="hljs-string"&gt;&amp;#34;You entered nothing.&amp;#34;&lt;/span&gt;, &lt;span class="hljs-literal"&gt;false&lt;/span&gt;));
    Optional&amp;lt;Character&amp;gt; input;
    &lt;span class="hljs-keyword"&gt;do&lt;/span&gt; {
      System.out.println(&lt;span class="hljs-string"&gt;&amp;#34;Please enter A or B:&amp;#34;&lt;/span&gt;);
    } &lt;span class="hljs-keyword"&gt;while&lt;/span&gt; (!map.getOrDefault((input = nextCharacter()), &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;AbstractMap&lt;/span&gt;.SimpleEntry&amp;lt;&amp;gt;(&lt;span class="hljs-string"&gt;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span class="hljs-literal"&gt;false&lt;/span&gt;))
        .getValue());
    System.out.println(map.get(input).getKey());
  }

  &lt;span class="hljs-keyword"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword"&gt;static&lt;/span&gt; Optional&amp;lt;Character&amp;gt; &lt;span class="hljs-title function_"&gt;nextCharacter&lt;/span&gt;&lt;span class="hljs-params"&gt;()&lt;/span&gt; {
    &lt;span class="hljs-type"&gt;String&lt;/span&gt; &lt;span class="hljs-variable"&gt;l&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Scanner&lt;/span&gt;(System.in, StandardCharsets.UTF_8).nextLine();
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (l != &lt;span class="hljs-literal"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; !l.isEmpty()) {
      &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; Optional.of(l.charAt(&lt;span class="hljs-number"&gt;0&lt;/span&gt;));
    }
    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; Optional.empty();
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Look, I know Java is verbose, but this is entirely next level. Giving this to a junior has to constitute an attempt to drive the youth &lt;em&gt;out&lt;/em&gt; of the industry, because any sane person being told, &amp;#34;your job is to write this&amp;#34; would realize they&amp;#39;ve committed a grave error in their career choice and needs to escape now.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nextCharacter&lt;/code&gt; in this case actually returns the first character of the next line, not the next character. And if there isn&amp;#39;t one, it returns an empty optional. Which, fine, we only expect one character per line of input for this exercise, so that&amp;#39;s not &lt;em&gt;wrong&lt;/em&gt;, I just don&amp;#39;t like the name of the function.&lt;/p&gt;
&lt;p&gt;Of course, using &lt;code&gt;Scanner&lt;/code&gt; here is a wrecking ball fly swatter- that class is a full on parser for reading out common data types from a file. Worth showing to a junior, but a little out of scope of this question.&lt;/p&gt;
&lt;p&gt;But the real overengineering is the map of maps- well, a map of map &lt;em&gt;entries&lt;/em&gt;. The key to the outer map is an optional of the character that was entered by the user. The value is itself a map, the key of the map is the message we want to output, the value is whether or not the loop should continue. They&amp;#39;ve reinvented tuples using map entries. Which, in their defense, mainline Java doesn&amp;#39;t have tuples (enterprise edition seems to have them in the &lt;code&gt;javax&lt;/code&gt; namespace, but I&amp;#39;m not even certain those are meant to be general purpose tuples anyway). A quick search indicates that their absence is a perennial source of heated discussions in forums and Stack Overflow.&lt;/p&gt;
&lt;p&gt;Robert writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is remarkable in its creativity and execution and still has me in awe. When I tried to unpack it, my brain just started to pack up its things and left, haven&amp;#39;t seen it since.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bon voyage.&lt;/p&gt;
&lt;!-- Easy Reader Version: "The street finds it own uses for things," William Gibson wrote. Then someone showed him this use of SimpleEntry types, and added, "but it really shouldn't." --&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>15</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/a-tool-for-you</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: A Random Article</title><link>https://thedailywtf.com/articles/a-random-article</link><category>CodeSOD</category><pubDate>Tue, 06 Oct 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/a-random-article</guid><description>&lt;p&gt;Many years ago, &lt;strong&gt;DJ&lt;/strong&gt; got his start doing odd web development jobs for a low hourly rate. He was only 19 when he got started, and what he lacked in experience he made up for in being cheap to hire.&lt;/p&gt;
&lt;p&gt;As I said, that was many years ago, and he has since learned a lot. But he still has some code from his very first &amp;#34;someone paid me for this&amp;#34; project. This particular function needed to pick a random bit of content from their database to display in the &amp;#34;right side&amp;#34; banner area. This is how DJ implemented it.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-php"&gt;&lt;span class="hljs-comment"&gt;// Create an array of all the ID&amp;#39;s used&lt;/span&gt;
&lt;span class="hljs-variable"&gt;$int&lt;/span&gt; = &lt;span class="hljs-keyword"&gt;array&lt;/span&gt;();
&lt;span class="hljs-variable"&gt;$query&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$sql&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;query&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;SELECT * FROM rightside&amp;#34;&lt;/span&gt;);
&lt;span class="hljs-keyword"&gt;while&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$row&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$sql&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;objects&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#39;&amp;#39;&lt;/span&gt;,&lt;span class="hljs-variable"&gt;$query&lt;/span&gt;)) {
    &lt;span class="hljs-variable"&gt;$int&lt;/span&gt;[ &lt;span class="hljs-variable"&gt;$row&lt;/span&gt;-&amp;gt;id ] = &lt;span class="hljs-variable"&gt;$row&lt;/span&gt;-&amp;gt;id;
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$row&lt;/span&gt;-&amp;gt;id &amp;gt; &lt;span class="hljs-variable"&gt;$max&lt;/span&gt;) {
        &lt;span class="hljs-variable"&gt;$max&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$row&lt;/span&gt;-&amp;gt;id;
    }
}
                
&lt;span class="hljs-comment"&gt;// Find a random ID that has been used&lt;/span&gt;
&lt;span class="hljs-variable"&gt;$x&lt;/span&gt; = &lt;span class="hljs-literal"&gt;false&lt;/span&gt;;
&lt;span class="hljs-keyword"&gt;while&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$x&lt;/span&gt; == &lt;span class="hljs-literal"&gt;false&lt;/span&gt;) {
    &lt;span class="hljs-variable"&gt;$rand&lt;/span&gt; = &lt;span class="hljs-title function_ invoke__"&gt;rand&lt;/span&gt;(&lt;span class="hljs-number"&gt;0&lt;/span&gt;,&lt;span class="hljs-variable"&gt;$max&lt;/span&gt;);
    &lt;span class="hljs-keyword"&gt;foreach&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$int&lt;/span&gt; &lt;span class="hljs-keyword"&gt;as&lt;/span&gt; &lt;span class="hljs-variable"&gt;$thing&lt;/span&gt;) {
         &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$thing&lt;/span&gt; == &lt;span class="hljs-variable"&gt;$rand&lt;/span&gt;) {
 &lt;span class="hljs-variable"&gt;$x&lt;/span&gt; = &lt;span class="hljs-literal"&gt;true&lt;/span&gt;;
         }
    }
}

&lt;span class="hljs-variable"&gt;$query&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$sql&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;query&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;SELECT * FROM rightside WHERE id = &amp;#34;&lt;/span&gt;.&lt;span class="hljs-variable"&gt;$rand&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We start by building an array. Then we query the database for all the content. We get all the rows and columns, butw e only are interested in one- the &lt;code&gt;id&lt;/code&gt;. We create a sparse array, where the index of the item is the item&amp;#39;s value. We also track the max.&lt;/p&gt;
&lt;p&gt;Once we&amp;#39;ve got that, we start a loop. Inside that loop, we generate a random number, check if it&amp;#39;s in our array by doing a foreach across the array, and if it is, we break the loop- we&amp;#39;ve found our random content. If it&amp;#39;s not, we keep trying until we score a hit.&lt;/p&gt;
&lt;p&gt;Finally, we construct our query with string concatenation and grab the content we want to display.&lt;/p&gt;
&lt;p&gt;Now, as a true confession, there&amp;#39;s an element of &lt;em&gt;caveat emptor&lt;/em&gt; here; if you&amp;#39;re hiring the kid from the local college and paying them a few bucks an hour, this is the kind of thing you get.&lt;/p&gt;
&lt;p&gt;Is the code terrible? Yes, even by early-00s PHP standards. Is it really DJ&amp;#39;s problem, though? No. I&amp;#39;d hope any of us would look back at the code we wrote when we were 19, and shudder. It means we&amp;#39;ve learned something in the interim.&lt;/p&gt;
&lt;p&gt;For this confession, I say there&amp;#39;s no need to atone. Hopefully everyone learned a lesson, especially the company trying to hire programmers on the cheap.&lt;/p&gt;
&lt;!-- Easy Reader Version: I still like TDWTF's solution, which if you hit the "random link" button in rapid succession (opening each in a new tab) you can outrun the random number generation and get the same article multiple times. --&gt;
&lt;style&gt;.comment { border: none; }&lt;/style&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>14</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/a-random-article</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: The Date and Time and Time</title><link>https://thedailywtf.com/articles/the-date-and-time-and-time</link><category>CodeSOD</category><pubDate>Mon, 05 Oct 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/the-date-and-time-and-time</guid><description>&lt;p&gt;Today&amp;#39;s anonymous submitter sends us some legacy Java code.&lt;/p&gt;
&lt;p&gt;The task is this: check what time it is. And fortunately, even in the older Java datetime libraries that were &lt;em&gt;terrible&lt;/em&gt;, this was an easy task. You just needed to do something like &lt;code&gt;new Date()&lt;/code&gt;, which constructs a date time object set to the current time. &lt;code&gt;getTime()&lt;/code&gt; picks off just the time portion.&lt;/p&gt;
&lt;p&gt;Or, you could do this.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;&lt;span class="hljs-type"&gt;Timestamp&lt;/span&gt; &lt;span class="hljs-variable"&gt;current&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Timestamp&lt;/span&gt;(&lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Date&lt;/span&gt;().getTime());
&lt;span class="hljs-type"&gt;Date&lt;/span&gt; &lt;span class="hljs-variable"&gt;date&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Date&lt;/span&gt;(current.getTime());
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This creates a date, picks the time off, populates a timestamp, gets the time from the timestamp, and constructs a new date object.&lt;/p&gt;
&lt;p&gt;The old Java date classes were awful, but they never needed you to do this. This is entirely home grown ugliness.&lt;/p&gt;
&lt;!-- Easy Reader Version: Though finding the docs for pre-Java 8 date time handling is actually hard now. People fled that as quickly as possible. --&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>9</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/the-date-and-time-and-time</wfw:comment></item><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: 12345</title><link>https://thedailywtf.com/articles/12345</link><category>Error'd</category><pubDate>Fri, 02 Oct 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/12345</guid><description>&lt;p&gt;We have for you this week a full set of the Error&amp;#39;d we most love to hate: the perverse password policy.
&lt;/p&gt;

&lt;p&gt;An anonymous reader drops this, with little to say except to note &amp;#34;Speciaal passwords&amp;#34;. 
Evidently they supplied a password which satisfied each of the five green critera, but still it was rejected.
It would be nice to know where this offense originated, 
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#cc110e101f8d49be9a4cdc4f06610701"&gt;&lt;img itemprop="image" border="0" alt="cc110e101f8d49be9a4cdc4f06610701" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/09/20/cc110e101f8d49be9a4cdc4f06610701.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Intrepid 
&lt;strong&gt;Michael R.&lt;/strong&gt; explains
&amp;#34;note: Handy is the German term for mobile phone (UK)
or cell phone (US).&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#a435f504c19d4e5cac50b7b70bd78648"&gt;&lt;img itemprop="image" border="0" alt="a435f504c19d4e5cac50b7b70bd78648" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/09/20/a435f504c19d4e5cac50b7b70bd78648.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;
&lt;strong&gt;Sacha R.&lt;/strong&gt; observes a secret policy at play, saying
&amp;#34;Oracle try to do the right thing by showing you
the password policy requirements when you manually reset a password
in their Fusion applications. It&amp;#39;s just a pity that it
doesn&amp;#39;t show you the *correct* password policy requirements.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#a5f15cdcbd194c62bb43fac49090df0f"&gt;&lt;img itemprop="image" border="0" alt="a5f15cdcbd194c62bb43fac49090df0f" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/09/20/a5f15cdcbd194c62bb43fac49090df0f.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;Faith, here&amp;#39;s an equivocator,&amp;#34; reports
&lt;strong&gt;Matthew S.&lt;/strong&gt;
&amp;#34;Pick one, Staples!&amp;#34; I bet it&amp;#39;s the ampersand that offends. 
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#ebc7f35e5c1b4b748ec395265b154ce7"&gt;&lt;img itemprop="image" border="0" alt="ebc7f35e5c1b4b748ec395265b154ce7" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/09/20/ebc7f35e5c1b4b748ec395265b154ce7.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;At least letters or numbers?&amp;#34; questions a final anon. 
&amp;#34;Just a little head scratching moment. After removing all special
characters from the password I was able to register.&amp;#34;  This looks
like partly a translation wtf and partly a software design wtf. 
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#ecaab92f40c64cfcbe4eca13aa0fe418"&gt;&lt;img itemprop="image" border="0" alt="ecaab92f40c64cfcbe4eca13aa0fe418" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/09/20/ecaab92f40c64cfcbe4eca13aa0fe418.jpeg"/&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/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>21</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/12345</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Very Valid Tokens</title><link>https://thedailywtf.com/articles/very-valid-tokens</link><category>CodeSOD</category><pubDate>Thu, 01 Oct 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/very-valid-tokens</guid><description>&lt;p&gt;Today&amp;#39;s anonymous submitter shares with us the function their company uses to validate authentication tokens.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;&lt;span class="hljs-function"&gt;&lt;span class="hljs-keyword"&gt;public&lt;/span&gt; &lt;span class="hljs-built_in"&gt;bool&lt;/span&gt; &lt;span class="hljs-title"&gt;IsTokenValid&lt;/span&gt;(&lt;span class="hljs-params"&gt;&lt;span class="hljs-built_in"&gt;string&lt;/span&gt; token&lt;/span&gt;)&lt;/span&gt;
{
    &lt;span class="hljs-comment"&gt;//TODO&lt;/span&gt;
    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-literal"&gt;true&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is running in production. So that&amp;#39;s fun. The user they&amp;#39;ve authenticated as is tracked separately at the start of their session, which makes it at least marginally harder to pretend to be someone you aren&amp;#39;t, but for authentication, any token will do.&lt;/p&gt;
&lt;!-- Easy Reader Version: Our submitter didn't share the whole workflow, so I really have no idea how this works in context, because it seems like there should be some part where it tries to associate your token with an authorization which means there's gotta be some persistence server side, right? Right? --&gt;
&lt;style&gt;.comment { border: none; }&lt;/style&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>18</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/very-valid-tokens</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Quite a Distance from the Right Solution</title><link>https://thedailywtf.com/articles/quite-a-distance-from-the-right-solution</link><category>CodeSOD</category><pubDate>Wed, 30 Sep 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/quite-a-distance-from-the-right-solution</guid><description>&lt;p&gt;&lt;strong&gt;Fritz&lt;/strong&gt;&amp;#39;s team needed to see if one point was within a certain distance from a center point. You or I would likely try and answer this question using a simple distance calculation, since &lt;em&gt;that&amp;#39;s the question we&amp;#39;re trying to answer&lt;/em&gt;. But what if you didn&amp;#39;t understand distances at all? Then you could write this little piece of genius.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;        &lt;span class="hljs-keyword"&gt;private&lt;/span&gt; bool &lt;span class="hljs-title function_"&gt;IsWithin&lt;/span&gt;&lt;span class="hljs-params"&gt;(Point point, &lt;span class="hljs-type"&gt;int&lt;/span&gt; radius)&lt;/span&gt;
        {
            &lt;span class="hljs-keyword"&gt;for&lt;/span&gt; (&lt;span class="hljs-type"&gt;int&lt;/span&gt; &lt;span class="hljs-variable"&gt;x&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; -radius; x &amp;lt; radius + &lt;span class="hljs-number"&gt;1&lt;/span&gt;; x++)
            {
                &lt;span class="hljs-keyword"&gt;for&lt;/span&gt; (&lt;span class="hljs-type"&gt;int&lt;/span&gt; &lt;span class="hljs-variable"&gt;y&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; -radius; y &amp;lt; radius + &lt;span class="hljs-number"&gt;1&lt;/span&gt;; y++)
                {
                    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; ((PositionX == point.X + x) &amp;amp;&amp;amp; (PositionY == point.Y + y))
                        &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-literal"&gt;true&lt;/span&gt;;
                }
            }

            &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-literal"&gt;false&lt;/span&gt;;
        }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This limits us to integer point values, which itself is fine. This iterates across every coordinate from &lt;code&gt;(x-radius,y-radius)&lt;/code&gt; to &lt;code&gt;(x+radius,y+radius)&lt;/code&gt; and checks if any of them are equal to our center point, &lt;code&gt;(PositionX,PositionY)&lt;/code&gt;. Notably, this means we&amp;#39;re not checking a radius, at least not in a traditional metric, we&amp;#39;re checking a box (or using the taxicab metric). Which if we wanted to check a box, we actually have even &lt;em&gt;easier&lt;/em&gt; math than the distance equation- we could do that with pure bounds checking.&lt;/p&gt;
&lt;p&gt;I&amp;#39;ve never thought to try and brute force distance checking, and that feels like a failure of my own creativity. Fritz&amp;#39;s team mate at least was able to WTF in a way I wouldn&amp;#39;t have considered.&lt;/p&gt;
&lt;!-- Easy Reader Version: Forget trying to find the fire hydrants in the pictures, the next captcha is coming up with dumb solutions to common problems, WTFing in ways that machines can't --&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 the plebs out of prod. Restrict NuGet feed privileges with ProGet. &lt;a href="https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=PlebsFooter&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>25</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/quite-a-distance-from-the-right-solution</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Representative Line: Unique Testing</title><link>https://thedailywtf.com/articles/unique-testing</link><category>Representative Line</category><pubDate>Tue, 29 Sep 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/unique-testing</guid><description>&lt;p&gt;&lt;strong&gt;Nikolai M&lt;/strong&gt;&amp;#39;s team had a flaky CI/CD build. About 0.5% of the time, one of their tests would fail: frequent enough to be annoying, but not so frequent that it motivated management to assign anybody to investigate. Nikolai eventually dug in, taking the initiative.&lt;/p&gt;
&lt;p&gt;Microsoft&amp;#39;s implementation of UUIDs calls them GUIDs. The GUID is, per the docs, really just a wrapper around UUID algorithms, and supports a variety of different UUID variants. I&amp;#39;m sure at some historical point, this wasnt&amp;#39;t true, and Microsoft had some weird internal algorithm. That&amp;#39;s not really here nor there, but the test that was failing was failing because of an assertion relating to GUIDs.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;Assert.DoesNotContain(&lt;span class="hljs-string"&gt;&amp;#34;000&amp;#34;&lt;/span&gt;, transactionId.ToString());
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;transactionId&lt;/code&gt; is a GUID. This line converts it to a string and checks if it contains &amp;#34;000&amp;#34;. They&amp;#39;re attempting to check if it&amp;#39;s an empty UUID, and they&amp;#39;ve assumed that three sequential zeroes in the output would be an impossible event. This is untrue. Nikolai measured it, and found it happens 0.5527% of the time- 1-in-181.&lt;/p&gt;
&lt;p&gt;So this is a bad test, and could be made better with a more thorough check. &lt;em&gt;Or&lt;/em&gt; it could leverage the built in constant &lt;code&gt;GUID.Empty&lt;/code&gt;, which is a UUID where every bit is zero.&lt;/p&gt;
&lt;p&gt;And it&amp;#39;s that which really bugs me, honestly. Even if you didn&amp;#39;t know about the constant, the idea of constructing an empty GUID seems like the obvious choice. Though I suppose you&amp;#39;d have to check the docs to find out how to construct a GUID directly, and if you&amp;#39;re already reading the docs, the chances of you seeing the built-in constant are probably higher than 0.5527%.&lt;/p&gt;
&lt;!-- Easy Reader Version: Assert.DoesNotContain("basic sense", this_test) --&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>20</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/unique-testing</wfw:comment></item><item><dc:creator>Ellis Morning</dc:creator><title>It's All Part 2 of the Process</title><link>https://thedailywtf.com/articles/it-s-all-part-2-of-the-process</link><category>Feature Articles</category><pubDate>Mon, 28 Sep 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/it-s-all-part-2-of-the-process</guid><description>&lt;p&gt;Our submitter &lt;b&gt;Tim C.&lt;/b&gt; is back as his bureaucratic nightmare continues. &lt;a href="https://thedailywtf.com/articles/it-s-all-part-1-of-the-process"&gt;Read Part 1 here&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;After I&amp;#39;d thrown the WTF Exchange (WTFX) for a loop, they managed to eventually right the ship. But then I faced another hurdle: I had run out of disk space. The software was not live, we were still developing the customer-specific customisations, but I was a bit stuck without a few more gigabytes.&lt;/p&gt;
&lt;p style="float:right; padding-left:10px; padding-bottom:10px;"&gt;&lt;a title="Augkun-ane, CC BY 4.0 &amp;lt;https://creativecommons.org/licenses/by/4.0&amp;gt;, via Wikimedia Commons" href="https://commons.wikimedia.org/wiki/File:WD_Blue_Hard_Disk_Drive_connected_to_Laptop_via_USB-C.jpg"&gt;&lt;img itemprop="image" width="300" alt="WD Blue Hard Disk Drive connected to the Acer Laptop via SATA to USB-C adapter" src="https://thumb.wikimedia.org/wikipedia/commons/thumb/b/b0/WD_Blue_Hard_Disk_Drive_connected_to_Laptop_via_USB-C.jpg/330px-WD_Blue_Hard_Disk_Drive_connected_to_Laptop_via_USB-C.jpg?utm_source=commons.wikimedia.org&amp;amp;utm_campaign=index&amp;amp;utm_content=thumbnail"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The exchange went something like this:&lt;/p&gt;

&lt;p&gt;&amp;#34;Hey Margritte, I need more disk space.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Oh dear, what&amp;#39;s happening?&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Nothing is happening. I&amp;#39;m just developing the software. I need more disk space, not much. Can you  get me another 20Gb? Wait, make that 40Gb.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;We can&amp;#39;t just get you more disk space. These things need to be planned!&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;I just need a tiny amount, really. No need for any meetings. Just tell your IT guys to give me another NFS drive or expand one of the existing ones.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Tim, that&amp;#39;s not how things work here. We need to discuss your needs and it&amp;#39;s important to us to know what needs you might have in future.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Um, okay ... ?&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;I&amp;#39;ll try to call an urgent meeting.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Really? For 40Gb?&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Well, how do we know 40Gb is going to be enough?&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Because it&amp;#39;s double what I really think I need.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Why on Earth didn&amp;#39;t you tell us before that you needed this disk space?&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;I&amp;#39;m telling you now!&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Why didn&amp;#39;t you do projections months ago?&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;At no stage did anyone ask me how much disk space we need! We obviously need &lt;i&gt;some&lt;/i&gt; disk space! I have literally never given anyone an estimate! We are not even at the point yet to even estimate how much we&amp;#39;ll need on project go-live.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Well, I&amp;#39;ll try to get an urgent meeting going. But it won&amp;#39;t be today.&amp;#34;&lt;/p&gt;
&lt;p&gt;So at lunchtime, I went to the local computer store and bought an external hard drive. I asked Margritte to give it to the IT guys to stick somewhere in their computer room, or at least somewhere on their network.&lt;/p&gt;
&lt;p&gt;That just seemed to make things worse.&lt;/p&gt;
&lt;p&gt;&amp;#34;We can&amp;#39;t take this! We have procurement processes!&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Take it! This is a freebie from me to you. It&amp;#39;ll help unstick a blockage in the project.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;It&amp;#39;s not our standard hardware vendor. God knows what stuff is on it. We can&amp;#39;t take the risk.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;I have literally not opened the plastic sealed wrapper on the outside of the box.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Yes, but you could have re-sealed it. When we go via our trusted hardware partners we don&amp;#39;t have to worry about things like that.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;You realise I&amp;#39;m making software every day which is running in the heart of your systems?! I work on this laptop here, and at the hotel, creating software, both C++ source code and Windows executables, that run inside your systems!&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;But it&amp;#39;s not in the asset register. We need to record the warranty details every time we install hardware. What happens if it fails after you&amp;#39;ve left?&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Well, how about we just agree I&amp;#39;ll take it with me when I go?&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Okay, I&amp;#39;ll see if I can make the meeting happen tomorrow. To get you more disk space. Using our preferred hardware. Not that ... &lt;i&gt;thing.&amp;#34;&lt;/i&gt; (Said with disgust.)&lt;/p&gt;
&lt;p&gt;Well, I finally got my disk space ... after a couple of days.&lt;/p&gt;
&lt;p&gt;I was shocked to learn months later what a small proportion of the overall project budget our company earned. What seemed like an enormous multi-million-dollar contract to us was dwarfed by what WTFX spent on ex-pat &amp;#34;Anderson Androids&amp;#34;, all immaculately groomed with expensive suits, who spent weeks twiddling their thumbs in expensive hotel rooms waiting for us to finish our software development, because they couldn&amp;#39;t start until we had finished.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So sayeth the Gantt chart! Amen.&lt;/p&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>31</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/it-s-all-part-2-of-the-process</wfw:comment></item><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: Said Different</title><link>https://thedailywtf.com/articles/said-different</link><category>Error'd</category><pubDate>Fri, 25 Sep 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/said-different</guid><description>&lt;p&gt;I know it&amp;#39;s not nice to mock mistranslations, but would you believe we&amp;#39;re laughing with them,
not at them? In response to recent criticism of the difficulty of identifying precisely
&lt;em&gt;what&lt;/em&gt; is at issue, two of our readers have chosen to highlight the offending element.
Thanks for saving me the trouble!&amp;#34;

&lt;/p&gt;&lt;p&gt;&amp;#34;Bad Dutch translation, or is&amp;#39;t?&amp;#34; asketh
&lt;strong&gt;Mike V.&lt;/strong&gt;
&amp;#34;I visited the Dutch Dell site https://www.dell.com/nl-nl and noticed the
bad translation on the &amp;#34;Accept All&amp;#34; cookies button. Then I
visited the UK page on https://www.dell.com/en-uk and was not so
sure anymore about the bad translation. Funny thing is that
the text above the buttons refer to the buttons with
a completely different text (which is an Error&amp;#39;d in itself)&amp;#34;  If I squint I can almost see how
this kind of translation could happen.
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#140e9eb162784837ac060986a30c23e8"&gt;&lt;img itemprop="image" border="0" alt="140e9eb162784837ac060986a30c23e8" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/09/20/140e9eb162784837ac060986a30c23e8.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;Going under german&amp;#34; meint
&lt;strong&gt;Matthias J.&lt;/strong&gt;.
&amp;#34;Trying to add info to my Euro-Tunnel France to Britain
booking, seems LeShuttle does not care for my (old) german
language setting anymore.&amp;#34;  Mox nix, as Kilroy said. 
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#18bf4d06d4824ed9944fb195a454f21e"&gt;&lt;img itemprop="image" border="0" alt="18bf4d06d4824ed9944fb195a454f21e" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/09/20/18bf4d06d4824ed9944fb195a454f21e.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;Do you understand?!&amp;#34; rzants 
&lt;strong&gt;sztmbr&lt;/strong&gt;
&amp;#34;Am I a liar when clicking &amp;#34;Understand&amp;#34; under this cryptic
message in Polish Glovo app?&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#576251db8d3449768238b51a9f0002b0"&gt;&lt;img itemprop="image" border="0" alt="576251db8d3449768238b51a9f0002b0" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/09/20/576251db8d3449768238b51a9f0002b0.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;
&lt;strong&gt;The Beast in Black&lt;/strong&gt; gets two extra points for the Johnny Five meme here
but minus two for the Mr Miyagi. Easy come, easy go. Beast says 
&amp;#34;I&amp;#39;m floored! Apparently I can improve my floor so the
Roborock robot vacuum cleaner can better it. How, though? Pre-clean?
Wax on wax off? Need input, Stephanie!&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#a6ce2c74ba7f41d6a6eb8ae670b82fd3"&gt;&lt;img itemprop="image" border="0" alt="a6ce2c74ba7f41d6a6eb8ae670b82fd3" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/09/20/a6ce2c74ba7f41d6a6eb8ae670b82fd3.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;This one made me laugh today. Please provide your psychic address.&amp;#34; Yes, humour is a strong physic!
&lt;strong&gt;TheRealSteveJudge&lt;/strong&gt;
&amp;#34;Really funny. This was found at German Ebay. A Chinese
seller of Makita compatible stuff. Please provide your psychic address.
Please see in the last line before the orange bar.
What is my psychic address? I still have to find
out.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#e290d4c55b2540bc94217bb62f6876ee"&gt;&lt;img itemprop="image" border="0" alt="e290d4c55b2540bc94217bb62f6876ee" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/09/20/e290d4c55b2540bc94217bb62f6876ee.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/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/said-different</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Historical Pads</title><link>https://thedailywtf.com/articles/historical-pads</link><category>CodeSOD</category><pubDate>Thu, 24 Sep 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/historical-pads</guid><description>&lt;p&gt;&lt;strong&gt;Tim&lt;/strong&gt; inherited a fairly antique Visual Basic application some time back. Yes, Visual Basic, not VB .Net. The application is old enough that we might consider it &amp;#34;vintage&amp;#34; or &amp;#34;historical&amp;#34;; it certainly dates from before the millennium. But it has its own unique approach to handling historical dates:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-vbscript"&gt;  mnYear% = &lt;span class="hljs-built_in"&gt;CInt&lt;/span&gt;(&lt;span class="hljs-built_in"&gt;Year&lt;/span&gt;(vntDate)) 
  &lt;span class="hljs-keyword"&gt;If&lt;/span&gt; mnYear% &amp;lt; &lt;span class="hljs-number"&gt;1000&lt;/span&gt; &lt;span class="hljs-keyword"&gt;Then&lt;/span&gt; 
       msYear$ = &lt;span class="hljs-string"&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &amp;amp; Trim$(&lt;span class="hljs-built_in"&gt;CStr&lt;/span&gt;(mnYear%)) 
  &lt;span class="hljs-keyword"&gt;Else&lt;/span&gt; 
       msYear$ = Trim$(&lt;span class="hljs-built_in"&gt;CStr&lt;/span&gt;(mnYear%)) 
  &lt;span class="hljs-keyword"&gt;End&lt;/span&gt; &lt;span class="hljs-keyword"&gt;If&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Insert obligatory complaints about Hungarian notation. What even &lt;em&gt;is&lt;/em&gt; &lt;code&gt;vnt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now, one important thing about this program: it didn&amp;#39;t have to handle dates back into the middle ages, or honestly, historical dates at all. But someone decided they wanted to make sure that if someone wanted to track the founding of the Tang Dynasty in here, you could make sure it was padded out to four digits.&lt;/p&gt;
&lt;p&gt;Unfortunately, if you wanted to track, say, the death of Caesar Augustus in 14AD, that&amp;#39;ll only pad out to &amp;#34;014&amp;#34;, which raises the question: what even is the point of this padding? And how many pre-1000 dates did the program handle? The answer to both questions is &amp;#34;none&amp;#34;. Later code reformatted the date anyway, using the built in date types, even.&lt;/p&gt;
&lt;!-- Easy Reader Version: Note the lack of a question mark. It isn't a question, rhetorical or otherwise. --&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>25</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/historical-pads</wfw:comment></item><item><dc:creator>Ellis Morning</dc:creator><title>It's all Part 1 of the Process</title><link>https://thedailywtf.com/articles/it-s-all-part-1-of-the-process</link><category>Feature Articles</category><pubDate>Wed, 23 Sep 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/it-s-all-part-1-of-the-process</guid><description>&lt;p&gt;Our submitter &lt;b&gt;Tim C.&lt;/b&gt; shares his tale of an especially brutal culture clash:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I had co-founded a software startup doing stock market surveillance. In the early 2000s, the WTF Exchange (WTFX) was a major customer of ours. We were one part of a major project of theirs, a complete overhaul of their trading engine and IT systems.&lt;/p&gt;

&lt;p&gt;Compared to our other clients, WTFX was quite bureaucratic. There seemed to be a strong focus on the process, rather than the mission or the result. They were even explicit about this, telling us, &amp;#34;The process &lt;i&gt;is&lt;/i&gt; the deliverable.&amp;#34;&lt;/p&gt;

&lt;p style="float:right; padding-left:10px; padding-bottom:10px;"&gt;&lt;a title="GanttChartAnatomy.png:Garrybooker at en.wikipedia Later versions were uploaded by Abdull at en.wikipedia. derivative work: Malyszkz, Public domain, via Wikimedia Commons" href="https://commons.wikimedia.org/wiki/File:GanttChartAnatomy.svg"&gt;&lt;img itemprop="image" width="300" alt="GanttChartAnatomy" src="https://thumb.wikimedia.org/wikipedia/commons/thumb/5/57/GanttChartAnatomy.svg/330px-GanttChartAnatomy.svg.png?utm_source=commons.wikimedia.org&amp;amp;utm_campaign=index&amp;amp;utm_content=thumbnail"/&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;I believe they made that explicit in talking to us because our culture was quite agile and thereby contrasted, or clashed, with the culture of everyone else working on the project.&lt;/p&gt;

&lt;p&gt;&amp;#34;Predictability&amp;#34; was another buzzword they used to admonish us. We were required and expected to abide by the grand &amp;#34;waterfall&amp;#34; design and project plan and project timeline.  The grand project was controlled via an enormous Gantt chart and they hated having to make any change to the Gantt chart.&lt;/p&gt;

&lt;p&gt;There was one report which was central to the Exchange&amp;#39;s surveillance department. The occasional opportunities I got to talk directly to end-users, they always stressed the importance of this report, and the importance of it updating immediately to changes in the filtering criteria, and the importance of the fine details such as colour-coding cells based on certain rules.&lt;/p&gt;

&lt;p&gt;It became clear to me that we could not handle this report using a report definition file fed into our general report-writing module. It called for a custom piece of software. So over the course of the next weekend, in my hotel room, I whipped up a solution for these users: a whole new module to be added to our suite. It was maybe not perfect, but it was largely complete by the time I proudly unveiled my creation the next Monday.&lt;/p&gt;

&lt;p&gt;However, instead of a pat on the back, I was greeted by looks of horror. This module had a whole new name, was not mentioned anywhere in the giant Gantt chart, had never been mentioned before as a concept in any specification document.&lt;/p&gt;

&lt;p&gt;I had failed at &amp;#34;predictability.&amp;#34; I had unleashed on the poor customer an urgent requirement to do a whirlwind set of meetings and priority changes and updates to the specification documentation and the giant Gantt chart.

&lt;/p&gt;&lt;p&gt;In short, I had thrown the whole project into chaos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This wasn&amp;#39;t Tim&amp;#39;s last brush with bureaucracy gone mad! Stay tuned for Part 2.&lt;/p&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>19</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/it-s-all-part-1-of-the-process</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: The John Cage Variable</title><link>https://thedailywtf.com/articles/the-john-cage-variable</link><category>CodeSOD</category><pubDate>Tue, 22 Sep 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/the-john-cage-variable</guid><description>&lt;p&gt;&lt;strong&gt;David C&lt;/strong&gt; sends us a true confession.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For my job, I write C++ code as if it was a scripting language (long story) to produce programmatic animations for videos.  Given that these are &amp;#34;write-and-run-once-and-never-look-at-it-again&amp;#34; programs, I tend to not try as hard to make my code good.  But once I wrote this line of code, I had to take a step back and reevaluate my life choices.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-cpp"&gt;&lt;span class="hljs-built_in"&gt;fade_out&lt;/span&gt;(scene, length4-&amp;gt;&lt;span class="hljs-built_in"&gt;range&lt;/span&gt;(&lt;span class="hljs-number"&gt;0&lt;/span&gt;, &lt;span class="hljs-number"&gt;3&lt;/span&gt;), length4_3_3, length4[&lt;span class="hljs-number"&gt;4&lt;/span&gt;], length4[&lt;span class="hljs-number"&gt;5&lt;/span&gt;]-&amp;gt;&lt;span class="hljs-built_in"&gt;range&lt;/span&gt;(&lt;span class="hljs-number"&gt;0&lt;/span&gt;, &lt;span class="hljs-number"&gt;3&lt;/span&gt;));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is a natural consequence of passing parameters as arrays, it seems; instead of having meaningful named values in a &lt;code&gt;struct&lt;/code&gt; or similar, we have all these things packed into arrays. We can see a long ago attempt at using variable, badly, in the John Cage variable: &lt;code&gt;length4_3_3&lt;/code&gt;. John Cage&amp;#39;s (in)famous composition, &amp;#34;4:33&amp;#34; calls into question what precisely even is music, just like this variable calls into question what even is a variable name- because this is clearly a range expression of size 1. &lt;code&gt;length4-&amp;gt;range(3,1)&lt;/code&gt;, or more reasonably, probably &lt;code&gt;length4[3]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Where a normal variable name might give us some indication about what its contents mean, this gives us none of that, just a statement of how we could acquire those contents if we ever wanted them again.&lt;/p&gt;
&lt;p&gt;For disposable code, this is hardly the worst thing I&amp;#39;ve ever seen, but is any code truly disposable? You always find yourself wanting to pull some piece of it forward into the next project, inevitably. Read the third chapter of &lt;em&gt;Structure and Interpretation of Computer Programs&lt;/em&gt; and consider yourself absolved. Go forth and sin no more.&lt;/p&gt;
&lt;!-- Easy Reader Version: 4:33 isn't even John Cage's real investigation into "what even is music", because he goes on a much more interesting quest than that. --&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>10</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/the-john-cage-variable</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>The Weakest Leg</title><link>https://thedailywtf.com/articles/the-weakest-leg</link><category>Feature Articles</category><pubDate>Mon, 21 Sep 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/the-weakest-leg</guid><description>&lt;p&gt;On July 10 2026, a life insurance company called TruStage had a &amp;#34;cybersecurity incident&amp;#34;. According to an update posted five days later, when they revealed the incident, they are &amp;#34;continuing to work carefully and urgently to understand the facts, and the company will communicate appropriately as its understanding of the situation evolves.&amp;#34;&lt;/p&gt;
&lt;p&gt;This work, according to their outage page (last updated on September 11th, at the time of this writing), &lt;em&gt;is continuing&lt;/em&gt;. Every major business function is listed as &amp;#34;partially available&amp;#34;. They have some text explaining that they can&amp;#39;t simply turn the system back on, because safety.&lt;/p&gt;
&lt;p&gt;They don&amp;#39;t know what data was compromised. They don&amp;#39;t know when they&amp;#39;ll have everything back up. As of &lt;a href="https://thecudaily.com/more-than-a-dozen-lawsuits-have-now-been-filed-over-trustage-cybersecurity-incident/"&gt;mid-August&lt;/a&gt; they had gotten so far as setting up a &amp;#34;clean&amp;#34; environment that they could start migrating services to. The only good news is that some of their services are supplied to credit unions for banking, &lt;a href="https://hoploninfosec.com/trustage-cybersecurity-incident"&gt;and those were on different systems&lt;/a&gt;, so only their insurance packages were compromised. I also suspect the fact that they serve credit unions is the only thing keeping the business afloat, because failing to handle transactions for &lt;em&gt;months&lt;/em&gt; seems like a terminal event for most businesses.&lt;/p&gt;
&lt;p&gt;Obviously, this also means they&amp;#39;re embroiled in an ever growing number of lawsuits from a variety of parties. It also highlights something about how insurance works: it&amp;#39;s middlemen all the way down.&lt;/p&gt;
&lt;p&gt;TruStage will issue policies, but their connection to the actual policy holder will likely be routed through a number of different partners. Like, for example, Ethos.&lt;/p&gt;
&lt;p&gt;Ethos uses &amp;#34;AI&amp;#34; to &amp;#34;democratize&amp;#34; insurance. Feed your data into their AI, and in minutes they&amp;#39;ll pair you up with a policy. Which, while using machine learning to do things like assess insurance risk seems like a pretty reasonable idea, in this age of AI hype, one has to wonder how this actually is implemented and how it works in practice.&lt;/p&gt;
&lt;p&gt;But Ethos isn&amp;#39;t the end of the chain! Other companies live downstream from Ethos, for example, Family First Life. A customer might reach out to FFL to get a policy, FFL reaches out to Ethos (or one of many other partners), and Ethos reaches out to one of its partners (TruStage being one of their largest), and boom: an insurance happens. Like I said, it&amp;#39;s middlemen all the way down.&lt;/p&gt;
&lt;p&gt;But now, here&amp;#39;s the problem: TruStage issued a bunch of policies, and then stopped being able to do business. They stopped being able to do even vital things, like process payments. And you know what happens when payments aren&amp;#39;t made on a life insurance policy? It lapses. It goes away. You no longer have insurance. And the agents who sell those policies are often paid a commission based on the value of the first few months of the policy&amp;#39;s life (since life insurance is expected to be a long term investment). If the policy lapses, those commissions vanish, companies like Ethos (or downstream partners like FFL) get chargebacks on the value of those failed policies.&lt;/p&gt;
&lt;p&gt;This makes some people, like FFL&amp;#39;s President, Shawn Meaike, &lt;a href="https://hntrbrk.com/breaking-news/ethos-trustage"&gt;very unhappy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What we have here is a pretty egregious failure of cybersecurity and disaster recovery on the part of TruStage. It&amp;#39;s an embarrassing and potentially terminal event for them. It&amp;#39;s awful for the customers who bought insurance policies to give themselves peace of mind, only to discover their policies lapse because TruStage &lt;em&gt;can&amp;#39;t take their money&lt;/em&gt;. It&amp;#39;s creating mild chaos in the entire industry. That&amp;#39;s all interesting, but not why I wanted to write an article about this. I wanted to write about &lt;em&gt;the incredible cringe&lt;/em&gt;.&lt;/p&gt;
&lt;iframe width="920" height="517" src="https://www.youtube.com/embed/hWLKKCXQztg" title="FFL Conference" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""&gt;&lt;/iframe&gt;
&lt;p&gt;In this clip from an insurance industry conference, Meaike brings up all of their partners for a &amp;#34;carrier panel&amp;#34;. He then proceeds to line them up from stage right to stage left, ranking them as &amp;#34;weakest&amp;#34; to &amp;#34;strongest&amp;#34;. Ethos, who sells TruStage policies, is labeled as the weakest.&lt;/p&gt;
&lt;p&gt;&amp;#34;You have the weakest leg,&amp;#34; he says, pointing at the reps from Ethos, to laughter from the audience, and then indicates the other side of the line represents &amp;#34;the strongest leg.&amp;#34; Meaike hands the microphone to an Ethos employee, Dylan Cummings, &amp;#34;We&amp;#39;ll start with you.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;I want to start out by thanking everyone,&amp;#34; Cummings says.&lt;/p&gt;
&lt;p&gt;Meaike cuts him off. &amp;#34;Hey, hey, hey, hey. I&amp;#39;m gonna help you. Why don&amp;#39;t you start by saying you&amp;#39;re sorry.&amp;#34;&lt;/p&gt;
&lt;p&gt;The crowd yells out, &amp;#34;Yes!&amp;#34; and applauds this idea.&lt;/p&gt;
&lt;p&gt;&amp;#34;Say &amp;#39;We have a carrier that&amp;#39;s shut down&amp;#39;,&amp;#34; Meakie continues, &amp;#34;&amp;#39;and I&amp;#39;m mother-freaking sorry.&amp;#39;&amp;#34;&lt;/p&gt;
&lt;p&gt;Yes, he said &amp;#34;mother-freaking&amp;#34;, on stage.&lt;/p&gt;
&lt;p&gt;So let&amp;#39;s recap. An insurance company gets pwned so hard they can&amp;#39;t run operations for &lt;em&gt;months&lt;/em&gt;. People&amp;#39;s policies lapse, simply because they can&amp;#39;t &lt;em&gt;give their money&lt;/em&gt; to the insurance company. Which 100% sucks for those customers, though at least with life insurance we expect very few of them are missing their payout- hopefully! This chain cascades through the network of partners, until it culminates in the president of one company publicly humiliating the senior account manager at a middleman company, during an industry conference.&lt;/p&gt;
&lt;p&gt;Nobody comes off looking particularly good here, obviously. Meakie is a jerk. TruStage is institutionally incompetent. Ethos is in a bit of a rock-and-a-hard-place situation, and Cummings is trying to do his best to tap dance his way out of oblivion, but it seems like the AI driven insurance startup just isn&amp;#39;t a good partner even &lt;em&gt;before&lt;/em&gt; their main issuer died.&lt;/p&gt;
&lt;p&gt;All in all, it feels like a Tim Robinson sketch, or perhaps a Nathan Fielder bit. We&amp;#39;re one step away from Meakie calling Cummings a &amp;#34;Wizard of Loneliness.&amp;#34;&lt;/p&gt;
&lt;iframe width="920" height="517" src="https://www.youtube.com/embed/5Ol3pTTVDjU" title="The Wizard of Loneliness (Nathan for You)" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""&gt;&lt;/iframe&gt;
&lt;!-- Easy Reader Version: This isn't viral marketing for Nathan Fielder's new documentary, but it could be if someone wanted to pay me. --&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>26</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/the-weakest-leg</wfw:comment></item></channel></rss>