Comment On Random Ways To Get To Random()

It's been a few days since we've done the Code Snippet Of the Day, so in lieu of Alex's normal article, here's your mid-day CodeSOD edited by Michael Casadevall ... [expand full text]
« PrevPage 1 | Page 2 | Page 3 | Page 4Next »

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:15 • by A Nonny Mouse

i like these in particular

                            } // end for
                        } // end if hash_bytes
                    } // end if val non null
                } // end if key non null
            } // end while e.hasMoreElements

 so THAT's what }'s do...!

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:16 • by mustache

"The function, getRandomBIts() returns a 32-yte array of random bites for security purposes."

BIts?  ytes?  bites?  Make your mind up...

Still, good to see the CodeSOD back. 


Edit by MC: Err, whoops. my B key doesn't work so well, and I missed that -_-;. Fixed now.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:16 • by Anonymous
What an innovative way to do it! I bet he got paid by the line.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:20 • by rmr
Makes you wonder how Random.nextBytes() is implemented.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:20 • by Kyuzo

This is definitely the hallmark of a good WTF...code that is twenty times more complex and introduces many new points of failure, while not being any more secure since it adds practically no entropy to the random data.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:23 • by Michael Casadevall
105431 in reply to 105430
Anonymous:

This is definitely the hallmark of a good WTF...code that is twenty times more complex and introduces many new points of failure, while not being any more secure since it adds practically no entropy to the random data.



When I was going through the queue, it was the one that jumped out at me, because the guy knows how to do things like read Java configurations, but doesn't know Random(). I also find it funny how short the non-WTF version is.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:24 • by limelight
Although it doesn't make this any less of a WTF, I suspect the author was really trying to generate a GUID based on the fact that he was incorporating the system properties. The idea being to get a random sequence that was unique to the machine.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:24 • by newfweiler
Wow!  Knuth's going to have to add a new section to his chapter on random numbers.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:25 • by Michael Casadevall
105436 in reply to 105432
limelight:
Although it doesn't make this any less of a WTF, I suspect the author was really trying to generate a GUID based on the fact that he was incorporating the system properties. The idea being to get a random sequence that was unique to the machine.


It's been awhile since I touched Java, but at least on Win32, isn't there a direct API for generating GUIDs?

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:25 • by Gordonious
Oh, didn't you know? That's how the Java Random class is implemented internally anyway!

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:26 • by Moosey

"Without further to do"?!  Jesus.  This site alone could be fodder for a linguistic WTF blog.

 

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:27 • by Michael Casadevall
105440 in reply to 105438
Anonymous:
Oh, didn't you know? That's how the Java Random class is implemented internally anyway!


Well, Java is now open source, maybe I should look through the Random class code. Perpahs there is another WTF to be found there ;-).

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:28 • by Xandax
105441 in reply to 105426
Anonymous:

i like these in particular

                            } // end for
                        } // end if hash_bytes
                    } // end if val non null
                } // end if key non null
            } // end while e.hasMoreElements

 so THAT's what }'s do...!



Actually - I do some similar myself as it often helps my overview of the indentation, rather then having to trace an ending scope up to the starting point.

 

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:38 • by MichaelWojcik
Michael Casadevall:

The function, getRandomBits() returns a 32-byte array of random bites for security purposes. Since Java provides a Random method, this should be easy...

If this is in fact "for security purposes", then using Java's Random method would be as equally WTFy (and the five-line implementation is no more "correct" than the long one).

There is no "correct" way to generate pseudorandom data.  That's a domain-dependent function; the PRNG has to meet the particular requirements of the task.  In this case, of course, we have no information on those requirements other than "for security purposes", but if that's at all accurate we have some reason to believe that Java's Random would be quite wrong as well.

I rarely use Java, so my docs are well out of date, but I note that there at least used to be a java.security.SecureRandom, which at least claims to be suitable for some security purposes.

But what this item shows is that security code shouldn't be written by non-experts - and that's so well established it can hardly be counted a WTF.

 

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:42 • by danielpitts

Actually, the real WTF is both the "custom" random, and the suggestion to use the non-secure Random class for security purposes.

 

There is a standard class designed for secure random number generation, which is far more secure than MD4ing a bunch of somewhat predictable values. 

http://java.sun.com/j2se/1.4.2/docs/api/java/security/SecureRandom.html

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:47 • by Eli
105447 in reply to 105432

I don't think the author was going for a GUID. Yes, it's based on some values that are related to that particular system, but there's certainly no guarantee that the number is globally unique. You'd get just as good a GUID from plain old Random(). Face it, this is just a very poor implementation of a psuedo random number generator.

My favorite part is the bit where it eats the exception for grabbing system data. So... if something goes wrong, it will just silently hash the system clock? Awesome.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:50 • by sir_flexalot
This is the trouble with java programming books.  They talk all about sorts, arrays, etc. and so people think that you have to use sorts and arrays at all times.  Someone should really come up with a book that is like a reference, and it just has 1000 examples, like, "to do random numbers, do this..." and then the shortest, cleanest possible way to do it.  Maybe there'd be a chance that people would stop coding so much and get something done.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:50 • by A Nonny Mouse
105449 in reply to 105441
Xandax:
Anonymous:

i like these in particular

                            } // end for
                        } // end if hash_bytes
                    } // end if val non null
                } // end if key non null
            } // end while e.hasMoreElements

 so THAT's what }'s do...!

Actually - I do some similar myself as it often helps my overview of the indentation, rather then having to trace an ending scope up to the starting point.

 

For a looooong block of code, sure. But for code you can see all on one page? Like for a 3 line for loop? You must be kidding.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:51 • by Rootbeer
105450 in reply to 105426

"so THAT's what }'s do...!"

You'll notice that '}' is in fact an overloaded operator; sometimes it ends an 'if' block, sometimes it ends a 'for' block, sometimes a 'while' block... and that's just in this one code snippet!

It's entirely appropriate to add comments clarifying their usage.

 

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 12:57 • by UMTopSpinC7
105452 in reply to 105449

Anonymous:
Xandax:
Anonymous:

i like these in particular

                            } // end for
                        } // end if hash_bytes
                    } // end if val non null
                } // end if key non null
            } // end while e.hasMoreElements

 so THAT's what }'s do...!

Actually
- I do some similar myself as it often helps my overview of the
indentation, rather then having to trace an ending scope up to the
starting point.

 

For a looooong block of code, sure. But for code you can see all on one page? Like for a 3 line for loop? You must be kidding.

If you are used to putting comments after }'s then you probably do it out of habit. I would say either do it or don't do it for the sake of consistency.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:02 • by kipthegreat
105453 in reply to 105449
Anonymous:
Xandax:
Anonymous:

i like these in particular

                            } // end for
                        } // end if hash_bytes
                    } // end if val non null
                } // end if key non null
            } // end while e.hasMoreElements

 so THAT's what }'s do...!

Actually - I do some similar myself as it often helps my overview of the indentation, rather then having to trace an ending scope up to the starting point.

 

For a looooong block of code, sure. But for code you can see all on one page? Like for a 3 line for loop? You must be kidding.

Really, those kinds of comments can be quite useful to the maintenance programmer.  Maybe not here, but it's useful sometimes when you'll have logic that looks like this:

          }
        }
      }
      else
      {

Having a comment lets you know which if that else corresponds to.  Of course, there is usually some way to simplify the logic, but that's a different topic.. 

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:04 • by SusieJ
Tell me this was written by first-time co-op students. 'Cause that's what I was when I "invented" my own random number generator.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:11 • by jaspax
Michael Casadevall:


public static byte[] getRandomBits() {

byte[] random = new byte[32];

Random.nextBytes(random);

return random;

}


 


There's a mistake here: nextBytes() isn't a static method, so you should probably have something like:


private static Random random = new Random();

public static getRandomBytes() {
byte[] bytes = new byte[32];
random.nextBytes(bytes);
return bytes;
}


 I didn't know about the SecureRandom class--will remember that one.


Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:14 • by limelight
105458 in reply to 105447

Anonymous:

I don't think the author was going for a GUID. Yes, it's based on some values that are related to that particular system, but there's certainly no guarantee that the number is globally unique. You'd get just as good a GUID from plain old Random(). Face it, this is just a very poor implementation of a psuedo random number generator.

My favorite part is the bit where it eats the exception for grabbing system data. So... if something goes wrong, it will just silently hash the system clock? Awesome.

I never said that this horrible code would actually give you a valid GUID, my suggestion was that perhaps he was trying to generate a GUID. For example, Microsoft's implementation for GUIDs is based on a system identifer and the current timestamp, which sounds an awful lot like what this guy was trying to do.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:14 • by mav
105459 in reply to 105454
Almost makes me wonder if he copied someone's hashing code and gave it some pseudo-random data and called it "random".

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:15 • by sinistral
105460 in reply to 105448

sir_flexalot:
This is the trouble with java programming books.  They talk all about sorts, arrays, etc. and so people think that you have to use sorts and arrays at all times.  Someone should really come up with a book that is like a reference, and it just has 1000 examples, like, "to do random numbers, do this..." and then the shortest, cleanest possible way to do it.  Maybe there'd be a chance that people would stop coding so much and get something done.

 

Make it so.... 

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:15 • by Sunday Ironfoot
I suppose this way is more "randommer" than the other way.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:17 • by sf

Michael Casadevall:

<snip attempts at
randomness by iterating a fixed number of times of single values anded
and shifted fixed lengths...> 

Thread.yield();

<snip more same the same...> 


At least he's conciencous to his fellow threads while burning all those cycles.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:21 • by sf
105464 in reply to 105462
Anonymous:

Michael Casadevall:

<snip attempts at
randomness by iterating a fixed number of times of single values anded
and shifted fixed lengths...> 

Thread.yield();

<snip more same the same...> 


At least he's conciencous to his fellow threads while burning all those cycles.

Make that
conscientious.  Typical developer spelling skills ;-O

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:32 • by merreborn
105467 in reply to 105462
Anonymous:

Michael Casadevall:

<snip attempts at
randomness by iterating a fixed number of times of single values anded
and shifted fixed lengths...> 

Thread.yield();

<snip more same the same...> 


At least he's conciencous to his fellow threads while burning all those cycles.

On the off chance anyone isn't aware, this is more or less how java's SecureRandom is implemented -- it fires up a bunch of threads, and uses data on how the OS allocates time to them as a source of entropy. 

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:33 • by Alessandro
105468 in reply to 105464

I realize this is a blog and not "The New Yorker", but talking about spelling, I would suggest the post writer would use some sort of automated spell-checker the next time.  There were enough mistakes to make the post hard to understand.

 

Having said that, it seems to me that the function in question produces the randommest random that could be randommed.  And, if the author was paid by code lines, he was smarter than we think.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:35 • by Pingmaster
105469 in reply to 105453
kipthegreat:
Anonymous:
Xandax:
Anonymous:

i like these in particular

                            } // end for
                        } // end if hash_bytes
                    } // end if val non null
                } // end if key non null
            } // end while e.hasMoreElements

 so THAT's what }'s do...!

Several IDEs do this for you automatically..when you open a method, loop etc..., it automatically creates a close brace with the appropriate closing comment.

Actually - I do some similar myself as it often helps my overview of the indentation, rather then having to trace an ending scope up to the starting point.

 

For a looooong block of code, sure. But for code you can see all on one page? Like for a 3 line for loop? You must be kidding.

Really, those kinds of comments can be quite useful to the maintenance programmer.  Maybe not here, but it's useful sometimes when you'll have logic that looks like this:

          }
        }
      }
      else
      {

Having a comment lets you know which if that else corresponds to.  Of course, there is usually some way to simplify the logic, but that's a different topic.. 

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:35 • by Rick
105470 in reply to 105441
Xandax:
Anonymous:

i like these in particular

                            } // end for
                        } // end if hash_bytes
                    } // end if val non null
                } // end if key non null
            } // end while e.hasMoreElements

 so THAT's what }'s do...!



Actually - I do some similar myself as it often helps my overview of the indentation, rather then having to trace an ending scope up to the starting point.

 

I used to add these comments before the existence of modern* editors and IDEs that easily show the matching brace.

*Less than 10 years old

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:40 • by Gus
105471 in reply to 105460
or... http://java.sun.com/developer/Books/effectivejava/

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:42 • by Whiskey Tango Foxtrot? Over.
105472 in reply to 105426
Anonymous:

i like these in particular

                            } // end for
                        } // end if hash_bytes
                    } // end if val non null
                } // end if key non null
            } // end while e.hasMoreElements

 so THAT's what }'s do...!

Not to start a flame war or anything..... :>..... but explaining which block the } ends is important if you do that lame-assed start-a-block-on-the-same-line-that-you-declare-it thing.

You know....

if(foo) {
bar();
}

OHWOW

2006-12-06 13:42 • by Pool's Closed
The real wtf here is that I have aids AMIRITE PPL???!

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:45 • by Jeff

Aaugh! Please tell me that none of you laughing at this WTF will ever write cryptography code (excepting those few who pointed out that the built-in Random is bad too.)

This is the only way to produce a reasonably secure random number in software. Java.security.SecureRandom might be better, but guess how it works? By hashing together a bunch of system values, along with the time, a counter, recent mouse input, etc. And if the author of the snippet had some experience, he'd know to never trust the random functions that come with your library for crypto purposes, because they're usually crap. (The best thing to do would be to use java.security.SecureRandom, *and* all the stuff he's doing here, and hash those together.)

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:48 • by Patrick
105476 in reply to 105444
The documentation is qutie clear in the Javadocs how Random generates a number.  If  Random isn't appropriate, java also provides a few classes to randomly generate cryptographicaly secure keys.  Either way, that Christmas Tree of code is quite the WTF?  At least break it apart so it's readable.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:48 • by Carnildo
105477 in reply to 105468
Anonymous:

I realize this is a blog and not "The New Yorker", but talking about spelling, I would suggest the post writer would use some sort of automated spell-checker the next time.  There were enough mistakes to make the post hard to understand.


I don't know about anyone else, but I've got a spell-chicker.  It's even intigrated into my web browser.  The WTF is that teh TDWTF super-duper rich-text-with-bells-and-whistles post editer, however, keep sme from usnig it.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:50 • by biziclop
105479 in reply to 105444
MichaelWojcik:
Michael Casadevall:

The function, getRandomBits() returns a 32-byte array of random bites for security purposes. Since Java provides a Random method, this should be easy...

If this is in fact "for security purposes", then using Java's Random method would be as equally WTFy (and the five-line implementation is no more "correct" than the long one).

There is no "correct" way to generate pseudorandom data.  That's a domain-dependent function; the PRNG has to meet the particular requirements of the task.  In this case, of course, we have no information on those requirements other than "for security purposes", but if that's at all accurate we have some reason to believe that Java's Random would be quite wrong as well.

I rarely use Java, so my docs are well out of date, but I note that there at least used to be a java.security.SecureRandom, which at least claims to be suitable for some security purposes.

But what this item shows is that security code shouldn't be written by non-experts - and that's so well established it can hardly be counted a WTF.

 

I bet there was no requirement for the method to give identical numbers if called twice within a millisecond. 

You'rre right about the SecureRandom part though, but using SecureRandom is  just as simple as using Random. SecureRandom not just claims to be suitable for security purposes, you can choose from a number of standard algorithms (sure, there is no perfect one, but at least the built-in providers are definitely compliant with the relevant standards) and I think there should be native SecureRandom providers that use specialized random generator hardware.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:51 • by jrockway
105480 in reply to 105441
> Actually - I do some similar myself as it often helps my overview of the indentation, rather then having to trace an ending
> scope up to the starting point.

% or M-x show-matching-paren

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 13:58 • by Carnildo
105485 in reply to 105474
Anonymous:

Aaugh! Please tell me that none of you laughing at this WTF will ever write cryptography code (excepting those few who pointed out that the built-in Random is bad too.)

This is the only way to produce a reasonably secure random number in software. Java.security.SecureRandom might be better, but guess how it works? By hashing together a bunch of system values, along with the time, a counter, recent mouse input, etc. And if the author of the snippet had some experience, he'd know to never trust the random functions that come with your library for crypto purposes, because they're usually crap. (The best thing to do would be to use java.security.SecureRandom, *and* all the stuff he's doing here, and hash those together.)


No, if you want a reasonably secure random number, you use a hardware random number generator.  Something like an A-D converter connected to a radio tuned to static, or a geiger counter listening to background radiation.  Some computers have internal hardware RNGs that work off the thermal noise in a semiconductor junction.

Failing that, you use something like Linux's /dev/random, which produces a hash of recent random hardware events, like hard drive access timings, or mouse movement, or keyboard input timings.

You never use predictable values in your secure random number generator.  System properties are right out, as is absolute time.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 14:02 • by Random()
105487 in reply to 105479
Maybe he was using the code itself as an input to another hashing algorithm?

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 14:05 • by biziclop
Btw, isn't anyone annoyed by the magic numbers in this code? Being a maintainer, reading "(nbytes + 7)/8 " or "for( int i = 512/8;..." drives me crazy.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 14:12 • by mathew
105493 in reply to 105470

I used to add these comments before the existence of modern* editors and IDEs that easily show the matching brace.

*Less than 10 years old

10 years? More like 30. Regular vi had code block navigation in 1976.


mathew 

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 14:17 • by eq
105494 in reply to 105485

 
To reiterate what several posters have said because it's something that is poorly undestood - Random is a "psuedo random number generator". If you draw enough values the moments will converge to that of a uniform distribution, but they are highly predictable. The most basic implementation (linear congruential generator) is x(n) = a x(n-1) + p Mod M where x(n-1) is the last value in the sequence and x(n) is the next. a, p and M are constant parameters which have to be carefully selected. So if you know x(n-1) and the parameters - x(n) is known with 100% certainty! Random should only be used for Monte-Carlo simulation - not for Cryptography!

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 14:19 • by sf
105495 in reply to 105474
Anonymous:

Aaugh! Please tell me that none of you laughing at this WTF will ever write cryptography code (excepting those few who pointed out that the built-in Random is bad too.)

This is
the only way to produce a reasonably secure random number in software.
Java.security.SecureRandom might be better, but guess how it works? By
hashing together a bunch of system values, along with the time, a
counter, recent mouse input, etc. And if the author of the snippet had
some experience, he'd know to never trust the random functions that
come with your library for crypto purposes, because they're usually
crap. (The best thing to do would be to use java.security.SecureRandom,
*and* all the stuff he's doing here, and hash those together.)

 
But some of the key points you are making is exactly what he is NOT
doing, namely a counter (seed) and recent mouse input.  His
elaborate hashing of the System properties is pointless because they
typically never change during the life of the VM's execution. 
Even his labor intensive hashing of the one randomish value he is
mixing in, the system time, is pointless since he is looping a consant
number of times, always shifting a constant amount, and always anding
consant value, with no other seed or anything involved.

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 14:34 • by Eli
105502 in reply to 105468
Anonymous:

I realize this is a blog and not "The New Yorker", but talking about spelling, I would suggest the post writer would use some sort of automated spell-checker the next time.  There were enough mistakes to make the post hard to understand.

If you're going flame someone over his or her spelling, you could at least take the time to check your grammar. Perhaps there's some sort of automated grammar checker you can use?

That sentence is a comma splice, "spell-checker" should not be hyphenated, and in American English the comma goes inside that quotation marks.

See what happens when you go down this road?

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 14:35 • by seymore15074
105503 in reply to 105472
Whiskey Tango Foxtrot? Over.:
Anonymous:

i like these in particular

                            } // end for
                        } // end if hash_bytes
                    } // end if val non null
                } // end if key non null
            } // end while e.hasMoreElements

 so THAT's what }'s do...!

Not to start a flame war or anything..... :>..... but explaining which block the } ends is important if you do that lame-assed start-a-block-on-the-same-line-that-you-declare-it thing.

You know....

if(foo) {
bar();
}

You must have forgot the WITHOUT INDENTATION part...

Re: [CodeSOD] Random Ways To Get To Random()

2006-12-06 14:37 • by sf
105507 in reply to 105479
biziclop:
MichaelWojcik:
Michael Casadevall:


The function, getRandomBits() returns a 32-byte array of random bites
for security purposes. Since Java provides a Random method, this should
be easy...

If this is in fact "for security
purposes", then using Java's Random method would be as equally WTFy
(and the five-line implementation is no more "correct" than the long
one).

There is no "correct" way to generate pseudorandom
data.  That's a domain-dependent function; the PRNG has to meet
the particular requirements of the task.  In this case, of course,
we have no information on those requirements other than "for security
purposes", but if that's at all accurate we have some reason to believe
that Java's Random would be quite wrong as well.

I rarely use
Java, so my docs are well out of date, but I note that there at least
used to be a java.security.SecureRandom, which at least claims to be suitable for some security purposes.

But
what this item shows is that security code shouldn't be written by
non-experts - and that's so well established it can hardly be counted a
WTF.

 

I bet there was no requirement for the method to give identical numbers if called twice within a millisecond. 

You'rre
right about the SecureRandom part though, but using SecureRandom
is  just as simple as using Random. SecureRandom not just claims
to be suitable for security purposes, you can choose from a number of
standard algorithms (sure, there is no perfect one, but at least the
built-in providers are definitely compliant with the relevant
standards) and I think there should be native SecureRandom providers
that use specialized random generator hardware.

SecureRandom
is just a wrapper and delegates most of its work to an underlying
"service provider" random generator.  So if you don't like what
the generators that Sun ships you can write your own and just plug it
in.

 You may not want to ask this guy though.

« PrevPage 1 | Page 2 | Page 3 | Page 4Next »

Add Comment