<?xml version="1.0" encoding="UTF-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Joel Leach</title><subtitle type="html">Focused on Visual FoxPro and related technologies</subtitle><id>http://weblogs.foxite.com/joel_leach/atom.aspx</id><link rel="alternate" type="text/html" href="http://weblogs.foxite.com/joel_leach/default.aspx" /><link rel="self" type="application/atom+xml" href="http://weblogs.foxite.com/joel_leach/atom.aspx" /><generator uri="http://communityserver.org" version="2.0.60217.2664">Community Server</generator><updated>2008-11-03T19:02:00Z</updated><entry><title>SW Fox 2009 Sunday</title><link rel="alternate" type="text/html" href="http://weblogs.foxite.com/joel_leach/archive/2009/10/21/9178.aspx" /><id>http://weblogs.foxite.com/joel_leach/archive/2009/10/21/9178.aspx</id><published>2009-10-21T18:55:00Z</published><updated>2009-10-21T18:55:00Z</updated><content type="html">Sunday rolled around, and I couldn't believe it was already the last day of the conference.&amp;nbsp; Sleep deprivation was starting to set in, and I had more sleep than most.&amp;nbsp; Still, I wasn't about to miss any sessions.&lt;br&gt;&lt;br&gt;&lt;b&gt;VFP and MySQL&lt;/b&gt;: &lt;b&gt;Case Study for Remote Data&lt;br&gt;&lt;/b&gt;Rick Schummer&lt;br&gt;&lt;br&gt;For the purposes of this session, "Remote Data" meant using a database server that resided anywhere, on a local server or out on the internet.&amp;nbsp; Rick started off with some client/server basics and the various ways you can access remote data from VFP.&amp;nbsp; It's common knowledge that SQL Passthrough is the fastest method for accessing remote data, or is it?&amp;nbsp; Rick showed that in some cases, remote views can actually be faster.&amp;nbsp; It depends on your scenario, and as VFP has improved, statements about performance that were true in previous versions may no longer be true.&amp;nbsp; So, you should test performance for yourself, rather than making assumptions based on past results or what you heard from someone else.&amp;nbsp; &lt;br&gt;&lt;br&gt;Rick then demonstrated connecting to a MySQL server hosted on GoDaddy.com for his site &lt;a href="http://www.blameitonrick.com"&gt;blameitonrick.com&lt;/a&gt;.&amp;nbsp; Even through a slow connection at the conference, performance was quite good.&amp;nbsp; An upsizing wizard for MySQL is available called Stru2MySQL_2.&lt;br&gt;&lt;br&gt;&lt;b&gt;Developing and Extending the Visual FoxPro Grid Object&lt;br&gt;&lt;/b&gt;Jody Meyer&lt;br&gt;&lt;br&gt;Jody is one of the excellent people I met at Southwest Fox this year.&amp;nbsp; This was Jody's first time speaking at a Fox conference, and she did a great job.&amp;nbsp; Her grid class is awesome, or "full of awesome" because nowadays awesome is apparently measured in quantity (get off my lawn!).&amp;nbsp; Anyway, it's good.&amp;nbsp; Not only does is make building grids a snap at development time, but you can give it to your customers to add/remove columns, sort, filter, export, slice, dice, and do pretty much anything you can do with a grid.&amp;nbsp; No more waiting for the next release to add a column to the grid.&amp;nbsp; They can do it right now.&amp;nbsp; Sweet.&lt;br&gt;&lt;br&gt;&lt;b&gt;Practical Uses for GDIPlusX&lt;/b&gt;&lt;br&gt;Doug Hennig&lt;br&gt;&lt;br&gt;Being the last regular session of the conference, I was hoping to see some cool stuff to keep me awake.&amp;nbsp; Doug did not disappoint.&amp;nbsp; After a brief introduction to GDIPlusX, Doug demonstrated several practical things you can use it for: scaling/rotating images, properly measuring text width/height, creating images from text and adding effects (shadows, etc.), fully justified text in reports, gradients, lightboxes, screenshots, etc.&lt;br&gt;&lt;br&gt;&lt;b&gt;Closing Session&lt;/b&gt;&lt;br&gt;Tamar Granor, Doug Hennig, Rick Schummer&lt;br&gt;&lt;br&gt;The closing session is usually brief at Southwest Fox.&amp;nbsp; There were some giveaways and Southwest Fox 2010 was announced.&amp;nbsp; One of the slides was titled "Fun, Fun, Fun", and Doug said this was the funnest conference ever.&amp;nbsp; For me, that was definitely true, and others have said the same thing.&amp;nbsp; That is in no small part because the Feltman's opened their suite to attendees, so special thanks to Mike and Toni for doing that.&amp;nbsp; &lt;br&gt;&lt;br&gt;The party was by no means over.&amp;nbsp; The speaker dinner was at room 709, after which attendees started to cycle in.&amp;nbsp; Since I didn't have an early flight, I hung out until about 3:00 AM.&amp;nbsp; Overall, I had a great time this year.&amp;nbsp; The Fox community is a tight-knit group, but it seems even tighter after this conference.&amp;nbsp; I can't wait until next year!&lt;br&gt;&lt;br&gt;&lt;img src="http://weblogs.foxite.com/aggbug.aspx?PostID=9178" width="1" height="1"&gt;</content><author><name>joel_leach</name><uri>http://weblogs.foxite.com/members/joel_leach.aspx</uri></author></entry><entry><title>SW Fox 2009 Saturday</title><link rel="alternate" type="text/html" href="http://weblogs.foxite.com/joel_leach/archive/2009/10/20/9173.aspx" /><id>http://weblogs.foxite.com/joel_leach/archive/2009/10/20/9173.aspx</id><published>2009-10-21T03:49:00Z</published><updated>2009-10-21T03:49:00Z</updated><content type="html">Saturday morning started off with three sessions on architectural/OOP topics, so I was looking forward to it.

&lt;br&gt;&lt;br&gt;&lt;b&gt;Data Driving Applications

&lt;/b&gt;&lt;br&gt;Toni M Feltman

&lt;br&gt;&lt;br&gt;Toni is another of my favorite speakers and I love her speaking style.  There have been previous sessions about using meta data in frameworks, but this session was more about refactoring legacy code (there’s that subject again) into data.  A real-world example she gave was code that ran for specific users.  The users were defined by an IF INLIST(“USER1”, “USER2”, etc.) command that was duplicated many times throughout the code.  If that sounds ridiculous, perhaps you have seen CASE statements that run custom code for specific clients.  The problem is the same: the users/customers are hard-coded into the app.  The first thing Toni did was pull the user list into a separate function.  This was easy and low risk, and when users changed, they only had to change the list in one place.  Later the user list was refactored into a table with the appropriate permissions.  Rather than have someone manually add all the users to the table, she did it right in the function and added users automatically with default permissions.  The session eventually led to creating memo fields where users could create their own code or expressions without having to touch the main EXE.  Another good session.

&lt;br&gt;&lt;br&gt;&lt;b&gt;Getting Your Head Around Business Objects

&lt;br&gt;&lt;/b&gt;Tamar E Granor
&lt;br&gt;&lt;br&gt;Business objects are a concept that can be hard to grasp.  All too often the technical benefits are highlighted of separating your code into tiers, but what makes it a “business” object?  Tamar asserted that the architectural benefit of consolidating your business rules into an appropriate place is more important than the technical benefits.  She talked about a fascinating project that used FoxPro to manage network hardware.  Since the interface was not tightly bound to data, it forced her to think about how code should be separated into business objects.  She then demonstrated the concepts using a Suduko game.  There were a lot of objects flying around, but there was a clear separation of concerns and it was interesting to see all the objects interact.  Tamar emphasized the idea that business objects are the “engine of your app”.

&lt;br&gt;&lt;br&gt;&lt;b&gt;Advanced Principles of Solid Object Oriented Design

&lt;/b&gt;&lt;br&gt;Alan Stevens&lt;br&gt;&lt;br&gt;This was originally going to be my last session of the conference, but being a “big idea” session, I knew it would be better if I tweaked KOKOPELLI to move it sooner before my brain was completely melted. J  SOLID is an acronym coined by Robert Martin for key OOP design concepts.  I won’t go into the details here, but Alan did a good job of driving home the ideas with both metaphors and code. 

 &lt;br&gt;&lt;br&gt;&lt;b&gt;FoxCharts - Great Looking, Modern Charts in Pure VFP Code

&lt;/b&gt;&lt;br&gt;Jim Nelson

&lt;br&gt;&lt;br&gt;All I can say is “Wow!”  I had no idea how far along this project had come.  Jim demonstrated some impressive charts and functionality, and it is all done in a FoxPro style.  FoxCharts is every bit as good as commercial options, if not better.
&lt;br&gt;&lt;br&gt;&lt;b&gt;Excelporting
&lt;/b&gt;&lt;br&gt;
Christof Wollenhaupt
&lt;br&gt;&lt;br&gt;One of the most popular tools for working with data is Excel, which is ironic considering it is not a database.  Nevertheless, our clients demand it and we provide.  VFP, of course, has built-in commands that make this a snap, but the result is not exactly presentation quality.  COM Automation can be used control the formatting and works pretty well, but it can be very slow.  Christof presented another option: XMLSS (XML Spreadsheet), a format introduced in Excel XP (a downloadable plug-in is available for Excel 2000).  It allows you control over formatting, but since it is just XML, you get VFP’s text handling speed.  There are limitations, but if you can work within them, the result is orders of magnitude faster than automation. 

&lt;br&gt;&lt;b&gt;&lt;br&gt;Microsoft Virtual PC for VFP Developers

&lt;/b&gt;&lt;br&gt;Doug Hennig
&lt;br&gt;&lt;br&gt;I have heard good things about virtual machines. I’ve never taken the time to try one, so I was ready to see the technology in action.  Doug presented Microsoft Virtual PC 2007, which is available for free.  As you might guess by the name, it runs an emulated PC inside a window on your desktop. It’s an emulated 32-bit machine with a hard drive, network card, sound card… the basics of what you expect in a typical computer.  That being the case, the answer to just about every “How would you do this or that in VPC?” question is “How would you do it on a standard computer?” When you boot up a VM for the first time, you install the OS, service packs, updates, anti-virus software, and any other applications you want. 

&lt;br&gt;&lt;br&gt;VM’s are good for testing software, testing installations, and isolating your development environment.  Basically, if you don’t want something screwing up your main Windows install, set up a VM and do it there.  VPC includes good tools for managing it all.  As always, Doug gave an excellent presentation, and now I can really see the value of using virtual machines.

&lt;br&gt;&lt;br&gt;&lt;b&gt;After Hours

&lt;/b&gt;&lt;br&gt;&lt;br&gt;Several speakers and attendees went go-cart racing at a local track.  I will let the winners gloat over their respective victories. :) Rather than embarrass myself on the track, I headed back to the room to get a little bit of work done and to post on this blog, with the intent of meeting everyone back at Club 709 after the races.  By the time 11:00 PM rolled around, I couldn’t keep my eyes open.  I wimped out and went to bed, but still a good day.
&lt;img src="http://weblogs.foxite.com/aggbug.aspx?PostID=9173" width="1" height="1"&gt;</content><author><name>joel_leach</name><uri>http://weblogs.foxite.com/members/joel_leach.aspx</uri></author></entry><entry><title>SW Fox 2009 Friday</title><link rel="alternate" type="text/html" href="http://weblogs.foxite.com/joel_leach/archive/2009/10/17/9148.aspx" /><id>http://weblogs.foxite.com/joel_leach/archive/2009/10/17/9148.aspx</id><published>2009-10-18T04:48:00Z</published><updated>2009-10-18T04:48:00Z</updated><content type="html">In spite of staying up too late, I woke up well before the alarm went off.  That's a common story at the conference as everyone tries to adjust to the time zone difference.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Open Source Tools&lt;/b&gt;&lt;br&gt;
Menachem Bazian&lt;br&gt;
&lt;br&gt;
I saw Menachem for the first time last year, and based on that, I knew this session would be both entertaining and informative, a good start to the day.  I was not disappointed.  The intent was to introduce several tools and overall to recognize how much good free and open source stuff is out there, just waiting for you to try it.  We looked at Notepad++, MantisBT (bug tracking), VirtualBox, and others.  Menachem has an obvious passion for open source, but he hasn't abandoned VFP and other Microsoft software out of spite.  He commonly connects VFP to MySQL databases.  He also was very clear that "free" tools still have a cost in terms of time and resources, and it may still make sense to pay for software that meets your needs.  It was a balanced discussion and I enjoyed it.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Enhancing the Visual FoxPro IDE with VFPX Tools&lt;/b&gt;&lt;br&gt;
Rick Schummer&lt;br&gt;
&lt;br&gt;
I knew this would be a good session.  Rick's passion for VFPx is contagious. This session was focused on VFPx tools for the IDE vs. things you would use in an application.  He showed ClassBrowserX, PEM Editor, FoxTabs, Tabbing Navigation, Control Renamer, ProjectHookX, and probably a few others I missed.  It is just insane how much Jim Nelson has done with the PEM Editor in a short time.  Tamar's Control Renamer does more than the name suggests, going through the source code and changing references to the old name, in effect becoming a refactoring tool.  In case your wondering how it felt to see my contribution (FoxTabs) being featured in front of an audience, the answer is PRETTY DAMN GOOD!  Get involved.  You won't regret it.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Top 10 (or more) Reasons to Use the VFP Toolbox&lt;/b&gt;&lt;br&gt;
Tamar E Granor&lt;br&gt;
&lt;br&gt;
I love Tamar's teaching style.  She has a way of making things so clear and easy to understand.  I admit I rarely use the toolbox.  I've been using the form controls toolbar for so long, it's hard to break the habit.  Besides, the toolbox is just a better controls toolbar made to look like the toolbox in Visual Studio, right?  Wrong!  There are so many cool features that help avoid all those little extra things you have to do and overall make your life easier, and you can use it right now.  If you aren't using the toolbox, take another look.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Simulating Multithreaded Processes in VFP&lt;/b&gt;&lt;br&gt;
Steve Ellenoff&lt;br&gt;
&lt;br&gt;
We have a project coming up where a dashboard type interface needs to update itself automatically in the background every few minutes without tying up the rest of the app, so this topic is definitely relevant.  Steve showed a couple of different techniques for simulating multi-threaded behavior.  The first involves using functionality already built into VFP: AutoYield, DoEvents, Sleep WinAPI, and Timers.  These are all things I have used before, but looking at them from a multi-threaded point of view revealed a better understanding of how they work. The second technique uses a separate EXE for running the long process while the main UI is completely responsive.  I heard Steve won the award for the longest white paper at 200 pages, so we have plenty of material to help us with the implementation. &lt;br&gt;
&lt;br&gt;
&lt;b&gt;Refactoring Legacy Code&lt;/b&gt;&lt;br&gt;
Paul Mrozowski&lt;br&gt;
&lt;br&gt;
Dealing with legacy code has been a common theme throughout the conference, evidence that both speakers and attendees are having to deal with projects written by someone else.  I enjoyed Paul's approach to the material, not academic at all, but he still got the concepts across.  I also appreciated the idea of taking small, low-risk steps to refactor the code, but making steady progress.  As with other discussions on refactoring, there was emphasis on testing.  Apparently, there is a whole discussion on "Unit Testing" vs. "Integration Testing".  Paul's response: "I don't care. Just test it."  My favorite quote of the session.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Bonus Session: VFPX Users Meeting&lt;/b&gt;&lt;br&gt;
&lt;br&gt;
This session was well attended by both VFPX project managers/coordinators and users.  There were several topics, but the main discussion centered around better deployment of VFPX files, and getting the word out to more Fox developers.  You can watch the meeting at &lt;a href="http://www.ustream.tv/channel/swfoxtv"&gt;http://www.ustream.tv/channel/swfoxtv&lt;/a&gt;. &lt;br&gt;
&lt;br&gt;
&lt;b&gt;Bonus Session: Stonefield Query Users Meeting&lt;/b&gt;&lt;br&gt;
&lt;br&gt;
Doug Hennig puts together a meeting every year to show off new and upcoming features of Stonefield Query, as well as take requests.  As an existing user, I like to go.  This is awesome software, and the features coming in version 4.0 are going to make things SO much easier for our customers.  If you have been considering a report writer, take a good look at Stonefield Query.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Club 709&lt;/b&gt;&lt;br&gt;
&lt;br&gt;
The party continued at the Feltman's for the second night and there were even more people this time.  It was good to see YAG there. I met a lot of cool people and had some good discussions.

&lt;img src="http://weblogs.foxite.com/aggbug.aspx?PostID=9148" width="1" height="1"&gt;</content><author><name>joel_leach</name><uri>http://weblogs.foxite.com/members/joel_leach.aspx</uri></author></entry><entry><title>SW Fox 2009 Keynote</title><link rel="alternate" type="text/html" href="http://weblogs.foxite.com/joel_leach/archive/2009/10/17/9147.aspx" /><id>http://weblogs.foxite.com/joel_leach/archive/2009/10/17/9147.aspx</id><published>2009-10-18T04:12:00Z</published><updated>2009-10-18T04:12:00Z</updated><content type="html">The keynote is always a major highlight.  This year was a bit of a departure from previous SW Fox conferences.  A well known person from outside of the FoxPro community was brought in to deliver the keynote: Sara Ford.  Well, Sara isn't completely outside.  She works on Microsoft's Codeplex web site and worked closely with members of the Fox community to host VFPx, one of the first projects on Codeplex.  You can watch the keynote and other SW Fox videos at &lt;a href="http://www.ustream.tv/channel/swfoxtv"&gt;http://www.ustream.tv/channel/swfoxtv&lt;/a&gt;. &lt;br&gt;
&lt;br&gt;
Attendance this year is 88 attendees and 17 speakers.  That's a drop from last year, but most conferences have dropped due to the economy.  It doesn't feel much smaller to me.&lt;br&gt;
&lt;br&gt;
The keynote was followed by a trade reception.  Sorry vendors, I was too busy talking to the cool folks at the conference to visit the booths.  Maybe later in the conference.&lt;br&gt;
&lt;br&gt;
The party continued at Club 709 (a.k.a the Feltman suite), just hanging out with Sara Ford and other attendees.  It was a lot of fun.  I stayed til almost midnight (2AM to me), but I couldn't hang with the rest of the veterans.  I think I'm going to pay for this...
&lt;img src="http://weblogs.foxite.com/aggbug.aspx?PostID=9147" width="1" height="1"&gt;</content><author><name>joel_leach</name><uri>http://weblogs.foxite.com/members/joel_leach.aspx</uri></author></entry><entry><title>SW Fox 2009 Pre-conference</title><link rel="alternate" type="text/html" href="http://weblogs.foxite.com/joel_leach/archive/2009/10/15/9134.aspx" /><id>http://weblogs.foxite.com/joel_leach/archive/2009/10/15/9134.aspx</id><published>2009-10-15T21:27:00Z</published><updated>2009-10-15T21:27:00Z</updated><content type="html">I arrived in Phoenix yesterday (Wednesday) and had no problems getting to the Arizona Golf Resort or getting checked in.  There will probably be some late nights later in the conference, so I made sure to get plenty of rest before.&lt;br&gt;
&lt;br&gt;
One of the new features this year is free wireless throughout the hotel.  The connection is excellent in the conference facilities, but not so great in my room.  It brings back bad memories of the dial-up days (if I get a connection at all), and there is no longer a wired option.  Getting any work done over the internet is a challenge.&lt;br&gt;
&lt;br&gt;
On the plus side, using a laptop during sessions is easy.  At previous conferences, I used pen &amp; paper to take notes in the conference binder, and after the conference, that’s where they stayed.  This year, I decided to try taking notes on the laptop, with the hopes that I will get more use out of them afterwards.  So far, it’s working great.  The organizers have made plenty of power strips available and easily accessible.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Break it Down: Dealing with Legacy Code&lt;/b&gt;&lt;br&gt;
&lt;br&gt;
I attended Alan Stevens' pre-conference seminar.  Alan is a self-proclaimed “enthusiast”, and I have to agree.  He obviously has a passion for what he speaks about, and it makes for a good session.  I enjoyed it.&lt;br&gt;
&lt;br&gt;
I chose this session because I deal with legacy code every day.  One thing I have to think about every time we make a change is the risk of breaking something.  So, I was glad that testing was a major focus during the discussion, but skeptical at the same time.  Discussions about unit testing in the past have fallen apart when you start talking about data.  In my app, I don’t need to know if a coffee pot turns on and off, I need to know that the data is accurate after a process is run.  “That’s not unit testing, that’s acceptance testing.” “That’s integration testing.” “Unit tests should never touch data.”  Never touch the data?  I’m a FoxPro programmer.  It’s all about the data!  Needless to say, I didn’t walk away with a good feeling about unit testing.  I figured it was good for testing framework code, but not real-world business rules.&lt;br&gt;
&lt;br&gt;
Things are clearer this time around, and we have better ideas for unit testing in FoxPro than a few years ago.  Alan demonstrated testing code that adds records to a table (yes, data!) using FoxUnit.  In the test setup, he created temporary cursors to house the data then ran the code to be tested.  Afterwards, he ran a couple of SQL statements and verified those contained the expected values.  Using temporary cursors ensures a clean set of data, but I don’t think that is an absolute necessity.  It may be difficult to do if using a framework (commercial or otherwise) that expects real data, but the important thing is to make sure the data is clean and isolated from other processes that may affect the results of the test.  In any case, I certainly walked away with some new ideas for how we can approach automated testing, so the session was worthwhile.&lt;br&gt;
&lt;br&gt;
Next up is the keynote tonight.  I’m looking forward to it.&lt;img src="http://weblogs.foxite.com/aggbug.aspx?PostID=9134" width="1" height="1"&gt;</content><author><name>joel_leach</name><uri>http://weblogs.foxite.com/members/joel_leach.aspx</uri></author></entry><entry><title>Ready for Southwest Fox 2009</title><link rel="alternate" type="text/html" href="http://weblogs.foxite.com/joel_leach/archive/2009/10/13/9123.aspx" /><id>http://weblogs.foxite.com/joel_leach/archive/2009/10/13/9123.aspx</id><published>2009-10-13T20:38:00Z</published><updated>2009-10-13T20:38:00Z</updated><content type="html">I don't know about you, but for me, this has been a stressful year.&amp;nbsp; The economic situation has had some effect financially, but even more than that, I noticed our users are under more pressure than before.&amp;nbsp; In turn, they are more demanding of us, which equals more stress.&amp;nbsp; After a long day of work, the last thing I feel like doing is writing code.&amp;nbsp; My Fox tank is on empty and there hasn't been activity lately here or on the FoxTabs project.&lt;br&gt;&lt;br&gt;So, I was pleasantly surprised to find out my boss is sending me to the Southwest Fox conference.&amp;nbsp; I didn't expect to go this year, and I'm really looking forward to it.&amp;nbsp; It gives me a boost every time, and this year looks to be no exception.&amp;nbsp; As usual, there are so many good sessions and speakers, I can't possibly see every session I want, but that's a good problem.&lt;br&gt;&lt;br&gt;My first conference was the 2001 Advisor DevCon in San Diego.&amp;nbsp; One thing I liked about that conference were the many sessions on architectural subjects like OOP, n-Tier, Design Patterns, Refactoring, etc.&amp;nbsp; I had a lot of "aha" moments at that DevCon.&amp;nbsp; Since then, the focus turned to .NET, especially at the Advisor conferences, and I put "Need More OOP" on the conference eval ever year.&amp;nbsp; This year, not a problem.&amp;nbsp; There are sessions on refactoring, data-driven architecture, business objects, and advanced OOP design.&amp;nbsp; Let the noodle baking commence!&lt;br&gt;&lt;br&gt;My Fox tank is refilling already. :)&lt;br&gt;&lt;br&gt;&lt;a href="http://www.swfox.net"&gt;www.swfox.net&lt;/a&gt;&lt;br&gt;&lt;img src="http://weblogs.foxite.com/aggbug.aspx?PostID=9123" width="1" height="1"&gt;</content><author><name>joel_leach</name><uri>http://weblogs.foxite.com/members/joel_leach.aspx</uri></author></entry><entry><title>The End of 16-bit</title><link rel="alternate" type="text/html" href="http://weblogs.foxite.com/joel_leach/archive/2009/03/26/7997.aspx" /><id>http://weblogs.foxite.com/joel_leach/archive/2009/03/26/7997.aspx</id><published>2009-03-26T17:44:00Z</published><updated>2009-03-26T17:44:00Z</updated><content type="html">As you may have heard, 16-bit applications do not run on 64-bit
versions of Windows.&amp;nbsp; The translation for Fox developers is that
neither the DOS nor Windows versions of FoxPro 2.x (and earlier) will
run on Windows Vista x64.&amp;nbsp; In fact, DOS does not exist at all under
64-bit.&amp;nbsp; Select Start-&amp;gt;Run, enter &lt;b&gt;command&lt;/b&gt; on Vista 32-bit,
and you are greeted with a "Microsoft Windows DOS" command window.&amp;nbsp; Do
the same on Vista 64-bit and you'll get an error that it does not
exist.&amp;nbsp; (NOTE: &lt;b&gt;cmd&lt;/b&gt; is the Windows command-line and it still
works, and though similar to DOS, it is not.)&amp;nbsp; Microsoft's ability to
claim "VisiCalc still runs" is coming to a close.&lt;br&gt;&lt;br&gt;So what?&amp;nbsp;
There's not any demand for 64-bit on the desktop, and certainly not
like there was for 32-bit.&amp;nbsp; That's true from a software point of view,
but looking at hardware, any new computer with 4GB or more of RAM is
going to ship with Vista x64, and that is becoming more commonplace.&amp;nbsp;
By this time next year, the default installation for most new computers
may be Windows 7 x64, and you'll have to request 32-bit.&lt;br&gt;&lt;br&gt;The
obvious solution is to do just that and buy 32-bit Windows.&amp;nbsp; Of course,
you aren't going to receive a call from your client until &lt;i&gt;after&lt;/i&gt;
they buy the machine, and wiping the machine may not be a good option.&amp;nbsp;
You could use Virtual PC or other virtualization software to install
32-bit Windows on top of the x64 version and run the app inside that
environment indefinitely.&amp;nbsp; I think that will be a common choice.&amp;nbsp; If
you're lucky, maybe the client will realize it's finally time to get
off of DOS/Windows 3.x and upgrade the app.&amp;nbsp; Unless a complete rewrite
is in order, the easiest and cheapest path will be to use VFP 9, which
works just fine on 64-bit Windows.&lt;br&gt;&lt;br&gt;Can we use the lifetime of
16-bit computing to predict the lifetime of 32-bit?&amp;nbsp; Not really, but
let's do it anyway :).&amp;nbsp; It's hard to pinpoint the "beginning" of
16-bit, but let's go with the dawn of the IBM PC in 1980.&amp;nbsp; 32-bit
computing clearly became mainstream with the release of Windows 95.&amp;nbsp; In
2010, whether or not 64-bit will be considered "mainstream" is
debatable, but it certainly presents a problem for 16-bit apps.&amp;nbsp; With
that in mind, it appears that desktop computing shifts to the next
level roughly every 15 years.&amp;nbsp; Again, this is just conjecture, but if
that pattern holds true, 32-bit Windows apps (like those written in
VFP) would continue to function until 2025.&amp;nbsp; Virtualization may extend
that further.&amp;nbsp; That doesn't mean they will be acceptable in the
marketplace, any more than 16-bit apps are now, but they may at least
still run.&lt;br&gt;&lt;img src="http://weblogs.foxite.com/aggbug.aspx?PostID=7997" width="1" height="1"&gt;</content><author><name>joel_leach</name><uri>http://weblogs.foxite.com/members/joel_leach.aspx</uri></author></entry><entry><title>The FoxTabs Challenge</title><link rel="alternate" type="text/html" href="http://weblogs.foxite.com/joel_leach/archive/2009/03/04/7847.aspx" /><id>http://weblogs.foxite.com/joel_leach/archive/2009/03/04/7847.aspx</id><published>2009-03-05T03:10:00Z</published><updated>2009-03-05T03:10:00Z</updated><content type="html">
	&lt;p&gt;The latest &lt;a href="http://www.hentzenwerke.com/catalog/fr0903.htm"&gt;FoxRockX&lt;/a&gt;
issue includes an article on FoxTabs by &lt;a href="http://www.rickschummer.com/blog/"&gt;Rick
Schummer&lt;/a&gt;.  After months of neglect, that inspired me to get
another release out, so you can now grab &lt;a href="http://vfpx.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24032"&gt;FoxTabs
0.9 Beta&lt;/a&gt; from &lt;a href="http://www.codeplex.com/VFPX/"&gt;VFPX&lt;/a&gt;.
My feeling is that FoxTabs is now “feature complete” for a 1.0
release, although I would not be surprised if there are a few more
releases to shake out any remaining bugs.  Please download the latest
version and help us get to 1.0!&lt;/p&gt;

&lt;p&gt;As Rick points out in the article,
stability can be an issue, especially while testing your code in the
IDE.  To that end, I added a Pause button that removes all event
bindings temporarily. If things get a little flaky during testing, or
if you just don't want to risk any interference from FoxTabs, press
the Pause button.  When you're done, press Resume and you're back in
business.  
&lt;/p&gt;

&lt;p&gt;Wikipedia says the following about
&lt;a href="http://en.wikipedia.org/wiki/Observation"&gt;Observation&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;i&gt;One problem encountered throughout
scientific fields is that the observation may affect the process
being observed, resulting in a different outcome than if the process
was unobserved. &lt;/i&gt;
&lt;/p&gt;

&lt;p&gt;Unfortunately, that
can sometimes be the case with FoxTabs, making stability THE number
one challenge of this project.  We have come a long way since the
initial release of FoxTabs, but there is more work to do.  Capturing
and responding to the myriads of events flying around can sometimes
cause unpredictable results.&lt;/p&gt;

&lt;p&gt;This is compounded
by the fact that the various VFP IDE windows are not exactly
consistent in their behavior.  For example, most IDE windows
broadcast a WM_SETFOCUS message when activated, which FoxTabs uses to
highlight the associated tab.  But the Project Manager doesn't send
out a WM_SETFOCUS.  Why not?  I don't know.  Neither does the
Properties window, but it's different than the Project Manager,
because each of its tabs send out its own messages.  I had to find
the right combination of events and messages, so that FoxTabs
responds consistently to all IDE windows.  This can be frustrating,
but it's also interesting, because you get a tiny peek at what's
going on under the hood.&lt;/p&gt;

&lt;p&gt;Of a more serious
nature is when some amalgamation of events combined with FoxTabs
produces unexpected results, or worse, a C5 crash.  That's when you
get the sinking feeling that your productivity tool has just become an un-productivity tool.  These can be difficult to track down. 
A few months ago a developer reported crashes when opening the
debugger.  I was able to open the debugger without issue using SET
STEP ON or a breakpoint.  It took me a whole day, but I eventually
traced this to the Call Stack window, which only caused a crash if
you opened it after SUSPENDing a program.  It was a very specific set
of circumstances that led to the crash.  Fortunately, I was able to find a workaround.&lt;/p&gt;

&lt;p&gt;Another interesting
case was fixed in the latest version.  Opening the Expression Builder
using GETEXPR worked fine.  However, if you opened it from the Functions
and Expressions button in the View Designer, BOOM!  Fox crashed.  I
traced the problem to this code from the FoxTabs window event
handler:&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;	&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;Function
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;WMEventHandler(&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;hWnd
As Integer&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;,
Msg &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;As
Integer&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;,
wParam &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;As
Integer&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;,
lParam &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;As
Integer&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;		&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;Local
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;oException
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;As
Exception &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;		Local
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;lnReturn
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;As
Integer&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;		&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;lnReturn
= 0&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;		&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;***
Black Hole: hWnd and Msg do not exist ***&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;		…&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;		&lt;/font&gt;&lt;/font&gt;&lt;font color="#008000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;*
Must pass the message on&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#008000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;		&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;lnReturn
= CallWindowProc(&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;This&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;.PrevWndFunc,
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;hWnd&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;,
Msg, wParam, lParam)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;			&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;		Return
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;lnReturn
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;		&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;	&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;EndFunc
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;

&lt;p&gt;Windows events pass
four parameters to the event handler: hWnd, Msg, wParam, and lParam. 
When opening the Expression Builder from the View Designer, those
variables don't exist in the event handler.  I don't mean that they
are not assigned a value, I mean that they do not exist!  How is that
possible given that the variables are clearly defined as parameters
only a few lines earlier?  It's as if they were sucked into a black
hole and out of existence.  When you try to access the variables or
pass the event on to its original destination (CallWindowProc), Fox
crashes because nothing is there.  It's one of the strangest things
I've seen in Fox.  I was able to plug the hole by checking if the
variables exist and simply returning if they do not.  My hope is that
this is the same hole causing other random C5 errors, and that those
are now fixed.&lt;/p&gt;

&lt;p&gt;So, yeah, there are
some challenges, especially when you're not a C/C++ programmer and
you don't deal with this kind of stuff everyday.  But I do have to
say it is very satisfying to find solutions to these problems, and I
learn a lot in the process.  I guess this isn't the best sales pitch
for using FoxTabs, but I think we'll get there.  I hope you give it a
try and let us know how it works for you.&lt;/p&gt;&lt;img src="http://weblogs.foxite.com/aggbug.aspx?PostID=7847" width="1" height="1"&gt;</content><author><name>joel_leach</name><uri>http://weblogs.foxite.com/members/joel_leach.aspx</uri></author></entry><entry><title>Credit Card Security</title><link rel="alternate" type="text/html" href="http://weblogs.foxite.com/joel_leach/archive/2009/02/12/7711.aspx" /><id>http://weblogs.foxite.com/joel_leach/archive/2009/02/12/7711.aspx</id><published>2009-02-12T19:05:00Z</published><updated>2009-02-12T19:05:00Z</updated><content type="html">Credit card security is increasingly becoming an issue.&amp;nbsp; A couple of years ago, &lt;a href="http://www.msnbc.msn.com/id/17853440/"&gt;TJ Maxx&lt;/a&gt; reported theft of up to 45 million credit card numbers.&amp;nbsp; More recently, &lt;a href="http://www.usatoday.com/money/perfi/credit/2009-01-20-heartland-credit-card-security-breach_N.htm"&gt;Heartland Payment Systems &lt;/a&gt;reported theft of 100 million numbers.&amp;nbsp; I used to think that stealing a credit card number would be relatively easy, but that purchasing something would lead the authorities right to the front door of the thief.&amp;nbsp; These days, it is a global problem, and criminals are finding ways to steal without getting caught.&lt;br&gt;&lt;br&gt;I have a pretty good sense about these things, and in general, I stay out of trouble.&amp;nbsp; I avoid suspicious downloads, and I only purchase from sites I trust.&amp;nbsp; In over 20 years of computing, I can count on one hand the number of times I have been infected by a virus, yet in the past 3 months, I have had two fraudulent charges on two different cards.&amp;nbsp; Google found quite a few instances of other people receiving the same charges I did, and at the same time.&amp;nbsp; The image of some script kiddie in Nigeria doing this stuff has been erased.&amp;nbsp; These guys are &lt;a href="http://blog.wired.com/27bstroke6/2008/08/11-charged-in-m.html"&gt;sophisticated and organized&lt;/a&gt;.&amp;nbsp; &lt;br&gt;&lt;br&gt;It's no surprise then that credit card companies are clamping down on security requirements for their merchants and software vendors.&amp;nbsp; We were in the process of adding credit card processing to our application, when our processing partner told us we would have to become &lt;a href="https://www.pcisecuritystandards.org/security_standards/pa_dss.shtml"&gt;PCI PA-DSS&lt;/a&gt; compliant.&amp;nbsp; Evidently, any application that "stores, processes, or transmits" credit card data must go through the compliance process.&amp;nbsp; That can cost up to $30,000 for the initial review, plus annual costs to keep it current.&amp;nbsp; The processor offered to walk us through the process and cut our costs to around $15,000.&amp;nbsp; Um... thanks, but no thanks.&amp;nbsp; I told them one reason we choose a partner like them is so we don't have to go through crap like this, but they weren't able to offer another solution.&amp;nbsp; Fortunately, we were able to find another partner (&lt;a href="http://www.x-charge.com/"&gt;X-Charge&lt;/a&gt;) that integrates with our app in a way that it never has to see a credit card number.&amp;nbsp; Problem solved.&amp;nbsp; If your app or web site collects or processes credit card info, chances are PCI will be knocking on your door.&lt;br&gt;&lt;img src="http://weblogs.foxite.com/aggbug.aspx?PostID=7711" width="1" height="1"&gt;</content><author><name>joel_leach</name><uri>http://weblogs.foxite.com/members/joel_leach.aspx</uri></author></entry><entry><title>VARIANTs on Fox</title><link rel="alternate" type="text/html" href="http://weblogs.foxite.com/joel_leach/archive/2009/01/14/7553.aspx" /><id>http://weblogs.foxite.com/joel_leach/archive/2009/01/14/7553.aspx</id><published>2009-01-14T22:33:00Z</published><updated>2009-01-14T22:33:00Z</updated><content type="html">As I mentioned &lt;a href="/joel_leach/archive/2009/01/12/7547.aspx"&gt;previously&lt;/a&gt;, I have been experimenting with integrating our application with &lt;a href="http://www.maximizer.com/"&gt;Maximizer CRM&lt;/a&gt;.&amp;nbsp; Working with their SDK, it doesn't take long to figure out that the COM interfaces were designed with VB and C++ programmers in mind.&amp;nbsp; Most of it works with VFP, but there are a few exceptions.&amp;nbsp; I ran into a problem with an interface that accepts a VARIANT variable by reference.&amp;nbsp; I was surprised to find out that Fox can't create a VARIANT.&lt;br&gt;&lt;br&gt;Shirley I can't be serious?&amp;nbsp; Everyone knows that all variables in Fox are variants.&amp;nbsp; While that may be true, Fox can't create a variable of type VARIANT that can be passed to COM components.&amp;nbsp; Fox always assigns a type to a variable.&amp;nbsp; Even a simple &lt;b&gt;Local MyVariable&lt;/b&gt; statement creates a logical variable.&amp;nbsp; Attempting to pass the variable by reference to a COM component may result in a "Type Mismatch" error.&lt;br&gt;&lt;br&gt;This isn't entirely Fox's fault.&amp;nbsp; After all, should a COM component assume that the calling environment can create a VARIANT?&amp;nbsp; Microsoft concedes this is a problem in C++ with MFC components and recommends using ATL instead (see link below).&amp;nbsp; &lt;br&gt;&lt;br&gt;So, what can you do if you run into this situation?&amp;nbsp; Ideally, the COM interface would be changed not to use VARIANTs, but I doubt Maximizer will change their interfaces, in place for years, just so I can use VFP.&amp;nbsp; VB does allow you to create variables of type VARIANT, so I created a VB wrapper component.&amp;nbsp; VFP passes a string to the VB component, the VB component converts that to a VARIANT and passes it to the Maximizer component.&amp;nbsp; It's not an ideal solution, but it works.&lt;br&gt;&lt;br&gt;&lt;a href="http://support.microsoft.com/kb/177575"&gt;PRB: ActiveX Controls Passing Variant* Back to VFP Cause Error&lt;/a&gt;&lt;img src="http://weblogs.foxite.com/aggbug.aspx?PostID=7553" width="1" height="1"&gt;</content><author><name>joel_leach</name><uri>http://weblogs.foxite.com/members/joel_leach.aspx</uri></author></entry><entry><title>VFPS: Visual FoxPro Stack</title><link rel="alternate" type="text/html" href="http://weblogs.foxite.com/joel_leach/archive/2009/01/14/7552.aspx" /><id>http://weblogs.foxite.com/joel_leach/archive/2009/01/14/7552.aspx</id><published>2009-01-14T19:49:00Z</published><updated>2009-01-14T19:49:00Z</updated><content type="html">UPDATE: This article is now online for free at &lt;a href="http://www.foxrockx.com/seite.htm"&gt;http://www.foxrockx.com/seite.htm&lt;/a&gt;.&lt;br&gt;-------------------&lt;br&gt;The January 2009 issue of FoxRockX begins with an article by Ken Levy called "Visual FoxPro Stack":&lt;br&gt;&lt;br&gt;&lt;i&gt;"VFPS is a Visual FoxPro Stack, an acronym used to define the key software components making up the Visual FoxPro platform and ecosystem. As a starting point, below is a list of components that comprise VFPS:&amp;nbsp; Visual FoxPro 9.0, Sedna and XSource, VFPX, VFPY. Also included are VFP 3rd Party products including tools related to .NET for Visual FoxPro such as VFP Studio, Guineu, .NET Extender for VFP, VFPCompiler for .NET, and VFPConversion.&lt;/i&gt;"&lt;br&gt;&lt;br&gt;These components represent the future of FoxPro development.&amp;nbsp; I guess I've considered VFPX to be the main effort in that regard, but these other third-party products should not be ignored, as many may find themselves working with them.&amp;nbsp; Besides, VFPX is primarily an effort for developers, wherease VFPS is aimed at business decision makers.&amp;nbsp; Ken compares it to LAMP (Linux, Apache, MySQL, PHP) as a marketing moniker and adds the following:&lt;br&gt;&lt;br&gt;&lt;i&gt;"Having an umbrella stack for evolving VFP community components adds awareness and enhanced branding...&amp;nbsp; While there will not be a VFP 10.0, there is great benefit from enhancing the mindset and perception by referring to VFPS as the latest bundle of VFP related components. This branding will often target businesses and decision makers of VFP based application development."&lt;/i&gt;&lt;br&gt;&lt;br&gt;Hopefully, they will put the entire article online for all to see.&amp;nbsp; I recommend subscribing to &lt;a href="http://www.foxrockx.com"&gt;FoxRockX&lt;/a&gt;.&amp;nbsp; It will be interesting to see how this all develops.&lt;br&gt;&lt;br&gt;&lt;a href="http://fox.wikis.com/wc.dll?Wiki%7EVFPS"&gt;VFPS Home Page (Fox Wiki)&lt;/a&gt;&lt;br&gt;&lt;img src="http://weblogs.foxite.com/aggbug.aspx?PostID=7552" width="1" height="1"&gt;</content><author><name>joel_leach</name><uri>http://weblogs.foxite.com/members/joel_leach.aspx</uri></author></entry><entry><title>DAO does VFP data natively</title><link rel="alternate" type="text/html" href="http://weblogs.foxite.com/joel_leach/archive/2009/01/12/7547.aspx" /><id>http://weblogs.foxite.com/joel_leach/archive/2009/01/12/7547.aspx</id><published>2009-01-12T23:49:00Z</published><updated>2009-01-12T23:49:00Z</updated><content type="html">I ran across something interesting (albeit of limited use) recently.&amp;nbsp; We are considering integrating Maximizer CRM with our software, and I've been doing some proof-of-concept work along those lines.&amp;nbsp; One thing about CRM software creators is they know they won't be replacing your core line of business applications, so they make sure there are plenty of ways to integrate with those apps.&amp;nbsp; Maximizer is no exception, and being around for quite a few years now, it includes some old-school (but new to me) integration techniques.&lt;br&gt;&lt;br&gt;The first thing I wanted to do was import some Fox data into Maximizer.&amp;nbsp; While older products often included native support for dBASE and FoxPro 2.x tables, virtually no products supported Visual FoxPro natively, so I was surprised to see FoxPro 3.0 in the list.&amp;nbsp; I use VFP 9.0, but I haven't made use of any of the new database features added in versions 7.0 - 9.0.&amp;nbsp; So, I gave it a try and it worked like a charm.&amp;nbsp; "Wow, that was easy", I thought, "I wish Microsoft products supported their own database this well."&lt;br&gt;&lt;br&gt;Well, it turns out, they used to.&amp;nbsp; To my surprise, this all led me to the fact that DAO 3.5 had native support for Visual FoxPro tables.&amp;nbsp; DAO (Data Access Objects) was Microsoft's data technology that preceded ADO (ActiveX Data Objects) and was popular with Access and VB developers at the time.&amp;nbsp; It is now deprecated, but some Access developers still favor it over newer technologies.&amp;nbsp; It has been my assumption that Microsoft Access got its name because it could "access" multiple databases in addition to its own Jet database.&amp;nbsp; It has done this by means of "ISAM Filters" for other databases, including FoxPro.&amp;nbsp; DAO 3.5 included a filter for Visual FoxPro.&lt;br&gt;&lt;br&gt;Eventually, ADO came along and superceded DAO as the recommended way to access data.&amp;nbsp; The ISAM filters became part of the Microsoft Jet 4.0 engine, but the FoxPro filters were no longer included in the package.&amp;nbsp; WTF?&amp;nbsp; Yet another slight against our beloved Fox?&amp;nbsp; Perhaps, but also consider this: the ISAM filters suck.&amp;nbsp; While I am sure they work fine for FoxPro 2.x data, the VFP filters are limited and give you read-only access to data.&amp;nbsp; Compared to the FoxPro ODBC drivers, which give full read/write access as well as much improved performance, it became apparent that ODBC was the preferred way to access FoxPro data and I assume that's why the ISAM filters were removed.&lt;br&gt;&lt;br&gt;While I would never recommend DAO for new development, we often find ourselves working with older systems and technology.&amp;nbsp; It's interesting what you run across.&lt;br&gt;&lt;br&gt;Resources:&lt;br&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://support.microsoft.com/kb/161307/EN-US/"&gt;&lt;/a&gt;&lt;a href="http://support.microsoft.com/kb/161307"&gt;How To Use Visual FoxPro Tables in Visual Basic&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://support.microsoft.com/kb/172592"&gt;How To Open a Visual FoxPro Table for Read/Write&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms810810.aspx#mdac%20technologies%20road%20map%20old_topic9"&gt;Data Access Technologies Road Map&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://weblogs.foxite.com/aggbug.aspx?PostID=7547" width="1" height="1"&gt;</content><author><name>joel_leach</name><uri>http://weblogs.foxite.com/members/joel_leach.aspx</uri></author></entry><entry><title>C# 4.0 Gets dynamic</title><link rel="alternate" type="text/html" href="http://weblogs.foxite.com/joel_leach/archive/2008/11/06/7239.aspx" /><id>http://weblogs.foxite.com/joel_leach/archive/2008/11/06/7239.aspx</id><published>2008-11-07T01:51:00Z</published><updated>2008-11-07T01:51:00Z</updated><content type="html">I've been watching some of the &lt;a href="http://www.microsoftpdc.com/"&gt;PDC 2008&lt;/a&gt; &lt;a href="http://coolthingoftheday.blogspot.com/2008/10/pdc2008-quick-video-link-list.html"&gt;videos &lt;/a&gt;online.&amp;nbsp; One of the highlights is &lt;a href="http://channel9.msdn.com/pdc2008/TL16/"&gt;The Future of C#&lt;/a&gt; by &lt;span id="ctl00_MainPlaceHolder_Starter_BodyLabel"&gt;Anders Hejlsberg, and I highly recommend it to anyone that's interested in .NET.&amp;nbsp; Most of the session focuses on the dynamic capabilities that are coming to C# 4.0.&amp;nbsp; The .NET Common Language Runtime (CLR) was built primarily with static typing (aka "strong typing") in mind, in which every variable must be explicitly declared and assigned a type (string, integer, etc.).&amp;nbsp; Microsoft recently built the Dynamic Language Runtime (DLR) to support dynamic (non-static) languages, such as Python and Ruby, and they are using the DLR to bring some dynamic features to C#.&lt;br&gt;&lt;br&gt;To you strong-typing zealots, there's no need to be alarmed.&amp;nbsp; C# is not transforming itself from a static to a dynamic language.&amp;nbsp; There is a gap between static and dynamic languages, and the focus is on closing that gap and improving the interaction.&amp;nbsp; It just so happens that FoxPro is a dynamic language...&lt;span&gt;&lt;br&gt;&lt;br&gt;&lt;/span&gt;To illustrate the problem, here is a simple VFP class I wrote that finds a customer and creates an object for the customer using Scatter:&lt;/span&gt;&lt;span id="ctl00_MainPlaceHolder_Starter_BodyLabel"&gt;&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;pre class="codeblock"&gt;&lt;font color="Blue" size="3"&gt;Define&lt;/font&gt;&lt;font size="3"&gt; &lt;/font&gt;&lt;font color="Blue" size="3"&gt;Class&lt;/font&gt;&lt;font size="3"&gt; Customers &lt;/font&gt;&lt;font color="Blue" size="3"&gt;As&lt;/font&gt;&lt;font size="3"&gt; &lt;/font&gt;&lt;font color="Blue" size="3"&gt;Session&lt;/font&gt;&lt;font size="3"&gt; &lt;/font&gt;&lt;font color="Blue" size="3"&gt;OlePublic&lt;/font&gt;&lt;font size="3"&gt;&lt;br&gt;&lt;br&gt;oCustomer = &lt;/font&gt;&lt;font color="Blue" size="3"&gt;NULL&lt;/font&gt;&lt;font size="3"&gt;&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;Procedure&lt;/font&gt;&lt;font size="3"&gt; GetCustomer(lcCustomerID &lt;/font&gt;&lt;font color="Blue" size="3"&gt;As&lt;/font&gt;&lt;font size="3"&gt; &lt;/font&gt;&lt;font color="Blue" size="3"&gt;String&lt;/font&gt;&lt;font size="3"&gt;)&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;Local&lt;/font&gt;&lt;font size="3"&gt; loCustomer&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;If&lt;/font&gt;&lt;font size="3"&gt; !&lt;/font&gt;&lt;font color="Blue" size="3"&gt;Used&lt;/font&gt;&lt;font size="3"&gt;(&lt;/font&gt;&lt;font color="Black" size="3"&gt;"Customers"&lt;/font&gt;&lt;font size="3"&gt;)&lt;br&gt;	&lt;/font&gt;&lt;font color="Blue" size="3"&gt;Select&lt;/font&gt;&lt;font size="3"&gt; 0&lt;br&gt;	&lt;/font&gt;&lt;font color="Blue" size="3"&gt;Use&lt;/font&gt;&lt;font size="3"&gt; (&lt;/font&gt;&lt;font color="Blue" size="3"&gt;Home&lt;/font&gt;&lt;font size="3"&gt;(2) + &lt;/font&gt;&lt;font color="Black" size="3"&gt;"Northwind\Customers"&lt;/font&gt;&lt;font size="3"&gt;)&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;Else&lt;/font&gt;&lt;font size="3"&gt;&lt;br&gt;	&lt;/font&gt;&lt;font color="Blue" size="3"&gt;Select&lt;/font&gt;&lt;font size="3"&gt; Customers&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;EndIf&lt;/font&gt;&lt;font size="3"&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;Locate&lt;/font&gt;&lt;font size="3"&gt; &lt;/font&gt;&lt;font color="Blue" size="3"&gt;For&lt;/font&gt;&lt;font size="3"&gt; CustomerID = lcCustomerID&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;Scatter&lt;/font&gt;&lt;font size="3"&gt; &lt;/font&gt;&lt;font color="Blue" size="3"&gt;Name&lt;/font&gt;&lt;font size="3"&gt; &lt;/font&gt;&lt;font color="Blue" size="3"&gt;This&lt;/font&gt;&lt;font size="3"&gt;.oCustomer &lt;/font&gt;&lt;font color="Blue" size="3"&gt;Memo&lt;/font&gt;&lt;font size="3"&gt;&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;EndProc&lt;/font&gt;&lt;font size="3"&gt;&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;Procedure&lt;/font&gt;&lt;font size="3"&gt; &lt;/font&gt;&lt;font color="Blue" size="3"&gt;Destroy&lt;/font&gt;&lt;font size="3"&gt;&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;Use&lt;/font&gt;&lt;font size="3"&gt; &lt;/font&gt;&lt;font color="Blue" size="3"&gt;In&lt;/font&gt;&lt;font size="3"&gt; &lt;/font&gt;&lt;font color="Blue" size="3"&gt;Select&lt;/font&gt;&lt;font size="3"&gt;(&lt;/font&gt;&lt;font color="Black" size="3"&gt;"Customers"&lt;/font&gt;&lt;font size="3"&gt;)&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;Endproc&lt;/font&gt;&lt;font size="3"&gt;&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;Enddefine&lt;/font&gt;&lt;br&gt;&lt;/pre&gt;I compiled the class into a COM DLL and imported it into my C# project.&amp;nbsp; (For more on that, see Rick Strahl's article: &lt;a href="http://www.west-wind.com/presentations/VfpDotNetInterop/vfpDotNetInterop.htm#_COM_Interoperability"&gt;.NET Interop for VFP Applications&lt;/a&gt;.)&amp;nbsp; Since This.oCustomer is created dynamically at runtime, FoxPro cannot include it in the type library.&amp;nbsp; Therefore, to access any properties of the oCustomer in C#, you have to use "reflection".&amp;nbsp; Here's the C# code:&lt;br&gt;&lt;pre class="codeblock"&gt;&lt;font color="Blue" size="3"&gt;string&lt;/font&gt;&lt;font size="3"&gt; CustomerID = &lt;/font&gt;&lt;font color="Black" size="3"&gt;"ALFKI"&lt;/font&gt;&lt;font size="3"&gt;;&lt;br&gt;netcomtest.Customers oCustomers = &lt;/font&gt;&lt;font color="Blue" size="3"&gt;new&lt;/font&gt;&lt;font size="3"&gt; netcomtest.Customers();&lt;br&gt;&lt;br&gt;oCustomers.GetCustomer(CustomerID);&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;object&lt;/font&gt;&lt;font size="3"&gt; oCust = oCustomers.OCUSTOMER;&lt;br&gt;&lt;/font&gt;&lt;font color="Green" size="3"&gt;//use reflection to access object properties&lt;/font&gt;&lt;font size="3"&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;object&lt;/font&gt;&lt;font size="3"&gt; CompanyName = oCust.GetType().InvokeMember(&lt;/font&gt;&lt;font color="Black" size="3"&gt;"COMPANYNAME"&lt;/font&gt;&lt;font size="3"&gt;, BindingFlags.GetProperty, &lt;/font&gt;&lt;font color="Blue" size="3"&gt;null&lt;/font&gt;&lt;font size="3"&gt;, oCust, &lt;/font&gt;&lt;font color="Blue" size="3"&gt;null&lt;/font&gt;&lt;font size="3"&gt;);&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;object&lt;/font&gt;&lt;font size="3"&gt; ContactName = oCust.GetType().InvokeMember(&lt;/font&gt;&lt;font color="Black" size="3"&gt;"CONTACTNAME"&lt;/font&gt;&lt;font size="3"&gt;, BindingFlags.GetProperty, &lt;/font&gt;&lt;font color="Blue" size="3"&gt;null&lt;/font&gt;&lt;font size="3"&gt;, oCust, &lt;/font&gt;&lt;font color="Blue" size="3"&gt;null&lt;/font&gt;&lt;font size="3"&gt;);&lt;br&gt;&lt;/font&gt;&lt;font color="Green" size="3"&gt;//display company and contact name&lt;/font&gt;&lt;font size="3"&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;MessageBox&lt;/font&gt;&lt;font size="3"&gt;.&lt;/font&gt;&lt;font color="Blue" size="3"&gt;Show&lt;/font&gt;&lt;font size="3"&gt;(CompanyName.ToString() + ContactName.ToString());&lt;/font&gt;&lt;br&gt;&lt;/pre&gt;What a mess!&amp;nbsp; If I wanted to access all of the properties on the object, this would get very tedious.&amp;nbsp; C# 4.0 makes the process easier by introducing a new "dynamic" type.&amp;nbsp; This tells C# to resolve the type of the variable at runtime (just like Fox would), rather than at compile time.&amp;nbsp; If I understand Anders correctly, here's what the new code should look like :&lt;br&gt;&lt;pre class="codeblock"&gt;&lt;font color="Blue" size="3"&gt;string&lt;/font&gt;&lt;font size="3"&gt; CustomerID = &lt;/font&gt;&lt;font color="Black" size="3"&gt;"ALFKI"&lt;/font&gt;&lt;font size="3"&gt;;&lt;br&gt;netcomtest.Customers oCustomers = &lt;/font&gt;&lt;font color="Blue" size="3"&gt;new&lt;/font&gt;&lt;font size="3"&gt; netcomtest.Customers();&lt;br&gt;&lt;br&gt;oCustomers.GetCustomer(CustomerID);&lt;br&gt;&lt;/font&gt;&lt;font color="Green" size="3"&gt;//create dynamic reference to object&lt;/font&gt;&lt;font size="3"&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;dynamic &lt;/font&gt;&lt;font size="3"&gt;oCust = oCustomers.OCUSTOMER;&lt;br&gt;&lt;/font&gt;&lt;font color="Green" size="3"&gt;//display company and contact name&lt;/font&gt;&lt;font size="3"&gt;&lt;br&gt;&lt;/font&gt;&lt;font color="Blue" size="3"&gt;MessageBox&lt;/font&gt;&lt;font size="3"&gt;.&lt;/font&gt;&lt;font color="Blue" size="3"&gt;Show&lt;/font&gt;&lt;font size="3"&gt;(oCust.CompanyName + oCust.ContactName);&lt;/font&gt;&lt;br&gt;&lt;/pre&gt;Now, isn't that better?&amp;nbsp; I can actually understand this code.&amp;nbsp; I can access all the properties of oCust directly, just like I would in FoxPro.&amp;nbsp; It's nice to see that COM Interop is one of the things that Microsoft is still improving.&lt;br&gt;&lt;br&gt;Anders also showed some things they are working on beyond C# 4.0.&amp;nbsp; Fast forward to the 60 minute mark in the video to see the cutting-edge stuff they are working on.&amp;nbsp; In short, they are rewriting the compiler, so they can do stuff like put code into a string variable and evaluate/execute it at runtime.&amp;nbsp; Fantastic!&amp;nbsp; Anders took it a step further and showed C# commands being executed as he entered them into a window.&amp;nbsp; Unbelievable!&amp;nbsp; It's amazing what they can do these days! &lt;img src="/emoticons/emotion-4.gif" alt="Stick out tongue [:P]" /&gt; Seriously, should you find yourself working with C# in the future, it will be nice to have some capabilities we've grown to love in VFP.&lt;br&gt;&lt;img src="http://weblogs.foxite.com/aggbug.aspx?PostID=7239" width="1" height="1"&gt;</content><author><name>joel_leach</name><uri>http://weblogs.foxite.com/members/joel_leach.aspx</uri></author></entry><entry><title>Grid Header Checkbox</title><link rel="alternate" type="text/html" href="http://weblogs.foxite.com/joel_leach/archive/2008/11/06/7234.aspx" /><link rel="enclosure" type="application/zip" length="50625" href="http://weblogs.foxite.com/joel_leach/attachment/7234.ashx" /><id>http://weblogs.foxite.com/joel_leach/archive/2008/11/06/7234.aspx</id><published>2008-11-06T17:55:00Z</published><updated>2008-11-06T17:55:00Z</updated><content type="html">Here's a little goodie for readers of my blog.&amp;nbsp; I have several grids that contain a checkbox column to select items in the grid.&amp;nbsp; I wanted an easy, consistent way to select/deselect all checkboxes in the column, so I created a custom grid header class to do that.&amp;nbsp; hdrCheckBox.zip is attached.&lt;br&gt;&lt;br&gt;

&lt;img src="http://www.superjenius.net/vfp/hdrCheckBox.jpg" border="0"&gt;

&lt;br&gt;&lt;br&gt;I initially tried to use a standard checkbox.&amp;nbsp; VFP doesn’t let you put a control inside a header, so I tried to overlay it on the grid.&amp;nbsp; That turned out to be too flaky and limited, so I opted to use pictures of a checked and unchecked box, which VFP does do.&amp;nbsp; The only downside is that the checkbox is a themed control, and Windows XP checkboxes may look slightly different than pictures of the Windows Vista checkboxes I used.&amp;nbsp; Still, I think the checkbox will look good in any theme.&amp;nbsp; &lt;br&gt;&lt;br&gt;Another limitation is that the header cannot receive focus like a real checkbox, so no keyboard support.&amp;nbsp; To get around that, the header Click() is performed when the user presses “A” while the grid column has focus.&amp;nbsp; I actually tried to use Ctrl+A, but KeyPress() would not detect that combination, I assume because it’s already assigned to the Edit menu.&amp;nbsp; &lt;br&gt;&lt;br&gt;To make sure the user would know that they could check the box, I put a tooltip on the grid header.&amp;nbsp; Header tooltips don’t work in VFP9 SP2, so I had to put some workaround code in the class to make the grid tooltip appear.&amp;nbsp; Hopefully, Microsoft will eventually release a fix for this, but I’m not holding my breath.&amp;nbsp; &lt;br&gt;&lt;br&gt;To use the class:&lt;br&gt;&lt;ul&gt;&lt;li&gt;Change the column HeaderClass to hdrCheckBox in hdrCheckBox.prg.&amp;nbsp; You may already be done.&lt;/li&gt;&lt;li&gt;If you want the box to be checked initially, change the Value property to .T.&amp;nbsp; Even though this is a PRG-based class, you can use the property sheet and override methods on the form just like you would with any class.&amp;nbsp; NOTE: Setting this initial value will not check all the boxes in the grid.&amp;nbsp; You will need to do that in the Grid.RecordSource query.&lt;/li&gt;&lt;li&gt;If you want to change the header checkbox back to its original value (for example, if you requery the grid), then call the Reset() method on the class.&lt;/li&gt;&lt;li&gt;Another VFP9 SP2 bug!&amp;nbsp; If you open this form from the menu, you have to use the menu “Procedure” to open the form instead of “Command”.&amp;nbsp; Otherwise, VFP9 will crash when you open the form.&amp;nbsp; See &lt;a href="/emersonreed/archive/2007/11/23/C5_error_in_a_grid_with_user_defined_column_and_header_members.aspx"&gt;Emerson Reed's blog entry&lt;/a&gt; for more info.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;Here are the requirements to use the class (which, of course, you could change):&lt;br&gt;&lt;ul&gt;&lt;li&gt;Grid.RecordSource is required.&lt;/li&gt;&lt;li&gt;Column.ControlSource is required.&lt;/li&gt;&lt;li&gt;The column field must be a logical field.&lt;/li&gt;&lt;li&gt;Column.CurrentControl must be a checkbox.&lt;/li&gt;&lt;/ul&gt;Disclaimer: This code is provided AS-IS.&amp;nbsp; If it doesn't work for you, fix it! &lt;img src="/emoticons/emotion-1.gif" alt="Smile [:)]" /&gt;&lt;br&gt;&lt;br&gt;&lt;img src="http://weblogs.foxite.com/aggbug.aspx?PostID=7234" width="1" height="1"&gt;</content><author><name>joel_leach</name><uri>http://weblogs.foxite.com/members/joel_leach.aspx</uri></author></entry><entry><title>Head in the Cloud</title><link rel="alternate" type="text/html" href="http://weblogs.foxite.com/joel_leach/archive/2008/11/03/7206.aspx" /><id>http://weblogs.foxite.com/joel_leach/archive/2008/11/03/7206.aspx</id><published>2008-11-04T01:02:00Z</published><updated>2008-11-04T01:02:00Z</updated><content type="html">
	
	

&lt;p&gt;With Microsoft's unveiling of &lt;a href="http://www.microsoft.com/azure/default.mspx"&gt;Windows
Azure&lt;/a&gt; at the &lt;a href="http://www.microsoftpdc.com/"&gt;PDC&lt;/a&gt; last week, I've been trying to get my head around
exactly what Azure is, or more specifically, why this "cloud
computing" thing is so important to Microsoft.  What is cloud
computing?  Heck, what is the "cloud"? According to
Wikipedia:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;i&gt;The cloud is a metaphor for the
Internet (based on how it is depicted in computer network diagrams)
and is an abstraction for the complex infrastructure it conceals.&lt;/i&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Ok, so the cloud is the Internet.  Why
not just call it the Internet?  Evidently, it's a more abstract,
architectural way of looking at the Internet that's not concerned
with all the hardware and network protocols under the hood.  You
connect a router to the "Internet".  You put a service in
the "cloud".  Indeed, when talking about cloud computing,
people often refer to delivering “software as a service” or
“software + services”.  It's broader than that and actually has
been around for a while, so what's the big deal?  "Cloud
computing" is a buzz-word, to be sure; a repackaging of existing
concepts and sold as something new.  In this case, the packaging could provide some benefits.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;So, what is Windows Azure then?  First
of all, let's state the obvious: this is web hosting from Microsoft. 
When it comes to hosting, you have a couple of options: inexpensive
shared hosting, which is fine for static web sites and sites that
need little processing power, and dedicated hosting, where you get
your own machine(s) for mission-critical stuff.  Azure Services is
kind of a hybrid approach, where you pay for dedicated resources on
Microsoft's data center, but it's all virtualized and you don't know
about the hardware underneath.  Windows Azure is the base platform
for managing all of that, an operating system of sorts with APIs
exposed to developers.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;My first thought is that this would be
something Microsoft could sell to ISPs, but once I realized the scale
of what they are trying to do, you really do want a Microsoft, a
Google, or an IBM behind it.  Scalability and reliability are the
name of the game.  When you sign up, you get an instance on the data
center, which is presumably a virtual machine running Windows Server,
but I don't know the exact details and there's probably more to it
than that.  You can have as many instances as you want (or can
afford) on-demand, and you pay for exactly what you use and for how
long you use it. Microsoft demonstrated scaling instances up or down
by simply changing a setting in a config file.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;How could that be useful?  Imagine
you're offering a new web application and you need to easily scale up
as you grow.  Or maybe you're an online retailer and you need to
quadruple your web capacity during the holiday season.  To get more
granular, maybe you need 10 servers running your web site during peak
hours but only 2 in the middle of the night.  That's the pitch, anyway.&amp;nbsp; Whether or not anyone actually needs that much flexibility remains to be seen, but it could be enough to convince some people to buy in.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;So, how much is this gonna cost?  Good
question.  Microsoft hasn't released pricing yet, but they are going
to have to be competitive with Amazon's "&lt;a href="http://aws.amazon.com/ec2/"&gt;Elastic Compute Cloud&lt;/a&gt;".
 I looked at their pricing, and since everything is a-la-carte down
to the hour and the gigabyte, I still don't know.  As far as I can
tell, a single instance running 24/7 costs about $150-$200/month. 
That's comparable to dedicated hosting, but if you added on the
managed features you get with EC2 (backups, etc.) to dedicated hosting, EC2 may
actually be cheaper than dedicated (I'm sure people will be analyzing and debating that for some time).&amp;nbsp; Of course, Microsoft has services
such as .NET Services and SQL Services that sit on top of Windows
Azure, as well as full-blown applications like Office and CRM, so
it's really going to depend on what you need.  I hope Microsoft makes
it easier than Amazon to determine your costs.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;With this highly scalable and supposedly reliable system, will businesses move their applications to the
cloud?  I think you'll see some of that, but the basic rules for
determining if an application is a good candidate for the web haven't
changed.  If a company relies on their line-of-business software for
daily operations, I doubt they'll risk being shut down because their
DSL or T1 line goes down.  However, maybe the cloud is the ideal
place for their CRM system. Microsoft realizes that businesses are
not going to put everything in the cloud, so part of .NET Services is
to help companies bridge the gap between their on-premises and cloud
systems.  For example, logging in to your local network can also log
you in to the CRM app in the cloud.&lt;/p&gt;

&lt;p&gt;Now, for the million dollar question:
Can you run FoxPro applications on Azure?  Maybe, but not yet.  Azure
will initially be for managed .NET code only, but Microsoft claims
they will open it up to unmanaged code in 2009.  We'll have to wait
and see if that includes VFP.&lt;/p&gt;


&lt;p&gt;Resources:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/azure/default.mspx"&gt;Windows
Azure&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://channel9.msdn.com/pdc2008/KYN01/"&gt;PDC 2008 Keynote&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://channel9.msdn.com/posts/Charles/Manuvir-Das-Introducing-Windows-Azure/"&gt;Channel 9: Introducing Windows Azure&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://west-wind.com/weblog/posts/529598.aspx"&gt;Rick Strahl's PDC 2008 Wrap Up&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;br&gt;&lt;img src="http://weblogs.foxite.com/aggbug.aspx?PostID=7206" width="1" height="1"&gt;</content><author><name>joel_leach</name><uri>http://weblogs.foxite.com/members/joel_leach.aspx</uri></author></entry></feed>