Firebase : How To Paginate – A Quick Guide

Pagination, or “How to Fetch a Data Set in Parts”

You want to provide a quick initial set of data to your Firebase user, say the first 5 blog posts. If they want more, you can serve up what is needed, always being considerate of their waiting time and network data usage.

This is a great design pattern, because it is optimising the right thing at the right time. At the start, you care most about speed, and giving the user something to work with. Then you care about giving them more of what they want.

It is often called “Pagination”, or “Chunking”.

In this article, I explain how to do this in Firebase.

Continue reading Firebase : How To Paginate – A Quick Guide

babel: “import path from ‘path’;” error

I set up a new project to use Google’s Web Toolkit framework, which uses babel in its gulpfile.

All looks good, but I get this error

$ gulp e2e-test
[09:01:05] Requiring external module babel-register
import path from 'path';

SyntaxError: Unexpected reserved word
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:373:25)
at loader (CWD/node_modules/babel-register/lib/node.js:158:5)

The cause: I need a .babelrc file to make it work.

From the babel website, (

$ echo '{ "presets": ["es2015"] }' > .babelrc

and now all is good.

How To Migrate to Angular2

Just back from AngularConnect 2015 in London (October 2015), and I’m enthused about all the great new stuff in Angular 2.

Only problem is, everything has changed and I’ve only just got the hang of Angular 1.

So, while I prepare to launch my new Angular/Firebase front-end to Luzme which uses Angular1, I want to start skilling myself up with Angular 2, for the next major release.

So this is my plan: take it step-by-step, and write about each step so I can share with others on the same journey, and learn from the comments and questions along the way.

This is the plan

At each step, I will write a failing test which introduces the next step.

I will commit that test, so you can see how to write such a test.

I will blog about what the step is and why it’s necessary. And what I needed to do to make the test pass.

I’ll commit that as a tagged version in github, so you can see at each step how to get from A to B.

Here’s the repo:

Stop Thinking; Start Doing

So you want to start a startup but can’t get past the first hurdle. You can’t decide on your startup idea. You have too many ideas and don’t know how to choose one. Or you have one great idea, but something always gets in the way of you executing it. Sound familiar?

The answer is simple. Pick One. Work on it. Learn from it.

Your idea will be wrong, almost certainly. That shouldn’t stop you doing it. How will you get experience without making mistakes?

“Good Judgement Comes with Experience; Experience comes from Bad Judgement” 13th century, via Mark Suster, Jim Horning and others

As my old music teacher used to shout at our chorus, when we sang quietly because no-one really knew the piece: “Sing Louder! How can I tell you you’re wrong if I can’t hear you”.

The only sure way to fail is to not start. Start singing louder so you can hear your mistakes!

Django: “Cannot add foreign key constraint”

Upgraded to Django 1.8 and now you get this error when you run your tests?

Have you created migrations for all your apps? If not, you may well be hitting the problem that the database tables are being created in the wrong order, which will give you this error.

If you have an existing Django 1.7 or earlier project, then you need to create the initial migration files, and then fake the initial migration, as described here

Create the migration with

$ python make migrations your_app_label

And then fake the application

$ python migrate –fake-initial your_app_label

Celery: group, chain & chord: what happens on error?

Found this useful summary in Ask’s reply:

Group (runs in parallel): Error on one task does not stop the others

Chain (runs in serial): Error on one task halts the chain

Chord (group with callback): Error in group prevents callback from firing

Update: From Celery 3.0.14, this Chord behaviour is configurable. See CELERY_CHORD_PROPAGATES config option.

John Pinner RIP

I was deeply sad to hear of the untimely death of John Pinner.

I met John at PyCon UK a few years ago, and very quickly learnt a great respect for him as a man, a friend, a mentor.

I saw him but once a year at the annual PyCon UK conference, and yet he had a great effect on me; I can only imagine the huge void that will be left by his passing for those who knew him more closely.

RIP John. I’m glad you were part of my life.


Review: “Discover Meteor”,Tom Coleman & Sacha Greif

Currently available at $39 and upwards (May 2014)

Check the current live price at Luzme

Meteor is a new web framework which promises near-real time data updates on the client.

If you’re planning to learn how to learn Meteor (which you should, it’s awesome!), you need this book “Discover Meteor”.

Continue reading Review: “Discover Meteor”,Tom Coleman & Sacha Greif