<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SaltyBlog &#187; FoxPro</title>
	<atom:link href="http://saltydogllc.com/?feed=rss2&#038;cat=10" rel="self" type="application/rss+xml" />
	<link>http://saltydogllc.com</link>
	<description>The Official Blog of Salty Dog Solutions, LLC (Accept no substitutes)</description>
	<lastBuildDate>Thu, 09 Sep 2010 03:15:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>The Upgrade Trail from Visual FoxPro to Silverlight is Getting Blazed</title>
		<link>http://saltydogllc.com/?p=320</link>
		<comments>http://saltydogllc.com/?p=320#comments</comments>
		<pubDate>Mon, 23 Aug 2010 20:31:28 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[FoxPro]]></category>
		<category><![CDATA[Other]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://saltydogllc.com/?p=320</guid>
		<description><![CDATA[If you're interested in upgrading to Silverlight, Southwest Fox Conference is the place to go.]]></description>
			<content:encoded><![CDATA[<p>Lately I&#8217;ve been promoting Silverlight as the most viable upgrade path for Visual FoxPro developers, and out our <a title="MadFox" href="http://madfox.info" target="_blank">MadFox</a> meetings we even have said &#8220;it should be possible to convert SCX and FRX files to XAML?&#8221; I mean, they&#8217;re both just data, right?  Sure one is in DBF format and the other is in XAML, but going back and forth should be straightforward.</p>
<p>Well I just listened to <a href="http://media.libsyn.com/media/akselsoft/FoxShow63.mp3">FoxShow Episode 63</a>, and there is already a commercial tool underway that is going to do exactly that.</p>
<p>(If you want, go ahead and listen to that podcast&#8230;I&#8217;ll wait.  You back? Pretty cool, huh?)</p>
<p><a href="http://swfox.net/UweHabermann.aspx">Uwe Habermann</a>, who to my mind sounds like the bad guy in every James Bond movie, is going to be showing off this tool and doing a lot of other Silverlight stuff at the<a href="http://swfox.net" target="_blank"> Southwest Fox Conference</a>.  Here&#8217;s the point I really want to make: Even if your workplace has decided that FoxPro is passé and all new development must be done in .NET, you owe it to yourself (or they owe it to you) to get to Southwest Fox. There is no other conference where you&#8217;re going to learn so much about .NET from a FoxPro developer&#8217;s unique point-of-view.</p>
]]></content:encoded>
			<wfw:commentRss>http://saltydogllc.com/?feed=rss2&amp;p=320</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://media.libsyn.com/media/akselsoft/FoxShow63.mp3" length="22273636" type="audio/mpeg" />
		</item>
		<item>
		<title>MadFox July 2010 Recap: It&#8217;s Like Jazz</title>
		<link>http://saltydogllc.com/?p=303</link>
		<comments>http://saltydogllc.com/?p=303#comments</comments>
		<pubDate>Wed, 21 Jul 2010 19:42:01 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[FoxPro]]></category>
		<category><![CDATA[Other]]></category>

		<guid isPermaLink="false">http://saltydogllc.com/?p=303</guid>
		<description><![CDATA[July&#8217;s MadFox meeting was like good jazz: we played around with a main theme throughout the night while continually improvising side solos on whatever caught our fancy at the time. We slowly built up to the main theme by reintroducing a theme from a previous meeting, Freshbooks. We discussed some of the features of Freshbooks [...]]]></description>
			<content:encoded><![CDATA[<p>July&#8217;s <a href="http://www.madfox.info">MadFox</a> meeting was like good jazz: we played around with a main theme throughout the night while continually improvising side solos on whatever caught our fancy at the time. </p>
<p>We slowly built up to the main theme by reintroducing a theme from a previous meeting, <a href="http://www.freshbooks.com">Freshbooks</a>.  We discussed some of the features of Freshbooks that I use the most in my business, and some of the features that it currently lacks [sometimes it's the notes you don't play].  We started looking for instruments that would get at those empty places, first discussing the <a href="http://developers.freshbooks.com">Freshbooks API</a>, and the SOAPish interface to get at the data.  Because of the way the request needs to be made and authenticated in a single step and the bountiful documentation that used it, we looked at <a href="http://curl.haxx.se/">Curl</a>, rather than <a href="http://www.west-wind.com">wwIPStuff</a>.  We started a proof of concept by successfully using the command-line CURL interface to retrieve my client list from Freshbooks, and then looked at ways to get that functionality from within Visual FoxPro.  Turns out there&#8217;s a LibCurl.dll that is callable from a <a href="http://www.ctl32.com.ar/libcurl.asp">class library</a> written by Carlos Alloatti that does the trick for us, with the help of the <a href="http://vfp2c.dyndns.org/">VFP2C32</a> library!</p>
<p>One of the side themes we played with along the way were the pros and cons of using <a href="http://en.wikipedia.org/wiki/Globally_unique_identifier">GUIDs</a> as primary keys for tables (great for offline data that&#8217;s brought back online, but a little slower and you don&#8217;t get subsequent records in order the way you do with autoincrementing integers), and the <a href="http://en.wikipedia.org/wiki/Globally_unique_identifier#algorithm">algorithm</a> used to create them (formerly a hash of your MAC and the datetime, now a pseudo-random thingy). There are some <a href="http://stackoverflow.com/questions/1705008/simple-proof-that-guid-is-not-unique">amusing</a> posts about the possibilities of duplicate GUIDs existing.  The VFP2C32 library mentioned above has a CreateGUID() function that is easily called from VFP.</p>
<p>Another theme was XML and the different ways VFP can interact with an XML string, including brute force such as STRTRAN(), FOPEN()/FWRITE(), and of course the old standby of using the MSXML DOM object.</p>
<p>We riffed on <a href="http://msdn.microsoft.com/en-us/library/ms994230.aspx">Great Plains Accounting</a> for a while and its API, and compared with with Sage Pro <a href="http://findaccountingsoftware.com/directory/sage/pro-erp/">f/ka/a AccPac v/k/a SBT</a>.  Then we discussed getting started with programming using <a href="http://msdn.microsoft.com/en-us/library/bb200104.aspx">XNA Studio</a> or the <a href="http://www.microsoft.com/express/">Visual Studio Express</a> versions.  And for an encore I soloed on my current flirtation with <a href="http://www.silverlight.net">Silverlight</a>.</p>
<p>We wrapped it up by having gyros on the rooftop of the <a href="http://parthenongyros.com/">Parthenon</a>.  It was a beautiful night, and another great MadFox meeting.</p>
]]></content:encoded>
			<wfw:commentRss>http://saltydogllc.com/?feed=rss2&amp;p=303</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MadFox Recap, June 2010</title>
		<link>http://saltydogllc.com/?p=297</link>
		<comments>http://saltydogllc.com/?p=297#comments</comments>
		<pubDate>Sat, 19 Jun 2010 03:54:31 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[FoxPro]]></category>

		<guid isPermaLink="false">http://saltydogllc.com/?p=297</guid>
		<description><![CDATA[MadFox June 2010 Recap, in which we talk FoxMock and mock FoxTalk (not really)!]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a recap of the June 2010 Madison Visual FoxPro User Group (<a href="http://madfox.info">MadFox</a>) those who couldn&#8217;t make it to this month&#8217;s meeting:</p>
<p>1. We started by talking about Christof&#8217;s new project, FoxMock.  Before we could really talk about FoxMock however, we had to review unit testing (via FoxUnit) and <a href="http://en.wikipedia.org/wiki/Mock_object">mock objects</a> in general. Once we got that all figured out, we looked at FoxMock, and how we could create mocks in our FoxUnit tests to get them to pass even if we didn&#8217;t have everything finished in the object. We spent quite a bit of time discussing the scenarios in which mocks are useful, and what the advantages and disadvantages of other approaches are. We felt it would be especially useful in a team environment where another developer is responsible for parts of the class you want to test.</p>
<p>2. We next discussed a design pattern that would allow an application&#8217;s business logic to be user-definable and stored in a table that could then be executed ad-hoc.  We looked at variations of EVAL() and the _VFP.() methods before realizing that simply writing the code out to a temporary .prg file and executing that .prg would be a simple way to accomplish what we wanted.  I&#8217;d like to see C# do that!</p>
<p>3. After the meeting we had a lovely Mexican dinner at an <a href="http://www.erinssnug.com/reedsburg/">Irish place</a>.  Mmmm&#8230;.Guiness and burritos.</p>
<p>Next month&#8217;s meeting on July 20th back at Salty Dog World HQ.  See ya then!</p>
<p>Eric</p>
]]></content:encoded>
			<wfw:commentRss>http://saltydogllc.com/?feed=rss2&amp;p=297</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Panda and The Fox</title>
		<link>http://saltydogllc.com/?p=211</link>
		<comments>http://saltydogllc.com/?p=211#comments</comments>
		<pubDate>Thu, 24 Dec 2009 17:48:46 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[FoxPro]]></category>
		<category><![CDATA[File Cannot be Read]]></category>
		<category><![CDATA[Panda Anti-Virus]]></category>
		<category><![CDATA[Visual FoxPro]]></category>

		<guid isPermaLink="false">http://saltydogllc.com/?p=211</guid>
		<description><![CDATA[Be careful when you name your software after animals, as not all animals get along well.  At first.]]></description>
			<content:encoded><![CDATA[<p>This is a story about a Panda and a Fox.  The Fox&#8217;s job was to write amazing software, and for years he performed this job quite well and without hindrance.  He could build royalty-free EXEs quickly and easily, until the 7th version of Windows arrived and put a small hurdle that the Fox had to jump through when building EXEs&#8230;he had to be run as &#8220;Administrator.&#8221; </p>
<p>One day a <a href="http://www.pandasecurity.com/">Panda</a> arrived to protect the kingdom.  His task was to keep viruses from getting through the gates, like a dreamcatcher for malware.  It turned out the previous virus-catcher was stealing memory and talked too much, so he was replaced with this Panda.  The Panda promised to work quickly and in the &#8220;cloud,&#8221; a new way of keeping memory usage low and virus definitions up-to-date.</p>
<p>After the arrival of the Panda however, the Fox started acting weird.  Even though he was running as administrator, he could no longer create these EXEs.  The message &#8220;File cannot be read.&#8221; kept coming up.  He didn&#8217;t know what to do!  He searched the land for a solution and the sage man at <a href="http://www.foxite.com/archives/file-is-not-open-compiling-app-to-exe-0000247813.htm">Foxite </a>suggested putting the Panda in a cage while creating the EXEs.  And this worked!</p>
<p>But he didn&#8217;t want to put the Panda in a cage every time he needed to create an EXE, since he might forget to let him back out again to protect the kingdom against malfeasance.  So he sent a message to the Panda&#8217;s owner asking if they had a better idea.  And lo, it came to pass almost immediately that the Panda learned not to interfere with the Fox&#8217;s work.  Was this some magic that happened in the so-called cloud?  The Fox may never know, but he&#8217;s happy to have this resolved so he may go about his business.</p>
]]></content:encoded>
			<wfw:commentRss>http://saltydogllc.com/?feed=rss2&amp;p=211</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>On VFP and MySql ConnectionStrings</title>
		<link>http://saltydogllc.com/?p=193</link>
		<comments>http://saltydogllc.com/?p=193#comments</comments>
		<pubDate>Mon, 30 Nov 2009 15:02:41 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[FoxPro]]></category>
		<category><![CDATA[ConnectionString]]></category>
		<category><![CDATA[MySql]]></category>
		<category><![CDATA[ODBC]]></category>
		<category><![CDATA[VFP]]></category>

		<guid isPermaLink="false">http://saltydogllc.com/?p=193</guid>
		<description><![CDATA[I&#8217;ve begun doing some preliminary data warehousing of VFP data into MySql in order to test the speed, similar to what I did a few posts back with Advantage Database Server. Since MySql can&#8217;t just use VFP tables the way Advantage can, I created a script to manually load the already extracted and transformed data [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve begun doing some preliminary data warehousing of VFP data into MySql in order to test the speed, similar to what I did a few posts back with <a href="http://saltydogllc.com/?p=163">Advantage Database Server</a>.   Since MySql can&#8217;t just use VFP tables the way Advantage can, I created a script to manually load the already extracted and transformed data into an actual MySql database.  Thanks to VFP&#8217;s SQLPREPARE() and SQLEXEC() passthrough commands, it didn&#8217;t take too long to load the data (about 4 s. per campaign per day, which is about 250 records/s.).</p>
<p>But when it came time to check how quickly I could read back the data, I was befuddled by MySql&#8217;s insistence on returning my integer fields back as char(20).  eg. If I try this</p>
<p><code>iHandle=SQLSTRINGCONNECT("Driver={MySQL ODBC 5.1 Driver};Server=xxxxx;Port=3306;Database=arc;User=xxxx;Password=xxxx;Option=3;",.t.)<br />
SQLEXEC("SELECT 12345 AS id FROM arc_data", "crsData")</code></p>
<p>The id column will be a 20-digit character field.<br />
If I try to force it with<br />
<code>SQLEXEC("SELECT CAST(12345 AS unsigned) AS id FROM arc_data", "crsData")</code> or<br />
<code>SQLEXEC("SELECT CONVERT(12345, unsigned) AS id FROM arc_data", "crsData")</code></p>
<p>The result is still a 20-digit character field. There are other fields that come back this way too but this is the jist of my problem.  [I'm using MySql Server 5.0.45, and I've tried this with ODBC drivers 3.51 and 5.1, both with the same result.]</p>
<p>On a whim, I tried using a DSN rather than a connection string.  It didn&#8217;t work either, but at least I had access to all of the options.  The one that first looked interesting was the one that said &#8220;Treat BIGINT columns like INT columns.&#8221;  Hmmm&#8230;not exactly what I&#8217;m looking for but let&#8217;s try it. </p>
<p><img src="http://saltydogllc.com/img/mysql odbc options.jpg" alt="MySql ODBC Options" /><br />
 It works perfectly now.</p>
<p>So how do we make that work with a connectionstring, my preferred method since I can keep those in a table and not have to distribute it to each machine?  I suspect it has something to do with the OPTION= clause in the string, but I&#8217;ve never found that to be well documented.  However this time when I googled around a bit I found <a href="http://www.codepowered.com/MySQL-ODBC-Driver-5_1-Connection-String-Options">this page</a>, which perfectly laid out how the options in the DSN map to the OPTION= clause.  Yay!</p>
<p>A quick change of code to add 16384 to my OPTIONS= mask&#8230;<br />
<code>iHandle=SQLSTRINGCONNECT("Driver={MySQL ODBC 5.1 Driver};Server=xxxxx;Port=3306;Database=arc;User=xxxx;Password=xxxx;Option=<strong>16387</strong>;",.t.)<br />
SQLEXEC("SELECT 12345 AS id FROM arc_data", "crsData")</code></p>
<p>&#8230;and problem solved.</p>
<p>Here are the MySQL Options, copied here from the <a href="http://www.codepowered.com/MySQL-ODBC-Driver-5_1-Connection-String-Options">CodePowered blog page</a>:</p>
<blockquote><p>MySQL ODBC Driver 5.1 Connection String Options<br />
In a MySQL connection string for ODBC, a parameter called OPTION can be specified to change the behavior of the server. It works as a bitmask, so to use it just take whatever flag you need from the following list and sum up the corresponding numbers, then put that as the value to the OPTION parameter.</p>
<p>2 = Return matched rows instead of affected rows<br />
8 = Allow big result sets<br />
16 = Don&#8217;t prompt when connecting<br />
32 = Enable dynamic cursors<br />
64 = Ignore schema in column specifications<br />
128 = Disable driver-provided cursor support<br />
256 = Don&#8217;t use setlocale()<br />
512 = Pad CHAR to full length with space<br />
1024 = Include table name in SQLDescribeCol()<br />
2048 = Use compression<br />
4096 = Ignore space after function names<br />
8192 = Force use of named pipes<br />
<strong>16384 = Treat BIGINT columns as INT columns</strong><br />
32768 = Disable catalog support<br />
65536 = Read options from my.cnf<br />
131072 = Enable safe options (see documentation)<br />
262144 = Disable transaction support<br />
524288 = Log queries to myodbc.sql<br />
1048576 = Don&#8217;t cache results of forward-only cursors<br />
2097152 = Force use of forward-only cursors<br />
4194304 = Enable automatic reconnect<br />
8388608 = Enable SQL_AUTO_IS_NULL<br />
67108864 = Allow multiple statements<br />
134217728 = Limit column size to signed 32-bit range<br />
268435456 = Always handle binary function results as character data</p>
<p>For example if you want to enable &#8216;Return matched rows instead of affected rows&#8217; and &#8216;Use compression&#8217;, the value to pass as OPTION is 2 + 2048 which is 2050:</p>
<p>Driver={MySQL ODBC 5.1 Driver};Option=2050;Server=localhost;Database=myDataBase;User=myUsername;Password=myPassword;</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://saltydogllc.com/?feed=rss2&amp;p=193</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Results of In-Depth Testing of Visual Foxpro vs. Advantage Database Server</title>
		<link>http://saltydogllc.com/?p=163</link>
		<comments>http://saltydogllc.com/?p=163#comments</comments>
		<pubDate>Thu, 19 Nov 2009 17:27:50 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[FoxPro]]></category>
		<category><![CDATA[Advantage Database Server]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[Visual FoxPro]]></category>

		<guid isPermaLink="false">http://saltydogllc.com/?p=163</guid>
		<description><![CDATA[I was able to spend quite a bit of time configuring a copy of Advantage Database Server (ADS), and then running a series of tests to compare its performance against native Visual Foxpro (VFP). For the ADS, I created a new database on the server and pointed it at a folder of VFP tables. I [...]]]></description>
			<content:encoded><![CDATA[<p>I was able to spend quite a bit of time configuring a copy of Advantage Database Server (ADS), and then running a series of tests to compare its performance against native Visual Foxpro (VFP).  For the ADS, I created a new database on the server and pointed it at a folder of VFP tables. I used Advantage&#8217;s ODBC drivers and pulled the data using a VFP CursorAdapter.<br />
Here are some of my findings:</p>
<h2>Test 1: Straight Performance Pulling Data</h2>
<p>The first test I did was to take the SQL code from getTimeDetail, a method of one of my business objects that’s run probably hundreds of time each night in a variety of queries to retrieve a campaign’s detailed time tracking.</p>
<table border="0" width="150px">
<tbody>
<tr>
<th width="33%">VFP</th>
<th width="33%"> ADS</th>
<th width="33%">Diff</th>
</tr>
<tr>
<td>68.0</td>
<td>85.0</td>
<td>25.0%</td>
</tr>
<tr>
<td>80.0</td>
<td>88.0</td>
<td>10.0%</td>
</tr>
<tr>
<td>70.0</td>
<td>89.0</td>
<td>27.1%</td>
</tr>
<tr>
<td>67.0</td>
<td>86.0</td>
<td>28.4%</td>
</tr>
<tr>
<td>66.0</td>
<td>92.0</td>
<td>39.4%</td>
</tr>
<tr>
<td>65.0</td>
<td>72.0</td>
<td>10.8%</td>
</tr>
</table>
<p><img src="http://saltydogllc.com/img/VFPvsADSTest1.png" alt="Results of Test 1" /></p>
<p>You can see that based on this raw data, VFP is 10-40% faster.  But of course that’s not the only factor…</p>
<h2>Test 2: Network Impact Pulling Data</h2>
<p>One of the benefits of a client server apps are the reduced traffic going over the network. Indeed VFP creates so much NetBIOS traffic that it’s unusable over a Wide-Area Network (WAN). Since one of our goals is to reduce network traffic, I next ran a test where I used <a href="http://wireshark.org" target="_blank">WireShark </a>to watch the conversation between my network card and the server&#8217;s network card.</p>
<h4>VFP SQL Direct</h4>
<table border="0" >
<tbody title="VFP SQL Direct">
<tr>
<th>
Packets</th>
<th>Avg. Packet Size</th>
<th>Bytes</th>
<th>Avg. Bytes/Sec</th>
<th>Avg MB/Sec</th>
</tr>
<tr>
<td>41599</td>
<td>8129.441</td>
<td>21,985,644 </td>
<td> 4,296,521.48 </td>
<td>34.372</td>
</tr>
<td>28207</td>
<td>8005.626</td>
<td>14,052,819 </td>
<td> 3,988,429.10 </td>
<td>31.907</td>
</tr>
<td>236556</td>
<td>9453.83</td>
<td>117,110,517 </td>
<td>4,680,257.27 </td>
<td>37.442</td>
</tr>
<td>11078</td>
<td>962.88	  </td>
<td>6,769,441 </td>
<td>588,387.69 </td>
<td>4.707</td>
</tr>
</tbody</table>
<h4>Advantage Database Server</h4>
<table border="0" >
<tbody title="Advantage Database Server">
<tr>
<th>
Packets</th>
<th>Avg. Packet Size</th>
<th>Bytes</th>
<th>Avg. Bytes/Sec</th>
<th>Avg MB/Sec</th>
</tr>
<tr>
<td>6639</td>
<td>	528.504</td>
<td>	   8,265,584 </td>
<td>	             657,989.62 </td>
<td>	5.264</td>
</tr>
<td>2917</td>
<td>	810.477</td>
<td>	   3,597,375 </td>
<td>	             999,515.98 </td>
<td>	7.996</td>
</tr>
<td>22261</td>
<td>	831.318</td>
<td>	 27,845,533 </td>
<td>	          1,039,867.60 </td>
<td>	8.319</td>
</tr>
<td>3842</td>
<td>	833.387</td>
<td>	   4,761,968 </td>
<td>	          1,032,942.02 </td>
<td>	8.264</td>
</tr>
</tbody>
</table>
<h4>Difference</h4>
<table border="0" >
<tbody title="Difference">
<tr>
<th>
Packets</th>
<th>Avg. Packet Size</th>
<th>Bytes</th>
<th>Avg. Bytes/Sec</th>
<th>Avg MB/Sec</th>
</tr>
<tr>
<td>-84.04%</td>
<td>	-93.50%</td>
<td>	-62.40%</td>
<td>	-84.69%</td>
<td>	-84.69%</td>
</tr>
<td>-89.66%</td>
<td>	-89.88%</td>
<td>	-74.40%</td>
<td>	-74.94%</td>
<td>	-74.94%</td>
</tr>
<td>-90.59%</td>
<td>	-91.21%</td>
<td>	-76.22%</td>
<td>	-77.78%</td>
<td>	-77.78%</td>
</tr>
<td>-65.32%</td>
<td>	-13.45%</td>
<td>	-29.65%</td>
<td>	75.55%</td>
<td>	75.57%</td>
</tr>
</tbody>
</table>
<p>Clearly Advantage has the, er, advantage here. There’s about 90% fewer packets coming across the network here, and quite a few less bytes as well (VFP has to pull unwanted data to get at the stuff you actually want).  What’s curious however, is how much smaller the packet sizes are in ADS, causing essentially lower throughput in this test.<br />
Our network admin thought smaller packet sizes may actually be an advantage during the batch, as the switches will be able to move smaller packets more efficiently. The tech support guys at Advantage said this will be better when multiple users are hitting the server, as well.  Which leads us to the next test…</p>
<h2>Test 3: Multi-User Speed Testing</h2>
<p>In this test, I ran the test bed three times concurrently on 22 campaigns.  This should test how well the server performs when multiple clients are querying the data simultaneously.  This graph shows the aggregated average times to run each campaign.<br />
<img src="http://saltydogllc.com/img/VFPvsADS_Concurrent.png" alt="Results of Concurrent Testing" /></p>
<p>As the Advantage tech support guy suggested, Advantage does perform better under a multi-user load. The 10-40% edge that VFP had under a single load disappeared, and it’s likely that this spread will increase under larger loads.  Conclusion: Advantage scales better than FoxPro.  And of course Advantage is usable over wide-area networks, allowing you to distribute your clients anywhere.</p>
<h2>Considerations</h2>
<p>Advantage has a very nice feature that allows you use existing VFP tables without modification, but that doesn&#8217;t mean you can just install it and, poof, everything is now client/server.   If you don&#8217;t use structural indexes in your VFP tables, you&#8217;ll need to manually link the indexes to the databases using stored procedures in the database.  Depending on how much forethought you put into your data access classes, switching your VFP front-end to use a non-VFP database can be fairly easy or a major undertaking.<br />
Bear in mind these tests were done using a directory of VFP tables, not using Advantage&#8217;s native data schema. Performance may vary.</p>
]]></content:encoded>
			<wfw:commentRss>http://saltydogllc.com/?feed=rss2&amp;p=163</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Sybase Advantage Database Server @ MPCUG</title>
		<link>http://saltydogllc.com/?p=155</link>
		<comments>http://saltydogllc.com/?p=155#comments</comments>
		<pubDate>Thu, 12 Nov 2009 17:06:28 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[FoxPro]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://saltydogllc.com/?p=155</guid>
		<description><![CDATA[Last night Jay and Chris from Sybase took a detour after their presentation at Chicago's FoxPro User/Developer's Group to come up to Madison to give a presentation to the Madison FoxPro Users Group.]]></description>
			<content:encoded><![CDATA[<p>Loyal readers will recall my <a href="http://saltydogllc.com/?p=115">blog posting</a> from <a href="http://swfox.net">Southwest Fox</a> which recounted Ken Levy&#8217;s discussion about <a href="http://www.sybase.com/products/databasemanagement/advantagedatabaseserver">Sybase Advantage Database Server</a>, and what a wonderful upgrade path it is for Visual FoxPro developers looking to create client/server apps from their existing databases without abandoning their existing functioning apps.</p>
<p>Last night Jay Wendt and Chris Franz from Sybase took a detour after their presentation at <a href="http://www.chicagofudg.com/">Chicago&#8217;s FoxPro User/Developer&#8217;s Group</a> to come up to Madison to give a presentation to the <a href="http://madfox.info">Madison FoxPro Users Group</a>.  However MadFox wasn&#8217;t meeting last night, so we booked &#8216;em for the more general <a href="http://www.mpcug.com">Madison PC Users Group</a> meeting.  Chris and Jay toned down the technical details of the Advantage Database Server and gave a very interesting rundown of the features of their product.  I&#8217;m not going to recount them all here, you can certainly read that for yourself, but here are a couple of the highlights that make this product interesting for me:</p>
<ul>
<li>Can use VFP tables as the data store, without breaking existing apps (I can&#8217;t drive this one home enough)</li>
<li>Very low cost of ownership (~ $100/ seat, with no recurring fees)</li>
<li>Participates in MS clustering, giving you a high availability solution at a low cost</li>
<li>There&#8217;s a .NET DataReader class that allows you to traverse the data in an xBase type manner familiar to VFP developers</li>
</ul>
<p>Big thanks to Jay and Chris for coming up to Madison, and thanks for the USB drives with the installation on it.</p>
]]></content:encoded>
			<wfw:commentRss>http://saltydogllc.com/?feed=rss2&amp;p=155</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Top 10 Memories of Southwest Fox 2009</title>
		<link>http://saltydogllc.com/?p=137</link>
		<comments>http://saltydogllc.com/?p=137#comments</comments>
		<pubDate>Mon, 19 Oct 2009 16:31:55 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[FoxPro]]></category>

		<guid isPermaLink="false">http://saltydogllc.com/?p=137</guid>
		<description><![CDATA[10. For an interesting, insider perspective you can read everyone&#8217;s twitter feeds during the event. You don&#8217;t need a twitter account to use this, and it only shows you the ones that where tagged with a &#8216;#swfox&#8217; tag, which isn&#8217;t required and not everyone did on every post, but it&#8217;s insightful to say the least.  [...]]]></description>
			<content:encoded><![CDATA[<p>10. For an interesting, insider perspective you can read everyone&#8217;s <a href="http://twitter.com/#search?q=%23swfox">twitter feeds</a> during the event. You don&#8217;t need a twitter account to use this, and it only shows you the ones that where tagged with a &#8216;#swfox&#8217; tag, which isn&#8217;t required and not everyone did on every post, but it&#8217;s insightful to say the least.  It also demonstrates the potential of Twitter, a technology I saw no good use for before this conference.</p>
<p>9. The number of attendees declined from last year, but it didn&#8217;t feel sparse at all and in fact I felt like it gave me the opportunity to interact with more people. During the final wrapup I was looking around the room and recognizing almost everyone by name.  The social aspect was great.</p>
<p>8. I was recognized by an attendee who last saw me in 1995 at the DevCon in San Diego. That was pretty cool. There was also quite a bit of &#8220;Oh, I&#8217;ve read your posts and it&#8217;s nice to put a face to the name.&#8221;</p>
<p>7.  This sticks out in my head: I was chatting with someone between sessions when I heard Craig Boyd walk up to another fellow and say &#8220;Hey, my name&#8217;s Craig Boyd and I don&#8217;t think we&#8217;ve met. Where ya from?&#8221;</p>
<p>6. I attended over 20 sessions, and it still didn&#8217;t feel like enough. I had to miss some good ones, and feel like I could have gone 2 more days.</p>
<p>5. There&#8217;s is so much to know.  Every session, even the ones where I felt like there couldn&#8217;t be any more to say about that topic, had a ton of good new information. I don&#8217;t understand how you could call yourself a FoxPro developer and not come to conferences, user or groups, or at least subscribe to FoxRockX.</p>
<p>4. Some people are certifiably genius, and we&#8217;re lucky to have them working with us.</p>
<p>3. <a href="http://www.codeplex.com/vfpx">VFPX </a>continues to expand, and will keep FoxPro alive for many years to come. Need a snazzier interface? Better reporting? Check here first.</p>
<p>2. If Tamar, Rick, and Doug ever give up programming (god forbid), they&#8217;ve got a future in event planning. The whole conference seemed, from this attendee&#8217;s perspective, like a well-oiled machine.The facilities were top-notch, and the food was fabulous.  (I&#8217;m really gonna miss the food.  I think I&#8217;m going through bacon withdrawal today). The wifi was quick and flawless this year, and there were plenty of power outlets for laptops. There were also great vendors, giveaways, and a silent auction to raise money for the Ceil Silver Ambassador Fund.</p>
<p>1. <a href="http://swfox.net">Southwest Fox 2010</a> is announced. Support your product, join the community, get involved.</p>
]]></content:encoded>
			<wfw:commentRss>http://saltydogllc.com/?feed=rss2&amp;p=137</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>For Each &#8230; FoxObject</title>
		<link>http://saltydogllc.com/?p=134</link>
		<comments>http://saltydogllc.com/?p=134#comments</comments>
		<pubDate>Sun, 18 Oct 2009 18:17:04 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[FoxPro]]></category>

		<guid isPermaLink="false">http://saltydogllc.com/?p=134</guid>
		<description><![CDATA[Here&#8217;s a tip taken from Tamar&#8217;s session: Prior to VFP 9, enumerating through a collection object rendered COM objects which were&#8230;problematic.  In VFP9, Microsoft apparently introduced a FOXOBJECT keyword which will not make it a COM object, but rather a native VFP object.  This speeds things up tremendously, improves memory and stability, and reduces overhead.  [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a tip taken from Tamar&#8217;s session:</p>
<p>Prior to VFP 9, enumerating through a collection object rendered COM objects which were&#8230;problematic.  In VFP9, Microsoft apparently introduced a FOXOBJECT keyword which will not make it a COM object, but rather a native VFP object.  This speeds things up tremendously, improves memory and stability, and reduces overhead.  I wasn&#8217;t aware of this, but a very nice tip to pick up.</p>
<p>(Tamar mentions that if you subscribe to <a href="http://www.hentzenwerke.com/">FoxRockX</a>, which you all should do, you would have known about this months ago.)</p>
]]></content:encoded>
			<wfw:commentRss>http://saltydogllc.com/?feed=rss2&amp;p=134</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting Your Head Around Business Objects, with Tamar Granor</title>
		<link>http://saltydogllc.com/?p=131</link>
		<comments>http://saltydogllc.com/?p=131#comments</comments>
		<pubDate>Sun, 18 Oct 2009 18:10:37 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[FoxPro]]></category>

		<guid isPermaLink="false">http://saltydogllc.com/?p=131</guid>
		<description><![CDATA[I chose this session with very low expectations.  After all, I had been using business objects pretty religiously for quite a while and consider myself adept at their usage. I get really annoyed when I encounter an app whose business logic is embedded in the U/I, but I try to make my clients understand that [...]]]></description>
			<content:encoded><![CDATA[<p>I chose this session with very low expectations.  After all, I had been using business objects pretty religiously for quite a while and consider myself adept at their usage. I get really annoyed when I encounter an app whose business logic is embedded in the U/I, but I try to make my clients understand that taking some time to separate those will save time (and money) in the long run.</p>
<p>So it was very refreshing when Tamar didn&#8217;t pull out the tired old Northwind database and start wrapping the orders table in a business object. Instead she created a Soduku game in VFP from the ground up, starting with the cell object and building up to the entire game object, all before building a U/I.   When she was done building the &#8220;engine&#8221; of the Soduku game, she mentioned she now could go any number of ways for wrapping a U/I around it, including the possibility for building a text-based version of the game.  (She may have been joking, but I think there are possibilities here for blind people who want to play Soduku!)</p>
<p>She then showed how her graphical U/I (sorry, Stevie Wonder, you&#8217;ll have to wait) interacts with those business objects.  Of specific note was the way she used BINDEVENT in the game object to keep elements of the game well encapsulated, rather than relying on Valid()  methods.</p>
<p>Usually Tamar&#8217;s sessions cover ways to make your life as a VFP developer more productive, such as <a href="http://saltydogllc.com/?p=124">VFP UI enhancements</a>.  This session was different, and really exceeded my expectations.</p>
]]></content:encoded>
			<wfw:commentRss>http://saltydogllc.com/?feed=rss2&amp;p=131</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
