Extract GPS data from "Tracker" iOS app to GPS

Quick script for extracting gps data from the Tracker GPS app

First export data from app com.eofster.tracker using something like iPhone Backup Extractor (http://supercrazyawesome.com/)

mkdir tracker-extract && cd tracker-extract

npm install csvtojson
npm install gps-to-gpx

(cd 'com.eofster.tracker/Library/Application Support/com.eofster.tracker' && sqlite3 -header -csv Tracker.sqlite "select * from ZTRACKPOINT order by ZTIMESTAMP;" > out.csv)

Create index.js:

var Converter = require("csvtojson").Converter;
var converter = new Converter({});

const createGpx = require('gps-to-gpx').default;

//end_parsed will be emitted once parsing finished
converter.on("end_parsed", function (jsonArray) {
const converted = jsonArray.map(pos => {
return {
latitude: pos.ZLATITUDE,
longitude: pos.ZLONGITUDE,
elevation: pos.ZALTITUDE,
time: new Date((pos.ZTIMESTAMP+978307200)*1000).toISOString()

const gpx = createGpx(converted, {
activityName: 'tur',
startTime: converted[0].time,


//read from file


node . > out.gpx

DJI Phantom 3 parallel battery charging in a car with iMax B6

I bought a “Multi Battery Parallel Charging Board For DJI phantom3” on ebay, and I soldered on a deans female connector for connecting it to my iMax B6 charger.

Since the Phantom 3 battery is intelligent and has its charging circuitry in the battery itself, the iMax will just work as a voltage booster with an output of 18V. This is 0.5V more than the DJI charger provides but it seems to work. So anything that can output >3A ~17.5V should be able to replace the iMax.

  1. Connect iMax input to car cigarette connector
  2. Connect iMax output to the multi-charging board.
  3. Connect the Phantom battery to the board
  4. Choose Pb charge, 5.0A, 18.0V (9P)
  5. Turn the battery on right before long-pressing start on the iMax (by using the short-then-long-press sequence on the Phantom battery.)
  6. When the battery is full it will say CONNECTION BREAK, but this is because the intelligent battery circuit will disconnect itself when fully charged.

Demo video

In the next version i will be using a cheap boost converter from ebay, like this:


Oslo bysykkel kart / Oslo city bike live map

Oslo city bike is a great system and I often jump on a bike. But sometimes I wanted to be able to quickly check the status of the bicycles in my neighbourhood from my computer without having to log in to the app on my phone. Oslobysykkel doesn’t have this information in their map, so I made a public map with live updated availability of the bikes.

Check it out 🚲

Update: I see that oslobysykkel.no just updated their map to include availability at the very same time 😂

1W burning blue laser with driver for <$36



  1. Unscrew line/cross filter in front of lens on Aixiz module, if present.
  2. Remove existing red laser diode from Aixiz module by using a vise, some cloth and screws for pushing it out.
  3. Carefully insert new m140 laser diode using a vise and some cloth and screws for pushing it in by its base.
  4. Google “m140 pinout” to figure out the pins
  5. Solder the outputs from the LED driver module to the m140 + and - pins.
  6. Connect some voltage source to the module’s input, i used a 3S LiPo.

Important notes

  • Use laser safety goggles for the correct wavelength.
  • Laser diodes are very sensitive to voltage transients and static electricity. This means that when handling and soldering the diode, keep the two pins shorted until it is completely soldered to the driver circuit, then disconnect the short. I used some tiny connector probes that clamped on to each pin.
  • Keep the soldering quick. They don’t want high temperatures. Preferable mount the diode in a module before soldering (to ensure heatsinking)

DIY Eee PC Laptop digital picture frame with YouTube videos

I have always wanted to make a custom digital picture/multimedia frame showing things like beautiful earth porn videos from YouTube. For this you need a computer, like a Raspberry PI and an LCD monitor.
LCD monitors can be bought on ebay but they get a bit pricey if you want a bit of size (10”+), and you often need custom HDMI controllers for them. I had a couple of old EEEPCs lying around, and I figured an EEEPC would be a good fit. It has everything you need. Big slim LCD screen, slim motherboard, integrated WIFI and will boot off an SD card, and it’s environmentally friendly to recycle old stuff.

I made an HTML/js script that plays a youtube playlist randomly in fullscreen with an embedded player. Running chromium under incognito solves some problems, like preventing some caching and preventing crash message when not closed properly. Safebrowring causes periodic download of large files, which we do not want. –kiosk causes fullscreen.


Rip apart EEE PC and extract mainboard + LCD (well obviously don’t rip, but screw apart)
Careful with WIFI antenna, LCD cable and flatcables connected to the motherboard
Disconnect anything that is not needed. (camera, touchpad, keyboard, ++)
Solder a couple of wires with a push-button onto the existing power button pins.

I built a wooden case for my frame which holds the motherboard towards the back wood plate with some screws, keeping the heatsink metal plate that sat behind the keyboard in the Eee. The screen is screwed into the front frame which is fastened to the wooden supports on the sides.

I left big gaps in top & bottom in order to get air circulation, because I have removed the fan so there will be no active cooling.


Installed Ubuntu 14.04 (x86) on an SD card (using a Live USB created by UNetbootin)
During install add user admin, and ensure auto login is selected.

I set CPU to powersaving to keep the temp down, because I have no active cooling anymore. And disabled bluetooth (rfkill 1). Add the following to /etc/rc.local:

echo powersave > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo 0 > /sys/class/rfkill/rfkill1/state
su - admin -c 'cd /home/admin && nodejs . &> /dev/null &'

Ubuntu’s default ondemand boot script overrides our setting. Disable it. Run as root:

update-rc.d ondemand disable
apt-get install openssh-server chromium-browser nodejs npm iptables-persistent
iptables -A PREROUTING -t nat -i wlan0 -p tcp --dport 80 -j REDIRECT --to-port 8080

In /etc/fstab, append option noatime to root partition.

In /etc/default/apport, set enabled=0

Set power button action to shutdown (prevents showing a dialog.) Run as root:

sudo su - admin
DISPLAY=:0 gsettings set org.gnome.settings-daemon.plugins.power button-power shutdown
gconftool -s --type bool /apps/update-notifier/auto_launch false
mkdir .ssh

On your main computer:

scp ~/.ssh/id_rsa.pub admin@IP_OF_EEEPC:.ssh/authorized_keys
git clone https://github.com/mifi/digital-media-frame.git
cd digital-media-frame.git
./deploy.sh admin@IP_OF_EEEPC

On eeepc, run as root:

sudo su - admin
npm install

GUI settings

System Settings -> Brightness & Lock
Disable Dim Screen
Turn off screen: Never
Lock: Off
Disable Require password when waking from suspend

Under Startup Applications add
nodejs /home/admin/runner_script/index.js

Under Startup Applicationsadd
xrandr --display :0 --output LVDS1 --rotate inverted

Commands for checking health

cat /sys/class/thermal/thermal_zone0/temp
hddtemp /dev/sda
# Check for processes doing lots of IO:
iotop -P -a -o
# Check for processes using files (SD wear):
fatrace | grep 'W'



  • disable browser updates
  • ubuntu disable compiz
  • chrome screen tearing



Levitron Ion Revolution Platform "Ez Float" teardown

I bought this fun toy, but it had a misaligned LED so i had to disassemble it to fix it. I took some pictures to share with the world, in case someone is curious about the components or inner workings of this alien anti-gravity technology.

See here for product demo: https://www.youtube.com/watch?v=W6SSY7ABJkw

PCB photos follow:

Apple photos corrupted import from iPhone

I was importing my photos from my iPhone to my MacBook running El Capitan, and I got errors saying some files were in an unrecognised format, and some pictures turned out completely weird.

What’s sad is that the Photos app though that the pictures got successfully imported (apparently there was no integrity check), and so it reported back to iPhone that it could delete the photos after the “successful” import (according to the checkbox in the import dialog.)

Guess I’ll have to manually delete each photo on the iPhone after manually checking that all photos are in fact imported successfully now…