After Hours

General discussion

Locked

Kevin Ragsdale - FoxPro Contemplations

By kevin ·
Tags: Off Topic
blog root

This conversation is currently closed to new comments.

Thread display: Collapse - | Expand +

All Comments

Collapse -

How to Shoot Yourself in the Foot

Up to 2094 at 7:07 AM Pacific Daylight Time ... (August 22, 2005). Got Link in Tech Republic mail delivered 8/22 and 1:00 am... So someone is checking this out! <strong><em>  ;-)</em></strong>

Collapse -

The FoxShow

by kevin In reply to Kevin Ragsdale - FoxPro C ...

<p><a href="http://craigbailey.blogspot.com">Craig Bailey</a> notes on his blog that he's <a href="http://craigbailey.blogspot.com/2005/08/vfp-foxpro-show.html">glad to hear</a> the <a href="http://thefoxshow.com">FoxShow</a> is still on the air. I missed the accidental post on the FoxShow site yesterday, but let me say I am also glad to hear it's still on the air.</p>
<p>I believe <a href="http://akselsoft.blogspot.com">Andrew MacNeill</a> has been providing a wonderful resource for the FoxPro community with his podcast (as a 'lone' developer, I must say it's been nice just to be able to 'hear' someone talking about FoxPro), and I really enjoyed the interview segments with Bill Sanders in episodes 16 & 17.</p>
<p>Andrew noted in today's post that he's <a href="http://thefoxshow.com/">looking for guests and guest hosts for the show</a>.</p>
<p>Here's hoping the community will support the effort. If you've listened to the show and looking forward to more, drop a line to Andrew (akselsoft at gmail dot com) and let him know. If you haven't listened yet, <a href="http://thefoxshow.com">give it a try</a>.</p>
<p><a href="http://craigbailey.blogspot.com/2005/08/vfp-foxpro-show.html">Craig Bailey's Thoughts: The FoxPro Show</a></p>
<p> </p>
<p> </p><img height="1" src="http://weblogs.foxite.com/kevinragsdale/aggbug/858.aspx" width="1" />
<p>
<div class="blogdisclaim"><a href="http://weblogs.foxite.com/kevinragsdale/archive/2005/08/06/858.aspx">This post originally appeared on an external website</a></div>

Collapse -

Craig Boyd's Call to Action

by kevin In reply to Kevin Ragsdale - FoxPro C ...

<P>Craig Boyd has an excellent post titled <A href="http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,45bf2281-88a7-4d42-a75d-8fe7e87ae734.aspx">Visual FoxPro Community Action</A> on his blog, providing some great commentary and several references to a variety of VFP community resources.</P>
<P>A brief clip: </P>
<P>“As a community, we can do more in 1 year than Microsoft could do in 10 to improve the state of our beloved product.“</P>
<P><A href="http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,45bf2281-88a7-4d42-a75d-8fe7e87ae734.aspx">http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,45bf2281-88a7-4d42-a75d-8fe7e87ae734.aspx</A></P><img src ="http://weblogs.foxite.com/kevinragsdale/aggbug/836.aspx" width = "1" height = "1" /><p><div class="blogdisclaim"><a href="http://weblogs.foxite.com/kevinragsdale/archive/2005/07/28/836.aspx">This post originally appeared on an external website</a></div>

Collapse -

Microsoft Gadgets

by kevin In reply to Kevin Ragsdale - FoxPro C ...

<P>I was reading Mary Jo Foley's post titled <A href="http://www.microsoft-watch.com/article2/0,1995,1858799,00.asp?kc=MWRSS02129TX1K0000535">Microsoft 'Gadgets': Not Just for the Vista Sidebar</A> last night, and I (naturally) just had to visit the “<A href="http://microsoftgadgets.com/">newly-minted Microsoft Gadgets blog</A>“.</P>
<P>From the MS Gadgets Blog:</P>
<P><FONT face=Verdana size=1>Have you ever wondered how new technologies get developed in Microsoft? Wonder how a cool idea goes from incubation to release? Well, we’re excited to announce that we’ve started a blog designed to bring you closer to the process with the Gadgets blog and we’re kicking it off at the PDC.</FONT></P>
<P>I've played with some of these toys (widgets in the Apple-world) in different flavors over the last few years (<A href="http://www.konfabulator.com">Konfabulator</A> is my favorite), but I've mostly just seen the Windows-widgets as little diversions (eye-candy), nothing really serious --- though I reckon they have potential.</P>
<P>What amazed me about this particular announcement is the <STRONG>excitement</STRONG> about this wonderful new “innovation” from Microsoft. Come on guys and gals, <EM>puh-leeze</EM>. Others have been doing this for <EM>years</EM>.</P>
<P>Need a diversion from your work day? Take some time to read some of the comments from the first post. I'll give you <EM>one guess</EM> what most of the commenters have to say...</P>
<P><A href="http://rssnewsapps.ziffdavis.com/msw.xml">Mary Jo Foley's Microsoft Watch Blog</A></P>
<P><A href="http://microsoftgadgets.com/">Microsoft Gadgets Blog</A></P><img src ="http://weblogs.foxite.com/kevinragsdale/aggbug/909.aspx" width = "1" height = "1" /><p><div class="blogdisclaim"><a href="http://weblogs.foxite.com/kevinragsdale/archive/2005/09/14/909.aspx">This post originally appeared on an external website</a></div>

Collapse -

VFP Dashboard Gadgets

by kevin In reply to Kevin Ragsdale - FoxPro C ...

<P>A while back, I wrote a post about <A href="http://weblogs.foxite.com/kevinragsdale/archive/2005/03/29/302.aspx">Things I've Learned From Users</A>. I received a comment on that post that pointed me to Alan Cooper's book “About Face.” I ordered the book, read it, and immediately began to think about how I could improve the user experience in my apps.</P>
<P>I've recently begun work on a new update for an app I re-wrote for a client last year, and after going back and re-reading Alan's book, I've developed a few ways to make things at least a bit easier for my users.</P>
<P>Here's a little background info on the app:</P>
<P>This app is used by grocery retailers to retrieve electronic pricebooks and invoices from their wholesale suppliers. One of the limitations of the old app (before I re-wrote it last year) was that it could only handle one pricebook. The app used a VFP database container, and was designed to only use one DBC. So, if the retailer needed two or more pricebooks (which is often the case), they had to install one copy of the app for each pricebook they needed. Imagine the confusion for the user. Three icons on the desktop. Same icon, all with the same “My Grocery App“ description, each pointing to a different set of data. It's like needing three copies of Outlook installed to manage three different email accounts. Or installing a new copy of Excel whenever you need to create a new spreadsheet. YUCK!</P>
<P>I eliminated this limitation by re-designing the app to allow for multiple DBC's. No problem there. But, with the benefit of 18-months of hindsight (and user feedback) I could see the navigation method I chose was a bit dated, confusing, and tedious. Using the menu, the user had to do the following to select a different pricebook (which really means they are simply swapping out to a different DBC):</P>
<UL>
<LI>Select File -> Wholesaler Information -> Switch to a Different Wholesaler</LI>
<LI>A new screen opens, with a list of “installed“ wholesalers. Select the one you want and click OK.</LI>
<LI>Select File -> Pricebook Information -> Switch to a Different Pricebook</LI>
<LI>A new screen opens, with a list of “installed“ pricebooks for the “currently selected“ wholesaler. Again, select the one you want, then click OK.</LI></UL>
<P>One of the things I came up with was a dashboard approach for the main screen. Since it is normally filled with nothing but white space (every action is started from the menu or toolbar), I decided to add a few "gadgets" to the screen to make navigation a bit easier and provide some info to the user without the user needing to ask for it.</P>
<P>The gadget needed a way to refresh itself anytime the main screen becomes Active. So, I created a base "gadget" object: a VFP container with a label at the top to mimic a title bar, and a border to distinguish itself from any other gadgets on the screen. A RefreshGadget() method was needed to make sure the gadget contains the proper data for its gadget-specific objects. And of course the easiest way to ensure the gadget would automatically update was to use the BINDEVENT() function. A call to RefreshGadget() and BINDEVENT(_SCREEN,“Activate“,THIS,“RefreshGadget&ldquo in the Init() was all I needed.</P>
<P>For a much easier way for the user to switch pricebooks, I sub-classed my gadget container, adding any gadget-specific objects it needed. Here's a pic of it in the class designer:</P>
<P><IMG src="/images/weblogs_foxite_com/kevinragsdale/161/o_classdesigner.jpg"></P>
<P>The extra labels, graphic, timer, and combo box are all "gadget-specific," since my base gadget class only has the title and border.</P>
<P>One thing I want the user to see (without having to dig around for the info) is the number of pricebooks that are installed on the system. So, I added a “# of pricebooks installed“ label to the upper-right part of the gadget "title bar". In the RefreshGadget() method, a quick method call to my application object returns this info for me.</P>
<P>The “Current Pricebook“ label contains the name of the "currently loaded" pricebook. Though I usually place this in the app's Title Bar, it seemed like a good thing to do. And again, since I can easily get this info from my application object, no harm done.</P>
<P>The "Switch to a Different Pricebook" is a "hyperlabel." Basically, it's a sub-classed label which mimics a hyperlink. This hyperlabel is disabled if there are no pricebooks or only one pricebook installed, and is only visible and enabled if there are two pricebooks installed. If you have two pricebooks installed, one-click and <EM>voila!</EM> A different pricebook (DBC) is loaded!</P>
<P>The "Add a New Pricebook" hyperlabel launches the "New Pricebook Wizard" (if you've read my earlier posts, you know I just <EM>love</EM> wizards). </P>
<P>The "Switch to" combo box replaces the "Switch to a Different Pricebook" label if there are more than two pricebooks installed. Basically, two clicks is all it takes to replace the previous two menu selections, two listbox selections and two button clicks.</P>
<P>The timer simply makes the "# of Pricebooks installed" label blink if there are no pricebooks installed. Kind of a visual indicator that the user needs to do something (like add a new pricebook).</P>
<P>And the graphic? I dunno. People just seem to like to see pictures on their screen.</P>
<P>Here's a few more pics of the PricebookGadget "in action":</P>
<P><IMG src="/images/weblogs_foxite_com/kevinragsdale/161/o_pb2_1.jpg"></P>
<P>When you have three or more pricebooks installed, the “Switch to“ label is replaced by a combo box:</P>
<P><IMG src="/images/weblogs_foxite_com/kevinragsdale/161/o_pb3_1.jpg"></P>
<P><IMG src="/images/weblogs_foxite_com/kevinragsdale/161/o_pb3_2.jpg"></P>
<P>With just a little bit of code, a lot of the tedious steps are becoming one-click solutions (I've also created an “InvoiceGadget“, “PalmGadget“ for HotSyncing, and a couple of historical data gadgets. When I figure out a more generic use for my gadgets, I'll post the code for them.</P>
<P>Here's hoping my users will appreciate the new enhancements.</P>
<P>And here's hoping the screenshots actually appear in the post :)</P><img src ="http://weblogs.foxite.com/kevinragsdale/aggbug/**1.aspx" width = "1" height = "1" /><p><div class="blogdisclaim"><a href="http://weblogs.foxite.com/kevinragsdale/archive/2005/09/14/**1.aspx">This post originally appeared on an external website</a></div>

Collapse -

I Just Got Spanked for Writing Good Software

by kevin In reply to Kevin Ragsdale - FoxPro C ...

<P>I just got off the phone with a client who, although pleased with the quality of my work, is actually <STRONG>angry</STRONG> with me because the software I wrote is “too good” and takes “too long“ to develop.</P>
<P>Yeah, you read that right. The software is <EM>too good</EM>. </P>
<P>Remember the app I talked about in my last post? Here's a quick little history of its development:</P>
<P>1. It was originally developed by two different developers (the first one never finished it), who had two support/testing specialists, a technical writer, and a graphic designer at their disposal.</P>
<P>2. The product was sold for big bucks, along with an annual maintenance agreement (15% of the sales price), which ensured the client would always get the latest version of the software, and <STRONG>FREE</STRONG> support for the year (FREE meaning that you were reporting a programming bug, not a “procedural” issue).</P>
<P>3. It worked. Most of the time. But, thanks to the overall design of the program, there were many quirks and inconsistencies. Support averaged over 12 hours a week. <STRONG><EM>At $125 an hour</EM></STRONG>. And most of the support was <STRONG>BILLABLE</STRONG>, even if the customer had paid their “maintenance.” Why? Because it was easy for them to turn a bug into a “procedural” issue, which meant the user wasn't using the program right, and <EM>that's</EM> why the app wasn't working.</P>
<P>4. The customers renewed their annual maintenance every year, I suspect because they knew it was impossible to support the app on their own. Plus, I suppose they hoped that eventually they would get a version that was less quirky.</P>
<P>Eventually, I was given the task of re-writing the application. Six-months later, I delivered the final version. Application design? Me. Development? Me. Testing? Me (yeah, you read that right). Beta Testing? Me (yep, you read that right, too). Help Files? Me. Graphics? Me. Deployment? Me.</P>
<P>Six months. And for the last three of those six months, I was “spanked” by my client on an almost daily basis. Why? Because the app should have been written in three months --- not six months (their opinion --- conveniently forgetting that the original app took two developers almost two-and-a-half years to deliver a finished product).</P>
<P>The finished app was delivered in April of 2004. Earlier this week, I fixed a bug in the program. It was the first bug reported since February of this year. And “only” the seventh bug reported since the release, almost 18 months ago.</P>
<P>Support is now about 1 hour per month. And my client is <EM><STRONG>pissed</STRONG></EM>.</P>
<P>Why? Because a couple of customers have decided that the program is so stable, they don't need to pay the annual maintenance anymore. The program pretty much takes care of itself and<EM> their</EM> customers, so why bother?</P>
<P>I am currently in the process of making some pretty major enhancements in the system. Mostly user-experience enhancements, though I am also replacing the entire SOAP communication backbone with an HTTPS/FOXISAPI solution.</P>
<P>My client needs these enhancements, because they want the customers to pay the annual maintenance in order to receive the enhancements. And, my client wants to tell them it will be ready at the end of <STRONG>NEXT WEEK</STRONG>, even though I specifically gave them a December timeframe.</P>
<P>Solid, <STRONG>stable</STRONG>, custom software development. And all I can get is “<EM>did you really have to write it so good?</EM>“ and “<EM>why does it take so long for you to write it?</EM>“ Gee, I don't know. Is it good because it took so long, or did it take so long because it's good?</P>
<P>I reckon I better get back to work now, even though my client knows that software development is really just magic. Snap your fingers --- and it's <STRONG>done</STRONG>! </P>
<P>Heck, I probably could have redesigned the data structure, and created 10 forms (with accompanying help files) in the 15 minutes it took to write this post. :)</P><img src ="http://weblogs.foxite.com/kevinragsdale/aggbug/**6.aspx" width = "1" height = "1" /><p><div class="blogdisclaim"><a href="http://weblogs.foxite.com/kevinragsdale/archive/2005/09/16/**6.aspx">This post originally appeared on an external website</a></div>

Collapse -

I Just Got Spanked for Writing Good Software

by CindyPsych In reply to I Just Got Spanked for Wr ...

<p>We need to start selling software like we sell cars:  warranteed for a certain period of time for free.  And not 90 days.  It takes more than 90 days for most users to figure out what's right, let alone what's wrong.  Software companies could compete with each other by advertising the length of their warrantee.  "Buy our database.  It's pretty much the same as their database but we will give you a free, complete warrantee with full tech support for 2 years!"  Then they would have incentive to write good, stable, usable software and actually improve it over time, not just patch it.  </p>
<p>Regardless, you should be proud of yourself for a job well done.  The industry needs more programmers who work the way you do.</p>
<p> - CindyPsych</p>

Collapse -

I Just Got Spanked for Writing Good Software

by apotheon In reply to I Just Got Spanked for Wr ...

<div style="text-align: justify">
<p>If I find a need, and have the authority, to hire a programmer for some work here, I'd like to know the names of the two guys that came before you. Then, I'd recommend you for an interview, and recommend against hiring the other two guys.</p>
<p>Something tells me you're working for the wrong guy.</p>
</div>

Collapse -

Lousy Security Practices

by kevin In reply to Kevin Ragsdale - FoxPro C ...

<P>I sent an email this morning to a client. Attached a zipped file, like I've done a gazillion times before.</P>
<P>One minute later, I receive an automated reply from their “network guy,” who seems to <EM>really</EM> take security seriously:</P>
<P>“<STRONG>Company XYZ has removed an attachment during a real-time scan of the email traffic. We do not accept file attachments!</STRONG>”</P>
<P>While I go about the task of posting the zip file to an FTP site (hoping they can at least <EM>download</EM> a zip file --- they can), I get a reply from the client:</P>
<P>“Hey Kevin, they don't let us receive zip files as attachments. Rename the file, dropping the 'p' from 'zip', and it should come through fine.</P>
<P>Hmmmm... Instead of actually running a virus scan on incoming attachments, let's block any file with a 'zip' extension. If it's a problem, let our users have a workaround by renaming the file with an extension our “real-time” scanner doesn't recognize. Meanwhile, let's also let our users download any file they want through their web browser.</P>
<P>Smart. :)</P><img src ="http://weblogs.foxite.com/kevinragsdale/aggbug/**7.aspx" width = "1" height = "1" /><p><div class="blogdisclaim"><a href="http://weblogs.foxite.com/kevinragsdale/archive/2005/09/16/**7.aspx">This post originally appeared on an external website</a></div>

Collapse -

Tribute: Drew Speedie

by kevin In reply to Kevin Ragsdale - FoxPro C ...

<P>I was shocked and saddened to hear about the <A href="http://fox.wikis.com/wc.dll?Wiki~DrewSpeedieTragedy">tragic deaths</A> of Drew Speedie and his son Brent.</P>
<P>I was looking forward to meeting Drew at the Southwest Fox conference next month, if only to thank him for the many contributions he has made to the FoxPro community and to my career in particular. I never met Drew in person, but each time I read an article of his or saw his picture in FoxPro Advisor it <EM>felt</EM> as if I were seeing an old friend again.</P>
<P>We never really know what kind of difference we may have on other's lives. The book "The Five People You Meet In Heaven" tells the story of a man who, upon his entrance to heaven, meets five people whose lives were (unbeknownst to him) greatly affected by him. </P>
<P>Thank you, Drew. I hope you will see the faces of the many thousands of strangers who's lives are better and richer today simply because we had a chance to "know" you through your many contributions to the FoxPro community.</P>
<P>God bless Drew, Brent, their family and friends.</P><img src ="http://weblogs.foxite.com/kevinragsdale/aggbug/924.aspx" width = "1" height = "1" /><p><div class="blogdisclaim"><a href="http://weblogs.foxite.com/kevinragsdale/archive/2005/09/19/924.aspx">This post originally appeared on an external website</a></div>

Related Discussions

Related Forums