You are here: Home . Archive

Author Archives: Kakoma

You are here: Home . Archive

Getting Started with Amazon Cognito: Part 1

I first worked with Amazon Web Services (AWS) Cognito in 2018 while building a financial web app that was deeply tied to the AWS infrastructure. It made use of AWS lambas, AWS Dynamo DB, the API gateway and AWS Cognito to process data from banks and create a rewards platform for businesses. Cognito’s documentation then, as AWS’s documentation tends to be, was quite difficult to work through. I pieced together a usable solution but didn’t foresee Cognito and I meeting again.

Fast-forward a few weeks ago and I needed to evaluate both Cognito and Firebase as an authentication service to use for a powerful insurance web app. While it is almost 4 years since that fateful encounter with Cognito, the nightmares are still fresh, and I still bear the scars. I’d have loved to immediately call it for Firebase but I took a number of key technical factors into consideration and Cognito came out on top. So, we meet again, my old friend foe…

I went in, silently hoping Cognito had changed her ways. The joke was on me. Several days later, I realized Cognito might have only gotten worse (in documentation) over the years 🙂   

In case you’ve had similar challenges, here’s a high-level walk-through of how I went about implementing Cognito for a JS front-end [Vue.js] and a Django backend.

I’ll break this down into a series of articles:

  1. Implementing Cognito on the frontend
  2. Implementing Cognito on the backend and migrating your users (if you had an existing app)

To set the stage, it is quite useful to know [or get a refresher] on JSON web tokens (JWTs). To do that, check out this article

In it, you see that we follow the following steps:

  1. The application or client requests authorization to the authorization server, in this case Cognito. This is performed through one of the different authorization flows.
  2. When the authorization is granted, the authorization server [Cognito] returns an access token to the client application.
  3. The client application uses the access token when making all requests to the backend API

Based on this flow, you’d change your front-end to talk to AWS Cognito, retrieve a JWT and then from that point forward, use that JWT with all your API requests.

So basically, as you look at changing your app to start using Cognito, you need to do two things:

  • Change your frontend to retrieve a Cognito token on login, then use that token going-forward with every API call it makes.
  • Change your backend to retrieve the token given to it, verify it and grant access to the parts of the application the user can have access to.

Some extra steps you might consider doing on the frontend:

  • If the token expires, reach out to Cognito for a new one. Amazon’s documentation covers that here but this is a useful article as well. Alternatively, you can just logout the user so they need to re-login
  • Make it possible for users to register. When a user registers, register them with Cognito
  • Add the ability for a user to reset their password
  • Support Groups and custom user permissions

I called these steps optional because you have the option to use Cognito’s self-hosted UI to do them. It would save you lots of hours of coding time.

In the following articles, I’ll get into how to get into changing your frontend and your backend as well.

How to customize Android product flavour app name, strings, styles and the manifest

Android development has a powerful feature that allows you to modify an Android application and make it possible for it to be customized and deployed using a different look and functionality. Some examples where this might be useful:

  • White-labelling: This is where you have an application that you customise for each customer. For example, you have an eCommerce app but have different customers who would like to have their own version of that app. Also, you could have a ride-sharing app that you customise for your various customers
  • More commonly, you have a free version of your app but you’d like to create a paid version with more features

Just to re-iterate, for you who already has an existing app, depending on your strategy, Android flavours give you the option of increasing your income streams by customising the same app, and making it available for use by other customers.

That said, while this tutorial gives a really good introduction to what flavours are and how to get started with them, here, I’ll focus on the specifics of how to actually go about customising them in what I feel is a robust way.

Google’s documentation gives instructions on how to modify various aspects of the different flavours but I’ll get into specifically how to customise the following:

  1. The AndroidManifest.xml
  2. Specific Strings [Instead of feeling pressed to have to customise the entire strings.xml file]
  3. Styles

I’ll focus on the scenario where you’d like to customise just a subset – such as a subset of the strings you have in strings.xml – as opposed to the entire strings.xml file. One disadvantage of copying an entire AndroidManifest.xml or strings.xml is the repetition it introduces; if you need to change something, you might need to change it in multiple files. One of the principles of software engineering is Do Not Repeat Yourself (DRY). Let’s see how to do that.

Android has something called manifest placeholders, a pretty cool feature that will allow you to modify AndroidManifest.xml without needing to re-write the entire file. Here’s an example where we modify the app name per flavour.

Customize the AndroidManifest.xml per flavour

Change this in AndroidManifest.xml:




${appLabel} is a manifest placeholder. Then, in your .build.gradle file, in the android section, modify the defaultConfig section to define the appLabel placeholder.

defaultConfig {
        manifestPlaceholders = [appLabel:"@string/app_name"]

In your flavours, you can define the manifest placeholder as well:

Specific strings

  flavorDimensions 'default'
    productFlavors {
        shopTillYouDrop {
            dimension = 'default'
            versionNameSuffix = '-styd'
            manifestPlaceholders = [appLabel:"@string/app_name_styd"]

This way, you can define app_name and app_name_styd in strings.xml and be able to translate it into various languages if need be. You can use the same technique to customise other aspects of the AndroidManifest.xml. Here’s how to use that technique to specify different themes.

    defaultConfig {
        manifestPlaceholders = [appLabel:"@string/app_name", appTheme:"@style/ShoppingTheme"]
 flavorDimensions 'default'
    productFlavors {
        shopTillYouDrop {
            dimension = 'default'
            versionNameSuffix = '-styd'
            manifestPlaceholders = [appLabel:"@string/app_name", appTheme:"@style/ShopTillYouDropAppTheme"]

You can see that with this technique, you won’t need multiple AndroidManifest.xml files.

Customize specific strings per flavour

Sometimes you need to have just a few strings in the entire strings.xml changed in your flavour. Android scans the res folder and picks strings from the files present. Because of this, move every string you’d like to customise into a different file e.g. strings_flavours.xml. This technique is mainly useful if you don’t think you’ll modify very many strings in strings.xml. Create strings_flavours.xml in src/main/res/values/. Make sure you remove all these strings from strings.xml.

<?xml version="1.0" encoding="utf-8"?>
    <string name="flavour_string_one">String Value</string>
    <string name="flavour_string_two">String value two</string>

Now, you can simply create strings_flavours.xml in your flavour directories .e.g src/shopTillYouDrop/res/values and update it.

Customize styles

Lastly, you can create custom themes for each flavour. As I pointed out while customising AndroidManifest.xml, you can change the theme per flavour using the technique I showed above. Now, knowing that you have specified a different theme, all you need to do is create the new theme, make the default theme its parent theme then go ahead and customise any aspect of the custom theme you’ve created.


    <!-- Shop till you drop Product Flavour custom theme. -->
    <style name="ShopTillYouDropAppTheme" parent="DefaultAppTheme">
        <item name="android:fontFamily">@font/opensans</item>
        <item name="buttonStyle">@style/ShopTillYouDroAppTheme.Button</item>

    <!-- Base application theme. -->
    <style name="DefaultAppTheme" parent="MaterialAppTheme">
        <!-- Customize your theme here. -->

How to use a GoDaddy Domain with an AWS load balancer

I have hosted domains on GoDaddy for a number of years now. While it provides web hosting, I have never used any of their hosting packages. For starters, I was keen on having a setup that gave me a lot more control than GoDaddy does. More to that, SSL certificates are a must-have for any web application today. While these are available, they come at a cost.

While there are plenty of options for web hosting, I’ve hosted applications on Amazon Web Services (AWS) for a number of years. With it, I had the level of control I desired but also got the bonus of SSL certificate management being done on my behalf.

The Amazon Certificate Manager (ACM) service from AWS allows one to get a free SSL certificate in a very hassle-free way. It has the added advantage of having the ability to generate certificates using wildcard domains. This means you can have an SSL certificate for as well as *

More to that, one doesn’t have to worry about renewing the certificate – ACM covers that on your behalf. One catch though is you can only use these certificates on specific AWS resources such as AWS load balancers. Another catch with AWS is pricing – it is generally pricier than the other options out there.

That said, if, like me, you host your web application on AWS but purchased a domain on GoDaddy, what do you do?

Well, there’s one option proposed here.

In addition to the accepted answer there, another option [and the one I use] is to create and configure an AWS hosted zone in AWS Route 53 following the steps below:

AWS Route 53: Creating a hosted zone
  1. Sign in to the AWS Management Console and open the Amazon Route 53
    console at
  2. Select Hosted Zones then click Create Hosted Zone. More here on creating a hosted zone.
  3. You’ll need to ensure your hosted zone points to your load balancer. To do this, create an A record, leave the record name blank, select A – Routes traffic to an IPv4 address and some AWS resources, select alias and from the dropdown list returned, select your desired load balancer
  4. Lastly, go ahead and create a CNAME record and point it to the record you created in the previous step. If your domain is, put www as the Record name, select CNAME – Routes traffic to another domain name and to some AWS resources for the Record Type and for value, put your domain –

Each hosted zone creates nameservers for you so on creating your hosted zone, your nameservers have the type NS in the hosted zone records. They are usually 4 of them. Get the provided name servers and update GoDaddy to use those nameservers for your domain.

Your GoDaddy domain will now be pointing to an AWS hosted zone which in turn points to your load balancer.

Jesus and John the Baptist’s unity in the Spirit

In the book of John, chapter 3, the Bible records Nicodemus, a leader in Israel, going to Jesus at night to do some consultation. Jesus drops profound truths on him and I believe he goes away with a lot to think about given the novelty of the things he is told. I picture Nicodemus on his way back home wondering about this “must be born again” phrase Jesus used.

Shortly after this conversation, Jesus takes his disciples and He starts baptising people.

John the Baptist has been baptising people in that area for a while, so much so that he baptised Jesus not so long before this. John’s disciples see Jesus baptising too and run back to their master to report: “Rabbi, that man who was with you on the other side of the Jordan—the one you testified about—look, he is baptising, and everyone is going to him.”

From their tone, I suspect they expected John the Baptist to go confront Jesus or probably start doing a better job at advertising his baptism services to attract more people to himself. They probably had some adverts for the ministry in mind.

Some notable ads might have read “John the Baptist, one baptismal dip and your life will flip”, “Don’t be fleeced. Come to John, the Baptist”

Like every good teacher though, John the Baptist instead drops some profound truths on them.

All this is in John 3. Reading the chapter, I was really fascinated by how similar John the Baptist’s words were, almost word for word in some cases, to those Jesus used only a few verses earlier while schooling Nicodemus. Here’s a comparison:

Message Jesus’s words (John 3:1-21) John the Baptist’s words (John 3:27-36)
 Jesus is from heavenNo one has ever gone into heaven except the one who came from heaven—the Son of Man The one who comes from above is above all; the one who is from the earth belongs to the earth, and speaks as one from the earth. The one who comes from heaven is above all.
He was sent by GodFor God so loved the world that he gave his one and only Son, that whoever believes in him shall not perish but have eternal life. For God did not send his Son into the world to condemn the world, but to save the world through him.

For the one whom God has sent speaks the words of God,


I’ll add Nicodemus’s words here just for comparison on this particular one:

John 3:2 “…we know that you are a teacher who has come from God
He testifies of things He has seen Very truly I tell you, we speak of what we know, and we testify to what we have seen He testifies to what he has seen and heard
 No one believes Him! ..but still you people do not accept our testimony. 12 I have spoken to you of earthly things and you do not believe; how then will you believe if I speak of heavenly things? …but no one accepts his testimony.
Anyone who believes Him has eternal lifeWhoever believes in him is not condemned, but whoever does not believe stands condemned already because they have not believed in the name of God’s one and only Son.Whoever believes in the Son has eternal life, but whoever rejects the Son will not see life, for God’s wrath remains on them.

I find it fascinating how both Jesus and John the Baptist had clarity on what’s up even though they didn’t have a meeting to discuss and agree on these things. While both were teaching in these passages, they drew from the same ultimate teacher – the Holy Spirit. There’s a certain clarity & unity in message that comes from a close union with the Holy Spirit.

Do you know your place in the Kingdom? When, like John the Baptist, you are presented with an opportunity to throw shade at another ministry [or maybe just to compare your christianity against someone else’s], do you speak based on revelation or based on emotions?

The Holy Spirit is a wonderful teacher. I pray you and I grow as students, seeing things the way He does, united and speaking the truth He reveals.

Ahead of Facebook Dev Circle Ask Me Anything session

I’ll be hosted by the Kampala Facebook Developer Circle to an Ask Me Anything session. To give context for some questions, here’s a bit more about me and my journey as a software engineer in Uganda:

A friend, Andrew, and I had an idea to start a job-matching/sports-betting site in our S.6 vacation. I say job-matching/sports-betting because I can’t quite remember which of the two it was. Either way, we paid someone to build the website and we never got a thing. I think the desire to learn to build sites myself was birthed then.

I studied Electrical Engineering. When it came to time to do internship(which happens in the second year), I chose to join a web development company.  First, I wasn’t sure the Faculty would allow me to do web development for internship since it wasn’t part of the things we were taught. Secondly, I worried that I might be given a poor grade because of that choice.

The Faculty agreed. Helika Limited, a private company, took me on. I had access to the internet and I was told we’d use WordPress for the first website we’d do. I spent my first day cramming HTML tags.

HTML and CSS book

By the end of the internship, I’d put together a website for a client using WordPress. I’m not certain it was ever published. Special thanks to the amazing Hellene K. for getting me started with a keen eye on quality and professionalism.

I was fortunate enough to make it into MTN Uganda for my next internship a year later. I worked in the Network Operations Center – the NOC. It is a section that monitors the status of the telecom network and also addresses some customer issues. I got to see the practical side of the telecom aspects I was learning in school.

I was still coding. One particular project that consumed me was building an arts & crafts website. I was targeting a launch around the 2007 Commonwealth Heads of Government Meeting (CHOGM) that Uganda would host. I used Joomla to build it. I got a lot of help from a course mate, Wallace., who was already doing work for some major clients at the time.  CHOGM came and went and my site didn’t see the light of day…

For my final year project in school, a friend and I designed a fire alarm system with SMS notification. It involved interfacing with and programming microprocessors. It was a disaster. I’m still getting lessons from FundiBots to make up for it.


Just before completing school, there was an opportunity to join MTN as a temporary staff member in the NOC. I applied and since I’d interned in that section before, I got in. It was one foot in the door…

I loved the team – they really helped me find the ropes and learn the telecom network well. Sam Naseke, Thaddeus, Mark Oula, Collins Kiwotoka, Irene Ekama, everyone. I particularly loved the night shift – less traffic on the network so I got to do more coding. I built an app that made it easier to do my work – it logged into the servers I was monitoring, run the commands I needed to, combined the output and displayed it in a pretty interface I could click through.  I got help on some tricky display bits from a good friend and heavyweight in these things, Ssegga

An opportunity to join another section in MTN as a Billing Systems Analyst came by. I applied and didn’t get invited for the interviews.

Another opportunity came by – one to join the Software Systems Support section. This, I felt, was the dream job! I applied. I was invited for the written interview which beat me into a pulp.  Ssegga got that job.

Yet another opportunity came by, this time in a section called Value Added Services (VAS). I applied, fought through the hard written interview, tussled through the oral interview and got the job! Software engineering took a marked new turn for me from here….

Part of the job involved creating customer-facing USSD/SMS/Web products for the company. The other part involved planning for several VAS services – WhoCalled, Voice SMS, Voice Mail, USSD, SMS, etc. Legend has it that the person who held the job before me up and left one day, leaving unfinished products behind. I found a code base in PHP. One of the product was going to be launched in a few months. I feared to make changes to the product yet the marketing team always spoke to me like they had no doubt I knew what I was doing. In time, I grew more confident, I think I started to believe them. I started making more changes without holding my breath. Special thanks to Dennis Musinguzi, Eddie Kibuuka, Chris Ssali from the marketing team that didn’t eat me alive.

The product launched and the rest is history. NOT. I struggled. The demand grew exponentially and I couldn’t understand why the product kept failing. I learned the hard way how to scale an app. On the database side, I got a lot of guidance from Chris Musasizi. On the code side, I leaned a lot on the late Revence Kalibwami for pointers on what to try. It was tough. I recall spending an entire weekend at my laptop and eventually passing out, seated, typing. I also remember when it finally worked; when friend’s stopped calling to say “Gwe, the thing is off again”. I couldn’t believe it. The app scaled to handle 4 million customers.

I wore all software engineering hats – systems admin, database admin, software support, dev ops, the works.

Typing at keyboard

There were a lot of products and services thereafter. At some point, my supervisors, Elizabeth Olule Liri & Jennifer Kanyunyuzi, pushed to create a special section that only wrote code and  asked HR that I head it. We recruited 2 solid engineers – Sidney W. & Alex N. – and I started to learn how to lead a software engineering team. Special thanks to Bod Toki from Google whom I spoke to for several hours getting tips. Extra, extra special thanks to Elizabeth and Jennifer for taking such a big leap.

I requisitioned and bought servers and we went about setting up (doing physical installation, laying cables, labeling, choosing and installing software) for some really solid architecture spanning multiple data centers and involving over 24 virtual servers. Special thanks to *NIX maestro Alberto for all the tips & guidance.

We built several products & services. One of the most memorable for all of us was migrating traffic for internet bundle provisioning from a big international vendor to our platform. If there were ever any doubts that we were doing fairly solid work, that transition eliminated them.

Kanzu Code was officially born somewhere amidst all this. We launched a product into the WordPress repo, have done several projects and grown in many ways. Special thanks to the entire team for all those things we’ve knocked out of the park and those we are still finding ways to excel at. A word from our sponsor: We’ll release tutorials on how to grow as a software engineer in the Kanzu Lab here. Do sign-up. Our initial focus will be on WordPress.

Andela came up last year. Maria Kyamulabye felt I was a good fit for a role I thought was out of my league. It was a really grueling interview process but as all good things go, it ended. I’ve enjoyed getting back into writing more code and mentoring a lot more people.

Outside code, I’ve been a part of other endeavors:

  • Blue Bolt Limited – Initially, an events management and web development company. It is now a consultancy
  • FUNtime! – A magazine for primary school children
  • Pork stall – I run a pork stall at the Mitchellex Bazaar in Makerere University
  • Urban Legend Kampala – Co-founder and writer in that leading humor and satire website
  • GNLD – Sales and marketing  which I soon found out wasn’t my strong hat
  • Humor and Satire Columnist for The Daily Monitor

I am a Christian – one still discovering what it means to be a child of God, a husband to my best friend and a father.


Virtualbox in Secure Boot Kernel upgrade error

If you run Ubuntu (and probably many other Linux distros) and you run virtualbox/vagrant and have Secure Boot enabled, you are likely to run into the following error every time you upgrade your Kernel (which in Ubuntu’s case is very often):

username@host/vagrant/path$ sudo vagrant up
The provider 'virtualbox' that was requested to back the machine
'default' is reporting that it isn't usable on this system. The
reason is shown below:

VirtualBox is complaining that the installation is incomplete. Please
run `VBoxManage --version` to see the error message which should contain
instructions on how to fix this error.

If you use vvv for WordPress development, you’ll run into this quite often.


Here’s what you should do:

#Sign the kernel modules again. Make sure you still have your X.509 Key Pair
for f in $(dirname $(modinfo -n vboxdrv))/*.ko; do echo "Signing $f"; sudo /usr/src/linux-headers-4.4.0-<span style="color: #ff0000;"><strong>xx</strong></span>-generic/scripts/sign-file sha256 ./iamlocal_MOK.priv ./iamlocal_MOK.der $f; done

Make sure xx is the latest/highest number in the /usr/src/linux-headers-4.4.0-* series.

and then reconfigure virtualbox:

 sudo dpkg-reconfigure virtualbox-dkms
 sudo dpkg-reconfigure virtualbox
 sudo modprobe vboxdrv

If you haven’t created a X.509 Key Pair before, there’s this great tutorial on how to go about it:

UPDATE 05/04/17: I’ve added a script for this here: VirtualBox DKMS Error Fix. Add this to your PATH and all you’ll need to do going forward is run the script to resolve the issue



I’ve had the honour of serving on a number of job interview panels. I’m that last guy on the panel who doesn’t smile and grunts after every answer you give. The one who sips very loudly from his glass of water; so loud, the room asks you to repeat everything you said while he sipped. The one who comes in only to ask very difficult, “it says here that you…BUT isn’t it true that…” questions.

On the panel, we review a candidate’s credentials and ask them a number of questions about themselves. We then assess their responses to choose the best candidate for the position.The panel wants whoever has displayed certain capabilities the best and goes through the motions to determine which candidate that is.

When I see someone serving God in one capacity or the other, because of how we select our own candidates, I’m very tempted to think that these people are there because they are the best-qualified to do that thing. I might picture that they got the position by answering God’s  “Tell me about yourself…” and “So, what would you like to earn?” very well. They were probably a lot more composed than everyone else in the interview. Maybe they even had the most impressive CV.

God’s selection process is quite different though. I see that He selects the worst possible candidate for jobs.


From choosing a guy who stutters and has no leadership skills on record to go and speak to one of the strongest kings of the time and tell him to release the slaves his great empire heavily relies on (Exodus 3 in The Bible). The guy’s tending sheep and goats when God shows up. Sheep and goats. [Using our interview process, best candidate: Leader with great track record of very, very good negotiation techniques, motivational speech, good army strategies and with the ability to provide for millions in a dessert ]

To saving an entire nation, Israel, by using a prostitute to hide the equivalent of FBI agents it had sent to gather information.  (Joshua 2). That prostitute’s actually named in Jesus’s lineage.(Matthew 1) 

To choosing a guy bent on killing the early church to spread it. He’s so devoted to seeking out and killing apostles but he’s chosen to join their ranks. (Acts 9)

To selecting as king the youngest in a family – the one so weak for the job, he wasn’t even called for the interviews (1 Samuel 16)

To using fishermen as disciples – I’m trying to imagine a fisherman at that time telling me about this guy who died but actually didn’t die and he’ll change my life. Ha! (Acts 4:13)

To using a woman so promiscuous, she was shunned by the town she lived in. He used Her to preach His message to that town and save its people. Surely, there must have been some ‘Godly’ people more qualified to spread the message (John  4)

I see that He truly has a liking for the weakest candidate.

When you get called back by that company and told, “We are glad to inform you that you emerged successful in the interview and….(all fades to black as you dance)”, rejoice, you were the best. When God calls you though, *cough* you were the weakest. Rejoice in that too. You are not qualified for the job. You were the least attractive candidate BUT…

…those he called, he also justified; those he justified, he also glorified. Romans 8:30

You’ll be equipped to the point that people, who’ll mainly see the finished product, will say how awesome you are. But you for you, you know where you came from and who’s awesome. There might be times though, when how unqualified you are will show. In those times, the people who thought you were so awesome will say a lot. Go back to who’s awesome so that refinement can continue.

For you who feels God’s calling you to do something and you can only think of all the reasons you are not the right person for it, you are in good company.

…My power is perfected in weakness… 2 Corinthians 12:9

Most importantly, for you who thinks “doing God’s work” is just for that friend of yours who walks around with a Bible, well, God doesn’t.

Are you silently slaying giants?

There’s this interesting passage in the Good book:

After this, war broke out with the Philistines at Gezer. As they fought, Sibbecai from Hushah killed Saph, a descendant of the giants, and so the Philistines were subdued. During another battle with the Philistines, Elhanan son of Jair killed Lahmi, the brother of Goliath of Gath. The handle of Lahmi’s spear was as thick as a weaver’s beam! In another battle with the Philistines at Gath, they encountered a huge man with six fingers on each hand and six toes on each foot, twenty-four in all, who was also a descendant of the giants. But when he defied and taunted Israel, he was killed by Jonathan, the son of David’s brother Shimea. These Philistines were descendants of the giants of Gath, but David and his warriors killed them.1 Chronicles 20:4-8 (NLT) (Emphasis mine)

We all know the David vs Goliath story – a young shepherd goes up against a towering giant in a high stakes duel. He kills the giant using his slingshot.

Many times in life,  you aren’t the David in the story – the giant slayer we hear about. The one who’s name we all know. The one we celebrate. Sometimes, you take on your 6-finger giants and no one knows about it. You battle and you overcome but there’s no party. Giants come in many forms: Terminal illness. A disadvantaged background. Raising fees every term for that child. For yourself. Taking care of orphans. Following God’s call and starting a church in times like these.Speaking up when the taxi conductor’s being funny. Refusing to bribe. Taking on injustice. Doing the right thing.

Elnathan. Sibbecai. Jonathan. {you}. All giant slayers.


Many times, it might not seem like the fight is still worth it but by all means, keep going. We may not read about you or hear your David story but someone next to you has held their head higher because of your efforts. Someone’s life is better. Someone will make better decisions. Keep slaying those giants.  Your little infinity matters.

To little infinities


One of my favourite movie quotes is from The Fault in Our Stars, in which the terminally ill heroine says to her love who won’t live long,

“There are infinite numbers between 0 and 1. There’s .1 and .12 and .112 and an infinite collection of others. Of course, there is a bigger infinite set of numbers between 0 and 2, or between 0 and a million. Some infinities are bigger than other infinities. A writer we used to like taught us that. There are days, many of them, when I reset the size of my unbounded set. I want more numbers than I’m likely to get, and God, I want more numbers for Augustus Waters than he got. But, Gus, my love, I cannot tell you how thankful I am for our little infinity. I wouldn’t trade it for the world. You gave me a forever within the numbered days, and I’m grateful.”

I have a plan for world domination. It is a good plan. I know this because I’ve shared it with my buddies before and they all fell off their seats listening to it. The fall might have been precipitated by other things but in my version of events, my plan did that. They are the same crew that praised my plan to buy a motorbike before I knew how to ride one but I’m sure they are much wiser now.

That movie quote, for me, is a stark reminder not to get caught-up in the big infinity of trying to take over the world and miss the little one around me.  It asks me whether I’m being everything to my little infinity. Whether before wanting to be everything for everyone, I’m being everything for the one. Whether, in this tiny sphere of mine, I’m giving nothing but my best. Whether I’m present and adding value.

It asks me about how, before I want to change the country – the bigger infinity – how am I doing in my home? Before I want to speak to thousands, how am I doing with my friends? Before I want to build apps that support several million users, how am I doing with 70? It tells me, “So you have a big plan…but first take a seat. Focus on the small picture FIRST.” It tells me not to get ahead of myself.

How am I doing with my little infinity? With the relationships-friends, family? With finances? In time management?

The Good Book puts it this way:

“Whoever can be trusted with very little can also be trusted with much, and whoever is dishonest with very little will also be dishonest with much.” Luke 16:10

Maybe the quote’s asking you too, how is your little infinity doing?

[Events] Principles of collaboration and development cycles

Over the next two days, I’ll be a part of two events I’m pretty thrilled about.  Tomorrow, I’ll co-facilitate a talk on the principles of collaboration, scale and development cycles. The talk will be at the Outbox Hub from 5:30 to 08:00 PM. The main facilitator will be Bas Moussa, a good friend and the chief architect at Nuvole Computing, a cloud architecture firm in San Francisco. He’s actually said a few things here before.

We’ll go over source control, architecture, build, integration and release. If there’s time, and traffic is light and there are no cops in sight and someone’s willing to record the proceedings, we’ll also do the Museveni challenge.


Overall, we’ll go through high level concepts on preparing for scale.


On Saturday, I’ll be hosted in Lira by Emmanuel Angoda, a teacher passionate about technology. I’ll give a talk at Lira Town College to developers, mainly secondary school students, on mobile programming using channels like USSD & SMS.

I’ll share notes from the events.