In-Application Customer Feedback

Matt Wilson asked about ‘awesome web-apps to let customers suggest/vote/comment’ on upcoming features.‘ This gave me the idea to post about ErgMate’s in-application feedback mechanism.

In addtion to sending an email to the support mailbox, there are two other ways customers can provide feedback on ErgMate.

The first is through the UserVoice ErgMate Page. UserVoice is a service that allows people to suggest, comment, and vote on features.

The second is through the menu item in the program itself. Selecting ‘Send Feedback’ on the help menu in ErgMate will bring up dialog box:

The Ergmate feedback dialog showing 3 options and a text field.

ErgMate Feedback Dialog

This dialog box collects the data and submits it to a php script on the website:

    def OnSubmit(self, event):
        feedbacktype = self.getFeedbackType()
        feedback = self.feedbackText.GetValue()
        version = buildInfo.getVersion()
        build = buildInfo.getBuild()
        params = urllib.urlencode({'t':feedbacktype, 'b':build, 'v':version, 'f':feedback })        
            f = urllib.urlopen(ErgMateGlobals.feedbackUrl, params) 
            done = True
            # do something rational here

The php script on the website collects the input, urlendcodes it, and adds it to a google docs spreadsheet by emulating a form subission from a form on that spreadsheet. Matt Casperson outlines the method in his blog article ‘Submit Data to a Google Form with PHP.

The heart of the php form-submission script looks like this:

$data =         "key=p......Q&embedded=true";
$data = $data . "&entry.0.single=" . urlencode($fbtype);
$data = $data . "&entry.1.single=" . urlencode($emversion);
$data = $data . "&entry.2.single=" . urlencode($embuild);
$data = $data . "&entry.3.single=" . urlencode($fbtext);
sendToHost( "", "POST", "/formResponse", $data ); 

This will add a row to the spreadsheet:
Google docs spreadsheet showing ErgMate feedback.

This mechanism is convenient for the user and simple to implement.

Posted in Micro-isv, programming, Python | Leave a comment

Rowing Q/A Site on Stack Exchange

Saw this proposal for a rowing question / answer site on stack exchange posted on the Concept 2 Forum. What a great idea. The difference between this and a normal forum is that answers are voted up or down by others. Over time the best answer migrates to the top.

Posted in rowing | Leave a comment

A Journalist’s First Ergatta

Cleveland Plain Dealer columnist Zachary Lewis rowed his first 2K erg race and wrote about it. I’m just impressed with his time, that being only the 2nd time he’s ever rowed a 2K erg piece:

Indoor rowing machines’ virtual experience a whole-body workout: a Stretching Out column

Posted in indoor-rowing, rowing | Leave a comment

Rowing News Article on the Cleveland Rowing Foundation

Rowing News has a nice article on recent events around Cleveland rowing and the CRF’s boathouse / dragon boat home / bicycle co-op:

Posted in rowing | Leave a comment

The 2010 Hammer Indoor Regatta

The Hammer Ergatta to benefit Rivergate Park Boathouse is on Sunday, February 21 at the Saint Ignatius field house in Cleveland, Ohio.

Regatta Central has full information.

Until then you’ll have to settle for watching the Hammer Ergatta video.

Posted in indoor-rowing, rowing | Leave a comment

Forcing a HTTP Proxy on Local Google App Engine Development Server

I’ve been trying somewhat in vain to debug a REST interface that’s failing when running under GAE. After some searching, I found a way to force the local development server to use an http proxy (such as Charles or Membrane).

Make the following changes in the file:

C:\Program Files\Google\google_appengine\google\appengine\api\

around line 193:

    if protocol == 'http':         
        logging.debug("using proxy instead of %s path=%s", host, path)  
        connection = httplib.HTTPConnection("", 8888)   # host and port of proxy server
        path = "http://%s%s"%(host,path)
        logging.debug("new path is: '%s'", path)
    elif protocol == 'https':
          connection = httplib.HTTPSConnection(host)
        error_msg = 'Redirect specified invalid protocol: "%s"' % protocol
        raise apiproxy_errors.ApplicationError( urlfetch_service_pb.URLFetchServiceError.FETCH_ERROR, error_msg) 

You may wish to make the same change for Https as well. It would not be too hard to fix it the right way by having it check for the http_proxy environment variable, but I haven’t done that.

Posted in Python | 1 Comment

Restful Interfaces to 3rd-Party Websites in Python

Here are the slides and examples from my Code Mash talk:

Restful Interfaces to 3rd-Party Websites with Python (PDF)


Posted in programming, Python | Leave a comment

Blog on Rowing a 2K Erg Piece

Just found Concept 2 Crossfit, a blog with some great articles on preparing for and rowing a 2K erg piece. It’s well worth checking out.

Posted in indoor-rowing | Leave a comment

Graphing a 2K Erg Piece

This is a graph of last night’s baseline 2000 meter erg piece on the Concept 2 ergometer. Meters are along the X axis and the units of the Y axis depend on the data series. It just took a quick change to a new erg program I’m working that wrote information out to a comma-delimited file every second.
Open Office’s spreadsheet did the rest.

The race plan was to do even splits and sprint at the end. Splits are represented by the red line (seconds/500 meters) look fine at the overall scale, but the watts line jumping so much means there’s room to make a more even power application throughout the row.

I was hoping to see more information about the relationship between cadence, slide ratio, and meters-per-stroke, but the numbers were rounded for the latter two instead of showing 1 or 2 decimal places as needed. That’ll be fixed up for next time.

Graph of baseline 2K erg test 1/4/2010

Graph of baseline 2K erg test 1/4/2010

Posted in indoor-rowing, rowing | 1 Comment

Rivergate Park on the Cuyahoga – last day of matching grant

…In addition to being a permanent home for rowing, the vision of Rivergate Park will include biking, kayaking and dragon boat racing, as well as hiking and bird watching, making it a multi-faceted recreation destination along the Cuyahoga River.

The Cleveland Rowing Foundation is raising money to purchase the old Commodore Club Marina land on the East bank of the Cuyahoga River. Today is the last day of a matching grant.

Rivergate Park is about public access to the river in addition to being a home for Cleveland’s rowing community.

If you can, please support this effort by making a donation to the effort. Drawings of the proposed park and other information is at:

Posted in rowing | Leave a comment