<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Frank Perez's Blog</title>
    <link>http://www.pfsolutions-mi.com/blog/</link>
    <description>Tips, tricks, rantings, ravings, ideas, and life as a Visual FoxPro developer.</description>
    <language>en-us</language>
    <copyright>Frank Perez</copyright>
    <lastBuildDate>Sun, 24 Aug 2008 21:53:45 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.0.7226.0</generator>
    <managingEditor>frankperez@pfsolutions-mi.com</managingEditor>
    <webMaster>frankperez@pfsolutions-mi.com</webMaster>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=7a1c5439-7834-417e-abe3-f6cdacc89dd0</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,7a1c5439-7834-417e-abe3-f6cdacc89dd0.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,7a1c5439-7834-417e-abe3-f6cdacc89dd0.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=7a1c5439-7834-417e-abe3-f6cdacc89dd0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
On Saturday August 23rd, 2008 I completed my first 10-mile event in the Crim Festival
of Races with a time of 1:58:08 (hh:mm:ss). My goal was to finish something closer
to 1:45. It was not an un-reasonable expectation. I had ran that same distance for
the previous three Saturdays with an average pace of 10:32 (mm:ss) per mile. I guess
the temperature that morning (somewhere in the high 80's, low 90's) had a bigger effect
on me than I expected. That will teach me not to do all of my training runs in the
60's to 70's.
</p>
        <p>
Despite my results, I really enjoyed the Crim Festival of Races. There's something
about participating in a race with thousands of other people that is exciting and
motivating. If you are ever near Flint Michigan on the fourth Saturday in August,
I highly recommend it.
</p>
        <br />
Links: 
<br />
Crim Fitness Foundation <a href="http://www.crim.org">http://www.crim.org</a><img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=7a1c5439-7834-417e-abe3-f6cdacc89dd0" /></body>
      <title>The Crim 2008</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,7a1c5439-7834-417e-abe3-f6cdacc89dd0.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2008/08/24/TheCrim2008.aspx</link>
      <pubDate>Sun, 24 Aug 2008 21:53:45 GMT</pubDate>
      <description>&lt;p&gt;
On Saturday August 23rd, 2008 I completed my first 10-mile event in the Crim Festival
of Races with a time of 1:58:08 (hh:mm:ss). My goal was to finish something closer
to 1:45. It was not an un-reasonable expectation. I had ran that same distance for
the previous three Saturdays with an average pace of 10:32 (mm:ss) per mile. I guess
the temperature that morning (somewhere in the high 80's, low 90's) had a bigger effect
on me than I expected. That will teach me not to do all of my training runs in the
60's to 70's.
&lt;/p&gt;
&lt;p&gt;
Despite my results, I really enjoyed the Crim Festival of Races. There's something
about participating in a race with thousands of other people that is exciting and
motivating. If you are ever near Flint Michigan on the fourth Saturday in August,
I highly recommend it.
&lt;/p&gt;
&lt;br&gt;
Links: 
&lt;br&gt;
Crim Fitness Foundation &lt;a href="http://www.crim.org"&gt;http://www.crim.org&lt;/a&gt;&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=7a1c5439-7834-417e-abe3-f6cdacc89dd0" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,7a1c5439-7834-417e-abe3-f6cdacc89dd0.aspx</comments>
      <category>Running</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=13b917c7-754d-4def-8f4f-e41c9ca04215</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,13b917c7-754d-4def-8f4f-e41c9ca04215.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,13b917c7-754d-4def-8f4f-e41c9ca04215.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=13b917c7-754d-4def-8f4f-e41c9ca04215</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Wow! It's been 117 days since my last blog entry. I knew that it had been a while.
I guess it was just too easy to keep telling myself I'll catch up on the blog next
week. Oh well, here is what I've been up to for the past 4 months.
</p>
        <p>
In April I resigned from CCS (Complete Computer Service, Ltd.) and took a position
at White Light Computing. CCS is a small software company that sells vertical market
applications to the Healthcare Staffing, Security Guard, and Temporary Help industries.
With almost 13 years of service it was not an easy decision for me to leave, but I
still think it is what will be best for me and my family in the long term. I hope
to remain in contact and friends with the people I worked with there for many years
to come.
</p>
        <p>
May 1st was my first day at White Light Computing. So far I am really enjoying the
challenges and the type of work I am doing. After working on a vertical market application
for so many years it came to the point where I knew the code like the back of my hand
and the frequency in which I was technically challenged was less and less. One of
the things I like about software development is that I can constantly test myself
and learn new things. And the work I am doing at White Light Computing lets me do
just that.
</p>
        <p>
On June 14th I took a little trip over to Grand Rapids Michigan to catch the GRAFUG
(Grand Rapids Area FoxPro User Group) special event, The Andy &amp; Marcia Show. Andy
Kramek and Marcia Akins presented five topics: Implementing Design Patterns in Visual
FoxPro - Part 1 &amp; 2, The 26 Hour Day, Using ActiveX Controls, and Event Handling
in Visual FoxPro. In addition, TechSmith donated copies of SnagIt and Camtasia Studio
Bundle which were given away during the event. All of the above plus lunch and snacks
for the low price of forty dollars. Definitely worth every penny and giving up a Saturday
to attend.
</p>
        <p>
The month of June was another big month for me personally. My wife and I celebrated
our 10th anniversary with a ten day trip to the west coast. We started with three
nights in Las Vegas at New York New York Hotel and Casino. One of my favorite places
in Las Vegas is The Bar at Times Square and the dueling pianos. Another highlight
was seeing "Phantom" at The Venetian. Although I have seen The Phantom of the Opera
a couple of times before, I have to say that this production was by far the best,
and the custom built theatre was amazing.
</p>
        <p>
From Las Vegas we flew over to San Francisco and stayed at the Marriott Fisherman's
Wharf for three nights. San Francisco is a really cool city with a lot of culture
and unique bars, restaurants, and shops. I especially liked that most places we wanted
to go were in walking distance. For the things that were not, the mass transit system
is out of this world compared to what we have back home.
</p>
        <p>
For the last segment of our trip we rented a convertible and drove to Napa Valley.
Along the way we stopped and did some brief hiking at Muir Woods National Monument.
This time we stayed three nights at a bed breakfast two blocks from downtown Napa,
visited several wineries, and finished with a trip to a spa in Calistoga. The whole
trip ended with a Friday night red-eye flight back home so that we would have at least
two days to recoup before going back to work.
</p>
        <p>
Vacation is always nice, but eventually you have to come back home and deal with all
of the things that got left behind. That was July. I don't know where time went, no
special events come to mind, but the days flew by none the less.
</p>
        <p>
On second thought, I did start a half marathon training program in July. On October
5th I'll be running the Brooksie Way Half Marathon in Oakland County, Michigan. This
is my first ever half marathon so I'm not expecting to break any records, finishing
the event will be victory enough.
</p>
        <br />
Links: 
<br />
White Light Computing, Inc. <a href="http://www.whitelightcomputing.com">http://www.whitelightcomputing.com</a><br />
GRAFUG <a href="http://www.grafug.com">http://www.grafug.com</a><br />
New York New York Hotel &amp; Casino <a href="http://www.nynyhotelcasino.com">http://www.nynyhotelcasino.com</a><br />
San Francisco Marriott Fisherman's Wharf <a href="http://www.marriottfishermanswharf.com">http://www.marriottfishermanswharf.com</a><br />
Muir Woods National Monument <a href="http://www.visitmuirwoods.com">http://www.visitmuirwoods.com</a><br />
Brooksie Way Half Marathon <a href="http://www.thebrooksieway.com">http://www.thebrooksieway.com</a><p></p><img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=13b917c7-754d-4def-8f4f-e41c9ca04215" /></body>
      <title>117 Days Later</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,13b917c7-754d-4def-8f4f-e41c9ca04215.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2008/08/10/117DaysLater.aspx</link>
      <pubDate>Sun, 10 Aug 2008 18:10:43 GMT</pubDate>
      <description>&lt;p&gt;
Wow! It's been 117 days since my last blog entry. I knew that it had been a while.
I guess it was just too easy to keep telling myself I'll catch up on the blog next
week. Oh well, here is what I've been up to for the past 4 months.
&lt;/p&gt;
&lt;p&gt;
In April I resigned from CCS (Complete Computer Service, Ltd.) and took a position
at White Light Computing. CCS is a small software company that sells vertical market
applications to the Healthcare Staffing, Security Guard, and Temporary Help industries.
With almost 13 years of service it was not an easy decision for me to leave, but I
still think it is what will be best for me and my family in the long term. I hope
to remain in contact and friends with the people I worked with there for many years
to come.
&lt;/p&gt;
&lt;p&gt;
May 1st was my first day at White Light Computing. So far I am really enjoying the
challenges and the type of work I am doing. After working on a vertical market application
for so many years it came to the point where I knew the code like the back of my hand
and the frequency in which I was technically challenged was less and less. One of
the things I like about software development is that I can constantly test myself
and learn new things. And the work I am doing at White Light Computing lets me do
just that.
&lt;/p&gt;
&lt;p&gt;
On June 14th I took a little trip over to Grand Rapids Michigan to catch the GRAFUG
(Grand Rapids Area FoxPro User Group) special event, The Andy &amp;amp; Marcia Show. Andy
Kramek and Marcia Akins presented five topics: Implementing Design Patterns in Visual
FoxPro - Part 1 &amp;amp; 2, The 26 Hour Day, Using ActiveX Controls, and Event Handling
in Visual FoxPro. In addition, TechSmith donated copies of SnagIt and Camtasia Studio
Bundle which were given away during the event. All of the above plus lunch and snacks
for the low price of forty dollars. Definitely worth every penny and giving up a Saturday
to attend.
&lt;/p&gt;
&lt;p&gt;
The month of June was another big month for me personally. My wife and I celebrated
our 10th anniversary with a ten day trip to the west coast. We started with three
nights in Las Vegas at New York New York Hotel and Casino. One of my favorite places
in Las Vegas is The Bar at Times Square and the dueling pianos. Another highlight
was seeing "Phantom" at The Venetian. Although I have seen The Phantom of the Opera
a couple of times before, I have to say that this production was by far the best,
and the custom built theatre was amazing.
&lt;/p&gt;
&lt;p&gt;
From Las Vegas we flew over to San Francisco and stayed at the Marriott Fisherman's
Wharf for three nights. San Francisco is a really cool city with a lot of culture
and unique bars, restaurants, and shops. I especially liked that most places we wanted
to go were in walking distance. For the things that were not, the mass transit system
is out of this world compared to what we have back home.
&lt;/p&gt;
&lt;p&gt;
For the last segment of our trip we rented a convertible and drove to Napa Valley.
Along the way we stopped and did some brief hiking at Muir Woods National Monument.
This time we stayed three nights at a bed breakfast two blocks from downtown Napa,
visited several wineries, and finished with a trip to a spa in Calistoga. The whole
trip ended with a Friday night red-eye flight back home so that we would have at least
two days to recoup before going back to work.
&lt;/p&gt;
&lt;p&gt;
Vacation is always nice, but eventually you have to come back home and deal with all
of the things that got left behind. That was July. I don't know where time went, no
special events come to mind, but the days flew by none the less.
&lt;/p&gt;
&lt;p&gt;
On second thought, I did start a half marathon training program in July. On October
5th I'll be running the Brooksie Way Half Marathon in Oakland County, Michigan. This
is my first ever half marathon so I'm not expecting to break any records, finishing
the event will be victory enough.
&lt;/p&gt;
&lt;br&gt;
Links: 
&lt;br&gt;
White Light Computing, Inc. &lt;a href="http://www.whitelightcomputing.com"&gt;http://www.whitelightcomputing.com&lt;/a&gt; 
&lt;br&gt;
GRAFUG &lt;a href="http://www.grafug.com"&gt;http://www.grafug.com&lt;/a&gt; 
&lt;br&gt;
New York New York Hotel &amp;amp; Casino &lt;a href="http://www.nynyhotelcasino.com"&gt;http://www.nynyhotelcasino.com&lt;/a&gt; 
&lt;br&gt;
San Francisco Marriott Fisherman's Wharf &lt;a href="http://www.marriottfishermanswharf.com"&gt;http://www.marriottfishermanswharf.com&lt;/a&gt; 
&lt;br&gt;
Muir Woods National Monument &lt;a href="http://www.visitmuirwoods.com"&gt;http://www.visitmuirwoods.com&lt;/a&gt; 
&lt;br&gt;
Brooksie Way Half Marathon &lt;a href="http://www.thebrooksieway.com"&gt;http://www.thebrooksieway.com&lt;/a&gt; 
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=13b917c7-754d-4def-8f4f-e41c9ca04215" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,13b917c7-754d-4def-8f4f-e41c9ca04215.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=39e9773d-3a64-4fa2-98c0-c151e06f8ac3</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,39e9773d-3a64-4fa2-98c0-c151e06f8ac3.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,39e9773d-3a64-4fa2-98c0-c151e06f8ac3.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=39e9773d-3a64-4fa2-98c0-c151e06f8ac3</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Ever since I decided to post the Beyond Compare add-on utility, VFP2Text, it was always
my intention to also release the source code. The reason I waited was to allow some
time for any bug reports or major enhancement ideas. I figured initially it would
be easier for me to handle them.
</p>
        <p>
Well, it's been over a month since I first blogged about the add-on and so far no
problems reported and the enhancement requests have been about minor changes. So,
in keeping with my original plan, I have posted the source code for the utility on
my web site <a href="http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx">here</a>.
</p>
        <p>
In return, I ask that you please share with me any cool enhancements or bugs you find.
Thanks.
</p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=39e9773d-3a64-4fa2-98c0-c151e06f8ac3" />
      </body>
      <title>VFP2Text Source Code</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,39e9773d-3a64-4fa2-98c0-c151e06f8ac3.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2008/04/15/VFP2TextSourceCode.aspx</link>
      <pubDate>Tue, 15 Apr 2008 11:03:32 GMT</pubDate>
      <description>&lt;p&gt;
Ever since I decided to post the Beyond Compare add-on utility, VFP2Text, it was always
my intention to also release the source code. The reason I waited was to allow some
time for any bug reports or major enhancement ideas. I figured initially it would
be easier for me to handle them.
&lt;/p&gt;
&lt;p&gt;
Well, it's been over a month since I first blogged about the add-on and so far no
problems reported and the enhancement requests have been about minor changes. So,
in keeping with my original plan, I have posted the source code for the utility on
my web site &lt;a href="http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx"&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
In return, I ask that you please share with me any cool enhancements or bugs you find.
Thanks.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=39e9773d-3a64-4fa2-98c0-c151e06f8ac3" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,39e9773d-3a64-4fa2-98c0-c151e06f8ac3.aspx</comments>
      <category>VFP</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=6fedbe29-948e-4a90-a532-c13187b03b0a</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,6fedbe29-948e-4a90-a532-c13187b03b0a.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,6fedbe29-948e-4a90-a532-c13187b03b0a.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=6fedbe29-948e-4a90-a532-c13187b03b0a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last night Mike Feltman, of F1 Technologies, did a presentation called "Collections".
He discussed the basics of collections and arrays, and very some cool utilities he
wrote for working with both.
</p>
        <p>
One of cool things I learned had to do with the FOXOBJ clause of the FOR EACH ...
ENDFOR command. For example, in the following code sample "loObject" is not a Visual
FoxPro object, but is re-casted as a COM object.
</p>
        <p>
          <code>loCollection = CREATEOBJECT("Collection")<br />
loCollection.Add(CREATEOBJECT("Custom"))<br />
FOR EACH loObject IN loCollection<br />
   &amp;&amp; loObject is a COM object, AMEMBERS() returns 0.<br />
ENDFOR</code>
        </p>
        <p>
Starting with Visual FoxPro 9, we can add the FOXOBJ clause so that loObject is a
Visual FoxPro object. This is an important distinction, because functions like AMEMBERS()
and COMOBJ() would produce unexpected results.
</p>
        <p>
          <code>loCollection = CREATEOBJECT("Collection")<br />
loCollection.Add(CREATEOBJECT("Custom"))<br />
FOR EACH loObject IN loCollection FOXOBJECT<br />
   &amp;&amp; loObject is a Visual FoxPro object, AMEMBERS() returns
18.<br />
ENDFOR</code>
        </p>
        <p>
The FOXOBJ clause was not new to me. However, what I did not know was that using the
FOXOBJ clause made the FOR EACH ... ENDFOR command almost 2x faster than the FOR ...
ENDFOR equivalent.
</p>
        <p>
          <code>* create a collection with 10,000 items<br />
loCollection = CREATEOBJECT("Collection")<br />
FOR m.lnX = 1 TO 10000<br />
   loCollection.Add(CREATEOBJECT("Custom"))<br />
ENDFOR<br /><br />
* test the performance using FOR EACH<br />
m.lnStartTime = SECONDS()<br />
FOR EACH loObject IN loCollection<br />
   * do nothing, we already have an object reference<br />
ENDFOR<br />
? "FOR EACH: " + TRANSFORM(SECONDS() - m.lnStartTime) &amp;&amp; 0.156 seconds<br /><br />
* test the performance using FOR EACH with FOXOBJ<br />
m.lnStartTime = SECONDS()<br />
FOR EACH loObject IN loCollection FOXOBJ<br />
   * do nothing, we already have an object reference<br />
ENDFOR<br />
? "FOR EACH with FOXOBJ: " + TRANSFORM(SECONDS() - m.lnStartTime) &amp;&amp; 0.016
seconds<br /><br />
* test the performance using simple FOR<br />
m.lnStartTime = SECONDS()<br />
FOR m.lnX = 1 TO loCollection.COUNT<br />
   * get an object reference to the item<br />
   loObject = loCollection.ITEM(m.lnX)<br />
ENDFOR<br />
? "FOR: " + TRANSFORM(SECONDS() - m.lnStartTime) &amp;&amp; 0.031 seconds</code>
        </p>
        <p>
Little gems like this are one of the benefits of attending local FoxPro user groups
meetings. The opportunity to learn something new, meet new people, and the comradery
are all valuable benefits. 
</p>
        <p>
If you missed this presentation, I heard that Mike will be presenting it again at
the Grand Rapids Area FoxPro User Group on May 10th, 2008.
</p>
        <p>
          <br />
Links:<br />
DAFUG <a href="http://dafug.org">http://dafug.org</a><br />
GRAFUG <a href="http://www.grafug.com">http://www.grafug.com</a><br />
F1 Technologies <a href="http://www.f1tech.com">http://www.f1tech.com</a></p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=6fedbe29-948e-4a90-a532-c13187b03b0a" />
      </body>
      <title>April 2008 - DAFUG Meeting</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,6fedbe29-948e-4a90-a532-c13187b03b0a.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2008/04/11/April2008DAFUGMeeting.aspx</link>
      <pubDate>Fri, 11 Apr 2008 22:43:36 GMT</pubDate>
      <description>&lt;p&gt;
Last night Mike Feltman, of F1 Technologies, did a presentation called "Collections".
He discussed the basics of collections and arrays, and very some cool utilities he
wrote for working with both.
&lt;/p&gt;
&lt;p&gt;
One of cool things I learned had to do with the FOXOBJ clause of the FOR EACH ...
ENDFOR command. For example, in the following code sample "loObject" is not a Visual
FoxPro object, but is re-casted as a COM object.
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;loCollection = CREATEOBJECT("Collection")&lt;br&gt;
loCollection.Add(CREATEOBJECT("Custom"))&lt;br&gt;
FOR EACH loObject IN loCollection&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;amp;&amp;amp; loObject is a COM object, AMEMBERS() returns 0.&lt;br&gt;
ENDFOR&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
Starting with Visual FoxPro 9, we can add the FOXOBJ clause so that loObject is a
Visual FoxPro object. This is an important distinction, because functions like AMEMBERS()
and COMOBJ() would produce unexpected results.
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;loCollection = CREATEOBJECT("Collection")&lt;br&gt;
loCollection.Add(CREATEOBJECT("Custom"))&lt;br&gt;
FOR EACH loObject IN loCollection FOXOBJECT&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;amp;&amp;amp; loObject is a Visual FoxPro object, AMEMBERS() returns
18.&lt;br&gt;
ENDFOR&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
The FOXOBJ clause was not new to me. However, what I did not know was that using the
FOXOBJ clause made the FOR EACH ... ENDFOR command almost 2x faster than the FOR ...
ENDFOR equivalent.
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;* create a collection with 10,000 items&lt;br&gt;
loCollection = CREATEOBJECT("Collection")&lt;br&gt;
FOR m.lnX = 1 TO 10000&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;loCollection.Add(CREATEOBJECT("Custom"))&lt;br&gt;
ENDFOR&lt;br&gt;
&lt;br&gt;
* test the performance using FOR EACH&lt;br&gt;
m.lnStartTime = SECONDS()&lt;br&gt;
FOR EACH loObject IN loCollection&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* do nothing, we already have an object reference&lt;br&gt;
ENDFOR&lt;br&gt;
? "FOR EACH: " + TRANSFORM(SECONDS() - m.lnStartTime) &amp;amp;&amp;amp; 0.156 seconds&lt;br&gt;
&lt;br&gt;
* test the performance using FOR EACH with FOXOBJ&lt;br&gt;
m.lnStartTime = SECONDS()&lt;br&gt;
FOR EACH loObject IN loCollection FOXOBJ&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* do nothing, we&amp;nbsp;already have an object reference&lt;br&gt;
ENDFOR&lt;br&gt;
? "FOR EACH with FOXOBJ: " + TRANSFORM(SECONDS() - m.lnStartTime) &amp;amp;&amp;amp; 0.016
seconds&lt;br&gt;
&lt;br&gt;
* test the performance using simple FOR&lt;br&gt;
m.lnStartTime = SECONDS()&lt;br&gt;
FOR m.lnX = 1 TO loCollection.COUNT&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* get an object reference to the item&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;loObject = loCollection.ITEM(m.lnX)&lt;br&gt;
ENDFOR&lt;br&gt;
? "FOR: " + TRANSFORM(SECONDS() - m.lnStartTime) &amp;amp;&amp;amp; 0.031 seconds&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
Little gems like this are one of the benefits of attending local FoxPro user groups
meetings. The opportunity to learn something new, meet new people, and the comradery
are all valuable benefits. 
&lt;/p&gt;
&lt;p&gt;
If you missed this presentation, I heard that Mike will be presenting it again at
the Grand Rapids Area FoxPro User Group on May 10th, 2008.
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Links:&lt;br&gt;
DAFUG &lt;a href="http://dafug.org"&gt;http://dafug.org&lt;/a&gt;
&lt;br&gt;
GRAFUG &lt;a href="http://www.grafug.com"&gt;http://www.grafug.com&lt;/a&gt;
&lt;br&gt;
F1 Technologies &lt;a href="http://www.f1tech.com"&gt;http://www.f1tech.com&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=6fedbe29-948e-4a90-a532-c13187b03b0a" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,6fedbe29-948e-4a90-a532-c13187b03b0a.aspx</comments>
      <category>DAFUG</category>
      <category>VFP</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=3d894438-42aa-4791-a8c7-fab5fb5118f2</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,3d894438-42aa-4791-a8c7-fab5fb5118f2.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,3d894438-42aa-4791-a8c7-fab5fb5118f2.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=3d894438-42aa-4791-a8c7-fab5fb5118f2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I downloaded my first issue of FoxRockX and I have to say that I like it. The format
reminds me of the old FoxTalk issues. There is a good amount of content; twenty-four
pages with out any advertisements. And of course, source code was included.
</p>
        <p>
Out of the five articles in this issue, Doug Hennig's "Deep Dive: A Generic Import
Utility" is my favorite. This article is part one of a two-part series that will demonstrate
how to add a generic import utility to your application. In this issue he discusses
the overall design and engine code. The next issue will be about the user interface.
</p>
        <p>
Articles like this are a major reason why I subscribe to technical publications.
Maybe I don't have a need for this today. But, I know that there is a good chance
I will someday. And when that time comes I will more than likely use this article
and sample code as inspiration for designing and writing my own.
</p>
        <p>
          <br />
Links:<br />
FoxRockX <a href="http://www.foxrockx.com">http://www.foxrockx.com</a><br />
Subscription in America &amp; Asia <a href="http://www.hentzenwerke.com">http://www.hentzenwerke.com</a><br />
Subscriptions in Europe <a href="http://shop.dfpug.com">http://shop.dfpug.com</a></p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=3d894438-42aa-4791-a8c7-fab5fb5118f2" />
      </body>
      <title>FoxRockX March 2008</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,3d894438-42aa-4791-a8c7-fab5fb5118f2.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2008/04/09/FoxRockXMarch2008.aspx</link>
      <pubDate>Wed, 09 Apr 2008 22:27:24 GMT</pubDate>
      <description>&lt;p&gt;
I downloaded my first issue of FoxRockX and I have to say that I like it. The format
reminds me of the old FoxTalk issues. There is a good amount of content; twenty-four
pages with out any advertisements. And of course, source code was included.
&lt;/p&gt;
&lt;p&gt;
Out of the five articles in this issue, Doug Hennig's "Deep Dive: A Generic Import
Utility" is my favorite. This article is part one of a two-part series that will demonstrate
how to add a generic import utility to your application. In this issue he discusses
the overall design and engine code. The next issue will be about the user interface.
&lt;/p&gt;
&lt;p&gt;
Articles like this are a major&amp;nbsp;reason why I subscribe to technical publications.
Maybe I don't have a need for this today. But, I know that there is a good chance
I will someday. And when that time comes I will more than likely use this article
and sample code as inspiration for designing and writing my own.
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Links:&lt;br&gt;
FoxRockX &lt;a href="http://www.foxrockx.com"&gt;http://www.foxrockx.com&lt;/a&gt; 
&lt;br&gt;
Subscription in America &amp;amp; Asia &lt;a href="http://www.hentzenwerke.com"&gt;http://www.hentzenwerke.com&lt;/a&gt; 
&lt;br&gt;
Subscriptions in Europe &lt;a href="http://shop.dfpug.com"&gt;http://shop.dfpug.com&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=3d894438-42aa-4791-a8c7-fab5fb5118f2" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,3d894438-42aa-4791-a8c7-fab5fb5118f2.aspx</comments>
      <category>FoxRockX</category>
      <category>VFP</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=ec88b5d6-43d5-495a-a50a-3f52d39c33f5</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,ec88b5d6-43d5-495a-a50a-3f52d39c33f5.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,ec88b5d6-43d5-495a-a50a-3f52d39c33f5.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=ec88b5d6-43d5-495a-a50a-3f52d39c33f5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last year we let our subscription to FoxTalk lapse for several reasons. For starters,
there was the marketing tactics of Eli Journals. Then there was the matter where the
archive issues, published before Eli Journals took over, were no longer available
on the web site. But most of all, I felt that the content was not what it used to
be.
</p>
        <p>
So when I heard that Rainer Becker was starting a new on-line magazine called FoxRockX,
I was like "hey that's cool". Then I heard that one of my favorite columns, the KitBox,
would be coming back along with the always entertaining Marcia Atkins and Andy Kramek...and
I thought "that's awesome". But when I found that a FoxRockX subscription included
on-line access to the complete archives of FoxTalk issues...I was sold.
</p>
        <p>
It is going to be so cool to have the old FoxTalk issues available in a searchable
format. I don't know how many times I've been able to get a head start on a problem
by taking advantage of something in one of those articles. Plus, I can't wait to see
the new stuff.
</p>
        <p>
          <br />
Links:<br />
FoxRockX <a href="http://www.foxrockx.com">http://www.foxrockx.com</a><br />
Subscription in America &amp; Asia <a href="http://www.hentzenwerke.com">http://www.hentzenwerke.com</a><br />
Subscriptions in Europe <a href="http://shop.dfpug.com">http://shop.dfpug.com</a></p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=ec88b5d6-43d5-495a-a50a-3f52d39c33f5" />
      </body>
      <title>FoxRockX Announcement</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,ec88b5d6-43d5-495a-a50a-3f52d39c33f5.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2008/04/08/FoxRockXAnnouncement.aspx</link>
      <pubDate>Tue, 08 Apr 2008 22:21:43 GMT</pubDate>
      <description>&lt;p&gt;
Last year we let our subscription to FoxTalk lapse for several reasons. For starters,
there was the marketing tactics of Eli Journals. Then there was the matter where the
archive issues, published before Eli Journals took over, were no longer available
on the web site. But most of all, I felt that the content was not what it used to
be.
&lt;/p&gt;
&lt;p&gt;
So when I heard that Rainer Becker was starting a new on-line magazine called FoxRockX,
I was like "hey that's cool". Then I heard that one of my favorite columns, the KitBox,
would be coming back along with the always entertaining Marcia Atkins and Andy Kramek...and
I thought "that's awesome". But when I found that a FoxRockX subscription included
on-line access to the complete archives of FoxTalk issues...I was sold.
&lt;/p&gt;
&lt;p&gt;
It is going to be so cool to have the old FoxTalk issues available in a searchable
format. I don't know how many times I've been able to get a head start on a problem
by taking advantage of something in one of those articles. Plus, I can't wait to see
the new stuff.
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Links:&lt;br&gt;
FoxRockX &lt;a href="http://www.foxrockx.com"&gt;http://www.foxrockx.com&lt;/a&gt; 
&lt;br&gt;
Subscription in America &amp;amp; Asia &lt;a href="http://www.hentzenwerke.com"&gt;http://www.hentzenwerke.com&lt;/a&gt; 
&lt;br&gt;
Subscriptions in Europe &lt;a href="http://shop.dfpug.com"&gt;http://shop.dfpug.com&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=ec88b5d6-43d5-495a-a50a-3f52d39c33f5" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,ec88b5d6-43d5-495a-a50a-3f52d39c33f5.aspx</comments>
      <category>FoxRockX</category>
      <category>VFP</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=d9fbea0c-8774-4204-9a85-8c5889720c59</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,d9fbea0c-8774-4204-9a85-8c5889720c59.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,d9fbea0c-8774-4204-9a85-8c5889720c59.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=d9fbea0c-8774-4204-9a85-8c5889720c59</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
When I started this blog, it was never my intention to allow so much time between
posts. My goal was to try and blog at least once per month. Well, things have not
quite worked out the way I envisioned. I always seem to find my self starting to write
something, never feeling 100% happy with it, and then abandoning it all together.
</p>
        <p>
I guess blogging is something that does not come easy to me, at least not yet. I think
the only way to beat this problem is to just accept whatever comes out and post it.
If it sucks, well at least I tried. So without further delay, here are some things
that I've been meaning to post.
</p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=d9fbea0c-8774-4204-9a85-8c5889720c59" />
      </body>
      <title>Playing Catch Up</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,d9fbea0c-8774-4204-9a85-8c5889720c59.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2008/04/07/PlayingCatchUp.aspx</link>
      <pubDate>Mon, 07 Apr 2008 22:10:36 GMT</pubDate>
      <description>&lt;p&gt;
When I started this blog, it was never my intention to allow so much time between
posts. My goal was to try and blog at least once per month. Well, things have not
quite worked out the way I envisioned. I always seem to find my self starting to write
something, never feeling 100% happy with it, and then abandoning it all together.
&lt;/p&gt;
&lt;p&gt;
I guess blogging is something that does not come easy to me, at least not yet. I think
the only way to beat this problem is to just accept whatever comes out and post it.
If it sucks, well at least I tried. So without further delay, here are some things
that I've been meaning to post.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=d9fbea0c-8774-4204-9a85-8c5889720c59" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,d9fbea0c-8774-4204-9a85-8c5889720c59.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=f47c9f7e-bb1d-480d-9ff0-116b36f88e55</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,f47c9f7e-bb1d-480d-9ff0-116b36f88e55.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,f47c9f7e-bb1d-480d-9ff0-116b36f88e55.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=f47c9f7e-bb1d-480d-9ff0-116b36f88e55</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Beyond Compare is one of my favorite developer utilities.  It's a tool for comparing
folders, files, and folder like things such as ZIP and CAB files.  It can detect
differences using several methods, such as the timestamp, size, CRC, attributes, and
more.
</p>
        <p>
          <img src="http://pfsolutions-mi.com/blog/images/2008-03-08/folder_comparison.jpg" />
        </p>
        <p>
          <br />
Once two files are identified as not identical, you can drill down into the contents
and see exactly what is different line by line using Beyond Compare's File Viewer.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/text_file_comparison.jpg" />
        </p>
        <p>
          <br />
This feature is cool, however the native file viewer only supports text files such
as HTML, TXT, XML, and so on.  If you try to compare a binary file, you get something
that looks like this.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/binary_file_comparison.jpg" />
        </p>
        <p>
          <br />
I checked Beyond Compare's web site and found several plug-ins for viewing other binary
files like BMP, GIF, JPG, and MP3.  Hmm, not what I was looking for, but could
be a handy thing to have in the future.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/image_file_comparison.jpg" />
        </p>
        <p>
          <br />
I looked around a little more and I found some file viewer rules for handling binary
files like DOC, XLS, and PDF.  Once again, not what I needed, but I would probably
need some day.
</p>
        <p>
So I decided to download a few of these and what I found is that the file viewer rules
use Beyond Compare's capability to launch an external conversion program before a
file is passed to it's native file viewer.  For example, the DOC rule uses a
Visual Basic Script (VBS) to automate Microsoft Word, open the passed DOC file, and
then save a copy of it to a temporary text file.  This temporary file is then
passed to Beyond Compare's internal File Viewer for the line by line comparison.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/word_file_comparison.jpg" />
        </p>
        <p>
          <br />
Bingo!  If Beyond Compare can call an external conversion program, why not write
something that converts FoxPro files to plain text files.  And thus VFP2TEXT
was created.
</p>
        <p>
Here's how it works.  I created a file viewer rule in Beyond Compare for all
FoxPro related file types (CDX, DBC, DBF, DCT, DCX, FPT, FRT, FRX, FXP, H, LBT, LBX,
MNT, MNX, MPR, MPX, PJT, PJX, PRG, QPR, SCT, SCX, VCT, VCX).  This rule calls
executes VFP2TEXT.EXE passing both the original file name and a temporary file name.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/file_comparison_rules.jpg" />
        </p>
        <p>
          <br />
Based on the file type, the VFP2TEXT.EXE program converts the passed file to a text
file using one of the following methods:
</p>
        <ul>
          <li>
Index (CDX, DCX): retrieve the index tag information only.</li>
          <li>
Table (DBF, DBC, FRX, SCX, etc): use the CURSORTOXML() function to generate an XML
file.</li>
          <li>
Text (H, MPR, PRG, etc): no conversion.</li>
          <li>
Visual Class Library (VCX): use the Class Browser View Code feature to generate a
PRG file.</li>
        </ul>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/vcx_file_comparison.jpg" />
        </p>
        <p>
          <br />
If you would like a copy of this utility, you can download the latest version from
my web site <a href="http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx">here</a>. 
When using it, there are a couple of things to keep in mind:
</p>
        <ul>
          <li>
Beyond Compare will execute the conversion program twice, once for the file on the
left and once for the file on the right.</li>
          <li>
Be careful about doing a Rules-Based Comparison on a large directory.  I prefer
to use the Binary Comparison first, and then use a Rules-Based Comparison on the results.</li>
        </ul>
        <p>
          <br />
Links:<br />
Beyond Compare <a href="http://www.scootersoftware.com/">http://www.scootersoftware.com/</a></p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=f47c9f7e-bb1d-480d-9ff0-116b36f88e55" />
      </body>
      <title>Beyond Compare</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,f47c9f7e-bb1d-480d-9ff0-116b36f88e55.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2008/03/08/BeyondCompare.aspx</link>
      <pubDate>Sat, 08 Mar 2008 12:48:52 GMT</pubDate>
      <description>&lt;p&gt;
Beyond Compare is one of my favorite developer utilities.&amp;nbsp; It's a tool for comparing
folders, files, and folder like things such as ZIP and CAB files.&amp;nbsp; It can detect
differences using several methods, such as the timestamp, size, CRC, attributes, and
more.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://pfsolutions-mi.com/blog/images/2008-03-08/folder_comparison.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Once two files are identified as not identical, you can drill down into the contents
and see exactly what is different line by line using Beyond Compare's File Viewer.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/text_file_comparison.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
This feature is cool, however the native file viewer only supports text files such
as HTML, TXT, XML, and so on.&amp;nbsp; If you try to compare a binary file, you get something
that looks like this.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/binary_file_comparison.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
I checked Beyond Compare's web site and found several plug-ins for viewing other binary
files like BMP, GIF, JPG, and MP3.&amp;nbsp; Hmm, not what I was looking for, but could
be a handy thing to have in the future.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/image_file_comparison.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
I looked around a little more and I found some file viewer rules for handling binary
files like DOC, XLS, and PDF.&amp;nbsp; Once again, not what I needed, but I would probably
need some day.
&lt;/p&gt;
&lt;p&gt;
So I decided to download a few of these and what I found is that the file viewer rules
use Beyond Compare's capability to launch an external conversion program before a
file is passed to it's native file viewer.&amp;nbsp; For example, the DOC rule uses a
Visual Basic Script (VBS) to automate Microsoft Word, open the passed DOC file, and
then save a copy of it to a temporary text file.&amp;nbsp; This temporary file is then
passed to Beyond Compare's internal File Viewer for the line by line comparison.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/word_file_comparison.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Bingo!&amp;nbsp; If Beyond Compare can call an external conversion program, why not write
something that converts FoxPro files to plain text files.&amp;nbsp; And thus VFP2TEXT
was created.
&lt;/p&gt;
&lt;p&gt;
Here's how it works.&amp;nbsp; I created a file viewer rule in Beyond Compare for all
FoxPro related file types (CDX, DBC, DBF, DCT, DCX, FPT, FRT, FRX, FXP, H, LBT, LBX,
MNT, MNX, MPR, MPX, PJT, PJX, PRG, QPR, SCT, SCX, VCT, VCX).&amp;nbsp; This rule calls
executes VFP2TEXT.EXE passing both the original file name and a temporary file name.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/file_comparison_rules.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Based on the file type, the VFP2TEXT.EXE program converts the passed file to a text
file using one of the following methods:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Index (CDX, DCX): retrieve the index tag information only.&lt;/li&gt;
&lt;li&gt;
Table (DBF, DBC, FRX, SCX, etc): use the CURSORTOXML() function to generate an XML
file.&lt;/li&gt;
&lt;li&gt;
Text (H, MPR, PRG, etc): no conversion.&lt;/li&gt;
&lt;li&gt;
Visual Class Library (VCX): use the Class Browser View Code feature to generate a
PRG file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/vcx_file_comparison.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
If you would like a copy of this utility, you can download the latest version from
my web site &lt;a href="http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx"&gt;here&lt;/a&gt;.&amp;nbsp;
When using it, there are a couple of things to keep in mind:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Beyond Compare will execute the conversion program twice, once for the file on the
left and once for the file on the right.&lt;/li&gt;
&lt;li&gt;
Be careful about doing a Rules-Based Comparison on a large directory.&amp;nbsp; I prefer
to use the Binary Comparison first, and then use a Rules-Based Comparison on the results.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br&gt;
Links:&lt;br&gt;
Beyond Compare &lt;a href="http://www.scootersoftware.com/"&gt;http://www.scootersoftware.com/&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=f47c9f7e-bb1d-480d-9ff0-116b36f88e55" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,f47c9f7e-bb1d-480d-9ff0-116b36f88e55.aspx</comments>
      <category>VFP</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=61e2c554-d7ea-4eb7-8598-6c30537dd03f</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,61e2c554-d7ea-4eb7-8598-6c30537dd03f.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,61e2c554-d7ea-4eb7-8598-6c30537dd03f.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=61e2c554-d7ea-4eb7-8598-6c30537dd03f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last night Paul Mrozowski did a presentation called "Lucene.NET as a Document Search
Engine".  He began by explaining that <a href="http://incubator.apache.org/projects/lucene.net.html">Lucene.NET</a> is
an open source indexing and search library written in C#.  It is not a traditional
application.  Instead it is a tool developers can use to index and search documents,
such as CHM, DOC, HLP, PDF, RTF, and TXT files.  
</p>
        <p>
Paul first demonstrated how easy it is to install Lucene.NET, some of the configuration
settings, and how to set it up to run as a background service in Microsoft Windows. 
Next he showed us a COM wrapper class that he created in order to use Lucene.NET from
Visual FoxPro.
</p>
        <p>
The wrapper class could be used to index the source files and perform some pretty
complex searches.  I liked the way it could include the surrounding portions
of text with the search results.  For example, if you searched for the phrase
"fox" in "Visual FoxPro Rocks", you could include a variable amount of the original
characters found before and after the search phrase.
</p>
        <p>
In addition to indexing document files, he also demonstrated how the wrapper class
could be used to build your own index entries with meta data.  For example, you
could index the contents of a memo field and then store the table name and record
identification in the meta data.  Later, this information could be searched the
same as document file.
</p>
        <p>
Although the wrapper class did not have the complete functionality of Lucene.NET,
it did fill the most basic needs.  He mentioned the idea of either posting the
sample code to his web site or better yet making it a <a href="http://www.codeplex.com/VFPX">VFPX</a> project. 
All in all, it was a very cool presentation.
</p>
        <p>
          <br />
Links:<br />
DAFUG <a href="http://dafug.org">http://dafug.org</a><br />
Paul Mrozowski <a href="http://www.rcs-solutions.com">http://www.rcs-solutions.com</a><br /></p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=61e2c554-d7ea-4eb7-8598-6c30537dd03f" />
      </body>
      <title>December 2007 - DAFUG Meeting</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,61e2c554-d7ea-4eb7-8598-6c30537dd03f.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2007/12/14/December2007DAFUGMeeting.aspx</link>
      <pubDate>Fri, 14 Dec 2007 19:06:16 GMT</pubDate>
      <description>&lt;p&gt;
Last night Paul Mrozowski did a presentation called "Lucene.NET as a Document Search
Engine".&amp;nbsp; He began by explaining that &lt;a href="http://incubator.apache.org/projects/lucene.net.html"&gt;Lucene.NET&lt;/a&gt; is
an open source indexing and search library written in C#.&amp;nbsp; It is not a traditional
application.&amp;nbsp; Instead it is a tool developers can use to index and search documents,
such as CHM, DOC, HLP, PDF, RTF, and TXT files.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Paul first demonstrated how easy it is to install Lucene.NET, some of the configuration
settings, and how to set it up to run as a background service in Microsoft Windows.&amp;nbsp;
Next he showed us a COM wrapper class that he created in order to use Lucene.NET from
Visual FoxPro.
&lt;/p&gt;
&lt;p&gt;
The wrapper class could be used to index the source files and perform some pretty
complex searches.&amp;nbsp; I liked the way it could include the surrounding portions
of text with the search results.&amp;nbsp; For example, if you searched for the phrase
"fox" in "Visual FoxPro Rocks", you could include a variable amount of the original
characters found before and after the search phrase.
&lt;/p&gt;
&lt;p&gt;
In addition to indexing document files, he also demonstrated how the wrapper class
could be used to build your own index entries with meta data.&amp;nbsp; For example, you
could index the contents of a memo field and then store the table name and record
identification in the meta data.&amp;nbsp; Later, this information could be searched the
same as document file.
&lt;/p&gt;
&lt;p&gt;
Although the wrapper class did not have the complete functionality of Lucene.NET,
it did fill the most basic needs.&amp;nbsp; He mentioned the idea of either posting the
sample code to his web site or better yet making it a &lt;a href="http://www.codeplex.com/VFPX"&gt;VFPX&lt;/a&gt; project.&amp;nbsp;
All in all, it was a very cool presentation.
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Links:&lt;br&gt;
DAFUG &lt;a href="http://dafug.org"&gt;http://dafug.org&lt;/a&gt;
&lt;br&gt;
Paul Mrozowski &lt;a href="http://www.rcs-solutions.com"&gt;http://www.rcs-solutions.com&lt;/a&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=61e2c554-d7ea-4eb7-8598-6c30537dd03f" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,61e2c554-d7ea-4eb7-8598-6c30537dd03f.aspx</comments>
      <category>VFP</category>
      <category>DAFUG</category>
      <category>.NET</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=ca19dbac-8b66-417f-be37-0f6362f08af4</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,ca19dbac-8b66-417f-be37-0f6362f08af4.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,ca19dbac-8b66-417f-be37-0f6362f08af4.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=ca19dbac-8b66-417f-be37-0f6362f08af4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Earlier this year Google launched a directory assistance service meant to replace
the traditional 411.  To use the service, simply dial 1-800-GOOG-411 (800-466-4411)
from any telephone.  You tell the system the city and state, followed by either
a business name or category, such as pizza or movies.  Once a match is found,
you can automatically be connected to the number, get more details such as the address,
or receive a SMS with the results.  The best part, it's free!
</p>
        <p>
Personally, I don't use telephone based directory assistance much anymore.  However
there are times when I don't have access to a web browser, and then Google's 411 is
an excellent alternative.  So, give it a try and if you like it add it to your
cell phone's address book.  And don't forget the less than tech savvy people
in your lives, such as spouses, parents, and your favorite aunt.
</p>
        <p>
Links: <a href="http://www.google.com/goog411/">http://www.google.com/goog411/</a></p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=ca19dbac-8b66-417f-be37-0f6362f08af4" />
      </body>
      <title>Google 411</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,ca19dbac-8b66-417f-be37-0f6362f08af4.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2007/12/09/Google411.aspx</link>
      <pubDate>Sun, 09 Dec 2007 12:52:55 GMT</pubDate>
      <description>&lt;p&gt;
Earlier this year Google launched a directory assistance service meant to replace
the traditional 411.&amp;nbsp; To use the service, simply dial 1-800-GOOG-411 (800-466-4411)
from any telephone.&amp;nbsp; You tell the system the city and state, followed by either
a business name or category, such as pizza or movies.&amp;nbsp; Once a match is found,
you can automatically be connected to the number, get more details such as the address,
or receive a SMS with the results.&amp;nbsp; The best part, it's free!
&lt;/p&gt;
&lt;p&gt;
Personally, I don't use telephone based directory assistance much anymore.&amp;nbsp; However
there are times when I don't have access to a web browser, and then Google's 411 is
an excellent alternative.&amp;nbsp; So, give it a try and if you like it add it to your
cell phone's address book.&amp;nbsp; And don't forget the less than tech savvy people
in your lives, such as spouses, parents, and your favorite aunt.
&lt;/p&gt;
&lt;p&gt;
Links: &lt;a href="http://www.google.com/goog411/"&gt;http://www.google.com/goog411/&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=ca19dbac-8b66-417f-be37-0f6362f08af4" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,ca19dbac-8b66-417f-be37-0f6362f08af4.aspx</comments>
    </item>
  </channel>
</rss>