BOFH's excuse board

Duncan Coutts
Wed, 3 Oct 2001 11:51:36 -0500

Hi all,

I though you might apreciate this:

I've been reading the BOFH (Bastard Operator From Hell) serialisation
in The Register ( far to much recently.

He (the bastard) often uses his excuse board to confuse his helpless

I have made a Haskell version of this essential tool. I'm sure you'll find
it useful. Here's a random output selection and the code:

Undiagnosable Framing Condition
Extraneous Hardware Crash
Temporary Streaming Bug
Generic Peripheral Crash
Dereferenced Swapfile Override
Partial Service Anomoly
Delayed Bus Invalidation
Virtual Array Reclock
Generic Paging Incompatibility
Permanent Proxy Timeout
Non-Specific Precondition Rejection
Redundant Firmware Dereferencing
Delayed Reception Reclock
Unreportable Operation Corruption
Insufficient Parameter Condition
Non-Specific Bus Dump
Serial Comms Corruption
Unvalidated Encryption Underflow
Delayed Parity Desynchronisation
Major Code Incompatibility
Immediate Programming Destabilisation
Minor Parity Overflow



import Random

main :: IO ()
main = do
         gen <- getStdGen
         putStr $ excuse gen

excuse :: StdGen -> String
excuse gen1 = let (rnd1, gen2) = randomR (0, length part1 - 1) gen1
                  (rnd2, gen3) = randomR (0, length part2 - 1) gen2
                  (rnd3, _)    = randomR (0, length part3 - 1) gen3
              in part1 !! rnd1 ++ " " ++
                 part2 !! rnd2 ++ " " ++
                 part3 !! rnd3 ++ "\n"

part1 =
 ["Temporary", "Intermittant", "Partial", "Redundant", "Total", "Multiplexed",
  "Inherent", "Duplicated", "Dual-Homed", "Synchronous", "Bidirectional",
  "Serial", "Asynchronous", "Multiple", "Replicated", "Non-Replicated",
  "Unregistered", "Non-Specific", "Generic", "Migrated", "Localised",
  "Resignalled", "Dereferenced", "Nullified", "Aborted", "Serious", "Minor",
  "Major", "Extraneous", "Illegal", "Insufficient", "Viral", "Unsupported",
  "Outmoded", "Legacy", "Permanent", "Invalid", "Deprecated", "Virtual",
  "Unreportable", "Undetermined", "Undiagnosable", "Unfiltered", "Static",
  "Dynamic", "Delayed", "Immediate", "Nonfatal", "Fatal", "Non-Valid",
  "Unvalidated", "Non-Static", "Unreplicatable", "Non-Serious"]

part2 =
 ["Array", "Systems", "Hardware", "Software", "Firmware", "Backplane",
  "Logic-Subsystem", "Integrity", "Subsystem", "Memory", "Comms", "Integrity",
  "Checksum", "Protocol", "Parity", "Bus", "Timing", "Synchronisation",
  "Topology", "Transmission", "Reception", "Stack", "Framing", "Code",
  "Programming", "Peripheral", "Environmental", "Loading", "Operation",
  "Parameter", "Syntax", "Initialisation", "Execution", "Resource",
  "Encryption", "Decryption", "File", "Precondition", "Authentication",
  "Paging", "Swapfile", "Service", "Gateway", "Request", "Proxy", "Media",
  "Registry", "Configuration", "Metadata", "Streaming", "Retrieval",
  "Installation", "Library", "Handler"]

part3 =
 ["Interruption", "Destabilisation", "Destruction", "Desynchronisation",
  "Failure", "Dereferencing", "Overflow", "Underflow", "NMI", "Interrupt",
  "Corruption", "Anomoly", "Seizure", "Override", "Reclock", "Rejection",
  "Invalidation", "Halt", "Exhaustion", "Infection", "Incompatibility",
  "Timeout", "Expiry", "Unavailability", "Bug", "Condition", "Crash", "Dump",
  "Crashdump", "Stackdump", "Problem", "Lockout"]


Actually I was having problems with getStdGen on my hugs instalation. It
always returns the same number. So I hacked up an alternative that gets
passed $RANDOM on the command line:

main = do
         args <- getArgs
         let gen = read $ head $ args in
           putStr $ excuse gen