IT Humour

The Most Favoritest Icon

Worse Than Failure - Thu, 02/07/2008 - 14:59

Every so often, Bob B. observed that his company's e-commerce site would crash-hard. No one had any clue as to why it happened, but everyone knew how to fix it. Restart both the IIS and SQL Server processes and, voilà, within a minute, the site was up and running again.

Like an old car with a few quirks, the company worried that tinkering with the application might make things worse. But after a few months and a handful of customer complaints, Bob was permitted to investigate the issue so long as he wasn't too intrusive.

Waiting for Failure
The first problem Bob encountered was with the home-grown logging module. Whenever the application crashed, it would crash too, leaving Bob with a log filled with "error occurred while logging an error" messages. A few weeks and a crash or two later, Bob fixed the logging code and deployed it to production.

It didn't take too long for another crash to occur. Bob dove right into the log files and saw the dreaded "Server Out Of Memory" error coming from SQL Server. A Google search revealed that a Service Pack installation would most certainly fix things. So, after cajoling the bosses to let him upgrade SQL Server, Bob had the service pack installed. Now it became a waiting game to see what the real problem was.

A tense few weeks passed with out a single crash reported, and Bob assumed the Service Pack had fixed the problem. Then the site crashed again with the same error message: "Server Out Of Memory." Bob started digging further and noticed that the server was, indeed, out of memory. The reason was pretty clear, too: there were nearly 2,000,000 active visitor sessions open.

For a niche e-commerce Web site with an average of a thousand shoppers a day, 2 million visitors were far out of the ordinary. Bob wondered about a Denial of Service (DoS) attack, but quickly ruled that out. No one would possibly bother to DoS their site.

Going Around in Circles
Bob started looking through IIS log files from around the time of the crash, but saw no promising leads. It looked like an everyday log file. After a half hour of reading line after line, Bob held the PageDown key while he tried to think of a better approach. And that's where he noticed a slew of requests from the same IP address. Checking other resources to see request headers, he saw the IP address belonged to an AOL user that seemed to be browsing from somewhere in Ohio.

66.77.93.50 - [08:34:29] "GET /access?action= _ _ forward&uri=%2Ferror.aspx HTTP/1.1" 302 - "-" "-" "-" 66.77.93.50 - [08:34:29] "GET /error.aspx _ _ HTTP/1.1" 302 - "-" "-" "-"

Pieces started coming together. Some Web surfer from Ohio got into an infinite redirect loop that was creating a new session with each iteration. Apparently, the AOL user was patient enough to let that loop continue for almost 11 hours.

By disabling cookies in his browser and typing in a specially crafted URL, Bob confirmed that he could trigger an endless loop of redirection as well. But the mystery was how the loop was initiated.

Bob dug until he found the first log entry from the user:

66.77.93.50 - [08:34:29] _ _ "GET /favicon.ico HTTP/1.1" 302 - "-" "-" "-"

It was for the favicon, that small icon that appears next to the address browser. Even stranger, it was the Ohioan's first and, aside from the redirects, only request.

In the end, Bob figured out exactly how the problem had happened: some random visitor using an older version of AOL bookmarked their site. The user wasn't trying to visit the site, let alone waiting 11 hours for a page to come up. He or she just happened to have the AOL browser open, which would then periodically attempt to update the favicons for its bookmarked sites, and then diligently follow the endless redirects as ordered.

Bob quickly added a favicon.ico to the root folder and patched up the infinite redirection problem. The crashing problem went away and never returned. But, for some time, the company's Web site was at the mercy of the browsing habits of some random family living in Ohio.

Categories: IT Humour

CodeSOD: XML Abuse

Worse Than Failure - Thu, 02/07/2008 - 12:59

"Where I work we keep a lot of data stored in XML files," Ben writes. "They're not your average XML files, though — they're special." His colleague invented the following technique (recommended for senior level XML programmers only).

<rootNode> <numberOfAddresses>110</numberOfAddresses> <address_1>442 Fake St.</address_1> <address_2>61 Main St.</address_2> ... <address_110>3881 N 4th Ave. #5D</address_110> </rootNode>

Ben adds, "Of course this means that an XSD schema is absolutely impossible to define."

Categories: IT Humour

Best of the Sidebar: U R NT QFD & Giving Notice

Worse Than Failure - Wed, 02/06/2008 - 14:59

Two for the price of one today! U R NT QFD was originally posted by "Ben Fulton"...

I have a suspicion this ad for a programmer was text-messaged in to our local paper...

Software Engineer I Anlyz, dsgn, dvlp agmnted & mxd reality & cntxtual info sw appls & certs w/knldg in data mgmt, distrib & location specific info dlvry sys; Particpt in tstng process thru tst dsgn, rvw & anlys w/mdrn relational db sys (PostgreSQL preferred), srvr-side appl sw (Java/ PHP/Ruby) & Java client pgrms to assure qual & accuracy of info deliv in distrbtd & mobile environ. MS in CS.

Giving Notice was originally posted by "hellboy"...

When I gave my two-week notice, I told my boss that my last day will be the 29th of September. He said that he'd take the weekend to think about, as if he was considering whether or not to accept my resignation.

The following Monday, he sat with me to review my schedule. After a tedious process of telling me everything that I already knew that I had to do, he said, and I quote, "Oh yah, and I'm going to have you stay through the first week of October. You're cheaper as an employee rather than a consultant."

I can't say that I was shocked by this, but it was rather annoying. I reminded him that my last day would be the 29th. The boss was appalled, saying that "he told me" that I'd be working through the first week of October. I told him that it was the 29th, or today. He just got up and left.

Categories: IT Humour

Error'd: THIS is a Warning Message!

Worse Than Failure - Wed, 02/06/2008 - 12:59

"Clearly," Alex wrote, "there is more potential for my printer here than just printing..."

 

Normally Marc doesn't disagree when his computer tells him something, but in this case...

 

Wow!!!!!!! It sure was Sander's lucky day!!!!!!!!!!!!!!!!

 

"A standard confirm() dialog? That's not a warning message," Mike scoffed, "THIS is a warning message!"

 

Daniel Lo Nigro learned that one can, in fact, have unused icons on an iconless desktop.

 

Unforutnately, "OOOOOOOOOOOOO" didn't quite solve this CAPTCHA.


(also from Daniel Lo Nigro)

 

Categories: IT Humour

I've Got The Monkey Now

Worse Than Failure - Tue, 02/05/2008 - 14:59

1999 was a big year for Harvard Business School Publishing. In the past few years, they had seen their business model – selling books, journals, articles, case studies, and so forth – transform from being entirely catalogue-based to largely web-based, and it had finally come time for a major re-launch of their website.

HBSP’s new website was slick. On top of a fairly advanced search system, the re-designed site also featured community forums and a section called “Ideas @ Work”, which let users download audio broadcasts from influential business thinkers from around the world. And best of all, despite the rapid development schedule, scope creep, and all of the new bells and whistles, the new site actually worked. In the height of the dot-com era, not too many other sites could claim the same.

One key contributor to the success of Harvard Business School Publishing’s new website was its extensive testing and QA. Analysts developed all sorts of test cases to cover virtually every aspect of the site. They worked closely with HBSP’s logistics department to make sure the tests – searching, fulfillment, account management, etc. – were run. And not just run, but run often.

This aggressive testing strategy ensured that the site would function as intended for years to come. That is, until that one day in 2002. On that day, one of the test cases failed: the “Single Result Search.”

The “Single Result Search” test case was part of a trio of cases designed to test the system’s search logic. Like the “Zero Result Search” case, which had the tester enter a term like “asdfasdf” to produce no results, and the “Many Results Search” case, which had the tester enter a term like “management” to produce pages of results, the “Single Result Search” case had the tester enter a term – specifically, “monkey” – to verify that the system would return exactly one result.

And for three years, “monkey” returned exactly one result: Who's Got the Monkey? (full article text) by William Oncken Jr. Written in 1974 Oncken’s article is for managers who “find themselves running out of time while their subordinates are running out of work.” As for the monkeys, they’re just an analogy for work, not who managers should outsource work to. Apparently, Oncken wasn’t that ahead of his time.

In any case, on that day in 2002, the “monkey” search returned two results. The first, as expected, was Who's Got the Monkey?. The second result was something to the effect of Who’s Got The Monkey Now?, which was an update to HBSP’s run-away best seller, Oncken’s 1974 Who's Got the Monkey?. It seemed obvious: the “Single Result Search” test case just needed to be updated. But then they looked into the matter a bit further.

As part of the aggressive testing strategy mentioned earlier, the HBSP logistics team would fill their down time by executing test cases. First they’d run through the “Zero Result Search” test, then the “Many Result Search” test, then the “Single Result Search”. Then they’d add that single result – Who’s Got the Monkey? – to their shopping cart, create an new account, submit the order, and then fulfill it. Of course, they didn’t actually fulfill it – everyone knew that orders for “Mr. Test Test” and “123 Test St.” were not to be filled. That is, everyone except the marketing department.

When HBSP’s marketing department analyzed the sales trends, they noticed a rather interesting trend. Oncken’s 1974 Who's Got the Monkey? was a run-away best seller! And like any marketing department would, they took the story and ran. HBSP created pamphlets and other distillations of the paper. They even repackaged those little plastic cocktail monkeys as official “Who’s Got the Monkey monkeys”. And finally, sometime in 2002, the updated version of Who’s Got the Monkey? was posted to HBSP, which was then picked up by the searching system, which, in turn, caused the “Single Result Search” test case to fail.

Of course, by this point, there was little anyone could do. The fictional success of Who’s Got the Monkey had already been widely publicized as reality. And with all the subsequent write-ups (many of which are still around to this day), it may have very well become a best-seller. Needless to say, HBSP has since changed their aggressive testing policy. 

Some details of the story have been redacted to protect the guilty. Thanks to the two anonymous sources working at HBSP for the inside scoop, and news archives for the rest.

Categories: IT Humour

CodeSOD: The Hard Way

Worse Than Failure - Tue, 02/05/2008 - 12:59

For some tasks, you're presented an opportunity to do things the easy way or the hard way. When your friend is proudly showing off his work at replacing a light fixture, the switch, and all the wiring, you might wonder why not just replace the dead bulb?

"I was just fixing a bug in our software, and I came across this function," Johnny A. writes. "It works perfectly — does exactly what it says on the tin. I can't help thinking it could have been done with a few less lines of code, however. One, for example."

public static String replaceSpaceWithUnderscore(String str) { if (str == null || str.length() == 0) { return str; } StringTokenizer tokenizer = new StringTokenizer(str, " "); String token = ""; String newStr = ""; int count = 1; while (tokenizer.hasMoreTokens()) { token = tokenizer.nextToken(); if (count == 1) { newStr = token; } else { newStr = newStr + "_" + token; } count++; } return newStr; }

Categories: IT Humour

Best of the Sidebar: ikownjou

Worse Than Failure - Mon, 02/04/2008 - 14:59

Originally posted by "Publius"...

 I'm working on VB6 code written by a Dutch speaker and maintained by an Italian, with variables and comments in both languages. And no indentation whatsoever.

Rather than use a string array, the original developers repeatedly feed the same, massive string literal into the Split function. This is done for every string resource the program uses.

For reasons beyond my understanding, there is this:

ikownjou = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[snip]" & Chr(1) ikownjou = ikownjou & "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[snip]" & Chr(1)

Also, there are 40 timers on the main form, all arranged in a grid. It looks like Flava Flav's coat of arms.

Rather than use different resource files for the eight languages it's translated to, all four billion or so captions and menu items are set with a separate call to the locale("resource_name") function whenever a form is loaded. And whenever the locale() function is called, it opens a file, looks for the entry for the current language, and then closes the file.

Rather than use "Sub", they always use a "Function" with no return value that's peppered with about 70 "Exit Function" statements throughout its body.

Rather than use a database, all non-static information is crammed in thousands of text files scattered across subfolders of subfolders. Their version of "SELECT * FROM" is "DIR *.txt".

I replaced 4002 lines of this:

Public Function B64Length(ByVal TheString As String) As Integer Select Case TheString Case "@@" B64Length = 0 Exit Function Case "@A" B64Length = 1 Exit Function Case "@B" B64Length = 2 Exit Function Case "@C" B64Length = 3 Exit Function Case "@D" B64Length = 4 Exit Function ----------[snip]------------ End Select End Function

With two lines:

Private Const B64Compare = _
"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}- €" Public Function B64Length(ByVal strEncoded As String) As Integer B64Length = (InStr(1, B64Compare, Left(strEncoded, 1)) - 1) _
* 64 + (InStr(1, B64Compare, Right(strEncoded, 1)) - 1) End Function

Categories: IT Humour

Error'd: Getting Past Security

Worse Than Failure - Mon, 02/04/2008 - 12:59

Say, Patrik M., what have we here?

Enhance!

 

Chris C. pondered the crazy trail of events that link Conan the Barbarian to the west nile virus. The mosquitos are in California, which Governer Schwarzenegger calls home, and he was in Conan, who would take it upon himself to brutally slay every last west nile-carrying mosquito. It actually kind of makes sense if you think about it.

Matthew G. got held up trying to figure out what "desktopu" means.

 

From James S.:

Categories: IT Humour

Best of the Sidebar: Six Copies, Please

Worse Than Failure - Fri, 02/01/2008 - 14:59

Originally posted by "snoofle" ...

I've been working with computers since the mid 1970s, and thought I'd seen every possible stupid thing users could do. Coffee cups on the PC's cup holder. $20 bills jammed into the slot (floppy) to purchase stuff on the internet. Pretty much everything featured on TDWTF. Nothing could surprise me anymore. Until today.

A co-worker in another group, upon finishing a presentation, asked me to distribute it to the folks in my department. I told her I'd need six copies. She said she'd get them to me. So far, so good.

An hour later, I got an e-mail from her. Ok, so I'd have to print out six copies myself. Still, so far, so good. Then I opened the e-mail, to find six copies of the presentation attached.

Categories: IT Humour

CodeSOD: Not Exactly AJAX

Worse Than Failure - Fri, 02/01/2008 - 12:59

"At manufacturing companies," Brent Railey wrote, "all you ever hear about is SAFETY, SAFETY, SAFETY. In fact, that was exactly the type of application I was tasked with reviewing: an 'Activity Based Safety Program' application for the corporate offices. It was a Classic ASP application that was 'slightly customized' from another application."

"As I was testing out the application, I noticed a little AJAXy behavior. When I selected one category, it would populate another section with the list of items in that category. Not bad for ASP, I figured. That is, until I looked at the code."

Sub CategoryOnChange() categoryValue = window.event.srcElement.value document.all("aBehavior").length = 0 ' Add 'Select a Behavior' option Dim noneOpt Set noneOpt = document.createElement("OPTION") noneOpt.value = 0 noneOpt.text = "Select a Behavior" noneOpt.setAttribute "DetailLine", "0", 0 document.all("aBehavior").add noneOpt Set noneOpt = Nothing set dbconn = CreateObject("ADODB.Connection") set dbRS = CreateObject("ADODB.Recordset") dbconn.Open "Driver={REMOVED};server=FREAKING;uid=PLAINTEXT;Password=CONNECTION;Database=STRING;dsn=;" 'SQL = "SELECT Key, Category, Desc FROM KSB WHERE Category = " & categoryValue & " ORDER BY KSBDesc" SQL = "select ksb.*, cardversion.*, carddetail.* , categories.* " SQL = SQL & " from ksb, cardversion, carddetail , categories " SQL = SQL & " WHERE CARDVERSION.CARDACTIVE = 1 " SQL = SQL & " AND Cardversion.cardid = carddetail.detailcard " SQL = SQL & " and carddetail.detailksb = ksb.ksbkey " SQL = SQL & " and ksb.ksbcategory = categories.categoryKey " SQL = SQL & " and ksb.ksbcategory = " & categoryValue SQL = SQL & " order by carddetail.detailline " dbRS.open SQL, dbconn, 1 Do while not dbRS.eof Dim opt Set Opt = document.createElement("OPTION") Opt.value = dbRS.fields("KSBKey") Opt.text = dbRS.fields("KSBDesc") Opt.setAttribute "DetailLine", CStr(dbRS.fields("DetailLine")), 0 document.all("aBehavior").add Opt Set Opt = Nothing dbRS.MoveNext Loop dbRS.Close End Sub

"At first glance," Brent continued, "this didn't look too bad. But then I realized where I was staring at the code. It was in Notepad, launched by Internet Explorer's View->Source option."

"That's right, it was all done client-side by firing off a VBScript when the user picked a category. It connects straight to the database, dynamically constructs an SQL statement, and executes it. Who needs XML web services when you can just go straight to the database? Why have that extra layer when it just slows things down? Brilliant!"

Categories: IT Humour

For Security Purposes...

Worse Than Failure - Thu, 01/31/2008 - 14:59

As the IT Director at a Real Estate company, most of John Sadowski’s work revolves around document management. Since many documents are still transmitted by the age-old method of facsimile, his company uses a fax-to-email service to help inject some modern technology into the realm.

Their fax-to-email provider has a slick web interface with excellent security. He became a bit worried, however, on the day he needed to change the email address that faxes were sent to. After clicking on [Change Email Address] button, the website displayed the following message:

For security purposes we do not allow changes to fax delivery email address through the web interface, please call 1-800-xxx-xxxx to speak to a representative.

Excellent, John thought, most of the faxes we received are confidential in nature. We wouldn’t want them falling into the wrong hands.

He promptly called the number and had the following conversation. 

“Hello, tech support.”

“Hi,” John said, “I need to change the delivery address on my fax-to-email account.”

“Sure,” the support rep cheerfully responded, “What’s your fax number?”

“It is 403-xxx-xxxx.”

“Okay,” the rep said as she typed a fury of keystrokes, “what email address would you like to use?”

“frontdesk@xxxxxxx.ca, please”

“Okay,” she replied after typing in a bit more, “done! Is there anything else I can help you with?”

“Ummm…” John paused, “No… thanks…”

“Great, thank you for calling and have a great day!”

-- click -- 

Somehow, John would have felt better using the web interface.

Categories: IT Humour

Error'd: What Error Message?

Worse Than Failure - Thu, 01/31/2008 - 12:59

This is what happens when you accidentally type in "DisplayMesageToUser()" instead of "//".


(from Andrew)

 

Chad M didn't have a whole lot of luck finding drivers on LG's site...

 

This error message is mostly superfluous. Some error messages just display superfluous information when they have nothing better to say, for example, this error message.


(from Thiago Almeida)

 

Cole wondered, how many types of automatic transmission can there be?

 

"The guy pictured is the quarterback for the Dallas Cowboys," wrote Neil Mix. "It sucks when your bug is put on display in front of millions of people. Maybe next time just set it to an empty string?"

 

Categories: IT Humour

Rutherford, Price, Atkinson, Strickland, and Associates Dentistry, Inc

Worse Than Failure - Wed, 01/30/2008 - 14:59

July 19th, 2004 marked a new chapter in New Portlandopolis’s rich dentistry history. It was on that day that the bitter rivalry between Dr. Rutherford, DDS; Dr. Price, DMD, DDS; Dr. Atkinson, DMD; and Dr. Strickland, DDS/DDS-PhD, had finally come to an end. Though there’s much debate on what exactly started the feud, everyone knows what brought the dentists together: the nationwide “denta-corps” that can out-price, out-service, and out-anything their small, family dental practices.

Although the partnership talks had begun years before, July 19th was their agreed-upon D-Day, wherein the four separate practices would officially combine to be Rutherford, Price, Atkinson, Strickland, and Associates Dentistry, Inc. In the months leading up to D-Day, and after much bickering and debate, the four dentists got everything ready from new signage to new logoed toothbrushes. The only thing that remained was combining their computer systems. That task was left to Aaron B, an IT consultant who had the pleasure of working with each office through many of the “ugly years.”

Fortunately for Aaron, each of the dentists used the same practice management system: Beaglesoft’s Practice EnterprisePlus. It certainly wasn’t the best software, but it was among the most expensive. Perhaps more-importantly, Beaglesoft offered all sorts of outrageously-priced add-ons that the dentists could buy to one-up one another. For example, a wand-shaped oral camera required a $7,000-per-site “camera driver,” in addition to the ungodly amount the camera cost in the first place. When Aaron plugged the camera into his laptop (which didn’t have any Beaglesoft software running), it was recognized as a plug-and-play camera and immediately started streaming video. Not that it mattered though; as soon as Dr. Price had his installed, the other three dentists had to get one as well. 

“While our prices might seem high,” a Beaglesoft rep once told Aaron, “keep in mind that you’re paying for quality. Our products are rigorously tested to work in today’s and tomorrow’s high-tech dental office.”

And for that reason, Aaron wasn’t too worried about Beaglesoft’s portion of the D-Day migration. They assured him on several occasions that their latest and greatest – Beaglesoft Practice EnterprisePlus Elite with Networking – could network a “virtually unlimited” number of practices. The four Aaron was linking together was “chump change” compared to what the system could do.

When Friday, July 16th – the weekend before D-Day – had finally come, the dentists were ready. They closed their offices at noon and, per Beaglesoft’s instructions, initiated the migration process. Over the next twelve hours, so the plan went, each practice’s system would upload its data to the Central Server at Dr. Strickland’s office. Naturally, none of the other dentists were too thrilled about having a “Central Server”, especially one at Dr. Strickland’s.

Aaron arrived at Dr. Strickland’s office early Saturday morning to find a surprising message on the server: “Migration Completed Successfully.” He ran through some initial smoke tests and it appeared that the migration did, in fact, complete successfully. After a trip to the other three dentist offices, Aaron verified that he could access any patient’s file from any office. He called up the four dentists to share the good news: come Monday, they should be in business.

Monday came and, shortly thereafter, the four offices were out of business. The system had completely grinded to a halt. Every click of the mouse was met with a several-minute delay, and every delayed response was met with more clicking. Aaron, who happened to be on-site “just in case,” immediately suspected the newly-installed T1 lines.

Aaron called up the phone company. They ran a few diagnostics on their end, only to find that each office’s T1 line was completely pegged. Most certainly, the technician claimed, the problem was on their end. Perhaps a router gone haywire?

Aaron checked and rechecked the switches, the hardware, the ports, and the routers. He rebooted once, twice, and thrice. Everything seemed functional, aside from the fact that the Central Server was firing packets off non-stop.

Not sure what else to do, Aaron bridged his laptop between the Central Server and its switch. Within seconds, he logged hundreds of megabytes of data, far too much for anyone to go through in the middle of such a crisis. He had no choice but to take the “satellite” dentists offline to investigate the problem. They grew suspicious of this and, of course, Dr. Strickland, and demanded that there was foul-play involved.

With only a couple users accessing the Beaglesoft system, Aaron was able to get a handle on the traffic. As he assuaged the other dentists over the phone, Aaron noticed that a lot of the data seemed to be coming from SQL Server. Specifically, it was from queries like this:

 SELECT * FROM Patients

Digging further, Aaron figured out that, whenever a user wanted to look up a patient, the program would run “SELECT * FROM Patients” query, returning the entire Patients table to the client computer.

What’s worse, the query would run any time a character was typed in the patient search box. Searching for just his first name – A-A-R-O-N – resulted in five SELECT * queries.

What’s still worse, the same method of client-side filtering was used for appointments. It wouldn’t just get, say, today’s appointments. Or this week’s. Or, say, any that haven’t happened yet. It would query for every appointment that they ever had or would have in the future. That’s about 100,000 rows.

And since each appointment involved a patient, it’d have to fire off queries for each appointment to download and filter information about the patient.

It was apparent that Beaglesoft’s “rigorous testing” of “Practice EnterprisePlus Elite with Networking” involved, perhaps, a single computer and two, maybe three patient records. He immediately called Beaglesoft to report their issues and a demand a resolution.


(an actual screenshot from Beaglesoft’s install directory)

Within a few hours, three of Beaglesoft’s finest were on a plane to New Portlandopolis. When they arrived, two of them split off to work on “de-migrating” the system into the original four databases. The other Beaglesoftie, a product manager, worked on “damage control” – and boy did she have a lot of damage to control.

By that time – ten hours into Rutherford, Price, Atkinson, Strickland, and Associates Dentistry, Inc’s first day – the dentists were at each other’s throats. Dr. Price blamed the mess on Dr. Strickland who was “online the entire time, ” while Dr. Strickland was convinced that Dr. Atkinson had somehow “spiked the T1s,” while Dr. Rutherford believed that Dr. Price “wanted to retire, and was bringing everyone else down.” Eventually, Dr. Atkinson stormed out and tore down the new "Rutherford, Price, Atkinson, Strickland, and Associates Dentistry, Inc" sign. As he stomped the sign into pieces, he vowed never to work together again. Things pretty much went downhill from there.

After things cooled down a bit with the dentists, the product manager met with Aaron. Angered that his future prospects looked like a repeat of the “ugly years”, he lambasted Beaglesoft’s latest and greatest, and asked why, oh why, they couldn’t have done some client-side caching. Or, at the very least, use the magical WHERE clause.

She was astonished by Aaron’s technical knowledge and eagerly asked more questions on “WHERE clauses and other optimization techniques.” Near the end of their conversation, she actually offered Aaron a job as a Lead Developer at Beaglesoft.

Aaron ended up declining the position. He figured that they’d never be willing to tar and feather the existing development staff. That, and after the Beaglesoft Fiasco of 2004 (as it’s called today), he’d have a lot of cleaning up and intra-dentist diplomacy to do. Besides, how could he miss taking part in the latest exciting chapter in the dentistry history of New Portlandopolis?

Categories: IT Humour

Representative Line: On a Budget

Worse Than Failure - Wed, 01/30/2008 - 12:59

Not all of us are fortunate enough to work in "spacious, windowed private office" like the pampered developers over at Fogcreek. At my company (Inedo) for example, developers are constantly trying to figure out, do I get a chair today, or is it my turn to plug-in to the network? While I'm sure your work environments are equally less-than-ideal, not too many can compare with Baughn's experience.

"I was called in by a small company to make some minor changes to their software," Baughn wrote, "mostly language translations. Apparently, the normal maintainer had just up and quit."

"As I entered my temporary office, I got an inkling of why. On the wobbly desk sat a flickering 15" CRT attached to a grimy, Compaq-branded Pentium II. But what made up my mind, however, was this following line."

 

if (exitStatus==(3-3)) // Sorry, some ov my keys are broken

Categories: IT Humour

Phoning It In

Worse Than Failure - Tue, 01/29/2008 - 14:59

In the late 1980s, Andrew Harkavy was working as a lead developer for a large hotel chain. He was responsible for 240 hotels that ran off 4 regional minicomputers. Each minicomputer served around 60 hotels, with six ports designated for each one for its terminals, printers, IT dial-in support, etc. Most of the time things worked pretty well, though the hardware was being pushed to the limit.

One day, Andrew got a call from a hotel employee with a strange issue — the screen's output kept coming out of the printer. Some time later, Andrew got another call from the same hotel employee, this time it was print jobs being output to the screen.

Calls trickled in from hotel staff from other hotels that were connected to the regional computer. Andrew dialed in to the system using its port that was dedicated to IT dial-in support. Their passwords changed daily, so he looked up the day's password and typed it in.

PASS: FIDELIO_

After some debugging, Andrew discovered the issue — some of the port numbers had shifted, causing what should be screen output to be sent to the printer. Andrew found a way to reset the port numbers, which made the problem disappear. For a few months.

The problem appeared again on a busy summer day. The hotels were getting a lot of traffic from families on summer vacations, and the servers were getting hammered. Andrew answered a frenzied call from one of the hotels and immediately dialed in to the server to reset the port numbers. He checked the day's password and logged in.

PASS: SWORDFISSH_

After hitting enter, he noticed his typo and waited for another login prompt. Instead, he was automatically disconnected with the following warning:

+----------------------------------------------------------------+ | | | WARNING !! HACK ATTEMPT DETECTED !! WARNING !! | | | +----------------------------------------------------------------+ |YOUR BREAK IN ATTEMPT HAS BEEN DETECTED. LINE TRACED. | |THIS INFORMATION HAS BEEN AUTOMATICALLY FORWARDED TO THE POLICE.| +----------------------------------------------------------------+

Andrew's heart skipped a beat, and then he started laughing to himself. His team had written the warning to scare wardialers off, and despite their initial concerns that no one would believe it, Andrew had fallen for it for a second. Andrew reconnected, reset the port numbers, and disconnected.

A few weeks later, the problem appeared again. The port numbers switched, and mass confusion spread among the hotel staff. In an even more frenzied panic than usual, someone from the front desk phoned Andrew.

"Help! The front desk computer is calling the police!"

Categories: IT Humour

Announcement: Free Sticker Week Reminder & Update

Worse Than Failure - Fri, 01/04/2008 - 17:15

Today is your last chance to (easily) get a WTF Sticker through the free sticker form or PayPal! After today, stickers will only be available via snail mail.

The "TheDailyWTF.com" sticker is a 2"x3" sticker that's designed "to last outdoors for a long, long time" and is "great for applying to anything that gets exposed to the elements of weather." It's made of vinyl (which means that it's easy to remove in one piece) and doesn't have a super-strong adhesive (which means that removing it won't also remove whatever it's attached to).

Also, since I’ve been receiving several questions regarding the WTF Sticker EULA, I wanted to tackle a few of the more frequently asked questions here.

Can I transfer ownership of a WTF Sticker?
Yes. The EULA permits ownership transference so long as: (a) WTF Sticker is uninstalled from originally attached surface; (b) any residual stickiness (“adhesive”) left on surface is not used to attach other items; and (c) new owner accepts the EULA. Note that retention of the original wax-paper backing is not required for transferring, but must be discarded or destroyed if it is not transferred with Sticker.

May I attach WTF Sticker to any Surface?
No. The Surface must have a license compatible with the EULA, one that may be superseded by the EULA, or no license at all. While a SurfaceBSD license, for example, is perfectly acceptable, the S-GPL v3 license, which requires that “modifications to Surface … including application or installation of Stickers” will subject all said modifications to the S-GPL v3.

What Advantages are available as a Genuine WTF Sticker holder?
A Genuine WTF Sticker is a high-quality, die-cut vinyl sticker that features an official logo printed in Pantone® Warm Red. Counterfeit WTF Stickers are often photocopied, have little or no adhesive, and are not suitable for outdoor use.

By participating in the WTF Sticker Genuine Advantage program, you will ensure that your WTF Sticker remains properly licensed and supported.

Do I have to prove I have a licensed version of the WTF Sticker v1.0 to get the Patch Kit?
No. However, the WTF Sticker v1.0 to v2.0 Patch Kit has only been tested on WTF Sticker v1.0. Patching other Stickers or Surfaces may produce unexpected results, included severe damage of other Stickers or Surfaces.

Visit the Free WTF Sticker Page to get yours.

Categories: IT Humour

Best of the Sidebar: Could You Explain Programming Please

Worse Than Failure - Fri, 01/04/2008 - 13:00

Today's Best-of-the-Sidebar was originally posted by "Yahweh" ...

Being a programmer and the only computer literate person in my family, I get tech support calls from my family all the time. I got a phone call from a brother-in-law today:

Him: Hey, you're good with computers right?

Me: Yes.

Him: And you know how to program computers?

Me: Yes, that's my job actually.

Him: Could you explain programming please?

Me: I'm sorry, what do you mean?

Him: I want to make a game like Halo, but I don't know how to start. Could you explain what I need to do?

Me: You should probably go to the library and get a book.

Him: Can you just tell me what I need to do?

Me: Wait a minute. Are you asking me to explain how to program computers?

Him: Yeah.

Me: Over the phone?

Him: Yeah.

My brother in law apparently made several unsuccessful attempt to "learn programming" by opening up exes in Notepad. He created a text file with the words "Morph the screen into something cool" and couldn't figure out how to run it, even had the balls to ask me "how do I install my program? Do I just put a shortcut on the desktop".

My dad, a programmer, lent him an unfortunately titled book called "Teach Yourself Java in 24 hours". He immediately flipped to the back of the book and reading sections on server and Swing development, and was very excited to see that he could write his own server after just one day.

In the end, I was unable to teach my brother in law how to make his own Halo over the phone, and he decided that I wasn't a very good programmer.

Categories: IT Humour

Biltmore Can't Log In

Worse Than Failure - Thu, 01/03/2008 - 15:00

"Biltmore can't log in," David's boss said in a panic, "you need to fix this. Now!"

It was the perfect way to start a Monday morning. When Biltmore couldn't log in, that meant that Biltmore couldn't get Biltmore's executive reports. And that meant that the entire company would grind to a halt and focus entirely on getting Biltmore's reports.

Grudgingly, David called up Biltmore. And as expected, Biltmore wasn't happy. "It keeps asking for my bloody PIN number," Biltmore cursed, "Why do I have to keep typing in my bloody PIN number? I need my reports!"

For some reason - perhaps the original developer's insanity, or perhaps Biltmore's - the executive reporting system authenticated users with a four-digit PIN number. David selected his own name from the list and typed in his PIN number: 7734. And the system worked like a charm. Well, as charming as a rickety, old PHP-based reporting can be.

No one had touched the code in ages, so David assumed the problem was with Biltmore's browser. Perhaps it was overflowing temp files? Or security settings? Disabled cookies? Corrupt files? David tried it all to no avail. And each step of the way, Biltmore became more and more aggravated.

"Where are my reports!?" Biltmore insisted, "I need them now!"

On a whim, David asked Biltmore for his PIN number. "Hmphf," Biltmore scoffed, "I just changed it, and now I'll have to change it again! My bloody PIN number is 0010!"

And then it hit him. David made a new account, set the PIN number to be "0010," and logged in. He clicked through the site for exactly ten seconds. And then he was kicked off. It asked him for his PIN again.

Confirming his suspicion, he jumped into the logon code...

$_SESSION['TIMEOUT'] = $this->getTimeOut();

Digging a bit further, David looked for getTimeOut...

function getTimeOut() { return $_POST['pin_number']; }

Fearing that he'd break the old PHP system, David reset Biltmore's PIN number to 1337 and cautioned Biltmore about changing it to anything "less than" 1000 again.

Don't forget about Free Sticker Week! Once it's over, WTF stickers will only be available via snail-mail requests!

Categories: IT Humour

Error'd: Process of Elimination

Worse Than Failure - Thu, 01/03/2008 - 13:00

Though Dion was a bit rusty on the physics for this question, he's pretty sure he'll be able to do fine using process of elimination...

Mark Rickert was happy to see that BCBS of North Carolina can accommodate all sorts of foreign languages.

Murrae usually prefers to have not too many choices, but this is ridiculous.

Tony thought the visualization of PBS.org's poll was a bit misleading...

Categories: IT Humour

One User at a Time, Please

Worse Than Failure - Wed, 01/02/2008 - 15:00

"Wait, why do you need to shut the SQL Server down?" Henry O. didn't like where this conversation was going. "We've got a lot of people using the database right now. I'd really like to do this upgrade without shutting it down."

"Well, we have to shut it down," Tom, the vendor, reiterated. "Because... because."

"Seriously, why?" Henry demanded.

"Well, this is our software. I represent Initrode Global, and I know how our software works. We just have to shut the server down for a little bit." Tom tried to sound confident.

Henry thought back to when they first hired Initrode Global. Years ago, they'd asked for a warehouse management system, and aside from a few minor annoyances with the software, they were happy with it. As the company grew, though, they were reaching the limits of what they could do with the Access 2000 backend and asked Initrode to upgrade the software to work with their new SQL Server database.

Meetings with Initrode were awkward. This was the first time they'd heard of anyone hitting the limits of the software, and it made them nervous. Still, they swore they'd get their best people on it, and upgrade the application to .NET/SQL. Several months and meetings later, they were finished.

All of this work resulted in Henry's current problem. Trying to get an answer from Tom about why the databases had to be taken offline.

"It'll take maybe five minutes," Tom insisted.

"Fine." Henry caved.

Tom began typing and clicking, closing all open connections and taking the server offline. "Oh, wait," Tom said, as a realization dawned on him. "I guess I didn't have to do that. I'll start up the database again; it'll be back to normal in a minute."

Henry gritted his teeth. They'd just kicked all of the users off the database for no good reason.

"Yeah, as it turns out, the tables I need are already there!" Tom chuckled nervously. "Still, I'm going to replace the database." Henry kept a close watch over Tom's shoulder as he worked.

"OK," Tom said with a proud smile. "The tables have been created! Now I just need to run the import script!" Tom ran a custom-developed console application called "import.exe." It didn't take in any parameters, produce any output, or have any progress indicator. He and Henry sat there for about five minutes, before Henry asked if any progress was being made. "Probably," Tom replied. "I mean, almost definitely probably."

Henry took over the keyboard so he could check rowcounts on the tables while the import app was chugging away. F5-ing his query a few times, he saw that the tables were growing, just really slowly. After a half hour with only two tables populated, he figured that a custom-developed import application might be slower than using the Import Data wizard. And he was right — he managed to get everything imported in three minutes.

With the data copied and the .NET application ready, testing could begin. And testing began right around the same time it stopped, since it was erroring out immediately. First it was some obvious stuff — incorrect configuration, an invalid connection string, etc. — then they started hitting more complex issues.

First, there were permission denied errors for dropping a view. "Hey, Tom, why is this happening?" Henry hadn't done anything he thought could've caused a problem; he just tried running an inventory summary report. "Why would this report try to drop a view?"

"Oh, make the user that connects a database owner. We ran into that too."

"Uh, why does it need to alter the database when I run a report?"

"Because," replied Tom, "...because."

"No, I really need a solid answer this time."

After some pressing, Tom finally explained why the system needed to create and drop views and outlined the workflow:

  • Each request is queued by a central request server on another machine that ensures only one request at a time is served
  • The request server sends a command to the database server to drop the current view
  • The system recreates the view with parameters changed
  • The new view is used by three other views to display data to the user
  • Repeat for every single request, with just one parameter changed in the original view

As soon as Henry could speak, he asked why Tom didn't just use a stored procedure to do the work.

"A 'stored procedure?' Oh yeah, I think I heard of that somewhere..." Tom began flipping through a dog-eared SQL reference that more resembled Indiana Jones's dad's notebook. "I'll have to try that, there's this big section in here about them!"

There were eight other views used like this, in a system that's queried thousands of times daily.

Categories: IT Humour