Strava meets Python

I use strava to register my rides where I mark my commutes. Once a year I need to identify the commuting ratio for tax reasons.

Strava has an api which is well documented, so please check that out here. The code below will get rides between two dates and calculates the ratio of commutes and private rides.

I’m going to update the code with generators to manage the paging, add some error handling on the requests and clean things up a little, as soon as I get round to it.

Continue reading “Strava meets Python”

Mac OS High Sierra on VirtualBox on Linux/Ubuntu 16.04/Xenial

    1. Need a way to download the install cd from Apple’s store
      I got an xcloud for a month – could have used macincloud
    2. download High Sierra from the app store on the mac
    3. Create virtualbox image
      I Had to go for generic Mac OSX 64 bit, not the specific High Sierra one !!
VBoxManage modifyvm Sierra  --cpuidset 00000001 000306a9 00020800 80000201 178bfbff
VBoxManage setextradata "Sierra" "VBoxInternal/Devices/efi/0/Config/DmiSystemProduct" "iMac11,3"
VBoxManage setextradata "Sierra" "VBoxInternal/Devices/efi/0/Config/DmiSystemVersion" "1.0"
VBoxManage setextradata "Sierra" "VBoxInternal/Devices/efi/0/Config/DmiBoardProduct" "Iloveapple"
VBoxManage setextradata "Sierra" "VBoxInternal/Devices/smc/0/Config/DeviceKey" "ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc"
VBoxManage setextradata "Sierra" "VBoxInternal/Devices/smc/0/Config/GetKeyFromRealSMC" 1
VBoxManage setextradata "Sierra" "VBoxInternal2/EfiGraphicsResolution" "1920x1080"
  1. Configure
  2. change resolution
    Method 1: VBoxManage setextradata “Type Your VM Name Here” VBoxInternal2/EfiGraphicsResolution HxV  (Recommended)
    Method 2: VBoxManage setextradata “Type Your VM Name Here” VBoxInternal2/EfiHorizontalResolution H  (Alternative)
    	  VBoxManage setextradata “Type Your VM Name Here” VBoxInternal2/EfiVerticalResolution V
    Resolutions to choose:
      1280x720 | 1920x1080 | 2560x1440 | 2048x1080 | 3840x2160 | 5120x2880 | 1280x800 | 1280x1024 |1600x900 | 1440x900
         HD 	FHD	    QHD          2K	     4K	         5K


Perl still does my hostnames resolving

Again, I had a large list of hostnames which I needed resolved to their ip addresses.

  • nslookup: slow
  • ping -c 1: slow
  • getent hosts: “random” ipv6 addresses
  • no fping available

So I still use perl for gethostbyname() or getaddrinfo():

Example below takes input from stdin/pipe.

perl -MSocket -nwle'my @addresses = gethostbyname($_); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print "@ips"'

Build an IOS app on Linux – without MAC – using React Native

I found myself not finding an app in the apple store that accommodates my requirements.  I have built an app in the past using mac + xcode which works nicely, but now I have an ubuntu running on my lenovo yoga.  So no Mac.  I have been reading about React and React Native so that’s what I’ll try.  It would allow me to publish the app not only for ios but also for android. Also, saves me from investing in a Mac.  And on top of that, I learn React to build apps just about anywhere.  Win Win Win…

I don’t want to waste time with hackintosh, vm, simulators etc.  I really want this to work.

My two new programming languages for this year will now be Golang (backed by Google) and React (facebook).


So we need Nodejs and expo.  Coding is done in either the online Expo IDE or XDE offline.  On the iPhone, we need the expo client.

nginx change http request header value based on source address

Let’s say you want to change the value of a header value based on the source location, ie localhost vs external.  Or you can drop it all together. This is how it’s done in nginx.

We’re setting a variable first using map in the http{} block and then use it later in the location{} section.

  • Add this to the http{} section:   if loopback, it will set the $customkey variable to the original header value of ‘custom-key’, else it will default to empty
map $remote_addr $customkey { $http_custom_key ;
     default "";
  • Add this to the location{} section where you want the use this for your proxy_pass:  (re)set the header to the previously set variable or remove it.
proxy_set_header custom-key  $customkey;


boot-repair to the rescue

Installing ubuntu from the live-cd these days is too easy, really: insert usb stick, boot, install. Done.

The ability to try before installing is just the icing on the cake.  You check if all your hardware is supported (especially network, display, mouse/keyboard) and go…

If you installed it next to the preinstalled Windows and the latest update destroyed your GRUB bootloader config (or any other), use the same live-cd/usb stick to recover.

just run these lines in a terminal and let the repairing begin:

sudo add-apt-repository ppa:yannubuntu/boot-repair 
sudo apt-get update
sudo apt-get install -y boot-repair && boot-repair

perl / local cpan without root

Installing  perl modules on systems where you don’t have root privileges can be a real pain.  The easiest way to get it working, is what I found on stackoverflow below.

wget -O- | perl - -l ~/perl5 App::cpanminus local::lib
eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`
echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.bash_profile
echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.bash_profile

Then use it like so:

cpanm Module::Name

Lego and rubik’s cube. Solved.

Lego has always been cool.  Sure, you can follow the build plan, but there’s so much more you can build.  My 10yr old son and 9yr old daughter have been into scratch for a while and wanted to start writing code in python and javascript/html/css.  More on the latter later.  Did you know that Lego Mindstorms works much like a raspberry pi?  You can boot off of an sd card, without touching the firmware, and control all the mindstorms components from python!  Check out the site for more on the subject!
We have to use python since LabView does not run on linux (yes it does, but not without the usual little headaches).

My son found the build plans and built it together with his sister.  We then first got to boot the thing in ev3dev and started with little routines to get the arm and cube platform to move, identify colors etc..

Some time later, after a few build corrections and code updates, this is the result.