<?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>Sat, 17 Dec 2011 19:14:07 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=afb43b73-1c8b-4a56-8466-9999e1419341</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,afb43b73-1c8b-4a56-8466-9999e1419341.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,afb43b73-1c8b-4a56-8466-9999e1419341.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=afb43b73-1c8b-4a56-8466-9999e1419341</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
It has been more than 7 months since I released the first Website Monitor utility.
Almost immediately after releasing the utility I had some ideas for improvement, but
I wanted to wait until I received some feedback before working on a new version. Well,
it's been long enough and I'm ready to release v1 with a few enhancements.
</p>
        <p>
The first enhancement is an OnErrorCheckEverySeconds setting. This setting controls
how often a website will be checked once an error occurs. For example, I might want
to check a website every 10 minutes, but if an error occurs I want to check every
minute.
</p>
        <p>
The second enhancement is the ability to log each website check to a file. This enhancement
was the most requested feature that I received. The logging feature is activated by
entering a valid directory into the LogFolder setting. If the directory does not exist,
the Website Monitor utility will try to create it. It goes without saying that the
Website Monitor utility will need read, write, and delete rights to the directory.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2011-12-17/log_file.png" />
        </p>
        <p>
The third and final enhancement is related to the second. It is the ability to automatically
purge the old log files. If you don't want the Website Monitor to delete the logs,
simply set the PurgeLogsAfterDays setting to zero.
</p>
        <p>
If you would like a copy of this application, you can download the latest version
from the PF Solutions Downloads page. There is also a link to the original Website
Monitor v0.1.0.0 blog post below.
</p>
        <br />
Links:<br />
PF Solutions Downloads <a href="http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx">http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx</a><br />
Website Monitor v0.1.0.0 <a href="http://www.pfsolutions-mi.com/blog/2011/04/30/WebsiteMonitorV0100.aspx">http://www.pfsolutions-mi.com/blog/2011/04/30/WebsiteMonitorV0100.aspx</a><br /><img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=afb43b73-1c8b-4a56-8466-9999e1419341" /></body>
      <title>Website Monitor v1.0.0.0</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,afb43b73-1c8b-4a56-8466-9999e1419341.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2011/12/17/WebsiteMonitorV1000.aspx</link>
      <pubDate>Sat, 17 Dec 2011 19:14:07 GMT</pubDate>
      <description>&lt;p&gt;
It has been more than 7 months since I released the first Website Monitor utility.
Almost immediately after releasing the utility I had some ideas for improvement, but
I wanted to wait until I received some feedback before working on a new version. Well,
it's been long enough and I'm ready to release v1 with a few enhancements.
&lt;/p&gt;
&lt;p&gt;
The first enhancement is an OnErrorCheckEverySeconds setting. This setting controls
how often a website will be checked once an error occurs. For example, I might want
to check a website every 10 minutes, but if an error occurs I want to check every
minute.
&lt;/p&gt;
&lt;p&gt;
The second enhancement is the ability to log each website check to a file. This enhancement
was the most requested feature that I received. The logging feature is activated by
entering a valid directory into the LogFolder setting. If the directory does not exist,
the Website Monitor utility will try to create it. It goes without saying that the
Website Monitor utility will need read, write, and delete rights to the directory.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2011-12-17/log_file.png"&gt;
&lt;/p&gt;
&gt;
&lt;p&gt;
The third and final enhancement is related to the second. It is the ability to automatically
purge the old log files. If you don't want the Website Monitor to delete the logs,
simply set the PurgeLogsAfterDays setting to zero.
&lt;/p&gt;
&lt;p&gt;
If you would like a copy of this application, you can download the latest version
from the PF Solutions Downloads page. There is also a link to the original Website
Monitor v0.1.0.0 blog post below.
&lt;/p&gt;
&lt;br&gt;
Links:&lt;br&gt;
PF Solutions Downloads &lt;a href="http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx"&gt;http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx&lt;/a&gt;
&lt;br&gt;
Website Monitor v0.1.0.0 &lt;a href="http://www.pfsolutions-mi.com/blog/2011/04/30/WebsiteMonitorV0100.aspx"&gt;http://www.pfsolutions-mi.com/blog/2011/04/30/WebsiteMonitorV0100.aspx&lt;/a&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=afb43b73-1c8b-4a56-8466-9999e1419341" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,afb43b73-1c8b-4a56-8466-9999e1419341.aspx</comments>
      <category>.NET</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=a6395a18-c18e-46fe-af07-e322674c59d7</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,a6395a18-c18e-46fe-af07-e322674c59d7.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,a6395a18-c18e-46fe-af07-e322674c59d7.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=a6395a18-c18e-46fe-af07-e322674c59d7</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
It has been more than 6 months since I released the DiscountASP.NET SQL Backup utility.
In that time I have received some good feedback and zero problems (excluding installation
issues). Based on this, I'm ready to release v1 with a minor enhancement.
</p>
        <p>
One of the most requested features I received was the ability to specify when the
backup process is performed. By default, the DiscountASP.NET SQL Backup utility performs
the Microsoft SQL Database Backup process at 12:00AM every day. Rather than trying
to create my own scheduling system I decided to take advantage of the system that
is already included in Windows - Task Scheduler.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2011-12-04/task_scheduler.png" />
        </p>
        <p>
Step 1: From the Actions menu, select the Create Basic Task... menu option.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2011-12-04/step_menu.png" />
        </p>
        <p>
Step 2: Name the task.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2011-12-04/step_create_a_basic_task.png" />
        </p>
        <p>
Step 3: Select when you want the task to start.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2011-12-04/step_trigger.png" />
        </p>
        <p>
Step 4: Identify how often the task should be started.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2011-12-04/step_trigger_daily.png" />
        </p>
        <p>
Step 5: Select what action you want the task to perform.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2011-12-04/step_action.png" />
        </p>
        <p>
Step 6: Enter the fullpath and filename of the DSB.Service.EXE file into the Program/script
field. Be sure to include "-console" in the Add Arguments field. You will also need
to include the fullpath in the Start in field.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2011-12-04/step_start_a_program.png" />
        </p>
        <p>
Step 7: Click Finish.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2011-12-04/step_finish.png" />
        </p>
        <p>
If you would like a copy of this application, you can download the latest version
from the PF Solutions Downloads page. The original DiscountASP.NET SQL Backup v0.1.0.0
blog post is located at <a href="http://www.pfsolutions-mi.com/blog/2011/05/05/DiscountASPNETSQLBackupV0100.aspx">http://www.pfsolutions-mi.com/blog/2011/05/05/DiscountASPNETSQLBackupV0100.aspx</a><br /></p>
        <br />
Links:<br />
DiscountASP.NET <a href="http://discountasp.net/">http://discountasp.net/</a><br />
DiscountASP.NET Control Panel API <a href="http://support.discountasp.net/KB/a176/control-panel-api.aspx">http://support.discountasp.net/KB/a176/control-panel-api.aspx</a><br />
Microsoft .NET Framework 4 Client Profile <a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5765d7a8-7722-4888-a970-ac39b33fd8ab">http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5765d7a8-7722-4888-a970-ac39b33fd8ab</a><br />
PF Solutions Downloads <a href="http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx">http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx</a><br /><img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=a6395a18-c18e-46fe-af07-e322674c59d7" /></body>
      <title>DiscountASP.NET SQL Backup v1.0.0.0</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,a6395a18-c18e-46fe-af07-e322674c59d7.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2011/12/04/DiscountASPNETSQLBackupV1000.aspx</link>
      <pubDate>Sun, 04 Dec 2011 19:14:06 GMT</pubDate>
      <description>&lt;p&gt;
It has been more than 6 months since I released the DiscountASP.NET SQL Backup utility.
In that time I have received some good feedback and zero problems (excluding installation
issues). Based on this, I'm ready to release v1 with a minor enhancement.
&lt;/p&gt;
&lt;p&gt;
One of the most requested features I received was the ability to specify when the
backup process is performed. By default, the DiscountASP.NET SQL Backup utility performs
the Microsoft SQL Database Backup process at 12:00AM every day. Rather than trying
to create my own scheduling system I decided to take advantage of the system that
is already included in Windows - Task Scheduler.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2011-12-04/task_scheduler.png"&gt;
&lt;/p&gt;
&gt;
&lt;p&gt;
Step 1: From the Actions menu, select the Create Basic Task... menu option.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2011-12-04/step_menu.png"&gt;
&lt;/p&gt;
&gt;
&lt;p&gt;
Step 2: Name the task.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2011-12-04/step_create_a_basic_task.png"&gt;
&lt;/p&gt;
&gt;
&lt;p&gt;
Step 3: Select when you want the task to start.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2011-12-04/step_trigger.png"&gt;
&lt;/p&gt;
&gt;
&lt;p&gt;
Step 4: Identify how often the task should be started.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2011-12-04/step_trigger_daily.png"&gt;
&lt;/p&gt;
&gt;
&lt;p&gt;
Step 5: Select what action you want the task to perform.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2011-12-04/step_action.png"&gt;
&lt;/p&gt;
&gt;
&lt;p&gt;
Step 6: Enter the fullpath and filename of the DSB.Service.EXE file into the Program/script
field. Be sure to include "-console" in the Add Arguments field. You will also need
to include the fullpath in the Start in field.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2011-12-04/step_start_a_program.png"&gt;
&lt;/p&gt;
&gt;
&lt;p&gt;
Step 7: Click Finish.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2011-12-04/step_finish.png"&gt;
&lt;/p&gt;
&gt;
&lt;p&gt;
If you would like a copy of this application, you can download the latest version
from the PF Solutions Downloads page. The original DiscountASP.NET SQL Backup v0.1.0.0
blog post is located at &lt;a href="http://www.pfsolutions-mi.com/blog/2011/05/05/DiscountASPNETSQLBackupV0100.aspx"&gt;http://www.pfsolutions-mi.com/blog/2011/05/05/DiscountASPNETSQLBackupV0100.aspx&lt;/a&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;br&gt;
Links:&lt;br&gt;
DiscountASP.NET &lt;a href="http://discountasp.net/"&gt;http://discountasp.net/&lt;/a&gt;
&lt;br&gt;
DiscountASP.NET Control Panel API &lt;a href="http://support.discountasp.net/KB/a176/control-panel-api.aspx"&gt;http://support.discountasp.net/KB/a176/control-panel-api.aspx&lt;/a&gt;
&lt;br&gt;
Microsoft .NET Framework 4 Client Profile &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5765d7a8-7722-4888-a970-ac39b33fd8ab"&gt;http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5765d7a8-7722-4888-a970-ac39b33fd8ab&lt;/a&gt;
&lt;br&gt;
PF Solutions Downloads &lt;a href="http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx"&gt;http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx&lt;/a&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=a6395a18-c18e-46fe-af07-e322674c59d7" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,a6395a18-c18e-46fe-af07-e322674c59d7.aspx</comments>
      <category>.NET</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=bcf0b746-b643-44f3-a02d-d81288ca9a46</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,bcf0b746-b643-44f3-a02d-d81288ca9a46.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,bcf0b746-b643-44f3-a02d-d81288ca9a46.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=bcf0b746-b643-44f3-a02d-d81288ca9a46</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A little over 6 months ago I started an ASP.NET MVC project for a client. During the
planning phase we evaluated several web hosting companies and in the end choose DiscountASP.NET.
One of the reasons we selected DiscountASP.NET is the Control Panel API feature.
</p>
        <p>
The DiscountASP.NET Control Panel API allows us to programmatically manage our web
hosting account. For example, we can manage email accounts, check bandwidth usage,
and etc. All of these management functions are nice, but the one API feature that
interested us the most was the ability to automate backups of the Microsoft SQL Database.
</p>
        <p>
Look, I think it is important to choose a web hosting service provider who is reliable.
However, any system can fail and data can be lost. Therefore, it is more important
to not only choose a company you can depend on, but to utilize every feature you can
to protect yourself. For this project, the ability to automatically perform a nightly
backup of the website data and then download the backup to local storage was another
layer of protection from a total data loss scenario.
</p>
        <p>
With a simple goal of automating the Microsoft SQL Database Backup process and downloading
the files to local storage, I started thinking about the features this process would
need. Here is what I came up with:
</p>
        <ul>
          <li>
Multiple Database Support - currently my client only has one hosted database, but
I can see that changing in the future.</li>
          <li>
Purge Old Backups - the option to remove backups from the local storage that are more
than XX days old. 
</li>
          <li>
Email Notification - the option to notify me if when a backup was performed and if
the process was successful or failed. 
</li>
        </ul>
        <p>
Based on these criteria, I created the DASP SQL Backup application (DSB.Service.EXE)
for performing automatic backups of a DiscountASP.NET MSSQL database. This application
installs as a Windows Service and runs in the background without any user interface.
Running the application as a service adds the ability to use the Windows Service Control
Manager to Start, Stop, Pause, Resume, and Restart the application. In addition, there
is no need to worry about restarting the application if the PC is rebooted, because
the service can be set to automatically start on boot up.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2011-05-05/service_control_manager_list.png" />
        </p>
        <p>
The DSB.Service.EXE application records all events (success, failure, error) in the
Windows Application Event Log with a Source of DASP SQL Backup. By recording events
in the Windows Application Event Log, I can use the Windows Event Viewer to see what
happened and when. I also don't have to worry about purging old events, because Windows
can handle this automatically.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2011-05-05/event_log_viewer.png" />
        </p>
        <p>
The DSB.Service.EXE application includes command line options for installing, uninstalling,
starting, and stopping the service. Keep in mind that Administrative privileges are
required to perform these commands.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2011-05-05/command_line_options.png" />
        </p>
        <p>
All configuration settings are stored in two XML files: Databases.XML and DSB.Service.exe.config.
At this point I did not create a user interface for modifying these files. This is
something that I am considering for the future.
</p>
        <p>
If you would like a copy of this application, you can download the latest version
from the PF Solutions Downloads page. The following is a list of important notes:
</p>
        <ul>
          <li>
This application requires the Microsoft .NET Framework 4 Client Profile.</li>
          <li>
You must enable the DiscountASP.NET Control Panel API.</li>
          <li>
Be sure to read the README.TXT file for instructions on installing the service and
how to modify the configuration files.</li>
          <li>
I'd love to hear any feedback. What do you like, what do you not like, what kind of
features would you like to see in future versions?</li>
        </ul>
        <br />
Links:<br />
DiscountASP.NET <a href="http://discountasp.net/">http://discountasp.net/</a><br />
DiscountASP.NET Control Panel API <a href="http://support.discountasp.net/KB/a176/control-panel-api.aspx">http://support.discountasp.net/KB/a176/control-panel-api.aspx</a><br />
Microsoft .NET Framework 4 Client Profile <a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5765d7a8-7722-4888-a970-ac39b33fd8ab">http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5765d7a8-7722-4888-a970-ac39b33fd8ab</a><br />
PF Solutions Downloads <a href="http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx">http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx</a><br /><img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=bcf0b746-b643-44f3-a02d-d81288ca9a46" /></body>
      <title>DiscountASP.NET SQL Backup v0.1.0.0</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,bcf0b746-b643-44f3-a02d-d81288ca9a46.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2011/05/05/DiscountASPNETSQLBackupV0100.aspx</link>
      <pubDate>Thu, 05 May 2011 18:42:52 GMT</pubDate>
      <description>&lt;p&gt;
A little over 6 months ago I started an ASP.NET MVC project for a client. During the
planning phase we evaluated several web hosting companies and in the end choose DiscountASP.NET.
One of the reasons we selected DiscountASP.NET is the Control Panel API feature.
&lt;/p&gt;
&lt;p&gt;
The DiscountASP.NET Control Panel API allows us to programmatically manage our web
hosting account. For example, we can manage email accounts, check bandwidth usage,
and etc. All of these management functions are nice, but the one API feature that
interested us the most was the ability to automate backups of the Microsoft SQL Database.
&lt;/p&gt;
&lt;p&gt;
Look, I think it is important to choose a web hosting service provider who is reliable.
However, any system can fail and data can be lost. Therefore, it is more important
to not only choose a company you can depend on, but to utilize every feature you can
to protect yourself. For this project, the ability to automatically perform a nightly
backup of the website data and then download the backup to local storage was another
layer of protection from a total data loss scenario.
&lt;/p&gt;
&lt;p&gt;
With a simple goal of automating the Microsoft SQL Database Backup process and downloading
the files to local storage, I started thinking about the features this process would
need. Here is what I came up with:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Multiple Database Support - currently my client only has one hosted database, but
I can see that changing in the future.&lt;/li&gt;
&lt;li&gt;
Purge Old Backups - the option to remove backups from the local storage that are more
than XX days old. 
&lt;li&gt;
Email Notification - the option to notify me if when a backup was performed and if
the process was successful or failed. 
&lt;/ul&gt;
&lt;p&gt;
Based on these criteria, I created the DASP SQL Backup application (DSB.Service.EXE)
for performing automatic backups of a DiscountASP.NET MSSQL database. This application
installs as a Windows Service and runs in the background without any user interface.
Running the application as a service adds the ability to use the Windows Service Control
Manager to Start, Stop, Pause, Resume, and Restart the application. In addition, there
is no need to worry about restarting the application if the PC is rebooted, because
the service can be set to automatically start on boot up.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2011-05-05/service_control_manager_list.png"&gt;
&lt;/p&gt;
&gt;
&lt;p&gt;
The DSB.Service.EXE application records all events (success, failure, error) in the
Windows Application Event Log with a Source of DASP SQL Backup. By recording events
in the Windows Application Event Log, I can use the Windows Event Viewer to see what
happened and when. I also don't have to worry about purging old events, because Windows
can handle this automatically.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2011-05-05/event_log_viewer.png"&gt;
&lt;/p&gt;
&gt;
&lt;p&gt;
The DSB.Service.EXE application includes command line options for installing, uninstalling,
starting, and stopping the service. Keep in mind that Administrative privileges are
required to perform these commands.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2011-05-05/command_line_options.png"&gt;
&lt;/p&gt;
&gt;
&lt;p&gt;
All configuration settings are stored in two XML files: Databases.XML and DSB.Service.exe.config.
At this point I did not create a user interface for modifying these files. This is
something that I am considering for the future.
&lt;/p&gt;
&lt;p&gt;
If you would like a copy of this application, you can download the latest version
from the PF Solutions Downloads page. The following is a list of important notes:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
This application requires the Microsoft .NET Framework 4 Client Profile.&lt;/li&gt;
&lt;li&gt;
You must enable the DiscountASP.NET Control Panel API.&lt;/li&gt;
&lt;li&gt;
Be sure to read the README.TXT file for instructions on installing the service and
how to modify the configuration files.&lt;/li&gt;
&lt;li&gt;
I'd love to hear any feedback. What do you like, what do you not like, what kind of
features would you like to see in future versions?&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
Links:&lt;br&gt;
DiscountASP.NET &lt;a href="http://discountasp.net/"&gt;http://discountasp.net/&lt;/a&gt;
&lt;br&gt;
DiscountASP.NET Control Panel API &lt;a href="http://support.discountasp.net/KB/a176/control-panel-api.aspx"&gt;http://support.discountasp.net/KB/a176/control-panel-api.aspx&lt;/a&gt;
&lt;br&gt;
Microsoft .NET Framework 4 Client Profile &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5765d7a8-7722-4888-a970-ac39b33fd8ab"&gt;http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5765d7a8-7722-4888-a970-ac39b33fd8ab&lt;/a&gt;
&lt;br&gt;
PF Solutions Downloads &lt;a href="http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx"&gt;http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx&lt;/a&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=bcf0b746-b643-44f3-a02d-d81288ca9a46" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,bcf0b746-b643-44f3-a02d-d81288ca9a46.aspx</comments>
      <category>.NET</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=ceaee65d-c069-4a6a-96e7-5ccbb5e16957</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,ceaee65d-c069-4a6a-96e7-5ccbb5e16957.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,ceaee65d-c069-4a6a-96e7-5ccbb5e16957.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=ceaee65d-c069-4a6a-96e7-5ccbb5e16957</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
For a while now I have wanted a way to monitor my website. I don't visit the site
every day. That meant that if there was ever a failure, it could be weeks before I
found out. I have also found that periodically "hitting" my website prevents the web
server from unloading the site from memory.
</p>
        <p>
Guessing that I wasn't the only person with this issue, I did some research and found
two types of solutions. The first type of solution is what I would describe as a Website
Monitoring Service Provider. In other words, a company that monitor websites for a
monthly and/or annual fee. The second type of solution I found could be described
as Website Monitoring Software. Typically, this was an application I could install
on my PC and configure to monitor one or more websites.
</p>
        <p>
Faced with two kinds of solutions, I started thinking about the features I really
wanted. Here is what I came up with:
</p>
        <ul>
          <li>
Monitor Multiple Websites - the ability to monitor my website and websites for my
clients.</li>
          <li>
Control the Frequency of Checks - the ability to check the "Home" page every 10 minutes,
but only call the "System Maintenance" page every 24 hours.</li>
          <li>
Control the Response Timeout - the "Home" page should respond in less than 15, whereas
the "System Maintenance" page may need several minutes.</li>
          <li>
Failure Notification - the option to notify me if a website did not respond in the
time specified.</li>
          <li>
Resumed Notification - notify me when a website was back online if the previous check
failed. In my experience with using website hosting companies, it is not uncommon
for a website to be un-responsive one moment and then a minute or two later be start
working again</li>
        </ul>
        <p>
Based on these criteria, I was able to immediately rule out both the Website Monitoring
Service Providers and Website Monitoring Software that I had previously found. The
deciding factor was (A) the solution did not have the features I needed or (B) the
price was too high.
</p>
        <p>
One of the perks of being a software developer is that if you can't find an application
that does exactly what you want...you have the skills to build it yourself. (Hmm,
it can be a curse too.) And that is what I did. Here's how it works.
</p>
        <p>
WSM.Service.EXE is an application for monitoring one or more websites. It installs
as a Windows Service and runs in the background without any user interface. This gives
me the benefit of using the Windows Service Control Manager to Start, Stop, Pause,
Resume, and Restart the application. I also don't have to worry about restarting the
application if the PC is rebooted.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2011-04-30/service_control_manager_list.png" />
        </p>
        <p>
The WSM.Service.EXE application records all events (success, failure, error) in the
Windows Application Event Log with a Source of Website Monitor. This gives me the
benefit of using the Windows Event Viewer to see what happened and when. I also don't
have to worry about purging old events, because Windows can handle this automatically.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2011-04-30/event_log_viewer.png" />
        </p>
        <p>
The WSM.Service.EXE application does include command line options for installing,
uninstalling, starting, and stopping the service. Keep in mind that Administrative
privileges are required to perform these commands.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2011-04-30/command_line_options.png" />
        </p>
        <p>
All configuration settings are stored in two XML files: Websites.XML and WSM.Service.exe.config.
At this point I did not create a user interface for modifying these files. This is
something that I am considering for the future.
</p>
        <p>
If you would like a copy of this application, you can get the latest version from
the Downloads page on my website. When using this application, please keep the following
in mind
</p>
        <ul>
          <li>
This application requires Microsoft .NET Framework 4 Client Profile.</li>
          <li>
Be sure to read the README.TXT file for instructions on installing the service and
how to modify the configuration files.</li>
          <li>
I'd love to hear any feedback. What do you like, what do you not like, what kind of
features would you like to see in future versions?</li>
        </ul>
        <br />
Links:<br />
Microsoft .NET Framework 4 Client Profile <a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5765d7a8-7722-4888-a970-ac39b33fd8ab">http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5765d7a8-7722-4888-a970-ac39b33fd8ab</a><br />
PF Solutions Downloads <a href="http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx">http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx</a><br /><img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=ceaee65d-c069-4a6a-96e7-5ccbb5e16957" /></body>
      <title>Website Monitor v0.1.0.0</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,ceaee65d-c069-4a6a-96e7-5ccbb5e16957.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2011/04/30/WebsiteMonitorV0100.aspx</link>
      <pubDate>Sat, 30 Apr 2011 23:21:05 GMT</pubDate>
      <description>&lt;p&gt;
For a while now I have wanted a way to monitor my website. I don't visit the site
every day. That meant that if there was ever a failure, it could be weeks before I
found out. I have also found that periodically "hitting" my website prevents the web
server from unloading the site from memory.
&lt;/p&gt;
&lt;p&gt;
Guessing that I wasn't the only person with this issue, I did some research and found
two types of solutions. The first type of solution is what I would describe as a Website
Monitoring Service Provider. In other words, a company that monitor websites for a
monthly and/or annual fee. The second type of solution I found could be described
as Website Monitoring Software. Typically, this was an application I could install
on my PC and configure to monitor one or more websites.
&lt;/p&gt;
&lt;p&gt;
Faced with two kinds of solutions, I started thinking about the features I really
wanted. Here is what I came up with:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Monitor Multiple Websites - the ability to monitor my website and websites for my
clients.&lt;/li&gt;
&lt;li&gt;
Control the Frequency of Checks - the ability to check the "Home" page every 10 minutes,
but only call the "System Maintenance" page every 24 hours.&lt;/li&gt;
&lt;li&gt;
Control the Response Timeout - the "Home" page should respond in less than 15, whereas
the "System Maintenance" page may need several minutes.&lt;/li&gt;
&lt;li&gt;
Failure Notification - the option to notify me if a website did not respond in the
time specified.&lt;/li&gt;
&lt;li&gt;
Resumed Notification - notify me when a website was back online if the previous check
failed. In my experience with using website hosting companies, it is not uncommon
for a website to be un-responsive one moment and then a minute or two later be start
working again&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Based on these criteria, I was able to immediately rule out both the Website Monitoring
Service Providers and Website Monitoring Software that I had previously found. The
deciding factor was (A) the solution did not have the features I needed or (B) the
price was too high.
&lt;/p&gt;
&lt;p&gt;
One of the perks of being a software developer is that if you can't find an application
that does exactly what you want...you have the skills to build it yourself. (Hmm,
it can be a curse too.) And that is what I did. Here's how it works.
&lt;/p&gt;
&lt;p&gt;
WSM.Service.EXE is an application for monitoring one or more websites. It installs
as a Windows Service and runs in the background without any user interface. This gives
me the benefit of using the Windows Service Control Manager to Start, Stop, Pause,
Resume, and Restart the application. I also don't have to worry about restarting the
application if the PC is rebooted.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2011-04-30/service_control_manager_list.png"&gt;
&lt;/p&gt;
&gt;
&lt;p&gt;
The WSM.Service.EXE application records all events (success, failure, error) in the
Windows Application Event Log with a Source of Website Monitor. This gives me the
benefit of using the Windows Event Viewer to see what happened and when. I also don't
have to worry about purging old events, because Windows can handle this automatically.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2011-04-30/event_log_viewer.png"&gt;
&lt;/p&gt;
&gt;
&lt;p&gt;
The WSM.Service.EXE application does include command line options for installing,
uninstalling, starting, and stopping the service. Keep in mind that Administrative
privileges are required to perform these commands.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2011-04-30/command_line_options.png"&gt;
&lt;/p&gt;
&gt;
&lt;p&gt;
All configuration settings are stored in two XML files: Websites.XML and WSM.Service.exe.config.
At this point I did not create a user interface for modifying these files. This is
something that I am considering for the future.
&lt;/p&gt;
&lt;p&gt;
If you would like a copy of this application, you can get the latest version from
the Downloads page on my website. When using this application, please keep the following
in mind
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
This application requires Microsoft .NET Framework 4 Client Profile.&lt;/li&gt;
&lt;li&gt;
Be sure to read the README.TXT file for instructions on installing the service and
how to modify the configuration files.&lt;/li&gt;
&lt;li&gt;
I'd love to hear any feedback. What do you like, what do you not like, what kind of
features would you like to see in future versions?&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
Links:&lt;br&gt;
Microsoft .NET Framework 4 Client Profile &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5765d7a8-7722-4888-a970-ac39b33fd8ab"&gt;http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5765d7a8-7722-4888-a970-ac39b33fd8ab&lt;/a&gt;
&lt;br&gt;
PF Solutions Downloads &lt;a href="http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx"&gt;http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx&lt;/a&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=ceaee65d-c069-4a6a-96e7-5ccbb5e16957" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,ceaee65d-c069-4a6a-96e7-5ccbb5e16957.aspx</comments>
      <category>.NET</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=c0c19c83-416e-4b77-a3c4-4df7d8446949</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,c0c19c83-416e-4b77-a3c4-4df7d8446949.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,c0c19c83-416e-4b77-a3c4-4df7d8446949.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=c0c19c83-416e-4b77-a3c4-4df7d8446949</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last spring I got to thinking that I really wanted to do a destination race. The kind
where you travel somewhere far away, run a cool race, and then take a few days to
relax before you come back home. I talked to some of my friends who have done similar
things in places like Chicago, Las Vegas, New York, and of course Boston. Everyone
had good suggestions, so to make the decision easier I decided the best thing to do
would be to concentrate more on the when, versus the where.
</p>
        <p>
Looking at my calendar I knew that I already had race plans for most of the summer
and fall. There was the Bayshore Marathon in May, the Mohican in June, the Great Lakes
Relay in July, the Crim in August, Dances with Dirt in September, and the Brooksie
Way in October. That meant the earliest I could schedule anything would be sometime
in November. And for me it seems like I always have some kind of non-running commitment
every weekend in November and December. So that meant the next available time period
would be sometime in January.
</p>
        <p>
Now that I had the when decided, it was time to pick the where. Well, one of the easiest
things about picking a race in January is that the numbers of options are limited
when the goal is to run something long distance. A quick Google search for "January
marathons" returned results for places like Arizona, California, Florida, and Texas.
</p>
        <p>
I would like to say that I took some time and evaluated each race, but as soon as
I saw Walt Disney World Marathon, my decision was made. Yes, the idea of running a
marathon through the Walt Disney World Parks was really appealing. But the part that
sealed the deal for me was the event they call the Goofy Challenge.
</p>
        <p>
The Walt Disney World Marathon is a weekend long event consisting of a 5K (3.1 miles)
on Friday, a 1/2 Marathon (13.1 miles) on Saturday, and a Full Marathon (26.2 miles)
on Sunday. The Goofy Challenge is basically like registering for both the 1/2 and
full marathons.
</p>
        <p>
With the race picked out, the next major obstacle was to convince some friends that
they should go to. This is not an easy task. Especially when the race requires time
off work, travel by plane, and etc. It took a couple of months, but in the end I persuaded
my girlfriend Belinda and two other couples to join us.
</p>
        <p>
Overall I very impressed with Walt Disney World Marathon. It was the most well organized
race I have ever participated in. There were practically no lines for the toilets.
All of the aide stations were stocked with supplies and volunteers. And it seemed
like the entire race course was lined with families, staff, or some kind of entertainment.
</p>
        <p>
My only warning about running the Walt Disney World Marathon is that it will spoil
you. Most of the races that I have run typically have problems like not enough toilets,
aide stations that are not equipped, long stretches without any crowds, course not
marked, etc. I understand that organizing a race is not easy task. There will be problems
and I am ok with that. It was just nice to see that someone could actually do it near
perfect.
</p>
        <br />
Links:<br />
Walt Disney World Marathon <a href="http://espnwwos.disney.go.com/events/rundisney/wdw-marathon/">http://espnwwos.disney.go.com/events/rundisney/wdw-marathon/</a><img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=c0c19c83-416e-4b77-a3c4-4df7d8446949" /></body>
      <title>2011 Walt Disney World Marathon - Goofy Challenge</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,c0c19c83-416e-4b77-a3c4-4df7d8446949.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2011/01/09/2011WaltDisneyWorldMarathonGoofyChallenge.aspx</link>
      <pubDate>Sun, 09 Jan 2011 19:28:19 GMT</pubDate>
      <description>&lt;p&gt;
Last spring I got to thinking that I really wanted to do a destination race. The kind
where you travel somewhere far away, run a cool race, and then take a few days to
relax before you come back home. I talked to some of my friends who have done similar
things in places like Chicago, Las Vegas, New York, and of course Boston. Everyone
had good suggestions, so to make the decision easier I decided the best thing to do
would be to concentrate more on the when, versus the where.
&lt;/p&gt;
&lt;p&gt;
Looking at my calendar I knew that I already had race plans for most of the summer
and fall. There was the Bayshore Marathon in May, the Mohican in June, the Great Lakes
Relay in July, the Crim in August, Dances with Dirt in September, and the Brooksie
Way in October. That meant the earliest I could schedule anything would be sometime
in November. And for me it seems like I always have some kind of non-running commitment
every weekend in November and December. So that meant the next available time period
would be sometime in January.
&lt;/p&gt;
&lt;p&gt;
Now that I had the when decided, it was time to pick the where. Well, one of the easiest
things about picking a race in January is that the numbers of options are limited
when the goal is to run something long distance. A quick Google search for "January
marathons" returned results for places like Arizona, California, Florida, and Texas.
&lt;/p&gt;
&lt;p&gt;
I would like to say that I took some time and evaluated each race, but as soon as
I saw Walt Disney World Marathon, my decision was made. Yes, the idea of running a
marathon through the Walt Disney World Parks was really appealing. But the part that
sealed the deal for me was the event they call the Goofy Challenge.
&lt;/p&gt;
&lt;p&gt;
The Walt Disney World Marathon is a weekend long event consisting of a 5K (3.1 miles)
on Friday, a 1/2 Marathon (13.1 miles) on Saturday, and a Full Marathon (26.2 miles)
on Sunday. The Goofy Challenge is basically like registering for both the 1/2 and
full marathons.
&lt;/p&gt;
&lt;p&gt;
With the race picked out, the next major obstacle was to convince some friends that
they should go to. This is not an easy task. Especially when the race requires time
off work, travel by plane, and etc. It took a couple of months, but in the end I persuaded
my girlfriend Belinda and two other couples to join us.
&lt;/p&gt;
&lt;p&gt;
Overall I very impressed with Walt Disney World Marathon. It was the most well organized
race I have ever participated in. There were practically no lines for the toilets.
All of the aide stations were stocked with supplies and volunteers. And it seemed
like the entire race course was lined with families, staff, or some kind of entertainment.
&lt;/p&gt;
&lt;p&gt;
My only warning about running the Walt Disney World Marathon is that it will spoil
you. Most of the races that I have run typically have problems like not enough toilets,
aide stations that are not equipped, long stretches without any crowds, course not
marked, etc. I understand that organizing a race is not easy task. There will be problems
and I am ok with that. It was just nice to see that someone could actually do it near
perfect.
&lt;/p&gt;
&lt;br&gt;
Links:&lt;br&gt;
Walt Disney World Marathon &lt;a href="http://espnwwos.disney.go.com/events/rundisney/wdw-marathon/"&gt;http://espnwwos.disney.go.com/events/rundisney/wdw-marathon/&lt;/a&gt; &lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=c0c19c83-416e-4b77-a3c4-4df7d8446949" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,c0c19c83-416e-4b77-a3c4-4df7d8446949.aspx</comments>
      <category>Running</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=6e70f4e0-b7bc-4d93-a161-76c7e6248362</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,6e70f4e0-b7bc-4d93-a161-76c7e6248362.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,6e70f4e0-b7bc-4d93-a161-76c7e6248362.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=6e70f4e0-b7bc-4d93-a161-76c7e6248362</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
There must be something about running in a big city that I enjoy, because I signed
up once again for the Detroit Turkey Trot 10K (6.2 miles). This was my second consecutive
year, and like the year before I set a new PR (personal record) by finishing in 46:23
(mm:ss). If I can keep breaking my PR, I may have to make this an annual tradition.
</p>
        <br />
Links:<br />
Detroit Turkey Trot <a href="http://www.theparade.org/turkeytrot/">http://www.theparade.org/turkeytrot/</a><img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=6e70f4e0-b7bc-4d93-a161-76c7e6248362" /></body>
      <title>2010 Detroit Turkey Trot</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,6e70f4e0-b7bc-4d93-a161-76c7e6248362.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2010/11/26/2010DetroitTurkeyTrot.aspx</link>
      <pubDate>Fri, 26 Nov 2010 01:31:29 GMT</pubDate>
      <description>&lt;p&gt;
There must be something about running in a big city that I enjoy, because I signed
up once again for the Detroit Turkey Trot 10K (6.2 miles). This was my second consecutive
year, and like the year before I set a new PR (personal record) by finishing in 46:23
(mm:ss). If I can keep breaking my PR, I may have to make this an annual tradition.
&lt;/p&gt;
&lt;br&gt;
Links:&lt;br&gt;
Detroit Turkey Trot &lt;a href="http://www.theparade.org/turkeytrot/"&gt;http://www.theparade.org/turkeytrot/&lt;/a&gt; &lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=6e70f4e0-b7bc-4d93-a161-76c7e6248362" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,6e70f4e0-b7bc-4d93-a161-76c7e6248362.aspx</comments>
      <category>Running</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=fa0a2bad-a4f6-40f1-bc8f-a7b1c5252a2f</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,fa0a2bad-a4f6-40f1-bc8f-a7b1c5252a2f.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,fa0a2bad-a4f6-40f1-bc8f-a7b1c5252a2f.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=fa0a2bad-a4f6-40f1-bc8f-a7b1c5252a2f</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Part of the work I do involves supporting existing Visual FoxPro applications. In
some cases, the original developers are no longer available and I take over maintaining
the code. Some may not like this kind of work, but I enjoy the variety. I also like
it when I get the opportunity to track down mysterious bugs like the one I'm about
to describe.
</p>
        <p>
The problem occurred in a portion of the code that called the VALIDATE DATABASE command.
I don't recall why the code need to perform the command, but when it executed a "Cannot
open table 'C:\FolderName\TableName.DBF'" message was displayed on the main Visual
FoxPro window.
</p>
        <p>
My first thought was that the table might be corrupt. So I tried viewing the contents
of the table with the USE and BROWSE commands as follows. No errors and everything
worked as expected.
</p>
        <pre>
USE IN SELECT("TableName")
USE "C:\FolderName\TableName.DBF" IN 0 AGAIN ALIAS "TableName" NOUPDATE

SELECT("TableName")
BROWSE
</pre>
        <br />
        <p>
My second thought was that maybe the VALIDATE DATABASE command needed exclusive use
of the table and something else had a shared lock on the table. So I tried viewing
the contents of the table with the following commands. Once again, no errors and everything
worked as expected.
</p>
        <pre>
USE IN SELECT("TableName")
USE "C:\FolderName\TableName.DBF" IN 0 ALIAS "TableName" EXCLUSIVE

SELECT("TableName")
BROWSE
</pre>
        <br />
        <p>
My next thought was that maybe the table or database were corrupt in some unusual
way. I could try recreating the database and table, and then copy the data from the
bad table into the good table. One of the easiest ways to accomplish this is to use
GenDBC. GenDBC is a utility program that is included in the Visual FoxPro Tools folder.
It generates a script of native Visual FoxPro commands that can recreate a database
along with every connection, table, view, relation, and referential integrity constraint.
</p>
        <p>
I ran GenDBC and executed the script to recreate the database and tables. Everything
worked as expected. I was about to start copying the data from the bad table into
the good table when it occurred to me that I should try validating the database first.
So I performed the VALIDATE DATABASE command on the freshly created database...BAM!
I got the "Cannot open table 'C:\FolderName\TableName.DBF'" error message.
</p>
        <p>
This made me wonder if maybe GenDBC failed when it generated the script and just did
not display the error message. So I opened the script and scrolled down to the section
with the table create code. And that is where I noticed something strange. The CREATE
TABLE command looked okay, but the INDEX ON command had the table name included in
the expression. It looked something like this.
</p>
        <pre>
CREATE TABLE "TableName.DBF" (pk I, description C(20))
INDEX ON pk TAG "PK"
INDEX ON TableName.description TAG "DESCRIPTIO"
</pre>
        <br />
        <p>
Including the table name in the index expression is not something I would ever do.
It seemed redundant. So I removed the table name from the index expression, re-ran
GenDBC, and then executed the script to recreate the database and tables. This time
when I performed the VALIDATE DATABASE command, everything worked as expected. Cool!
</p>
        <p>
However, finding a solution isn't always enough for me. I needed to know more. For
example, is this the problem in the INDEX command because it allows the table name
to be included in the index expression or is the problem the VALIDATE DATABASE command?
I did a little research and I found a MSDN article called "Considerations for Creating
Index Expressions". In this article Microsoft states <i>"If you include a field prefaced
by a table alias or work area letter in the index expression, Visual FoxPro generates
an error message."</i> The article isn't very clear about the error, but at least
I had documented proof. Just because Visual FoxPro allows a table name to be included
in the index expression, you shouldn't.
</p>
        <p>
On a side note, an interesting thing happened when I got ready to write this blog
entry. I wanted to have some code that could reproduce the error. So I wrote a program
that would create a database with a both a good table (a table with a valid index
expression), and a bad table (a table with an invalid index expression). When I ran
the VALIDATE DATABASE command I did not get an error like I expected. It took me a
little while to figure out that the error would not occur unless I closed and re-opened
the database. The following code reproduces the behaviour.
</p>
        <p>
        </p>
        <pre>
* create a database
CREATE DATABASE "Sample.DBC"

* add a table with an index and then some records
CREATE TABLE "GoodTable.DBF" (pk I, description C(20))
INDEX ON pk TAG "PK"
INDEX ON description TAG "DESCRIPTIO"
INSERT INTO "GoodTable" (pk, description) VALUES(1, "Description 1")
INSERT INTO "GoodTable" (pk, description) VALUES(2, "Description 2")
INSERT INTO "GoodTable" (pk, description) VALUES(3, "Description 3")

* validate the database, expectation is no error
? "VALIDATE DATABASE (GoodTable)"
VALIDATE DATABASE 

* add a 2nd table, but this time put the alias in the index expression
CREATE TABLE "BadTable.DBF" (pk I, description C(20))
INDEX ON pk TAG "PK"
INDEX ON BadTable.description TAG "DESCRIPTIO"
INSERT INTO "BadTable" (pk, description) VALUES(1, "Description 1")
INSERT INTO "BadTable" (pk, description) VALUES(2, "Description 2")
INSERT INTO "BadTable" (pk, description) VALUES(3, "Description 3")

* validate the database, expectation is an error, but VFP does not display one
? "VALIDATE DATABASE (GoodTable + BadTable)"
VALIDATE DATABASE 

* close and re-open the database
CLOSE DATABASES ALL
OPEN DATABASE "Sample.DBC" EXCLUSIVE

* validate the database, now VFP displays the error
? "VALIDATE DATABASE (GoodTable + BadTable)"
VALIDATE DATABASE 
</pre>
        <br />
Links:<br />
Considerations for Creating Index Expressions <a href="http://msdn.microsoft.com/en-us/library/5bxf1b0a(VS.80).aspx">http://msdn.microsoft.com/en-us/library/5bxf1b0a(VS.80).aspx</a><br /><img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=fa0a2bad-a4f6-40f1-bc8f-a7b1c5252a2f" /></body>
      <title>Never Use an Alias in an Index Expression</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,fa0a2bad-a4f6-40f1-bc8f-a7b1c5252a2f.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2010/11/06/NeverUseAnAliasInAnIndexExpression.aspx</link>
      <pubDate>Sat, 06 Nov 2010 18:41:21 GMT</pubDate>
      <description>&lt;p&gt;
Part of the work I do involves supporting existing Visual FoxPro applications. In
some cases, the original developers are no longer available and I take over maintaining
the code. Some may not like this kind of work, but I enjoy the variety. I also like
it when I get the opportunity to track down mysterious bugs like the one I'm about
to describe.
&lt;/p&gt;
&lt;p&gt;
The problem occurred in a portion of the code that called the VALIDATE DATABASE command.
I don't recall why the code need to perform the command, but when it executed a "Cannot
open table 'C:\FolderName\TableName.DBF'" message was displayed on the main Visual
FoxPro window.
&lt;/p&gt;
&lt;p&gt;
My first thought was that the table might be corrupt. So I tried viewing the contents
of the table with the USE and BROWSE commands as follows. No errors and everything
worked as expected.
&lt;/p&gt;
&lt;pre&gt;
USE IN SELECT("TableName")
USE "C:\FolderName\TableName.DBF" IN 0 AGAIN ALIAS "TableName" NOUPDATE

SELECT("TableName")
BROWSE
&lt;/pre&gt;
&lt;br&gt;
&lt;p&gt;
My second thought was that maybe the VALIDATE DATABASE command needed exclusive use
of the table and something else had a shared lock on the table. So I tried viewing
the contents of the table with the following commands. Once again, no errors and everything
worked as expected.
&lt;/p&gt;
&lt;pre&gt;
USE IN SELECT("TableName")
USE "C:\FolderName\TableName.DBF" IN 0 ALIAS "TableName" EXCLUSIVE

SELECT("TableName")
BROWSE
&lt;/pre&gt;
&lt;br&gt;
&lt;p&gt;
My next thought was that maybe the table or database were corrupt in some unusual
way. I could try recreating the database and table, and then copy the data from the
bad table into the good table. One of the easiest ways to accomplish this is to use
GenDBC. GenDBC is a utility program that is included in the Visual FoxPro Tools folder.
It generates a script of native Visual FoxPro commands that can recreate a database
along with every connection, table, view, relation, and referential integrity constraint.
&lt;/p&gt;
&lt;p&gt;
I ran GenDBC and executed the script to recreate the database and tables. Everything
worked as expected. I was about to start copying the data from the bad table into
the good table when it occurred to me that I should try validating the database first.
So I performed the VALIDATE DATABASE command on the freshly created database...BAM!
I got the "Cannot open table 'C:\FolderName\TableName.DBF'" error message.
&lt;/p&gt;
&lt;p&gt;
This made me wonder if maybe GenDBC failed when it generated the script and just did
not display the error message. So I opened the script and scrolled down to the section
with the table create code. And that is where I noticed something strange. The CREATE
TABLE command looked okay, but the INDEX ON command had the table name included in
the expression. It looked something like this.
&lt;/p&gt;
&lt;pre&gt;
CREATE TABLE "TableName.DBF" (pk I, description C(20))
INDEX ON pk TAG "PK"
INDEX ON TableName.description TAG "DESCRIPTIO"
&lt;/pre&gt;
&lt;br&gt;
&lt;p&gt;
Including the table name in the index expression is not something I would ever do.
It seemed redundant. So I removed the table name from the index expression, re-ran
GenDBC, and then executed the script to recreate the database and tables. This time
when I performed the VALIDATE DATABASE command, everything worked as expected. Cool!
&lt;/p&gt;
&lt;p&gt;
However, finding a solution isn't always enough for me. I needed to know more. For
example, is this the problem in the INDEX command because it allows the table name
to be included in the index expression or is the problem the VALIDATE DATABASE command?
I did a little research and I found a MSDN article called "Considerations for Creating
Index Expressions". In this article Microsoft states &lt;i&gt;"If you include a field prefaced
by a table alias or work area letter in the index expression, Visual FoxPro generates
an error message."&lt;/i&gt; The article isn't very clear about the error, but at least
I had documented proof. Just because Visual FoxPro allows a table name to be included
in the index expression, you shouldn't.
&lt;/p&gt;
&lt;p&gt;
On a side note, an interesting thing happened when I got ready to write this blog
entry. I wanted to have some code that could reproduce the error. So I wrote a program
that would create a database with a both a good table (a table with a valid index
expression), and a bad table (a table with an invalid index expression). When I ran
the VALIDATE DATABASE command I did not get an error like I expected. It took me a
little while to figure out that the error would not occur unless I closed and re-opened
the database. The following code reproduces the behaviour.&lt;p&gt;
&lt;pre&gt;
* create a database
CREATE DATABASE "Sample.DBC"

* add a table with an index and then some records
CREATE TABLE "GoodTable.DBF" (pk I, description C(20))
INDEX ON pk TAG "PK"
INDEX ON description TAG "DESCRIPTIO"
INSERT INTO "GoodTable" (pk, description) VALUES(1, "Description 1")
INSERT INTO "GoodTable" (pk, description) VALUES(2, "Description 2")
INSERT INTO "GoodTable" (pk, description) VALUES(3, "Description 3")

* validate the database, expectation is no error
? "VALIDATE DATABASE (GoodTable)"
VALIDATE DATABASE 

* add a 2nd table, but this time put the alias in the index expression
CREATE TABLE "BadTable.DBF" (pk I, description C(20))
INDEX ON pk TAG "PK"
INDEX ON BadTable.description TAG "DESCRIPTIO"
INSERT INTO "BadTable" (pk, description) VALUES(1, "Description 1")
INSERT INTO "BadTable" (pk, description) VALUES(2, "Description 2")
INSERT INTO "BadTable" (pk, description) VALUES(3, "Description 3")

* validate the database, expectation is an error, but VFP does not display one
? "VALIDATE DATABASE (GoodTable + BadTable)"
VALIDATE DATABASE 

* close and re-open the database
CLOSE DATABASES ALL
OPEN DATABASE "Sample.DBC" EXCLUSIVE

* validate the database, now VFP displays the error
? "VALIDATE DATABASE (GoodTable + BadTable)"
VALIDATE DATABASE 
&lt;/pre&gt;
&lt;br&gt;
Links:&lt;br&gt;
Considerations for Creating Index Expressions &lt;a href="http://msdn.microsoft.com/en-us/library/5bxf1b0a(VS.80).aspx"&gt;http://msdn.microsoft.com/en-us/library/5bxf1b0a(VS.80).aspx&lt;/a&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=fa0a2bad-a4f6-40f1-bc8f-a7b1c5252a2f" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,fa0a2bad-a4f6-40f1-bc8f-a7b1c5252a2f.aspx</comments>
      <category>VFP</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=1cdf0c82-3788-404e-8660-f74ad482a232</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,1cdf0c82-3788-404e-8660-f74ad482a232.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,1cdf0c82-3788-404e-8660-f74ad482a232.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=1cdf0c82-3788-404e-8660-f74ad482a232</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
After running the Bayshore Marathon earlier this year, I decided that I would not
spend my summer training aggressively for any race. Instead I would pick races that
were new to me and fun. Like the The North Face Mohican Trail Run and the Great Lakes
Relay events I ran earlier this year.
</p>
        <p>
However, I still like to measure my performance from year to year. And one of my favorite
ways to do that is to repeat an event that I have ran in the past. I want an event
where the course has some challenges (i.e. not completely flat), and a distance that
is more than 10 miles. For me, the Brooksie Way 1/2 Marathon (13.1 miles) is an excellent
choice. I have run this race in both 2008 and 2009, and the course is definitely a
challenge.
</p>
        <p>
So about a week and half before the race, it occurred to me that I should at least
set some kind of goal for completing. I looked at my finish time from the previous
year 1:52:09 (hh:mm:ss) - average pace 8:33 (mm:ss). I also looked at my recent finish
time for the CRIM 10 mile 1:18:20 (hh:mm:ss) - average pace 7:50 (mm:ss). Based on
this, my first idea was to run a 7:50 (mm:ss) pace for the 13.1 miles. But when I
calculated (13.1 x 7:50) a goal time of 1:42:37 (hh:mm:ss), I didn't like the idea
of finishing just a couple of minutes over one hundred. Therefore, I set my goal time
to complete in under 100 minutes.
</p>
        <p>
With a goal in mind, the next thing I wanted was a running partner. In order to run
13.1 miles in under 100 minutes, I would need to maintain an average pace of 7:37
(mm:ss) or better. This was going to be a challenge for me. Over the years I have
found that the best way to run a race with an aggressive goal is to have someone beside
me. Someone to help distract my mind and push me when I start to feel like giving
up.
</p>
        <p>
So I asked around in my running group if anyone wanted to run the same pace. Unfortunately
for me, the majority of my friends were either training for the Detroit Marathon or
the Columbus Marathon. With their races only two weeks away, most of them did not
want to run that kind of pace. I understood completely. They have been training for
their marathons all summer long, it was not worth risking an injury.
</p>
        <p>
So I made up my mind that I would just do it by myself. But, on race day my friend
Fritz showed up and said that he would run the same pace with me. Fritz and I stayed
together for almost the entire race. That is until we were about a quarter of a mile
from the finish line. That is when Fritz took off and finished two seconds ahead of
me. But I didn't care, because I set a new personal record with a time of 1:39:02
(hh:mm:ss). Fritz, thanks for keeping me on goal.
</p>
Links:<br />
Brooksie Way Half Marathon <a href="http://www.thebrooksieway.com">http://www.thebrooksieway.com</a><br /><img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=1cdf0c82-3788-404e-8660-f74ad482a232" /></body>
      <title>Brooksie Way 2010</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,1cdf0c82-3788-404e-8660-f74ad482a232.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2010/10/03/BrooksieWay2010.aspx</link>
      <pubDate>Sun, 03 Oct 2010 12:10:02 GMT</pubDate>
      <description>&lt;p&gt;
After running the Bayshore Marathon earlier this year, I decided that I would not
spend my summer training aggressively for any race. Instead I would pick races that
were new to me and fun. Like the The North Face Mohican Trail Run and the Great Lakes
Relay events I ran earlier this year.
&lt;/p&gt;
&lt;p&gt;
However, I still like to measure my performance from year to year. And one of my favorite
ways to do that is to repeat an event that I have ran in the past. I want an event
where the course has some challenges (i.e. not completely flat), and a distance that
is more than 10 miles. For me, the Brooksie Way 1/2 Marathon (13.1 miles) is an excellent
choice. I have run this race in both 2008 and 2009, and the course is definitely a
challenge.
&lt;/p&gt;
&lt;p&gt;
So about a week and half before the race, it occurred to me that I should at least
set some kind of goal for completing. I looked at my finish time from the previous
year 1:52:09 (hh:mm:ss) - average pace 8:33 (mm:ss). I also looked at my recent finish
time for the CRIM 10 mile 1:18:20 (hh:mm:ss) - average pace 7:50 (mm:ss). Based on
this, my first idea was to run a 7:50 (mm:ss) pace for the 13.1 miles. But when I
calculated (13.1 x 7:50) a goal time of 1:42:37 (hh:mm:ss), I didn't like the idea
of finishing just a couple of minutes over one hundred. Therefore, I set my goal time
to complete in under 100 minutes.
&lt;/p&gt;
&lt;p&gt;
With a goal in mind, the next thing I wanted was a running partner. In order to run
13.1 miles in under 100 minutes, I would need to maintain an average pace of 7:37
(mm:ss) or better. This was going to be a challenge for me. Over the years I have
found that the best way to run a race with an aggressive goal is to have someone beside
me. Someone to help distract my mind and push me when I start to feel like giving
up.
&lt;/p&gt;
&lt;p&gt;
So I asked around in my running group if anyone wanted to run the same pace. Unfortunately
for me, the majority of my friends were either training for the Detroit Marathon or
the Columbus Marathon. With their races only two weeks away, most of them did not
want to run that kind of pace. I understood completely. They have been training for
their marathons all summer long, it was not worth risking an injury.
&lt;/p&gt;
&lt;p&gt;
So I made up my mind that I would just do it by myself. But, on race day my friend
Fritz showed up and said that he would run the same pace with me. Fritz and I stayed
together for almost the entire race. That is until we were about a quarter of a mile
from the finish line. That is when Fritz took off and finished two seconds ahead of
me. But I didn't care, because I set a new personal record with a time of 1:39:02
(hh:mm:ss). Fritz, thanks for keeping me on goal.
&lt;/p&gt;
Links:&lt;br&gt;
Brooksie Way Half Marathon &lt;a href="http://www.thebrooksieway.com"&gt;http://www.thebrooksieway.com&lt;/a&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=1cdf0c82-3788-404e-8660-f74ad482a232" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,1cdf0c82-3788-404e-8660-f74ad482a232.aspx</comments>
      <category>Running</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=3cea2744-b48f-4721-8238-854740718458</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,3cea2744-b48f-4721-8238-854740718458.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,3cea2744-b48f-4721-8238-854740718458.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=3cea2744-b48f-4721-8238-854740718458</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I have been wanting to run some kind of ultra marathon for a while. (An ultra marathon
is any event greater than 26.2 miles.) So when a couple of friends asked me to run
the Dances with Dirt Hell 50 km (31.1 miles) race, it did not take a whole lot of
arm twisting before I gave in.
</p>
        <p>
Dances with Dirt Hell, also known as DWD Hell, is a one day race event at the Pinckney
State Park in Hell Michigan. There is a 100 km (62.2 miles) Relay race, a 50 mile
race, and a 50 km race. The event is called Dances with Dirt because the races are
not your typical paved roads. The majority of the course is trails. Any by trails
I don't mean the nice gravel packed trails you find in the suburban areas. I mean
the kind of trails that are about 12 to 24 inches wide and littered with obstacles
such as tree roots, fallen trees, and large rocks. The course includes multiple shallow
(up to waist high) river crossings and an one tenth of a mile run upriver.
</p>
        <p>
Normally before I run any kind of long race (more than 20 miles) I create and follow
some kind of training schedule. Unfortunately, I did not decide to run DWD Hell until
about 1 month before the event, so there really wasn't anytime to properly train.
Factor in that I also spent most of the summer with my longest run of the week typically
not more than 10 to 12 miles, I would have to say that I was definitely trained for
running 31 miles. Therefore my goal for DWD Hell was just to finish the race, have
a good time, and not get injured. And that is what I did. I completed my first ultra
marathon in 7:57:14 (hh:mm:ss).
</p>
Links:<br />
Dances with Dirt Hell <a href="http://www.dwdhell.com/">http://www.dwdhell.com/</a><br /><img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=3cea2744-b48f-4721-8238-854740718458" /></body>
      <title>Dances With Dirt Hell 2010</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,3cea2744-b48f-4721-8238-854740718458.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2010/09/11/DancesWithDirtHell2010.aspx</link>
      <pubDate>Sat, 11 Sep 2010 10:53:11 GMT</pubDate>
      <description>&lt;p&gt;
I have been wanting to run some kind of ultra marathon for a while. (An ultra marathon
is any event greater than 26.2 miles.) So when a couple of friends asked me to run
the Dances with Dirt Hell 50 km (31.1 miles) race, it did not take a whole lot of
arm twisting before I gave in.
&lt;/p&gt;
&lt;p&gt;
Dances with Dirt Hell, also known as DWD Hell, is a one day race event at the Pinckney
State Park in Hell Michigan. There is a 100 km (62.2 miles) Relay race, a 50 mile
race, and a 50 km race. The event is called Dances with Dirt because the races are
not your typical paved roads. The majority of the course is trails. Any by trails
I don't mean the nice gravel packed trails you find in the suburban areas. I mean
the kind of trails that are about 12 to 24 inches wide and littered with obstacles
such as tree roots, fallen trees, and large rocks. The course includes multiple shallow
(up to waist high) river crossings and an one tenth of a mile run upriver.
&lt;/p&gt;
&lt;p&gt;
Normally before I run any kind of long race (more than 20 miles) I create and follow
some kind of training schedule. Unfortunately, I did not decide to run DWD Hell until
about 1 month before the event, so there really wasn't anytime to properly train.
Factor in that I also spent most of the summer with my longest run of the week typically
not more than 10 to 12 miles, I would have to say that I was definitely trained for
running 31 miles. Therefore my goal for DWD Hell was just to finish the race, have
a good time, and not get injured. And that is what I did. I completed my first ultra
marathon in 7:57:14 (hh:mm:ss).
&lt;/p&gt;
Links:&lt;br&gt;
Dances with Dirt Hell &lt;a href="http://www.dwdhell.com/"&gt;http://www.dwdhell.com/&lt;/a&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=3cea2744-b48f-4721-8238-854740718458" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,3cea2744-b48f-4721-8238-854740718458.aspx</comments>
      <category>Running</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=98f68bad-bfa7-48b2-aa14-36b26ada2b7c</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,98f68bad-bfa7-48b2-aa14-36b26ada2b7c.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,98f68bad-bfa7-48b2-aa14-36b26ada2b7c.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=98f68bad-bfa7-48b2-aa14-36b26ada2b7c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today I ran the 10 Mile Race at the Crim Festival of Races. This was the third consecutive
year that I have run this race. And just like the year before, I set a new PR (personal
record) by finishing in 1:18:20 (hh:mm:ss).
</p>
        <p>
Getting a new PR is great, but I really do think I had a better time in me. Unfortunately
it was just one of those days when everything before the race did not go the way I
planned. By the time I started to run, my heart wasn't in it anymore. Oh well, I guess
this means there should be no reason why I don't PR next year.
</p>
Links:<br />
Crim Fitness Foundation <a href="http://www.crim.org/">http://www.crim.org/</a><br /><img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=98f68bad-bfa7-48b2-aa14-36b26ada2b7c" /></body>
      <title>Crim Festival of Races 2010</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,98f68bad-bfa7-48b2-aa14-36b26ada2b7c.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2010/08/28/CrimFestivalOfRaces2010.aspx</link>
      <pubDate>Sat, 28 Aug 2010 23:59:25 GMT</pubDate>
      <description>&lt;p&gt;
Today I ran the 10 Mile Race at the Crim Festival of Races. This was the third consecutive
year that I have run this race. And just like the year before, I set a new PR (personal
record) by finishing in 1:18:20 (hh:mm:ss).
&lt;/p&gt;
&lt;p&gt;
Getting a new PR is great, but I really do think I had a better time in me. Unfortunately
it was just one of those days when everything before the race did not go the way I
planned. By the time I started to run, my heart wasn't in it anymore. Oh well, I guess
this means there should be no reason why I don't PR next year.
&lt;/p&gt;
Links:&lt;br&gt;
Crim Fitness Foundation &lt;a href="http://www.crim.org/"&gt;http://www.crim.org/&lt;/a&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=98f68bad-bfa7-48b2-aa14-36b26ada2b7c" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,98f68bad-bfa7-48b2-aa14-36b26ada2b7c.aspx</comments>
      <category>Running</category>
    </item>
  </channel>
</rss>
