LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   General (https://www.linuxquestions.org/questions/general-10/)
-   -   So, why not Java? (https://www.linuxquestions.org/questions/general-10/so-why-not-java-375763/)

Mega Man X 10-22-2005 10:12 AM

So, why not Java?
 
This is not only a question, but also a general wondering. Maybe I'm just being paranoid here, but I don't see Java and Open Source going so hand-in-hand together and I wonder, why not Java?.

I can see peoples typing fast now telling me two reasons:

1 - It's a proprietary language;
2 - It's slow;

While the statement number 1 is totally correct, saying that it's either a negative or a positve thing is very difficult to tell without using your personal point of view.

The second statement, "java is slow", is not much an issue today, in my honest opinion. Since 1.4 SDK, speed in java have got way faster. I found 1.5 to be absolutely fantastic, not only by the speed improvements, but also the syntax itself got nicer and has many new features on the API itself. You can google for Java and C++ comparisons and you will see it's not as bad as one may think, depending of the test, indeed.

You may even say that Java does not perform well in older hardware, but I fail to see that as an issue also. And for the record, not every application out there is created with older machines or speed in mind. Look at KDE... for example...

As many of you know, I love games, not only on the "playing" level, but also the "programming level", and there're not many games written in Java which are not silly applet card games. I would like to point this site for some great 3D Java games:

http://www.brackeen.com/home/scared/index.html

Please, try both Scare and Race3d. I've found a very interesting 3D FPS written using Java technology. I've downloaded and installed the demo and loved it. Kicks the heck out of many known games out there. The only problem that I've noticed is that the maps takes a bit too long to load. It could be because it's just a demo though, since the in-game performance is great.

Unfortunately, it's not possible to buy this game everywhere... or else I would have added into my cart :)

http://www.java.com/en/games/desktop/specforce.jsp

Worthy trying. I guess the demo is a Windows only installer. There're also some great ports of Quake 2 coded in Java flying the net. Worthy google for them too :).

http://www.java.com/en/games/desktop/specforce.jsp

The advantages of using java in game programming are many. Off the top of my head, you get: Great API, well documented language, simple multi-thread, real OOP-oriented, auto-garbage collection, lots and lots of free tools and IDE's and don't forget portability.

And it's not that you can't use java with other API's, like OpenGL:

https://jogl.dev.java.net/

and if you really need optimizations, you can use HotSpot VM, since you can run parts of your game and application in native code during runtime. It's also possible to compile Java to machine code, with compilers as gcc (gcj), but that loses also the portability part. Some parts of Java are also native for every system. If you check the API hierarchy, you will find many "native" classes.

I would like to make clear that I'm no java programmer(yet). I'm taking a Java class and reading two books right now: Developing games with Java and Introduction to Java: Comprehensive Version, to fresh my memory since I read Java at school before, but years ago :)

To me, it looks like the only ones taking Java seriously today is IBM and other companies interested on the micro edition, as Nokia. Few applications out there are worthy mentioning. I like LimeWire, jedit and DrJava, but that's pretty much it. A lot of day-to-day tools could be written with it, as ftp-clients, instant messengers, IRC-clients, games, front-ends for a bunch of programs and the list goes on...

So, programmers out there: Why not Java? Or am I wrong and Java actually is more used then it looks like? If so is the case, please tell me, I'd love to hear it :)

jailbait 10-22-2005 10:55 AM

"The second statement, "java is slow", is not much an issue today, in my honest opinion. Since 1.4 SDK, speed in java have got way faster. I found 1.5 to be absolutely fantastic, not only by the speed improvements, but also the syntax itself got nicer and has many new features on the API itself. You can google for Java and C++ comparisons and you will see it's not as bad as one may think, depending of the test, indeed."

Java is an interpretive compiler. Interpretive compilers are inherently slow because the source has to be compiled on every execution. A binary program will always run faster than the same source running on an interpretive compiler.

---------------------------
Steve Stites

Mega Man X 10-22-2005 11:18 AM

Thanks jailbait for your input. However, I'm not trying to prove that Java is faster then C++ by any means (there're already a lot of java-natics out there trying to prove that, gheheh), but in some cases, it could be. Like, depending of the way you program an application (let's say a graphical one), the API you choose has more impact on the performance then the language, or even the compiler for that matter. I found QT applications to be slower then their equivalents in gtk, for example.

The way I see it, the reason why Java is not (apparently) well received by the Open Source community lies somewhere else besides Java "slowness". As I said, a hell lot of open source projects out there don't have low-end systems in mind, as KDE and QT-based applications...

mrcheeks 10-22-2005 12:20 PM

Java is my primary programming language for web applications or desktop applications even if I know how to code c++, vb, and .Net(C# and VB.net).

Java is a lot used in companies for web applications or desktop applications using java web start.

A this time i am trying to finish a java based xml editor http://xpontus.sourceforge.net/

Mega Man X 10-22-2005 12:24 PM

Nice editor mrcheeks. I hope you get it done. Count on me if you need somebody to test it :).

Out of curiosity, are you using an IDE? At school we used Bluej, but I not really liked. I like DrJava, but I had problems when running Swing applications (like, if I use an image on a button when working with Swing, the image won't be displayed) from inside the IDE. Netbeans is a bit too heavy for what I'm trying to do. So far, Eclipse is my IDE of choice.

tuxdev 10-22-2005 12:59 PM

Java has way too much stuff to protect you from your own stupidity. Garbage Collection and Strong Types are examples of this. Other bad things are that all methods are virtual, which means it has to look it up in the virtual function table, a slow operation. Java has no header files, which are so useful as mostly self-documention. Also, I hate the try-catch Exception system, it is so ugly and inefficient. Eclipse is the best IDE to use, but most of the tim I just use vim+javac for all my needs.

titanium_geek 10-22-2005 01:03 PM

Why I like and use Java:

1) I'm a web freak. I asked my dad for "something on programming" for christmas- he got me a HTML book. Java is just a progression, in my mind.

2) it was the language of the CompSci AP.

3) In my house, we have windows 98, 2000, MacOSX and linux running. run anywhere is cool.

the way I work while coding is this:
(on any platform, but mac currently)
drjava is my editor. really like it. use that to write and compile code. then java whatever in the cli.

titanium_geek

mrcheeks 10-22-2005 01:05 PM

Thank you. I fixing few bugs and working features for the editor.
I am using netbeans now with the apache maven plugin(mevenide). I started with a text editor to optimize the code+apache ant(compile, create jar, deploy).
I then moved to eclipse 2.X to 3.X but it started to freeze too often on my pc. When netbeans 4.0 was out i tried it and found it more responsive on linux/bsd. than eclipse.

Displaying icons in buttons is easy when you use the getClass().getResource(String image) syntax.
Assuming that the image icon.gif is located in the directory classes/mypackage/images/icon.gif, you would do:
Code:

java.net.URL url = getClass().getResource("mypackage/images/icon.gif");
javax.swing.ImageIcon icon = new javax.swing.ImageIcon(url);
javax.swing.JButton button = new javax.swing.JButton(icon);


Four 10-24-2005 08:51 PM

Java is good but here is what I don't like about it:
1. Its all classes, you can't have a function thats not in a class.
2. The names of files must respect its name in the file.

When I was writing this I thought I would have more reasons, but If java was changed like that I would use it more often :)

Other than that I like java, I can't really say much because I didn't do much programming in java.

One feature to really speed java up (But slows its startup greatly) take the compiled java code and further compile for the current machine. If that can happen it would be great, but I don't think thats even possible to do.

Mega Man X 11-10-2005 02:26 PM

Quote:

Originally posted by Four
Java is good but here is what I don't like about it:
1. Its all classes, you can't have a function thats not in a class.
2. The names of files must respect its name in the file.

When I was writing this I thought I would have more reasons, but If java was changed like that I would use it more often :)

Other than that I like java, I can't really say much because I didn't do much programming in java.

One feature to really speed java up (But slows its startup greatly) take the compiled java code and further compile for the current machine. If that can happen it would be great, but I don't think thats even possible to do.

It uses classes for everything to keep as organized (from a OOP perspective) as possible. The code is so much clear that way. Simple inheritance and the use of interfaces and abstract classes makes the code not only easier to learn, but also to update. And you still can code in a procedural form, but that is against the language purposes...

tuxdev 11-10-2005 03:39 PM

I do think I like gcj a lot cause having to run everything thru the VM is really annoying to me.

What I hate the most though is that a lot of the Exceptions are not really exceptional. If they just passed back null when it can't do something, then this code to figure out whether a function with a specified name is part of java.math package would be a lot simpler (only working with doubles here, fortunately).
Code:

public static boolean isMethod(String name)
{
  try
  {
      // check if it is a unary method
      Class[] sig={double.class};
      Math.class.getMethod(name,sig);
      return true ;
  }
  catch(Exception e1)
  {
      try
      {
        // not a one parameter method
        // check if it is a binary method
        Class[] sig={double.class,double.class};
        Math.class.getMethod(name,sig);
        return true ;
      }
      catch (Exception e2)
      {
        // not a method
        return false ;
      }
  }
}

Passing back null on getMethod...
Code:

public static boolean isMethod(String name)
{
  // check if it is a unary method
  Class[] sig={double.class};
  if(Math.class.getMethod(name,sig)!=null)return true;
  // not a one parameter method
  // check if it is a binary method
  sig={double.class,double.class};
  return Math.class.getMethod(name,sig)!=null;
}

Of course, if they just included something like this in the API already, it wouldn't be necessary.

However, one of the nice things about java's GC is that to empty any collection, just set all the member vars back to null.

primo 11-10-2005 06:03 PM

On Java's binary portability: Sun designed it so Java programs would be run in many systems. It's a issue when the source isn't available, but it's gonna be slow... But with open source, why Java? Java is better suited for the web for this binary portability. The same API and language's goodies may be used currently through gcj, but speed is still an important issue! And as long as it is important, there will be further design into alternative ways. Java considerably slows the system. How many Java programs may be run in parallel? There's still no definite port of Java in the BSD world. See http://www.freebsd.org/java/

aldimeneira 11-12-2005 02:30 PM

I think too that Java is more suited for web tasks in the form of AJAX.

Haystack 11-14-2005 01:15 AM

hmm.. java... I'm pretty new to Java. I decided in august this year to learn Java at university college because it's so widely used... But i don't see the pro's yet.
Java claims to be Platform-independent, which i think is not true... What's so independent about a language that depends on the Java-platform. The java-platform is huge.
And then that scary Swing-thing. I think it's very arrogant when a programmer uses another Look-and-feel as the OS does. When I use a program I want the buttons and stuff look the same as the rest of my system. Programmers should realize (OK i'm getting a bit extreme now) that grandma's are getting confused when a program acts like they expect.

And yes.. it's slow...

Mega Man X 11-14-2005 03:59 AM

Quote:

Originally posted by Haystack
hmm.. java... I'm pretty new to Java. I decided in august this year to learn Java at university college because it's so widely used... But i don't see the pro's yet.
Java claims to be Platform-independent, which i think is not true... What's so independent about a language that depends on the Java-platform. The java-platform is huge.
And then that scary Swing-thing. I think it's very arrogant when a programmer uses another Look-and-feel as the OS does. When I use a program I want the buttons and stuff look the same as the rest of my system. Programmers should realize (OK i'm getting a bit extreme now) that grandma's are getting confused when a program acts like they expect.

And yes.. it's slow...

You can change Java's Look and Feel. Currently, Java supports 3 different look and feel:

- Metal
- Motif
- Windows

Windows style is just available in Windows, for obvious copyright reasons. Motif is pretty much the way things looks in Unix and Metal is the "default" Java look. Don't tell me that running a gtk application in KDE makes that application to look like a QT application, or vice-versa.

I could agree with you that Java sometimes is not so platform independent. But not in the way you put it. For example, I'm trying to run a little game I'm creating in full screen mode. For the ones interested, here is an early screenshot:

http://goto.glocalnet.net/torch/temp/x-wing.jpg

Works fine in Windows, but not quite in Linux or Solaris (I'm working on it though). The idea of having a the Runtime environment does, makes Java platform independent. That's exactly how everything works out there. How do you think Gimp can run on Windows or Mac? Because you've to install the GTK-libraries. It's the exactly same thing: It has to depend on something else in order to run :).

Mega Man X 11-14-2005 04:09 AM

If possible, I would like peoples to explain why, where and how exactly Java is slow. I kinda got the feeling that, because Java was slow and buggy back in 1996, it's still believed to be that way. Benchmarks out there proves that Java speed is not far from C++, even in games (anyone tried SpecForce or Quake 2 Java ports?).

Another thing is, Java start-up programs can be a bit slower, because the VM has to start first, then the application in question. After that, the speed is the same as all other applications I run for most tasks.

I think Java, unfortunately fell in the same category of popular believe as Linux: "Linux is hard to install, Linux is for hackers, Linux is for computer scientists, Linux is for programmers...", which is no longer true, especially with distros as Mandrake or SuSE, but still believed to be that way.

Again, Java is assumed and believed to be _much_ slower then C++, but never proved with examples. Peoples just stop by and say "it's slow", just like "Linux is difficult". More concrete examples and benchmarks are welcome ;)

tuxdev 11-14-2005 11:39 AM

I've been looking into the java's speed and I think that java may be almost as fast as c++ after startup, but the overhead of a VM bothers me a lot. Now if it doesn't really use a VM, I'd be way happier to accept that it has pretty much the same speed. I'm not willing to accept that java is the same speed or faster cause java is farther away from machine language than C/C++. Also, all of the helper stuff like the GC must be using resources not used if you do what they do automatically yourself.

mr_demilord 11-14-2005 12:01 PM

I never use Java and don't have it installed, it takes ages to load and is a big resource hog.
Look at openoffice which uses java, it takes ages to load. :mad:
azureus for example sucks away to much memory so my system starts to swap. :mad:
Web sites that uses Java takes ages to load and scrolling a page which uses java is horrible. :mad:
Java is a :no: :no:

tuxdev 11-14-2005 12:41 PM

azureus to me is a good example of nice java-based software. openoffice may be somewhat slow by default, but there are lots of settings to improve that. It is definitely way more efficient than MS Office. And you do have a powerful enough computer to handle those apps, right? You can't expect 500Mhz computer to do such resource intensive stuff regardless of what languange it is written in. Applets are a whole other thing almost entirely. And how can you run anything that uses java without java installed?

Mega Man X 12-06-2005 10:26 AM

Quote:

Also, all of the helper stuff like the GC must be using resources not used if you do what they do automatically yourself.
True, to a certain point. While it's not possible to get rid of the Garbage collector completely, you can do a lot of optimizations on it. You could always start your application with:

java -verbose:gc MyClass

To get information when a GC occours. It's also possible to increase the heap when starting an application and also possible to control when the gc will do one "collect" (say, every 10s). With all sincerity, it easier to make wrong things with C++ and have loads of mem leaks everywhere.

Quote:

And how can you run anything that uses java without java installed?
You can if you compile it to machine code. But doing that will lose all the portability Java offers. But Java is no different then other applications. Think about Gaim or Gimp for example: In order to run it, you need the gtk runtime libraries installed. Like kedit? Then you need qt libraries installed. Java just happens to have an API with it for graphical applications. In practice, it's the same thing, IMHO. With exception, of course, that Java is easier to program, debug and maintain and harder to make mistakes with it ;) (It's also portable, but that has already been said)

tuxdev 12-06-2005 12:33 PM

Graphical toolkits are beyond the scope of the core languange IMO. I am also pretty sure that Sun's java will not let you compile completely to machine code. C/C++ is also portable too, in the sense that properly designed code will compile and run the same on all platforms with C/C++. I have personally found that Java is no easier to debug. It is harder to make mistakes, but it does that by assuming you are an idiot. This makes it harder to program in for me. It forces me to do things the "Java way".

Having the garbage collector try to collect every ten seconds is a waste of processor and having it wait a while to collect is a waste of memory. Using "free" as early as possible is neither.

Mega Man X 12-06-2005 02:59 PM

Quote:

Originally Posted by tuxdev
Graphical toolkits are beyond the scope of the core languange IMO.

I agree with you in this one. However, I believe Java did that so you could write complete applications on multi-platforms, regardless if it is command line or not. If they let the graphical toolkit out, then peoples would be using something else and that could bring the portability down. Some Graphical Toolkits uses a hard-coded pixel value to place components in a frame. That could look good in one Operating System, but not on another. Java has optimized as much as possible for it to look the same on every platform. It still is possible to use a hard-coded pixel to place components in Java.

Quote:

I am also pretty sure that Sun's java will not let you compile completely to machine code.
You can:

http://gcc.gnu.org/java/

Everything is supported, except for AWT, but they are working on it. gcj can not only compile java to machine code, but also, if needed, generate the java byte-code (.class) or convert a byte code into machine language.

Quote:

C/C++ is also portable too, in the sense that properly designed code will compile and run the same on all platforms with C/C++.
Almost true. cout and cin are the same everywhere. By that, I mean the C++ the "language" is the same on every platform. However, C++ relies a lot on the compiler itself in order to work. Creating a 100% portable C++ code would include hard-to-accomplish things as not using static constructors, exceptions... even overloaded methods can be tricky. Heck, you can't even trust iostream. Inlines may or not compile as well, dependending of the compiler:

Code:

  class MyClass {

    int myMethod(char* c) {
      if (c[0] == '\0')
        return -1;

      anotherMethod();
      return 0;
    }

  };

Expect the above to not compile with all compilers around, because of the inline code with multiples return value.

Quote:

I have personally found that Java is no easier to debug. It is harder to make mistakes, but it does that by assuming you are an idiot. This makes it harder to program in for me. It forces me to do things the "Java way".
I would like if you could give some examples here. The only thing that Java has that forces you to do are Exceptions. Java has classes that are signed and unsigned, meaning that some calls MUST be put inside a try-catch block, but that's it.

Quote:

Having the garbage collector try to collect every ten seconds is a waste of processor and having it wait a while to collect is a waste of memory. Using "free" as early as possible is neither.
Not really. Think about a game (sorry, but all I can code are games, so...ghehe), for example. The garbage collector can slow down your frames per second in a game when it should not. You can always force the garbage collector manually by doing a System.gc();. Let's say, you are going to load a new level or a cutscene. In this case, you can make a call to the GC right before that happens. In game, it's good to know when to make a manual call to GB on every screen refresh or in a given amount of time (like 10-13s).

The way I see the whole picture about Java today, is the way C programmers saw C++ (and some still do) when it came out. They have problems to accept it, which is understantable. I do, find Java to be a better C++ and it will grow much larger in the future and become an standard as C++ is today for everything. If it's not Java, something else similar to Java will take C++ in a way or another. C++ is too old and inhiretence from an even older language(C) and the programmer has to deal with things as pointers and mem management that he/she shouldn't. An average Java programmer is most likely to get a good Java application working great ratter then an average C++ programmer, IMHO.

tuxdev 12-06-2005 04:53 PM

Man, it deleted my comment TWICE.

I know about GNU java, I was talking about Sun's java. GNU java can compile down cause it is written in C and Sun's java is written in java, so they suffer from the restrictions they put on themselves.

Compiler based problems are do not have anything to do with the languange itself. Ideal compilers on different platforms should act the same.

There are only references, no pointers or objects. Great power comes from pointers. There is no way to access the system without using some tool in java. If java doesn't support accessing a device, you are out of luck.

A GC call is much more expensive than free. Therefore, it uses up memory for storing info on the references and the call uses more processor to do what should be the same work. Also, the memory is freed later, so something that creates and destroys often needs more memory cause something is not freed when it is supposed to so something that is created cannot use that memory.

Java tries to protect the programmer from himself by making everything he does happen in a VM in java's control. Works, but sucks all the power from the languange.

Mega Man X 12-08-2005 12:11 PM

Hi again tuxdev. It has been a while since I had so good chat about Java :)

Quote:

There are only references, no pointers or objects. Great power comes from pointers. There is no way to access the system without using some tool in java. If java doesn't support accessing a device, you are out of luck.
I think you did a typo. Java has objects. In fact, as far as I understand, everything in Java is s subclass of the class Object :)

Quote:

A GC call is much more expensive than free. Therefore, it uses up memory for storing info on the references and the call uses more processor to do what should be the same work. Also, the memory is freed later, so something that creates and destroys often needs more memory cause something is not freed when it is supposed to so something that is created cannot use that memory.
No info is actually stored in the Garbage Collector. The garbage collector simply pick up things that are no longer referenced to. You could, for example, set an Object no longer in use to null and then make a call to the GB and free that memory:

Code:

public class MyGame {

    public static void main(String[] args) {
   
    Game game1 = new Game(1);
    Game game2 = new Game(2);
    Game game2 = new Game(3);

    // dispose two games
    game2 = game3 = null;
    System.gc(); // call the garbage collector to pick up
    }
}

class Game extends Object {
    int id;

    public Game(int id) {
        this.id = id;
        System.out.println("Game Object " + id + " was created");
    }

    public void finalize() trows java.lang.Throwable {
        System.out.println("Game Object " + id + " was destroyed");
    }
}

Again, nothing is stored in the GC. So, to be more specific, when a method is invoked, parameters and local variables are stored in a place of memory known as Stack. Elements in the Stack are allocated and freed in a last in first out fashion way. Somethings, as arrays, however, are stored in a Dynamic memory location, know as "Heap". Memory in the heap are allocated and freed arbitrarily (is this a word?, ghehe)

As you see, it's possible to make a call to the GB to free objects no longer in use and that memory allocation will be available. It's all a matter of good programming style, I guess.

Quote:

Java tries to protect the programmer from himself by making everything he does happen in a VM in java's control. Works, but sucks all the power from the languange.
I do, realize that pointers and accessing lowers levels are necessary sometimes. It's practically impossible to write a kernel or even device drivers using Sun's Java, but it was never supposed to do that either :). I just think that Java is not so used as much as it could :\

Mega Man X 12-08-2005 06:56 PM

You know one thing about Java I actually started to dislike? The portability. So far, I have only had one problem with Java across platforms: I can't run my game in fullscreen mode in Unix. It's not a true fullscreen, however, it's more like a "cheat" to make a JFrame to display in fullscreen. Still, it's not this kind of portability I'm talking about, but where Java runs.

We need to wait for Sun to get interested in a given Operating System so we can develop applications for it. For example, I have Debian installed in a Sparc Ultra. Needless to say, there's no Official Java support for Linux in Ultra Sparc machines (how strange, ghehe). Things don't look very nice to BSD either.

What I mean is, if tomorrow I feel like writing a cool hacked game to Xbox 360, that's never gonna happen :\

Funny that the portability of Java goes actually as far as 3 or 4 Operating Systems :). Still, I love the syntax and the rock solid API. Maybe someday, there will be a good replacement for JVM which is open source and truly portable.

tuxdev 12-08-2005 07:02 PM

I didn't make a typo. Java has no directly usable objects. Think about the differences between
Code:

std::string str; // object
std::string &str; // reference
std::string *str; // pointer

How can the garbage collector know when something no longer has a reference to it? It must store a ghost reference to those Objects and check all of those ghost references when it does a collects.

As for internal memory management, I learned that primitives and primitive arrays were sometimes stored in a reserved portion of memory for 8, 16, 32, or 64 bit values. Since all objects are dynamically allocated with new, parameters are already allocated on the heap. References are the only things that I see that get allocated on the stack if primitives are allocated specially.
Code:

int n; // allocated special or on stack
int *n; // allocated on the stack
n=new int; // allocated on the heap
std::string str1; // allocated on the stack, new object created
std::string &str2; // allocated on the stack, nothing created
str2=str1; // nothing allocated
str2=std::string; // allocated on the stack, legal?
std::string *str3; // allocated on the stack, nothing created
str3=new std::string; // allocated on the heap


tuxdev 12-08-2005 07:11 PM

Yeah, the two big advantages to java is it is portable almost to a fault and it has a rich , centralized API. C++ has just as rich of an API, but it is less accessable.

Mega Man X 12-08-2005 07:23 PM

Great posts tuxdev. Thanks. You are actually making me understand things a little better about Java. Reminds me of my first girlfriend. She was just what I have ever dreamed about. Perfect... for a month. After that I truly started seeing and wondering: WTF am I doing :D.

Nah, not that bad. But I really think a replacement for the VM would be a great step forward. Look at python, for example: Runs in a hell lot of platforms, pretty stable, pretty fast and gives you even real pointers. Why did I stop using pygame again? :\

tuxdev 12-08-2005 07:40 PM

ghehe, I should think about python. Unfortunately it would be after Lisp and Perl, which I only had a light enough coating of to see the light. Yeah, if java just got rid of the idea of a VM entirely, it might actually do better psychologically than it does. Sort of like the reason why Wine might be faster than real Windows is cause Linux more than compensates for any speed decrease in using a execution layer. It is never argued that the Wine is faster by itself, without the gains Linux adds.

I guess the main thing about my posts is that I am thinking about the stuff for pretty much the first time. Goes nicely with the fact that I finished my finals for the quarter.


All times are GMT -5. The time now is 02:47 AM.