Tuesday, December 27, 2005

Using Ajax Techniques @ Work

I wouldn't say I condem Ajax. I'd say that I am just skeptical of new "buzz" like technologies and while I have seen the effective use of it via Gmail and various other sites popping up here and there, I never really thought I'd find a good use for it.

On a project I am working on we needed to sort a table of data by clicking on the column headers. A very common task that has been done many many times. The problem though was that since we are pulling all the rows from the database and paging through the results using Javascript there are just too many rows for javascript to handle without choking. Also, because of the way things are done here, it's not an easy process to persist page data to be redisplayed if we were to submit the entire page just to sort a column using SQL.

I suggested using Ajax techniques and it seems to be working out very well for us so far. Clicking on the column headers makes an ajax request to the server for the data already sorted. I then take that data (xml) and rebuild my array in javascript. Turned out to be really simple.

I wouldn't say I condone the use of Ajax...

Tuesday, November 08, 2005

Review: Foundations of Ajax

The first round of Ajax books have hit the shelves and Apress is trying to make their mark with Foundations of Ajax. A thin book with only 273 pages including the index, Foundations of Ajax hits the mark with its recipe style format and examples.

Foundations of Ajax starts out the way most tech books do with a bit of history and primer for what’s to come. Most people familiar with web applications and design can probably just skip chapter 1 and possibly 2. But don’t skip anymore. Chapter 3 jumps right in with your first fully functional Ajax enabled web page and it doesn’t let up. Some of the examples are dynamic tool tips, textfield autocomplete, dynamic drop down lists, and my favorite, the progress bar. The elements of each example are well explained and easy to understand but aren’t diluted with pages of theory and why’s. This book is all how.

The last few chapters all deal with tools for the developer to help make Ajax development easier. It talks about Firefox extensions, JSUnit, and lightly touches on some Ajax frameworks though no working examples of any of the frameworks are shown.

The book was not without its faults, however. There are syntax errors lightly scattered throughout some of the examples. This was frustrating because I had to debug javascript for someone else’s errors. The book also assumes a fair amount of Servlet knowledge and J2EE web app deployment know how. While I’m all for examples in Java, this does limit the books potential customer base. Ajax is pretty much server side technology agnostic. It can be used with ASP, PHP, J2EE, Ruby, and many others. And while the book does touch on this fact, newbies to Servlets will find running the examples difficult.

I whole heartedly enjoyed this book and it really wet my appetite for Ajax and how I can use it to improve my own applications UI and provide a better experience for the end user. I’d highly recommend this to anyone wanting to learn the “Foundations of Ajax”.

Friday, November 04, 2005

KornShell Scripting Reference

I've been doing quite a bit of KornShell scripting at my new job the past couple of days. I am familiar with bash primarily so I was needing some reference to KornShell and it took me forever to find something good. This link was buried about 9 pages deep in google. It answered a lot of questions that other tutorials and links just didn't touch on. So I thought I would share it in case anyone else needs something similar.

Unix KornShell Quick Reference

Happy scripting!

Tuesday, November 01, 2005

Just An Update On My New Job

[I noticed that this post has made it to the top of javablogs Hot list. I added this blog to javablogs yesterday and it aggregated everything. This post is really old and I am not even at this job anymore. Sorry about that.]

I got yelled at the other day for not having any updates on my weblog for a long time. Not that me taking long breaks from blogging is anything new, but I figured I'd go ahead and throw out one today.

Last week I started a new job at DST Output in Kansas City, MO. So far things are going pretty well. I'm enjoying being at a job where I am getting paid to write code full time instead of my part time consulting work. The company has a great history and great financials. My colleagues have been very helpful in getting me up to speed on everything we do here.

I would say more about the work I am doing and the company however, only being here a week, I am not quite sure what all I am at liberty to speak about in public. More to come in later days I am sure. Now back to work...

Friday, September 30, 2005

Evaluating MyEclipse IDE for JSF Development

Today I decided to start really evaluating MyEclipse IDE. Their 4.0 version offers many new and exciting enhancements including some for JSF development. These are just a few observations I've made thus far and as I continue to use it I'm sure I'll be adding more.

  • When in design mode, after adding a component, the mouse cursor will turn to a circle with a line and not allow you to click in the design editor anymore. Switching to source mode then back to design mode fixes this until the next time you add a component.
  • There is no palette component for h:outputText (forums - known issue. have to wait until next version at least)
  • Design mode does not represent a panelGrid correctly. For example, I created a panelGrid with 2 columns. I then added 4 components expecting 2 columns. In design mode all four components are displayed in a horizontal flow layout. Not a grid layout as expected. Same goes for the preview tab.
  • There is no tool button on the faces-config design palette for adding a managed-bean.
  • When adding a managed-bean with properties via the wizard, the managed-bean declaration in faces-config contains managed-properties for each declared property. At the very least this should be an option as managed-properties are, at most times, not required.
  • There are no options to specify expression language values for managed-properties.
  • There is currently no palette support for MyFaces extensions, although MyEclipse IDE has MyFaces support which is to say it adds JAR's for you and web.xml entires. (forums - known issue. Have to wait for next version and even then it's a maybe??)

Ok, these seem to all be complaints. Hopefully as I use it more I'll have something good to say about it. I've searched for some of these issues on the support forums and noted findings in the list above.

Monday, September 12, 2005

Are You Really Blogging About Splash Screens?

Reading my javablogs email today I noticed 2 very similar posts. New Netbeans 5.0 Graphics and Cool New Netbeans Welcome Screen. Are you serious? Are you really blogging about splash screens? I'm not a Netbeans user but I can think of a hundred other Netbeans topics that are a lot more important than it's splash screen. But I guess this is where blogging has been going for some time. Can't think of anything important to blog about so I'll pick the most mundane meaningless topic possible. And here I am blogging about people blogging about Splash Screens. Oh well...

Wednesday, August 24, 2005

Download Google Talk

Google Talk

Wednesday, August 17, 2005

Closed Source vs Open Source

This morning I was reading through a thread at Javaranch in our Moderators Only forum about an odd statement in LayoutComparator. This discussion eventually led to various RFE's that have been ignored for years by Sun. One of the staff's favorites was this one. All this talk of ignored bugs got me thinking about libraries and API's that I use that are open source and others that are considered closed source.

Take, for example, JSF. For all it's (debatably) usefullness there are some major issues. Some of these issues are being resolved in the 1.2 version of the specification. However, 1.2 is not due out until the release of J2EE 1.5 which is not due until late next year (2006). In comparison, look at Tapestry. Sure, it has it's own issues. But time and time again I see bug reports on the mailing list and replys that these issues have been fixed within days. Obviously this is happening more frequently with Tapestry 4 final on the horizen and I know Howard wants it to be as bug free as possible before the release. At the very least, nightly builds are available so if you need the most recent version with the bug fixed you are having a problem with, you can probably get it. Sun might have all the bugs fixed in JSF. But we don't get it until late next year. We have to settle for good open source projects like MyFaces to make work arounds for these bugs.

I haven't looked into Apache's open source VM (Harmony) at all. I haven't even been to the website. But the more issues I run into with closed source tools, the more willing I am to check it out. And if they can address some of these 8 year old lingering issues before Sun, why not?

Friday, July 29, 2005

Hibernate Forum Now Based on Credit System

So the Hibernate team has finally pulled out the final stop in trying to, well, the only thing I can come up with is to get people to stop asking questions. They state that this is to force people to help each other, but it seems to me that helping is something that comes natural in most community forums.

You can read about this rediculous effort here. And just so you know, Javaranch has a forum dedicated to ORM tools including Hibernate and we are actually really friendly and helpful just out of the goodness of our hearts. So if your sick of the crap you have to put up with on the Hibernate forums, we'd love to see you at the Ranch.

Hibernate is an awesome tool, but they really make it hard to want to use it, don't they?

.NET Near Darwin Award Goes To...

God help us if this developer switches to Java.


Wednesday, July 27, 2005

JSF Component Blushing

I've been looking for a way to blush some of my text components based on whether or not they passed JSF's built in validation of some input components rather than displaying error messages because they tend to mess up my layout and I don't like the global messages.

Found out from a guy on Javaranch you can do something similar to this:

styleClass="#{newIssueForm.summaryText.valid ? 'normal' : 'error'}"

Where normal and error are styles defined in your stylesheet. Works great. Thanks a lot to Mauro Castaldo for pointing this out to me.

Friday, July 22, 2005

Desktop Java Live - A Must Have For Desktop Developers

Recently I was fortunate enough to win a copy of Desktop Java Live by Scott Delap (who also runs clientjava.com) during a book promotion over at Javaranch. Desktop Java Live isn’t your typical “how-to” java book full of API references and examples of how to create JFrame’s, JComboBoxes, and custom widgets. DJL is a pioneering book distributed by a pioneering publisher (SourceBeat) that teaches you how to write desktop applications using best practices as well as how to use a plethora of open source libraries to enhance and ease the development of your applications.

Currently there are 7 chapters available with chapter 8 due out the beginning of August. If you don’t know how SourceBeat titles work I’d suggest visiting their website and seeing what they offer. Books are bought on a yearly subscription and for that year you have access to any updated material as well as new chapters as they are made available. A lot better than waiting years for second and third editions. You get the hottest topics while they are still hot.

Scott starts your journey in chapter one and introduces you to desktop applications all over again. He talks about the swing (no pun intended) from rich desktop apps to browser based web applications over the past several years and how to determine if your application is right for the desktop. From there you move on to Layout Managers, GUI Builders (not to be confused with GUI designers), Look And Feel and then to a chapter that is pure gold. Swing Threads.

Chapter 5 on Swing Threads is also the sample chapter available as a free download. This chapter introduces you to the Event Dispatching Thread and discusses common threading pitfalls in Swing applications. Scott then shows you several different freely available API’s that have been made available to help Swing developers deal with threads more effectively. You can search the web for weeks and not find the culmination of useful information available in this single chapter of Scott’s book.

The book continues on with data binding and validation and to my knowledge is the only book that actually teaches you how to use JGoodies data binding and validation frameworks. The book is full of sample code. You never get bogged down in API references or theory. But theory is still important. And I had the honor of being able to read Chapter 8 prior to its release this August which is about Swing Patterns. This chapter also contains a sample application that uses what you have learned all the way to this point. Chapter 8 discusses MVC (Model-View-Controller) and MVP (Model-View-Presenter) and how they are used in and with Swing. Again, no other book that I know of teaches you what Scott does in this chapter alone. And although chapter 8 as well as many other chapters are biased to Swing the concepts are true for almost any toolkit. If you only buy this book for one chapter, it should be chapter 8.

On the horizon are chapters on Java WebStart, Installers, Obfuscators, and the all important Testing. Scott writes in a way that that is easy to follow and understand but does not water down the topics. Scott knows what he is talking about and that shows throughout the book. If you’ve never written a Swing application this book won’t explain how to do that. But if you are even remotely familiar with how to develop Swing applications this book will help your next application be the best it can be.

Thursday, July 07, 2005

DB4Free - Help Make MySQL 5 As Perfect As Possible

I ran across this little site yesterday from a post at Javaranch. Basically, you sign up and you get a free MySQL 5 database on a remote server that you have access to. You can give access from any host or limit it to be from a single host. You can register 2 databases under a single email address.

The main goal of this project is to help get MySQL 5 ready for primetime. From the website: With this project we also like to help the MySQL AB company to make the new MySQL 5 database server as perfect as possible. If you find any bugs, we would like you to report them on the MySQL website.

Obviously you wouldn't want to use this for anything in production or anything secure but it's a nice way to test out the new features of MySQL 5 without having to install and configure it yourself. Also, my site host only gives me 1 MySQL database so if I needed another one this would be a good temporary solution. Plus, I am all for helping MySQL out. They've been good to me by providing really good free database servers.

Friday, July 01, 2005

The Desktop War and Java

Yesterday I had a conversation with a friend of mine about linux, mac, windows, etc. He is a big fan of the mac and suggested I get one so I could have the best of both worlds, meaning windows and linux. I made some comment about not needing to buy new hardware just so I can run OSX. Linux has everything I need with the exception of good solid gaming support, which mac currently is one up on linux because they can run World of Warcraft natively.

But in all honesty the desktop I run is meaningless to me. Software is more important right there with getting done what I need to get done. I don't even care what the desktop looks like. I run blackbox on linux if that tells you anything. Sure there are features of a desktop that are nice, like OSX's drag and drop to/from anything, but visually speaking I am too busy programming or playing games in fullscreen mode to care if the menu's fade in/out, have drop shadows, or what is animated. This is all fluff. And desktops like Gnome, WindowsXP, KDE, etc just eat up system memory that could be put into better things like the applications I run.

Given that I don't care about the desktop but software is important it makes sense to acknowledge that I should run the desktop with the best support for the software I like to use. But software should not determine what Desktop OS I run. Java developers need to grab hold of this concept. There are a lot of native packages that have been ported to all different platforms. Java developers wake up, this is a sign. More and more people are demanding good software run on anything. And no matter what anyone says, Java is the best solution. Write your code on any platform, compile to bytecode on said platform, deploy anywhere. There is no other language that can do this. There is no other language that makes it easier to develop for any OS. If you are developing applications for multiple platforms and you aren't using Java, you are wasting valuable time in cross platform development. It's natural only to Java.

Writing code native to a platform only makes sense if there are features of that platform that java can't get to and you are only planning those features on said platform. If you are writing an application that interacts with MS Outlook, then just write in C# or VB.NET or even C++ and MFC. I am 100% for using the best language to get the job done. But I'll always consider Java as the first language of choice and if I don't feel it can accomplish the tasks at hand, I'll find something that can. But honestly, there isn't much that java can't do these days.

The desktop war can only last so long until people get really sick of paying high prices for fluff. Windows, Mac, Linux, I don't care. I just want to run software and get my work done. Give me all my tools in Java and the desktop war is over!

Thursday, June 30, 2005

Native Linux World of Warcraft Petition

In looking for ways to make World of Warcraft run on my new smoking Ubuntu linux machine I ran across a petition that will be given to Blizzard in an effort to get them to port WoW to linux. If you are a WoW fan like me and have 5 seconds, please sign this petition.


Trolltech's QT 4 Released

June 28, 2005 - Trolltech launches QT4 along with a duel licensing scheme for Windows. QT was originally only offered as GPL Open Source under X11 and Mac. Now QT is available under GPL Open Source for Windows users.

Official announcment and downloads can be found here.

Tuesday, June 28, 2005

Java Gaming on the Desktop Could Be A Good Thing

I'm not a big gamer and the games I do play have to be pretty darn good. I have been playing World of Warcraft since it was in open beta and can't get enough of that. It runs on Windows and Mac. I was impressed that they released a Mac version. It's about time OSX starts getting some popular ports so those guys and gals can spend some money as well. :)

I have never owned a Mac and with the change to x86 I am leary to go out and buy a new one right now. But I do run Linux. Not because I hate Windows or anything but because for a developer Linux has everything I need and more. And it is free after all. Don't get me wrong, I have no problems paying for good software. Espeically good games like WoW. But the linux world is really hurting I think. There are a lot of reasons why games just won't work on Linux. The most obvious is most games written today are written for Windows and therefor use DirectX which Linux doesn't really have. And for some reason not a lot of people are developing commercial games in pure opengl. But I am not real sure why.

Ok, where does Java fit into all this rambling? I see Java as a good future gaming platform. Right now there are some pretty good API's like LWJGL and JOGL along with some Scenegraphs like Xith and jME which use JOGL and/or LWJGL. They are still pretty young in the grand scheme of things but I think in a few years we could see a shift in what language major games are being developed in. I know all you die hard C++ fanatics out there will disagree. In fact one of my best friends will argue till the day we die about how C++ is better than Java. But that's not really what this blog is about.

I think portability is going to be a major attraction to the gaming industry in the coming years. WIth OSX on the rise (maybe) in popularity and with Linux distros like Ubuntu getting better and better, more people are going to want to run their favorite apps on the OS of thier choice instead of running the OS because the app requires it. This is where Java fits perfectly. Yes, there are some good C/C++ multiplatform tools out there. QT, SDL, Ogre to name just a few. I've used all 3 and they are good. But you still have to be really careful when developing in these as to what OS you are really working on. Java on different platforms, so long as there is a VM, just works. Plain and simple. C++ works, most of the time. Compilers really differ. And that is the big difference. The compiler. You still have to compile source code for the various platforms. And that isn't always fun.

WIth the opengl wrappers for Java like JOGL and LWJGL there is still compiling for various supported platforms for the native libraries. But these are compiled and tested and done. You just use them and all you care about is Java.

I don't think Java is quite there in terms of what API's are provided for gaming. But it's getting better. Puzzle Pirates is a recent success story. A MMORPG written in Java and was picked up by a commerical distributor. And there are a few Java games on the shelves at Best Buy if you look really carefully.

True platform independency, ease of distribution via Java WebStart, a great community; all these things could make Java the new gaming language in the near future. I wouldn't mind that so much.

Ubuntu - A True Pleasure

I have a Dell Inspiron XPS laptop. It's a P4 3.4GHz machine with 1 GIG of RAM and it has an ATI Radeon Mobility 9800 with 256MB. Not a bad machine. I have really enjoyed it. Well, I've enjoyed running Windows on it. I've been trying for 6 months to get a Linux distro to run on it. The major hurdle? Video. About the time I bought it was when ATI was just releasing their drivers for linux for the 9800. Problem is they were never really designed for the mobility card and they suggest getting drivers from the computer manufacturer. Uh, Dell don't do dat.

I tried Mandrake, Fedora, Debian, and Gentoo. All of which installed rather easily (well, not gentoo but I still like that distro) but I could not get video to work with any of them. And I'm not talking 3D acceleration. Plain old show my desktop video would not work. It was so frustrating. So I gave up for a while.

Yesterday I got to work and went to Distro Watch to see what was up and coming, what had been updated, etc. I noticed Ubuntu recently released another version. I went to their site and did some reading. It seemed that from the forums people were having success getting video to work with the same hardware I have.

Ubuntu is built off of a Debain core so all you need to download is a single CD ISO. The CD installs the base system, kernel, and a few other goodies to get you going. Everything else you need is done using apt-get or their nice GUI interface for apt-get, synaptic. I downloaded the CD, created the CD image, and started the install process. The install is all text based but it is still really simple. The only part where you might have questions if you are new to linux is drive partitioning. Although you can automate that but I was dual booting so I had to customize the partitions a bit. Hardware detection was all automatic. The install was done in a hurry and it ejected my CD and asked to reboot. No questions about video or anything. I thought "Great, going to have to jack with this manually". It booted right into a nice GDM where I logged in and saw the nice, clean Gnome desktop. And at the correct resolution, 1900x1200.

I was in utter amazement. Video worked just like that. There was still a problem though. My 3D acceleration wasn't working very well because it was still wanting to use some basic ATI driver and not the fglrx drivers that really sing. After a bit of searching on the Ubuntu Forums I was able to fix this problem really easily. 3D acceleration and opengl support work flawlessly.

A few other notes:
Desktop - Ubuntu uses a customized Gnome by default. You can install any other desktop you want. There is even a KDE Ubuntu project called Kubuntu that I installed and it works great if you are a KDE fan.

Multimedia - I had to install some additional drivers and codecs to get DVD and MP3 support. Not a big deal as Ubuntu makes installing additional software a breeze with apt-get.

I still don't have my linksys wireless PCMCIA card working. Word in the forums is that my card worked after some driver installs using ndiswrapper with the RC of the latest release. After the release was made final it doesn't work anymore. So I am still working on this. But I can run wired just fine.
I went to Best Buy tonight and bought a Netgear WG111 Wireless USB Adapter for my Tivo. I noticed this card mentioned on the Ubuntu forums so I gave it a shot and now I am editing this post from my Ubuntu Wireless system. Wahoo!! (I also installed Unreal Tournament 2004 and it runs even better than it ran on Windows, but that is another blog)

Ubuntu has a 6 month release cycle so every 6 months they offer a new distribution. Current users can simply upgrade their current release with apt-get, kernel and all.

Software packages using apt-get are based on links in the repository of where to find the software. You need to add additional links to the list so that apt-get can get more and newer software. This is as easy as editing a file and adding the links though.

The Ubuntu Guide is the best place to go right after installation. Just go down the list and do what it says to get what you need. Including how to add those additional resources for software.

Sometimes software versions won't match release. What I mean is accoring to Help->About on Mozilla Firefox I am running versino 1.02. 1.04 is the latest. Questioning this in the forums I was told that although the versions don't match all the patches in 1.04 have been applied to my 1.02. Good enough for me.

Friday, June 03, 2005

Generics and EFL Save Me Code

I know that Generics and the Enhanced For Loop have been blogged to death but since I just now really started using them here and there I just wanted to publically state my thanks to those Sun guys that improved the language for me.

The old way:

for(int i=0; i<workstationlist.size(); i++){
list.add(new SelectItem(

The new way:

for(Workstation w : workstationList) {
list.add(new SelectItem(w.getId(), w.getWorkstation());

Gotta love it!

Thursday, June 02, 2005

SwingX Needs JDNC

I was playing around with some of the projects in the SwingLabs today. I started trying to get the JXDatePicker to work and I kept receiving a NullPointerException on an ImageIcon. I thought that was strange. I had the SwingX JAR in my classpath.

I started looking on the JavaDesktop Forums for answers and I noticed that all the JXDatePicker questions were in the JDNC forum. So I took a chance and downloaded those JAR files and added those to my classpath and now my JXDatePicker works.

Thought this might help someone else out. Took me a while to figure it out. Maybe I am just slow. :)

Wednesday, June 01, 2005

Java Studio Creator: Not The Same Code

I posted this over on Javaranch earlier but wanted to get some feedback from those that might not visit us over there. Here is what I had to say:

So I downloaded JSC today to give it another whirl. The last time I tried it was when it was still an RC. Ran decent on my 3 GHz with 1 Gig RAM but still not up to par with IDEA or Eclipse. I excepted this though since it's based on Netbeans and Netbeans is still creepy crawly even on good machines.

Performance aside, it worked fairly well. I was able to create some basic forms and throw some navigation in there and move from page to page. The issues I had came when I started to look at the generated code. Hardly any of it follows the guidelines/practices that are taught in books. I'd asume this is because in the books we aren't using an IDE. But it is still interesting.

For example, I've always considered it best practice to load a dropdown list via a getter method in the backing bean that loads the list and binds it to the dropdown component. When I look at the same code using JSC this is all down in the constructor of the backing bean.

Another interesting note is how you are taught in books to create getter and setter methods for the values of the components. So for a login form you'd have

private String username;
private String password;

and then getters and setters and in the componet you would specifiy the value accordingly. In JSC it uses all component binding. So you call getValue() of the component instead of getUsername() or whatever. Not that this is a bad way, just different than what is generally taught in books.

I realize you can't expect IDE generated code to be as neat as what you write yourself but it would be nice if the things you learned from reading the books on JSF carried over to the IDE that just so happens to be made by Sun who just so happened to create the JSF specification.

So who's breaking the rules? Hand coders or the IDE?

Moving My Blog

For a while now I have been mainting a weblog at http://radio.javaranch.com/gthought. Recently I have been getting so bogged down with comment spam I thought I'd move my weblog over here and see if that subsides.

I'll be attempting to move my blog entries from radio over to here so bare with me if you visit and things seem a bit out of order.

Thursday, April 28, 2005

KGBInternet: Bad Experienced Turned Good by Good Customer Service

The other day I signed up for a shared Tomcat hosting plan at KGBInternet. I was thrilled to find such a good price for the features that you get. They said they were running Tomcat 5.0.x so the first thing I wanted to do was try it out. I created a very simple webapp that accepted a users name and then displayed "Welcome name" on another page using JSP 2.0's EL. Worked great on my test machine so I uploaded it to my site. They provide a script via telnet to reload your context, which is nice because most others make you request a reload from support. So I ran that script, loaded my index page, input my name, clicked submit...and...ServletException!

Thus begins my trials with KGBInternet. The first thing I did was search google and it turned up nothing. I then searched Javaranch and there were no threads with my ServletException. So I emailed Keith at KGBInternet. He was quick to respond and both he and I started looking into the issue. After about 20 emails I was getting so frustrated because there was no reason I should be getting the exception. The exception was being thrown because of something to do with the Expression Language parser. At this point I was very disappointed in KGBInternet. I emailed Keith and asked what I needed to do to cancel my account. He said an email was fine and he would take care of it. Something about the issue wouldn't let me let it go at that point. I continued discussions with Keith and he suggested something I never would have expected. He asked me to upload my tomcat folder and he would setup a private VM account for me at no additional charge while we figured out the problem. Talk about shocked, and impressed. I did as he suggested and I tried my webapp and it worked great. I emailed Keith thanking him for the help and told him to go ahead and set me up for the private tomcat account. It's $10 more a month but still a very good price comparativley. Come to find out it was a version issue with Tomcat 5.0.x not working with Java 1.5. I could have kept my shared account after this. I'll gladly pay KGBInternet $20 for a private tomcat instance.

I worked retail for 10 years. I managed a Blockbuster Video and I was a manager at Lowe's Home Improvement. I know customer service. And it is seriously lacking these days. Cashiers don't even make eye contact anymore. Sales reps point to what aisle to find whatever product on instead of taking you there. It's all about the lowest price but somehow that also equates to the lowest service. I upped my account at KGBInternet 100% based on the customer service I received from Keith. And as long as it stays that way, I don't see any reason to leave them anytime soon.

Thanks Keith. Great job!!