<?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>Tue, 21 Jul 2026 16:47:29 GMT</lastBuildDate><item><dc:creator>Mark Bowytz</dc:creator><title>CodeSOD: Classic WTF: Fork and Log</title><link>https://thedailywtf.com/articles/classic-wtf-fork-and-log</link><category>CodeSOD</category><pubDate>Tue, 21 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/classic-wtf-fork-and-log</guid><description>&lt;blockquote&gt;We keep our summer break going. Today, there&amp;#39;s something floating in the pool, and I don&amp;#39;t think it&amp;#39;s a Snickers bar. &lt;a href="https://thedailywtf.com/articles/Fork-and-Log"&gt;Original&lt;/a&gt;. --&lt;strong&gt;Remy&lt;/strong&gt;&lt;/blockquote&gt;

&lt;p&gt;A few years back, &lt;strong&gt;Adam C.&lt;/strong&gt; was brought in to help with some performance problems that appeared while load testing a VXML Platform.  The project was already well behind and they couldn&amp;#39;t figure out why the system kept falling over under a very slight load. To make matters worse, Adam had absolutely no prior knowledge of the system or its software other than Wikipedia’s definition of what &lt;a href="http://en.wikipedia.org/wiki/VoiceXML"&gt;VXML&lt;/a&gt; is. 
&lt;/p&gt;&lt;p&gt;
A veteran to these sorts of situations, Adam grabbed a coffee, a donut, and then started picking through the application logs to get a feel for what the system is doing and where something might be going wrong.
&lt;/p&gt;&lt;p&gt;
Looking in /var/log/messages, he was pleased to find with several days’ worth of messages, but over and over again, the same entry popped up:
&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;Exception encountered writing error log. 
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&amp;#34;Seriously, who logs an error that they can&amp;#39;t log an error? ...and is that even possible?&amp;#34; Adam wondered aloud after seeing the same senseless message for what he figured to be the hundredth time.
&lt;/p&gt;&lt;p&gt;
Frustrated, and hoping to learn what ludicrous conditions might precipitate a log to contain such a message, Adam dug into the source and hit paydirt in the form of this wonderful nugget of code:
&lt;/p&gt;&lt;blockquote&gt;
&lt;pre&gt;public void error(String logID, String errStr) {
  StringBuffer errLogCmd = new StringBuffer(&amp;#34;/usr/bin/logger -p &amp;#34;);
  try {
    Runtime rt = Runtime.getRuntime();
    errLogCmd.append(errlogFacility);
    errLogCmd.append(&amp;#34; -t &amp;#34;);
    errLogCmd.append(logID);
    errLogCmd.append(&amp;#34; &amp;#34;);
    errLogCmd.append(errStr);
    rt.exec(errLogCmd.toString());
  } catch (Exception ele) {
    System.out.println(&amp;#34;Exception encountered writing error log.&amp;#34; + ele.getMessage());
  }
}
&lt;/pre&gt;
&lt;/blockquote&gt;
As he mentally parsed his way through the code, Adam could feel his breakfast tickling up from the back of his throat in reaction to the number of WTF’s he found himself facing.
&lt;p&gt;&lt;/p&gt;&lt;p&gt;
He couldn’t decide what about the implementation was worse -  forking off an external process to log something,  the fact that log4j could have been used to send stuff to syslog (which the project used elsewhere), or that  since the program&amp;#39;s output was already piped to /usr/bin/log, just doing a System.out.println() would have been equivalent to this code.
&lt;/p&gt;&lt;p&gt;
As it turned out, this wasn’t the root cause behind the performance problems, but needless to say, that code got junked rather quickly and he moved on to looking for the next performance bottleneck.
&lt;/p&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>3</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/classic-wtf-fork-and-log</wfw:comment></item><item><dc:creator>Alex Papadimoulis</dc:creator><title>CodeSOD: Classic WTF: The Table Selector</title><link>https://thedailywtf.com/articles/classic-wtf-the-table-selector</link><category>CodeSOD</category><pubDate>Mon, 20 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/classic-wtf-the-table-selector</guid><description>&lt;blockquote&gt;It&amp;#39;s summer break time, which as always, means we dip back into classic articles. Today, we pick which table we want. &lt;a href="https://thedailywtf.com/articles/The-Table-Selector"&gt;Original&lt;/a&gt;. --&lt;strong&gt;Remy&lt;/strong&gt;&lt;/blockquote&gt;

&lt;p&gt;&amp;#34;In my native language of German,&amp;#34; writes &lt;b&gt;Christian&lt;/b&gt;, &amp;#34;the word quellcode is a pretty direct translation of &amp;#39;source code&amp;#39;.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Unfortunately, bad code seems to cross language barriers - as does that famous three-letter explicit adjective. But occasionally I’ll find a piece of quellcode that deserves its own special, localized expletive: quäl-kot. When I stumbled across this interface in our quellcode, &lt;em&gt;quäl-kot&lt;/em&gt; was the first thing that came to my mind.&amp;#34;&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;public interface ITableSelector
{
    string selectTable1();

    string selectTable2();

    string selectTable3();

    string selectTable4a();

    string selectTable4b();

    string selectTable5();

    string selectTable6();

    string selectTable7a();

    string selectTable7b();

    string selectTable8();

    string selectTable9a();

    string selectTable9b();

    string selectTable10();

    string selectTable11();

    string selectTable12();

    string selectTable13();

    string selectTable14a();

    string selectTable14b();

    string selectTable14c();

    string selectTable14d();

    string selectTable15();

    string selectTable16();

    string selectTable17();

    string selectTable18();

    string selectTable19();

    string selectTable20();

    string selectTable21a();

    string selectTable21b();

    string selectTable22();

    string selectTable23();

    string selectTable24();

    string selectTable25();

    string selectTable26();

    string selectTable27();

    string selectTable28();

    string selectTable29();

    string selectTable30();

    string selectTable31();
}&lt;/pre&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/classic-wtf-the-table-selector</wfw:comment></item><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: Princess Pricing </title><link>https://thedailywtf.com/articles/princess-pricing</link><category>Error'd</category><pubDate>Fri, 17 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/princess-pricing</guid><description>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Sam&lt;/strong&gt; suggests this Error&amp;#39;d indicates 
&amp;#34;Disney+ preparing the ground for usage-based billing.&amp;#34; I&amp;#39;m intrigued by the idea that Disney might charge by the minute, but I suspect the reality is far more mundane.
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#13e08caf609f4133afd419a76acb432a"&gt;&lt;img itemprop="image" border="0" alt="13e08caf609f4133afd419a76acb432a" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/15/13e08caf609f4133afd419a76acb432a.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Silly prices at online shopping sites don&amp;#39;t usually make it through the gauntlet here, but I&amp;#39;m making an exception for the math, as 
&lt;strong&gt;Rob H.&lt;/strong&gt; points out 
&amp;#34;it ain&amp;#39;t mathin&amp;#39;.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#0924416949684290b36ad0d823129181"&gt;&lt;img itemprop="image" border="0" alt="0924416949684290b36ad0d823129181" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/15/0924416949684290b36ad0d823129181.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;and 
&lt;strong&gt;Harrison&lt;/strong&gt; suggests a novel kind of discounting math 
&amp;#34;I went to the supermarket later at night for some
beers, and had a snoop around the yellow sticker items
for anything I might need or could freeze. This bakery
item was priced in reverse, Was: 0.00, Now 1.99, discounted
by negative infinity percent, and infinity is even printed upside
down somehow.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#d41527fab58d46fa97f4477dfcbf659d"&gt;&lt;img itemprop="image" border="0" alt="d41527fab58d46fa97f4477dfcbf659d" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/15/d41527fab58d46fa97f4477dfcbf659d.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;We&amp;#39;ve got a mojibake from 
&lt;strong&gt;dragoncoder047&lt;/strong&gt;:
&amp;#34;Was browsing through the widget options on my iPhone home
screen and found that Game Center had decided to do
this. Mind you, my iPhone was, and always had been,
set to English.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#c4fb48f719b34b5393e274cc6bc48f2a"&gt;&lt;img itemprop="image" border="0" alt="c4fb48f719b34b5393e274cc6bc48f2a" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/15/c4fb48f719b34b5393e274cc6bc48f2a.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Finally a combination of typical time travel and package tracker shenanigans, not explained by time zone hijinks.
&lt;strong&gt;Evelyn&lt;/strong&gt; notes 
&amp;#34;Apparently the package was registered in July, on its way
during January, and then got back to July.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#ef7d6784e50a48eebfaf4b912c8caa55"&gt;&lt;img itemprop="image" border="0" alt="ef7d6784e50a48eebfaf4b912c8caa55" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/15/ef7d6784e50a48eebfaf4b912c8caa55.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>9</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/princess-pricing</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Wait Longer</title><link>https://thedailywtf.com/articles/wait-longer</link><category>CodeSOD</category><pubDate>Thu, 16 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/wait-longer</guid><description>&lt;p&gt;&lt;strong&gt;Karen&lt;/strong&gt; was maintaining some specification tests that were flaky. Not &lt;em&gt;extremely&lt;/em&gt; flaky, but three or four times out of a thousand, the tests would just fail. The tests were complicated, and some of the operations were timing sensitive, so it wasn&amp;#39;t precisely surprising- but the problem was that they were actually generous with their timing windows. The unit tests passed consistently, it was only these functional, specification-based tests that failed.&lt;/p&gt;
&lt;p&gt;So, for example, there were sections in the tests where they wanted to wait at &lt;em&gt;least&lt;/em&gt; 2ms. Since the code and tests were in TypeScript, they used the &lt;code&gt;setTimeout&lt;/code&gt; function, which per standard JavaScript documentation &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout"&gt;warns that it may wait longer&lt;/a&gt;. But again, Karen was &lt;em&gt;fine&lt;/em&gt; with longer.&lt;/p&gt;
&lt;p&gt;Unfortunately for Karen, the documentation for NodeJS is less specific, as &lt;a href="https://nodejs.org/api/timers.html#settimeoutcallback-delay-args"&gt;it makes no guarantees&lt;/a&gt; about when the timeout function gets invoked. This means that it can fire the timeout &lt;em&gt;before&lt;/em&gt; the time has elapsed.&lt;/p&gt;
&lt;p&gt;After many, many hours of debugging, that was exactly the situation that Karen found herself in. Which is why her very simple &lt;code&gt;wait&lt;/code&gt; function went from:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-typescript"&gt;&lt;span class="hljs-keyword"&gt;export&lt;/span&gt; &lt;span class="hljs-keyword"&gt;const&lt;/span&gt; &lt;span class="hljs-title function_"&gt;wait&lt;/span&gt; = (&lt;span class="hljs-params"&gt;ms:&lt;span class="hljs-built_in"&gt;number&lt;/span&gt;&lt;/span&gt;) =&amp;gt; &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Promise&lt;/span&gt;(&lt;span class="hljs-function"&gt;(&lt;span class="hljs-params"&gt;complete&lt;/span&gt;) =&amp;gt;&lt;/span&gt; &lt;span class="hljs-built_in"&gt;setTimeout&lt;/span&gt;(complete, ms));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To the much more awkward:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-typescript"&gt;&lt;span class="hljs-keyword"&gt;export&lt;/span&gt; &lt;span class="hljs-keyword"&gt;const&lt;/span&gt; wait = (&lt;span class="hljs-attr"&gt;ms&lt;/span&gt;: &lt;span class="hljs-built_in"&gt;number&lt;/span&gt;) {
    &lt;span class="hljs-keyword"&gt;const&lt;/span&gt; target = performance.&lt;span class="hljs-title function_"&gt;now&lt;/span&gt;() + ms;
    &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;Promise&lt;/span&gt;(&lt;span class="hljs-function"&gt;(&lt;span class="hljs-params"&gt;complete&lt;/span&gt;) =&amp;gt;&lt;/span&gt; {
        &lt;span class="hljs-keyword"&gt;const&lt;/span&gt; &lt;span class="hljs-title function_"&gt;checkReady&lt;/span&gt; = (&lt;span class="hljs-params"&gt;&lt;/span&gt;) =&amp;gt; {
            &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (performance.&lt;span class="hljs-title function_"&gt;now&lt;/span&gt;() &amp;gt; target) {
                &lt;span class="hljs-title function_"&gt;complete&lt;/span&gt;();
            } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
                &lt;span class="hljs-built_in"&gt;setTimeout&lt;/span&gt;(checkReady, &lt;span class="hljs-number"&gt;1&lt;/span&gt;);
            }
        }
        &lt;span class="hljs-built_in"&gt;setTimeout&lt;/span&gt;(checkReady, &lt;span class="hljs-number"&gt;1&lt;/span&gt;);
    });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This version of the function checks the time every millisecond, and only completes the operation if we&amp;#39;ve waited &lt;em&gt;at least&lt;/em&gt; as long as our target duration. This ensures that the timeout never fires &lt;em&gt;too soon&lt;/em&gt; and it fixes the janky tests. But it&amp;#39;s also terrible. Terrible that it exists. Terrible that this is the best solution. Terrible that our functional tests need to be so time sensitive. And terrible that the Node runtime actually breaks the one consistent scheduling guarantee that pretty much every other scheduler does: that it&amp;#39;ll wait &lt;em&gt;at least&lt;/em&gt; as long as you asked, but might wait much longer.&lt;/p&gt;
&lt;p&gt;At best, we can say, &amp;#34;at least it&amp;#39;s only testing code.&amp;#34;&lt;/p&gt;
&lt;!-- Easy Reader Version: wait for it… --&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/wait-longer</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: The Error Check</title><link>https://thedailywtf.com/articles/the-error-check</link><category>CodeSOD</category><pubDate>Wed, 15 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/the-error-check</guid><description>&lt;p&gt;Today&amp;#39;s submission is less a WTF and more a, &amp;#34;Yeah, that&amp;#39;d annoy me too.&amp;#34;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stevie&lt;/strong&gt; works in a code-base that&amp;#39;s largely C, which means function return values are usually used to communicate to status codes. The standard:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-c"&gt;BOOL success = someFunc();
&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (!success) {&lt;span class="hljs-comment"&gt;// handle the error&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If &lt;code&gt;someFunc&lt;/code&gt; returns &lt;code&gt;TRUE&lt;/code&gt;, we succeeded, otherwise we failed.&lt;/p&gt;
&lt;p&gt;There&amp;#39;s nothing wrong with that convention. But there is something wrong with one of the long-time developers on the project, because they have their own idiom for doing this. And they&amp;#39;ve been around long enough that &lt;em&gt;their&lt;/em&gt; approach is the convention other developers follow. It&amp;#39;s not &lt;em&gt;wrong&lt;/em&gt;, per se, just confusing:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-c"&gt;BOOL error = someFunc();
&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (error == FALSE)
{
    &lt;span class="hljs-comment"&gt;//handle the error&lt;/span&gt;
    errorCode = GetLastError();
    &lt;span class="hljs-comment"&gt;//…&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Yes, pretty much anywhere an error can happen, they check if &lt;code&gt;error == FALSE&lt;/code&gt;, and if that&amp;#39;s true, they have an error.&lt;/p&gt;
&lt;p&gt;I&amp;#39;d say, &amp;#34;at least they&amp;#39;re consistent&amp;#34;, but they&amp;#39;re not. It&amp;#39;s the convention, sure, but nobody wrote this down as the convention. New developers come in all the time, and they start out writing code in a more &amp;#34;normal&amp;#34; pattern. But the existing code has its pattern, and there is a &lt;em&gt;lot&lt;/em&gt; of it. It has a mass and an inertia that is stronger than any developer. They don&amp;#39;t change the code, the code &lt;em&gt;changes them&lt;/em&gt;.&lt;/p&gt;
&lt;!-- Easy Reader Version: if (easyReader == FALSE) This doesn't go the way you'd expect, does it? --&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/the-error-check</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: AAYFN</title><link>https://thedailywtf.com/articles/aayfn</link><category>CodeSOD</category><pubDate>Tue, 14 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/aayfn</guid><description>&lt;p&gt;&lt;strong&gt;Jason M&lt;/strong&gt; sends us some Ruby code.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-ruby"&gt;&lt;span class="hljs-keyword"&gt;def&lt;/span&gt; &lt;span class="hljs-title function_"&gt;bv&lt;/span&gt;(&lt;span class="hljs-params"&gt;prop, tv=&lt;span class="hljs-string"&gt;&amp;#34;Yes&amp;#34;&lt;/span&gt;, fv=&lt;span class="hljs-string"&gt;&amp;#34;No&amp;#34;&lt;/span&gt;, nv=&lt;span class="hljs-string"&gt;&amp;#34;Not Specified&amp;#34;&lt;/span&gt;&lt;/span&gt;)
  v = &lt;span class="hljs-variable language_"&gt;self&lt;/span&gt;.send(prop)
  &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; v === &lt;span class="hljs-literal"&gt;true&lt;/span&gt;
    tv
  &lt;span class="hljs-keyword"&gt;elsif&lt;/span&gt; v === &lt;span class="hljs-literal"&gt;false&lt;/span&gt;
    fv
  &lt;span class="hljs-keyword"&gt;else&lt;/span&gt;
    nv
  &lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
 &lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The obvious WTF here is the function name and parameter names. &lt;abbr title="Always Abbreviate Your Function Names"&gt;AAYFN&lt;/abbr&gt;(always abbreviate your function names) seems to be the convention here. But it also contains a more Ruby-specific WTF.&lt;/p&gt;
&lt;p&gt;The function name &lt;code&gt;bv&lt;/code&gt; is short for &amp;#34;boolean value&amp;#34;, obviously. &lt;code&gt;tv&lt;/code&gt; is the &amp;#34;true value&amp;#34;, &lt;code&gt;fv&lt;/code&gt; is the false value, and &lt;code&gt;nv&lt;/code&gt; is the null value. So this is really about pretty-printing boolean values and converting them to strings. While the terrible names make it hard to understand, it&amp;#39;s not &lt;em&gt;that hard&lt;/em&gt; to figure out what&amp;#39;s going wrong here. I hate it, don&amp;#39;t get me wrong, but it just makes me sigh with disappointment, not groan.&lt;/p&gt;
&lt;p&gt;No, the thing that makes me groan is &lt;code&gt;v = self.send(prop)&lt;/code&gt;. This is a very Ruby idiom that lets you access a member of the class by name; essentially it&amp;#39;s like doing &lt;code&gt;self.prop&lt;/code&gt;, but since &lt;code&gt;prop&lt;/code&gt; is a variable containing a property name, we have to &lt;code&gt;send&lt;/code&gt; it.&lt;/p&gt;
&lt;p&gt;This is metaprogramming by strings, which is the main reason I end up hating it. But in this specific instance, it offers us a lot of potential issues. First, if &lt;code&gt;prop&lt;/code&gt; is anything not boolean, we just return &amp;#34;Not Specified&amp;#34;, which is incredibly misleading. I&amp;#39;d argue that if we attempt to use it on a non-boolean field we should throw an exception. Which opens the question: if &lt;code&gt;prop&lt;/code&gt; doesn&amp;#39;t &lt;em&gt;exist&lt;/em&gt;, is that a non-boolean field, or is that a &amp;#34;enh, just call it null&amp;#34; situation? Because right now, that &lt;em&gt;will&lt;/em&gt; throw an exception. It&amp;#39;ll also throw an exception if the thing being accessed is a function that takes parameters. These behaviors may be surprising.&lt;/p&gt;
&lt;p&gt;Now, I don&amp;#39;t know the calling pattern. It&amp;#39;s possible that whatever function calls this already has a good list of the allowed boolean values, and will never call this on a &lt;code&gt;prop&lt;/code&gt; that doesn&amp;#39;t exist. Certainly, that&amp;#39;s what &lt;a href="https://rubyguides.dev/reference/core-classes/send-method/#using-send-with-care"&gt;the Ruby docs recommend&lt;/a&gt;. But I&amp;#39;m going to hate it anyway, because this kind of runtime metaprogramming by passing strings around is eternally asking for trouble. And while I haven&amp;#39;t done a huge amount of Ruby, I&amp;#39;ve done enough to know that any non-trivial codebase &lt;em&gt;ends up like this&lt;/em&gt; once the metaprogramming band-aid is taken off.&lt;/p&gt;
&lt;p&gt;Now, if you don&amp;#39;t mind, I&amp;#39;ll go back to doing my metaprogramming with C++ templates, which are simple, clear, and never result in wildly unmaintainable code because you ended up reimplementing LISP in template operations.&lt;/p&gt;
&lt;!-- Easy Reader Version: "Just monkey patch it," seems to be the dominant way to solve problems in Ruby, and I hate it --&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>17</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/aayfn</wfw:comment></item><item><dc:creator>Ellis Morning</dc:creator><title>The Easy No</title><link>https://thedailywtf.com/articles/the-easy-no</link><category>Feature Articles</category><pubDate>Mon, 13 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/the-easy-no</guid><description>&lt;blockquote&gt;
&lt;p&gt;There were thousand tickets in the backlog, and I was on the trail of a &lt;a href="https://thedailywtf.com/articles/the-hot-fix"&gt;weird printer issue&lt;/a&gt;. I had a suspect, but that wasn&amp;#39;t enough to close the ticket. I&amp;#39;m &lt;strong&gt;Anonymous&lt;/strong&gt;. This is my story.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Whenever you hit the Print button, a request launches into the ether. “Print one copy of this file, double-sided.”&lt;/p&gt;
&lt;p&gt;But you can’t just chuck it out there aimlessly. You gotta tell it where to go. So that’s why we have Internet Protocol, or IP. Every computer, every printer, every device on every network has one or more IP addresses for different operations. They’re just like the address you scribble on the envelope holding Grandma’s Christmas card. Send your print request to the right IP, and you’re in business. Send it to the wrong IP, and they’ll be shaking their heads on the other end. “Print? But all I know how to do is tell you the weather!”&lt;/p&gt;
&lt;p&gt;As for what happens next, you’re at the mercy of the program’s error handling. If you’re lucky, they’ll send a detailed error message. If you’re not, they could ignore you, act up in weird ways, or completely self-destruct in a violent crash.&lt;/p&gt;
&lt;p&gt;I was neck-deep in a Tech Support ticket concerning a printer in Human Resources. Not only was Grandma’s Christmas card landing in Pluto, the Plutonians were writing back, in the form of mysterious complaints that were nothing like the documents the printer had been tasked with.&lt;/p&gt;
&lt;p&gt;My troubleshooting hadn’t shot much trouble at all, so I’d bugged some friends for ideas. Reynaldo had been reminded of an old, retired HR program for logging anonymous employee complaints. While our developer friend Megan quit our icy outdoor break spot to dig up dirt from the software side of things, Reynaldo and I went to his cubicle to trace IPs. He suspected a conflict … and that’s just what his command-line requests revealed. We leaned over his laptop together, studying a couple of terminal windows and their cryptic output to his even-more-cryptic inputs.&lt;/p&gt;
&lt;p&gt;“Whenever that printer got set up in HR, it received an IP that was already in use by this server—” he jabbed an index finger at the relevant part of the screen “—which is apparently still up and running, even though I swear it was decommissioned.” Reynaldo frowned. “Who wants to bet that stupid complaint program has some kind of ability to print cached complaints?”&lt;/p&gt;
&lt;p&gt;I frowned, too. “We won’t know for sure unless Megan digs something up.”&lt;/p&gt;
&lt;p&gt;Reynaldo flashed me a look of pure cynicism. It wasn’t an indictment of Megan’s skill, more skepticism toward the idea of anyone having properly documented this mess. We had better odds of hitting a billion-dollar jackpot.&lt;/p&gt;
&lt;p&gt;I sighed. “It’s an easy workaround, at least: assign the printer a new IP. But we’ve got bigger problems here. Why’s this zombie server still up and kicking? Why’d an IP conflict ever occur in the first place?”&lt;/p&gt;
&lt;p&gt;“Don’t get me started on our FUBAR IP allocation and tracking.” Reynaldo’s lowered voice contained plenty of venom. “We’re talking multiple pools to track, multiple spreadsheets that have to be manually edited. Problems that are easy enough to fix! Why spend money on honest-to-goodness network management software?”&lt;/p&gt;
&lt;p&gt;Short-term budgeting preventing long-term improvements: a damned shame we’d both seen all too many times. Being a tech support drone, having an innate desire to help that no amount of baloney could stamp out, I once more found myself longing to fix the unfixable.&lt;/p&gt;
&lt;p&gt;“In my ticket notes, I’ll make noise about a more permanent solution,” I said. “At the very least, some bigwig oughta leap at the chance to save 3 cents of electricity a year by putting the complaint-spewing server out of its misery.”&lt;/p&gt;
&lt;p&gt;I’d already resolved to contact Leila, the new head of HR, about this ticket. She needed to hear about Hothead, the manager-type who, in a fit of frustration, had taken a hair dryer to the same printer and nearly trashed it. I could also tell her about these lingering network vulnerabilities that would continue causing problems for everyone down the line.&lt;/p&gt;
&lt;p&gt;I decided to do it without telling Reynaldo. I had the feeling that if I let him in on it, his eyes would roll clear out of his skull.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;Working from Reynaldo’s cube, I assigned the HR printer a new IP address and once again cleared its queue. Then I sent Tony, the ticket holder, a private message asking him to give printing another go. I felt pretty good about his chances, but I’d wait for him to give me the all-clear before closing the ticket.&lt;/p&gt;
&lt;p&gt;With the messaging app still open on my phone, I saw that Megan had invited me to drop by her cube. From Networking Central, I hoofed it up to Developers’ Row.&lt;/p&gt;
&lt;p&gt;Megan’s cube was a familiar spot filled with bright, cartoony posters and figurines, the only splashes of color for miles. The titles and characters drew blanks in my over-the-hill brain. I kept meaning to ask her what they were, why she liked them. Another time, maybe. I found her with her back toward me, leaning intently in her swivel-chair toward the single monitor over her laptop docking station.&lt;/p&gt;
&lt;p&gt;“Now a good time?” I asked under my breath.&lt;/p&gt;
&lt;p&gt;She whirled around, tense, then relaxed with a smile, her gaze livelier than I’d seen it in a while. She picked up a small external memory stick from her desk to proffer my way. “That’s the HR application’s source code!” she murmured in conspiratorial fashion. “Guess where it came from?”&lt;/p&gt;
&lt;p&gt;I smirked. “I know the answer should be ‘a code repository,’ but in this joint, that’s asking too much.”&lt;/p&gt;
&lt;p&gt;“You’re right!” she replied. “It was never in a repo, never in source control. It lived and died on one dev’s local machine, a dev who retired way before I got here. His successor hung onto all the old code from that guy’s machine, just in case. But yeah, we don’t officially support the application anymore.”&lt;/p&gt;
&lt;p&gt;Megan turned around, using her keyboard to tab over to an open window in a code editor. From over her shoulder, I saw line after line of an archaic programming language that the Egyptians might’ve used to build the pyramids.&lt;/p&gt;
&lt;p&gt;“This code’s an undocumented disaster,” she said.&lt;/p&gt;
&lt;p&gt;“There was an IP conflict at that,” I told her. “The print requests were going to a server that’s still running this thing. We assigned the printer a new IP, but the mystery server remains a head-scratcher.”&lt;/p&gt;
&lt;p&gt;“I’ll trace through and figure out what it does when it gets a print request. Improve its error-handling in general,” Megan promised, more excited than daunted by the prospect. “I mean, if it is still up and running, I could tweak, recompile, and redeploy it so it doesn’t—”&lt;/p&gt;
&lt;p&gt;Insistent metallic knocks sounded behind us. “Excuse me!”&lt;/p&gt;
&lt;p&gt;It was the sort of pointed voice that somehow ignored your ears and stabbed into your gut instead. Megan froze, tense. I turned to find a woman at the threshold with the bearing of a vindictive hall monitor, rapping a fist against the cube’s bare metal frame.&lt;/p&gt;
&lt;p&gt;She leveled a withering frown at Megan. “I was hoping for a status update on the Hewville refresh! Did I hear you say you were planning to work on something else?” The question sounded more like a threat.&lt;/p&gt;
&lt;p&gt;This had to be Megan’s boss. Megan remained tense from head to foot. “I—”&lt;/p&gt;
&lt;p&gt;“I need you to focus on your assigned projects. The things you can actually bill your time against.” After delivering the condescending reminder, the boss’ glare shifted my way. “And you are?”&lt;/p&gt;
&lt;p&gt;I shoved unease aside and put on the game face I’d spent decades perfecting. “Tech Support. I meant no harm, ma’am. I was just asking Megan for help with an open support ticket.”&lt;/p&gt;
&lt;p&gt;“She doesn’t have time for that!” the boss scolded. “If you truly need help from this department, then you must escalate your ticket through the proper channels.”&lt;/p&gt;
&lt;p&gt;I already knew how that went: pulling together screenshots, logs, and other detailed information, only to receive half of a sentence fragment a few days later, asking for something I’d sent with the first message. In this case, I knew someone would just wag a finger at me about the HR application being out of support. Thanks but no thanks.&lt;/p&gt;
&lt;p&gt;Megan struggled to muster one last defense. “This program’s still running on a server somewhere!”&lt;/p&gt;
&lt;p&gt;“For changes to existing code, the proper procedure is to file a formal change request through the Project Management Team. The PMT will create a billing code and assign appropriate resources, if they deem it a proper use of development time.” The boss then looked at me like I was a used tissue she was ready to throw in the trash. “If that’s all, I suggest you head back to Tech Support, Mr. … ?”&lt;/p&gt;
&lt;p&gt;No way was I handing her my name on a platter. I tried to glance Megan’s way, but she was staring at her lap. I felt bad leaving her in that lurch, but staying would only make things worse for the both of us.&lt;/p&gt;
&lt;p&gt;“Later,” I said, both a goodbye and a promise.&lt;/p&gt;
&lt;p&gt;I got the hell out of Devsville, slipping down flight after flight of stairs with a lead weight in my chest. For a moment, Megan had brightened in the face of a collaborative challenge. I’d felt a little more alive, too.&lt;/p&gt;
&lt;p&gt;Thank God someone had been there to make sure no one helped each other.&lt;/p&gt;
&lt;p&gt;The same sicknesses plagued the joint year after year. Almighty budgets. Status quo worship. Hierarchy and miles of red tape. Promising young people like Megan had their spirits crushed, and schmucks like me just put their heads down. Still a huge pile of other support tickets waiting for me, after all.&lt;/p&gt;
&lt;p&gt;The frustration and resentment, the desire to do something to fix this, burned in my chest like a bonfire.&lt;/p&gt;
&lt;p&gt;Back at my desk, I found a message from Tony confirming the new printer was behaving at last. Bolstered by my friends’ findings, I closed his ticket with notes about how the resolution was only a band-aid on a gaping wound. I messaged Megan, too, thanking her for trying.&lt;/p&gt;
&lt;p&gt;And with that emotional bonfire still raging, I settled in and typed out a long email to Leila, detailing in full the most recent shenanigans I’d been a part of.&lt;/p&gt;
&lt;p&gt;By the time I finished, I had one bit of good news: Aggie, my old mentor who’d turned manager a few years back, had accepted my meeting request to meet the next afternoon.&lt;/p&gt;
&lt;p&gt;She wasn’t my boss, which meant it was still safe to vent her way. I had every intention. My resentment would no longer let itself be buried under this or that technical hiccup. It was insisting upon action.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;The next day, I walked to the downtown coffee shop well ahead of the appointed time, glad to have the excuse to be somewhere else. Bought myself a drink and sat down where I could watch the door.&lt;/p&gt;
&lt;p&gt;Five minutes late turned into ten … then twenty. No Aggie.&lt;/p&gt;
&lt;p&gt;It was totally unlike her. Sure, she’d canceled last-minute before, but she’d always got in touch with me to let me know.&lt;/p&gt;
&lt;p&gt;Caffeine jitters fueled a fear I couldn’t shake off. I sent PMs and left voicemails on her cell and work phones, asking her to respond when she could. Back at work, I asked around the department, including my boss.&lt;/p&gt;
&lt;p&gt;She’d been AWOL the whole day. No one knew what was up.&lt;/p&gt;
&lt;p&gt;Hours of work still stretched in front of me. I could barely sit in my chair, much less look at my monitor.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Just call me, Aggie,&lt;/i&gt; I willed, staring at the cell phone clutched in my hand.&lt;/p&gt;
&lt;p&gt;She didn’t. Not that afternoon, not that evening. Beneath my fear was this strange gut feeling, this knowing sense that my worries were justified. It was crazy, but there was no talking myself out of it.&lt;/p&gt;
&lt;p&gt;Early the next morning, they roped the whole department into the big conference room. Nobody knew what was going on until a small, ashen group of managers, directors, and directors of directors filed to the front and called for attention.&lt;/p&gt;
&lt;p&gt;I already knew, deep down, what was coming.&lt;/p&gt;
&lt;p&gt;“We’ve we received some very unfortunate news,” one of the senior directors spoke. “Agatha Shaw … passed away in her home after a heart attack.”&lt;/p&gt;
&lt;p&gt;A few gasps escaped the assembly. Otherwise, you could’ve heard a pin drop. Wide-eyed looks of shock surged through us like lightning.&lt;/p&gt;
&lt;p&gt;Aggie.&lt;/p&gt;
&lt;p&gt;My gut had known all along, but my brain still wasn’t having it. Somebody somewhere must have goofed up royal, I thought. Happens all the time in this joint. Aggie had more life and fight in her than I ever did. I—&lt;/p&gt;
&lt;p&gt;“Those of you who reported directly to Ms. Shaw will report to Bill Watson for now,” the director continued. “Dismissed.”&lt;/p&gt;
&lt;p&gt;The brass began showing themselves out.&lt;/p&gt;
&lt;p&gt;The rest of us just sat there, too stunned to move. &lt;i&gt;That’s it?&lt;/i&gt; I marveled. No memorial? No counseling? No time off? Not one drip of sympathy?&lt;/p&gt;
&lt;p&gt;I could only look on helplessly as Bill Watson, my boss, walked right over to me. He put his hand on my shoulder, leaned over, and muttered into my ear: “My office.”&lt;/p&gt;
&lt;p&gt;While my brain reeled, my feet stood me up obediently. They marched me right off to the next chair I dropped into, the one opposite the large desk in Bill’s office.&lt;/p&gt;
&lt;p&gt;He settled in on his side. “It’s a real shame about Aggie. We’re screwed without her.”&lt;/p&gt;
&lt;p&gt;I just sat there, still reeling.&lt;/p&gt;
&lt;p&gt;”My manager is looking for someone to step up in a big way.” Bill nodded in my direction. “You’re ready. You deserve it. Her direct reports are reporting to me for now; over the next few months, I’m transitioning them to you. The promotion will follow, as soon as the next performance review comes around!”&lt;/p&gt;
&lt;p&gt;We were just cogs in that joint. Never before had the point been driven home so viscerally. Righteous rage surged up from within, clearing my brain and shooting strength through my limbs. I jumped out of that chair and glared down at him. “Hell no! Find someone else!”&lt;/p&gt;
&lt;p&gt;I got the hell out of there and dragged myself all the way home to collapse on my couch.&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;&lt;b&gt;To be continued ...&lt;/b&gt;&lt;/p&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>25</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/the-easy-no</wfw:comment></item><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: Einfach so</title><link>https://thedailywtf.com/articles/einfach-so</link><category>Error'd</category><pubDate>Fri, 10 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/einfach-so</guid><description>&lt;p&gt;Do you say &amp;#34;a FAQ&amp;#34; or &amp;#34;an eff eh cue&amp;#34;?  Peter says eff eh cue I think.&lt;/p&gt;

&lt;p&gt;&amp;#34;This is a test&amp;#34;
&lt;strong&gt;Peter G.&lt;/strong&gt; harrumphed testily.
&amp;#34;Create an FAQ with exactly nine entries. Nine? Nine.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#67f8e4c8a1e640379d670a4039d1e54b"&gt;&lt;img itemprop="image" border="0" alt="67f8e4c8a1e640379d670a4039d1e54b" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/09/67f8e4c8a1e640379d670a4039d1e54b.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&amp;#34;I think I spent over $NaN?&amp;#34; said an anonymous. 
&amp;#34;This was an interesting offer on myminifactory.com with tight expiry date. Didn&amp;#39;t claim.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#9b22730c427144faa646895be1411d53"&gt;&lt;img itemprop="image" border="0" alt="9b22730c427144faa646895be1411d53" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/09/9b22730c427144faa646895be1411d53.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;And a different reader expected a speedy delivery anon.
&amp;#34;It was about 23:10 UTC when I took this screenshot,
the time zone I keep my PC in, yet local
time my pizza was estimated to arrive at 19:05 CST.
Naturally, I should expect to receive my pizza about four
hours ago! Not my typical experience with delivery as of
late, I must say, but a welcome change nonetheless...&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#cd43a695c8e846cf858cc3b72ba77094"&gt;&lt;img itemprop="image" border="0" alt="cd43a695c8e846cf858cc3b72ba77094" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/09/cd43a695c8e846cf858cc3b72ba77094.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Super saver 
&lt;strong&gt;Michael R.&lt;/strong&gt; lamented 
&amp;#34;That hurts, I missed 6 coupons that would have saved
me 0%.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#ec9a5b21636b4b4bad633abdb4393820"&gt;&lt;img itemprop="image" border="0" alt="ec9a5b21636b4b4bad633abdb4393820" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/09/ec9a5b21636b4b4bad633abdb4393820.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;And our 
&lt;strong&gt;dragoncoder047&lt;/strong&gt; ground this out between his teeth.
&amp;#34;Refactored the runtime spritesheet packer in a game engine I
contribute to, and wound up with this extremely helpful error
message. Turns out that the problem was the ggggggggggggggg wasn&amp;#39;t
properly detecting ggggggggg and was putting all the ggggggggggggg&amp;#39;s in
the same ggggggggggggggggggg. I think. Ggggggggggggg!&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#189885dc898f4fe4b7ef095e9f1ef99e"&gt;&lt;img itemprop="image" border="0" alt="189885dc898f4fe4b7ef095e9f1ef99e" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/09/189885dc898f4fe4b7ef095e9f1ef99e.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=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>18</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/einfach-so</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Flushed Out</title><link>https://thedailywtf.com/articles/flushed-out</link><category>Feature Articles</category><pubDate>Thu, 09 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/flushed-out</guid><description>&lt;p&gt;While a project manager is frequently called upon for their planning ability, the real skill we want from project managers is their ability to &lt;em&gt;communicate&lt;/em&gt;. The job of a project manager is to align the team &lt;em&gt;doing&lt;/em&gt; the work, with the organization goals &lt;em&gt;driving&lt;/em&gt; the work, with the management and leadership teams trying to &lt;em&gt;understand&lt;/em&gt; the work, while juggling all the constraints like budgets, timelines, and the endlessly changing expectations for the project. A good project manager is worth their weight in gold. A bad one will &lt;em&gt;cost&lt;/em&gt; their weight in gold.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mark&lt;/strong&gt; was hired on as a contractor, reporting to Tegan. Tegan was fresh out of business school, complete with an MBA and a variety of project-management training certifications. Unfortunately for Mark and the rest of the team, and especially unfortunately for Tegan, she had absolutely no real world experience. To make matters worse, this wasn&amp;#39;t just a software project: they were working on a system which matched newly developed software with newly designed mechanics and custom build control electronics. A group of experienced software engineers, mechanical engineers, and electrical engineers all found themselves reporting to a bright and shiny MBA. It&amp;#39;s a role that she probably could have grown into, but management saw all the acronyms she continuously put after her name, and decided she could just take the whole thing over with no real guidance.&lt;/p&gt;
&lt;p&gt;It went badly pretty much from the beginning. Tegan was &lt;em&gt;not&lt;/em&gt; a talented communicator. For example, Mark&amp;#39;s team needed to know: on what timeline were the electrical engineers going to deliver the first prototypes, so the software team could start running bench tests of their software? Tegan&amp;#39;s response was a fortune cookie message about balancing the complicated pipelines and lanes on the Gantt chart and hitting all of their milestones; like a fortune cookie, it was vague, important sounding, but ultimately empty.&lt;/p&gt;
&lt;p&gt;Of course, the natural reaction amongst the engineers was to just route around the damage: the various teams could talk to each other just fine without going through Tegan. That, unfortunately, did not go over well with management. Tegan, as the project manager, was their insight into the project. They needed her in the loop on everything. And she couldn&amp;#39;t just be &lt;em&gt;informed&lt;/em&gt;, she had an MBA. She needed to be making decisions. But she was unqualified to make those decisions, which meant the project gradually ground to a halt. Tegan&amp;#39;s emails got more vague, her meetings got longer but accomplished less, and after a certain point, she just &lt;em&gt;stopped replying&lt;/em&gt; to key email threads.&lt;/p&gt;
&lt;p&gt;The first few days of radio silence seemed like a gift. But as time passed and Tegan seemed uninterested or unable to reply to any of the questions the team had for her, the project started to flounder. The engineering teams escalated this problem to management. Management presumably went back to Tegan. At some point, feeling the weight of everything going wrong around her, Tegan sent out this email, which is definitely the best and clearest communication she managed during the project. It&amp;#39;s arguably the clearest, and most accurate communication one could make in this situation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Team,&lt;br/&gt;
I understand all the issues but there are complex interrelations that must be worked out. I am currently constipated on each issue and will let you know when there is movement.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tegan&lt;br/&gt;
MBA, CAPM, PMP&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Her email cost the project &lt;em&gt;many&lt;/em&gt; person-hours as all the engineering teams took a break to have a good laugh about the project manager admitting, in writing, that she was full of crap.&lt;/p&gt;
&lt;p&gt;There was, eventually, movement. Tegan moved on to a new position at a different company. Her replacement, Pam, wasn&amp;#39;t a new hire, but instead a transfer from another department. She wasn&amp;#39;t a great project manager, certainly not worth her weight in gold, but she had enough experience to avoid the worst mistakes, and most important: she was good at &lt;em&gt;regular&lt;/em&gt; communication in order to keep things moving.&lt;/p&gt;
&lt;!-- Easy Reader Version: I've worked with many a crappy project manager --&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>10</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/flushed-out</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Module Test</title><link>https://thedailywtf.com/articles/module-test</link><category>CodeSOD</category><pubDate>Wed, 08 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/module-test</guid><description>&lt;p&gt;&lt;strong&gt;TJ&lt;/strong&gt; inherited a NestJS project. The original developers left the team many years ago, but they&amp;#39;ve left their mark in the codebase.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-typescript"&gt;&lt;span class="hljs-comment"&gt;// ProjectsModule.ts&lt;/span&gt;
&lt;span class="hljs-meta"&gt;@Module&lt;/span&gt;({
  &lt;span class="hljs-attr"&gt;controllers&lt;/span&gt;: […],
  &lt;span class="hljs-attr"&gt;providers&lt;/span&gt;: […],
  &lt;span class="hljs-attr"&gt;exports&lt;/span&gt;: […],
})
&lt;span class="hljs-keyword"&gt;export&lt;/span&gt; &lt;span class="hljs-keyword"&gt;class&lt;/span&gt; &lt;span class="hljs-title class_"&gt;ProjectsModule&lt;/span&gt; {}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NestJS is a dependency-injection oriented framework for TypeScript code. It offers &amp;#34;providers&amp;#34; (dependencies that can be injected), &amp;#34;controllers&amp;#34; (as one would expect), and lets you bundle them together into &amp;#34;modules&amp;#34;. Modules can depend on other modules, letting you build a modular and flexible graph of dependencies. This means that the empty module isn&amp;#39;t &lt;em&gt;wrong&lt;/em&gt; here.&lt;/p&gt;
&lt;p&gt;No, for it to be wrong, we need to write some tests:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-typescript"&gt;&lt;span class="hljs-comment"&gt;// ProjectsModule.test.ts&lt;/span&gt;
&lt;span class="hljs-title function_"&gt;describe&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;ProjectsModule&amp;#34;&lt;/span&gt;, &lt;span class="hljs-function"&gt;() =&amp;gt;&lt;/span&gt; {
  &lt;span class="hljs-title function_"&gt;it&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;can be created&amp;#34;&lt;/span&gt;, &lt;span class="hljs-function"&gt;() =&amp;gt;&lt;/span&gt; {
    &lt;span class="hljs-keyword"&gt;const&lt;/span&gt; projectsModule = &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;ProjectsModule&lt;/span&gt;()
    &lt;span class="hljs-title function_"&gt;expect&lt;/span&gt;(projectsModule).&lt;span class="hljs-title function_"&gt;toBeTruthy&lt;/span&gt;()
  })
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Since modules are just containers for related code objects, there isn&amp;#39;t much to &lt;em&gt;test&lt;/em&gt; here. While &amp;#34;dynamic modules&amp;#34; which execute code are a thing, they don&amp;#39;t execute that code &lt;em&gt;at construction time&lt;/em&gt; anyway. This test will always pass. It isn&amp;#39;t a test, it doesn&amp;#39;t do anything. It likely doesn&amp;#39;t even get their coverage up, since whatever providers or controllers it&amp;#39;s referencing aren&amp;#39;t covered by this test. It&amp;#39;s a test that tests nothing but the framework it runs on top of.&lt;/p&gt;
&lt;p&gt;&amp;#34;At least there are tests,&amp;#34; TJ writes.&lt;/p&gt;
&lt;!-- Easy Reader Version: TRWTF are the endless web frameworks that do the same things differently. It's the XKCD standards comic, but in Hell. --&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>9</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/module-test</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: On Hold</title><link>https://thedailywtf.com/articles/on-hold</link><category>CodeSOD</category><pubDate>Tue, 07 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/on-hold</guid><description>&lt;p&gt;&amp;#34;&lt;strong&gt;Dragoncoder&lt;/strong&gt;&amp;#34; supports a web application that has a &amp;#34;wait time&amp;#34; for access. I hate that that&amp;#39;s a thing, but I recognize that there are real-world constraints where this might make sense. Still, I hate it. But that&amp;#39;s not the WTF.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;      &lt;span class="hljs-keyword"&gt;var&lt;/span&gt; minutes = &lt;span class="hljs-built_in"&gt;parseInt&lt;/span&gt;( &lt;span class="hljs-number"&gt;12&lt;/span&gt; , &lt;span class="hljs-number"&gt;10&lt;/span&gt;);
      &lt;span class="hljs-keyword"&gt;var&lt;/span&gt; time = &lt;span class="hljs-variable language_"&gt;document&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;getElementById&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#39;waitTime&amp;#39;&lt;/span&gt;);

      &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; ( minutes &amp;lt; &lt;span class="hljs-number"&gt;2&lt;/span&gt;) {
        time.&lt;span class="hljs-property"&gt;innerText&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;Your estimated wait time is 12 minute.&amp;#34;&lt;/span&gt;
      } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (minutes &amp;lt; &lt;span class="hljs-number"&gt;60&lt;/span&gt;) {
        time.&lt;span class="hljs-property"&gt;innerText&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;Your estimated wait time is 12 minutes.&amp;#34;&lt;/span&gt;
      } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (minutes === &lt;span class="hljs-number"&gt;60&lt;/span&gt;) {
        time.&lt;span class="hljs-property"&gt;innerText&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;Your estimated wait time is 0 hour.&amp;#34;&lt;/span&gt;
      } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (minutes &amp;lt; &lt;span class="hljs-number"&gt;120&lt;/span&gt; &amp;amp;&amp;amp; (minutes % &lt;span class="hljs-number"&gt;60&lt;/span&gt; === &lt;span class="hljs-number"&gt;1&lt;/span&gt;)) {
        time.&lt;span class="hljs-property"&gt;innerText&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;Your estimated wait time is 0 hour and 12 minute.&amp;#34;&lt;/span&gt;
      } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (minutes &amp;lt; &lt;span class="hljs-number"&gt;120&lt;/span&gt;) {
        time.&lt;span class="hljs-property"&gt;innerText&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;Your estimated wait time is 0 hour and 12 minutes.&amp;#34;&lt;/span&gt;
      } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (minutes &amp;gt; (&lt;span class="hljs-number"&gt;60&lt;/span&gt; * &lt;span class="hljs-number"&gt;4&lt;/span&gt;)) {
        time.&lt;span class="hljs-property"&gt;innerText&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;Your estimated wait time is more than 4 hours.&amp;#34;&lt;/span&gt;
      } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (minutes % &lt;span class="hljs-number"&gt;60&lt;/span&gt; === &lt;span class="hljs-number"&gt;0&lt;/span&gt;) {
        time.&lt;span class="hljs-property"&gt;innerText&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;Your estimated wait time is 0 hours.&amp;#34;&lt;/span&gt;
      } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
        time.&lt;span class="hljs-property"&gt;innerText&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;Your estimated wait time is 0 hours and 12 minutes.&amp;#34;&lt;/span&gt;
      }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This wait time page is initially rendered by their backend, but after that point, gets served up by a cache at the edge of their CDN. That makes sense, since &amp;#34;have the users hammer your backend while they&amp;#39;re waiting&amp;#34; is a bad idea.&lt;/p&gt;
&lt;p&gt;Note the line &lt;code&gt;var minutes = parseInt( 12 , 10);&lt;/code&gt;. This is rendered from the backend, which is of course my least favorite way to send data from the server side to the client side.&lt;/p&gt;
&lt;p&gt;But that&amp;#39;s not the core problem here. The core problem is: what the hell are they outputting?&lt;/p&gt;
&lt;p&gt;If your wait time is less than 2, or less than 60, we tell you that your wait time is 12 minutes. Or &amp;#34;12 minute&amp;#34;, because who cares about pluralization? If your wait time is exactly 60 minutes, we tell you that your wait time is &amp;#34;0 hour&amp;#34;, which I assume means you&amp;#39;ll have enough time to watch the classic airplane disaster movie, &lt;em&gt;Zero Hour&lt;/em&gt;, which you surely know &lt;em&gt;Airplane!&lt;/em&gt; is a remake of.&lt;/p&gt;
&lt;p&gt;I can only think that the &lt;em&gt;text&lt;/em&gt; is also being generated by logic on the server side- though our submitter doesn&amp;#39;t suggest that&amp;#39;s the case. Though they do wonder why the code couldn&amp;#39;t be something like: &lt;code&gt;Your estimated wait time is: ${Math.floor(wait_time_minutes / 60)} hours and ${wait_time_minutes % 60} minutes&lt;/code&gt;, which is both fewer bytes to send from your cache &lt;em&gt;and&lt;/em&gt; more useful to the end user.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Or maybe we just make this wait time go away.&lt;/em&gt; Again, I don&amp;#39;t know why it&amp;#39;s there, there may be a good real-world constraint that requires it, but… &lt;em&gt;is there&lt;/em&gt;? Is there really?&lt;/p&gt;
&lt;!-- Easy Reader Version: Ticket drop times, I know. I don't know that's what our submitter works on, but even so, I hate these kinds of wait events. Countdown pages annoy me! --&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>28</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/on-hold</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Best of…: Classic WTF: Difficult Personality</title><link>https://thedailywtf.com/articles/classic-wtf-difficult-personality</link><category>Best of…</category><pubDate>Mon, 06 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/classic-wtf-difficult-personality</guid><description>&lt;blockquote&gt;As the US took this weekend to celebrate their complicated relationship with tyranny, we reach back through the archives for another story of tyrants. If you think about it, the Declaration of Independence is basically the same thing as quitting without notice. &lt;a href="https://thedailywtf.com/articles/Difficult-Personality"&gt;Original&lt;/a&gt; --&lt;strong&gt;Remy&lt;/strong&gt;&lt;/blockquote&gt;

&lt;p&gt;It was &lt;b&gt;Steve&lt;/b&gt;&amp;#39;s first week on the job, and he had plenty of questions about the code base and the new features he was supposed to implement. He muddled through for most of the week, but Friday morning he hit a brick wall and needed to talk to Bill, the architect.
&lt;/p&gt;&lt;p&gt;
&amp;#34;Can I meet with you for like an hour to go over things?&amp;#34; Steve asked.
&lt;/p&gt;&lt;p&gt;
&amp;#34;No.&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;Can I get half an hour then? I h-&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;&lt;i&gt;No&lt;/i&gt;. Company meeting, every Friday, &lt;span onclick="cornify_add();return false;" title="click me!"&gt;12-5pm&lt;/span&gt;&lt;script type="text/javascript" src="//www.cornify.com/js/cornify.js"&gt;&lt;/script&gt;. It should be on your calendar. I&amp;#39;ll forward the invite.&amp;#34;
&lt;/p&gt;&lt;p&gt;
Bill also couldn&amp;#39;t free up time in the morning, so that meant Steve was stuck until Monday afternoon. Still, it probably wasn&amp;#39;t all bad. He assumed that since this was a small company, in startup mode, it was going to be one of those meetings that was less meeting and more party. He had heard about one company in town that had a kegger every Friday afternoon.
&lt;/p&gt;&lt;p&gt;
Steve really should have known better. During his interview, the actual technical questions were thin on the ground. It focused more on &amp;#34;soft skills&amp;#34;, like time management. He fielded a lot of questions about how best to manage his time. The other question that really stuck out in his mind was the standard, &amp;#34;Have you ever had to deal with a difficult personality in the workplace? How did you deal with it?&amp;#34; It was memorable, less because the question itself was unusual, but because at least six variations of the same question showed up in the interview.
&lt;/p&gt;&lt;p&gt;
On his very first day, he learned who the difficult personality was: Frank, the boss and grand-high pooba of the dev team. Around 2PM Frank lumberghed &lt;!-- this is my new favorite verb. Honestly, one of the best things about English is how easily words can change parts of speech. Verbing nouns and nouning verbs is just a basic part of the language. I honestly think that's a big part of the reason English has spread so virally. That and the fact that two successive global empires have used English as their lingua franca.--&gt; himself into Steve&amp;#39;s cube. &amp;#34;Yeah, we&amp;#39;ve got a little problem,&amp;#34; Frank said. &amp;#34;I&amp;#39;ve noticed you spending a great deal of time in the break room.&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;Oh, yeah, I was just going back for more coffee,&amp;#34; Steve said with an awkward laugh. &amp;#34;You know how it is with programmers- we&amp;#39;re fueled by caffeine.&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;Yeah, well, if you could just go ahead and make sure you&amp;#39;re at your desk doing work, that would be great.&amp;#34;
&lt;/p&gt;&lt;p&gt;
As it turned out, Frank had gone easy on Steve because it was Steve&amp;#39;s first day. The next day, Steve sat in on Bill&amp;#39;s planning meeting- a 4-hour marathon to organize the development backlog and parcel out work. Halfway through, Bill called for a break. He and a few other co-workers darted outside to gradually commit suicide via cancer, while everybody else hung around the room committing suicide by donut. And then Frank walked in.
&lt;/p&gt;&lt;p&gt;
&amp;#34;What&amp;#39;s happening?&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;It&amp;#39;s um… just a little break,&amp;#34; one of the devs replied. &amp;#34;Bill&amp;#39;s outside.&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;I see.&amp;#34; Frank loitered in the room until Bill returned. The instant Bill&amp;#39;s foot crossed the threshold of the meeting room, Frank&amp;#39;s human facade was stripped away, and a spitting, slavering demon replaced him. He proceeded to dress Bill down, back up and right back down for disrespecting his team, disrespecting the company, disrespecting Frank and Frank&amp;#39;s poor elderly mother with his attitude. He closed with, &amp;#34;They&amp;#39;re &lt;i&gt;developers&lt;/i&gt; and I want them sitting around and developing! Not waiting for you to finish your smoke breaks!&amp;#34;
&lt;/p&gt;&lt;p&gt;
On Thursday, Steve got to drive a meeting to show off the latest batch of features the dev team had completed. When he turned on the projector, Frank asked, &amp;#34;What&amp;#39;s wrong with your computer?&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;Um… nothing?&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;The desktop is wrong! None of the icons are in the right place!&amp;#34;
&lt;/p&gt;&lt;p&gt;
Like most developers, Steve had changed the wallpaper and reorganized his desktop to suit his working style. Unfortunately, his transgression against the default desktop settings set Frank off on a long rant that consumed the entirety of the meeting. Steve was lucky, Frank claimed, that he wasn&amp;#39;t fired on the spot. Standard work was vitally important, and personalization was frowned upon. &amp;#34;It&amp;#39;s vitally important that any developer can use any other developer&amp;#39;s computer- we can&amp;#39;t afford to waste a minute of time just because you needed to be a special little snowflake!&amp;#34;
&lt;/p&gt;&lt;p&gt;
By the time the Friday afternoon meeting rolled around, Steve should have been expecting some kind of Frank-led time management course. Instead, Bill handed him a mop. &amp;#34;New blood gets mop duties. Start in the break room, and then hit the other common areas.&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;Excuse me?&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;Frank&amp;#39;s orders. Every Friday, we spend the afternoon cleaning the office, from top to bottom.&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;There isn&amp;#39;t a cleaning crew?&amp;#34;
&lt;/p&gt;&lt;p&gt;
&amp;#34;Oh, there is,&amp;#34; Bill said. &amp;#34;Frank doesn&amp;#39;t trust them to do a good job.&amp;#34; That weekend, Steve decided to take Frank&amp;#39;s lessons on time management to heart, and immediately left to seek employment that didn&amp;#39;t involve wasting his time.&lt;/p&gt;
&lt;!-- Easy Reader Version: Cleanliness and godliness: both a waste of time? --&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/classic-wtf-difficult-personality</wfw:comment></item><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: Kaids Hen 2025</title><link>https://thedailywtf.com/articles/kaids-hen-2025</link><category>Error'd</category><pubDate>Fri, 03 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/kaids-hen-2025</guid><description>&lt;p&gt;On the recurring transport
beat, this week brings us a handful of wtfs relating to
mass transit. Nothing private.&lt;/p&gt;

&lt;p&gt;&amp;#34;Thank you for traveling with Deutsche Bahn&amp;#34; sneers 
&lt;strong&gt;Philipp H.&lt;/strong&gt; bitterly, explaining 
&amp;#34;The German railroad company sadly is famous for often being
late and also has lots of other issues. While booking
my next trip I&amp;#39;m asked to pick my seats for
the reservation. - Looks like they now stack seats on
each other or on the table. - hopefully the seats
facing the wall at least have a window there. -
winning the jackpot lottery also seems more likely than understanding
their seat numbering system.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#1f2002fe488641a18f86f36d3c3530b0"&gt;&lt;img itemprop="image" border="0" alt="1f2002fe488641a18f86f36d3c3530b0" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/02/1f2002fe488641a18f86f36d3c3530b0.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;Whöøps!&amp;#34; wröte 
&lt;strong&gt;Adrien K.&lt;/strong&gt; metallically. 
&amp;#34;Other monitors on that train were fine. It&amp;#39;s just this
one which refused to display unicode characters correctly.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#35c86ef3f32645b9b26bbe8c1d48d14a"&gt;&lt;img itemprop="image" border="0" alt="35c86ef3f32645b9b26bbe8c1d48d14a" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/02/35c86ef3f32645b9b26bbe8c1d48d14a.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&amp;#34;Trains slashdotted&amp;#34;
&lt;strong&gt;Peter G.&lt;/strong&gt;
&amp;#34;Looks like the train has been slashdotted...&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#6ce6b2f1c9ea41318bf229c8c9731c3d"&gt;&lt;img itemprop="image" border="0" alt="6ce6b2f1c9ea41318bf229c8c9731c3d" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/02/6ce6b2f1c9ea41318bf229c8c9731c3d.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;
&lt;strong&gt;Ernesto&lt;/strong&gt; reports a simple typo, included here
because it relates to a story I have long found both sobering and inspiring. 
He relates: &amp;#34;Translated from Italian, this reads &amp;#34;We got to come back a few
years. Exactly back to July 19th, 2989 ...&amp;#34; &lt;a href="https://www.punto-informatico.it/pilota-salva-vita-185-passeggeri-morte/"&gt;
Italian source.&lt;/a&gt; 
The news was about a plane crash with some
deaths, not the best argument for joking. But the author&amp;#39;s
finger slipped a little bit and we&amp;#39;re going back to
the future. The bright side, the article tells how 185
passengers out of 296 survived thanks to the pilots.&amp;#34;
&lt;br/&gt; Despite the tragic loss of life, it is
an astounding story of skill and teamwork. 
If you&amp;#39;re unfamiliar, the 
&lt;a href="https://en.wikipedia.org/wiki/United_Airlines_Flight_232"&gt;English Wikipedia is here.&lt;/a&gt;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#708696118d8d4242922bade1f75bf55a"&gt;&lt;img itemprop="image" border="0" alt="708696118d8d4242922bade1f75bf55a" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/02/708696118d8d4242922bade1f75bf55a.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;On a more light-hearted note, 
&lt;strong&gt;Michael R.&lt;/strong&gt; sent in a photo of a
heavily-modified double-decker Delorean, which proposes
to deliver passengers before they board.  That must have been some
party to inspire repeat visits!
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#a586fca1db4a439b84ce7ad53bd7786a"&gt;&lt;img itemprop="image" border="0" alt="a586fca1db4a439b84ce7ad53bd7786a" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/07/02/a586fca1db4a439b84ce7ad53bd7786a.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/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>16</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/kaids-hen-2025</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: The Most Dangerous Game</title><link>https://thedailywtf.com/articles/the-most-dangerous-game</link><category>CodeSOD</category><pubDate>Thu, 02 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/the-most-dangerous-game</guid><description>&lt;p&gt;While we talk about bad video game code periodically, we generally avoid it because it&amp;#39;s so specialized and while something like &lt;a href="https://en.wikipedia.org/wiki/Fast_inverse_square_root"&gt;fast inverse square root&lt;/a&gt; is bad code from a &lt;em&gt;maintainability&lt;/em&gt; perspective, it&amp;#39;s great code for abusing floating points to make math fast.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Işıtan Yıldız&lt;/strong&gt; sends us a snippet from a game&amp;#39;s config file. I won&amp;#39;t pick on the specific game, but this isn&amp;#39;t some random build of TuxCart, but a released game sold on multiple platforms. It&amp;#39;s from a small team, but it&amp;#39;s an actual professional product running on many devices. What&amp;#39;s notable about this is the game &lt;em&gt;has multiplayer&lt;/em&gt; elements, which means networking code, which means…&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-c"&gt;net_socks_buffer_size					= &lt;span class="hljs-number"&gt;4096&lt;/span&gt;;				&lt;span class="hljs-comment"&gt;//I wouldn&amp;#39;t change this if I were you&lt;/span&gt;
net_max_message_size					= &lt;span class="hljs-number"&gt;32768&lt;/span&gt;;			&lt;span class="hljs-comment"&gt;//changing this will require restarting the game.  MUST be power of 2, don&amp;#39;t be a dick and make it too big&lt;/span&gt;
net_max_download_frames					= &lt;span class="hljs-number"&gt;16&lt;/span&gt;;				&lt;span class="hljs-comment"&gt;//changing this will require restarting the game.  MUST be power of 2 and smaller than net_max_message_size&lt;/span&gt;
net_udp_packet_size						= &lt;span class="hljs-number"&gt;65536&lt;/span&gt;;			&lt;span class="hljs-comment"&gt;//576 bytes the &amp;#34;recommended&amp;#34; fragment cutoff, ipv6 requires 1080.  The game will check automatically and make sure you aren&amp;#39;t out of range (at least on windows it can do this)&lt;/span&gt;
net_udp_packet_send_buffer_size			= &lt;span class="hljs-number"&gt;4&lt;/span&gt;;				&lt;span class="hljs-comment"&gt;//how many packets it can store before sending (ideally it shouldn&amp;#39;t be storing anything but threads are a b*)&lt;/span&gt;
net_udp_packet_recv_buffer_size			= &lt;span class="hljs-number"&gt;8&lt;/span&gt;;				&lt;span class="hljs-comment"&gt;//how many packets we can receive in 1 frame (8 is defualt, it&amp;#39;ll discard packets that don&amp;#39;t fit... it&amp;#39;ll warn you in the console when this happens)&lt;/span&gt;
net_udp_force_specified_size			= &lt;span class="hljs-literal"&gt;false&lt;/span&gt;;			&lt;span class="hljs-comment"&gt;//overrides what the OS recommends, could disable networking and maybe crash the game? who knows&lt;/span&gt;
net_udp_enable_checksum					= &lt;span class="hljs-literal"&gt;false&lt;/span&gt;;			&lt;span class="hljs-comment"&gt;//probably unnecessary to have UDP checksums, but you can if you want for some reason&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;… it means you can configure your copy of the game to attempt DoS attacks against other players&amp;#39; network stacks.&lt;/p&gt;
&lt;p&gt;I enjoy the warning here: don&amp;#39;t be a dick. You &lt;em&gt;can&lt;/em&gt; set your max message size to any power of 2, but don&amp;#39;t be a &lt;em&gt;dick&lt;/em&gt; about it.&lt;/p&gt;
&lt;p&gt;The networking settings are fun, and I&amp;#39;m glad to know that I can probably cause the game to crash (either my copy or my fellow players&amp;#39; copies). But can I do something &lt;em&gt;dangerous&lt;/em&gt; or even… oh, I don&amp;#39;t know, &lt;em&gt;crazy&lt;/em&gt;? I really hope I can.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-c"&gt;sys_ignore_variable_constraints			= &lt;span class="hljs-literal"&gt;false&lt;/span&gt;;			&lt;span class="hljs-comment"&gt;//DANGEROUS AS F***, leave off goddamnit you&amp;#39;re crazy if you turn this on&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&amp;#39;s the spirit! I want every game to add this config flag IMMEDIATELY. Actually, I&amp;#39;m working on a robot: I&amp;#39;m &lt;em&gt;definitely&lt;/em&gt; going to add that to my robot software. I&amp;#39;m gonna make the robot arm punch through a wall (note: it&amp;#39;s not supposed to punch through walls, and I think a number of people would get very upset with me).&lt;/p&gt;
&lt;!-- Easy Reader Version: DANGEROUS AS FUCK --&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>15</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/the-most-dangerous-game</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Representative Line: A Specific Key</title><link>https://thedailywtf.com/articles/a-specific-key</link><category>Representative Line</category><pubDate>Wed, 01 Jul 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/a-specific-key</guid><description>&lt;p&gt;Today&amp;#39;s anonymous submission isn&amp;#39;t really a WTF, but it highlights the hardest problem in computer science: naming things.&lt;/p&gt;
&lt;p&gt;For example, let&amp;#39;s say you saw a method called &lt;code&gt;handleRSAPrivateKeyGeneration&lt;/code&gt;. You&amp;#39;d likely assume that it generates an RSA private key. More specifically, it accepts a &lt;em&gt;request&lt;/em&gt; for a private key and &lt;em&gt;handles&lt;/em&gt; that request. It&amp;#39;s right there in the name.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;&lt;span class="hljs-keyword"&gt;public&lt;/span&gt; String &lt;span class="hljs-title function_"&gt;handleRSAPrivateKeyGeneration&lt;/span&gt;&lt;span class="hljs-params"&gt;(
        &lt;span class="hljs-meta"&gt;@RequestParam(value = &amp;#34;algorithm&amp;#34;, defaultValue = &amp;#34;EC&amp;#34;)&lt;/span&gt; KeyAlgorithm algorithm,…
)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Except this function accepts an algorithm as a parameter. That&amp;#39;s not bad design; it makes sense to inject implementations like that. Though in this case, it looks like it&amp;#39;s injecting a key that can be used to look up the actual implementation, which I like less, but I don&amp;#39;t know the rest of the implementation, so we can let it slide.&lt;/p&gt;
&lt;p&gt;So there&amp;#39;s no WTF here. It&amp;#39;s a badly named function that may not return an &lt;em&gt;RSA&lt;/em&gt; key, but does return a valid cryptographic key. By default it generates an elliptic curve key. Presumably as an armored key, since it returns a &lt;code&gt;String&lt;/code&gt;- and the armor usually supplies enough of a hint that consumers can infer the key type. Our submitter tells us that this function is part of a Java Spring controller, and returns a string because the result is displayed in a web page.&lt;/p&gt;
&lt;p&gt;No WTF, but it does highlight how sometimes being &lt;em&gt;too specific&lt;/em&gt; with your name can make the name less clear. &lt;code&gt;handlePrivateKeyGeneration&lt;/code&gt; would be a better name, since we don&amp;#39;t know exactly what kind of private key it&amp;#39;s generating.&lt;/p&gt;
&lt;p&gt;Names, as always, remain hard.&lt;/p&gt;
&lt;!-- Easy Reader Version: Though don't get me started on getting PK8 keys formatted the right way for one of the libraries I use- there's a whole fight over the way it's armored and represented that means I spent like 2 days trying to get an API to accept the key- a key that was 100% valid and good, but just stored in the wrong armor. --&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>16</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/a-specific-key</wfw:comment></item></channel></rss>