Archive for October, 2009

Helping Out Old Friends – On The Road

Friday, October 30th, 2009

On Wednesday I got a call from some old friends in trouble. They were the first clients I had when I opened up my own consulting shop in Indianapolis in 1992. Their $2700 for Beacon an office management system for eye doctors kept us in business for several months at the beginning, and made all the difference (in my mind) between relative success and absolute failure. I owe them a lot.

Over the years, they have called every now and then with some problem that they can't get solved. Maybe it's putting in the first network in their shop, or moving shops and doing it all again, or setting up a back-up system or problems with the program they got about 13 yrs ago to replace Beacon.

VSP became big, and something that could deal with it directly had a distinct advantage. I wasn't upset - I'd had a good run, and now it was time for a better solution to their problems.

So when they called on Wednesday it wasn't completely out of the blue.

Their problems this time were really two-fold: iffy system, and bad support. I can't really do a lot about the first, but I can see what I can do about the second. It's a database system where the developer expected the users to realize it's a database system and understand things like records, tables, forms, etc.

Face it, that's not really something you're going to teach someone on the job unless they are critical to your business. People come and go, and systems like this should not require this kind of knowledge. The system I wrote for them was built in Paradox 3.5 for DOS, which was a database system, but it didn't require them to know it. Just use it like a delivered application.

This is really a different way of developing software. The author expected the users to meet him half-way to the problem. I know better. The best software meets the user right where they are. They shouldn't have to move. That's educational software.

So I'm off to help out friends today. It's a long drive, but in the end, I'll be glad I made the trip.

OmniGraphSketcher 1.1 beta 1 is Out with Interesting Features

Friday, October 30th, 2009

I saw a tweet this morning from OmniGraphSketcher about the release of 1.1 beta 1 with several interesting new features. I think I'm going to give it a whirl and see how it works. Beta, yeah, so I'll understand the limitations, but still might be nice.

Development Isn’t Always Glamorous Work

Wednesday, October 28th, 2009

Today I was doing a lot of little things to my web app. Nothing really amazing, but in the end, they added an amazing bit of functionality to the alerting system. I added in the thresholds for each desk so that they can be used as variables in the alerts which means that we can make the system a lot more proactive than it is now when it comes to desks getting near their limits. Adding the variables to the code was easy, and not really amazing in and of itself, but the larger effect is pretty nice.

Anyway... lots of work and not a lot of interesting things to show for it.

Interesting Behavior of the Google Visualization Table

Tuesday, October 27th, 2009

GoogleVisualization.jpg

I had to do some work today with the Google Visualization Table and no matter how I set it up, if I had more rows in the table than would fit in the vertical space allowed in the enclosing div, we'd have a vertical scrollbar and a horizontal one.

I kept fiddling with the width of the div and the width in the table's parameters, and nothing seemed to make any difference. Then I started to see a pattern: the horizontal scroll bar was there only when the vertical scrollbar was - and it was always scrolling only the width of the vertical scrollbar.

It was as if the vertical scrollbar's width was not being taken into account in the sizing of the table, and therefore, a horizontal scrollbar was needed to display it all.

So how to fix it?

Not so easy, it seems.

It's a known bug by Google, but they have not yet released a fix. Nice.

I started playing around with the width parameter in the table's params:

  var tableParams = { showRowNumber: false,
                      allowHtml: true,
                      width: '100%',
                      cssClassName: tableStyles };

and when I used the percentage width parameter I started to see that the calculations of the width of the table were done properly. So, by setting it to '100%', I was able to get the maximum width while also getting the vertical scrollbar when I needed it, and not getting the horizontal scrollbar when I didn't.

Wild, that I needed to set the width in that way.

Amazon RDS – MySQL in the Cloud

Tuesday, October 27th, 2009

MySQL.jpgThis is an interesting development. The Amazon S3 system has been online for quite a while, and clients like Transmit and Cyberduck already talk to S3. But it's an object-database. Nice in many regards, but not exactly what someone building an application might be looking for. There are just way too many applications that need a general, reliable, relational database - like MySQL.

While I haven't used MySQL a lot, it's pretty much on par with the other open source databases - DB2, PostgreSQL, etc. It's a filesystem database where it's easy to backup the database by simply copying a few files. Nice, compact, and pretty good performance from what I've heard. I've used it in WordPress installs in the past, and it has always worked very well for me.

What is interesting is that Amazon seems to have broken down the costs so that you really are only paying for what you use. Be it CPU cycles to do the queries, or I/O to get the data to/from you machines. It's a pretty wild idea. If you couple this with the EC2 machines where you can bring up a linux box with your software on it, run whatever it is you need hitting this MySQL database with all the data your app(s) need. They even have a reduced I/O rate for transferring between their servers so that if you really can run the application on their end and have a minimal interaction with it, you're liable to be able to get away with a very inexpensive I/O cost.

Of course, this means that you're paying for the CPU cycles on their end... there is no free lunch. So it's an interesting option. If you need to have a cloud MySQL database, this is the only one I've seen. But the question becomes, do you need it? That's tougher to answer.

SubEthaEdit 3.5.1 is Out

Tuesday, October 27th, 2009

I was thinking about Coda and the editor it uses - SubEthaEdit. So I fired it up just to see if they had released a new version of the base editor, and indeed they have. SubEthaEdit 3.5.1 has quite a list of features and fixes including several Snow Leopard fixes. Fantastic news.

Panic Updates Transmit 3.6.9 and Coda 1.6.6

Tuesday, October 27th, 2009

This morning I noticed that Panic had updated both Transmit 3.6.9 and Coda 1.6.6. The single note in the Transmit release notes indicates a bug in the replacing of folders. The Coda release notes are a little more extensive with fixes for Snow Leopard as well as a few FTP issues and "minor visual fixes".

In all, it's rare to see these guys push out two updates, but I'm happy they did. It always makes me smile to look at Coda - I'm going to be using it more as I move to Mac-based development of these AJAX web sites, and I'm looking forward to it.

Odd Bug in the Google Chrome Frame for IE

Monday, October 26th, 2009

I've been working with the Google Chrome Frame for IE this afternoon, and I noticed that it wasn't updating properly. In fact, it's not working well at all with the processing of the DataTable data sets. It used to work, but it seems not to be working now.

It could be my box, or my IE 8 install, but I've re-installed the Google Chrome Frame and that's not it. I've also re-installed Adobe Flash 10 as well - as that was coming up as an issue. I'm not sure about all the issues, but it seems that it might be related to the clicking on a URL from a link external to the web browser.

If I set FireFox 3.5 as my default browser, it works fine. Same for Google Chrome (the browser). But if I try to use the Chrome Frame in IE, I get some of the page rendered, and a few requests sent and returned, but there appears to be a bug in the Chrome script(s):

  Uncaught TypeError: undefined is not a function    native runtime.js:389

I tried to Google this error and see what might be at issue. I'm not sure if it's the Chrome install or the Chrome Frame or IE or the box. But it seems that the error only occurs on the Chrome Frame in IE. Very odd.

I'll keep an eye on it and see what I can see, but I'm guessing that it's just my box for some reason, and I'll give it a reboot one of these days and set everything back up.

[10/27] UPDATE: I posted something to the (moderated) Google group for the Chrome Frame. I'm not sure if I'll hear anything back - it's very new, and could be classified as experimental, and not supported. But it's worth a try. I found another box that had the problem that used to run, but no longer. So it's got to be something with the visualization widgets or the frame, or an incompatibility between the two. So maybe I'll get lucky.

[10/28] UPDATE: The responses I got were very nice. One needed an example, which isn't surprising, but the other pointed to a version of Chrome (the Browser) that's in the Chrome Frame install directory. He suggested that if it's in there, then it's not the Frame itself, but that version of Chrome. Indeed, it was. So I posted that to the group. I also put together a simple test HTML file and put it up on my site so that they can hit it and test their stuff. It'll be interesting to see what comes of all this because now it's clearly in their court.

[10/29] UPDATE: the latest news was that it was in the line:

  google.load('visualization', '1.1', {'packages': ['annotatedtimeline', 'table']});

but I have to put in both packages or the page isn't going to render properly, and I've tried using the '1' version of the package to no avail. So I wrote all this back and we'll see what they say. It's clearly all in their court as they have the browser, the frame, and the visualization stuff. It's just a matter of them getting things together and fixing what needs fixed.

Slick Little JavaScript Function to Parse GET Variables in URL

Monday, October 26th, 2009

I was messing around this morning trying to parse the HTTP GET variables in JavaScript so that my web app could "see" the arguments passed into it, and act on them accordingly. This was something that the users have asked for in the alerts from my web app - a link back to the web app so that they can easily "drill down" to the data to see what the alert was really all about.

So I did some Googling on this and I was very pleased to find something like this:

  /**
   * This function parses all the GET variables for the current page
   * and returns a map of the key/value pairs to the caller. This can
   * be used in some pages to get these GET variables for processing.
   */
  function parseGETVars() {
    var retval = [];
    var urlChunks = String(document.location).split('?');
    if (urlChunks[1]) {
      var pairs = urlChunks[1].split('&');
      for (var i = 0; i < pairs.length; ++i) {
        if (pairs[i]) {
          var parts = pairs[i].split('=');
          retval[parts[0]] = unescape(parts[1]);
        }
      }
    }
    return retval;
  }

with this, I can then simply parse the GET variables into a global (page) variable and then use it in the code to see what I need to see.

With this, I was able to pass into one of my pages, the default portfolio to show - as opposed to the first one in the available list. It's a pretty slick little thing. Very nice.

Contemplating the Ideal Structure for Application Development

Monday, October 26th, 2009

Professor.jpg

I've been thinking a lot lately about the ideal structure for application development. It's more than just what makes the developer productive, it's also what makes a great application. There are components of infrastructure, user-interface design, support, reliability, stability, responsiveness. All the things that work together to create truly exceptional software.

I've been thinking about this because recent jobs have had vastly different models for how things should be done. Is there a QA department? Is there an Operations group that must take ownership of the developed product? Who supports the app with the end users? How does feedback make it's way to the developer from the users?

There are a lot ways to do this - probably as many as there are companies on the map. But I'm looking at the few examples I've been exposed to up-close, for an extended period of time.

The Cube Farm - Stick to Your Assignment, Developer

Probably one of the most Dilbert-esque, and therefore, most common, forms of organization is to function under the belief that management knows best. That people can really be modeled as ants in an ant farm - interchangeable, fungible, assets that can be told what to do and they will execute on those instructions as well as if they had any input or control in the decision-making process. It's born out of the idea of the old Peter Principle:

In a Hierarchy Every Employee Tends to Rise to His Level of Incompetence.

Developers that are really good developers must be good managers, so they are put in charge of a small team. Do that well, and he must be a good manager, and so put him in charge of a few teams. This continues until he's no longer really good at his job, and the promoting stops. However, the damage is already done.

You now have a great developer in management, and so he believes that he knows how to do this development, and he's right - he knows. But only about how he does it. If there's a person that's really effective because they write the docs first and then use that as a template for the system, that's great. But it's not a universal imperative. Not everyone will work best that way. Maybe some people see a design unfold best when they start writing code and see where it takes them. This might be along the lines of the Extreme Programming movement. No two people are really interchangeable. Not really.

In this kind of environment, there are Teams for everything. There's a Team for requirements gathering. Another for design. Another for development. Another for documentation. Another for Q/A. All these groups are designed to be very good at their jobs, and individually, they are. But that doesn't alter the fact that the line of communication between the users and any one individual is very complex, and error-prone. It's like the school-kids game of "operator" - each kid whispering the word they heard to the next, and at the end of the class what comes out is often times not at all like what went in.

To get the users the very best application, every person in that complex system needs to be aware of what is going on in all the different groups. If they hear of something that should be told to another group, they need to be able to get that information to that group. Unfortunately, that's not how these groups typically work. The larger the group the less effective the communication. When in order to work, it needs to be just the opposite.

So while this seems like a good idea for development, it's never been really good at delivering a great product to the users. It can get useful stuff out there, but it's at the cost of time. This kind of structure runs very slowly.

The Tiny Shop - Jack-of-All-Trades Developer

One could think that the other end of the spectrum is the indie developer. Let's surround him with a few partners and call it the start-up or small business developer. This guy has to do everything. This includes doing the sales, marketing, support, requirements gathering, design, development, deployment, etc. There's just no one else to help. In my opinion, there's a lot to like about this situation, having been in it before - there's no one else to worry about dropping the ball. You have to understand the problem domain in order to write the system, but that means you have to really understand your customers - never a bad thing. You have to be able to balance the infrastructure "cool" with the practical and the user-interface - it has to perform acceptably, but it's got to look nice as well. You have to be good at almost everything in the pipeline.

There are plenty of downsides to the person that's a little weak in one or more of these areas. If you're horrible at UIs, then you're going to be very uncomfortable with the fact that there's no one else to lean on for a UI for your back-end. The same would be true for sales or support or domain knowledge. If you're not willing to come up to speed on these areas - or shop them out to someone who is, then you're going to be uncomfortable. But for those people that are used to this, it represents a wonderfully freeing opportunity.

You can write your own code because you understand the domain. Be it a drawing app, a photography app, a simulation of some kind, or something as focused as a cellular image processing app. If you understand the domain, and can code, this model really allows you to control the entire project - much like the old masters painters. They sat in a room, conceived of a painting and then did it. Period. There's a lot to be said for those that can do this, to enjoy this more than working as a single member of a much larger team.

But it's not without risks as you're only as good as your weakest link, and if you're doing it all, your product is only as good as your weakest subject. This isn't for everyone, that's for sure. But it's something I've had experience with, and found very satisfying.

The Partnership - A Hybrid Approach

In engineering, there's always the continuous spectrum where an optimization is done to find the most effective solution to the problem. Given that this is my background, I have to look at this same problem with this same bias. Where is the most effective balance?

My current thinking is that the best balance is a partnership with the right partner. You need to complement each other. I know how important this is as I've been in partnerships where this wasn't the case, and it ended horribly. You have to be willing to take control and take over for your partner when they are down, and likewise, you have to be able to trust your partner to do the same for you.

This doesn't mean that you need to identical skill sets, or even complementary ones. It's enough to overlap in some areas and be weak in others. It's part of the dynamics of the partnership. Have someone to lean on, but not someone that's going to ask you where the cover letter is for your TPS Report.

While I think there is value in a larger organization, and there's considerable freedom in the indie developer, an appropriate balance of the two is really where you have to live. If I had a bunch of money and never needed to make another dime, I'd be an indie developer and that's it. But if I need to actually sell something to someone, I think I'm shooting for the partnership.