Representative Line: Nasal String Length |
Dariusz isnt sure what this line of code was meant to do. At his best guess, it was supposed to find an improperly terminated C string and add a null terminator character after it:
buf[strlen(buf)] = '\0';
Of course, if the string werent null terminated, weve entered nasal demon territory- the behavior of strlen
is undefined for non-null terminated strings. If you present a C-compiler an undefined construct, it is allowed to do anything it likes, including make demons fly out of your nose.
But even on null terminated strings, this code is dangerous. Since arrays in C, like any sane language, are zero indexed, this code may attempt to access memory beyond the end of the array, overwriting whatevers there with a null terminator.
This is the sort of code that happens when Java programmers attempt to write C, without understanding how theyll shoot themselves in the foot
Метки: Representative Line |
CodeSOD: Will Managers Never Learn? |
Arty works on a team maintaining a legacy application that can best be described as a birds nest of code. It is a massive collection of global variables and a few tens of thousands of routines that would independently modify the data. Decapsulation was the overriding design pattern of choice. Of course, changing the value of some variable invariably has all sorts of unpredictable side affects. Naturally, this lead management to be fearful of making any changes, no matter how urgent, for fear of what would inevitably happen.
Fortunately, management recognized the need to replace it. The directive was given. A new application would be built. The replacement would be designed in such a way as to keep data and the routines that needed to access it somehow tied together. The state of a variable would only be changed as an end-result of some business action.
The senior members of the team started designing. Encapsulation was the order of the day. Each business function would wrap methods and state variables in a class, and nothing outside that class could change the state, except by telling the class to perform some action, the end-result of which would be to adjust the state accordingly.
The architects worked hard to keep the classes down to a reasonable size and level of complexity. The also tried to balance the depth of the class hierarchy with the breadth of the source tree. The idea being not to let class-proliferation create such a confusing source tree that it became unwieldy.
Finally, it came time to build this new beast.
To this end, management hired the cheapest youngest offshore development team they could find. After all, a code-monkey is a code-monkey is a code-monkey. As long as they could read the specifications and write code, they could do the job!
Given the tender years of the new development team, the architects insisted not only on after-the-fact code reviews, but on design walk-throughs at the beginning of each unit of work. This was to make sure that the developer understood what he was trying to accomplish, and the context in which it had to work. Management decided that this would take too much time away from coding and issued the mandate that units of work would be delegated to the offshore team, and it would be reviewed afterwards.
While the architects held their breath, the offshore team began to churn out code.
When the code was finally submitted for review, the architects immediately noticed a pattern in widespread use across all of the data objects:
class SomeImmutableData { private int v1; private int v2; public SomeImmutableData(int v1, int v2) { this.v1 = v1; this.v2 = v2; } public int getV1() { return v1; } public int getV2() { return v2; } public void setV2(int v2) { this.v2 = v2; } }
When they asked the offshore team why there were setters on some of the internal variables of an immutable object, they were told that after they loaded the object into the application, they discovered that downstream modules needed to change it, and this was the easiest way to let that happen.
After a few face-palms, the architects tried to explain to the junior developers how to design and implement stateful verses immutable objects. The junior developers said that it would take too much time to go back and change everything, so they were just going to keep doing this wherever it was needed.
When the architects tried to put their collective foot down, the offshore team complained to management that their progress was being impeded by the architects.
The architects explained the situation to management, but were rebuked because it would take time to fix it.
Thus, the junior developers wound up maiming the architecture, decapsulating all of the encapsulated classes, and leaving the new application susceptible to unintended state changes that would cause all sorts of instability.... because a code-monkey is a code-monkey is a code-monkey.
Photo credit: lorda / Foter / CC BY-SA
Метки: CodeSOD |
Tales from the Interview: The Amazon River |
Growth is challenging for any company, and the smaller a team is the more carefully they have to vet candidates to ensure a good fit. Carlos understood this, but had never seen it practiced as extensively as when he applied for a systems management position at Initech. The scrutiny applied to their candidates suggested a company obsessed with finding the perfect fit, and Carlos couldn't imagine the quality of the incredible team they must have already. Between the recruitment agency and Initech itself, he'd had three interviews and completed four online tests, including every developer's favorite: a personality quiz. Shaking hands with Carlos after the most recent interview, Initech's senior developer and his would-be boss promised he'd get a call that day or the next with the company's decision. Days went by before his phone rang, Initech's chipper HR person on the line.
"Hi Carlos! I was hoping you had a few minutes to answer a few questions."
Carlos blinked; this sounded very much like the beginning of his first two conversations with Initech. But, still interested in securing the position, he took a deep breath and said, "What would you like to know?" Surprisingly, there turned out to be a few questions about his previous experience and future career plans that hadn't been covered in previous tests and interviews, and Carlos dutifully filled in the blanks, sure that a job offer must be close. "Great!" The HR person said. "We just need you to come in for a chat with the senior partners. They always want to meet our best potential candidates, just to make absolutely sure you're the right fit for the Initech family! Can you do Wednesday, sometime in the afternoon?" Carlos replied in the affirmative. This had to be the last interview. Victory was so close, he could taste it.
When he arrived at Initech's office on Wednesday, the woman at the front desk greeted him by name. "Hi Hilary," he replied, having learned her name during his last two visits. He'd also learned that she was Initech's executive assistant, still obliged to man the front desk as none of the many candidates for the open receptionist position had been the right fit. "Guess today's the day, Carlos," she said. "Feeling lucky?"
"I hope so. Honestly, I'm just racking my brain trying to figure out what questions I haven't answered yet."
"Don't worry," Hilary smiled. "You'll be meeting with Kyle first, then Cliff. Cliff will probably want to talk about the company's direction in general terms. Kyle... Well, he likes to show off a little bit. I'll give you one hint," she leaned over the desk, beckoning Carlos closer. "Amazon."
"Amazon?"
"Shh! Don't give away that you've heard anything! You can go in there now, Kyle will be down in a minute. Good luck!" Hilary pointed him to a small conference room off the lobby, and Carlos wandered in, trying to puzzle out what "Amazon" could possibly mean. Fortunately, Carlos had some experience with AWS from a previous gig. He was muttering details of its features to himself when Kyle walked in.
"You must be Carlos!" Kyle sat down and slapped a Manila folder on the table; Carlos recognized one of the papers that spilled out as his resume. "Stop me if you've heard this before, but here at Initech we give a LOT of thought to each and every new hire."
"Actually, I-"
"We're a small company, and we can only afford to hire the best!"
"Yes, and I-"
"That's why I'M here, Carlos," Kyle leaned across the table conspiratorially, "I need to make sure you're one of us." Kyle softened this somewhat accusatory remark with a big grin. "So let's get your questions out of the way! Ask me anything."
Carlos sat for a long moment in thought. "Actually... Well, to be honest, I think your colleagues told me pretty much everything about Initech during the last three interviews. Maybe you-"
"That's great! Then I have a question for YOU, Carlos. Are you ready?" Kyle didn't wait for a response. He leaned even further across the table, a posture that looked like it must have been painful, and asked, "How much water flows annually from the Amazon River into the sea?"
Based on Hilary's tip, Carlos had been paging everything he knew about Amazon Web Services into his brain; all of that vanished with a pop. All he could say was, "Pardon?"
Kyle narrowed his eyes, and Carlos could see the executive's opinion of him fading. "It's a simple question, Carlos. But its very simplicity is part of its brilliance. I want you to tell me how much water flows into the sea on an annual basis from the Amazon River." Kyle slid a pad of paper and a pen across the table. "You can perform your calculations on this."
Carlos studied the empty page, wondering if Kyle was playing a joke. "Uh... I understand what you're asking, I'm just not sure how I'm supposed to figure it out without any, you know, data. Like the average annual rainfall in the Amazon Basin, for example."
Kyle furrowed his brow, as though unsure why Carlos was making this more difficult than it had to be. "I'm sorry," he said, "you can't use anything but what's right in front of you. All our other successful applicants were able to figure it out."
Carlos thought long and hard about how he might at least demonstrate the process he would use to come up with an estimate. He made an attempt at explaining the reasoning he would use, which seemed to satisfy Kyle. Having managed to ford the brain-teaser, Carlos hoped the conversation would turn to more-relevant matters, but Kyle wasn't ready to drop his pride and joy.
"Yup, that question always gets results, it's a real wheat-chaff separator. Bet you'd never heard it before, either, right? Hah!"
Carlos wasn't sure what to say to that; if pressed, he guessed he could make up an arbitrary, unanswerable question, too. He wondered if he should mention it, but he hadn't heard anything about Initech producing random interview-question generator software. Kyle closed the interview by asking what Carlos thought the former colleagues he'd referenced on his resume would say was his biggest weakness, and, while shaking hands, warned that he'd call them to see if Carlos was telling the truth.
The subsequent interview with Cliff was perfectly reasonable, though the executive did make sure to mention that, as a small company, Initech was obsessed with making sure they hired only the best. At the conclusion of the interview, Hilary told Carlos they'd be in touch later that day or the next. He's still waiting to hear from them, which is too bad, because he's since learned that almost 1900 trillion gallons of water flow from the Amazon River into the Atlantic every year.
Photo credit: jai Mansson's photography. / Foter / CC BY-SA
Метки: Tales from the Interview |
Classic WTF - The Defect Black Market |
For us, the day after Thanksgiving is typically known as "Black Friday". There is nothing sinister about it - oh no - just lots and lots of opportunities to go shopping and save cash along the way and take businesses from the "red" (loss) to black (profit!). This reminded me of an article from July 2012 that I'm positive that you'll enjoy.
When Damon's coworker stopped by his cubicle for a chat, Damon wondered if they should have met in a dark alley somewhere. Damon, a developer, and his coworker in quality assurance were meeting to trade bugs on the newly created Defect Black Market.
It all started a week before, when the CTO of Damon's midsize warehousing and transportation company in Northern California announced an innovative program to motivate employees and boost the quality of their logistics software. For every bug found by a tester and fixed by a programmer, both would get $10.
The CTO hoped to improve code quality in the firm's far-reaching overhaul of its procurement, purchasing, inventory, warehousing, distribution, transportation, customer support and financial systems. The development team was initially skeptical, but by the end of the incentive program's first day, both coders and testers alike were convinced. After an average day of finding and fixing bugs, they had each earned between 30 and 40 extra dollars.
Everyone worked a bit harder the next day. Testers made sure to check and double-check every test case they ran, while developers worked through lunch to fix their assigned bugs. And it paid off. On that second day each had earned an average bonus of $50.
Everyone worked even harder on the third day. On the fourth day, however, the well had started to dry up. The testers ran, re-ran, and re-ran again the test cases, but they could only find a handful of issues. The developers strained the issue-tracking system, constantly reloading the "unassigned bugs" page and rushing to self-assign anything that appeared.
And then something strange happened at lunch. Instead of going out to eat with his usual teammates, one of the developers went out with a tester. Soon after, another developer went out with another tester. Within a few minutes, almost all of the developers had paired up with testers.
As the developers returned from lunch, they immediately got to work. Instead of scavenging for newly found bugs, they worked on "code refactoring" and new functionality. And as soon as they deployed their changes, testers found bugs -- minor, obscure bugs that a developer could easily overlook. And just as quickly as testers found bugs, the developers were able to fix them and re-deploy. By the end of the day, developers and testers had earned an average of $120.
But not all developers made out so well. Some, like Damon, didn't feel comfortable "cheating" by overlooking minute requirements. It just didn't seem right.
By the sixth day, however, Damon had changed his mind. Sure, it was wrong to cheat. But it was worse that everyone else was doing it and getting away with it and bragging about it. And this brings us back to Damon and his coworker, who had just sat down to discuss how they'd profit on the Defect Black Market.
"So in the new communications module," his coworker started, "if a certain developer was to, say, not fully implement the 'sender address validation' requirement, that'd cause at least eight test cases to fail."
Eight test case failures meant eight bugs, which meant eighty bucks a piece. All Damon would have to do is misplace an "And" with an "Or" in the validation logic.
"Oh and check this out," the tester said, showing Damon the test scripts, "if, *ahem*, someone neglected to use the 'validated' address instead of the 'original' address, there'd be another six failures."
It doesn't feel right, Damon thought, but for a $140, I can overlook one or two simple mistakes.
Shortly thereafter, Damon found himself feverishly writing code, eager to get his changes -- along with the bug he'd write -- deployed for testing. But when the time came to misplace that "And," he hesitated. Before he plunged headfirst into the Defect Black Market, he decided to take a walk around the office and evaluate if he really wanted to cheat.
"Hey Damon," a fellow developer said as he walked past his cube, "did you hear? They're stopping the accuracy bonuses! The CTO is writing up the announcement now."
And like that, the Defect Black Market was closed. It lasted a grand total of five days.
http://thedailywtf.com/articles/classic-wtf-the-defect-black-market
Метки: Feature Articles |
CodeSOD: Classic WTF - Yes, The Table is Still There |
Our Discourse forum has received a mixed approval rating. Many folks like it, but others still find it lacking in areas in certain clients. Well, no matter your opinion, I can guarantee that, as it was true when the article first ran, our forum doesn't have the same problem mentioned below.
"Having recently upgraded my forum software," Kinta wrote, "I noticed that my site had been running incredibly slow."
"Upon further investigation, I found that that the following code was being run once for each and every comment on a page, whenever ever a forum thread was opened.
function ItemCache($bNewConnection = false) { $this->sql = new SqlHelper(dbhost, dbname, dbuser, dbpass, $bNewConnection); $this->connected = $this->sql->connected; $query = "SELECT item_id FROM item_cache"; $returnValue = $this->sql->query($query); if ($returnValue == false) { $query = "ALTER TABLE item_cache ADD `item_id` VARCHAR(100) DEFAULT '0' AFTER `item_name`"; $returnValue = $this->sql->query($query); $query = "ALTER TABLE item_cache ADD `item_lang` VARCHAR(2) DEFAULT '' AFTER `item_id`"; $returnValue2 = $this->sql->query($query); if ($returnValue == false || $returnValue2 == false) { // Create the item cache table. $query = "CREATE TABLE IF NOT EXISTS `item_cache` ( ### snip ### $this->sql->query($query); } } }
"It's fetching data from all rows from the entire item_cache table (currently several thousand), twenty-five times for every page load... just to check if the table exists and has the right columns.
http://thedailywtf.com/articles/classic-wtf-yes-the-table-is-still-there
Метки: CodeSOD |
Error'd: What Kind of Grass Do They Have in Canada?! |
For those of us in the US, today is our "Friday" in lieu of the Thanksgiving holiday. So, in honor of our nation's most hallowed day of feasting (and deep discount shopping the day after), here's an Error'd two days early. (Don't worry non-USians, we'll have classics running the rest of the week.) Enjoy!
"I was browsing for Grass Trimmers on the Canadian Tire website and...well...I'm not sure these would quite do the job," Brent W. writes.
"I was doing an online survey and this question came up... Guess I get to choose what error they give me?" wrote Ryan K.
"Wow...that penalty is a little bit excessive," writes Vicki K.
"I tried to look up the syntax for a recursive view on mysql.com, so I tried to search for 'recursive view'. No results. 'recursive' didn't yield anything either. Nor did 'view'. Not even,'select', which is probably the most used keyword. I suppose Oracle and I disagree on what the search functionality should do," wrote Maurits.
Abbey S. writes, "I wasn't even doing anything involving removable media at the time - there was just the unexplained sad bingleybleep of a USB connection shutting down, and then this. If I had been able to determine what Drive ?????????fhqwhgads??????? *was*, I might have inserted a disk into it, just to see what would happen."
"Darn, I was hoping to get this next week not in 66 years!" wrote W. N.
Rob H. wrote, "I hoped this not to be a very accurate representation of the route, but took a small paper bag with me any way because I was afraid to be sick at bus takeoff and landing."
"I tried to uninstall VM Ware Player from my Windows 8 system: So, I can not uninstall the software because I can not install it?!" Charles M. wrote.
http://thedailywtf.com/articles/what-kind-of-grass-do-they-have-in-canada-
Метки: Error'd |
CodeSOD: Genderize |
If someone suggested that you write a function which, given a persons name, tells you what gender they are, you might caution that this is a hard problem. You might suggest a solution like a Bayesian classifier, which could be trained, or you might say, Maybe we should just let the users tell us.
There are a few things you almost certainly wouldnt suggest. You wouldnt suggest using ColdFusion , because CF is constructed out of sin and unicorn tears. And you certainly wouldnt suggest trying to use regexes to do this job.
Thats because you arent Brents co-worker, who wrote this:
this.genderize(Arguments.firstName)
var regex = "";
regex = "(ua|pher|andy|elijah)$";
if (REFindNoCase(regex, Arguments.name)) {return "male";}
regex = "(a|i|y|ah|ee|et|ette|elle|fer|ine|lyn|ie|anne|een|en|er|yn|ynn|kim|rachel|lind|pam|sue)$";
if (REFindNoCase(regex, Arguments.name)) {return "female";}
return "male";
Метки: CodeSOD |
CodeSOD: An Interesting Way to Find Even |
While combing the server logs for clues as to what might have caused the latest incident in staging, Steve was startled to find that the box he was looking at hadn't logged anything for months.
Was logging disabled? No, it all looked fine. He accessed the box directly and the site came right up, complete with an entry in the access logs. So where were the logs for the past three months?
On a hunch, he checked the proxy.pac:
function FindProxyForURL(url, host) {
var myip=myIpAddress();
var ipbits=myip.split(".");
var myseg=parseInt(ipbits[3]);
if(myseg==Math.floor(myseg/2)*2){
return "PROXY 172.28.97.17:8080; PROXY 172.28.97.18:8080; DIRECT";
}
else {
return "PROXY 172.28.97.17:8080; PROXY 172.28.97.18:8080; DIRECT";
}
}
Not only was the file missing the third staging server, but every calculation was redundant since it always returned the same string. He replaced it with a one-liner, added the third server, and tossed another item onto the ever-growing backlog of technical debt to look into someday. Someday...
Photo credit: creativegaz / Foter / CC BY
http://thedailywtf.com/articles/an-interesting-way-to-find-even
Метки: CodeSOD |
Error'd: Turn Off Your Uter |
"Not quite sure what to do here... should I, or shouln't I turn of my computer... and what about my uter?" wrote Peter P.
Craig W. writes, "Hmm...Garmin's definition of 'near' seems to be just a little different than mine."
"Request free ZLMP sample? Get free XLMP instead!" writes Erik T.
"I remember learning about 1 o'clock, 2 o'clock and so on, but I'm pretty sure they never taught us about the time mentioned in this email," wrote Tim.
"My grandmother said that her computer was running slow. I think I found out why," writes Alfred A.
Alfred A. wrote, "So many choices, but neither are what I need to click on."
Hesham M. writes, "I dunno, maybe jjjjdjdjdjdjjdjjdjdjdjdj means 'the test was successful' in some other language?"
"I can't tell if it's really windy or the vacuum of space," Greg wrote.
Метки: Error'd |
What a SAP |
On day one of the project, Kenneth was given a single rule that was to be followed under all circumstances. You do not talk to the SAP contractors. Theyre too busy, and their time is too valuable. They do not have time for front-end developers.
As a front-end dev, Kenneth was used to being told to take his crayons and get back to work. A front-end dev forbidden from talking to the developers behind the back-end? What could go wrong.
Whats in the box? And why does it smell so bad?
The product was a redeem points for cool products system. A customer could purchase a gift-box. The outside of the box was labeled with a public code, and the inside was labeled with a private code. A user could enter both codes into the system to redeem points. Those points could then be used to buy tchotchkes from their web store.
There were all sorts of ironies in the project. While Kenneth was forbidden from talking to half the team, the project managers kept chanting agile. They used the word, not because it meant anything, but because it was a mantra to ward of project slippage. Of course, slippage looked almost inevitable, since every project milestone date was chosen through the toss a dart at the calendar method. It also didnt help that Kenneth and the SAP guys were working from entirely different specifications.
Kenneth went to his bosss office to attempt to explain the latest problem. The spec says that we need to validate a customers code before we let them create an account, Kenneth said to Jack.
Yes.
But this is just an HTML/JavaScript front end. So that validation should happen on the back end.
Yes…, Jack said, with less confidence.
But theres no back-end method for us to do that.
Yes…? So whats the problem?
That is the problem. We need a method on SAP to let us check if the code is valid.
Jack nodded. So… this means changing the SAP specification. I dont know that we can do that… Jack called his boss, who called her boss, who called the SAP teams boss. A meeting was scheduled between the management levels, which meant Jack and Kenneth needed to have a pre-meeting with Jacks boss, which meant Jack and Kenneth needed to have a pre-pre-meeting. After roughly 85-person-hours of meetings, an agreement was reached: the SAP team would expose their validation logic as a web service, so that the web team could validate gift codes.
Since everyone was collaborating so well, the management team pushed the deadline up four more weeks, because Agile means thinking on your feet. After pulling a month of 6070 hour weeks, Kenneth had a sense that Agile actually meant being dead on your feet.
After too many late nights, the project launched, on time and over budget. It was loaded with bugs, mostly minor, and too few test plans to actually identify or help triage the bugs. Over the next six months, Kenneth and his front-end team handled their bugs, and it looked like the project was on the downhill slope.
At least, it was until TrudyHeart1971
created an account. Within minutes of joining the site, TrudyHeart1971
was redeeming a suspicious number of points. The management chant of agile was replaced by screams of hackers!!!111!!!. All-hands meetings started. For the first time, Kenneth and his team sat down in a conference room with the SAP guys: Sven and Lars.
Kenneths screen was mirrored on the projector as he scraped the logs. This doesnt look like a hacking attempt. These requests all look valid.
You would think that, Lars said. He pointed at one of the entries. These public and private codes dont match.
In fact, Sven said, these private codes look completely fabricated . 12345678? Not a code.
Okay, so that probably has something to do with the validation on your side, right? Kenneth said.
Lars and Sven glanced at each other before turning to Kenneth and laughing at him. We dont validate the codes. There is a CheckCodes
method we gave you. You are to do the validation.
You dont validate the codes. Kenneth said.
No, of course not. We gave you a method.
Youre relying on the client-side JavaScript code to do all of the validation before requests hit your public-facing web service? Kenneth clarified, hoping someone else in the room would see how insane this sounded.
Alright, then. The Big Boss rapped his knuckles on the table to get everyones attention. It sounds like we know what the problem is- the front-end is insecure. And Kenneth, it sounds like you know how to fix it.
In the end, technical ignorance and the contractors hourly rate guaranteed that Kenneth was forced to fix the front-end. Their cobbled together solution was to implement a web-service proxy that performed validation on the server-side, while making the existing public-facing (and utterly insecure) SAP services private.
Their hacker, TrudyHeart1971
had discovered the bug when she accidentally entered her code incorrectly and saw she received points anyway. She did this a few more times, before the guilt set in. The company briefly considered pressing charges, but someone realized that publicizing this sort of security mistake wasnt in their best interests. They settled for removing Trudys points and a letter of apology.
Метки: Feature Articles |
CodeSOD: WTF from A to Z |
Alex's customers were having issues with a web project management console developed by a coworker. Upon opening the code to see what was causing all the JavaScript errors, he learned that the original developer was clearly an expert in web development standards. The code file itself was JavaScript. The use of the .css() function definitely proved his mastery of Cascading Style Sheets. Hard-coded tags demonstrated his deep knowledge of HTML. Finally, his variable naming scheme is essential to maintaining the coveted "Now I Know My ABC's" certification.
var i = "DivContainer"; var j = "DEFAULT"; var k = "DEFAULT"; var l = a(document.createElement("select")).css("min-width", "200px").append(a(document.createElement("option")).val("")); var m = a(document.createElement("select")).css("min-width", "200px").append(a(document.createElement("option")).val("")); var n = a(document.createElement("select")).css("min-width", "200px").append(a(document.createElement("option")).val("")); var o = a(document.createElement("input")).attr("name", "group1").attr("id", "RessRadio").attr("type", "radio"); var p = a(document.createElement("input")).css("width", "250px").attr("type", "text"); var q = a(document.createElement("input")).attr("id", "HiddenRessID").attr("type", "hidden"); var r = a(document.createElement("input")).attr("name", "group1").attr("type", "radio"); var s = a(document.createElement("input")).css("width", "250px").attr("type", "text"); var t = a(document.createElement("input")).attr("type", "hidden"); var u = a(document.createElement("a")).addClass("JButton").text("Display"); var v = a(document.createElement("label")).css("color", "Red"); var w = a(document.createElement("label")).text(" Display all employees assigned to a project: "); var x = a(document.createElement("label")).text(" Display all projects assigned to an employee: "); var y = a(a(this)[0]); y.append(""); f = a(document.createElement("div")); f.css("border-top", "1px solid Gray").css("width", "450px").css("padding", "5px"); f.append(a(document.createElement("table")).append(a(document.createElement("tr")).append(a("").append(a("").text("President:"))).append(a(" ").append(l))).append(a(document.createElement("tr")).append(a(" ").append(a("").text("Vice-president:"))).append(a(" ").append(m))).append(a(document.createElement("tr")).append(a(" ").append(a("").text("Head office:"))).append(a(" ").append(n)))); y.append(f); y.append(a(document.createElement("br"))); y.append(u);
Of course, since there are only 26 letters in the alphabet, sometimes they need to be redefined. Sometimes they even need to be redefined within the same function.
var k = function(a, b, c, d) { var e = false; a(d).autocomplete({ source: b, minLength: 2, select: function(a, b) { a = true; } };
Alex's coworker is no longer with the company, which may be the safest thing for everyone.
Photo credit: Filter Forge / Foter / CC BY
Метки: CodeSOD |
Announcements: Selling Out Again… with Puppet Labs! |
Several years back, I confessed to selling out. But there was a catch: instead of running those rubbish Google ads, we would run hand-picked ads from relevant tech companies.
This worked out wonderfully and, as many of you commented, you first heard about some really cool tools and services, here on the site. So, to commemorate the site relaunch, we wanted to do something really special and work with a select group of tools/companies in the industry to sponsor some entertaining content for you, our readers. You know, things like Radio WTF's Make It Work, OMGWTF Contest, or even Mandatory Fun Day.
That said, we're thrilled to roll out the red carpet for our friends at Puppet Labs as the first of our sponsors for 2015. If you're not already familiar with Puppet Labs, you really should be!
If you're not already familiar, Puppet is all about automating the configuration and management of servers and the software running on them, whether on physical or virtual machines, on prem or in the cloud (and if you have 2 minutes to spare, their intro video gives a pretty good overview of how they help their customers get things done).
They’ve also expanded to integrating with network devices, and that’s going to continue through their relationships with many data center hardware vendors. It's all about infrastructure as code, and so Puppet used by everyone from start-ups to Google. Be on the lookout for a more in-depth article this year where we deep-dive into their technology as well.
We're all pretty excited about this. Thanks to their support, we'll be able to create some exciting new content, do more meet-ups, and have a lot more fun all-around.
Oh, and it’s definitely worth mentioning they also backed my Release! game. Puppet Labs is one of those for-techies-by-techies companies that loves to be a part of the happenings and provide opportunities in the community. Please make sure to check them out!
http://thedailywtf.com/articles/selling-out-again-with-puppet-labs-
Метки: Announcements |
The 8K Bug |
The scene: late Friday afternoon, a medium-size company in a big-size panic. Tom and the other web developers churned through last-minute fixes on a client’s new e-commerce site- a site that should’ve been done and deployed two weeks earlier.
Tom committed his latest changes on a CSS file to the SVN repository, wiping sweat from his brow. He updated his local repository, then went back to Dreamweaver, shaking his head. The company’s web designers insisted the devs used Dreamweaver. It wasn’t that bad, Tom supposed, but there were several better-
Dreamweaver crashed.
Tom frowned; he hadn’t seen that happen before. No big deal. He opened Dreamweaver again. That time, it crashed on startup. On the next try, it stayed open a few seconds, then- crash.
“OK, fine,” Tom muttered, digging under the Start Menu for the Restart option.
Tom paced in his cube as his machine booted back up. The company’s network policies and startup scripts guaranteed a five-minute break, at least, but Tom just wanted to be done and home already. His coworkers’ chatter permeated the cube walls.
“What the hell, Dreamweaver?”
“Is it crashing for you, too?”
“Hey, it’s crashing over here too!” Tom piped up.
Slowly, every web developer and designer in the company succumbed to the same problem. Restarting Windows didn’t help.
Late on a Friday, the developers tried to rope in as many IT people as they could who hadn’t already escaped to weekend bliss. “Uh… have everyone run a virus scan!” commanded the most senior guy left, someone who’d only been working there a few months.
All virus scans came back clean. IT convinced one person to attempt a reimage of his machine, yet still the problem persisted. Minutes of downtime dragged into hours. By then, management had emerged to escalate the panic to hysteria. Unfortunately, no amount of “FIX IT NOW” meetings ever did anything to fix a problem, especially when they trapped IT folks in conference rooms and prevented them from working on said problem.
Tom worried about the proximity of his last update and the crash issue occurring. He hadn’t told anyone yet, but it’d only be a matter of time before someone thought to check the commit log. His machine was clean, though! How could a CSS file possibly crash anything?
Tom googled around for anything regarding Dreamweaver crashes. The first page of results led nowhere. It was only after much digging that he discovered a forum post out in the boonies of the Internet, wherein the original poster described a problem remarkably similar. Tom scrolled faster and faster down, scanning for any helpful reply. Finally, someone fingered it: Dreamweaver cant open files that are 8KB EXACTLY in size.
What? That’s insane! Tom thought.
He checked the size of the last file he’d worked on. 32768 bytes.
Well, that’s not 8K... wait! Tom opened up the Windows calculator and typed in 32768 / 8192 = …
4. The answer was 4. Sure enough, the file size was an exact multiple of 8K.
Heart racing, Tom opened the CSS file and added a blank comment line at the bottom. After confirming the file was no longer 32768 bytes in size, he committed the change to the SVN, then updated. Finally, the moment of truth: he tried to open Dreamweaver.
It opened successfully.
Tom waited several seconds, then bolted out of his chair. “Everybody update SVN, now! I think I may have fixed it!”
Soon, everyone was back in business, wondering how the heck Tom had done it. He emailed them a link regarding the now-infamous Dreamweaver 8KB bug, but neglected to mention it was his own check-in that had spawned the issue.
Метки: Feature Articles |
CodeSOD: Committed to Committing Commissions |
Simon worked in a small shop that supported a sales system. One of the features of the system was that sales commissions were stored in the database. For the sake of simplicity, the sales commissions were stored as the multiplier factor needed to compute the total sale. For example, a 5% commission on $100 would be $5, so the factor would be 1.05 so you could just multiply: 100 * 1.05 -> 105.
Of course, when they needed a report that showed the percent commission for a given sale, they had to work backward from the multiplier to get the actual value.
One of the Finance Team bean counters complained that this report is getting the wrong commission rate from the database for one sale. Simon went to have a look. It's an unusual commission rate we don't often use, 7.5%. It displays correctly in the application, but is showing up as just over 1% in the report.
That didn't make much sense. All the other sales commission rates showed up just fine, and a number is just a number - it can't possibly matter how often a particular commission rate is used, surely? The report had been set up by the Finance person's predecessor's predecessor. The source for the commission column was:
If {commission_rate} = 1.2 Then 20 Else If {commission_rate} = 1.15 Then 15 Else If {commission_rate} = 1.0 Then 0 Else If {commission_rate} = 1.16 Then 16 Else If {commission_rate} = 1.125 Then 12.5 Else If {commission_rate} = 1.1 Then 10 Else {commission_rate} End
While commission rates were stored in the database as the factor to multiply the base price by to get the price with commission included, this report wanted the commission rate displaying as a percentage, so they needed converting. Its author had known the conversion for the two commission rates used most of the time, and apparently added others over time.
Of course this meant that the fix was simple: Finance simply needed to add this 'new' commission rate to the end of the list, and all would be well. They were happy that the cause of the problem had been identified, and they knew how to fix it.
However, Simon couldn't leave it at that. For one, he could see a future of intermittent requests to help 'fix' the report every time Sales agreed to use a commission percentage that hadn't been used before. Can't the reporting software do arithmetic? Finance didn't know, so he boldly gave it a go, removing all of the Ifs and replacing the expression with just:
({commission_rate} - 1) * 100
It worked fine. As Simon moved on to the next project, he wondered whether the report's author hadn't spotted the pattern between the raw rates from the database and the desired percentages, or whether simple arithmetic was beyond the capabilities of a member of the Finance team.
Photo credit: Dave Dugdale / Foter / CC BY-SA
http://thedailywtf.com/articles/committed-to-committing-commissions
Метки: CodeSOD |
Error'd: A Bad Day for Recovery |
"I guess this gives new meaning to 'Read-Only Fridays'," writes Petr S.
Peter D. writes, "Now, if only someone would click on the window, WE'D KNOW HOW MUCH GAS COSTS!"
"It's not just logic...it's Microsoft Logic™!" wrote Chris P.
"booking.com has a new way of making it obvious how many stars you want from a hotel," writes Joe B.
"Hmmm...I'm not quite sure this is the right resolution for me," wrote Greg, "Oh well, I've got time to think about it."
"You know, you'd think they could find a better picture of Cyndi Lauper," writes Renan B.
Dane W. wrote, "While taking corporate-mandated Code of Ethics training, I got this message. I'm a little disappointed that Linux isn't supported, but fortunately Linux is supported."
"When I tested Opera Mini for Windows Phone I found a bug," Jesse S., "When submitting it I got this nice screen."
Метки: Error'd |
Citizen Blaine (Pt 2) |
Citizen Blaine is the story of one genius developers career. Last time, we saw the start of his arc of success. He started by accomplishing the seemingly impossible, and moved on to design the impossible system.
We last left Rich, the desparate developer on a deadline, trying to trace the mystery of Blaines last word- Rosebud. His search brought him to Dave, the salty and rude developer who maintains SLED, part of Blaines legacy.
So, Blaine leaves the SLED team to go start his supply-chain crapfest, right? Dave said. And allllll of the problems with SLED are somebody elses fault. Daves eyes picked up an evil gleam as he turned to Rich. He was home free… until Franz came in.
Halfway through the SLED project- the actual halfway point, and not the budgeted and projected halfway point which had come and gone ages ago- the VP of IT was replaced by Franz. SLED wasnt the only project that was floundering, and someone upstairs was sick of watching money fall down a hole in IT. Franzs job was to fix that.
Franz was a smart boss, and knew that problems like this often started at the bottom and worked their way up to the top, so he started by talking to the guys in the trenches. His round of interviews eventually brought him to Dave, and when he asked Dave: Why do you think SLED is so far off target? Dave took that as license to tell Franz exactly who he thought was responsible.
A short time later, a conference room was repurposed to be used as a team room. Dave and a few of the other developers were sequestered in there, and Dave suspected that it might be as punishment for his inappropriate honesty. Then Blaine entered the room, laptop in tow.
Blaine flopped into a chair, then glared around the table. Dont think I dont know you are working against me, he said.
Working against you? Dave asked, sweetly.
Yes, against me! Blaine snapped his laptop open and spent a moment glaring at the screen before looking up to make eye-contact with Dave across the table. Someone was telling lies to Franz about this project, slandering me to my new boss. And if you think for one second, that Im going to let you get away with that- I will burn this project to the ground before I let you ruin what Ive created!
Franz entered on the heels of that screed, to explain exactly what was going on. Blaine shall be assisting you on this project until its complete. All of the supply-chain activities are on hold until we get this project out to the users. This will happen in six weeks. It does not matter how it looks. It does not matter what sort of quality problems the code has. The users will receive a working product in six weeks, and if you cannot deliver, someone else will. Am I understood?
When Franz left, Blaine stood up. You heard him. Ive already given you the design, and it was elegant in its simplicity. The fact that you failed to implement my vision reflects poorly on your skills as developers, but I refuse to let it reflect poorly on me. Lets get our heads down and get this done. NOW!
We didnt need Blaines help, Dave said. Not at that point. Still, it was hilarious to me. Blaine wanted us to track every task in an Excel file he set up, so he could crack the whip as needed, but we all got in the habit of lying. Until the last day of the project, we had him in a constant panic that things were still six months behind.
Thats cruel!
Dave shrugged. The asshead deserved it. Besides, he got to go play boss-man and be a manager upstairs.
Which is where Rich had started with Blaine. The Supply-Chain team was on the sixth floor, and Blaines right-hand was Lisa. At this point, it was almost 6PM, but Lisa gave no indication that she was close to ending her day. Ill be with you in one moment, she said.
One moment turned into 20 minutes, as she scrambled to juggle config files across a dozen servers, manually moved executable files into production environments, blasted out emails warning about the changes, noticing a minor bug and making an emergency patch that she rolled straight out into production.
Sorry, about that. Its always busy up here.
I can see that… is this normal?
Well, its been pretty quiet today. This department is always in total chaos.
One one side of the table sat Lisa and Blaine. On the other side were Mike and Steve, two guys from operations. Blaine slapped the table and said, Look, we cant operate on Initech time, here! Our team needs to move at the speed of business.
I totally understand that, Mike said, we totally understand that. But you cant just email .exe or .asp files to my team and tell them to drop them in a folder. We have sign-offs and change management processes for a reason.
From what I can tell, Blaine said, that reason is to slow us down. Lisa watched him take a deep breath and force himself to be calm. Im sorry, but for our team, success is the only option. When we need to change software, its usually on a short notice, and if we dont do it correctly right then, chemicals dont ship. We need a little more responsiveness from your team.
I get that, Blaine, but we work with every team in Initrode. Were more than happy to help you move to automated deployments-
We havent got time for that! We dont even have time for this meeting- in fact, I have to call this here. Blaine glanced at his watch then back at Mike and Steve. Im sorry, but Im going to send a request to the VP of IT that all of our servers are moved under our teams control. This works out better for everyone- we get to control our cycle time, and you dont have to worry about any more meetings like this.
So, thats why I do a lot of server admin work, Lisa said.
How often are you changing code in production ?
Oh, pretty much every day. Id love to find a better way, but who has time?
Richs history lesson hadnt netted him anything, so he swung back to Blaines office. It had already been tossed by his peers, but no one had found anything useful, documentation-wise. It was strange being in the office without Blaine or the stamp of his personality that he had left on the space. It felt almost dead- just old binders and tech manuals from a decade past.
That, and Blaines USB hub, which he had forgotten. It was a cheap plastic snow-globe, with the water half evaporated out, likely a relic from some department Secret Santa exchange. Rich picked it up and gave it a shake anyway, which did little to motivate the white powder within the globe. Thats when he noticed 64MB embossed on the side. It was a storage device?
Rich ran down the stairs to his cube, snow-globe clutched in his hand. He slammed the cable into his computer, and watched as Windows detected a mass storage device, and then opened an explorer window. The drives label was Rosebud. Inside was a single folder, crammed with Word documents, Power Point slide decks, and archived emails. It was everything Blaine had even known about about anything in the company.
With a trembling hand, Rich double clicked on the document called LabellingSystemDocumentation.doc. Word cranked, opened the document, which had three lines in it:
Used by plants to print labels.
Ive built this one to be super hard to maintain, its so high priority that every time I touch it, I look like a goddamn hero.
Метки: Feature Articles |
CodeSOD: Exceptionally Secure |
Error handling is not an easy task. Even the tiniest bit of code can fail in spectacular ways.
Luckily, modern programming languages tend to use at least some sort of exception model, which means that even if your program crashes, you’ll still be able to obtain more debugging information than a "Segmentation fault" or other generic error message would provide.
Manuel, however, was not so lucky. Having been asked by one of his interns for help on an internal ASP.NET app that "just wouldn’t work", he found himself staring at the most useless error page imaginable:
An error has occurred. Please contact the system administrator.
"I narrowed it down to that bit" – the intern said sheepishly – "but I have no idea what’s wrong with the code. I mean, it should work, right?"
try { count = repository.GetProductCount(); //... } catch (Exception e) { Server.Transfer("error.aspx"); }
"Okay, it looks like there’s some sort of database problem..." – Manuel muttered to himself, diving into the code.
public int GetProductCount() { try { var conn = new DB2Connection(connString); //... } catch (Exception e) { throw new InitrodeException(e.Message); } }
"DB2, DB2... Have you installed the data provider?" – he asked, trying to rule out the horses before looking for zebras.
"Umm..." – the intern’s hesitant mumble pretty much confirmed the diagnosis. Manuel pointed him to the appropriate Confluence site and was getting ready to leave, when something else caught his attention.
There was a single breakpoint in the code, right on the Server.Transfer line.
"Can you run that again?" – he said. The intern clicked "Debug", and was greeted with the same error page as before, with the breakpoint never getting hit.
"Huh... Okay, just run the install." – Manuel said, rushing to his own desk to investigate. He made sure he had the code flow right, then proceeded to mangle his web.config file to get the DB2 provider to throw an exception. As expected, the error page appeared as soon as he clicked "Debug".
He set a breakpoint in the catch block and ran the app, only to instantly be greeted by the error page again. After a quick search through the codebase, he finally found himself staring, jaw wide open, at the most unlikely place...
public class InitrodeException : Exception { protected HttpContext context; public InitrodeException() { } public InitrodeException(string message) { context = System.Web.HttpContext.Current; context.Server.Transfer("error.aspx"); } }
Terrified to his core, he checked a couple of other code files – and of course, all of them followed the same anti-pattern. Almost every possible exception was caught, dismembered, had its message violently extracted and stuffed into the God-exception class, which then discarded it anyway and did a redirect, on its own, in the exception constructor.
Fuming, Manuel checked the version control logs and rushed to the consultant responsible for the changes.
"Hello. Would you maybe care to explain that code?" – he asked, laptop in hand, voice cold and sharp as a knife, but not missing a tiny glimmer of hope that maybe there is some kind of an explanation.
"Oh, that’s our security feature." – the consultant barely glimpsed at Manuel before resuming his work.
"What?"
"Look..."– with a long sigh, the consultant typed up a few words in Visual Studio and turned the monitor. "What do you see here?"
The screen showed a standard ASP.NET error page, with an unhandled exception showing up.
"Uh... that’s... an error page." – Manuel managed to utter, completely thrown off by the question.
"Exactly. And what’s on that page? Code. Stack traces. Line numbers. How can you call a website secure if you expose this kind of data to just anybody? And all that from just one unhandled exception that slips through. But here – " – the consultant tapped at Manuel’s screen – " – we simply let the exceptions handle themselves, which makes the app robust and secure."
Метки: CodeSOD |
Citizen Blaine |
Rich had a five-alarm project. Six months ago, the legal department became aware that government regulations on labeling would change. That information slowly ground its way through the intestines of the company, until a pile of poorly documented, barely specified changes landed on Richs desk. If he didnt implement those changes in the next 48 hours, a half-million units of commodity chemicals were about to pour out of a processing plant and be illegal to ship.
The problem was confounded by the nature of the labeling system. It was tied into a home-grown, supply-chain management system. Theoretically, it was a one-stop shop for everything- formulations, MSDSes. In reality, it was a complicated thicket of unrelated applications which dragged data around between various silos, and usually crashed in the process. Rich had no idea what this change was going to involve. Only one person, the head of the Supply-Chain IT team, could point him in the right direction: Blaine.
Blaines office was normally crammed with the awards, trophies, and various atta-boy certificates which honored him for a job well done around the company. Today, the walls were bare, and all of those meaningless honors were piled up in a box on his desk. Blaine ignored Rich, and finished packing his box.
Uh, Blaine… I have a few questions?
Blaine said nothing, took one final glance around the office, picked up his box, and walked towards the elevators. Rich trailed after him.
I just need a minute…
Blaine pushed the button on the elevator, and the doors pulled back. He strode in. Rich put a hand on the door, to hold it open, but Blaines cold glare caused him to flinch back. The door slid closed, and in the last instant before Blaine vanished forever, he whispered one final word: Rosebud.
The department descended into panic as news of Blaines sudden exit spread. The Supply-Chain suite of applications was his baby. He was the rockstar, the genius, and the only person that could hold that ball of mud together. Half a dozen projects screeched to a halt in his abscence. Managers piled onto the problem, as if adding more cooks would fix anything. Eventually, Richs boss took charge: The last thing he said to Rich was Rosebud. Thats our only clue. It might be a server name, it might be a password. We need to find out what!
The clock was ticking. Some team members started rifling Blaines office, while others dove deep into the corporate SharePoint. Rich decided to take a trip up to the executive floor. Blaines first project manager, Sarah, now had an office up there. She might have some insight into where Rich should be looking.
The executive conference room did its best too look expensive: crystal wall sconces, gold leaf, and a wooden table large enough to keep the Titanic afloat. The only thing neither expensive nor luxurious was the projector, which was at least a decade old and only supported VGA in.
Sarah grabbed a corner of the table and pointed Rich to a seat beside her. You have to understand, that back in those days we were just getting over doing everything on a mainframe. Suddenly, everbody and their sister wants a Windows program to get at data still in the mainframe.
Everything still lives in the mainframe, Rich said, but its going away soon.
Sarah laughed. Its been going away soon for twenty years. Anyway, we needed to desktop apps that could get data out of the mainframe, and the only thing we could find for our particular variety was a proprietary package with a $1000/seat license. Blaine was just a junior programmer back then, but he said…
I can do this without needing to buy a license for anything.
Sarah weighed her options. The business need- desktop apps- versus the costs, versus how much of Blaines time she could spare. In the short time hed been here, she could tell that he was smart, possibly too smart to be churning out line-of-business applications for the rest of his career. You have two days to get me a proof of concept, she said. And you still have to keep up with your other project work. Theres no billing number for this, but I dont want to see it showing up on admin, either.
Ill get you a complete product in two days.
Id be happy with a PoC, Sarah said. Dont over-promise and under-deliver.
I never will, Blaine said.
Two days later, Blaine handed her a floppy loaded with SCARF: System Connection Application for Realtime Federation. This is connecting to production, he warned her as he pulled up data. The application was a Visual Basic MDI, crammed with buttons, toolbars, and a variety of screens. It was a requirements-complete implementation, in only two days.
They released the application to the users, and they were overjoyed. Gone were the cryptic keyboard shortcuts and issues with terminal emulation. Instead they had loads of on-screen buttons, and most important, the ability to load data into Excel.
That was a huge success, at least while Blaine was on our team.
What happened after he left?
Well, it was really just a terminal emulator. It screen scraped the mainframe, so any time a mainframe screen changes, the GUI breaks. Fields vanish, or get chopped off, that sort of thing. Ive been fighting for a budget to replace it, but the business unit doesnt want to spend anything on it.
Based on his wild success with SCARF, Blaine leapfrogged to a lead developer position on an effort called SLED: Superior Leads for Enterprise Distribution. It was a huge effort, and was still spoken of in hushed, almost fearful tones. Dave, the lead developer, was Richs next stop.
Good friggin riddance, Dave said. Im glad hes gone, but damn if I wish Blaine could have taken this piece of sh-urely fine software with him.
I thought SLED was a big deal?
Oh, it is. Millions of dollars of inventory, customer invoices, end to end process management. Its a big frickin deal. It was also never finished, so I spend most of my time manually doing things that should be automated. If I dont, or if I screw up, I get called on the carpet and reminded that our biggest customers depend on this being accurate. And before you ask, no, Im not allowed to fix the damn thing- the VP doesnt trust developers after Blaines playtime.
Playtime?
Behind Blaine glowed a PowerPoint slide displaying the Agile Manifesto. Dave, along with six other developers, were crammed into a tiny conference room. These, Blaine said, are our principles. We are going to stick to this, to ensure that we deliver what the business actually needs, quickly and efficiently.
This was 2002, so no one really grasped the Agile concepts, least of all Blaine. For all that he laid out his statement of principles, he wasted no time in subverting them. The very next slide dictated out his architectural vision for the application, and it was a doozy. There were 4-ish tiers- presentation, business, data, and legacy connector. To allow developers to work with perfect separation, he had already designed a set of XML schemas- each tier would communicate with the others only through this XML design.
Much of the XML design was focused on screen definition, for Blaine didnt want to simply solve the problem the users had. He wanted to solve the general problem of building data driven screens using classic ASP. SLED isnt just an inventory tracker, he said, its the model for all of our future applications. Its infinitely extensible, with screens defined by data- its our first internal CMS.
So, six months in, we hit the first milestone, right? Dave said. "But we havent been building anything thats an actual feature- weve been building this generic framework for defining data driven screens in XML, and storing those templates in a database. Management is pissed, but Blaine has been so successful this far, that everybody lets the project keep running. A year in, and weve built a great internationalization layer- for an application that is only going be used in the US. Another six months, and finally, we start delivering basic inventory tracking.
"Were over schedule, over budget, and now, managements really pissed. So what happens? They pile more managers and developers on the frickin project. Blaines design is deemed too complicated, but weve already implemented about half of it, so guess what? We keep the work weve done, but new features have to be implemented in a more streamlined way. It becomes this massive Franken-project, with VB GUIs slapped in to build some features, while everything that was going to be part of the legacy processor get dropped as PL/SQL stored procedures that FTP files around.
But heres the real kicker, and the reason Blaine should rot in hell. Vince, the manager who tried to yank his leash, retired before the project finished. So Blaine turns around and says, Look at how successful I could have been without micromanagement. I saved this project from Vince. He built himself up as the hero of SLED, and bailed before the project was finished so he could be a department head.
I can't believe they let him get away with that, Rich said.
"Oh, they didn't…"
Метки: Feature Articles |
CodeSOD: A Binary Number Generator |
Rich had heard countless complaints from Cindy in Finances that the reports were "slow"
Метки: CodeSOD |
Error'd: Just Testing the News |
Thanks to Jesse S. we know that the Sydney Morning Herald isn't afraid to do their testing in Production.
"I can't wait to play the Michigan Mega Millions lottery this week," wrote Paul L., "Who knows? I might just win an undefined amount of money!"
"Despite all of the direction that Embarcadero's site provided me, I still can't find my Computer ID," writes David N.
Sean G. wrote, "When I tried to install Oracle Database 11g Express Edition, it insisted that every port I entered was in use. I got fed up and tried letters only to find that they were taken as well."
"I encountered this ironic message while trying out various versions of nVidia's display drivers," writes Fox.
"Got this very helpful message when clicking on a Google link," David T. writes, "Seems IBM's knowledge database does not like first visit to land on a specific page instead of main portal."
"I gotta wonder Microcenter's logic for asking how many empty 5.25" drive bays my computer has," Mike wrote.
"First Google updated it's terms and conditions and then it moved them?! Talk about being rude!" Shaun F. wrote.
Метки: Error'd |