Warning: Table './devblogsdb/cache_page' is marked as crashed and last (automatic?) repair failed query: SELECT data, created, headers, expire, serialized FROM cache_page WHERE cid = 'http://www.softdevblogs.com/?q=aggregator/categories/7&page=2' in /home/content/O/c/n/Ocnarfparking9/html/softdevblogs/includes/database.mysql.inc on line 135

Warning: Cannot modify header information - headers already sent by (output started at /home/content/O/c/n/Ocnarfparking9/html/softdevblogs/includes/database.mysql.inc:135) in /home/content/O/c/n/Ocnarfparking9/html/softdevblogs/includes/bootstrap.inc on line 729

Warning: Cannot modify header information - headers already sent by (output started at /home/content/O/c/n/Ocnarfparking9/html/softdevblogs/includes/database.mysql.inc:135) in /home/content/O/c/n/Ocnarfparking9/html/softdevblogs/includes/bootstrap.inc on line 730

Warning: Cannot modify header information - headers already sent by (output started at /home/content/O/c/n/Ocnarfparking9/html/softdevblogs/includes/database.mysql.inc:135) in /home/content/O/c/n/Ocnarfparking9/html/softdevblogs/includes/bootstrap.inc on line 731

Warning: Cannot modify header information - headers already sent by (output started at /home/content/O/c/n/Ocnarfparking9/html/softdevblogs/includes/database.mysql.inc:135) in /home/content/O/c/n/Ocnarfparking9/html/softdevblogs/includes/bootstrap.inc on line 732
Software Development Blogs: Programming, Software Testing, Agile, Project Management
Skip to content

Software Development Blogs: Programming, Software Testing, Agile Project Management

Methods & Tools

Subscribe to Methods & Tools
if you are not afraid to read more than one page to be a smarter software developer, software tester or project manager!

warning: Cannot modify header information - headers already sent by (output started at /home/content/O/c/n/Ocnarfparking9/html/softdevblogs/includes/database.mysql.inc:135) in /home/content/O/c/n/Ocnarfparking9/html/softdevblogs/includes/common.inc on line 153.

Judo Strategy

Xebia Blog - Thu, 01/14/2016 - 23:00

In the age of disruption incumbents with decades of history get swept away by startups at an alarming rate. What allows these fledgling companies to succeed? What is their strategy and how can you defend against such an opponent?

I found that that the similarities between Judo and Business strategy allow us to apply the Judo principles to become a Product Samurai.

There are people who learn by reading (carry on doing so), people who learn by listening and observing (see the video registration) and people who learn by experiencing (sign up here). With that out of our way, let’s get started.

Enter the dojo

The dojo is a place where Judoka’s come to practice. One of the key things that make Judo great is that it can be learned, and it can be taught. To illustrate just how powerful it is and what the three core principles are I asked my 9-year-old daughter to give a demonstration.

The three principles of Judo Strategy

Jigorō Kanō founded Judo after having studied many different styles. Upon reaching a deeper level of understanding of what works and what doesn’t he created his philosophy based on the rule of “maximum effect with minimal effort”. What contributed to this rule became part of Judo, what did not contribute was discarded.

The operation of disruptors is not much different. With no past to hang on to, startups are free to pivot and take technology, processes and tools from the best offerings and combine them to a new technique. If they do not operate on the principle of “maximum effect with minimal effort” they will die. This is a luxury that incumbents have but usually not leverage. Typically the incumbents have the capital, equipment, skills, market knowledge, channels and people, still choose not to leverage.


The first principle in Judo is movement. Before we get in close with our opponent we seek to grab him in a favorable position. Maybe we can grip a sleeve, or arm and catch the opponent off guard. As a disruptor I also seek for uncontested ground. A head on attack on the core product of an established player is usually met with great resistance, as a disruptor I cannot hope to win that battle.

Variables in the Lean Canvas

Figure: Variables in the Lean Canvas

So to seek uncontested ground, means launching under the radar. This will go against the advice of your marketing director who will tell you to make “as much noise as possible”. This will indeed attract more people, but also tell your opponent exactly what you are doing. So have your marketing align with your ability to execute. Why go multi-lingual when you can only serve local customers? Why do a nation wide campaign when you are still running a pilot in a single city? Why pinpoint the shortcomings in your competitor’s product when you cannot outpace them in development (yet)?

At some point contact is inevitable, but a good disruptor will have chosen a vantage point. By the time Dell became noticed they had a well-oiled distribution network in place and were able to scale quickly, whereas the competition still relied on brick and mortar partners. Digital media like nu.nl came out of nowhere and by the time traditional newspapers had noticed them it was not only hard to catch up, but their opponent had defined where the battle would take place: in the land of Apps, away from the strengths of traditional media. There is still a chance for incumbents, and that is to out innovate your opponent and to do so you have absorb some disruption DNA yourself.


The second principle is balance. Once we have gripped our opponent we are trying to destroy their balance whilst strengthening our own. Ironically this usually means keeping your enemies close.

Puppy ploy

Figure: Puppy ploy

Perhaps the best possible example of this is the “puppy ploy” that Apple pulled with the music industry in the early days of iTunes. By emphasizing that downloadable music was not really their business (it only represented 1 or 2%) and was highly unprofitable (due to illegal sources like Napster and Kazaa) did Apple obtain the position it still holds today, and became the dominant music platform. As history repeats itself, a small company from Finland did the same thing with streaming, rather than owning the music. If you close your eyes you can hear them pitch: “it’s only a few percent of your business, and it’s like radio, does radio effect your business?”.

A little bit closer to home, I’ve seen first hand how a major eCommerce platform brokered deals with numerous brands. Sure, there is a kickback involved, but it prevents your competitors from opening their own store. By now they have become the dominant player, and their partners have come to rely on their digital partner to run the shop for them. It’s a classical example of keeping your enemies so close, that they cannot leverage their strength.


My favourite category of throwing techniques (Nage Waza) are the Sutemi, or in English “sacrifice throws”. In these techniques you typically sacrifice your position so you can leverage the power of your opponent.

Basically it means: go after sunk cost. Observe your opponent and learn where he has invested. Virgin Air does not fly out of major airports, therewith circumventing the enormous investment that other airlines have made. Has your opponent invested in a warehouse to support building a one-day delivery service? Make delivery cost free! Is it a platform battle? Open source it and make money from running services on top of it.

Does it hurt? of course it does! This is why the first thing you learn in Judo is fall breaking (ukemi waza). The question is not if you will fall, but if you can get back up quickly enough. Now this is not a plea for polka style pivoting startup behavior. You still need a strategy and stick to your product vision, but be prepared to sacrifice in order to reach that.

I once ran a Customer Journey mapping workshop at Al Jazeera. Though we focused on Apps, the real question was: “what is the heart of the brand” How can we be a better news agency than ABC, BBC, CNN etc.? By creating better articles? by providing more in-depth news? Turned out we could send photographers where they could not. They had invested in different areas and by creating a photo driven news experience they would be hindered by sunk cost.

If you manage to take the battle to uncontested grounds and have destroyed your opponent’s balance, his strength will work against him. It took Coca Cola 15 years to respond to the larger Pepsi bottle due its investment in their iconic bottle. By the time they could and wanted to produce larger bottles, Pepsi had become the second largest brand. WhatsApp reached a 10 billion messages in 2 years; you don’t have Coca Cola’s luxury anymore.

Awesome machines that you need to let go of

Figure: Awesome machines that you need to let go of

Why did Internet only news agencies like nu.nl scored a dominant position in the mobile space? Because the incumbents were too reluctant to cannibalize their investments in dead tree technology.

Key take away 

Judo can be learned and so can these innovation practices. We have labeled the collection of these practices Continuous Innovation. Adopting these practices means adopting the DNA of a disruptor.

It’s a relentless search to find unmet market needs, operating under the radar until you find market-fit. You can apply typical Lean startup techniques like Wizard of Oz, landing pages or product bootcamp.

Following through fast means scalable architecture principles and an organization that can respond to change. As an incumbent, watch out for disruptors that destroy your balance; typically by running a nice of your business for you that will become strategic in the future.

Finally: if you are not prepared to sacrifice your current product for one that addresses the customers need better someone else will do it for you.


This blog is part of the Product Samurai series. Sign up here to stay informed of the upcoming book: The Product Manager's Guide to Continuous Innovation.

The Product Manager's guide to Continuous Innovation


Live Video Streaming At Facebook Scale

With 1.49 billion monthly active users, operating at Facebook scale is far from trivial. Facebook's new live video streaming services present a fascinating use case for designing streaming service in global distribution and massive scale.
Categories: Architecture

Mapping biases to testing, Part 1: Introduction

Xebia Blog - Wed, 01/13/2016 - 12:40

We humans are weird. We think we can produce bug free software. We think we can plan projects. We think we can say “I’ve tested everything”. But how is that possible when we are governed by biases in our thinking? We simply cannot think about everything in advance, although we like to convince ourselves that we can (confirmation bias). 

In his book “Thinking, Fast and Slow”, Daniel Kahneman explains the most common thinking biases and fallacies. I loved the book so much I’ve read it twice and I’ll tell anyone who wants to listen to read it too. For me it is the best book I ever read on testing. That’s right, a book that by itself has nothing to do with testing, taught me most about it. Before I read the book I wasn’t aware of all the biases and fallacies that are out there. Sure, I noticed that projects always finished late and wondered why people were so big on planning when it never happened that way, but I didn’t know why people kept believing in their excel sheets. In that sense, “Thinking, Fast and Slow” was a huge eye opener for me. There are lots of examples in the book that I answered incorrectly, proving that I’m just as gullible as the next person. 


But that scared me, because it is my job to ‘test all the things’, right? But if my thinking is flawed, how can I possibly claim to be a good tester? I want to try to weed out as much of my thinking fallacies as I can. This is a journey that will never end. I want to take you with me on this journey, though. The goal is as always: improve as a tester. Enjoy the learning process and explore. I feel the need to put a disclaimer here. This is not a scientific type of blog series. I will provide sources where I think they’re necessary, but the point of this series is to take you on a journey that is for the most part personal. I hope it will benefit you as well! My goal is mainly to inspire you to take a look inwards, at your own biases.

Before we continue I need to explain a few basic concepts: fast and slow thinking, heuristics, biases and fallacies. I will conclude this first post with a list of the biases and fallacies that I will cover in this series. This list can grow of course, based on the feedback I hopefully will receive.

Fast and slow thinking

This is a concept taken from Kahneman’s book. Fast thinking, called “System 1 thinking” in the book, is the thinking you do on autopilot. When you drive your car and you see something happening, you react in the blink of an eye. It’s also the thinking you do when you meet someone new. In a split second you have judged this person based on stereotypes. It just happens! It’s fast, automatic, instinctive, emotional. The system 1 thinking is the reason we are thriving today as a species (it helped us escape from dangerous situations, for example).

On the other hand, there’s “System 2 thinking”. This is the type of thinking that takes effort; it’s slow. It’s deliberate. For example, you use system 2 when you have to calculate (in your head) the answer to 234 x 33 (as opposed to 2 x 3, which you do with System 1).

There is one huge problem: we make all kinds of mistakes when it comes to using these systems. Sometimes, we use system 1 to analyse a problem, while system 2 would be more appropriate. In the context of testing: when someone comes up to you and says “is testing finished yet?”, you might be tempted to answer “no” or “yes”, while this is more a type of question that cannot be answered with a yes or no. If you want to be obnoxious you can say testing is never finished, but a more realistic conversation about this topic would be based around risk, in my opinion.

Often, when people ask a seemingly simple or short question, such as "is testing finished yet?", they mean something different entirely. In my context, if the Product Owner would ask me “is testing finished yet?”, for me it translates to: “do you think the quality of our product is good enough to be released? Did we build the thing right? Did we build the right thing? I value your advice in this matter, because I’m uncertain of it myself”. But if I happen to be in a foul mood, I have an option to just say "yes", and that would have been my system 1 answering.

Putting in the mental effort to understand that a simple question can actually be about something else, asking questions to find out what the other person truly means and crafting your answer to really help them, is hard work. Therefore, you have to spend your energy wisely.

Develop your system 1 and system 2 senses: when do you use which system? And then there’s the matter of choice. It would be silly to think you can always choose which system you use.

That brings us to heuristics.


Definition on Wikipedia: “A heuristic technique, often called simply a heuristic, is any approach to problem solving, learning, or discovery that employs a practical method not guaranteed to be optimal or perfect, but sufficient for the immediate goals.”

Heuristics are powerful, but you need to spend time reevaluating and/or adapting them once in a while, and for that you need system 2. Why do you need to reevaluate your heuristics? Because you are prone to fall for biases and fallacies.


We need to use heuristics, but they are based on system 1. When you are an experienced tester, you have a huge toolbox of heuristics that help you during testing. That’s a good thing, but it comes with a risk. You might start to trust your heuristic judgement a little too much, but you can't use a hammer for everything, right?

Bias and Fallacy, definition and meaning

A bias “is an inclination or outlook to present or hold a partial perspective, often accompanied by a refusal to consider the possible merits of alternative points of view.”

A fallacy “is the use of invalid or otherwise faulty reasoning, or "wrong moves" in the construction of an argument.”

Most of the thinking errors I will cover in this series are biases, but it is good to know the difference between fallacy and bias. A bias involves a mindset; you see something in a pre-conceived way. It influences how you experience things. Stereotyping is a common example of a bias. A fallacy, on the other hand, is an untruth. It is a statement or belief that lacks truthfulness.

There is more than one type of bias, but in this blog series I will talk about cognitive biases, for which the definition is “[...] a repeating or basic misstep in thinking, assessing, recollecting, or other cognitive processes.”

Since testing is a profession that relies heavily on cognition, mental judgement and we are only human, it’s no wonder that we make mistakes. You cannot get rid of all your biases, that would defy human nature, but in the context of testing it’s a great idea to challenge yourself: which biases and fallacies are actually hurting my testing activities?

However, you have to realise that biases can work to your advantage as well! Since it is part of our human nature to be biased, we should use that fact. With regards to testing that could mean: get more people to do testing. Every person brings his or her unique perspective (with biases) to the table and this will result in more information about the application under test.

What’s next

In this blog series I hope to shed some light on a number of biases and fallacies and what harm or good they can do in testing. I will cover the following biases, fallacies and effects:

If you have more input for biases or fallacies that you want to see covered, please leave a comment or leave me a tweet @Maaikees. In the meantime, you know which book you have to read!

Profiling zsh shell scripts

Xebia Blog - Tue, 01/12/2016 - 09:27

With today's blazingly fast hardware, our capacity to "make things slow" continues to amaze me. For example, on my system, there is a noticeable delay between the moment a terminal window is opened, and the moment the command prompt actually shows up.

This post explores how we can quickly quantify the problem and and pinpoint the main causes of the delay.

Quantifying the problem

Let's first see where the problem might be. A likely candidate is of course my ~/.zshrc, so I added 2 log statements: one at the top, one at the bottom:

date "+%s.%N"

This indeed showed my ~/.zshrc took about 300ms, enough to cause a noticeable delay.

Quick insight: zprof

Selection_054The quickest way to get an idea of the culprit is the zprof module that comes with zsh. You simply add zmodload zsh/zprof to the top of your ~/.zshrc, and the zprof built-in command will show a gprof-like summary of the profiling data.

A notable difference between gprof and zprof is that where gprof measures CPU time, where zprof measures wall clock time.

This is fortunate: CPU time is the time a program was actually consuming CPU cycles, and excludes any time the program was for example waiting for I/O. It would be fairly useless to profile zsh in this way, because it probably spends most of its time waiting for invoked commands to return.

zprof provides a fairly rich output, including information about the call hierarchy between functions. Unfortunately, it measures performance per function, so if those are long you're still left wondering which line took so long.

Digging deeper: xtrace

An approach to profiling zsh scripts that will give per-line metrics is using xtrace. Using xtrace, each command that zsh executes is also printed to file descriptor 3 using a special prompt which can be customized with the PS4 environment variable to include things like the current timestamp.

We can collect these detailed statistics by adding to the top of our ~/.zshrc:

exec 3>&2 2>/tmp/zshstart.$$.log
setopt xtrace prompt_subst

And to the bottom:

unsetopt xtrace
exec 2>&3 3>&-

There are 2 problems with this detailed trace:

  • This approach will provide confusing output when there is any parallelism going on: trace messages from different threads of execution will simply get interleaved
  • It is an overwhelming amount of data that is hard to digest

When you're dealing with parallelism, perhaps you can first use zprof and then only xtrace the function you know is a bottleneck.

When you're overwhelmed by the amount of data, read on...

Visualizing: kcachegrind

If we assume there's no parallelism going on, we can visualize our zsh script profile using kcachegrind. This tool is intended to visualize the call graphs produced by valgrind's callgrind tool, but since the file format used is fairly simple we can write a small tool to convert our xtrace output.



zprof is the easiest and most reliable way to profile a zsh script.

Some custom glue combined several existing tools (zsh's xtrace and kcachegrind) to achieve in-depth insight.

Applying this to shell startup time is of course a rather silly exercise - though I'm quite happy with the result: I went from ~300ms to ~70ms (now mostly spent on autocomplete features, which are worth it).

The main lesson: combining tools that were not originally intended to be used together can produce powerful results.


A Beginner's Guide to Scaling to 11 Million+ Users on Amazon's AWS

How do you scale a system from one user to more than 11 million users? Joel Williams, Amazon Web Services Solutions Architect, gives an excellent talk on just that subject: AWS re:Invent 2015 Scaling Up to Your First 10 Million Users.

If you are an advanced AWS user this talk is not for you, but it’s a great way to get started if you are new to AWS, new to the cloud, or if you haven’t kept up with with constant stream of new features Amazon keeps pumping out.

As you might expect since this is a talk by Amazon that Amazon services are always front and center as the solution to any problem. Their platform play is impressive and instructive. It's obvious by how the pieces all fit together Amazon has done a great job of mapping out what users need and then making sure they have a product in that space. 

Some of the interesting takeaways:

  • Start with SQL and only move to NoSQL when necessary.
  • A consistent theme is take components and separate them out. This allows those components to scale and fail independently. It applies to breaking up tiers and creating microservices.
  • Only invest in tasks that differentiate you as a business, don't reinvent the wheel.
  • Scalability and redundancy are not two separate concepts, you can often do both at the same time.
  • There's no mention of costs. That would be a good addition to the talk as that is one of the major criticisms of AWS solutions.
The Basics
Categories: Architecture

How To Stay Motivated for 2016 with a Vision Board

"Big thinking precedes great achievement." -- Wilferd Peterson

The way to stay motivated for 2016 is to begin with your end in mind.

Keep in mind that your end in mind is dynamic, and it will change as you change, but it's still a great place to start.

A simple way to visualize your end in mind is to create a Vision Board.  Here is an example of my Vision Board for 2016:

Vision Board for 2016

Here is the process I used to create an empowering Vision Board:

How To Create an Empowering Vision Board

The main idea of a Vision Board is to capture your big ideas in terms of your hopes, dreams, future habits, and your ideal life.  It’s a collage of images that reflect what you want your ideal future state to be.

Prime Your Mind for 2016 with a  Vision Board

The power of a Vision Board is really to prime your mind for success.   When you know what you want, you activate your Reticular Activating System (RAS).  Your RAS helps you notice things around you that are relevant (such as when you get a new blue car, suddenly you notice how many people have a blue car.)  When you know what you want, you also get more resourceful.  But more importantly, when you know what you want, other people can help you because you are clear on what you want to achieve.

It’s really hard to help somebody get what they want when they don’t know what it is.

When you have clarity in what you want, you create focus.  When you focus, you prioritize.  When you prioritize, it helps you stay motivated, but your future picture helps you inspire yourself from the inside out.

I think we all tend to walk around with some little pictures of our future self, maybe as a fuzzy idea, or maybe little scenes from the future, or maybe more like a daydream.   But you can bring that future into focus by creating a simple collage of inspiring images that paint a picture of the future that you want to make happen.

Create a Vision “Page”

While I set out to create a Vision Board, I actually ended up creating what I’ll call a Vision Page.  I figured that a page on the Web would be available to me whenever or wherever I needed it.

After reviewing a few options, I ended up creating my Vision Board for 2016 using Pinterest.

It was simple and straightforward.  All I had to do was create a new board and then add Pins to my board that reflect my dreams, goals, habits, and aspirations.  It was actually a fun process trying to find the right image to capture the right idea.

Draw from People, Books, Quotes, and Affirmations

To create my Vision Page, I looked for inspiring people, as well as inspiring books, quotes, and affirmations.   On the people side, I thought of people that reflect some of the attributes I’d like to have more of.  For example, imagine if I could solve problems like Tony Robbins or be creative like da Vinci or think better like Edward de Bono.

For books, I thought about how some books encapsulate really important ideas.  For example, In Eat to Win, Dr. Furhman focuses on eating the nutritarian way.   In all of his research and in medical outcome studies, Dr. Furhman found that nutritional density and focusing on nutritional excellence is the key to vibrant and radiant health.  In How To Have a Beautiful Mind, Edward de Bono focuses on creating curiosity, insight, and making things interesting through the power of perspective and by asking better questions.

For quotes, I have several quote collections you can draw from in the Great Quotes Collection, including Confidence Quotes, Happiness Quotes, Inspirational Quotes, Motivational Quotes, Personal Development Quotes,  and Productivity Quotes.

For affirmations, I had to rethink my limiting beliefs about affirmations.  For me, affirmations were always foo-foo, and I hated the examples that I found.  In my experience, all the affirmations I saw long ago use words I would never say in a way that I would never say them.  They seemed inauthentic.  Worse, the people that I knew that used affirmations weren’t every effective.  It seemed like they were reading spells from a magic book and didn’t even really believe what they were saying. 

It was more like saying some magic word phrases and hoping they would suddenly become awesome.

But then I thought about affirmations differently.  I realized that they can be a great way to intentionally change your thoughts, especially if you have thought patterns that don’t work for you.  Affirmations, just like quotes, can be simple little mantra for the mind.   But the key is that you have to find affirmations that work for you, and you have to word them in a way that’s simple, sticky, and meaningful for you.

I share some sample affirmations in How To Create an Empowering Vision Board but here are a couple of examples.  I can replace, “This sucks” with "I see my challenges as opportunities to learn and grow."  I can remind myself “I let go of worries that drain my energy.”  My personal favorite is a remind of self-reliance: "If it’s meant to be, it’s up to me."

Choose and create affirmations that remind and inspire you as you answer the question “Who do you want to be and what experiences do you want to create?”

Build Your Vision Board with Skill

If you want to stay motivated for 2016, then create your own Vision Board or Vision Page.  You can get started in just a few minutes, and if you really embrace it, your Vision Board can serve you throughout the year.  It will act as a reminder of what you want, but it can also help you get clarity and insight into the attributes and characteristics that you want to develop as part of your personal growth.

Your motivation will be a direct reflection of your ability to find the most inspiring images that pull your forward.

Don’t over-engineer it.  Keep it simple and make it easy to update.   For me, I just quickly found pages I could “Pin” and then I added a one-liner reminder of the key idea.  For example, I found an image of a Navy Seals team working out, and I added the note “Fit like a Navy Seal.”

Also, remember that it’s your future, ideal life.  Don’t let limiting beliefs or small thinking get in your way.  Dream big and make it a collage of the people, quotes, habits, goals, and ideas that inspire you.

Lastly, remember that motivation follows action.  So take some action and your motivation will follow.  The best way to take action is to just start.  If you get going with your Vision Board, chances are you’ll surprise yourself with some fresh thinking and some big bold ideas, and these will carry you forward for 2016.

And, if not, remember the famous saying by Mary Anne Radmacher:

“Courage doesn’t always roar. Sometimes courage is the little voice at the end of the day that says I’ll try again tomorrow.”


Categories: Architecture, Programming

Uptime Funk - Best Sysadmin Parody Video Ever!

This is so good! Perfect for your Monday morning jam.


Uptime Funk is a music video (parody of Uptown Funk) from SUSECon 2015 in Amsterdam. My favorite:  I'm all green (hot patch)
Called a Penguin and Chameleon
I'm all green (hot patch)
Call Torvalds and Kroah-Hartman
It’s too hot (hot patch)
Yo, say my name you know who I am
It’s too hot (hot patch)
I ain't no simple code monkey
Nuthin's down
Categories: Architecture

Running headless Selenium WebDriver tests in Docker containers

Agile Testing - Grig Gheorghiu - Sat, 01/09/2016 - 00:24
In my previous post, I showed how to install firefox in headless mode on an Ubuntu box and how to use Xvfb to allow Selenium WebDriver scripts to run against firefox in headless mode.

Here I want to show how run each Selenium test suite in a Docker container, so that the suite gets access to its own firefox browser. This makes it easy to parallelize the test runs, and thus allows you to load test your Web infrastructure with real-life test cases.

Install docker-engine on Ubuntu 14.04

We import the dockerproject.org signing key and apt repo into our apt repositories, then we install the linux-image-extra and docker-engine packages.

# apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
# echo “deb https://apt.dockerproject.org/repo ubuntu-trusty main” > /etc/apt/sources.list.d/docker.list
# apt-get update
# apt-get install linux-image-extra-$(uname -r)
# apt-get install docker-engine

Start the docker service and verify that it is operational

Installing docker-engine actually starts up docker as well, but to start the service you do:

# service docker start

To verify that the docker service is operational, run a container based on the public “hello-world” Docker image:

# docker run hello-world
Unable to find image ‘hello-world:latest’ locally
latest: Pulling from library/hello-world
b901d36b6f2f: Pull complete
0a6ba66e537a: Pull complete
Digest: sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7
Status: Downloaded newer image for hello-world:latest
Hello from Docker.This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the “hello-world” image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker Hub account:
For more examples and ideas, visit:

Pull the ubuntu:trusty public Docker image
# docker pull ubuntu:trusty
trusty: Pulling from library/ubuntu
fcee8bcfe180: Pull complete
4cdc0cbc1936: Pull complete
d9e545b90db8: Pull complete
c4bea91afef3: Pull complete
Digest: sha256:3a7f4c0573b303f7a36b20ead6190bd81cabf323fc62c77d52fb8fa3e9f7edfe
Status: Downloaded newer image for ubuntu:trusty

# docker images
ubuntu trusty c4bea91afef3 3 days ago 187.9 MB
hello-world latest 0a6ba66e537a 12 weeks ago 960 B

Build custom Docker image for headless Selenium WebDriver testing
I created a directory called selwd on my host Ubuntu 14.04 box, and in that directory I created this Dockerfile:

FROM ubuntu:trusty
RUN echo “deb http://ppa.launchpad.net/mozillateam/firefox-next/ubuntu trusty main” > /etc/apt/sources.list.d//mozillateam-firefox-next-trusty.list RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CE49EC21 RUN apt-get update RUN apt-get install -y firefox xvfb python-pip RUN pip install selenium RUN mkdir -p /root/selenium_wd_tests ADD sel_wd_new_user.py /root/selenium_wd_tests ADD xvfb.init /etc/init.d/xvfb RUN chmod +x /etc/init.d/xvfb RUN update-rc.d xvfb defaults
CMD (service xvfb start; export DISPLAY=:10; python /root/selenium_wd_tests/sel_wd_new_user.py)

This Dockerfile tells docker, via the FROM instruction, to create an image based on the ubuntu:trusty image that we pulled before (if we hadn’t pulled it, it would be pulled the first time our image was built).The various RUN instructions specify commands to be run at build time. The above instructions add the Firefox Beta repository and key to the apt repositories inside the image, then install firefox, xvfb and python-pip. Then they install the selenium Python package via pip and create a directory structure for the Selenium tests.

The ADD instructions copy local files to the image. In my case, I copy one Selenium WebDriver Python script, and an init.d-type file for starting Xvfb as a service (by default it starts in the foreground, which is not something I want inside a Docker container).

The last two RUN instructions make the /etc/init.d/xvfb script executable and run update-rc.d to install it as a service. The xvfb script is the usual init.d wrapper around a command, in my case this command:

PROG=”/usr/bin/Xvfb” PROG_OPTIONS=”:10 -ac”

Here is a gist for the xvfb.init script for reference.

Finally, the CMD instruction specifies what gets executed when a container based on this image starts up (assuming no other commands are given in the ‘docker run’ command-line for this container). The CMD instruction in the Dockerfile above starts up the xvfb service (which connects to DISPLAY 10 as specified in the xvfb init script), sets the DISPLAY environment variable to 10, then runs the Selenium WebDriver script sel_wd_new_user.py, which will launch firefox in headless mode and execute its commands against it.

Here’s the official documentation for Dockerfile instructions.To build a Docker image based on this Dockerfile, run:

# docker build -t selwd:v1 .

selwd is the name of the image and v1 is a tag associated with this name. The dot . tells docker to look for a Dockerfile in the current directory.

The build process will take a while intially because it will install all the dependencies necessary for the packages we are installing with apt. Every time you make a modification to the Dockerfile, you need to run ‘docker build’ again, but subsequent runs will be much faster.

Run Docker containers based on the custom image
At this point, we are ready to run Docker containers based on the selwd image we created above.

Here’s how to run a single container:

# docker run --rm selwd:v1
In this format, the command specified in the CMD instruction inside the Dockerfile will get executed, then the container will stop. This is exactly what we need: we run our Selenium WebDriver tests against headless firefox, inside their own container isolated from any other container.

The output of the ‘docker run’ command above is:

Starting : X Virtual Frame Buffer . — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —Ran 1 test in 40.441sOK
(or a traceback if the Selenium test encountered an error)

Note that we also specified the rm flag to ‘docker run’ so that the container gets removed once it stops — otherwise these short-lived containers will be kept around and will pile up, as you can see for yourself if you run:

# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6c9673e59585 selwd:v1 “/bin/bash” 5 minutes ago Exited (130) 5 seconds ago modest_mccarthy 980651e1b167 selwd:v1 “/bin/sh -c ‘(service” 9 minutes ago Exited (0) 8 minutes ago stupefied_turing 4a9b2f4c8c28 selwd:v1 “/bin/sh -c ‘(service” 13 minutes ago Exited (0) 12 minutes ago nostalgic_ride 9f1fa953c83b selwd:v1 “/bin/sh -c ‘(service” 13 minutes ago Exited (0) 12 minutes ago admiring_ride c15b180832f6 selwd:v1 “/bin/sh -c ‘(service” 13 minutes ago Exited (0) 12 minutes ago jovial_booth .....etc

If you do have large numbers of containers that you want to remove in one go, use this command:

# docker rm `docker ps -aq`For troubleshooting purposes, we can run a container in interactive mode (with the -i and -t flags) and specify a shell command to be executed on startup, which will override the CMD instruction in the Dockerfile:

# docker run -it selwd:v1 /bin/bash root@6c9673e59585:/#
At the bash prompt, you can run the shell commands specified by the Dockerfile CMD instruction in order to see interactively what is going on. The official ‘docker run’ documentation has lots of details.

One other thing I found useful for troubleshooting Selenium WebDriver scripts running against headless firefox was to have the scripts take screenshots during their execution with the save_screenshot command:

# Click Place Order driver.find_element_by_xpath("//*[@id='order_submit_button']").click()

I then inspected the PNG files to see what was going on.

Running multiple Docker containers for load testing

Because our Selenium WebDriver tests run isolated in their own Docker container, it enables us to run N containers in parallel to do a poor man’s load testing of our site.We’ll use the -d option to ‘docker run’ to run each container in ‘detached’ mode. Here is a bash script that launches COUNT Docker containers, where COUNT is the 1st command line argument, or 2 by default:

COUNT=$1 if [ -z “$COUNT” ]; then  COUNT=2 fi
for i in `seq 1 $COUNT`; do  docker run -d selwd:v1 done

The output of the script consists in a list of container IDs, one for each container that was launched.

Note that if you launch a container in detached mode with -d, you can’t specify the rm flag to have the container removed automatically when it stops. You will need to periodically clean up your containers with the command I referenced above (docker rm `docker ps -aq`).

To inspect the output of the Selenium scripts in the containers that were launched, first get the container IDs:
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6fb931689c03 selwd:v1 “/bin/sh -c ‘(service” About an hour ago Exited (0) About an hour ago grave_northcutt 1b82ef59ad46 selwd:v1 “/bin/sh -c ‘(service” About an hour ago Exited (0) About an hour ago admiring_fermat

Then run ‘docker logs <container_id>’ to see the output for a specific container:
# docker logs 6fb931689c03 . — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — Ran 1 test in 68.436s
OK Starting : X Virtual Frame Buffer
Have fun load testing your site!

Stuff The Internet Says On Scalability For January 8th, 2016

Hey, it's HighScalability time:

Finally, a clear diagram of Amazon's industry impact. (MARK A. GARLICK)


If you like this Stuff then please consider supporting me on Patreon.
  • 150: # of globular clusters in the Milky Way; 800 million: Facebook Messenger users; 180,000: high-res images of the past; 1 exaflops: 1 million trillion floating-point operations per second; 10%: of Google's traffic is now IPv6; 100 milliseconds: time it takes to remember; 35: percent of all US Internet traffic used by Netflix; 125 million: hours of content delivered each day by Netflix's CDN;

  • Quotable Quotes:
    • Erik DeBenedictis: We could build an exascale computer today, but we might need a nuclear reactor to power it
    • wstrange: What I really wish the cloud providers would do is reduce network egress costs. They seem insanely expensive when compared to dedicated servers.
    • rachellaw: What's fascinating is the bot-bandwagon is mirroring the early app market. With apps, you downloaded things to do things. With bots, you integrate them into things, so they'll do it for you. 
    • erichocean: The situation we're in today with RAM is pretty much the identical situation with the disks of yore.
    • @bernardgolden: @Netflix will spend 2X what HBO does on programming in 2016? That's an amazing stat. 
    • @saschasegan: Huawei's new LTE modem has 18 LTE bands. Qualcomm's dominance of LTE is really ending this year.
    • Unruly Places: The rise of placelessness, on top of the sense that the whole planet is now minutely known and surveilled, has given this dissatisfaction a radical edge, creating an appetite to find places that are off the map and that are somehow secret, or at least have the power to surprise us.
    • @mjpt777: Queues are everywhere. Recognise them, make them first class, model and monitor them for telemetry.
    • Guido de Croon:  the robot exploits the impending instability of its control system to perceive distances. This could be used to determine when to switch off its propellers during landing, for instance.
    • @gaberivera: In the future, all major policy questions will be settled by Twitter debates between venture capitalists
    • Craig McLuckie: It’s not obvious until you start to actually try to run massive numbers of services that you experience an incredible productivity that containers bring
    • Brian Kirsch: One of the biggest things when you look at the benefits of container-based virtualization is its ability to squeeze more and more things onto a single piece of hardware for cost savings. While that is good for budgets, it is excessively horrible when things go bad.
    • @RichardWarburto: It still surprises me that configuration is most popular user of strong consistency models atm. Is config more important than data
    • @jamesurquhart: Five years ago I predicted CFO would stop complaining about up front cost, and start asking to reduce monthly bill. Seeing that happen now.
    • @martinkl: Communities in a nutshell… • Databases research: “In fsync we trust” • Distributed systems research: “In majority vote we trust”
    • @BoingBoing: Tax havens hold $7.6 trillion; 8% of world's total wealth
    • @DrQz: Amazon's actual profits are still tiny, relying heavily on its AWS cloud business.
    • hadagribble: we need to view fast storage as something other than disk behind a block interface and slow memory, especially with all the different flavours of fast persistent storage that seem to be on the horizon. For the one's that attach to the memory bus, the PMFS-style [1] approach of treating them like a file-system for discoverability and then mmaping to allow them to be accessed as memory is pretty attractive.

  • EC2 with a 5% price reduction on certain things in certain places. Not exactly the race to the bottom one would hope for in a commodity market, which means the cloud is not a commodity. Happy New Year – EC2 Price Reduction (C4, M4, and R3 Instances).

  • Since the locus of the Internet is centering on a command line interface in the form of messaging, chatbot integrations may be giving APIs a second life, assuming they are let inside the walled garden. The next big thing in computing is called 'ChatOps,' and it's already happening inside Slack. The advantage chatops has over the old Web + API mashup dream is that messaging platforms come built-in with a business model/app store, large amd growing user base, and network effects. Facebook’s Secret Chat SDK Lets Developers Build Messenger Bots. Slack apps. WeChat API. Telegram API. Alexa API. Google's Voice Actions. How about Siri or iMessage? Nope. njovin likes it: I've worked with the new Chat SDK and our customers' use cases aren't geared toward forcing (or even encouraging) users into using Facebook Messenger. Most of them are just trying to meet demand from their customers. In our particular case, we have customers with a lot of international travelers who have access to data while abroad but not necessarily SMS. IMO it's a lot better than having a dedicated app you have to download to interact with a specific brand.

  • The world watched a lot of porn this year. If you like analytics you'll love Pornhub’s 2015 Year in Review: In 2015 alone, we streamed 75GB of data a second; bandwidth used is 1,892 petabytes; 4,392,486,580 hours of video were watched; 21.2 billion visits.

  • A very interesting way to frame the issue. On the dangers of a blockchain monoculture: The Bitcoin blockchain: the world’s worst database. Would you use a database with these features? Uses approximately the same amount of electricity as could power an average American household for a day per transaction. Supports 3 transactions / second across a global network with millions of CPUs/purpose-built ASICs. Takes over 10 minutes to “commit” a transaction. Doesn’t acknowledge accepted writes: requires you read your writes, but at any given time you may be on a blockchain fork, meaning your write might not actually make it into the “winning” fork of the blockchain (and no, just making it into the mempool doesn’t count). In other words: “blockchain technology” cannot by definition tell you if a given write is ever accepted/committed except by reading it out of the blockchain itself (and even then). Can only be used as a transaction ledger denominated in a single currency, or to store/timestamp a maximum of 80 bytes per transaction. But it’s decentralized!

Don't miss all that the Internet has to say on Scalability, click below and become eventually consistent with all scalability knowledge (which means this post has many more items to read so please keep on reading)...

Categories: Architecture

Running Selenium WebDriver tests using Firefox headless mode on Ubuntu

Agile Testing - Grig Gheorghiu - Thu, 01/07/2016 - 23:58
Selenium IDE is a very good tool for recording and troubleshooting Selenium tests, but you are limited to clicking around in a GUI. For a better testing workflow, including load testing, you need to use Selenium WebDriver, which can programatically drive a browser and run Selenium test cases.

In its default mode, WebDriver will launch a browser and run the test scripts in the browser, then exit. If you like to work exclusively from the command line, then you need to look into running the browser in headless mode. Fortunately, this is easy to do with Firefox on Ubuntu. Here’s what you need to do:

Install the official Firefox Beta PPA:
$ sudo apt-add-repository ppa:mozillateam/firefox-next

(this will add the file /etc/apt/sources.list.d/mozillateam-firefox-next-trusty.list and also fetch the PPA’s key, which enables your Ubuntu system to verify that the packages in the PPA have not been interfered with since they were built)

Run apt-get update:
$ sudo apt-get update

Install firefox and xvfb (the X windows virtual framebuffer) packages:
$ sudo apt-get install firefox xvfb

Run Xvfb in the background and specify a display number (10 in my example):
$ Xvfb :10 -ac &

Set the DISPLAY variable to the number you chose:
$ export DISPLAY=:10

Test that you can run firefox in the foreground with no errors:
$ firefox
(kill it with Ctrl-C)

Now run your regular Selenium WebDriver scripts (no modifications required if they already use Firefox as their browser).

Here is an example of a script I have written in Python, which clicks on a category link in an e-commerce store, adds an item to the cart, that starts filling out the user’s information in the cart:
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re, random
class SelWebdriverNewUser(unittest.TestCase):
  def setUp(self):
    self.driver = webdriver.Firefox()
    self.base_url = “http://myhost.mycompany.com/"
    self.verificationErrors = []
    self.accept_next_alert = True
    def test_sel_webdriver_new_user(self):
    driver = self.driver
    HOST = “myhost.mycompany.com”
    RANDINT = random.random()*10000
    driver.get(“https://” + HOST)

    # Click on category link
    # Click on sub-category link
    # Click on product image
    # Click Checkout button
driver.find_element_by_id(“billing:firstname”).send_keys(“selenium”, RANDINT, “_fname”)
driver.find_element_by_id(“billing:lastname”).send_keys(“selenium”, RANDINT, “_lname”)
    # Click Place Order
  def is_element_present(self, how, what):
    try: self.driver.find_element(by=how, value=what)
    except NoSuchElementException as e: return False
    return True
  def is_alert_present(self):
    try: self.driver.switch_to_alert()
    except NoAlertPresentException as e: return False
    return True
  def close_alert_and_get_its_text(self):
      alert = self.driver.switch_to_alert()
      alert_text = alert.text
      if self.accept_next_alert:
      return alert_text
    finally: self.accept_next_alert = True
def tearDown(self):
    self.assertEqual([], self.verificationErrors)
if __name__ == “__main__”:

To run this script, you first need to install the selenium Python package:$ sudo pip install selenium

Then run the script (called selenium_webdriver_new_user.py in my case):$ python selenium_webdriver_new_user.py

After hopefully not so long of a wait, you should see a successful test run:$ python selenium_webdriver_new_user.py
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Ran 1 test in 29.317s

A few notes regarding Selenium WebDriver scripts.

I was stumped for a while when I was trying to use the “find_element_by_id” form of finding an HTML element on a Web page. It was working fine in Selenium IDE, but Selenium WebDriver couldn’t find that element. I had to resort to finding all elements via their XPath id using “find_element_by_xpath”. Fortunately, Chrome for example makes it easy to right click an element on a page, choose Inspect, then righ click the HTML code for the element and choose Copy->Copy XPath to get their id which can then be pasted in the Selenium WebDriver script.

I also had to use time.sleep(N) (where N is in seconds at least for Python) to wait for certain elements of the page to load asynchronously. I know it’s not best practices, but it works.

Let's Donate Our Organs and Unused Cloud Cycles to Science

There’s a long history of donating spare compute cycles for worthy causes. Most of those efforts were started in the Desktop Age. Now, in the Cloud Age, how can we donate spare compute capacity? How about through a private spot market?

There are cycles to spare. Public Cloud Usage trends:

  • Instances are underutilized with average utilization rates between 8-9%

  • 24% of instance reservations are unused

Maybe all that CapEx sunk into Reserved Instances can be put to some use? Maybe over provisioned instances could be added to the resource pool as well? That’s a lot of power Captain. How could it be put to good use?

There is a need to crunch data. For science. Here’s a great example as described in This is how you count all the trees on Earth. The idea is simple: from satellite pictures count the number of trees. It’s an embarrassingly parallel problem, perfect for the cloud. NASA had a problem. Their cloud is embarrassingly tiny. 400 hypervisors shared amongst many projects. Analysing all the data would would take 10 months. An unthinkable amount of time in this Real-time Age. So they used the spot market on AWS.

The upshot? The test run cost a measly $80, which means that NASA can process data collected for an entire UTM zone for just $250. The cost for all 11 UTM zones in sub-Sarahan Africa and the use of all four satellites comes in at just $11,000.

“We have turned what was a $200,000 job into a $10,000 job and we went from 100 days to 10 days [to complete],” said Hoot. “That is something scientists can build easily into their budget proposals.”

That last quote, That is something scientists can build easily into their budget proposals, stuck in my craw.

Imagine how much science could get done if you didn’t have the budget proposal process slowing down the future? Especially when we know there are so many free cycles available that are already attached to well supported data processing pipelines. How could those cycles be freed up to serve a higher purpose?

Netflix shows the way with their internal spot market. Netflix has so many cloud resources at their disposal, a pool of 12,000 unused reserved instances at peak times, that they created their own internal spot market to drive better utilization. The whole beautiful setup is described Creating Your Own EC2 Spot Market, Creating Your Own EC2 Spot Market -- Part 2, and in High Quality Video Encoding at Scale.

The win: By leveraging the internal spot market Netflix measured the equivalent of a 210% increase in encoding capacity.

Netflix has a long and glorious history of sharing and open sourcing their tools. It seems likely when they perfect their spot market infrastructure it could be made generally available.

Perhaps the Netflix spot market could be extended so unused resources across the Clouds could advertise themselves for automatic integration into a spot market usable by scientists to crunch data and solve important world problems.

Perhaps donated cycles could even be charitable contributions that could help offset the cost of the resource? My wife is a tax accountant and she says this is actually true, under the right circumstances.

This kind of idea has a long history with me. When AWS first started, I like a lot of people wondered, how can I make money off this gold rush? That’s before we knew Amazon was going to make most of the tools to sell to the miners themselves. The idea of exploiting underutilized resources fascinated me for some reason. That is, after all, what VMs do for physical hardware, exploit the underutilized resources of powerful machines. And it is in some ways the idea behind our modern economy. Yet even today software architectures aren’t such that we reach anything close to full utilization of our hardware resources. What I wanted to do was create a memcached system that allowed developers to sell their unused memory capacity (and later CPU, network, storage) to other developers as cheap dynamic pools of memcached storage. Get your cache dirt cheap and developers could make some money back on underused resources. A very similar idea to the spot market notion. But without homomorphic encryption the security issues were daunting, even assuming Amazon would allow it. With the advent of the Container Age sharing a VM is now way more secure and Amazon shouldn’t have a problem with the idea if it’s for science. I hope.

Categories: Architecture

Sponsored Post: Netflix, StatusPage.io, Redis Labs, Jut.io, SignalFx, InMemory.Net, VividCortex, MemSQL, Scalyr, AiScaler, AppDynamics, ManageEngine, Site24x7

Who's Hiring?
  • Manager - Site Reliability Engineering: Lead and grow the the front door SRE team in charge of keeping Netflix up and running. You are an expert of operational best practices and can work with stakeholders to positively move the needle on availability. Find details on the position here: https://jobs.netflix.com/jobs/398

  • Senior Service Reliability Engineer (SRE): Drive improvements to help reduce both time-to-detect and time-to-resolve while concurrently improving availability through service team engagement.  Ability to analyze and triage production issues on a web-scale system a plus. Find details on the position here: https://jobs.netflix.com/jobs/434

  • Manager - Performance Engineering: Lead the world-class performance team in charge of both optimizing the Netflix cloud stack and developing the performance observability capabilities which 3rd party vendors fail to provide.  Expert on both systems and web-scale application stack performance optimization. Find details on the position here https://jobs.netflix.com/jobs/860482

  • Senior Devops Engineer - StatusPage.io is looking for a senior devops engineer to help us in making the internet more transparent around downtime. Your mission: help us create a fast, scalable infrastructure that can be deployed to quickly and reliably.

  • UI EngineerAppDynamics, founded in 2008 and lead by proven innovators, is looking for a passionate UI Engineer to design, architect, and develop our their user interface using the latest web and mobile technologies. Make the impossible possible and the hard easy. Apply here.

  • Software Engineer - Infrastructure & Big DataAppDynamics, leader in next generation solutions for managing modern, distributed, and extremely complex applications residing in both the cloud and the data center, is looking for a Software Engineers (All-Levels) to design and develop scalable software written in Java and MySQL for backend component of software that manages application architectures. Apply here.
Fun and Informative Events
  • Your event could be here. How cool is that?
Cool Products and Services
  • Turn chaotic logs and metrics into actionable data. Scalyr is a tool your entire team will love. Get visibility into your production issues without juggling multiple tools and tabs. Loved and used by teams at Codecademy, ReturnPath, and InsideSales. Learn more today or see why Scalyr is a great alternative to Splunk.

  • Real-time correlation across your logs, metrics and events.  Jut.io just released its operations data hub into beta and we are already streaming in billions of log, metric and event data points each day. Using our streaming analytics platform, you can get real-time monitoring of your application performance, deep troubleshooting, and even product analytics. We allow you to easily aggregate logs and metrics by micro-service, calculate percentiles and moving window averages, forecast anomalies, and create interactive views for your whole organization. Try it for free, at any scale.

  • Turn chaotic logs and metrics into actionable data. Scalyr replaces all your tools for monitoring and analyzing logs and system metrics. Imagine being able to pinpoint and resolve operations issues without juggling multiple tools and tabs. Get visibility into your production systems: log aggregation, server metrics, monitoring, intelligent alerting, dashboards, and more. Trusted by companies like Codecademy and InsideSales. Learn more and get started with an easy 2-minute setup. Or see how Scalyr is different if you're looking for a Splunk alternative or Sumo Logic alternative.

  • SignalFx: just launched an advanced monitoring platform for modern applications that's already processing 10s of billions of data points per day. SignalFx lets you create custom analytics pipelines on metrics data collected from thousands or more sources to create meaningful aggregations--such as percentiles, moving averages and growth rates--within seconds of receiving data. Start a free 30-day trial!

  • InMemory.Net provides a Dot Net native in memory database for analysing large amounts of data. It runs natively on .Net, and provides a native .Net, COM & ODBC apis for integration. It also has an easy to use language for importing data, and supports standard SQL for querying data. http://InMemory.Net

  • VividCortex goes beyond monitoring and measures the system's work on your servers, providing unparalleled insight and query-level analysis. This unique approach ultimately enables your team to work more effectively, ship more often, and delight more customers.

  • MemSQL provides a distributed in-memory database for high value data. It's designed to handle extreme data ingest and store the data for real-time, streaming and historical analysis using SQL. MemSQL also cost effectively supports both application and ad-hoc queries concurrently across all data. Start a free 30 day trial here: http://www.memsql.com/

  • aiScaler, aiProtect, aiMobile Application Delivery Controller with integrated Dynamic Site Acceleration, Denial of Service Protection and Mobile Content Management. Also available on Amazon Web Services. Free instant trial, 2 hours of FREE deployment support, no sign-up required. http://aiscaler.com

  • ManageEngine Applications Manager : Monitor physical, virtual and Cloud Applications.

  • www.site24x7.com : Monitor End User Experience from a global monitoring network.

If any of these items interest you there's a full description of each sponsor below. Please click to read more...

Categories: Architecture

Server-Side Architecture. Front-End Servers and Client-Side Random Load Balancing

Chapter by chapter Sergey Ignatchenko is putting together a wonderful book on the Development and Deployment of Massively Multiplayer Games, though it has much broader applicability than games. Here's a recent chapter from his book.

Enter Front-End Servers

[Enter Juliet]
Thou art as sweet as the sum of the sum of Romeo and his horse and his black cat! Speak thy mind!
[Exit Juliet]

— a sample program in Shakespeare Programming Language



Front-End Servers as an Offensive Line


Our Classical Deployment Architecture (especially if you do use FSMs) is not bad, and it will work, but there is still quite a bit of room for improvement for most of the games out there. More specifically, we can add another row of servers in front of the Game Servers, as shown on Fig VI.8:

Categories: Architecture

Agile Hong Kong Meetup - 15th Jan 2016

Coding the Architecture - Simon Brown - Sun, 01/03/2016 - 11:43

Happy new year and I wish you all the best for 2016. My first trip of the year starts next week and I'll be doing some work in Shenzhen, China. As a result, I'll also be in Hong Kong on January 15th, presenting "The Art of Visualising Software Architecture" at a meetup organised by Agile Hong Kong. You can register on the Meetup page. See you there!

p.s. If anybody would like a private, in-house 1-day software architecture sketching workshop on the 15th, please drop me a note.

Categories: Architecture

Prime Your Mind for 2016

“Chance favors the prepared mind.” -- Louis Pasteur

The future is either created or destroyed by the decisions we make and the actions we take.

It's 2016 and change is in the air.

For some people, this time of year is their favorite. It's a time of year filled with hope, possibility, and dreams. 

For others, this is a horrible time of year, filled with despair, shattered dreams, and bitter disappointment.

Either way, let's get a fresh start, as we turn the page for a new year.

Let's give ourselves permission to dream big, and re-imagine what this next year could be all about.

Prime Your Mind to Empower Yourself and Your Business for an Amazing 2016

If you don't know what priming is, it's a psychology concept that basically means we embody the concepts and stereotypes we're exposed to.  For example, if we see the color yellow, we find the word banana faster.

You can use priming in a very pragmatic way to inspire your way forward.  Rather than hold on to old beliefs, mental models, and references, you can fill your mind with examples and ideas for new possibilities.

I've written a fairly exhaustive approach to how you can prime your mind for 2016:

Prime Your Mind for 2016

But I'll summarize some key ideas in this post so you can get started stirring up your big bold ambitions for the new year.

3 Key Ideas to Prime Your Mind with for 2016

The big ideas really come down to this:

  1. People examples of transformation. Fill your head with examples of how people have created amazing personal transformation.  TED Talks are a great source of inspiration and examples of how people have transformed themselves, and in many cases, how they are helping transform the world around them.
  2. Technology examples of transformation.   Fill your head with examples of how the mega-trends are shaping the world through Cloud, Mobile, Social, and Big Data.  Fill your mind with examples of how the mega-trends are coming together in a “Nexus of Forces” as Gartner would say, to change the world.  Fill your mind with examples of the mega-trend of mega-trends – the Internet of Things – is re-shaping the world, in extraordinary ways.  Read Future Visions, a free download by Microsoft, to get a glimpse into how science fiction could shape the science around us.
  3. Business examples of transformation.   Fill your head with examples of amazing examples of how businesses are driving digital business transformation.  Read NEXT at Microsoft to see some of the crazy things Microsoft is up to.  Read customer stories of transformation to see what Microsoft customers are up to.  Explore what sorts of things customers are up to on the Industry Solutions page.   For some truly phenomenal stories of digital transformation, check out what Microsoft UK is up to in education, business, and society.
Your Personal Preparation for 2016

Here is a quick way you can use books to help you prepare for the world around you:

  • Read a book like Leading Digital to get the overview of how digital transformation works.  You can see how companies like Starbucks and Burberry drove their digital transformation and you can learn the success patterns of business leaders who are leading and learning how to create customers and create new value in a mobile-first, cloud-first world.
  • Read books like Consumption Economics to fully grasp how value creation is throttled by value absorption – the ability of users and consumers to use the value that businesses can now create in a digital economy. 
  • Read books like B4b to see how companies are shifting to business outcomes for customers and helping customer achieve new levels of value from their technology investments. 
  • Read books like the Challenger Sale to learn how to go from somebody who pushes solutions to somebody who becomes a trusted advisor for their client and learns how to 1) teach, 2) tailor, and 3) take control.   Teaching is all about knowing your stuff and being able to help people see the art of the possible and sharing new ideas.  Tailoring is all about making ideas relevant.  It means you need to really understand a client’s pains, needs, and desired outcomes so that whatever comes out of your mouth, speaks to that.  Taking control means asking the right questions that drive conversations, strategies, and execution forward in an empowering way.
  • Read books like The Lean Startup to learn how to create and launch products, while making better, faster business decisions.   Learn how to innovate using principles from lean manufacturing and agile development to ship better, and win more raving fans.
  • Read books like Scaling Up to master the four key decision areas: people, strategy, execution, and cash, to create a company where the team is engaged, customers are doing your marketing, and everyone is making impact.  It includes one-page tools including a One-Page Strategic Plan and the Rockefeller Habits Checklist.
  • Read books like The Business Model Navigator to learn how businesses are re-imaging their business models for a mobile-first, cloud-first world.
  • Read books like Anticipate to put it all together and become a more visionary leader and build some mad skills to survive and thrive in the digital economy.
  • Read a book like Getting Results the Agile Way to help you master productivity, time management, and work-life balance.

Best wishes for a 2016 where you create and live the change you want to see.

You Might Also Like

10 Productivity Tools from Agile Results

Get Your Goals On

Habits, Dreams, and Goals

How To Defeat Procrastination

Microsoft Explained

Personal Effectiveness Toolbox

The Microsoft Story

Categories: Architecture, Programming

Distributing a beta version of an iOS app

Agile Testing - Grig Gheorghiu - Fri, 01/01/2016 - 20:41

I am not an iOS expert by any means, but recently I’ve had to maintain an iOS app and distribute it to beta testers. I had to jump through a few hoops, so I am documenting here the steps I had to take.

First of all, I am using Xcode 6.4 with the Fabric 2.1.1 plugin. I assume you are already signed up for the Fabric/Crashlytics service and that you also have an Apple developer account.
  1. Ask each beta tester to send you the UUID of the devices they want to run your app on.
  2. Go to developer.apple.com -> “Certificates, Identifiers and Profiles” -> “Devices” and add each device with its associated UUID. Let’s say you add a device called “Tom’s iPhone 6s” with its UUID.
  3. Go to Xcode -> Preferences -> Accounts. If you already have an account set up, remove it by selecting it and clicking the minus icon on the lower left side. Add an account: click the plus icon, choose “Add Apple ID” and enter your Apple ID and password. This will import your Apple developer provisioning profile into Xcode, with the newly added device UUIDs (note: there may be a better way of adding/modifying the provisioning profile within Xcode but this worked for me)
  4. Make sure the Fabric plugin is running on your Mac.
  5. Go to Xcode and choose the iOS application you want to distribute. Choose iOS Device as the target for the build.
  6. Go to Xcode -> Product -> Archive. This will build the app, then the Fabric plugin will pop up a message box asking you if you want to distribute the archive build. Click Distribute.
  7. The Fabric plugin will pop up a dialog box asking you for the email of the tester(s) you want to invite. Enter one or more email addresses. Enter release notes. At this point the Fabric plugin will upload your app build to the Fabric site and notify the tester(s) that they are invited to test the app.

Stuff The Internet Says On Scalability For January 1st, 2016

Hey, Happy New Year, it's HighScalability time:

River system? Vascular system? Nope. It's a map showing how all roads really lead to Rome.


If you like Stuff The Internet Says On Scalability then please consider supporting me on Patreon.
  • 71: mentions of innovation by the Chinese Communist Party; 60.5%: of all burglaries involve forcible entry; 280,000-squarefoot: Amazon's fulfillment center in India capable of shipping 2 million items; 11 billion: habitable earth like planets in the goldilocks zone in just our galaxy; 800: people working on the iPhone's camera (how about the app store?); 3.3 million: who knew there were so many Hello Kitty fans?; 26 petabytes: size of League of Legends' data warehouse; 

  • Quotable Quotes:
    • George Torwell: Tor is Peace / Prism is Slavery / Internet is Strength
    • @SciencePorn: Mr Claus will eat 150 BILLION calories and visit 5,556 houses per second this Christmas Eve.
    • @SciencePorn: Blue Whale's heart is so big, a small child can swim through the veins.
    • @BenedictEvans: There are close to 4bn people on earth with a phone (depending on your assumptions). Will go to at least 5bn. So these issues will grow.
    • @JoeSondow: "In real life you won't always have a calculator with you." — math teachers in the 80s
    • James Hamilton: This is all possible due to the latencies we see with EC2 Enhanced networking. Within an availability zone, round-trip times are now tens of microseconds, which make it feasible to propose and commit transactions to multiple resilient nodes in less than a millisecond.
    • Benedict Evans: The mobile ecosystem, now, is heading towards perhaps 10x the scale of the PC industry, and mobile is not just a new thing or a big thing, but that new generation, whose scale makes it the new centre of gravity of the tech industry. Almost everything else will orbit around it. 
    • Ruth Williams: Bacteria growing in an unchanging environment continue to adapt indefinitely.
    • @Raju: Not one venture-backed news aggregator has yet shown a Sustainable Business Model
    • @joeerl: + choose accurate names + favor beauty over performance + design minimal essential API's + document the unobvious
    • @shibuyashadows: There is no such thing as a full-node anymore. Now there are two types: Mining Nodes Economic Nodes. Both sets are now semi-centralized on the network, are heavily inter-dependent and represent the majority of the active Bitcoin users.
    • @TheEconomist: In 1972 a man with a degree aged 25-34 earned 22% more than a man without. Today, it's 70%
    • Dr. David Miller~ We are in the age of Howard Hughes. People make their fortune elsewhere and spend it on space. 
    • Credit for CRISPR: Part of that oversimplification is rooted in the fact that most modern life-science researchers aren’t working to uncover broad biological truths. These days the major discoveries lie waiting in the details
    • @BenedictEvans: Idle observation: Facebook will almost certainly book more revenue in 2015 than the entire internet ad industry made up until to 2000
    • Eric Clemmons: Ultimately, the problem is that by choosing React (and inherently JSX), you’ve unwittingly opted into a confusing nest of build tools, boilerplate, linters, & time-sinks to deal with before you ever get to create anything.
    • Kyle Russell: Why do I need such a powerful PC for VR? Immersive VR experiences are 7x more demanding than PC gaming.
    • @josevalim: The system that manages rate limits for Pinterest written in Elixir with a 90% response time of 800 microseconds.
    • catnaroek: The normal distribution is important because it arises naturally when the preconditions of the central limit theorem hold. But you still have to use your brain - you can't unquestioningly assume that any random variable (or sample or whatever) you will stumble upon will be approximately normally distributed.
    • Dominic Chambers: Now, if you consider the server-side immutable state atom to be a materialized view of the historic events received by a server, you can see that we've already got something very close to a Samza style database, but without the event persistence.
    • Joscha Bach: In my view, the 20th century’s most important addition to understanding the world is not positivist science, computer technology, spaceflight, or the foundational theories of physics. It is the notion of computation. Computation, at its core, and as informally described as possible, is very simple: every observation yields a set of discernible differences.

  • The New Yorker is picking up on the Winner Takes All theme that's been developing, I guess that makes it an official meme. What's missing from their analysis is that users are attracted to the eventual winners because they provide a superior customer experience. Magical algorithms are in support of experience. As long as a product doesn't fail at providing that experience there's little reason to switch after being small networked into a choice. You might think many many products could find purchase along the long tail, but in low friction markets that doesn't seem to be the case. Other choices become invisible and what's invisible starves to death.

  • I wonder how long it took to get to the 1 billionth horse ride? Uber Hits One Billionth Ride in 5.5 years.

  • Let's say you are a frog that has been in a warming pot for the last 15 years, what would you have missed? Robert Scoble has put together quite a list. 15 years ago there was no: Facebook, YouTube, Twitter, Google+, Quora, Uber, Lyft, iPhone, iPads, iPod, Android, HDTV, self driving cars, Waze, Google Maps, Spotify. Soundcloud, WordPress, Wechat, Flipkart, AirBnb, Flipboard, LinkedIn, AngelList, Techcrunch, Google Glass, Y Combinator, Techstars, Geekdom, AWS, OpenStack, Azure, Kindle, Tesla, and a lot more.

  • He who controls the algorithm reaps the rewards. Kansas is now the 5th state where lottery prizes may have been fixed.

  • What Is The Power Grid? A stunning 60% of generated energy is lost before it can be consumed, which is why I like my power grids like my databases: distributed and shared nothing.

Don't miss all that the Internet has to say on Scalability, click below and become eventually consistent with all scalability knowledge (which means this post has many more items to read so please keep on reading)...

Categories: Architecture

The Best Books I Read in 2015

Back by popular demand, here is my Best Books I Read, 2015 edition:

The Best Books I Read in 2015

As you may know, I read a lot of books.  I find it’s the best way to keep up and get ahead at Microsoft. 

I don’t just read technical books.  I read a wide variety of books, including mind, body, emotions, career, finance, relationships, and fun.

The common theme across the board is how to hack a better you.

I find that the more I learn across the board, the easier it gets to improve productivity, personal effectiveness, and impact at work.  And the bonus is that this spills into life.

This year, I spent extra effort on more health hacking.  We’re up against some pretty bad odds … 1 in 3 people die of cancer, but it used to be 1 in 80.  I in 4 get diabetes, but it used to be 1 in 4,000.  The good news is that there is some tremendous insight if you know the right books.

I also spent some extra energy focused on disruptive  innovation and digital transformation.  Again, some things can seem like magic until you know how the magic is done.  All of the magic tricks are revealed if you know the right books to read.

The Best Books I Read in 2015 is effectively the short-list from the very long list of books that I read in 2015.  Reading has always been one of the best ways for me to learn new ideas and new things to try.  I continue my quest for the world’s best insight and action for work and life, and I hope that some of the books I’ve included in my list turn out to be game changers for you.


Categories: Architecture, Programming

The Business Support Team Pattern

Xebia Blog - Thu, 12/31/2015 - 01:22

Lately I've encountered several teams that organize their work using Agile methods and they all exhibit a similar pattern. Teams (or actually the work) having such work patterns I call Business Support Teams. This type of team usually is responsible for operating the application, supporting the business in using the application, and developing new features on top of the (usually third party) application,

The nature of the work may be plannable or highly ad hoc, e.g. production incidents and/or urgent requests from the business. In practice I notice that the more ad hoc type of work the team has to deal with, the more they are struggling with approaches based on a single backlog of work.

In this post I'll show a set-up using boards and agreements that works for these type of teams very nicely.


In practice teams that start with Agile often default to using Scrum. It initially provides a structure for teams to start off and sets a cadence for frequent delivery of work and feedback loops. Such teams often start with a 'typical' scrum board consisting of 3 lanes: to do, in progress, and done

Here, the team has a backlog consisting of features to support the business, a visual board with three lanes, Definition of Ready, Definition of Done, and a cadence of 2 or sometimes 3 week sprints.

Note: the Definition of Ready is not part of scrum and a good practice often used by Scrum teams. See also this blog.

Business Support Team

What makes the Business Support Team different from other teams is that besides the list of features (application enhancements) they have other types of work. Typically the work includes:

  • Requests for information, e.g. reports,
  • New features to accelerate the business,
  • Long term improvements,
  • Keeping the application and platform operational
    • Daily and routine operational jobs
    • Handling production incidents

This follows the pattern described by Serge Beaumont in this presentation with the addition of Business Requests ('Requests for information').

Commonly Encountered Dissatisfactions

From a business point of view the customers may experience any of the following:

  • Unpredictable service as to when new features become available,
  • Limited support for questions and such,
  • Long waiting times for information and/or reports.

On the other hand, the team itself may experience that:

  • Work needed to keep the application operational limits the capacity severely to work on new features,
  • Interruptions due to incoming requests and/or incidents that require immediate attention causes longer lead times,
  • Too much work in progress,
  • Pressure to deliver for certain groups of business users will be at the cost of other stakeholders.
Business Expectations

The expectations from the customer with regards to the work items typically are (but may vary)

  • Requests for information, e.g. reports,
  • Nature: Ad hoc, and may varies;
    Expectation: typically ranges from 1 week to 1 month
  • New features to accelerate the business,
    Nature: Continuously entering the backlog;
    Expectation: is predictability
  • Keeping the application and platform operational
    • Daily and routine operational jobs
      Expectation: Just to have a running platform &#x1f609;
    • Handling production incidents
      Expectation: As fast as possible

From the team's perspective:

  • Long term improvements,
    Expectation: be able to spend time on it regularly
  • Keeping the application and platform operational
    • Handling production incidents
    • Expectation: as least as possible to disrupt the team

The challenge for the team is to be predictable enough regarding lead times for New Features while at the same time be able to take up work that requires immediate attention and at the same time have acceptable lead times on business requests.

Board & Policies

A board and set of policies that work very well are is shown to the right.kanbanized


The columns are kept the same as what the team already has. The trick to balancing the work, is to treat them differently. The board set-up above has four lanes:

Expedite: Reserved for work that needs to be dealt with immediately, e.g. production incidents. Sometimes also called 'Fast Lane'. Maximum of 1 work item at all times.

(Regular) Changes: Holds regular type of work which needs to be 'predictable enough'.

Urgent: Work that needs to be delivered with a certain service. E.g. within 5 working days. Mainly business requests for information, support and may include problems with priority levels lower than 1 &#x1f609;

Operational: Meant for all tasks that are needed to keep the application up & running. Typically daily routine tasks.

Note: Essential to make this working is to agree upon WiP (work in progress) limits and to set criteria when work is allowed to enter the lanes. This is described in the section below.

Note: As mentioned above this basically follows the pattern of [Beaumont2015] with the row for 'Urgent' work added.

Policy Example

As explained in [Beaumont2014] the Definition of Ready and Definition of Done guard the quality of work that enters and leaves the team respectively.

legendaDefinition of Run

Specifies the state of the application. What does it mean that it is 'running'? Work items that bring back the system into this state goes into the Expedite Lane. Example:

  • Application is up & running,
  • Application's response is within ... seconds,
  • Critical part of application is functioning,
  • ...

Note: There is one other type of that is usually allowed in this lane: items that have a deadline and that are late for delivery....and have a policy in place!

Definition of Change

Regular requests for new features and enhancements. Predictability is most important. Certain variation of the lead time is considered acceptable.

Service level is ... weeks with 85% on time delivery (1 standard deviation service level).

Definition of Request

Business requests. Typical use includes requests for support, creation of reports (information) (e.g. national banks may require reports as part of an audit). And other types of requests that are not critically important to go into the expedite lane, are more than a couple of hours of work, and for which lead times are expected that are considerable shorter than that for changes.

Example criteria:

  • Business requests, requiring less than 1 week of work, or
  • A problem report with severity of 2, 3, or 4

Service level is .... working days with 95% on time delivery.

Definition of operational

Describes the routine tasks that need to be done regularly to keep the system running as stated in the Way of Working.

Example criteria:

  • Less than 2 hours of work, and
  • Routine task as described in the Way of Working, and
  • Can be started and completed on the same day,
  • Maximum of ... hours per day by the team.

It is important to limit the amount of time spent on these items by the team so the team can maintain the expected service levels on the other types of work.


From all the aforementioned work item types, only the 'Change' item is plannable; 'Run' items are very ad hoc from its nature, as is the case with 'Operational' tasks (some are routine and some just pop-up during the day). Requests from the business tend to come in on short notice with the expectation of short delivery times.

Because of the 'ad hoc' nature for most work item types planning and scheduling of work needs to be done more often than once every sprint. Replenishment of the 'To do' will be done continuously for the rows whenever new work arrives. The team can agree on a policy for how often and how they want to do this.

The sequence of scheduling work between the rows is done either by the product owner or self-regulated by a policy that includes setting WiP limits over the rows. This will effectively divide the available team's capacity between the work item types.


Business Support Teams follow a pattern very similar to that described in [Beaumont2015]. In addition to the 'Run', 'Change', 'Operational' types of work the type 'Request' is identified. The work is not described by a single backlog of similar work items but rather as a backlog of types of work. These types are treated differently because they have a different risk profile (Class of Service).

This enables the team to be predictable enough on 'Changes' with an (not so small) acceptable variation of the lead time, have a higher service level on ad hoc requests from the business ('Request'), plan their daily routine work, while at the same time be able to have a fast as possible delivery of 'Run' items.

Allowing a larger variation on the 'Change' items allows for a higher service on the 'Request' items.


[Beaumont2014] The 24 Man DevOps Team, Xebicon 2015, Serge Beaumont, Link https://xebicon.nl/slides/serge-beaumont.pdf

How to choose an in-memory NoSQL solution: Performance measuring

The main purpose of this work is to show results of benchmarking some of the leading in-memory NoSQL databases with a tool named YCSB.

We selected three popular in-memory database management systems: Redis (standalone and in-cloud named Azure Redis Cache), Tarantool and CouchBase and one cache system Memcached. Memcached is not a database management system and does not have persistence. But we decided to take it, because it is also widely used as a fast storage system. Our “firing field” was a group of four virtual machines in Microsoft Azure Cloud. Virtual machines are located close to each other, meaning they are in one datacenter. This is necessary to reduce the impact of network overhead in latency measurements. Images of these VMs can be downloaded by links: one, two, three and four (login: nosql, password: qwerty). A pair of VMs named nosql-1 and nosql-2 is useful for benchmarking Tarantool and CouchBase and another pair of VMs named nosql-3 and nosql-4 is good for Redis, Azure Redis Cache and Memcached. Databases and tests are installed and configured on these images.

Our virtual machines were the basic A3 instances with 4 cores, 7 GB RAM and 120 GB disk size.

Databases and their configurations
Categories: Architecture