• blunder (unregistered) in reply to Mike
    Mike:
    The Real WTF for me is that I didn't even know the Sega Nomad existed! Seriously, a handheld that can take Genesis/Megadrive carts direct? WTF? Where the hell was I in the mid 90s and why didn't I get a memo about this?

    Try to actually compile a full list of the hardware Sega sold. Just the home stuff, you don't have to count arcade machines. I find it to be mind-blowing.

    Not only was the Nomad not the only portable Genesis (if you count the Mega Jet), but the Sega/Mega CD had at least six different models, the Genesis has had three or four. They allowed the Saturn to cannibalize 32X sales. Same with the DC and the Saturn.

    Their "more is better" approach to hardware SKUs with infighting and actual sabotage happening between jealous divisions, and you have a series of WTFs worth of relegating even the mighty Dreamcast to history's junkheap.

  • (cs) in reply to Mhendren
    Mhendren:
    campkev:
    Mhendren:
    campkev:

    the debate is whethere IBM qualifies as a word, since it isn't pronounced like a word, like SCUBA and RADAR are

    <lame joke>

    You can't read? I didn't say I couldn't pronounce it, I said it isn't pronounced like a word. When you see the word "can" do you say "see-ay-en" or "kan"?

    You can sort-of italicize "like a word" all you like.

    The pronunciation of a word, depends on the word. How do you pronounce pneumatic, knife, or epitome? Using your qualifications none of these are pronounced like the word they spell. The English language (all dialects) has no pretense that the collection of letters you have in the spelling of a word affect the pronunciation of that word. They just weight the possibilities of pronunciation.

    I am merely stating that just because some words are pronounced as their constituent letters, does not mean they are not pronounced like a word. From a certain point of view that is, I can obviously see where you were going with that, and chose to explore an alternative side with minor, admittedly lame, humor not intending to be injurious or otherwise untoward you in any manner.

    Cough, Rough, Bough, Though

  • Jon (unregistered)

    The real WTF is the amount of people on here who can't agree on what the posted code actually does :D

  • Logh (unregistered) in reply to Voodoo Coder
    Voodoo Coder:
    rbonvall:
    The codez will fail for the AXMD (Association of XXX Movie Directors).

    A workaround for this would be to check whether the delimiter has an even ABBR_IDX.

    It wouldn't fail on AXMD. Take a closer look at it...it actually works pretty well for to check for an all-x string. Even if the last character were X it would work fine...

    No!! The row with 'XXX' will be treated as a delimiter....

  • Huh? (unregistered) in reply to Nath3an
    Nath3an:
    The real WTF is that IBM, LA, WCAB and WTF are not acronyms. They are abbreviations.
    Wha???

    St. is an abbreviation (whether for Street or Saint...)

    WTF, IBM, LA, WCAB are all acronymns....

  • emaN ruoY (unregistered)

    my brain hurts......

  • modo (unregistered) in reply to Voodoo Coder
    Voodoo Coder:
    rbonvall:
    The codez will fail for the AXMD (Association of XXX Movie Directors).

    A workaround for this would be to check whether the delimiter has an even ABBR_IDX.

    It wouldn't fail on AXMD. Take a closer look at it...it actually works pretty well for to check for an all-x string. Even if the last character were X it would work fine...

    Yup, it works... leaving aside the issues of not using equality test methods that are in the library, not breaking out of the loop as soon as retcode changes state, and creating a new object in order to "compensate" for this inefficiency ... it's fine. Almost chindogu.

  • People Are STOOPID!!! (unregistered) in reply to Nobody
    Nobody:
    Its amazing that people will go to the trouble to correct other people here and manage to be wrong themselves. Pointing out that other people are wrong is apparently more important than being right yourself.

    It is not an acronym unless you pronounce it like a word and not a series of letters. So for example:

    UN is an abbreviation NATO is an acronym

    IBM is an abbreviation SCUBA is an acronym

    Oh the irony... Why would you bag people for correcting others and then jump in and make a correction yourself? I suppose as you said, pointing out how wrong everyone is is far more important than anything else....

    (As already pointed out) Many (I would say most, but I can't confirm that) dictionaries do not share your view that Acronyms must be pronouncable words...

    I'm not entirely sure that the pedantry really matters, one way or the other...

  • Bobby Tables (unregistered)

    So IBM stands for International Machines Business?

  • KopT (unregistered) in reply to campkev
    campkev:
    I would love to see what this guy would have come up with if someone had asked him for something like "Hey, you've got that AJAX stands for 'Asynchronous JavaScript and XML' but we need to know if the acronym contains an acronym, and if so, what it stands for."

    Wait, doesn't PHP stand for "PHP Hypertext preprocessor"?

  • Humbug (unregistered) in reply to modo
    modo:
    Voodoo Coder:
    rbonvall:
    The codez will fail for the AXMD (Association of XXX Movie Directors).

    A workaround for this would be to check whether the delimiter has an even ABBR_IDX.

    It wouldn't fail on AXMD. Take a closer look at it...it actually works pretty well for to check for an all-x string. Even if the last character were X it would work fine...

    Yup, it works... leaving aside the issues of not using equality test methods that are in the library, not breaking out of the loop as soon as retcode changes state, and creating a new object in order to "compensate" for this inefficiency ... it's fine. Almost chindogu.

    No it doesn't.... It has nothing to do with the X in AXMD, it has to do with the fact that XXX is one of those 'words'....

    When 'XXX' is tested as a word, the program returns false (it never gets set true, because it only processes Xs)

  • (cs) in reply to People Are STOOPID!!!
    People Are STOOPID!!!:
    Nobody:
    Its amazing that people will go to the trouble to correct other people here and manage to be wrong themselves. Pointing out that other people are wrong is apparently more important than being right yourself.

    It is not an acronym unless you pronounce it like a word and not a series of letters. So for example:

    UN is an abbreviation NATO is an acronym

    IBM is an abbreviation SCUBA is an acronym

    Oh the irony... Why would you bag people for correcting others and then jump in and make a correction yourself? I suppose as you said, pointing out how wrong everyone is is far more important than anything else....

    (As already pointed out) Many (I would say most, but I can't confirm that) dictionaries do not share your view that Acronyms must be pronouncable words...

    I'm not entirely sure that the pedantry really matters, one way or the other...

    This is the most asinine conversation that has occurred on planet earth today.

    But, since you all take such pleasure from being insufferable know-it-alls, I can join in the fun.

    The key lies in the etymology of the word (Greek). "Acro", from the Greek "akros", meaning tip, "onym", derived from "onoma", meaning name.

    The implied meaning is that an acronym is then a Name based on the tip of a word. There is nothing in the etymology to suggest that pronunciation is relevant.

    Ipso Facto, IBM is an acronym. Since an acronym is technically a type of abbreviation, IBM is also an abbreviation.

    QED suckas.

  • YUIO (unregistered) in reply to KopT
    KopT:
    campkev:
    I would love to see what this guy would have come up with if someone had asked him for something like "Hey, you've got that AJAX stands for 'Asynchronous JavaScript and XML' but we need to know if the acronym contains an acronym, and if so, what it stands for."

    Wait, doesn't PHP stand for "PHP Hypertext preprocessor"?

    It does for about the last 12 years...before that it actually stood for Personal Home Page.

    A similar "recursive acronymn" is GNU = GNU's not Unix

  • (cs) in reply to Humbug
    Humbug:
    modo:
    Voodoo Coder:
    rbonvall:
    The codez will fail for the AXMD (Association of XXX Movie Directors).

    A workaround for this would be to check whether the delimiter has an even ABBR_IDX.

    It wouldn't fail on AXMD. Take a closer look at it...it actually works pretty well for to check for an all-x string. Even if the last character were X it would work fine...

    Yup, it works... leaving aside the issues of not using equality test methods that are in the library, not breaking out of the loop as soon as retcode changes state, and creating a new object in order to "compensate" for this inefficiency ... it's fine. Almost chindogu.

    No it doesn't.... It has nothing to do with the X in AXMD, it has to do with the fact that XXX is one of those 'words'....

    When 'XXX' is tested as a word, the program returns false (it never gets set true, because it only processes Xs)

    Yeah, I willingly concede that when I originally posted the "Sure it'll work!" post, I was daftly assuming that the loop was checking an the acronym, not the meaning of the acronym.

    The program of course fails if you have a string of all X's.

  • Harrow (unregistered)

    This example seems to illustrate three perversions. The definitions are stored as separate words, the normalization looks real wierd, and the table contains unnecessary group delimiters. But are these all really perverse?

    Question one: did the original author have a good reason for storing the abbreviation definitions as separate words, or was he blundering about in total blindness?

    Maybe he slept through his second hour of CSB102 and thus missed learning about spaces -- but maybe he had a vague reason for storing the definitions as separate words. E.g.:

    (1) Maybe the data contains many related definitions like the WCAB example, and he hoped to encode something like this:

    {WORK|WORKER'S|WORKMEN'S} {COMPENSATION} {APPEAL|APPEALS} {BOARD}

    Defining a sort of regex structure like that would require breaking the definition into words or at least substrings. Unfortunately the author didn't have the skills to complete his mad design, or the time to undo his bizarre table structure.

    (2) Maybe the original author slept through his second hour of CSB302 and thus missed learning about VARCHAR. Making a CHAR column wide enough for the longest anticipated definition would certainly waste an enormous lot of storage. So he defined the individual words in ABBR_TXT as buckets, and applied the first normal form. This is brillant if you think about it.

    (3) Given the one-to-many relationship of abbreviations to definitions, the data is not obviously useful for translating abbreviations into their expanded phrases. It could, however, handily serve to translate common phrases into standardized abbreviations. Perhaps you can see how a secondary index on ABBR_TXT could be used in a sophisticated search algorithm to quickly identify all possible abbreviations containing each word in the target phrase.

    Or perhaps not. I sure can't.

    Question two: is the current table structure the result of many careful successive refinements, or did the developer just stop messing with it as soon as it seemed to work?

    Given that the definitions will be stored a separate words, the table structure is perfect. Of course the column order does hint at a somewhat convoluted history of design -- one can only blanch at the thought of what early versions of this table must have looked like -- but it works fine now.

    ROWID int -- primary index; secondary index column 3 ABBR_CDE char 15 -- secondary index column 1 ABBR_IDX int -- secondary index column 2 ABBR_TXT char 30

    Range on ABBR_CDE: all the words in all the definitions for a specific abbreviation.

    Range on ABBR_CDE, group on ABBR_IDX: all the words in each separate definition for a specific abbreviation.

    Range on ABBR_CDE, group on ABBR_IDX, sort on ROWID: all the definitions for a specific abbreviation.

    I ask you, what more could you want?

    Question three: Can there ever possibly be any excuse for a record group delimiter?

    A complete failure of truly epic calibre. It does, however, provide definitive answers to questions one and two.

    -Harrow.

  • Dirk Diggler (unregistered) in reply to KopT
    KopT:
    campkev:
    I would love to see what this guy would have come up with if someone had asked him for something like "Hey, you've got that AJAX stands for 'Asynchronous JavaScript and XML' but we need to know if the acronym contains an acronym, and if so, what it stands for."

    Wait, doesn't PHP stand for "PHP Hypertext preprocessor"?

    I was curious so I tried to query PHP about an hour ago, but it hasn't finished yet.

  • (cs)

    People Can't Memorize Computer Industry Acronyms

    (or Abbreviations, if you wish)

  • Sutherlands (unregistered) in reply to Ben
    Ben:
    But retval is not being returned at that point. The loop continues, checks a few more letters which will keep retval being true. Then the last letter, which is an X. So retval becomes false, the loop ends and retval is returned..
    Why?
  • (cs) in reply to Harrow
    Harrow:
    Range on ABBR_CDE: all the words in all the definitions for a specific abbreviation.

    Range on ABBR_CDE, group on ABBR_IDX, sort on ROWID: all the definitions for a specific abbreviation.

    I ask you, what more could you want?

    What more could I want? The truth perhaps. Based on your ranges, it looks like quite a few acronyms also mean "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX."

  • The Mensan (unregistered)

    ... the rest of us non-MENSA types will keep referring to it as IBM.

    uh... I am a MENSA type but I also refer to it as IBM... o_O

  • (cs)

    One possibility is that this started life as a flat file (without the ABBR_IDX column at the end), and the delimiters were used more or less sanely to indicate the end of a particular meaning for the current abbreviation. (Breaking it up into words is still a WTF though - in fact, even more in this case because it couldn't have been for indexing purposes.)

    Then, at some later point, the contents of the flat file were dumped into a database table. Hopefully the ABBR_IDX column was added at the same time because they realised they couldn't depend on rows being read out in any particular order. But I wouldn't bet money on it. They certainly didn't realise that the correct procedure would be to increment ABBR_IDX when you see the delimiter but not pass that row through to the database.

    Or, of course, they could have been smoking something particularly noxious the whole time they were doing the database design. It's hard to tell.

  • Nishant (unregistered) in reply to Ben

    private static boolean isNotAllXs( String s ) { StringBuffer test = new StringBuffer( s.trim() );

    boolean retVal = test.Length() == 0 ? true : false;

    for ( int i = 0; i < test.length(); i++ ) { if ( test.charAt( i ) != 'X' ) { retVal = true; break; } } return retVal; }

  • Fred (unregistered) in reply to NoAstronomer
    NoAstronomer:
    IMHO The "Real WTF" here is why anyone would bother typing in thirty X's when an empty string works just as well as far as the return value from isNotAllXs(...) is concerned.
    Because
    Hans:
    It looks like the designer wanted to implement a flat file
    or rather, it looks as if the designer IMPORTED a flat file.
  • Ben (unregistered)

    So many of the WTFs I see are old hat - some stupid algo dreamed up by somebody with 1 year of experience (that I remember implementing myself years ago) or somesuch.

    But every so often, I see a real, true, bonafide WTF. Somebody who is obviously, painstakingly, and carefully taking a clearly good idea and implementing it in the worst possibly imaginable way.

    This isn't one of the very best WTFs, those are reserved for those WTFs that work at multiple levels, where WTFs stack on top of each other like people in a cheap pornographic orgy video.

    But this, folks, is a real, true, bona-fide WTF. A true over-normalization!

    I guess you could call this 3rd^3 degree of normalization? It might be better if you implemented a linked list as a normalized database entry!??

    I could just see the schema now:

    create table wtfwtfwtf(thecharacter varchar(1), thesequence integer not null, thestringID integer primary key, unique(sequence, stringID));

    Enjoy! I sure did!

  • Eigen (unregistered)

    Go (SELECT abbr_txt FROM wtf_table WHERE rowid = 8413) yourselves!

  • Dr. Lindan (unregistered) in reply to Voodoo Coder

    If that is the only thing coming to your mind after reading about this code abomination - I really envy you!

  • Dr. Lindan (unregistered) in reply to Dr. Lindan

    Please disregard last post. After my first sip of coffee I got it. ;-)

  • Death (unregistered) in reply to annymouse
    annymouse:
    mebbe they wanted to be able to look up any acronym a particular word participates in.

    SQL specifies LIKE operator and some wildcard characters for that. Still a WTF.

  • WOLA (unregistered)

    I'm having a hard time seeing why the submitter of the story would opt for a DAL object and hashmap and keep the WTF in the background instead of converting the table to a sane normalized one. If he could create a new DAL for people to use I'm sure he could just sort the table out aswell.

  • IMSoP (unregistered) in reply to WOLA
    WOLA:
    I'm having a hard time seeing why the submitter of the story would opt for a DAL object and hashmap and keep the WTF in the background instead of converting the table to a sane normalized one. If he could create a new DAL for people to use I'm sure he could just sort the table out aswell.

    But then he'd have to write a reverse interface layer for existing code using the database in a non-abstracted way, and change existing code that was probably specifying SQL directly.

    Of course, once all code is using the new abstract hash-based interface, the DB-level implementation can be swapped out with minimal impact. But only once all code is using it...

  • (cs)

    130 comments, and nobody's brought up regular expressions yet (except Harrow's harrowing drive-by miss)? Shame on you all.

    public static bool isDelimiter(string testValue) { return Regex.Matches(testValue, "^X{30}$").Count != 0; }

  • Anonymous (unregistered) in reply to Code Dependent
    Code Dependent:
    130 comments, and nobody's brought up regular expressions yet (except Harrow's harrowing drive-by miss)? Shame on you all.

    public static bool isDelimiter(string testValue) { return Regex.Matches(testValue, "^X{30}$").Count != 0; }

    I can't comment on Java's regular expression handling but I know for a fact that the regular expression handling classes in .NET have the highest cyclomatic complexity of any classes in the entire framework. In other words, they are inefficient as hell. So in .NET land I would never use regular expressions for such a trivial task - the overhead is way too great.
  • (cs) in reply to Anonymous
    Anonymous:
    Code Dependent:
    130 comments, and nobody's brought up regular expressions yet (except Harrow's harrowing drive-by miss)? Shame on you all.

    public static bool isDelimiter(string testValue) { return Regex.Matches(testValue, "^X{30}$").Count != 0; }

    I can't comment on Java's regular expression handling but I know for a fact that the regular expression handling classes in .NET have the highest cyclomatic complexity of any classes in the entire framework. In other words, they are inefficient as hell. So in .NET land I would never use regular expressions for such a trivial task - the overhead is way too great.
    I would argue, but I'm home sick and not feeling too good at the moment, so, what the hell... go with this.

    public static bool isDelimiter(string testValue) { return testValue == "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; }

  • Anonymous (unregistered) in reply to Code Dependent
    Code Dependent:
    Anonymous:
    Code Dependent:
    130 comments, and nobody's brought up regular expressions yet (except Harrow's harrowing drive-by miss)? Shame on you all.

    public static bool isDelimiter(string testValue) { return Regex.Matches(testValue, "^X{30}$").Count != 0; }

    I can't comment on Java's regular expression handling but I know for a fact that the regular expression handling classes in .NET have the highest cyclomatic complexity of any classes in the entire framework. In other words, they are inefficient as hell. So in .NET land I would never use regular expressions for such a trivial task - the overhead is way too great.
    I would argue, but I'm home sick and not feeling too good at the moment, so, what the hell... go with this.

    public static bool isDelimiter(string testValue) { return testValue == "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; }

    Congrats, you just saved yourself a whole heap of CPU cycles! Don't get me wrong, regular expressions are an invaluable tool. But regex handling is a complex task that naturally comes at a heavy price in terms of CPU cycles. It should not be used frivolously.

  • (cs) in reply to Anonymous
    Anonymous:
    Congrats, you just saved yourself a whole heap of CPU cycles! Don't get me wrong, regular expressions are an invaluable tool. But regex handling is a complex task that naturally comes at a heavy price in terms of CPU cycles. It should not be used frivolously.
    I know. I'm not a champion of regex, although I do use them when they're handy. It's just that there are a bunch of guys on this forum that love to rag on them at every opportunity, so I was just throwing out some bait. I don't think you took it... you sound way too serious to be a howling wolf. :)
  • (cs) in reply to Anonymous
    Code Dependent:
    I would argue, but I'm home sick and not feeling too good at the moment, so, what the hell... go with this.

    public static bool isDelimiter(string testValue) { return testValue == "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; }

    Which will work beautifully until someone either misses or adds an X to the delimiter when they're inputting it ;^). Personally, I'd go for:

    public static bool isDelimiter(string testValue) { if (testValue.length() < 20) return false; for (char c: testValue.toCharArray()) if (c != 'X') return false; }

    I learned Java in the 1.4 days before they implemented foreach loops, and haven't written it for several years so I'm not sure if you could just iterate through the string rather than ocnverting it to a char array; but at least this version short circuits, is easy to understand, and deals with edge cases where either: a short string of Xs could be a legitimate part of the name, or someone has misentered the delimiter, by accepting any string of Xs longer than 19 as a valid delimiter.

    Now, who's going to be the first to flame me for use of magic numbers? ;^)

  • Peter Burden (unregistered)

    Of course you could write

    int isntallx(char *s) { while(*s == 'x') s++; return *s != '\0'; }

    this seems better than an earlier solution that appeared to copy the string into dynamic memory (having, presumably, worked out its length), then trimmed it, and then had a further go at working out the length before finally getting down to examining the characters.

    BTW when I first read the WTF - I thought the reference was to "-2nd" normal form (with a negative sign) which seemed seriously appropriate to this comedy.

  • (cs) in reply to JimM
    JimM:
    Now, who's going to be the first to flame me for use of magic numbers? ;^)
    Aw, Jim, didn't you see me say I'm home sick? You're making my head hurt. ;)

    Okay, granted somebody could enter 29 instead of 30 X's, or miss a shift key (assuming they were stupid enough not to set shift to uppercase before typing 30 X's). My take on that is, if they can't double-check their input, let the system crash and burn when they try to look up an Acrophony.

  • annymouse (unregistered) in reply to Death
    Death:
    annymouse:
    mebbe they wanted to be able to look up any acronym a particular word participates in.

    SQL specifies LIKE operator and some wildcard characters for that. Still a WTF.

    as has already been pointed out, such a construct is likely to result in a search that doesn't use an index. not scalable.

    and the reliance on the LIKE operator is likely to introduce subtle bugs. what if you want to find acronyms that use the word 'in' but not 'international', 'internationalized', 'begin', and myriad other variations? your simple LIKE is getting more complex.

  • annymouse (unregistered) in reply to Alex
    Alex:
    I think the real question is, why use 2nd normal form and not 3rd given today's database management systems such as SQL? There's also 1st normal form, as well as 4th, but there's a very good business reason we all mostly use 3rd and if someone doesn't know that reason, we say they don't know normalization as well as they should.

    I would say it's apparent from your comment that you don't know normalization as well as you think.

    for instance, what business reason would you propose for using 3NF, but not 4NF? what about 5NF?

    can you specify plausible business rules for the design in the original article that imply it's in 2NF but not 3NF?

  • Not a Robot (unregistered) in reply to Peter Burden
    Peter Burden:
    Of course you could write

    int isntallx(char *s) { while(*s == 'x') s++; return *s != '\0'; }

    Which is the natural way to do it in C, only the code is in Java (and looks for uppercase 'X').

    this seems better than an earlier solution that appeared to copy the string into dynamic memory (having, presumably, worked out its length),
    Which is trivial for Java Strings, unlike C strings.
    then trimmed it, and then had a further go at working out the length before finally getting down to examining the characters.
    Yes, the code is bad, but not as bad as a direct translation to C would be.
    BTW when I first read the WTF - I thought the reference was to "-2nd" normal form (with a negative sign) which seemed seriously appropriate to this comedy.
    Indeed, that was Voodoo Coder's point.
  • (cs) in reply to GalacticCowboy
    GalacticCowboy:
    What do you call a man with no arms or legs, floating in the ocean?

    If he's black? Bouy.

    </RaciallyInsensitiveJokes>
  • (cs) in reply to KopT
    KopT:
    campkev:
    I would love to see what this guy would have come up with if someone had asked him for something like "Hey, you've got that AJAX stands for 'Asynchronous JavaScript and XML' but we need to know if the acronym contains an acronym, and if so, what it stands for."

    Wait, doesn't PHP stand for "PHP Hypertext preprocessor"?

    $ acronynm PHP Segmentation Fault

    Hmm... the acronym looker-upper stopped working.

  • (cs) in reply to Anonymous
    Anonymous:
    Code Dependent:
    130 comments, and nobody's brought up regular expressions yet (except Harrow's harrowing drive-by miss)? Shame on you all.

    public static bool isDelimiter(string testValue) { return Regex.Matches(testValue, "^X{30}$").Count != 0; }

    So in .NET land I would never use regular expressions for such a trivial task - the overhead is way too great.

    Not to mention he broke the original implementation. What if I use "XXXXX" instead?

  • Paladin (unregistered) in reply to Ben
    Ben:
    But retval is not being returned at that point. The loop continues, checks a few more letters which will keep retval being true. Then the last letter, which is an X. So retval becomes false, the loop ends and retval is returned..

    Noooooo. Once retval is set true, there is never another chance to be set back to false. It returns true for XXXXXXXXXXAXXXXXXXXXXXXXXXXXXX

  • Iknowthis (unregistered) in reply to GalacticCowboy

    There's no point calling him. Just go and get him.

  • The Fake WTF (unregistered) in reply to Voodoo Coder
    Voodoo Coder:
    Not one to buy into that whole normalization thing, he created a table like the following:

    You obviously aren't familiar with -2nd Normal Form.

    I thought this looked more like What The Form. But the negative 2nd normal form is good too.

  • CiH (unregistered) in reply to GalacticCowboy
    GalacticCowboy:
    Your humour detector is clearly epic fail.

    What do you call a man with no arms or legs, floating in the ocean?

    Boub?

  • IMSoP (unregistered) in reply to CiH
    CiH:
    GalacticCowboy:
    Your humour detector is clearly epic fail.

    What do you call a man with no arms or legs, floating in the ocean?

    Boub?

    Yo mst be from the nited States of America...

  • ~A! (unregistered) in reply to Voodoo Coder

    2NF is not 'Normalized', it's stupidity in almost 100% of the cases in which it is implemented. This is one of those cases, without a doubt.

Leave a comment on “Thirty X's”

Log In or post as a guest

Replying to comment #:

« Return to Article