My new fat bike

I got a new bike, a Kona Rove NRB DL

I managed to buy my bike for only $2,400! This might seem excessive, but it is normally $2,999! I pick it up Friday, June 15.

Kona Rove NRB DL

My fifth decade on this earth is approaching and I am getting a little wide in my girth. I have a perfectly good touring bike sitting in the garage, a Bike Friday Pocket Lama:

Bike Friday Pocket Lama

The only problem is because it is a foldable bike, there is a weight limit for the frame. I am over that limit :-(

I need a new bike to ride my plus size me and the Kona Rove NRB DL fits the bill.

So why this bike?

The marketing spiel for the bike starts with:

what does a modern road bike look like? If you ask us, it would be quick on the pavement but completely capable of putting in time on a variety of surfaces. Thru-axles, hydraulic brakes, and room for big tires.


  1. A road bike with drop bars, thru-axles, and hydraulic brakes
  2. Room for big tyres: in 700c > 40mm and/or 650b > 45mm
  3. A wide range of gears with a low gear suitable for cycle touring
  4. Must be able to mount a rack and mudguards (fenders)
  5. At least three water bottle cage mounts (two in the frame, one underneath)
  6. A steel frame
  7. On the front fork, attachment points for water bottle cages
  8. On the top tube, attachment points for a top tube bag.

Bikes with these attributes are usually aim at the gravel market. This is for cyclists who like to ride on unpaved roads or even technical single track like a mountain bike.

Bikes in this category are often used for bike packing

The bike I have purchased meets the first five categories, but instead of steel uses aluminium for the frame.

Despite the ease of putting points 6 and 7 on a bike they didn't do this for my bike.This would be down to two factors, cost and market differentiation.

Bike designed for the bike packing scene have lots of attachments points everywhere. This is incrediably versatile, but a little ugly. An excellent example of this type of bike is the Surly Troll.

While my dream bike entails images of cycling a heavy ladden bike through a desert or mountain pass, reality is moving around quickly, comfortably in a busy city with the occassional foray into the bush.

This is best served by a Road+ bike, which is essentially a comfortable road bike with fat tyres, in my case 47mm 650B (27.5")

One of the bikes I was considering was the Surly Midnight Special which epitomises the Road+ category. I didn't get this bike because

  1. It wasn't on sale! So $600 more then my Kona Rove NRB DL
  2. No hydraulic brakes.
  3. Rims are not tubeless compatible
  4. No closed through axle dropout due to the frame supporting QR and thru axle wheels, see THE SURLY MIDNIGHT SPECIAL IS TRULY A FAT TIRE ROAD BIKE

On the plus side it did have mounting points on the front fork. I love their marketing spiel which is just as applicable to my Kona Rove NRB DL:

Today’s road bikes are tricky little buggers. Sure, there’s still a place for super narrow, pizza cutter-esque tires that save watts and shave grams or whatever. There’s probably still even a place for a road racing bike. Those places still exist. We just don’t know - or particularly care - where they are. When it comes to road bikes, we just want to toss a few bananas into our pockets and see where the road takes us. We seek out varied surfaces on our rides and frequently go from pavement to gravel to shittier pavement.

Enter: The Midnight Special - a Road Plus bike designed to provide comfort and speed on those all-day rides that extend well beyond fresh pavement. It rides like a cloud on smooth pavement. but that’s expected. Any bike can do that. Where it truly shines is on pot-holed, deteriorating pavement and the occasional long stretch of gravel. The Midnight Special’s 650b Road Plus tires eat up road chatter and absorb all the bumps in the road like the champion it was designed to be.

If you’re some masochist who is unfazed by the thought of a bumpy, chattery eight-hour road ride, you should know that the benefits of Road Plus go beyond just comfort. They also create a wider contact patch, thereby increasing your traction. And traction is a good thing. Additionally, higher volume tires allow you to better fine tune your tire pressure on varying surfaces. Let a little out on bumpier roads and pump those suckers up on smooth ones.

Want to know what bike packing is? .. have a look at for lots of great photos and stories.


FRAME MATERIAL Kona 6061 Aluminum Butted
SIZES 46, 48, 50, 52, 54, 56, 58
FORK Kona Full Carbon Flat mount CX Race Disc
B/B Shimano 68mm
FREEWHEEL Shimano 105 11-32t 11spd
R/D Shimano Ultegra
SHIFTERS Shimano 105
BRAKE CALIPERS Shimano Hydraulic Flat Mount
FRONT BRAKE ROTOR Shimano RT54 160mm (centerlock)
REAR BRAKE ROTOR Shimano RT54 160mm (centerlock)
BRAKE LEVERS Shimano Hydraulic
STEM Kona Road Deluxe
SEATPOST Kona Deluxe Thumb w/Offset 31.6mm
GRIPS Kona Cork Tape
FRONT HUB Formula 100x12mm (centerlock)
REAR HUB Formula 142x12mm (centerlock)
SPOKES Stainless Black 14g
FRONT TIRE WTB Horizon Road Plus TCS 650x47c (650x40c size 46)
REAR TIRE WTB Horizon Road Plus TCS 650x47c (650x40c size 46)
PAINT COLOR Matt Metallic Sand w/ Charcoal & Red Decals

Geometry for 56cm Frame Size

mm inches
1 ST LENGTH 560 22.0
2 TT LENGTH 579 22.8
3 REACH 392 15.4
4 STACK 610 24.0
5 STANDOVER 803 31.6
6 HT ANGLE 71.5 71.5
7 HT LENGTH 186.6 7.3
8 ST ANGLE 73.0 17.1
9 CS LENGTH 435 17.1
10 BB DROP 70 2.8
11 BB HEIGHT 273 10.7
12 WHEELBASE 1050 41.3
13 FRONT CENTER 624 24.6
14 FORK LENGTH 395 15.6
15 FORK OFFSET 45 1.8

Kona Rove NRB DL Geometry


Road Plus - Brought to You by the Midnight Special


Riding the new Kona Rove NRB gravel bike in southern Spain

pelotonmagazine article

Riding Gravel Forum Post


!( "Deadpool 2: The Final Trailer")


Saw Deadpool 2 last week, I liked the original better, but the end credits are very funny. Everything Is AWESOME

- Deadpool 2: The Final Trailer -

Deadpool 2: The Final Trailer

Deadpool Bloopers Outtakes and Banned Jokes

Deadpool Bloopers Outtakes and Banned Jokes

2018-05-21 Up and Running

Last Thursday and Friday I set up my website: on my linode server. I learnt a lot doing this including,

  • Ubuntu 18.04 LTS configuration
  • Nginx
  • SSH keys
  • Juypter Labs configuration
  • R

Today (Monday morning) I stayed up to 5am setting up my Nikola (Static blogging engine) blog.

It is running now, I still have to clean up the posts, especially links to images, but that is easy.

Using Jupyter Notebooks in Atom

Be default Jupyter will generate a random token each time you run the server. You can change this.

  1. Generate a config file for Jupyter

--> jupyter notebook --generate-config

--> jupyter notebook --generate-config
Writing default config to: /Users/stephen/.jupyter/

Edit and find the line that says #c.NotebookApp.token = ''. Change it to say c.NotebookApp.token = 'my_secret_token', substituting your choice of token string. (If you skip this step, the token will change every time the notebook server restarts).

## Token used for authenticating first-time connections to the server.
#  When no password is enabled, the default is to generate a new, random token.
#  Setting to an empty string disables authentication altogether, which is NOT
#c.NotebookApp.token = '<generated>'
c.NotebookApp.token = 'my_secret_token'

Insert into Atom setting --> hydrogen

 "name": "Remote notebook",
 "options": {
   "baseUrl": "http://localhost:8888",
   "token": "frodo_lives"

Learning Stats

I have learnt the hard way that for me to learn something new, I must practice what I am learning.

I want to learn statistics and there is a great course on Stats taught using the R language.

Now I much prefer Python and Pandas to R, there arn't that many good course teaching stats using Python. From a pedagogical viewpoint I learn best when I make detailed notes about what I learn each week. When doing an online course you can't publish your notes on your blog b/c it contains the answers, so other students could cheat. Solution: Publish the answer in Python on my blog That way I get a good overview of the strengths and weakness of each language.

Master Statistics with R

Statistical mastery of data analysis including inference, modeling, and Bayesian approaches.

In this Specialization, you will learn to analyze and visualize data in R and created reproducible data analysis reports, demonstrate a conceptual understanding of the unified nature of statistical inference, perform frequentist and Bayesian statistical inference and modeling to understand natural phenomena and make data-based decisions, communicate statistical results correctly, effectively, and in context without relying on statistical jargon, critique data-based claims and evaluated data-based decisions, and wrangle and visualize data with R packages for data analysis.

You will produce a portfolio of data analysis projects from the Specialization that demonstrates mastery of statistical data analysis from exploratory analysis to inference to modeling, suitable for applying for statistical analysis or data scientist positions.

The first course is Introduction to Probability and Data

About the Course

This course introduces you to sampling and exploring data, as well as basic probability theory and Bayes' rule. You will examine various types of sampling methods, and discuss how such methods can impact the scope of inference. A variety of exploratory data analysis techniques will be covered, including numeric summary statistics and basic data visualization. You will be guided through installing and using R and RStudio (free statistical software), and will use this software for lab exercises and a final project. The concepts and techniques in this course will serve as building blocks for the inference and modeling courses in the Specialization.

Nikola problems with libxml2.2

Installing Nikola works great, but you get a problem with libxml2.2

Referenced from: /Users/stephen/anaconda/envs/nikola/lib/python3.6/site-packages/lxml/
    Reason: Incompatible library version: requires version 12.0.0 or later, but libxml2.2.dylib provides version 10.0.0


conda install libxml2

seems to fix the issue,why?

don’t know, don’t care … just thanking the gods of stack overflow

Using Jupyter Notebooks in Nikola

When I tried to first import a Jupyter (ipython) file into Nikola it failed, I was quite disappointed because it was supposed to work out of the box.

But after a little research I found out if you use the nikola new_post with the --format=ipynb option it works perfectly

Original ipython file:

66590  9 Jun 04:59 trapezoid.ipynb

I ran the command: nikola new_post --title="IPython Notebook Demo" --format=ipynb --import=trapezoid.ipynb

Importing Existing Post
Title: IPython Notebook Demo
Scanning posts..........done!
[2016-06-09T18:20:46Z] INFO: new_post: Your post's text is at: posts/ipython-notebook-demo.ipynb

It produced the following slightly large file:

66815 10 Jun 04:20 ipython-notebook-demo.ipynb

This works beautifully. All it seems to do is append 10 lines to the metadata section of the jupyter notebook.

  "nikola": {
    "category": "",
    "date": "2016-06-10 04:20:46 UTC+10:00",
    "description": "",
    "link": "",
    "slug": "ipython-notebook-demo",
    "tags": "",
    "title": "IPython Notebook Demo",
    "type": "text"

As you can see this is a standard Nikola header block for a new post, but this time at the bottom, not the top of the file. Below is the full metadata block including the 10 lines added by nikola.

 "metadata": {
  "kernelspec": {
    "display_name": "Python 3",
    "language": "python",
    "name": "python3"
  "language_info": {
    "codemirror_mode": {
     "name": "ipython",
     "version": 3
    "file_extension": ".py",
    "mimetype": "text/x-python",
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
    "version": "3.5.0"
  "nikola": {
    "category": "",
    "date": "2016-06-10 04:20:46 UTC+10:00",
    "description": "",
    "link": "",
    "slug": "ipython-notebook-demo",
    "tags": "",
    "title": "IPython Notebook Demo",
    "type": "text"
 "nbformat": 4,
 "nbformat_minor": 0

IPython Notebook Demo

Basic Numerical Integration: the Trapezoid Rule

A simple illustration of the trapezoid rule for definite integration:

$$ \int_{a}^{b} f(x)\, dx \approx \frac{1}{2} \sum_{k=1}^{N} \left( x_{k} - x_{k-1} \right) \left( f(x_{k}) + f(x_{k-1}) \right). $$

First, we define a simple function and sample it between 0 and 10 at 200 points

In [1]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
In [2]:
def f(x):
    return (x-3)*(x-5)*(x-7)+85

x = np.linspace(0, 10, 200)
y = f(x)

Choose a region to integrate over and take only a few points in that region

In [3]:
a, b = 1, 8 # the left and right boundaries
N = 5 # the number of points
xint = np.linspace(a, b, N)
yint = f(xint)

Plot both the function and the area below it in the trapezoid approximation

In [4]:
plt.plot(x, y, lw=2)
plt.axis([0, 9, 0, 140])
plt.fill_between(xint, 0, yint, facecolor='gray', alpha=0.4)
plt.text(0.5 * (a + b), 30,r"$\int_a^b f(x)dx$", horizontalalignment='center', fontsize=20);

Compute the integral both at high accuracy and with the trapezoid approximation

In [5]:
from __future__ import print_function
from scipy.integrate import quad
integral, error = quad(f, a, b)
integral_trapezoid = sum( (xint[1:] - xint[:-1]) * (yint[1:] + yint[:-1]) ) / 2
print("The integral is:", integral, "+/-", error)
print("The trapezoid approximation with", len(xint), "points is:", integral_trapezoid)
The integral is: 565.2499999999999 +/- 6.275535646693696e-12
The trapezoid approximation with 5 points is: 559.890625

Migrating from Wordpress to Nikola

  1. Export XML dump of Wordpress files
  2. Use nikola import_wordpress to import each blog entry in the wordpress XML file into a markdown file with a metadata header about the post.

Run the command nikola import_wordpress

[stephen@macbook.local] Thu Jun 09 ~/Downloads/
[17] 17:18:23--> nikola import_wordpress --one-file posts.xml -o out
[2016-06-09T07:19:49Z] WARNING: import_wordpress: You specified additional arguments (['out']). Please consider putting these arguments before the filename if you are running into problems.
ERROR: Error parsing Command: option -o not recognized (parsing options: ['-q', '-o'])
[2016-06-09T07:19:51Z] INFO: Nikola: Configuration will be written to: -o/

I obviously got some of the command syntax wrong, but I don't care because it did what I wanted.

The --one-file option is important. If you don't use it, then you will get two files for each blog post. One with markdown of the posts content and the other contains the metadata about the post.


Metadata header made from wordpress blog entry

.. title: anyong hello Kitty
.. slug: anyong-hello-kitty
.. date: 2006-01-29 04:16:20
.. tags: 
.. category: 
.. link: 
.. description: 
.. type: text
.. wp-status: publish

BODY OF WORDPRESS POST - Very often the body of the post will contain HTML elements b/c wordpress formatting can be a bit of a mess and this is the easiest way to extract the body of the post with its formatting.

<html><body><p>The ultimate example of Korean and Japanese cultural cooperation.

<img alt="Korean Hello Kitty" title="Korean Hello Kitty" src=""></p></body></html>


Under Construction

Setting up Nikola.

In Pelican and Nikola regular markdown syntax to insert an image is:

![Under Construction](/images/under_construction.jpg)

I always keep my images in a folder called images I want this folder to be copied verbatim to the output folder (which I call output)

The source of the images folder is:




which means under_construction.jpg will be copied to




From how-to-insert-pictures-into-posts-in-nikola

If you want Nikola to recognise markdown and ipynb posts then must contain a reference to .md and .ipynb

e.g. for Markdown ==> ("posts/*.md", "posts", "post.tmpl"), has to be in the POSTS or PAGES

    ("posts/*.rst", "posts", "post.tmpl"),
    ("posts/*.md", "posts", "post.tmpl"),
    ("posts/*.ipynb", "posts", "post.tmpl"),
    ("posts/*.txt", "posts", "post.tmpl"),
    ("posts/*.html", "posts", "post.tmpl"),
    ("stories/*.rst", "stories", "story.tmpl"),
    ("posts/*.md", "posts", "post.tmpl"),
    ("posts/*.ipynb", "posts", "post.tmpl"),
    ("stories/*.txt", "stories", "story.tmpl"),
    ("stories/*.html", "stories", "story.tmpl"),

Ref: Nikola Handbook

Misc Nikola commands

nikola plugin --list-installed

Lists all installed plugins

nikola  new_post -f markdown

creates a new post in markdown rather then the default RST

[stephen@macbook.local] Thu Jun 09 ~/sites/website/output
[15] 14:09:30--> nikola check -f --clean-files
Scanning posts..........done!
[2016-06-09T04:09:43Z] WARNING: check: Files from unknown origins (orphans):
[2016-06-09T04:09:43Z] WARNING: check: output/test.txt

Checks if the output folder can be generated by the posts (and Pages?) folder, the -f --clean-files removes any file such as test.txt that can't be gerneated by the input folders (Pages, Posts) In this case I manually created test.txt