Saturday, February 24, 2007

In the Land Down Under

After a really long Tuesday (up at 6 am, a one-hour afternoon flight to Calgary, a three-hour evening flight to Los Angeles, and a fourteen-hour overnight flight to Sydney), I arrived in beautiful, warm Australia Thursday morning. Craig Bailey was at the airport to pick up me and Rick Schummer, whose flight arrived an hour before mine, and take us to the hotel. After a shower and a change of clothes, the three of us took a train across the Sydney Harbor Bridge to the Central Business District (CBD), Sydney's downtown area. We went to the top of the Sydney Tower for some incredible views of the city and harbor area:

We then walked a bit around the downtown area and made our way to the Circular Quay area, home to ferries (with destinations throughout the harbor), the world-famous Sydney Opera House, and The Rocks, a wonderfully preserved section of the oldest part of Sydney (Craig is on the left and Rick on the right):

The Queen Elizabeth 2, one of the largest passenger ships in the world, was docked in the harbor, and in fact left Sydney while we dined at Doyle's, a fabulous seafood restaurant located right beside where the ship was docked, that evening:

Rick and I were both pretty jet-lagged after dinner, so we called it an early night; I was asleep by 9 pm.

Of course, I was up the next day at 5 am. I spent a few hours catching up on email, then Rick and I caught a train to Circular Quay and book a ferry to Taronga Zoo. We found a great visitor information center, probably the best one I've ever seen, in The Rocks area while waiting for the ferry. Taronga Zoo is an incredible zoo, easily as beautiful as the San Diego Zoo, but with an even better location, as I'm sure you'll agree from this picture taken from the zoo looking back to the Sydney Harbor:

Here's a picture of one of the many koalas:

Here's Rick with a very friendly wallaby (similar to a kangaroo but smaller):

After spending a few hours at the zoo, we caught the ferry back to Circular Quay, but via Watson's Bay, so we got a great view of the entire harbor, including getting caught in the middle of a sailboat race (one sailboat missed us by only a few feet!).

We then caught the train to the Olympic Park, where the 2000 Olympic Games were held. The park is used daily for a wide variety of activities, including concerts, conferences and trade shows, and athletic training. The Aquatic Center was amazing; this picture is of just part of it:

We headed back to the CBD and after a futile search through The Rocks for a Thai restaurant, had dinner at a Chinese restaurant and called it a night.

Saturday we had to get up early, which hasn't been a problem at all so far given the jet lag, and joined a tour group going to the Blue Mountains. The Blue Mountains are similar to the Grand Canyon, only lush and green (and blue, which comes from vaporized eucalyptus oil from the million of eucalyptus trees). I didn't take a lot of pictures there because I went there after OzFox 2004, but Rick did, and I'm sure he'll post some on his blog. After a hour going down the world's steepest railway, wandering in the rainforest, and back up a cable car, the bus took a long, winding, and somewhat white-knuckle road to Jenolan Caves. After a quick lunch, especially for Rick, whose food seemed to take forever to be served, we join the Lucas Cave tour. It was an amazing 90 minutes lead by a very knowledgeable and fun guide named Ian. Here are a couple of pictures:

After a long ride back to Sydney, Rick and I had some very good Greek food (after yet another fruitless search for Thai!) and headed back to our hotel.
We had three fabulous days of sightseeing, but now it's time to get to work; OzFox starts today (Sunday), so Rick and I went over our keynote this morning and tested our laptops with the projector. I also went over my sessions one last time and now it's time to meet the attendees and start the conference.

Tuesday, February 20, 2007

My New Toy -- Followup

My new system is all set up and ready to go to OzFox. It's way faster than my old system, Vista is fun and attractive, and you can't beat a 17" widescreen display. I even hooked up my 20" LCD monitor, which was the main display when my old laptop was docked, as a second monitor. I very quickly got used to having 3500 horizontal pixels to work with!

Some of the work in setting up the new system had nothing to do with the new system; it was fixing file paths. I had C: and D: partitions on my old system, with only system files on C: and everything else, including applications, on D:. The logic was that if I needed to rebuild my system, I'd reinstall the operating system on C: but all of my files on D: would be untouched. Of course, I never ended up doing that, and had to live with a relatively small C: partition which required me to clean up every year or so to eliminate out of disk space errors. I decided to stick with a single partition on the new system and put all of the non-application files from the former D: partition into one folder hierarchy so all the relative paths would stay the same. Of course, absolute paths are different, so it took me a while to go through all of my projects, locating all of the files from places like the VFP home directory and FFC folder, and fixing paths to include files in various places.

The other thing that took a while that I wasn't expecting is changing from using Outlook for calendar, Outlook Express for email, and FeedDemon for RSS feeds to using Outlook 2007 for all of that. The hardest part was getting messages out of Outlook Express and into Outlook. There may be an easier way, but I didn't find it after a couple of hours of dorking around. I ended up exporting from Outlook Express and importing into Outlook on the old system, then exporting from that Outlook and importing into Outlook on the new system. I really like Outlook 2007 and don't know why I stuck with Outlook Express for so long.

The only slight glitch so far is that Dell installs a cut-down version of Roxio for CD and DVD burning. One of the drivers that comes with Roxio, the Sonic Solutions DLA driver, isn't compatible with Vista, so at startup, a "this driver is blocked due to compatibility issues" alert comes up, followed by a Program Compatibility Assistant dialog. Clicking OK once is bad enough, but for some reason, the alert and dialog would come up seven times on system start. Even worse, if I stuck a DVD in the drive, the alert/dialog combination would come up continuously until I removed the disc. This quickly became a huge PITA.

Fortunately, Google helped me find the solution at It does require a couple of restarts, but 10 minutes later, I'm good to go.

Friday, February 09, 2007

My New Toy

Now that Windows Vista is officially shipping, I decided it was time for a new laptop. It arrived yesterday, so I'm both excited (woohoo, a new toy!) and chagrined (goodbye three days of my life while I get this sucker set up). It's a Dell Inspiron 9400 loaded with:
  • Intel Core 2 Duo T7200 2.0 GHz processor
  • 17" widescreen WUXGA display with 256 MB ATI Radeon video card
  • 2 GB (667 MHz) RAM
  • 100 GB 7200 RPM drive
  • DVD burner
  • SD card reader and a bazillion other ports
  • Two 9-cell batteries
  • Vista Business
  • Some junk I don't want but Dell feels is necessary to install, like Norton Internet Security one-month trial subscription

I've been playing with Vista on my home system (which is also relatively new; I replaced my aging Compaq with a new Dell desktop a couple of months ago) for about a month and like it a lot (the subject of another posting).

I'm very anal about setting up a new system (those of you who know me would suggest I'm anal about everything), so I spent a couple of hours this morning documenting in great detail exactly how I'm going to set up the new system, with special attention to what comes off my old system and onto my new one. It isn't as easy as you think; obviously, I can simply move files from one to the other, but what about all of the little settings you've configured over the years, like:

  • Browser favorites
  • Demo themes
  • Windows Explorer settings, like whether to display file extensions (yes) and show hidden files (yes)
  • Desktop and Taskbar customization
  • Network and printer settings
  • File associations (I like to associate DLL and OCX files with RegSvr32 so I can just double-click to register them)

and a hundred others. Fortunately, I've been mostly documenting system customization as I go, so I just needed to update the document and go over the various folders on my old system to decide what to move, what to throw away, and what to archive and not move.

I'm also breaking Rick Schummer's law (which I adopted years ago) of never installing or otherwise changing your system a month before a conference. I'm planning on taking the new laptop to OzFox, which is only a couple of weeks away, and you can't get much more "changish" than to replace the whole freakin' system. Normally, I wouldn't do anything so foolhardy, but Rick and I are doing the keynote, part of which is to show the very cool Vista Toolkit Craig Boyd has been working on for Sedna, and it's kind of hard to show it without Vista. However, I do have a couple of ideas to make this work:

  • Test the hell out of the new machine, including every part of every presentation (which I would normally do anyway just before a conference) and how it works with a projector.
  • Bring my old laptop as well as the new one just in case.

After I finished the documentation, I started the actual configuration stuff. I had some trouble connecting to our domain until I remembered about that #%$^$ Norton Internet Security; disabling it took care of that. I then did all of the other settings stuff and started on the file transfer.

I'm copying files from the old one (which I'm typing this on) to the new one right now; the progress meter says it'll take another 5 hours (yikes, there are 73,063 files to copy), so I guess it's Miller time a little early today. Tomorrow, the really boring job starts: installing all the applications I need. I don't have 100 apps like Rick -- in fact, I have exactly 45 (thus proving the anal attribute) -- but it'll still take a couple of days because some of them, including SQL Server, Office, and Visual Studio, are real heavyweights.

No pain, no gain -- I'm really looking forward to getting this done so I can play with my new toy.

Friday, February 02, 2007

Creating Gradient Images the Fast and Easy Way

I've been trying to spiff up some forms lately. One way to make an attractive form is to use some graphic elements. I particularly like gradient images, as illustrated in this screen shot (the gradient appears banded in this image but not in the actual form):

So, how to create a gradient image of the desired size and color? Although I could do it dynamically using the VFPX GDIPlusX library as described by Cesar Chalom in various posting on his excellent blog, I decided to simply create an image file and use it as the Picture property of an Image object.

With some help from Cesar's blog, I created a simple program, CreateGradient.PRG, that generates a gradient image with the specified file name, size, and colors. The code is self-explanatory. Note that it expects the GDIPlusX class libraries are in the VFP path.
lparameters tcFileName, ;
tnHeight, ;
tnWidth, ;
tnColor1, ;
local lnColor1, ;
lnColor2, ;
lnMode, ;
lnFormat, ;
loSystem, ;
lcExt, ;
loBitmap, ;
loRect, ;
loGfx, ;

* Ensure the parameters were passed.

if vartype(tcFileName) <> 'C' or empty(tcFileName) or ;
vartype(tnHeight) <> 'N' or vartype(tnWidth) <> 'N'
error 11
return .F.
endif vartype(tcFileName) <> 'C' ...

* If colors weren't passed, prompt for them.

if pcount() < 4
lnColor2 = getcolor(rgb( 0, 128, 255))
lnColor1 = getcolor(rgb(255, 255, 255))
lnColor1 = tnColor1
lnColor2 = tnColor2
endif pcount() < 4

* This assumes a horizontal gradient. Set lnMode to a different
* value for other types.

lnMode = 0

* Create a GDIPlusX System object.

loSystem = newobject('xfcSystem', 'System.vcx')
with loSystem.Drawing

* Determine the image type from the file extension.

lcExt = upper(justext(tcFileName))
do case
case lcExt = 'PNG'
lnFormat = .Imaging.ImageFormat.Png
case lcExt = 'BMP'
lnFormat = .Imaging.ImageFormat.Bmp
case lcExt = 'GIF'
lnFormat = .Imaging.ImageFormat.Gif
case inlist(lcExt, 'JPG', 'JPEG')
lnFormat = .Imaging.ImageFormat.Jpeg
case lcExt = 'ICO'
lnFormat = .Imaging.ImageFormat.Icon
case inlist(lcExt, 'TIF', 'TIFF')
lnFormat = .Imaging.ImageFormat.Tiff
case lcExt = 'WMF'
lnFormat = .Imaging.ImageFormat.Wmf
error 11
return .F.

* Create a bitmap and a rectangle of the desired size.

loBitmap = .Bitmap.New(tnWidth, tnHeight)
loRect = .Rectangle.New(0, 0, tnWidth, tnHeight)

* Create a graphics object.

loGfx = .Graphics.FromImage(loBitmap)

* Create a linear gradient brush.

loGradBrush = .Drawing2D.LinearGradientBrush.New(loRect, ;
.Color.FromRgb(lnColor1), .Color.FromRgb(lnColor2), lnMode)

* Fill the rectangle with the gradient brush.

loGfx.FillRectangle(loGradBrush, loRect)

* Save the image to the specified file.

loBitmap.Save(tcFileName, lnFormat)
Thanks to Craig Boyd, Bo Durban, and Cesar for all the work they've done on this incredible library!

Conferences, Conferences, and More Conferences

I'm going to have a very hectic schedule starting later this month. I'm going to three conferences in four weeks (speaking at two of them), then another two in two weeks in May. Here's the schedule:

OzFox 2007: Feb 20 - 28 (the conference isn't that long but I'm taking a few days for sightseeing). I'm doing three presentations at this conference (see the conference Web site for details).

Home for 2 days (just enough time for jet lag to really set in!)

Synergy 2007: Mar 3 - 6. This conference is for AccountMate resellers. I'm doing a presentation on Stonefield Query for AccountMate plus Jeff Zinnert and I have a booth there.

Home for 5 days

MVP Summit: Mar 12 - 15. Fortunately, no presentation, but it'll be great meeting with the VFP team again.

Home for 6 weeks or so (whew!)

Advisor DevCon on Microsoft Visual FoxPro: May 5 - 11. Jeff and I will have a booth plus I'm doing four sessions:
  • Developing Visual FoxPro Applications for Windows Vista
  • Best Practices for Vertical Application Development
  • Installing Visual FoxPro Applications Using InnoSetup
  • Integrate RSS and Visual FoxPro
Home for 2 days

Sage Insights: May 14 - 17 (although I'll likely stretch this because it's in Orlando and we're planning a family vacation around the conference). It's the annual conference for resellers of Sage Software. We'll have a 10 x 20 booth with my business partner Mickey Kupchyk and Stonefield Query National Account Managers Jeff Zinnert and Chris Hodgins, showing the following products:
  • Stonefield Query for SalesLogix
  • Stonefield Query for ACT!
  • Stonefield Query for Timberline (a new product we'll be launching at the conference)
  • Stonefield Query for Simply Accounting
  • ACCPAC Query for Sage Accpac ERP
  • ACCPAC Query for Sage Pro ERP
  • ACCPAC Query for Sage BusinessVision (another new product)
  • Stonefield Query SDK for resellers wanting to customize one of the other products
Having eight products to show will keep us hopping. Plus, I'm doing a presentation called "ACCPAC Query: Empowering Partners to Deliver a Customized Reporting Solution," which shows Sage business partners how they can use the SDK to customize ACCPAC Query (also applicable to Stonefield Query) for their customers.

Wow! Five conferences in a span of about three months. I'll have a ton of air miles before summer even starts.