Friday, June 29, 2007

So many conferences, so little time...

In my ideal world, I would be able to attend just about every conference out there - Gnomedex, Advisor DevCon, Southwest Fox, FoxForward, dFPUG and more. Realistically, it's hard for a number of reasons : work, expenses, time, family. I'm always a big promoter of conferences putting some of their sessions online as well, even if it costs something. There's value in conferences even if all the attendees can't get there.  Southwest is going to have a business track which is great - especially because of the number of small business or independent consultants in the FoxPro community.

The Business of Software Conference , coming in San Jose in October, looks like another one that a lot of people would get something out of. It's got a nice mix of developers (Eric Sink, Joel Spolsky), some marketing people, one of my favorite speakers and also Bill Buxton, who has a GREAT session (you can see him speak at the Boston CHI session which is available online)

It's also close  after the Southwest Fox conference - what a perfect time to tour the entire Southwest of the US.


Powered by ScribeFire.

Need an online Wiki? Check out Zoho

FoxPro developers should be fairly familiar with Wikis - after all, Steve Black's FoxWiki has been around for several years, Wikipedia continues to grow in popularity (and so on). MediaWiki is free to install and use but it does have some basic requirements.

If you need to quickly create your own Wiki, check out Zoho Wiki - It's free, fast and easy to set up and works just like other wikis you may know how to use.

Zoho's other offerings are also pretty cool - you just have to get used to the building blocks logo - not exactly business like - but just as irreverent as the Google logo.


Powered by ScribeFire.

Doing Code Reviews with Code Analyst

I mentioned earlier that I was at a developer strategy meeting last week (n fact, Markus was there too) - of course, I wasn't traveling at the time. One of the comments from that meeting was how it's very hard (read, impossible) to stick to manual code reviews. Code reviews are a great practice and certainly valuable but when push comes to shove, it's often one of the practices that seem to slip away in favor of getting things done.

Now, in Team System, you can set up all kinds of rules for checking code in to help manage this process but what can you do in FoxPro?

One idea that came to me was extending the VFPX Code Analyst tool to become "project" or "environment" specific. Yes, you can create a number of new rules to run within the code analyst and enable/disable them as needed but what would also be useful would be to allow different projects to have "different" sets of rules that they might apply to. Then set up a project hook so that when you BUILD the project, the rules automatically run, telling you what's good and what's bad.

In this sense, you now have an automated "code review" tool.

The default rules in Code Analyst handle a number of generic pieces like identifying areas for refactoring, or finding known gotchas like RETURNs within ENDWITH, similar lines of code, but consider project-specific types of rules: ensuring classes are based on a common class library, appropriate use of MESSAGEBOX, no compilation errors, etc - and the tool takes on a whole new benefit.

This is one of those things that I'm going to add to the "to do" list for the Code Analyst: built-in project hooks, and some useful project rules.

What type of rules would you want to see in your code?

VFPX - Home

Powered by ScribeFire.

Wednesday, June 27, 2007

Displaying a Progress bar that doesn't affect your program

I have been really intrigued by the MTmyVFP project on Codeplex - primarily because I want my FoxPro apps to be as efficient as possible and to run in the background where possible but one of my pet peeves in a recent application is that if I'm doing some heavy work and want to display an animation (similar to the Copy files that you see in Windows), the animation really gets bogged down with the processing.

As a result, it looks funky to the user. I had asked Claude Fox if MTmyVFP could be used to do this - and the answer was to make my processing code run in the background and then make the animation run in the main application thread.

That wasn't doable but it made me think: what if I had an application that could show the animation and then I would just call it when needed.

Here's how I did it in VFP:


DEFINE CLASS oAni AS Custom OLEPUBLIC

oForm = .NULL.


PROCEDURE Show (tcTitle,tcAvi)

THIS.oForm = CREATEOBJECT("frmanimation",tcTitle,tcAvi)


THIS.oform.Show()



ENDPROC


PROCEDURE Hide

THIS.oForm.Release()

ENDPROC

ENDDEFINE




DEFINE CLASS frmanimation AS form



Height = 106

Width = 377

ShowWindow = 2

DoCreate = .T.

AutoCenter = .T.

Caption = "Working"

ControlBox = .F.

AlwaysOnTop = .T.

Name = "frmAnimation"



PROCEDURE Init
LPARAMETERS tcTitle, tcFile

IF EMPTY(tcTitle)
tcTitle = ""
ENDIF

THIS.Caption = tcTitle
THIS.AddAnimation()
IF EMPTY(tcFile)
tcFile = "filemove.avi"
ENDIF
LOCAL llRet
llRet = .T.
LOCAL lcErr
lcErr = ON("ERROR")
ON ERROR llRet = .F.
IF FILE(tcFile)
THIS.Avi.Open(tcFile)
THIS.Avi.Play()
ENDIF
on error &lcErr
RETURN llRet
ENDPROC

PROCEDURE AddAnimation
THIS.AddObject("AVI","olecontrol","comctl2.animation.1")
WITH THIS.Avi
.Top = 3
.Left = 0
.Height = 100
.Width = 372
.Visible = .T.
ENDWITH
ENDPROC
PROCEDURE Error
LPARAMETERS nError, cMethod, nLine

** Ignore it
ENDPROC


ENDDEFINE
*
*-- EndDefine: frmanimation
**************************************************


Then build the code as an EXE. I called mine THERM.

Now, whenever you need to show a thermometer, you can call

lo = CREATEOBJECT("Therm.oani")
lo.Show("Working","FILECOPY.AVI")

(hint: you can find AVI files in the VFP Home Directory under Graphics\Videos.)

Your progress bar will appear right in the middle of the screen.  Now when you need to close it, just call:

 lo.Hide()

You can take this even further by changing the form details with THIS.oForm.Caption, etc, etc.

The only downside here is that you HAVE to register your EXE so you can instantiate it but you can do that easily simply by running it once with a REGSERVER.

Now, of course, there is a GOTCHA and that is that if you run this class, you may notice a weird transparent background every now and then.

The solution? Forget using a non-visual class. Instead, create a form with the same code and drop the control on it to begin with.

For good measure, set the Center property of the Animation control to .T.

Then you're even BETTER to go.

So in my class, instead of doing the CREATEOBJECT, I simply call

PROCEDURE Show (tcTitle,tcAvi)

DO FORM DispAni WITH tcTitle,tcAVI NAME THIS.oForm



ENDPROC



The end result is a much smoother animation while your application does all its work.


Powered by ScribeFire.

Tuesday, June 26, 2007

The Sketch Questions, the Prototype Answers

This is a GREAT session by Bill Buxton of Microsoft Research on why you should get a sketch pad out when thinking about designing interfaces.



Some great ideas:

 - bring 5 design ideas before you build a prototype (and don't commit to any of them)

 - have great mistakes instead of mediocre successes (in design at least)

 - if a sketch was made in a forest and nobody saw it, it's not a sketch



It's about an hour and a half but you can definitely get some interesting stuff out of it.



Certainly, you can always try simply to follow UI guidelines but...another great one is Why We Should Ignore Users.



Brightcove - BostonCHI - Bill Buxton (Nov. 2006)



Powered by ScribeFire.

Saturday, June 23, 2007

Cloudy or Dark? - your choice for future development platforms depends on you

John, over at gonzomaximus, asked me to respond to his latest post ("The future is cloudy") - I would have directly on this blog but he has comments disabled, so here I am.



I think part of the confusion may have been from my previous post about his World of Tomorrow where I commented that there are a lot of free or low-cost how to's for DotNet.



Since he did ask, I will respond point by point. I certainly don't expect this to become a "read here, read his response, read my response, etc" but I think it's useful to see where this is coming to. (and hey, John - when you get some free time - why not come onto the FoxShow and really tell us how you feel!)



1. Yes, we know you're crazy - oh you said BORDERLINE crazy - sorry, I'll take that back.



2. I agree that to effectively use DotNet, you DO have to get into it a fair bit and likely a lot further than most FoxPro developers ever delve into FoxPro. Just yesterday, I was at a developer strategy meeting and one of the invited guests commented on how to really get the greatest benefit from DotNet, you need to learn how how DotNet handles multi-core, multi-threading, WPF, etc, etc. (I'll come back to that in a minute) It's not simply a "build your app" approach. Another case in point, I just did a Microsoft E-Learning course (a great learning resource) on upgrading from VB 6 to Visual Studio 2005. The basics of OOP and projects aren't anything new to VFP developers - what was interesting however was the attention spent on garbage collection and stack vs. heap, etc. This was in a fairly introductory course, in my opinion (why I took it is a different story) - so I was surprised to see that level of content.



But then, I thought about how frustrated FoxPro developers get when they have to debug stuff that cause C5 errors and have to learn about garbage collection. So it IS valuable to learn.



Also, while many FoxPro developers can make a great application without really getting further into Windows details, some of the really cool things we've seen recently are thanks to developers getting further into the Win32 API than most would want to.



3. I completely agree with John that the majority of FoxPro developers started because they wanted to solve a business solution whereas the majority of C++ developers started out wanting to become developers. But Dotnet also attempts to resolve some of the things that C++ developers need to worry about, via C# and the CLR. Yes - there are still some things that you need to be aware of, but you don't have to be aware of EVERYTHING as you had in the past.



4. Why would you want to mix XAML and VFP? I think there are a few reasons and YES - the pure geeky "fun" of it is one but the other is something I've commented on in the past. With a good understanding of XAML (or XUL or anything similar), where you can essentially build the foundation of a user interface with basic XML, what is possible? You can build your front end for a web app and then still maintain your backend with whatever database you wanted to. My personal enthusiasm comes down to something I LOVE to do with my own VFP applications - and that is to make it extendable (extensible?) at the user level - support dynamic scripting, runtime manipulation and more. If I could find a way of letting users design their own forms at runtime (ok, actually I HAVE done that within VFP), or better yet, find a way that I can make design changes dynamically, I think that's a win-win.



Unlike many developers, I tend to take a "get in, get out" approach to consulting. Every business (that contacts a consultant) has a problem that needs to be solved - sometimes they are big and do require a lot of analysis and project management - but othertimes they are small and don't need the "body shop" approach - they need the "here's the problem, let's get it solved" - and in those cases, I'm intrigued by the possibilities that XAML does offer.



(now I'm not a XAML expert, and I may have a lot of this wrong, so don't hold me to this as the approach but ---) Consider a VFP business component that also had the ability to send down a custom UI using XAML and then it could be customized for whatever platform it needed to be on. What possibilities are opened up to you if you could CHANGE what your application looked like dynamically without recompiling? (here's where I'm sure others will weigh in and tell me - you wouldn't be able to do that - but if I can do it in VFP, I'm sure there's a way to do it elsewhere)



5. Why not Adobe Flex/Flexbuilder? Why not Filemaker? Hey - everything's a tool and you pick the tools of your choice. I've glanced at Adobe Flex, I'm also intrigued by other RIA environments (Gears, etc) - certainly Silverlight isn't the only choice but it is ONE.



John - your main point  "that .Net architecture just doesn't work the way most VFP developers are comfortable with." is valid. Of course, it's a marketing exercise to push VFP developers to the DotNet platform but there's a valid reason for doing it beyond "your application works - why change it?" The reason was brought up at the strategy meeting I mentioned earlier - yes, VFP SP2 is coming out ( Rick Schummer has Milind Lele saying that VFP would only get the "Works with Vista" logo - not Certified for Vista) - so what would happen if a future SP of Vista breaks something in VFP 9 SP2 apps (similar to the visual glitch that many have recently commented on) - would Microsoft issue a HotFix for it?



And while they have recently changed their approach to Google Desktop search, would they do it for a set of loosely-related apps for a handful of businesses?



It's this argument that many consultants will and do use against VFP's continued approach as a platform.



I'm all for finding the right tool to do the job - and Visual FoxPro is the right tool for many jobs - because it gets the job done FASTER and usually better - and I'm sure we'll all sit back and wonder about whatever happened to with a variety of other tools (I still miss NextStep).



So back to am I missing your point? (a LONG WAY back - jeez this is a long post)) - no, I'm not - I'm getting it but Microsoft is offering a suite of development tools to move from beyond the current Windows desktop to a specific future they are building (updated from: believe is coming) (64-bit, Web x.0, mobile devices) . Other vendors are also doing the same based on what they feel is happening. The sad thing is that Visual FoxPro won't be there to make it easier on developers to build the solutions that will need to be built.



But hey, let's not just write about it - come onto the FoxShow and let's talk about it! (when you have time , of course)





Powered by ScribeFire.

Wednesday, June 20, 2007

A Four Hour work week or a simpler life

It seems funny all of the attention on Tim Ferriss' best seller, The Four Hour Work Week, which has some very good ideas (no, I haven't read it yet - but I did listen to his session at South by Southwest) - but many of them seem familiar to me, perhaps because of Bill Jensen's also popular Simplicity Survival Handbook.



The overlap is definitely there:



Tim: Stop checking email / Bill: How to Delete 75% of your emails

Tim: Fire Your Customers / Bill: How to Say No

Tim Result: Four Hour Work Week / Bill: Do Less...Accomplish More



Certainly there's more in Tim's book than just those few items I mention above - but I do find it interesting that both books advocate some of the same actions.







Simplicity: the Book



Powered by ScribeFire.

Tuesday, June 19, 2007

I'm a sucker for a good beer, er, IT strategy story...

Craig pointed me here and then I found this...



The Challenge



Nothing like a good contest between departments.





Powered by ScribeFire.

VFP Sedna Wishlist: A single way of doing dialogs

While Craig is espousing how awesome VFP will work with Sedna and Windows Vista - what IS missing and should likely be the #1 extension put into Sedna upon its release is a way to use the new Vistadialogs4COM under non-Vista platforms. (Updated: Doug brings up a good point in his comments that the purpose of this work was NOT to be a generic dialog handler, strictly for VFP - read the comments below)



As Craig noted, using the dialogs is very simple unless you are allergic to OOP - but it would have been really nice if the DLLs were immediately smart enough to say "hey, you're not running under Vista, so we're going to give you the older file dialogs instead."



I know that Vista is soon going to be everywhere - but NOT including some of this functionality now will limit the usefulness and implementation of this library for regular developers. In most  deployed applications, you are going to be balancing between Windows XP, Windows 2003, Windows Vista and even possibly Windows 98. Then again, in Canada, where they are floating the idea of taxing (additionally) new computers and hardware purchases for additional recycling revenue, I can see the argument for more companies keeping and simply upgrading their existing hardware. If you can do more work on the web today, what is the business argument for switching to Vista?



Maybe it's a case of saying "here's what you can do" and then get the entire community making it more useful. (just like Doug did with the updated New Property and Method dialog).

 If so, I welcome the approach but it kind of leaves me wanting a bit more.





Powered by ScribeFire.

Monday, June 18, 2007

Getting back to customer satisfaction...

You know, if MS hadn't closed down the FoxTeam, this would have been even funnier!



Looking forward to the release of SP2 and Sedna!



Bug Bash Archive Just Checking



Powered by ScribeFire.

VFP 9 SP2 and Sedna Beta now available

Microsoft has made the latest beta for VFP SP2 and Sedna available for download. A good number of bugs have been fixed according to the fix list - I hope this deals with some of the C5 errors I get when working with cursor adapters. Lots of people talking about it - be sure to get it and try it out!



Download details: Microsoft Visual FoxPro 9.0 Service Pack 2 and "Sedna" - Beta



Powered by ScribeFire.

Figuring Out Your Project

(note: on the path to building a software product, there are lots of decisions to make - but perhaps the toughest is trying to decide what type of project /product you want to build. This post describes some of the issues involved - if you've got other ideas, agree or disagree, I'd love to hear about it)

Schedule. Schedule. Schedule

Do you want to be all things to all people from the get-go? Or do you want to grab people's attention quickly and then build functionality based on a longer term vision.

The decision you make will greatly affect how long your entire project will take.

All Things to All People
This approach means you don't plan on releasing a product until it does everything you think it should do across the board.

While the one huge benefit is that you will be able to say "Yes - we can do it" to potential customers, there are several problems with this approach.

Benefits
"Yes - we do that"
It's always great to be able to say to a customer or potential customer "Yes, we do that" when they ask. It gives the customer a feeling of satisfaction knowing they have chosen a company who has already identified and solved the problem at hand.

Is this the same solution for every customer in that market or a single request from a specific customer? While many companies like to believe they are completely unique in their industry, there usually are a number of synergies that can be applied across a large customer base.

That said, there are many companies who request features because they have never done it any other way before and thus expect the same feature. By ensuring you meet every requested customer feature, you run the risk of bloating your software.

To make this benefit work best, a document or feature matrix outlining everything your software does (and does not do - although by the definition of the concept, this should be fairly limited) is necessary.

"Here's how we do that"

A partner of the "Yes - we do that" benefit is the ability to describe to potential customers precisely HOW you do it. This can offer a huge "relief" factor when discussing implementation issues or strategies with customers.

White papers, demonstrations and presentations are the best tools here - allowing everyone in the organization to understand how each cog in the wheel works.

Identifies strategic partners early
While there will always be some areas that you "cannot" do, you can identify the leaders in those areas and form valuable strategic alliances.

This is incredibly valuable as you will be able to prepare for questions that they have come up with, and also be ready to answer those "can you do?" questions.
Choosing strategic partners can be tricky. Many want to be your "sole- source" which, many times, can be the equivalent of your "soul-source" - you are limited to their limitations as well.

Instead, consider many partners, including some in the same industry. You will always need to choose a "preferred" partner - but you can do that when you absolutely need to.

Risks

When will it be ready?
Simply put, more features mean more time. More time to develop, more time to document, more time to test, more time to debug.
If you have an unlimited schedule, great - if not, you have to be able to identify to both your customers and yourself when you expect everything to be ready and then get all of the resources ready to commit to that time.

Is everything being tested?
It's not enough to have enough developers on the project - everything needs to be tested --- by people who will actually USE the feature, instead of those who develop it.

Following a principle of "test early, test often" is the best approach to accomplish this. Expect that developers are doing unit-tests, higher level developers are doing integration tests but also that testers know every possible permutation to test for.

Are we too late?
If you have a long development cycle, the biggest risk is that by the time you are done, your customers or potential customers have already moved onto another platform. You may have the next great gas-powered engine in the world, but if the rest of the industry has moved onto electric or hydro- powered engines, all of that effort will be useful only as an experience barometer.

What did we miss?

Almost as bad as being late is missing something that came out while you were busy working on something else (classic example: Microsoft and the Internet).

Adding new things late in the development cycle is (almost) always a recipe for disaster unless your development process allows for it. Communicating with your potential customers is always a good way of identifying what you might be missing - but keeping your ear to the ground of everything that's going on is just as crucial.

First Out of the Gate

"First out of the gate" doesn't really mean you were the first to do it anymore but it does mean that you are offering something of value right off the bat that other companies may not or may not do the same way.

Instead of taking the "everything but the kitchen sink" approach, you identify certain key features, strip them down to the bare minimum and offer them immediately, allowing you to upgrade them as demand requires.

Benefits
Faster to build
If you only have to build a tire swing, chances are you'll be done before the person who is building a jungle gym with a swing.

Having a smaller simpler product also makes it easier to add features or to evaluate them later on by keeping a short tight development cycle.

Ship early, ship often is a mantra in many development circles. While it does let you respond faster, it does have its risks.

New Features = New Announcements

Every company likes to promote new features - and the more announcements you make, the better the chance of getting picked up in industry or mainstream press.
Building a smaller application and adding features is also a great way of showing how you are growing your product line. A great example of this is OpenAir - a company that schedules new features once a month. They may be the tiniest feature, but it has grown a very small time-tracking and project management tool into a huge online professional services offering.

Respond to demand

Releasing sooner also lets you get feedback sooner and respond to demand based on the most popular features.

It is the perfect opportunity to solicit feedback from customers as well - because you now have actual customers who are committed to your product.

The other big benefit here is word of mouth - if you have 10 customers and you add a new feature regularly that is requested by 8 of them, it's not just responding to their demand - it also shows them that you care about what they want - a trait that people love to talk about.

Opportunity to link and play well with others

If you only do one thing but do it well, you may find that others who provide other related services (in the same fashion) want to work with you. By opening up to others, you can build an entire network of partners who offer different but complementary services. You may decide to go into a similar area if you find some features that are lacking in a given tool - but otherwise, it might let you focus on a different area.

Easier to test

Simply put - less features to build, less features to test; less features to test, easier to test.

If you have a 5 key features in your product and a team of 5 testers, they can likely do all of the testing on the product in much less time, than if you had 25 key features with the same test group.

It also ensures that the little things that testers (or worse, users) typically find at the last minute can be found faster and earlier because there is more time to do good testing.

Risks

Do you offer enough?
If you built a product with feature A, but customers need a product with features A+B, then you either have to have a solution for B, are bringing out B soon after or will lose the customer.

This is why it's critical to define at the lowest possible level exactly what features are needed and will be built.

Too little, too early

If you don't offer enough functionality, then it doesn't matter if you were first - someone will pick up on it and offer the needed functionality in about half the time because they can piggy back on your initial work.

This is the downside of the "ship early, ship often" approach. You show your features to the world and unless you can really capitalize on it, your competitors will instead.

Possibly viewed as "limited"
No one wants to be seen as "limited" - "targeted" or "specific" is better as it shows a single- mindedness to a particular task. But "limited" is a killer term. However, if you are hitting the "new features" with a "fast to build" approach, this risk can be easily reduced or at least, addressed.

Requires ability to say No

This is where personalities play into it. If you (or your managers or partners) can't say "no" to requested features, then you can't hit this approach. It's the corollary to "Yes - we can do that" - you must be able to say "No, that isn't our current focus".

A great example of this ability is 37signals, the company behind Basecamp, who have explicitly said "we are NOT a full-blown project management site" - their focus is on small-team collaboration on projects.

It also requires a single focus - at least for a given feature. SO that everything the company or group does is focused on that one task, instead of several, so that they can get it done and then move onto the next big feature.

------

Do you have a particular approach you use for projects?

Tuesday, June 12, 2007

Need project software?



Giveaway of the Day is giving away ConceptDraw Project 3 - so if you're looking for low-cost (er, free for the next 10 hours) project management tools - check it out!



I wouldn't normally push this - but I recalled Craig Bailey's post about the need to really push clients to manage their projects - I hope he sees this before it's too late!









Powered by ScribeFire.

XAML in FoxPro is Hot!

Craig Boyd, after a long absence, hits back with lots of great stuff - but what caught my eye big time was XAML in Visual FoxPro



an interesting comment: "I just wanted to show that this sort of thing was possible and hopefully get Microsoft to sign off on a XAML project for Sedna"



Isn't Sedna almost about due to be out ?



Hmmm...ongoing projects...I like that idea.



I'm excited by XAML - I've always liked it as well with XUL (the tool used for Firefox). But it also shows the extensibility of FoxPro integrating with things that while Microsoft won't support - they will still make possible.







Powered by ScribeFire.

Monday, June 11, 2007

Koziol: The fear is the .Net Framework itself.

John continues his piece on the "World of Tomorrow".



While it is definitely pro-fox, consider the contrast between Part III, where he discusses how tough the DotNet framework can be, to Part IV, where he talks about the difference in community.



Now,he doesn't note DotNetNuke, which is a free (as in beer) framework for content management and there are a lot of free or low-cost how to's for DotNet. (VFPx isn't the only tool in the CodePlex)



Now, John isn't just another FoxPro developer spilling his gripes - he did work for Microsoft at one time - and as he says , over the last 18 months, he has led and worked with various development teams on DotNet projects. Frightening?



Sounds like it. " It is so, so easy to "blow up" Visual Studio apps", " A small behavioral tweak may cause 2 or 3 developers days to complete." - maybe this is why existing Fox developers have moved to creating frameworks (like Milos and MereMortals) to make it easier.



Rick Strahl wrote an article a while back about how it's useful to understand the underlying approach when attempting to build useful code - John makes the point that while it's nice to know all the cool underlying things (as evidenced by the Hacker's Guide), you don't HAVE to know it to get it working.





I've worked quite a bit in DotNet but I am not, by any means, an expert. I recall at the first DevTeach, someone made the comment that it would take a huge amount of code to write a function in DotNet that was similar to a FoxPro function. (I can't for the life of me remember the function)



Within about an hour, a DotNet developer came back and said "what do you mean? Just use Regular Expressions." While correct, I think they missed the

point - a single function that has been around in VFP for years and that is fairly readable would be replaced with a Regular Expression string, which is tough to even start to understand. (What does \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b mean?)



As John noted -
Things that were simple are now inordinately complicated. - will they get easier with Orcas?



I hope so...How are you dealing with the differences with other development environments? Have you found a easier programming environment?





Powered by ScribeFire.

Thursday, June 07, 2007

Now that's an idea - a FREE developer conference

The attendees were super-lucky with Guy speaking. He remains one of my favorite speakers, reading him first, and then seeing him when he spoke at the 1993 FoxPro Developer's Conference.



But just as interesting is what Salesforce did. They wanted to promote their new Apex platform and as a result, the conference (in Santa Clara) on May 21st was free. (Salesforce is a real leader in Software as a service and web as a platform - is that SAAS and WAAP).



Granted - it's a one day thing - did anyone attend and more importantly - was it more than just a sales-job on the new Apex platform?



How to Change the World: Salesforce Developer Conference



Powered by ScribeFire.

How to decide what features to include

Mike Calligaro offers a great discussion on how features get decided upon for software such as Windows mobile. The discussion in the comments is also really interesting, especially the note about http://idea.salesforce.com where they will be letting users rate and help rank the ERs.



Windows Mobile Team Blog : On the Left Hand: How Feature Prioritization Happens



Powered by ScribeFire.

Tuesday, June 05, 2007

How to introduce a new product in this day and age...

While it's all about the numbers and regardless of what you may think about the overall success or failure of the site, here's the best quote:



...no entrepreneur can tell me that he needs $1
million, four programmers, and six months to launch this kind of
company. ... things are a whole lot cheaper and easier these days.


For not a whole lot of money and time you can get something out
there and see if it works. If it does, hallelujah: there’s no better
time to raise money than after your prototype is scaling up.



...There’s only one way to find out if your idea will succeed, and that’s to try it, so go for it.



How to Change the World: By the Numbers: How I built a Web 2.0, User-Generated Content, Citizen Journalism, Long-Tail, Social Media Site for $12,107.09



Powered by ScribeFire.

Monday, June 04, 2007

And part 3 is....

Still waiting for John Koziol to finish his World of Tomorrow posts.



He commented that he left too much information out the equation in the first post (that consisted of saying that the "early 20th century was all about extrapolating trends towards the future following an idealistic evolution of existing techs."



So where's part 3?



gonzomaximus



Powered by ScribeFire.

Why continue supporting xDrive?

I've been railing against xDrive for almost 2 years now and it seems that based on the comments, that they have done nothing to improve their overall service.



So it amazes me when Webware continues to talk about them as though they are a viable service. The comment back from Sept 2006 said "oh they're back - looks like it's worth a try again" - yet they had burned them just "a few months ago".



Does anyone have any POSITIVE stories about xDrive that go beyond "I've tried it and it's ok" - it worked great the first few times I used it but then went into total disarray after 2 months.



Anyone?



Andrew MacNeill - AKSEL Solutions: Problems at Xdrive?



Powered by ScribeFire.

From Basecamp to MS Project

I don't hide the fact that I really like Basecamp from anyone I know. Free for single projects and with a relatively low price-point, I've gotten one of my clients to use it for basic tracking of projects. I've also logged into Huddle ( a similar DotNet offering from British-based Ninian Solutions)) but haven't gotten right into it just yet.



One of the great things offered by Basecamp is the Basecamp API - which they describe as plain vanilla xml over HTTP.  A lot of the samples that integrate with Basecamp are primarily web-based or widgets. I think that's primarily because of the synergy of the Web 2.0 world - but you can just as easily integrate Basecamp with Windows-based apps directly with a little bit of COM automation.



While I did some basic stuff like posting messages and updating items with the API, I found imified more useful to do updates over instant messenger instead.



However, when one of our sales managers asked for an MS Project file of all the outstanding Basecamp projects, I knew it was a challenge I wanted to face.(in FoxPro and West-Wind IP Tools - of course!)



I created a number of classes to accomplish this, using collections and custom classes.



PUBLIC loBase

loBase = CREATEOBJECT("Custom")

loBase.AddObject("Projects","Collection")

loBase.AddObject("Users","Collection")

loBase.AddObject("Companies","Collection")



But the basis for everything else was pretty straight forward:

lox = lo.gethttp()

? lox.httpconnect(basecampsite,"username","password",.t.)

 lox.nhttppostmode = 4

LOCAL loXML

lcPosts = " "

lnText = 0

lnResult=lox.HTTPGetEx("/project/list",@lcPosts,@lnText,"Accept: application/xml")



loXML = CREATEOBJECT("MSXML.DomDocument")

IF loXML.LoadXML(lcPosts)

    loProjects = loXML.selectnodes("//project")

    FOR lni = 1 TO loProjects.length

        loProj =loProjects.item(lni-1)

        WITH loBase.Projects

        .Add(NEWOBJECT("cbaseproject"))

        .Item(.Count).ProjectName =loProj.selectsinglenode("name").nodetypedvalue

        .Item(.Count).ProjectID =loProj.selectsinglenode("id").nodetypedvalue

        .Item(.Count).Status =loProj.selectsinglenode("status").nodetypedvalue

        ENDWITH

    ENDFOR

ENDIF



I did a similar part for Companies and Users in the system. This was necessary to link projects to individuals and the like.



Within the cbaseproject class, I created a method called GetTasks , GetPeople and GetMilestones that all looked pretty much like this:

DEFINE CLASS cBaseProject AS Custom

    ProjectID = 0

    ProjectName = ""

    Status = ""

    Company = ""

   

    PROCEDURE GetTasks

    lcPosts = " "

    lnText = 0

   

** Reconnect


lnResult=lox.HTTPGetEx("/projects/"+THIS.ProjectID+"/todos/lists",@lcPosts,@lnText,"Accept: application/xml")

loXML = CREATEOBJECT("MSXML.DomDocument")

IF loXML.LoadXML(lcPosts)

    loProjects = loXML.selectnodes("//todo-list")

    THIS.AddObject("TaskLists","Collection")

    FOR lni = 1 TO loProjects.length

        loProj =loProjects.item(lni-1)

        WITH THIS.TaskLists

            .Add(NEWOBJECT("cbasetask"))

            .Item(.Count).TaskName =loProj.selectsinglenode("name").nodetypedvalue

            .Item(.Count).Description =loProj.selectsinglenode("description").nodetypedvalue

            .Item(.Count).ID =loProj.selectsinglenode("id").nodetypedvalue

        ENDWITH

    ENDFOR

ENDIF



    ENDPROC

   

    PROCEDURE GetMilestones

    lcPosts = " "

    lnText = 0

   

** Reconnect

lnResult=lox.HTTPGetEx("/projects/"+THIS.ProjectID+"/milestones/list",@lcPosts,@lnText,"Accept: application/xml")

loXML = CREATEOBJECT("MSXML.DomDocument")

IF loXML.LoadXML(lcPosts)

    loProjects = loXML.selectnodes("//milestone")

    THIS.AddObject("MileStones","Collection")

    FOR lni = 1 TO loProjects.length

        loProj =loProjects.item(lni-1)

        WITH THIS.Milestones

            .Add(NEWOBJECT("cMilestone"))

            .Item(.Count).Title =loProj.selectsinglenode("title").nodetypedvalue

            .Item(.Count).ID =loProj.selectsinglenode("id").nodetypedvalue

            .Item(.Count).Deadline =loProj.selectsinglenode("deadline").nodetypedvalue

            .Item(.Count).xml = loProj.Xml

            .Item(.Count).person = getperson(loProj.selectsinglenode("responsible-party-id").nodetypedvalue)

            TRY

            .Item(.Count).Completed = loProj.selectsinglenode("completed").nodetypedvalue="true"

            .Item(.Count).CompletedOn =loProj.selectsinglenode("completed-on").nodetypedvalue

            CATCH

            ENDTRY

        ENDWITH

    ENDFOR

ENDIF



    ENDPROC



  

ENDDEFINE



From here, I was now simply going to create or update my MS Project file.



LOCAL lcText

loapp = GETOBJECT(,"MSProject.application")

loProject = loapp.activeproject



LOCAL lnStartRow

lnStartRow=0

lcText = ""

LOCAL loP

FOR EACH loP IN lobase.projects

    IF NOT PEMSTATUS(lop,"milestones",5)

        lop.GetMilestones()

    ENDIF

    loProject.Tasks.add(lop.projectname)

    lnStartRow=lnStartRow+1

    loApp.selectrange(lnStartRow,3,.f.)

    loApp.outlineoutdent()

    lnS = 0

    FOR EACH loM IN lop.Milestones

        lnS = lns+1

        tsk = loProject.Tasks.add(lom.Title)

        tsk.milestone = .t.

        lnStartRow=lnStartRow+1

        loApp.selectrange(lnStartRow,3,.f.)

        IF lnS=1

            loApp.outlineindent()

        ENDIF

        IF NOT lom.Completed

            *!* ? lom.Title + " due on " + lom.deadline +" by "+lom.person

            tsk.finish = DATE(VAL(LEFT(lom.deadline,4)),VAL(SUBSTR(lom.deadline,6,2)),VAL(RIGHT(lom.deadline,2)))

        ELSE

            tsk.percentcomplete = 100

            tsk.finish = DATE(VAL(LEFT(lom.completedon,4)),VAL(SUBSTR(lom.completedon,6,2)),VAL(SUBSTR(lom.completedon,9,2)))

        ENDIF

    ENDFOR

ENDFOR





The end result? I can give a project file that always includes the latest updates to those who like the graphics appeal and project-reporting of MS Project.





Basecamp API



Powered by ScribeFire.

Saturday, June 02, 2007

Looking to edit an old help file?

If you've looked on the right-side of my blog, you'll know that I have a Giveaway of the Day link that updates regularly. Usually the stuff is pretty low-key and not always useful for the developer (maybe some file organizers, disk maintenance , etc).



But today (and since it only lasts for one day - you have 12 hours as of this post to get it), they are providing a CHM Editor.



What does it do? I was skeptical at first but it works amazing well.



It opens a CHM file and displays it in its original index format but then on the right side, you have a full WYSIWYG editor to edit the actual text of the CHM file (no need to have any project files or anything - now I'm sure there's possibly a legal issue here - because you could edit someone else's CHM files).



They promote it primarily as a way to translate help files but this is also really handy if you need to fix an old help file and don't have the original source files.



And it works really well. Check it out but realize you only have a few hours before it runs out !



Giveaway of the Day » CHM Editor



Powered by ScribeFire.