gpsbabel on ubuntu 16 LTS for Garmin GPSMap 60Cx

Argh! Why is Garmin so awful! They make excellent hardware, that (mostly) works brilliantly, but the software for connectivity and on the website… grrrr.

In the last two/three months I have had to de-upgrade Garmin Connect on my Android phone (it’s at 4.1.7 cos everything so far after that has utterly borked any connectivity to my Forerunner 235); swapped from browser to browser as first chrome, then chromium, and, finally today, firefox, failed to display anything except the headers and footers of any pages after logging into connect.

Deep breaths… breathing in calm, exhaling bullets.

Anyway, after an epic (for me) 50km off road day on my Sonder Camino Al (drop bars, 650Bs @ 30 psi, cable disc brakes, 11 spd SRAM – astonishingly good off-road, must write it up!), my buddy and I were talking about having a more accessible map easily visible without us fishing out the phones, or digging in the bag for the maps. Since we’re goldfish braining, probably due age and adrenaline, we both found ourselves checking nearly every flipping turn and wasting quite a lot of time. We weren’t worried about it, it was a beautiful day, between 16 and 24 deg C all day, and we were not inclined to try and race it. We just thought, at the end of the day, we’d have been more comfortable if we could have had a turn-by-turn available. And probably not stopped halfway down awesome downhills to check we didn’t have to hang a left.

I remembered having some old garmin kit from some years ago that did the job. A handheld GPS that is pretty ancient tech now looking at most phones, but is waterproof, has real buttons you can feel, and a chunky screen with a flipping great arrow or zoomed in map pointing you to the next waypoint. I went digging.

The GPSMap 60cx. I loved and hated it. Loved it for geocaching and tracking my commutes on my wannabe Brompton (Giant something or other). Hated it because getting data on or off it with my Mac (at the time) was an utter crapshoot, and invariably took re-re-re-researching because garmin had broken or repurposed whatever piece of software had kinda worked last time.

So I dug it out today. The mount is no good for getting around this day and age handlebars, so two removable cable ties and it’s firmly attached. And then… dramatic pause… I got it working on both the old Mac and the Ubuntu 16 LTS boxen using gpsbabel! I am so chuffed. It remains to be seen how long it works for, but here’s a cheat sheet of what I did.

Macbook

  1. Install GPSBabel from https://gpsbabel.org
  2. Make sure the GPSMap is switched off
  3. Plug it into the USB port on the Mac
  4. Turn it on
  5. Use GPSBabel making sure to leave it set to “usb:” on the Garmin device connection

So far so simple. Although it did take a lot of plugging in and out.

Ubuntu

Absolutely loads of info on the web from about 10 years ago. Nothing current. What I ended up doing was this:

  1. sudo modprobe -r garmin_gps #not sure whether this was necessary or not
  2. sudo apt install garmin-forerunner-tools garmin-plugin gpsbabel-gui
  3. sudo nano /etc/udev/rules.d/51-garmin.rules
    insert this line (without the single quotes): ‘SYSFS{idVendor}=="091e", SYSFS{idProduct}=="0003", MODE="666"
  4. reboot (yes really) the system and login again.
  5. making sure gpsmap is switched off, plug it into the usb port.
  6. Turn it on.
  7. Fire up gpsbabel and admire how you can import and export data simply and easily with hardly any hatred of garmin connectivity.

Oh happy day! Hope it helps someone.

Thanks to gpsbabel.org (I mean, like loads of thanks, give them some money!), and to this guy on askubuntu.com who got voted down sadly. Some of it didn’t make any odds, but it cracked it for me.

Advertisements

Running Apps Synchronisation

Replicator

Using mostly tapirik: https://tapiriik.com . It costs 2 dollars a year to have it auto-sync, or free if you do it manually whenever you remember. It will sync pretty much everything from a date you supply (or a default date of around 1868).

Garmin as master (mostly), syncs to Strava, runkeeper, and dropbox.

Have set dropbox as listener only. It gets tcx files from garmin or strava depending where the activity is recorded. This is dropboxed to my hard disk and forms my “oh crap, x service has died/borked/gone forever and I need to export everything. in theory I already have it all.

Have set runkeeper as listener only. It gets updated from garmin or strava depending where the activity is recorded.

FitBit
FitBit is an arse. It is (deliberately IMHO) made hard to get out of and, frankly, to get into as well. I use it for tracking my weight and for various family members on it.

Strava – have linked to FitBit through Strava’s integration.

Runkeeper – have linked to FitBit through Strava’s integration.

Limitations
Currently Garmin can’t get my weight, etc from FitBit. I suspect if I link Garmin using the official apis to/from either Strava or runkeeper it might update the weight.

Next Steps
1. let runkeeper get back populated by tapirik.
2. unlink runkeeper from tapirik and link using offical APIs to Garmin Connect. See if a: the data that gets sync’ed off a run is as good/better than tapirik; b: if teh weight data is pushing into Garmin from FitBit via RunKeeper.

#run
#makeitbetter

Playing with Meteor Again

It’s been awhile. I’m looking at Meteor again after my first look about 2 or 3 years ago. It seems to have matured into a rather cool web framework. It’s USP is real time updates between server and clients. Anything entered into the server database, is reflected (almost) immediately on each of the clients. If a client makes changes, those are reflected immediately on the local, and are background updated to the server, and then out to the other clients. It’s really slick.

It uses (by default) a mongodb as backend, and minimongos on each client, which live in the browser memory and have a subset of the full database cached locally. These listen for updates from the server and push updates to the server form teh minimongo. The client only reads and acts on the minimongo.

I decided to pay proper attention this time instead of skimming, so I’ve bought the Discover Meteor Book by Tom Coleman and Sacha Greif.

I’ve also done some digging into the architecture of Meteor because I have always wondered about how much control and scalability I might be sacrificing for the “magic”. This page from The Meteor Cookbook helped a lot (thanks). I now understand that I can remove the mongodb from the meteor server itself and deploy and admin as I wish in production. I am still a little hazy on scaling the meteor app itself, but that is coming in later chapters!

All in all, I’m enjoying myself. The long winter evenings will just fly.

Serving HTTPS out of Bottle using CherryPy

I wanted to bash a couple of ideas together and see how quickly I could get something serving data from mongodb over https. I’d just started messing with python and the pymongo driver and I was (and still am) loving the quick hit python coding gives. Adding bottle as a framework made it all webby and useful feeling into the bargain :-). What is not not to like?

What I really wanted was a sweet single point solution that bottle already gave me, but with https. Past self takes over at this point….

After a bunch of digging around and reading lots of blurb, the upshot is a lightweight https server called CherryPy using bottle querying a mongodb using a regex and outputting whatever is in the first result to the screen, with a list of some of the other results, allowing the user to refine their search. The app is mickey mouse, and you do have a post where I’d prefer a redirect and using a cookie (so that browser refreshes work nicely), but the amount of data you can potentially return using the re would blow out the cookie size pretty quickly. There’s a probably a better way(tm) 😉

To do a test run you will need:

  • mongod running
  • If you want it not to throw a wobbler (I haven’t put much exception handling in it), you’ll need at least one row in testbottle.trades collection with at least one attribute of ‘Trade_Id’.
    So create a test db and record or two to play with. Start mongo shell and add some:

    use testbottle
    
    //bung one in with an easy one match re to remember
    db.trades.insert(
    	{
    		"Trade_Id" : "000457390G-1",
    		"Version_Number" : 1,
    		"Notes" : "",
    		"Settlement_Consideration" : 1721.72
    	}
    )
    
    //let us bung a small shedload in starting with x
    for (var i = 0; i < 1000; i+=1) { 
    	db.trades.insert(
    		{
    		"Trade_Id" : "x" + i, 
    		Version_Number : i, 
    		Settlement_Consideration : Math.random() * i * 100
    		}
    	)
    };
    			
    		
  • python installed
  • pip install pymongo – OR if on windows – http://pypi.python.org/pypi/pymongo use the windows msi
  • pip install bottle
  • pip install cherrypy
  • pip install pyOpenSSL – OR if on windows – http://pypi.python.org/pypi/pyOpenSSL use the windows msi
  • Create a top level folder for this project. I used pyMongoBottlePoc
  • create your own ssl cert –
    openssl req -new -x509 -keyout testserver.pem -out testserver.pem -days 365 -nodes

    Put this in your project top level folder.

  • The find_trade.py code is here. Put this in your project top level directory
  • The hello page and show found pages are here. Put these in “views” subdirectory
  • Run it by typing at the command line
    python find_trade.py
  • Use it by pointing your web browser at
    https://localhost:8082/

find_trade.py is a webserver on your localhost port 8082 which initially shows a welcome page hello_get_value.tpl asking you to input a trade id. When you click submit, find_trades.py does a regex search in the mongo database returns a cursor (trades) and the first result (trade). Bottle renders them using show_trade.tpl.

I leaned really heavily on this post from Diego XA and on the 10Gen Dev course youtube videos week 1 which have an excellent intro to python course in them. Thanks guys.

Installing Python, pyMongo, and Bottle on Windows

I had no problem installing all of the above on my Mac. On Windows, however, it was a bit of a pain. Thinking about it, it maybe that the mac install was Python 2.7, which everyone has been there and done that, whereas the Windows install was python 3.3, which may be a little later to the party.

Anyway, what I did:

  1. Install python 3.3 from http://www.python.org/download/releases/ Use the msi installer
  2. Install the pymongo using the msi from http://pypi.python.org/pypi/pymongo/ > Look down the bottom to find the windows installers. I suggest you don’t do an easy_install, it won’t compile properly and will either not work at all, or will have degraded performance.
  3. Install distribute. The instructions are here. I found it easiest to install from cygwin/git-bash using:
     $ curl -O http://python-distribute.org/distribute_setup.py
    $ python distribute_setup.py
  4. Install pip using easy_install supplied by distribute. NB: you must do this from the DOS command line (and, it appears, be in the Scripts folder):
     C:\> cd c:\Python33\Scripts\
    C:\> easy_install pip
  5. I also installed bottle at this point.
     C:\> pip install bottle

Many experienced python developers are recommending using virtualenv. It allows you have a virtual python install where you can pip install anything without blowing up your base python install by accident. You may have to use the performance retarded pymongo as Windows 7 (32-bit) doesn’t have the c libraries needed to build the necessary modules.

Hat tip to khattam for the distribute/easy_install usage.

GIT: Find commits for a specific file

git log --stat component/src/main/resources/META-INF/spring/context-osgi.xml

 Gets you a list of all the commits including that file.

git diff $commit_hash_old $commit_hash_current component/src/main/resources/META-INF/spring/context-osgi.xml

Shows you the diffs between the old file and the one you have now.

Cross ref: git blame might be more useful. Tells you which lines of a file were changed by whom:

git blame component/src/main/resources/META-INF/spring/context-osgi.xml

6d4e6fd3 (Dick Dastardly 2012-07-26 15:28:33 +0100 24) VirtualTopic.com.some.co.error.DLC
6d4e6fd3 (Dick Dastardly 2012-07-26 15:28:33 +0100 25) /data/error/
c3cedfe7 (Dick Dastardly 2012-06-13 16:10:19 +0100 26)
6d713a0a (Muttley 2012-10-18 13:44:33 +0100 27)
3233b294 (Peter Perfect 2012-11-07 13:16:34 +0000 28) mappingPersistenceUnit
3233b294 (Peter Perfect 2012-11-07 13:16:34 +0000 29) HSQL
c3cedfe7 (Dick Dastardly 2012-06-13 16:10:19 +0100 30) org.apache.openjpa.jdbc.sql.HSQLDictionary
c3cedfe7 (Dick Dastardly 2012-06-13 16:10:19 +0100 31) org.hsqldb.jdbc.JDBCDriver
47e39616 (Dick Dastardly 2012-06-21 14:12:40 +0100 32) jdbc:hsqldb:data/resource/lookup.db
3233b294 (Peter Perfect 2012-11-07 13:16:34 +0000 35) 1

Windows Batch File Echo empty line

I rarely have to do anything windows batch files, but just sometimes I get the short straw or it’s the quick way around something.

It’s nice to be able to output something reasonably readable to the tracking file, and echoing an empty line can make things easier to parse with-my-eyes. Echo with a following special char (select your own!) does the job.

date /T
time /T
echo doing something…
echo done
echo:

echo. also works. echo? and echo either of the slashes are dubious.

Thanks to macropas on stackoverflow for that one.