More technique work.

Did some more work on technique. I took my front camera, my Motionize setup, and an idea of trying some different paddle lengths. So first off, I started off at my normal 214cm but with a tiny bit of pause to drive the paddle in before I start pulling and a mental emphasis on the catch. That actually seemed to help a lot. Then I tried some different paddle lengths. I have to say that I discovered some things:

  • The mental change made a lot more difference than the paddle length
  • Even though I changed the paddle length in Motionize before each test, the “Paddle depth” indicator on Motionize was useless. I’d increase my paddle length by a centimeter, and it would tell me that my paddle depth had decreased by 16 centimeters. So much for using it to test my catch.

Technique work

I’ve had two people point out this week that I’m *still* not getting my paddle blade fully in the water. I’ve been working on this for years now, and it just doesn’t seem to be getting any better. I’ve tried lengthening my paddle, shortening it, doing drills and just trying to be aware of the problem. I’m getting worried about it.

Another problem was pointed out in this Saturday’s video: I’ve got an asymmetry in the way my top hands come across my face. Compare:

Time to break out Motionize and find some quiet water to concentrate on my technique, I think.

I’m baffled by action cameras

One of the things that really bugs me about actions cameras is that almost every single one of them has about a 80 to 90 minute battery life. The sole exception I’ve found is the Contour Roam 3 which has nearly a 3 hour battery life. Unfortunately it’s limited to 1080p/30fps, and even at that I didn’t think the picture was as bright and vibrant as, say, my old Polaroid XS100.

After multiple camera failures mostly due to water, I decided this year to treat myself to a GoPro Hero 5 Black and a GoPro Hero 5 Session. They are both intrinsically waterproof and have good picture quality as well as higher resolutions like 4K/30fps and 1080p/60fps. But again, they’ve got that 80-90 minute battery life.

I did “bench tests” on my desk using external USB batteries and discovered that with an external battery, I could easily get 3 hours out of either camera. So using some zip-ties and silicon putty, I arranged these external batteries and waterproofed the cable connections and yesterday I went out to use them on the water. It was coolish and overcast, so overheating would not be a problem – it was certainly cooler than when I’d been testing at my desk, anyway. But I was extremely disappointed when the Session only gave me 88 minutes of video, almost as if I hadn’t had the external battery at all, and the Black gave me 115 minutes of video.

I’m trying to figure out why both cameras stop getting charge from the batteries out in the field, but work fine at my desk. Working hypotheses:

  1. The cameras are overheating and shutting down
  2. Recording a moving scene in the real world is more taxing on the cameras than recording a mostly static scene in my office, and so they’re trying to suck more power than the battery can provide
  3. The image stabilization is sucking down lots of power in the moving environment that it’s not on my desk
  4. The cables aren’t as secure as I think they are and they’re coming lose somehow

I consider the first one unlikely, because the field test was done in cool and overcast weather. When I got home, I tried both cameras again and they both started recording and lasted for the remaining time on the external batteries. To see if it was just the lack of motion in the office scene, I pointed both cameras at my computer screen and started a continuous play list of YouTube videos, and that didn’t seem to make any difference. That would tend to argue against the second hypothesis. I also discovered that I’d only had image stabilization turned on in the Session and not the Black, which argues against the third hypothesis. I can’t find any signs of looseness in the cable connections. Oh, and one other thing I discovered while doing my bench test – the front of the Session, especially the screws holding on the front lens cover glass, were almost uncomfortably hot to the touch. I should see if they get that hot on the water.

I have one other test I can try – I have a much bigger battery that has a 2.1A port for iPads. I don’t know if GoPros do the magic handshake that allows them to take higher amperage from 2.1A ports, but that would be a good test to see if they’re just using too much juice in the field. But this battery is way heavier, and also is going to be a bitch to waterproof, so I don’t think it’s a race-ready solution.

But one of the possibilities I didn’t include in the above list is that the target market for action cams are people who stop and start their cameras to capture short bursts of activities like sky dives and downhill ski runs, so nobody is actually designing or testing their cameras to see if they’re capable of doing multiple hour long videos.

One of the reasons I went for GoPro rather than some other brand is that the third party add-on infrastructure is there for GoPro in a way that isn’t there for Sony or Contour or other brands. Some of the older GoPro models had third party battery extenders, and I have hope that somebody else will eventually solve my problem for me. I asked Ray Maker (of DC Rainmaker) and he agrees with me that third party solutions may be imminent.

Reimplementing Part 3

This is part 3 of my self-imposed project to reimplement the UI for an old website. You can read part 1 and part 2.

After some playing around with the “Step 2” interface, I realized that I really needed better error checking. I had error checking on the individual fields of the Geographic Panel, but no “overarching” check that all the fields were filled or all were unfilled. Plus I wanted the user to see the errors on the Geographic Panel even if you’ve closed the panel, and I also wanted to disable the “Start Generating” button until the errors are cleared. While I was at it, I added an error message if you don’t have any waypoint types selected. I’ve made those changes and pushed them to my GitHub project as the fourth commit and I’ve pushed it as a replacement to the previous mockup here.

I haven’t worked on this all week because of other calls on my time (work, job search, kayaking), so I haven’t made a start on the backend yet. But I’m thinking I’m going to be doing it in Python with Flask or Pyramid and SQLAlchemy. The original website is written in Perl, and frankly, I think the job market for Perl programmers is pretty rapidly shrinking and nobody is doing modern websites in Perl. But speed is of the essence, so that leaves Python or Java. The decision will probably come down to whichever of those two frameworks has better support for PostGIS.

Re-implementing Part 2

As described in my previous post, I gave myself a project to reimplement an old website using new technologies in order to prove to myself and to potential employers that I can do all the modern stuff.

The “Step 1” prototype was completed 15 days ago. I only wrote about it early today because I was debating with myself whether I should write up each step or do it all at the end. But during that time I’ve managed to get the static HTML page re-written as a React+Redux dynamic front end. I included the deficiencies I mentioned in the first post – the accordion panels open and close with a click anywhere on the title bar, and I’ve added “disclosure triangles” to make it more obvious that the title bars are meant to expand.

It doesn’t talk to a back end yet (it just simulates it using setTimeout), but it does so some nice interactive features

  • The title panes on each accordion panel update based on what you’ve chosen in the panel
  • It updates the countries, states and provinces in the “Country/State/Province” panel based on the latitude and longitude range you entered in the Geographic Area panel.
  • The state checkboxes don’t show up until you check the “US” checkbox in the country list, and similarly, the province checkboxes don’t show up until you check “CA” in the country list.
  • The “Start Generating” button is disabled unless you’ve selected at least one entry in the Airport Types, Navaid Types or Fixes in Charts panels.

Even taking into account the fact that I was learning as I went, I think the code looks ok. I tried to make some common base classes, but in many or most cases, I discovered that convolutions required to make it general weren’t worth it and I just ended up with similar but not identical code – case in point: the various “*Check” classes. I also ended up putting several classes for each accordion panel together in one file – I’m not sure if that’s considered best practices, but it seemed to make sense to me.

The mockup is here. This code is now the third commit on this project on GitHub.

So for a next step, I was planning to write a back end. The back end would have no actual HTML pages returned, just a bunch of AJAX calls and responses, mostly all returning JSON. So I was thinking Django, which is what I’ve been using for the last several years, would be too heavy for that. Similarly, the Java back ends I’m familiar with are also pretty heavy. On the other hand, the existing backend is written in Perl, and frankly, I don’t want to do anything in Perl anymore. I wonder if Flask and SQLAlchemy would be a good choice?

I’ll also have to figure out how to read and store cookies so we can store a session id just like the existing site does, but that’s probably not a big deal.

I also have to think of how the file generation will work. In the old code, I spawned off (fork/exec) a program to generate the file, and then had the web server process looking at the log file the generator task to see how far it had gotten. That made sense when the back end computer was busier and the generator task took 5-10 minutes – I didn’t want to tie up an Apache thread for that long, plus I could use a very primitive hand-rolled bit of Javascript to show progress. These days generating takes less than a minute, so I’m wondering if I couldn’t just do a return “Content-type: application/octet-stream” directly in the Apache thread. I’ll have to investigate.

A much more minor change I’m thinking of is in the country list putting the US and Canada at the top of the list instead of being strictly alphabetical because most of the users of the site are from the US or Canada and it would make it easier to find them.

Cosmetically, I reused the banner from the old site. It doesn’t really match the light and clean look of the rest of the site. I should probably make something more in keeping with the look I’m going for. Similarly, the favicon looks like a Palm Pilot which was fine when most people were using my data for Palm Pilots, but kind of wrong for GPX.

Someday, I’d like to add a simple map that can use to select the geographic area. Even better would be displaying or even picking countries, states, and provinces on the map. I’ve done some quick googling and I can’t find a good map library.

Also, if I could get the backend working fast enough, it would be cool to give a running count of how many waypoints the user is going to get in his file with the current parameters.

Update: See Step 3