Bean 3.2.1 is Out

July 8th, 2009

Bean.jpg

This morning I saw that Bean 2.3.1 was released with the one minor bugfix of:

  • fixed UI glitch: Bean Preferences > Style > Line Spacing now assigns line spacing correctly (user reported)

which could be a pain, but it hasn't been an issue for me - yet. In any case, it's nice that they are responding to issues from users, and I got the update.

VLC 1.0.0 is Finally Released

July 8th, 2009

VLC.jpg

After a great deal of work, the VideoLAN folks have finally released VLC 1.0.0 and (of course) I got it and updated my copy on my MacBook Pro. While it's a nice player, the biggest reason I have this is to use Handbrake which now requires VLC if you're going to rip DVDs - which is the reason for having Handbrake in the first place.

I haven't dug into the release notes (primarily because I can't find them on the web site), but I'm sure they've added things since the last version. But the biggie is that it's final, and Handbrake uses it.

The Wildest Database Setup I’ve Seen

July 7th, 2009

database.jpg

I love my job, I really do. This place has the nicest people I've worked with in a long time. It's great. But it's not perfect. Case in point: I was working on trying to figure out a production problem yesterday where a few INSERT statements into a MS SQL Server database was throwing up exceptions about primary key violation and this, in turn, was causing SELECT statements to fail.

I can't blame this place for MS SQL Server's problem of locking out the SELECT statements when it's upset about primary key violations on INSERT statements. Face it - the database should just fail the transaction and then go on about it's business. There's no need to have locks that are going to gum up the works for SELECT statements. That's Microsoft's fault.

But the problem that really led to this was the fact that I had part of a primary key was 'PHL' and another row had 'phl'. Now, to every other database I've ever used these are distinct values. The datatype is a simple varchar(16), and it's always been unique to me. But not this database.

No, it was a design choice to make all keys (primary and foreign) as well as indexes to be case insensitive. Amazing. This would be OK if they forced all the varchar data to be stored upper-case, but they don't, and it isn't. Which means that every stored procedure or client code needs to deal with converting the data coming out to the proper case. Again, possible, but why?

The closest thing I got to an answer was that historically, this matches the way the data was handled in the flagship app from years gone by. OK, I can possibly see that, but not really. If you're going to invest in a serious relational database, then why on earth tie it's hands with something like case-insensative keys?

I've put code into the applications that deal with the database to make sure that things are all uppercased, but it's still a potential problem for me until I get this code through Q/A and out into production.

PHP 5.3.0 final Available from Marc L’s Site

July 7th, 2009

WebDevel.jpg

Marc Liyanage has once again published a build of PHP - this time 5.3.0 final, and it's a great little way to include it on a stock Mac. I've been using this guy's builds of PHP and PostgreSQL for years, and I've always been happy with the packaging he's done. It installs and works, how can you beat that?

[7/8] UPDATE: Marc updated the package with a different MySQL driver - supposedly a better one, so I got that and installed it as well. Good enough for me.

[7/13] UPDATE: Marc updated the package with a fixed PDFlib - the previous one was broken, so I got that and installed it as well. Good enough.

Firebug Update Available within FireFox 3.5

July 7th, 2009

Firefox3.5.jpg

With the new release of FireFox 3.5, the plugin authors have been working to get their code to be compatible with the new release, and this morning I noticed that Firebug had an update. I use this at work to look into the failing JavaScript code I (sometimes) write and be able to see what's really happening. Excellent tool.

Staycation Day 4 – GoCarts and Putt-Putt

July 6th, 2009

Beach.jpg

For the last day of the Staycation, we had planned to go to the Indiana Dunes, but when we got up today the weather looked like it wasn't going to cooperate. If it's 82, then the water will be colder, and no one is going to have fun in freezing cold Lake Michigan water. So we decided to go to a local place and ride a few GoCarts and play a little Putt-Putt.

As it turned out, it got up to 92! So much for good weather predictions.

But we had a lot of fun on the GoCarts, and a good bit of fun on Putt-Putt. Nina doesn't like not doing something really well, and so when she wasn't hitting it in the cup in one or two strokes, she got a little nasty. Face it, she's 10, and used to being able to do what she wants to do. But life isn't always like that. Lesson learned.

We then went home, plated a few games, and called it a Staycation.

Liza and I learned a lot about our family and vacations, and that's good.

  • Get out of town - Joseph is just going to text his friends, and when you go home all the problems of home come to the forefront. Gotta get out of town.
  • Do more, little things - the days were full, but fun. Keep it up.
  • Don't allow the kids to feel too comfortable - keeping them out of their element allows them to bond with each other. That's great.
    • So long as we carry these lessons forward, it'll be OK.

Staycation Day 3 – Brunch and Naperville RibFest

July 5th, 2009

Beach.jpg

Today we went to downtown Naperville for a nice brunch at Flat Top Grill and then walked around the downtown area for a while. We enjoy the downtown, and we stopped in to talk to our friends at the running store, and looked in on the newly moved 'Two Bostons' pet "stuff" store. Very fun.

We had tickets for RibFest, and were hoping to see Hewey Lewis and The News in concert, but the place was totally packed. We walked around for about 45 minutes trying to find a place to sit on the grass, and there simply was none. Liza and I were stunned because when we came to see KC and the Sunshine Band several years ago, there was an entirely different layout of seating in front of the main stage. They have literally cut it by 75%.

We were bummed, but we decided to try and make the best of it while we were there. It was a nice night, but not what we had hoped for.

Staycation Day 2 – Magnificent Mile and Blue Man Group

July 4th, 2009

Beach.jpg

Today we went downtown Chicago to do a little fun shopping at the Magnificent Mile and then take in a show - hoe metropolitan! I got to go into the Apple Store - very impressive. We went to the Hershey's Store and listened to a few street musicians. It was a lot of fun.

Had it not been for the rain.

Yeah, it was chilly and rainy, but that didn't damper our spirits too much. It was great seeing the sights for a little bit. Then it was time to go see the Blue Man Group. What a show! I really enjoyed it, and realized that we don't take the kids to enough theatre and we need to. I was lucky to see about a show a year when I was their age, and we need to see more than one every couple of years.

If you get a chance to see it, do see it. You'll be glad you did.

Staycation Day 1 – WaterPark and Ball Game

July 3rd, 2009

Beach.jpg

Today starts the wonderful three-day July 4th weekend that we're turning into a nice 4-day weekend that is going to be our "Staycation" for the Summer of 2009. The kids are busy, Liza is busy, and there isn't a lot of time to take a big week-long vacation, so we're doing things around the area and having a lot of fun.

Today was the Water Park and a great Kane Count Cougars ball game. It was a decent time at the water park - a little chilly for my tastes, but the kids liked it plenty. Liza didn't get a toe in the water all day.

The Cougars played the Peoria Chiefs - the AAA Farm Team for the Cubs. Turned out that A. Ramirez was playing that night and the KCC had a 9-year high attendance of over 14,000! It was a good game, the Chiefs won, but it was the three errors on the Cougars that really was the reason.

After the game, they had a great fireworks display there. It was directly overhead. We lay back in the grass and looked up at the fireworks. It was amazing. We felt like we could reach out and touch them. Fantastic night.

Fantastic Double-Buffering of the AnnotatedTimeLine

July 2nd, 2009

GoogleVisualization.jpg

I've been working within the limitations of the AnnotatedTimeLine graph from the Google Visualization API set and have just been telling my users that the unfortunate "flash" to white of the graph while it's updating data is an unfortunate reality of the AnnotatedTimeLine, and that Google knows this is in issue and they are working on it.

Then I read an interesting post to the mailing list about how Google Finance didn't have this issue, and it got me thinking... How could they get around the flash? And in the show this morning, it hit me: Double-Buffering.

Simply have two graphs - one aligned in the z-axis behind the other. In fact, make them have the same coordinates, but just vary the zIndex value to "flip" them one in front of the other. Then, always draw to the rear (invisible) graph and when it's done, flip it to the front by setting sIndex to 49 on it, and setting zIndex to 0 on the one that was in front.

A simple use of an array of two graphs accomplishes this quite easily. I add in two variables - the index values for "foreground" and "background", and then you always draw to chart[bg] and so on. It's very clean and slick. The change of the z-axis values is done in the blink of an eye, it's very hard to see. Compared to the 3 to 6 seconds that the redraw used to take, it's nothing short of amazing.

In a very simplistic form:

  var chart = [];
  var fg = 0;
  var bg = 1;

and then in my initialization code, called from the Goolge setOnLoadCallback() method, I have:

  chart[0] = new google.visualization.AnnotatedTimeLine(chartDiv[0]);
  chart[1] = new google.visualization.AnnotatedTimeLine(chartDiv[1]);
  // tie us into the events for these guys
  google.visualization.events.addListener(chart[0], 'ready', graphReady);
  google.visualization.events.addListener(chart[1], 'ready', graphReady);

and then when I need to draw to the correct graph, I simply call:

  chart[bg].draw(graphData, chartParams);

When the graph is done drawing, I'll get a call to:

  function graphReady() {
    //swap the graphs quickly
    chartDiv[fg].style.zIndex = '0';
    chartDiv[bg].style.zIndex = '49';
    // now swap what we mean by back and front
    if (fg == 0) {
      fg = 1;
      bg = 0;
    } else {
      fg = 0;
      bg = 1;
    }
  }

There's a lot of the details I've left out because they don't really matter. The point is that you have to place them on top of each other, and then do this double-buffering. It's pretty nice.