Showing posts with label work. Show all posts
Showing posts with label work. Show all posts

2007-10-14

Friendly Competition

It's been a little over a year since I started working at the new company.

I'm feeling more comfortable with my coworkers. Mr. Kratzer and I figured it was time for some friendly competition.



Bring it on Highspire First Church of God. Bring it on.

In related news, one of my religious coworkers tried argue that because atheists are morally bankrupt, it would OK steal candy from our box. Yawn.

Just two days after the competition began, our opponent resigned and removed their candy box.

2007-03-04

Hudson

Hudson

Back in days of yore (circa 2002, I think), Mr. Gettle and I created a Development Portal. It was our home-grown continuous integration server. We wrote it because we needed a common place to create binary distribution of our software.

We just started using Hudson at Versatile. I'm really impressed. It's a snap to install and I had it building our project in no time.

Here are the features I like:

Painless Install
- Just drop the hudson.war file in a servlet container, go to the Admin Page and start configuring your projects.

Great UI - Intuitive design, inline help, pretty graphs, AJAX stuff. Sold!

Email Notifications - Hudson notifies the developers of broken builds and when a build is fixed. It also sends special emails to the suspected build-breakers. The suspects are simply the developers who have committed code since the last successful build.

Multiple Projects - Hudson manages as many projects as you want. You can even set up project dependencies. With this, projects that depend on a core project are automatically rebuilt if the core project is successfully built.

Multi-Threaded Builds - You can specify how many build processes can be run concurrently, allowing you to throttle how hard the build server is pushed.

Distributed Builds
- What an amazing feature. If you have a weak or overworked build server, you can specify slaves boxes to handle some or all of the load.

SCM Integration
- Hudson can watch the source code repository and kick off a build when changes have been made. You can also create a CVS branch/tag right from Hudson. Sometimes creating a branch can take some time, in that case, Hudson will email when it's finished. And finally, you can view all of the source via the Hudson interface just like ViewCVS.

All that said, the Hudson website has this gem listed in the Benefits section:
No more "full rebuild" before a commit:

With Hudson, I stopped doing a rebuild before I commit. Nowadays I just commit, and let Hudson check if a build fails or not for me. Meanwhile, I move on to work on other things. If a build fails, Hudson can tell me so within a few minutes, so breaking a build for that short period of time is not really a problem. Thanks to this, I can spend my time more productively.

-- said the developer nobody wants on their team.

2007-02-14

Unit Testing: still rewarding

I'm not going into all of the obvious virtues of unit testing. If you're a developer and you don't know them, you should probably find a new career.

I didn't like unit testing. I didn't like spending my time writing a test when there was plenty of useful code to be written. Working at Capital Blue Cross for a year changed all of that. My partner, Andy H., insisted that I write a unit test for every part of the system. My work wasn't considered done until the corresponding unit test was written. What a taskmaster. Consequently, I didn't feel productive at all.

Near the end of the project, it was time for us to start running the application through its end-to-end testing. After a few runtime setup environment problems and false starts, the application ran without a problem. It was one of those "Did it just run without a problem?" moments of disbelief. Not only did it run without crashing, it produced the output we were expecting. Hopefully Andy will back me up with a comment so my readers know that I'm not making this up.

OK, so unit testing produces applications with less bugs. Duh. If you didn't know that, or worse, you don't believe it, please stop reading now.

Now for the benefits that I wasn't expecting.

Writing testable code means writing readable and organized code. For example, I wrote an object responsible for building an email using contextual data and a template and sending it. I blew through the implementation pretty quickly. In no time, I had a 150 line method that did it all. OK, time to test. Congratulations jackass, you just wrote a lump of untestable code. I was forced to break the huge-ass method into smaller, more testable, methods. When I was done, I had a class that was easier to read. Even better, I had a class that was tested.

No more Winnebago classes. We've all done it. "Oooh, I know, I'll add this neat feature. No one needs it right now, but someone might need it in the future." When writing code with unit testing in mind, you tend to skip those neat-o features when you also have to write a test for them. The result is lean code that does only what it has to do.

Writing unit tests forces you to think about the design from a different perspective. You may write a nicely organized class that is easy to test, only to realize a design flaw while writing the unit test. After writing a unit test with 70 test methods, you may think the class would make more sense if it were broken into two classes.

Even though I've had mostly positive experiences incorporating unit testing into my development cycle, I still feel unproductive while I'm writing a unit test. Hopefully this feeling will change. I guess I feel unproductive because the benefits are delayed. I take great pleasure in watching 16 unit tests fail because a developer (probably me) made a "simple change" to a core class.

2006-10-30

New Office Photos

OK, I've got some more photos of the new office. I know it's just an office building, but I'm into architecture.

walkway.jpgThere is a long greenhouse-like covered walkway that extends from the parking lot to the building. It has fantastic acoustics. I haven't found the resonating frequency yet.






frontentrance.jpgThis is the view from the entrance to our office space. That's Margaret on the left. She answers the phone.







officepanoramic.jpgMark Rebuck has software that "sews" together multiple photos into one. This one is the combination of about 4 photos.





atrium.jpgThis is the atrium from same vantage point as the panoramic photo above. The plywood is there to protect the glass windows while they complete the construction.






staircase.jpgAt the opposite end of the office space, there is a glassed-in silo-like spiral staircase.

2006-10-23

New Cell Phone

lg_vx8300.jpgSo my employer finally came through with a cell phone. A shiny new LG VX8300.

I can see myself getting a lot of use out of the integrated digital camera feature. In lieu of anyone buying me a real digital camera.

The phone has lots of other interesting features, including bluetooth. Unfortunately most of these features are neutered by Verizon Wireless. Thanks. I'm sure your technically retarded business decisions are making you boat loads of cash.

When a mobile phone has bluetooth it should mean that it becomes less of an information island. Verizon doesn't see it that way. They want you to use bluetooth to attach A-Hole-like accessories like the Jabra BT350, which Versatile was kind enough to provide for me. Now I have another device in my arsenal with which to annoy my wife. Whatdoya say babe? Pretty annoying? Babe? Wanna drive to Hogwarts?

If I want the cool photos I've been snapping, I'll have to email them to myself. Really? That doesn't seem right. Why can't I transfer them to my laptop via bluetooth. Verizon says 'no'.

I keep my contacts in my Yahoo address book. It would be nice if I could transfer them to my phone via bluetooth. Verizon says 'no'.

Luckily there are ways around these problems. With an open source tool called BitPim, I'm able to do all kinds of things with my phone. I'm pretty sure I haven't voided any warranties. Now I can transfer pictures, music, and contacts betwixt my phone and laptop. Cool.

2006-10-10

Ubuntu

UbuntuAfter I got my company laptop, I was happy to overwrite the default Windows installation with Linux.

For two days I struggled with the Gentoo install. Not having the Gettle to do it all for me, I quickly (OK, 2 days) realized that this task was unrealistic for my skill-set.

So, I downloaded the Ubuntu ISO and gave it a try. Wow. I had a working Linux installation in 30 minutes. It took another 15 minutes to get the the direct rendering working. Most of that time was spent reading documentation. The laptop has a dual core processor, but it didn't look like the OS knew about it. So, 10 minutes later (again, most of that time was spent reading documentation) I had a SMP-enabled kernel. Cool.

The default Ubuntu installing uses Gnome for it's window manager. I like fluxbox. So I installed that. Unfortunately, fluxbox doesn't play nice with GDM and/or Ubuntu. It runs fine, but when I logout and try to return to the GDM login screen, the screen goes all crazy-silly. I guess I'll use Gnome for now. There is a fluxbox-ubuntu distro, but I found out about it too late.

After the installation was complete, I was alarmed to find that there was no root account. Oh no, did I forget something? Did I not pay attention during the install? Alas, this is how the default Ubuntu install works. Sigh. The root account can be enabled, but they prefer you use sudo. So far, I've been happy with using sudo.

I wasn't surprised to find that the install didn't pickup my wireless chip-set. I looked at the wireless installation notes. "Download blah1.2422314.323.patch. Apply the kernel patch. Recompile the kernel. Download huh3124.234.23.deb module." It seemed kind of complicated, so I avoided the issue for a few days. On a whim, I decided to try a different method. Gnome has a nice network configuration GUI application. I started that up and enabled the wireless network and that was it. I now have a wireless network connection.

The software updates are easy. Ubuntu checks once a day for any patches. If it finds something, it notifies you by displaying an icon in the upper right-hand corner. Clicking on the icon activates the software updates download/install.

As you can tell, I'm pretty happy with Ubuntu. So happy that I proposed to my kids that we (OK, I) install it on a computer for them to use. My daughter and youngest son were both concerned with not being about to use Word or PowerPoint. God damn you Microsoft. Damn you all to hell.

2006-10-09

The New Office

My new employer moved into the new office space two days after I started working for them.

buildingThe building is impressive. It's on a huge plot of land and sits far back from the main roads. It was built by the now bankrupt PHICO.

Our offices occupy the top (3rd floor) western half of the building. In the center of our space there is a courtyard that measures 35x75 feet and descends four floors to the basement level. When I walked to the railing for the first time, my legs did that I'm-not-going-any-farther-cause-you-are-gonna-kill-yourself thing. The area is just begging me to either fly some kind of model aircraft into it, drop something into the dark depths, or spit. So I did all three.

A few days after we were settled, the office manager sent an email to everyone, telling us not throw paper airplanes in the courtyard. This was odd because she knew it was only me and another employee having the paper airplane contest. Within the first week of starting my new job, I got in trouble and I was publicly reprimanded. Some things never change.

hawkThe land around the building is popular with hawks. On any given day there are 6 to 10 birds of prey flying around the building. It makes me want to get back into flying model sailplanes. On Friday, one of these birds was perched on the railing of our balcony. A coworker, who just happened to have his digital SLR with a 300 millimeter lens, snapped several photos. My son identified the bird as a Northern Goshawk.

As soon as I get my digit SLR (hint hint, Sherry), I'll take some photos of the building.

2006-10-06

Google Code Search

codesearch_logo.gifI'm currently wiping down my computer.

I just found out about Google Code Search. As you can probably guess (OK, maybe not Tommy or Sherry), it's a search engine specifically tuned to find open source code. Cool enough.

But the thing that made me cream all over the keyboard was Google's decision to use regular expressions for their search string syntax. Good god. Does this mean that regular expressions are going to hit the mainstream? I hope so.

Imagine (Tommy and Sherry, you're exempt from this activity) how much more useful Google would be with regular expression capability.

Update 2006.10.09: All technology can be used for evil.

2006-09-29

Martyr

It's only been two days since I left CBC, and it appears that I've already been martyred.

I get 70 virgins right? Can I request a body type? I don't want any of mine to have a BMI greater than 19. Oh and A-cups please, although if you want to sprinkle in few B and C cups I won't argue.

Knowing my luck, they'll get on the same cycle.

What happens when they're no longer virgins? Do I get a new batch? Or do I have to be martyred again?

2006-09-28

Total Chaos

Well it appears that the guys at Capital Blue Cross (not my old employer per se, but the last place I worked) miss me. They sent me this photo. I didn't get the impression that I was going to be missed. (this is a really long sentence, so take a deep breath) On my last day, when I asked if anyone wanted a pelvis-in, inappropriately long hug,   topped off with a shoulder nuzzle, and a dangerously low back rub, I got no takers.

My first day at Versatile was total chaos. Remember that laptop I was supposed to get? I won't be getting it until Monday. I'm told it will be an IBM ThinkPad T43. It was hard to concentrate with interweb withdrawal. I also didn't have a cellphone, so I felt completely cut-off. Remember the scene from The Matrix when Neo doesn't know he's in the matrix yet? He's sitting in his cube at work staring at his computer.  A package is delivered, and it's a cellphone? Well, it's kind of like that, only no computer, no package, and no cellphone.

I went out to lunch with the guys from Chase (my old employer). Their office is in the same business park as Versatile. Nick paid. He said something like "Someday, and that day may never come, I'll call upon you to do a service for me..." I think it's a literary reference. I'm pretty sure he's gonna ask me to look the other way while he dumps some suspicious trash in my dumpster.

2006-09-27

A Fond Farewell

I got a new job! It's only been a little over a year since I switched employers, but I think this is a good move.

I had to stop by the old office for the last time...

me:“I'm here to drop off my office keys and cellphone.”
old boss:“Thanks. We're gonna miss ya.”
me:“It's been a pleasure. Thanks for the opportunity.”
old boss:“So they offered you more money?”
me:“Yeah.”
old boss:“If you ever change your mind, you're always welcome back.”
me:“Thanks.”
old boss:“Like, if they don't keep the promises they made.”
me:“...ok.”
old boss:“Or if they can't find enough work for you and you don't make any money and you end up on the bench. That would be really bad. You know what I mean?”
me:“....uh....yeah....thanks for the offer?”

My new employer is Versatile. I'm not exactly sure what I'll be doing for them, but I'm excited. Here's how I see it (Surprise Sherry. I made a list):

pros:

  • better pay

  • closer to home

  • relaxed dress code

  • more challenging work

  • working with SweetTea again

  • a more flexible work schedule

  • work from home (Sherry, we're gonna need more Bonbons)

  • linux on my laptop

  • a laptop

  • free beverages

cons:

  • expensive health insurance

  • meeting new people

  • working with SweetTea again

  • business travel

2006-09-25

Hibernate's New Clothes

Ever since it's inception, Hibernate has been touted as the savior of the database centric application. Its Object-Relational mapping defined externally to the application code was going to eliminate thousands of lines of code for doing Create, Read, Update, and Delete (CRUD) database activities. Every press article I've ever read has nothing but good things to say about Hibernate. If you as a developer are not using Hibernate, there must be something wrong with you.

There's a fairy tale written by Hans Christian Anderson entitled The Emperor's New Clothes. In a nutshell, the story is about two smooth talking tailors who convince the Emperor that the invisible clothes they have made for him are the most exquisite in all of the kingdom. The tailors added that anyone who couldn't see how remarkable the clothes were was obviously a fool. Not wanting to be thought a fool the Emperor "dons" the clothing, and strolls through town completely naked. All of the townsfolk, not wanting to be thought fools either, praise the craftsmanship of the clothing. Only a single boy in the kingdom has the courage to say that the Emperor is not wearing any clothes.

Well, I just have this to say, "Hibernate, put some clothes on!"

I had another run-in with Hibernate the other day. I was working with a very simply database model.

ERD Diagram

I was using Hibernate to do the normal CRUD operations. Until I tried to do something fancy.

I wanted to insert a new Item and a new ItemType at the same time. I know what you're thinking, "That's Crazy!". Hibernate thought I was crazy too. It complained of a foreign key constraint violation. I spent two days trying to solve this problem, thinking the whole time how much easier it would be to use JDBC.

I solicited SweetTea’s help. He suggested that I set the cascade attribute on the many-to-one relationship to "none". That didn’t fix the problem. He also suggested that I re-fetch the new ItemType after I inserted it. That didn’t fix the problem either. Sorry, SweetTea. Your two years of Hibernate experience aren’t enough for this problem.

So, I checked online, and I found lots of tutorials/reviews written by enamored Hibernate fan-boys. Saying things like:
"Hibernate is simply the greatest object-relational mapping tool available for Java. I wrote an order application in just a few lines of code. I can’t imagine how hard it would have been to use straight JDBC."


Really? I can. It’s not that hard. I’m sure I can do a crazy two table insert in less than two days.

Thankfully, DeviousBard saved the day. Whoosh! After he was finished laughing at me for having to work with Hibernate, he dug in and started tweaking the Hibernate configuration files. Between us, DeviousBard and I have about 20 years of Java experience, but we must be complete idiots. We were pretty much changing settings randomly, and getting unexpected results.

  • Lazy initialization Errors

  • Batch Update Exceptions

  • Class Cast Exceptions

  • OMG Hibernate Sucks Exceptions



A few hours later, DeviousBard noticed something that appeared to be completely unrelated. A few lines above my troubled code, I was fetching an object by ID from one of the tables that I was attempting to insert into. The object was not found, and Hibernate simply returned null. Not a problem. Right? Wrong! This was the problem. Our best guess is that because the fetch was done within the same transactional context as the insert, Hibernate attempted to perform some sort of CRUD activity on the null object. By simply removing the seemingly unrelated code, my code suddenly started working. Shoot me.

I’m usually interested in knowing why and how things work. Usually when I start using a new API, I dig into the source, and have a look around. I have no interest in Hibernate internals. It’s like trying to figure out why a turd stinks.

I think I’m gonna write an Eclipse plugin called "WakeUp". Its sole purpose is to convert a Hibernate configuration file and the associated Java code back into POJO's that use JDBC. Then maybe, when everyone else in the Java world is willing to admit that Hibernate has no clothes, I can become a millionaire by selling the product that brings them back to reality.

2006-05-22

Wake Up Hibernate

Editor's Note: This post is not about bears and their sleeping habits. Tommy and millhousethecat, you can stop reading now. Really, stop reading.

I finally had the chance to use Hibernate on a recent project. Hibernate is a full-featured and popular API, but it has some problems. Here are my grievances.

Step away from the thesaurus


I feel like it was designed by pompous thesaurus-loving assholes. If you want to query a table and bring back just one column, what do you do? Oh, well that's simple. Add a Projection. Huh? I never would have guessed that. By coming up with crazy names for simple operations, the creators of Hibernate have taken away something very important. Developers new to Hibernate can't discover and learn it by doing (coding). The API is not in touch with reality. Let's go to the javadoc for the Projection interface:
"An object-oriented representation of a query result set projection in a Criteria query. Built-in projection types are provided by the Projections factory class. This interface might be implemented by application classes that define custom projections."

Good job Gavin King. Use the word you are defining in the definition. If I didn't have someone helping me with Hibernate, it would have taken me hours to discover this feature.

Reflection is cool...sometimes


A major selling point for Hibernate is that you don't have to change your object hierarchy in order to get persistable objects. What the hell does that mean? Usually ORM's require the user to subclass some PersistableObject in order for the object to be persistable. This is usually too restrictive for mature code-bases. With Hibernate, any POJO can be persistable. How do they that? -- Reflection my friend.

Reflection is cool until you need to do some debugging. Let's say a private instance variable is being set, and you want to know who/what is setting it. OK, put a breakpoint on the setter for the instance variable in question and see what happens. When Hibernate changes the value, you'll see nothing. Hibernate stealthily sets the value using reflection and the debugger is clueless. OK, put a watch on the instance variable. That will do the trick, right? Wrong. The same thing happens, Hibernate changes the variable and the debugger has no idea the value changed.

Lazy initialization error


This is infuriating for the first-time user. Hibernate only fetches things when it absolutely needs to. By default it's...well...lazy.

For example (pseudo code):
get session
fetch someObject from the session
close session

someObject.getAValue() --->  Boom!
Lazy Initialization Exception

There are three fixes to this problem:

  1. Leave the session open while you are accessing the object values.

  2. Configure Hibernate to not use lazy initialization.

  3. Stop using Hibernate. :)

There are more things that bug me about Hibernate, but I'm tired of typing and I'm sure you're tired of reading. Is anyone still reading?

2006-05-05

A Beautiful Spring Lunch

It was beautiful spring day. I thought I'd eat outside during my lunch break. After all, the building that houses my office provides a wonderful outside dining area. It's a brick patio with picnic tables, shade trees, and, oh right, smoke. Tons of secondhand smoke.

This is just in from the Department of This is Completely Logical so Shut Up: The entire and only outside dining area is a designated smoking area.

Great I'll enjoy my turkey-on-wheat sandwich with a side of hydrogen cyanide please. And maybe some heart disease.

<TheFamilyGuy>
















































It was worse than that time Rob Schneider was the host at Red Robin.
me:“Yeah, ah, party of five. Non-smoking.”
Rob:“OK. Name?”
me:“Mann. How long is the...”
Rob:“Mr. Mann! The Mannerator.”
me:“Right. How long...”
Rob:“Man-o-lan-a-ding-dong!”
me:“...is the wait?”
Rob:“The Sandman. Wants to know how long the wait is. Can't hold up the Mann family.”
me:“Alright kids, we're goin' to McDonalds.”
Rob:“Micky-Dees! The Manolition-Mann. Takin' the kids to McDonalds.”


</TheFamilyGuy>

2006-03-31

Grammar Schmammar

Here is a slice of a conversation I had with a co-worker (well, the client):
co-worker:“That's a whole nuther thing.”
me:“What did you just say?”
co-worker:“Huh? What do you mean?”
me:“What did you just say about the other thing?”
co-worker:“Oh. I said that's a whole nuther thing.”
me:“You do realize that 'nuther' isn't a word.”
co-worker:“It sure is!”
me (in my head):“This can't be happening.”
me:“I think you meant to say 'That's another whole thing.' or 'That's another thing.'”
co-worker:“No. I meant to say 'That's whole nuther thing.'”
me (in my head):“And to think, I had you on my 'Smart People' list.”
me:“You can't be serious.”

He then presented me with this site.

The co-worker that never gives in: 1
JC: 0

2005-10-24

Corporate Blog Blocking

Things are getting worse for employees of big companies.

I guess it's only a matter of time.

2005-10-08

apidoc.org

apidoc.org is a great site that aggregates API documentation. It has a register/login feature that doesn't work. Luckily, you don't need to register to use it. There is also an IntelliJ plugin.

Yes, you read that correctly. I'm using IntelliJ...pushed down by the man again. IntelliJ is pretty good. I've only been using it for about 2 months, so my opinions are probably immature.

pros:

  • The code coloring and formatting are really customizable. It has a lot of font effects available.

  • It has great Ant script integration. You can jump around in an Ant script as if it were Java code.

  • It has nice JUnit integration. IntelliJ runs your JUnit TestCases and then summarizes the results. You can run all of the TestCases in a package, run just one TestCase, or run just one method in a TestCase.


cons:

  • SLOW! I hate an IDE, well any application, that can't keep up with the user.

  • Lots of plugins are available, but there are no plugins for additional file type support. ksh, perl, bash, and batch script are just text files to IntelliJ.

  • The code navigation is OK. It's easy to jump forward in the source code, but there is no way to jump back. There has got to be a way to jump back. I just haven't found it yet.
    update 10.10.2005: I found it. "Go To" -> "Back".


  • Five hundred dollars...and it only transports matter... SlickEdit still kicks IntelliJ's ass for $200 less.

2005-09-30

Aut-O-Medic

aut-o-medicThe people that designed the Aut-O-Medic must have been on drugs.

Here are some things that I find incredibly annoying about this machine. Keep in mind that users of this product usually have a headache.

The machine takes 50 cents. Quarters only, please. Both quarters must be placed in the machine at the same time. The coin dial is like those found on gumball machines. The dial will not turn until it has two quarters. This undocumented feature took me about 5 minutes to figure out. You can just imagine how proud I was when I was able to successfully turn the dial. JC: 1, Aut-O-Medic: 0.

You must make your product selection prior to turning the coin dial. I didn't know about this feature. Price to me? 50 cents. If you've selected a product that is sold out, you get nothing. That's exactly what I got. JC: 1, Aut-O-Medic: 1.

Once you've figured out how to deposit your money, that you must first make a product selection, and the order in which these actions must occur, you finally get your reward. The product slides down the chute, out of the machine, and onto the floor. I felt like this was the last chance for the machine to insult me. It worked. My head pounding even more, I bent down pick up my over-priced drugs. JC: 1, Aut-O-Medic: 2.

All of this hate comes from a machine small enough that someone could easily pick it up and throw it out the window.

Stealing Excedrin from the desk of a co-worker is much easier.

2005-07-28

I'm still not connecting with Charlie

me: That'll do pig. That'll do.

Charlie: (confused look)

me: I'm not calling you a pig. It's a literary reference.

Charlie: ...what book is that from?

me (caught in filter):
You shouldn't end a sentence with a preposition.

me: It's from the movie Babe. At the end of the movie...

Charlie: Was Babe ever a book?

me: No, but someone had to write the screenplay.

Charlie: I figured you'd say something like that.

2005-07-26

New Job: 2.2

I played the Destroy All Humans game for the PS2 game last night. It's interesting and kind of funny. You play the role of the alien and it your job to ... err ... destroy all the humans. To progress through the game there are various missions that must be completed. There is also a GTA feel. You can roam around instead of completing the current mission. If you are a distracted kind of person this...Hey let's ride bikes. If you want, you can just run around jukin' people in various ways. There are two weapons so far: The zap-o-matic, and the Anal Probe. I was immediately drawn to the Anal Probe...OK it's the only weapon that I used. Needless to say, I never completed a mission. I just went around...probing people. The Anal Probe is extremely powerful when used properly. I had to some trouble at first. I guess I didn't know where to stick it. It was the first time that I used a weapon like this...I swear! After I got the hang of it, I was probing people so hard that heads exploded. So, I just did that for an hour instead of completing the mission.

I bought myself some candy at Giant the other day. Six candy bars for 2 dollars. God! I can't imagine what it must be like to pay 50 cent for one candy bar!

Forget about ping pong ball cannons, check this out. Oh yeah, that's laser sight on there.

Apple came out with their new iBooks today. I think we are buying one tonight.

So, it's a 'no' on the LAN party? I didn't get any responses. I guess you guys are just afraid...