"We took it to other athletes – our clients, training partners, friends, and competitors. We listened to the problems they were struggling with and then asked ourselves the most important question of all: How can we make a difference?
Tuesday, November 01, 2016
BIA Woman Indiegogo Campaign is Live!
"We took it to other athletes – our clients, training partners, friends, and competitors. We listened to the problems they were struggling with and then asked ourselves the most important question of all: How can we make a difference?
Saturday, October 15, 2016
My Blog's Most Popular Search Term: Microsoft Bob
This goes into the wacky Internet category. I just happened to glance at the "Search Keywords" stats for my blog in the Blogger admin console and noticed the single most popular search term (since I started the blog around 2005) that has led people to the geeklit blog is "Microsoft Bob."

What's possibly even more bizarre is that number two is "barcelona aquarium." Really? Out of all the pages out there, people are searching for an aquarium and thinking, "ya, geeklit sounds like the right site for that."
Very strange people...
Sunday, September 18, 2016
Why I Just Bought a MacBook Pro
The answer is actually quite simple and surprisingly non-technical. I have spent my entire career working in software, but I've never bought an Apple computer of any type. I've been using my wife's old MacBook for years, but I've never experienced the best that Apple has to offer and I always wondered what I was missing. If you combine that with the current popularity of Macs--especially amongst web developers--and I just decided it was time. I've run many versions of Windows. I've used FreeBSD and some flavours of Linux (including Ubuntu on my Chromebook), but it's not until now that I can say that I've really had the full Mac experience.
Sunday, August 14, 2016
Angular 2 ng serve or ng build Permissions Error
If you grab an Angular 2 project from the web, you might find that you run into permissions errors after you install it.
For example, these commands are a common example of a simple project install. (This example uses yarn, but NPM would have similar results.) The addition of 'sudo' is common on Macs, but it can cause the permissions problem.
$ sudo npm install -g angular-cli
$ sudo npm install -g yarn
$ sudo yarn install
The problem occurs when you try to run $ ng serve (or $ ng build); you see an error such as this one:
EACCES: permission denied, open '/Users/cawood/GitHub/test/node_modules/arr-flatten/index.js'
Error: EACCES: permission denied, open '/Users/cawood/GitHub/test/node_modules/arr-flatten/index.js'
at Error (native)
at Object.fs.openSync (fs.js:640:18)
at Object.fs.readFileSync (fs.js:508:33)
at Object.Module._extensions..js (module.js:578:20)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.
...
The error occurs because the install ran as the admin user. The quick solution is to give the current user sufficient rights to the folder structure in your project. This example is heavy-handed, but it's fine for prototypes. These commands change the permissions recursively for everything (files and folders) in the test directory which is the one that contains the Angular 2 project.
$ sudo chmod -R +rwx test
$ cd test
$ ng serve
Tuesday, July 05, 2016
Switching to Google Cloud Platform Storage
To serve content from your custom domain, you'll need FTP access to upload a file to your current hosting storage. This is how Google verifies that you own the domain.
Once you've verified your domain, you create a storage bucket named the same as your domain (e.g., www.mycustomdomainname.com) and then upload your files to the storage bucket. There are two ways to upload content, you can use the dead easy Storage Browser web interface, or you can use gsutil. gsutil is a Python app that enables command line access to GCP.
Even if you use the web UI to upload your files, you'll probably still want to use gsutil for some additional actions. For example, to set files as public, you have to go into every folder using the UI (it's labourious to say the least), but gsutil provides a simple command to accomplish the same thing extremely quickly. This one command recursively sets every file in the bucket to public read: gsutil -m acl set -R -a public-read gs://bucketname
After you've got your files uploaded and set to public, you can test the links from the Storage Browser and then your bucket is ready to go. The last step is to go to your domain registrar's site and add a CNAME entry for GCP storage. For example, www.mydomainname.com points to c.storage.googleapis.com. After adding the alias, you can verify it's working by using the free CNAME lookup tool on http://mxtoolbox.com.
That's it! You're now saving money and your files are being managed by someone else. Very nice.
Note that if you're moving from Windows hosting to GCP, you might be switching from an IIS web server on Windows to a Linux backend. This means that your new Linux driven URLs will be case sensitive. This actually broke some of my image links because I hadn't matched the case of the file path exactly in the HTML and IIS doesn't care about such details.
Friday, June 17, 2016
Google Celebrates "Lady Day"
The women of Google have come up with a clever, tongue-in-cheek way to raise awareness about gender equality after an investor made a sexist remark at the company's annual shareholders meeting last week.
As my daughter grows up, I have become more and more aware of the issues women face in the workplace. Please read the Business Insider article about Google's Lady Day for the full story.
Wednesday, May 04, 2016
Spam iCloud Calendar Event Ads
Arggghhhh, now some waste of skin has figured out how to spam people by sending iCloud calendar invites to random email addresses. I just got an ad for Ray-ban sunglasses in my calendar. I like to refer to Spam that's sent by real people to the wrong address as "Spork." I'm not sure what to call this new type. Maybe "Spam Lite" or "Spam Singles"--both of which are real things BTW. Ya, Spam Singles sounds good, but moving on...
Thanks to user duozmo on stackexchange.com for the solution. To prevent this type of spam:
Log into iCloud on the web, open your calendar and go to ⚙ > Preferences. Under Advanced, you’ll find an option to receive calendar invitations by email instead of straight into your calendar.
This should allow you to delete calendar spam like regular email spam.
The other annoyance is that you can't delete or modify these since only the organizer can do that. To remove any spam you get this way.
1. Open the Calendar app from your Mac (not the iCloud web interface)
2. Create a new calendar (e.g., called "Junk")
3. Right-click the spam event and choose the Calendar option. Select "Junk" from the list of calendars and the malicious event will be moved.
4. Delete the Junk calendar entirely (without notifying).
Tuesday, April 26, 2016
Chromebooks to run almost every Android app?
From the article, "Chromebook users will soon get access to the 'more than a million' games and apps on the Google Play Store."
This would be huge. I've already written about how much I enjoy my Chromebook, but having full access to the massive Google Play store would be unbelievable. As more and more software is written in app form, 'old school' operating systems are becoming less and less relevant. ChromeOS is a fantastic bridge between having to do everything on a tiny screen and running a heavy O/S on a larger machine.
Wednesday, March 30, 2016
Why I Switched from Apple Music to Google Play Music

Fortunately, just like my previous switch, there is a way to get my playlists over to the new platform. To copy playlists from Apple Music to Google Play Music, I'm using STAMP.io. Although it seems to have the same issue I encountered in the last move--not choosing the same recording of the songs--it's certainly better than redoing all that time intensive work of creating the lists. The premium version costs a few dollars, but it's worth it.
So why go through the hassle of switching streaming services again? Here are the "why not" reasons:
- The cost is the same for the family plan, so price isn't an issue.
- I can copy over my playlists (with a bit of clean up required)
- I thought Apple Music would work seamlessly with iTunes. For example, I expected to be able to freely mix my content from iTunes and the streaming service. That's not the case. There appears to be no synergy there.
The deal breaker was the flexibility of Apple Music--or rather, the lack of flexibility. I simply cannot use Apply Music on enough devices in my house. Here are the devices/options I tested:
- Windows PC: works via iTunes
- MacBook: works via iTunes
- iPhone 6: works via Apple Music App
- iPhone 3 (my daughter plays with it): no app, does not work at all
- Android Tablet (Kindle Fire): no app, does not work at all
- Nexus 5x: works via Apple Music App
- Chromebook: does not work at all
Obviously, some of these are more important than others, but the fact remains that Google Play Music works fine on every one of these devices. Furthermore, it does not require any install to run on a PC/Mac/Linux/ChromeOS browser; I really miss the web listening experience that I had with Rdio and I want that back. In the end, it was an easy decision to make the switch and go Google.
Saturday, February 06, 2016
Google Drive API JavaScript App Running in App Engine
Why would you want to do this? It's great to be able to create your app that uses the Google Apps APIs, but even better is to host that app within the Google App Engine so that you don't have to worry about maintaining any of the infrastructure that runs your app. You also get the benefit of sophisticated App Engine features such as performance scaling.

The steps in the Drive V3 quickstart (https://developers.google.com/drive/v3/web/quickstart/js) will get you most of the way, but with a few changes, you can serve the app from the Google App Engine, which is super powerful and a more modern mechanism for running a web application.
One thing you'll have to change is the URL that your client ID will accept. The quickstart expects you to host and run the app on your local machine, and therefore use http://localhost as the URL. You can enter that when you work through the tutorial, but you'll have to change the URL for "Authorized JavaScript origins" later to the URL for your particular app. However, you won't have that URL until you try running your app from the Google Cloud Shell.
Your client ID should look something like this (I've edited it so as not to disclose my client ID):
111111-gchjkdptqt15lp89s229jo8h25omel4e.apps.googleusercontent.com
Here are some notes to clarify how to get the quickstart running in Google App Engine from the Google Developer Console:
- You'll likely want to create your own GitHub repo and clone it to your local machine.
- When you get to the step in the tutorial, you can connect your app project to your new Git repo. You'll have to authorize Google App Engine to use your repo. By connecting the two, it is super easy to manage (and even edit) your code from within the Google Developer Console.
- Create the sample file (with code provided) in the local repo and push it to master that is synching with GitHub.
- Don't forget to change your client ID in the sample code: var CLIENT_ID = '
'; - Once you have everything ready. Make sure you have your new quickstart project selected and then open the developer cloud console. The console is a Linux based shell.
- Change directory (CD) to the src directory for your quickstart project.
cawood@definite-destiny-999999:~$ cd src/definite-destiny-999999/master
- Start a web server using Python to host your application: python -m SimpleHTTPServer 8080
cawood@definite-destiny-999999:~/src/definite-destiny-999999/master$ python -m SimpleHTTPServer 8080
- Open the Web preview from the console window in port 8080. When you navigate to the quickstart.html file, you will get the URL you need to add to your client ID credentials. The Web preview option is in the top-left corner of the cloud console.
- Find your client ID in the credentials section of the dev console and edit it to add the URL you just opened in web preview. (To stop the app (quit the web server), press Ctrl+C.)

Note: I do not cover deploying your app for production use. Perhaps that can be a future post.
Note: If you've made a change and pushed it from your local machine, but the file isn't updating, try closing and reopening the console. I've found that it doesn't pick up changes to the files unless I do this.
I've made the project public on GitHub: https://github.com/stephencawood/WebHelpEditor/tree/master/WebHelpEditor
Wednesday, January 13, 2016
I AM CARDBOARD VR Url Not Recognized Setup Error
For Christmas, I picked up a Google Cardboard viewer. It's the easiest (read: cheapest) way I know to get a virtual reality headset for home use. When I co-wrote Augmented Reality: A Practical Guide for the pragmatic programmers (in 2006), headsets for augmented reality or virtual reality were expensive and bulky.
That certainly has changed. Google cardboard devices are literally made of cardboard. There are lots of choices. I got the I AM CARDBOARD® 45mm Focal Length Virtual Reality Google Cardboard. So far, I'm impressed with the inexpensive device. Enabling clicking in the virtual user interface by moving a magnet on the side of the device is ingenious.

Unfortunately, I quickly ran into a problem with the set up. When asked to use my phone's camera to grab the QR code on the cardboard, I received the error "URL not recognized" or "Problem in parsing the Url." QR codes represent a URL and if that URL changes, they can break. The solution was to find the manufacturer's website and search for a QR code there. In this case, I found a working QR code for the I AM CARDBOARD. Now I'm looking forward to trying out more of the apps with my daughter.

BTW: from the site -- "Calibrate your VR headset using the QR code found in this listing images. To do so, open the Google Cardboard app, select "Configuration" menu option, click on "Switch viewer" and scan the QR code."
Friday, December 04, 2015
My Brother's D&D Kickstarter Campaign
The World of Myrr is a Kickstarter campaign that my brother put together. It's a detailed and play tested campaign world for Dungeons and Dragons Fifth Edition
If you know any D&D fans, let them know this new campaign is out there.
He even gave me credit in the video for helping with the World of Myrr Wordpress site and various other technical questions. :)
Monday, November 16, 2015
Aquatic Informatics Named to Deloitte Technology Fast 50
Tuesday, October 06, 2015
Copying Playlists from Rdio to Apple Music
Move to Apple Music allowed me to export a copy of my playlists (in XML), then upload the playlists I want into Apple Music. It also provides a list of the songs it couldn't find on Apple Music. In my case it was over 200, but when I checked into it, it turned out that most of the songs are available on Apple Music, they're just listed differently (e.g., the same song on a different album version). Be aware, iTunes will actually refuse to sync a playlist if there's a song included that can't be found, so you'll have to check them once you have finished the import.
Tuesday, September 08, 2015
Araxis File and Directory Comparison Utility
Free tools such as KDiff will perform a differential analysis on files and even show exactly which lines have changed. However, KDiff doesn't provide any ability to separate the changed files from the ones that don't need to be translated again. Fortunately, there is another application called Araxis Merge (Windows and MacOS supported) that does allow for this ability. At the time of writing, it's $129 for one standard licence.
Like Kdiff, you can run a recursive directory diff to find all the changes in all the files. However, once you have done your folder comparison, you can also select all the altered files (using Select Rows > Selected Changed) and copy them to a new "specified folder." Using this method, I was able to grab all of the XHTML files that have changed since we last did a complete document translation.
Note that this method DOES NOT copy new files. You will need to go through manually and copy the files that have been added. These files appear green in the Araxis folder comparison view.
Tuesday, August 04, 2015
DocBook 5 Install and Setup for Windows
Currently, I only want to set up DocBook to publish HTML--I may be adding PDF later. Finding the installation and set up instructions for DocBook on Windows was not easy. I discovered a couple of old (and short) versions of this and that's where I started.
Unlike most Windows applications, there is no installer for DocBook. Installing is the same as downloading the executables (and other files), copying them to the location you want and then adding that location to your Windows Path. The Windows DocBook setup essentially has three pieces:
- DocBook DTD (optional)
- DocBook XSL stylesheets
- Tools:
- libxml2
- libxsl
- iconv
- zlib1
Unzip the folders and copy the files to c:\windows or another location that's in your Windows path. I prefer to copy them somewhere else (e.g., C:\docbook and add that directory to the path variable):
B. LIBXML2: I downloaded libxml2-2.7.8.win32.
If you want the newer libxml2 kit to convert your XML to HTML, you can get it from:
ftp://xmlsoft.org/libxml2/win32/64bit/, or ftp://xmlsoft.org/libxml2/win32/. But I'd try to get the old one working first. I haven't bothered to upgrade.
C. ICONV: I download iconv-1.9.2.win32
D: ZLIB1: I downloaded zlib-1.2.5.
After grabbing the tools, make sure you set up your Windows Path Variable. To set up the path for my system, I appended this: C:\docbook\libxslt-1.0.9-bin\bin;C:\docbook\libxml2-2.7.8.win32\bin;C:\docbook\iconv-1.9.2.win32\bin;C:\docbook\zlib-1.2.5\bin;
Once you have the tools installed. Run this command: xsltproc -version
The results should look something like this:
stephen.cawood@OLIFANTS /s/GitHub
$ xsltproc -version
Using libxml 20708, libxslt 10126 and libexslt 815
xsltproc was compiled against libxml 20706, libxslt 10126 and libexslt 815
libxslt 10126 was compiled against libxml 20706
libexslt 815 was compiled against libxml 20706
And the successful output should like like the image below.
To add a CSS stylesheet to your HTML output, use a command similar to this:
stephen.cawood@OLIFANTS /c/docbook
$ xsltproc --output outputFile.html --stringparam html.stylesheet help.css /c/docbook/docbook-xsl
-1.79.0/html/docbook.xsl testDocBook.xml
Note: If you want to build PDFs, you'll need to download and install FOP for Windows.
References:
Wednesday, July 08, 2015
Office 365 Message Shows Openness at Microsoft
Why isn't my Office 365 app launcher working as expected?
If you're using Internet Explorer when you visit a team site or other SharePoint Online page in Office 365, the app launcher may not show customizations you've made, like resized tiles or apps pinned to the navigation bar.
What can you do?
## Try this first! Use a different browser. We recommend using Microsoft Edge on Windows 10, and if you don't have Windows 10, try using the latest versions of Mozilla Firefox or Google Chrome.
Everyone has been hacking on IE forever, but to see this level of openness from Microsoft itself is quite telling. Yes, they're promoting Microsoft Edge, but nothing wrong with that. There was a time when people at MS were saying silly things like "don't call it a bug, it's an unintended feature." I was at an event when Steve Ballmer called out that behaviour and told the audience to be open with customers. "If it's a bug, call it a bug." That was around 2002. It's good to see the openness continues.
Friday, June 12, 2015
Error Starting Ubuntu Desktop on Chromebook After Upgrade
Unfortunately, the version of Ubuntu installed was 12. As fun and nostalgic as that was, I immediately set about upgrading to the latest stable build. Running the upgrade was simple enough.
sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade sudo apt-get install update-manager-core sudo do-release-upgrade
Everything worked at first, I even went through the process of installing some applications such as Gnome Terminal, Gimp and Git (Crouton installs the minimal release--so barely any applications). However, I ran into a snag when I rebooted. The sudo startunity command would fail with a nasty message.
...
[ 727.514] (WW) The directory "/usr/share/fonts/X11/75dpi" does not exist.
[ 727.514] Entry deleted from font path.
[ 727.514] (==) FontPath set to:
/usr/share/fonts/X11/misc,
/usr/share/fonts/X11/Type1,
built-ins
...
727.526] (EE) Segmentation fault at address 0x0
[ 727.526] (EE)
Fatal server error:
[ 727.526] (EE) Caught signal 11 (Segmentation fault). Server aborting
...
[ 727.526] (EE) Please also check the log file at "/tmp/Xorg.crouton.1.log" for additional information.
[ 727.527] (EE)
I prefer the Unity desktop, so that's the one I had originally installed. To work around the error, I reinstalled Unity using the same command in the original setup article:
sudo sh ~/Downloads/crouton -t unity.
Wednesday, May 27, 2015
The Secret Sabbatical
With extensive use of examples from the humanities, the book discusses the "loss of imagination" that is currently rampant in most organizations... and more people's lives.
From the website:
"This is the Book with the secrets of The Secret Sabbatical. Up to now this material was only available in one-on-one Course sessions for those asking “What Should I Do With the Rest of my Life?”
Developed over 10 years the Course has been fine-tuned for executives, surgeons, architects, research scientists and other professionals. Now you can read the notes from that Course, which are arranged in a clear sequence that covers how to find your own answer in the needed depth."
Wednesday, April 22, 2015
5 Tips to Make SharePoint Easier for Non-SharePoint People
#1 Simplify Versioning
A quick and easy way to help your users avoid pitfalls is to simplify the version settings for their document libraries. You may have some complicated process in mind that requires specific settings, but if that process is confusing your users, you should consider simplifying the version options. For example, if you don't need versioning, just turn it off completely. If you don't need minor versions, turn them off. People new to SharePoint usually don't know that there minor versions are only visible to them by default.One easy way to prevent conflicting changes is to enforce check out before documents are edited. This is a simple radio button in the version settings.
You would use this if you’re worried about your users making conflicting edits. Requiring that they check out documents before editing will eliminate the problem of conflicting changes, but you’ll need to educate them on checking in the docs when they’re done.
To add the column, go to the doc lib's settings page and find the "Columns" section. From there, choose the "Add from existing site columns" link and then select the "Checked Out To" column from the list.
#2 Add the “checked out to” Column
Since I just mentioned enforcing check-out before editing, the next tip has to be one of my favourites—adding the “Checked Out To” column to the default view. This simple change can make life so much easier for people new to SharePoint.
If you add this column to the default view, it's obvious to everyone which documents are checked out and who has them checked out.
#3 Show draft documents by default
Another option that is related to simplifying versioning is to show draft documents by default. This way you can allow people to see draft documents before they have been checked in. If a user sees a draft, he or she can talk to the person working on the document before making changes that would potentially conflict with the existing draft.
This saves lots of hassle because it's common for users to forget to check in new docs, or simply not understand why it has to be done before other people can see that a file has been added.
#4 Keep the permission model simple and manageable
#5 Show your users how to sync their document libraries to their local folders
Note: You may need to install the install the SharePoint 2013 OneDrive Pro client to get this to work.Many users feel more comfortable working in the Windows file system. They can do this with their SharePoint document libraries by choosing the "Sync" options or the "Open with Explorer" link. Once you have the SharePoint library syncing to a local folder, you can easily do things like paste files into the doc lib to upload them to SharePoint.
#6 Bonus Tip For Admins and Power Users
If you go to the library settings, you can use the "Managed checked out files" option to see all the checked out files and from there, you can even take ownership of them by choosing the "Take Ownership of Selection" option.This is great when a document isn't showing because it only has a draft version and you're not sure who has it checked out.