Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
malcomio committed May 26, 2024
1 parent e807d0b commit 5a4ce07
Show file tree
Hide file tree
Showing 38 changed files with 55 additions and 55 deletions.
6 changes: 3 additions & 3 deletions _posts/2014-11-21-pair-programming-budo.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Let's look at each of those in turn. Some are related to each other, sometimes i

## Everyone has something to teach
![Fig 1. Teaching gives you lots of options when responding to questions](/images/20141105_budo/01_xkcd_comic_teacher_changing.jpg)
© xckd.com
© xkcd.com

> A teacher is one who makes himself progressively unnecessary.
> <cite> Thomas Carruthers
Expand All @@ -38,7 +38,7 @@ Pairing with different people, therefore, can help (and has helped me) to think

## If you compete instead of collaborating, the end result can suffer
![Fig 2. Collaboration is important, but it must be true collaboration](/images/20141105_budo/02_xkcd_interdisciplinary.png)
&copy; xckd.com
&copy; xkcd.com

> Every man lives by exchanging.
> <cite> Adam Smith
Expand Down Expand Up @@ -102,7 +102,7 @@ Recognising that different people learn in different ways will become instinctiv

## Talking is no substitute for doing
![Fig 6. If you never move on from planning, you'll get nowhere](/images/20141105_budo/06_xkcd_pep_talk.png)
&copy; xckd.com
&copy; xkcd.com

> Think like a man of action, act like a man of thought.
> <cite> Henri Bergson
Expand Down
2 changes: 1 addition & 1 deletion _posts/2015-02-27-drupal-composer-symfony.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ Why? Again, many reasons like:

1. Being ready for **Drupal 8** (just lift libraries from D7 or D6 to D8),
2. Decoupling things so we code things that are ready to use not just in Drupal, and
3. [Opening the door to other worlds to colaborate with our Drupal world](https://capgemini.github.io/open%20source/symfony-live/), ...
3. [Opening the door to other worlds to collaborate with our Drupal world](https://capgemini.github.io/open%20source/symfony-live/), ...
4. Why not use [Dependency Injection](http://martinfowler.com/articles/injection.html Dependency Injection) in Drupal ([as it already happens in D8](http://www.webomelette.com/drupal-8-dependency-injection-service-container-and-all-jazz))? What about using the [Symfony Service container](http://symfony.com/doc/current/book/service_container.html Symfony Service container)? Or something more light like [Pimple](http://pimple.sensiolabs.org/ Pimple)?
5. Choose between many other reasons...

Expand Down
2 changes: 1 addition & 1 deletion _posts/2015-05-06-apollo.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ The following open source components are baked into Apollo core:
* **Docker**: For packaging and running your applications. We believe Docker will be a big player in the future of building and running applications in the enterprise. In combination with Mesos frameworks like [Marathon](https://github.com/mesosphere/marathon) and [Aurora](http://aurora.apache.org/) you can build your own platform as a service leveraging Linux containers. [https://www.docker.com/](https://www.docker.com) <br/><br/>
* **Consul**: For service discovery and DNS. Never hard-code an application endpoint or service URL in your configuration files again. We use Consul to automatically register service addresses, ports and arbitrary information about Docker containers that start in the datacenter. It also comes packed with its own built-in DNS server so you can query services easily. [https://www.consul.io/](https://www.consul.io) <br/><br/>
* **Weave**: Weave simplifies the networking for Docker containers. We use Weave to create a separate overlay network which all containers start up in. This removes some of the headaches around Docker networking - no need to carefully co-ordinate which ports are mapped from host > container anymore. All containers inside the Weave network can communicate with each other directly using their Consul DNS and port meaning the end result looks a lot like standard networking (in the bare-metal / VM world). [http://weave.works/](http://weave.works/) <br/><br/>
* **Terraform**: Terraform allows you to rapidly and consistently spin up resources in the cloud. Think Amazon Cloud Formation / OpenStack Heat but cloud agnostic. We've already built terraform plans that allow you to spin up Amazon VPC and Digitalocean public cloud. We're looking to expand that with support for Rackspace(Openstack) and Microsoft Azure. [https://www.terraform.io/](https://www.terraform.io) <br/><br/>
* **Terraform**: Terraform allows you to rapidly and consistently spin up resources in the cloud. Think Amazon Cloud Formation / OpenStack Heat but cloud agnostic. We've already built terraform plans that allow you to spin up Amazon VPC and Digitalocean public cloud. We're looking to expand that with support for Rackspace(OpenStack) and Microsoft Azure. [https://www.terraform.io/](https://www.terraform.io) <br/><br/>

For further documentation on Apollo components see the docs on GitHub [https://github.com/Capgemini/Apollo/tree/master/docs](https://github.com/Capgemini/Apollo/tree/master/docs).

Expand Down
2 changes: 1 addition & 1 deletion _posts/2015-05-15-drupal-integration-patterns.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ implement business logic, data structures and administration of a new applicatio
us the ability to
model custom objects and store them in the Drupal database; [Views](https://www.drupal.org/project/views) gives us
the means to retrieve that data and display it in a myriad of ways. Modules
like [Rules](https://www.drupal.org/project/rules); [Features](https://www.drupal.org/project/features) and [CTools](https://www.drupal.org/project/ctools) provide extensive options for implementing
like [Rules](https://www.drupal.org/project/rules); [Features](https://www.drupal.org/project/features) and [Chaos Tools](https://www.drupal.org/project/ctools) provide extensive options for implementing
specific business rules to model your domain specific data and application needs.

This is all well and good, and uses the strengths of Drupal core and the wide range of community [contributed modules](https://www.drupal.org/project/project_module) to enable
Expand Down
2 changes: 1 addition & 1 deletion _posts/2015-06-04-making-ethical-development-choices.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ The effect of our decisions ripples beyond our immediate circle of influence. B

Who suffers? (Cui patitur?)
----------
While modern commerical transactions (in the main) are mandated on the idea that commerce is not a [zero-sum game](http://en.wikipedia.org/wiki/Zero-sum_game), for any decision that we make there is an opportunity cost to us the decision maker, and potentially to some other party or parties. In our Getchure Widgets question, deciding to value the long-term benefits over the short-term gains might mean that the person in favour of the short-term decision at Getchure Widgets loses face. Our question then becomes, can we eliminate this loss? If we can't, can we minimise it? Can we spread the risk of loss for any decision so that its impact doesn't fall solely on one person (or organisation)? Can we apportion potential loss to those best equipped to deal with it? And if we can, is it a moral choice to do so?
While modern commercial transactions (in the main) are mandated on the idea that commerce is not a [zero-sum game](http://en.wikipedia.org/wiki/Zero-sum_game), for any decision that we make there is an opportunity cost to us the decision maker, and potentially to some other party or parties. In our Getchure Widgets question, deciding to value the long-term benefits over the short-term gains might mean that the person in favour of the short-term decision at Getchure Widgets loses face. Our question then becomes, can we eliminate this loss? If we can't, can we minimise it? Can we spread the risk of loss for any decision so that its impact doesn't fall solely on one person (or organisation)? Can we apportion potential loss to those best equipped to deal with it? And if we can, is it a moral choice to do so?

When we make a decision to remove or change functionality, or reduce scope, recognise that we are adversely affecting some hypothetical person's experience of our product. Conversely, we may be enhancing someone else's experience. Is the balance of harms equally weighted? Questions of accessibility are clear examples here, where the harm done to a user by removing accessible features clearly outweighs the harm to a user of ignoring or disabling accessible options they do not need. If the loss of functionality, and therefore the harm, is temporary, then we can say that the loss is mitigated, and thereby potentially justifiable. But we need to ensure that we are not facilely attributing mitigations to actual features lost (and harms done thereby). We must be sure that any mitigation of losses is real and not imagined before we make a decision to proceed.

Expand Down
2 changes: 1 addition & 1 deletion _posts/2015-07-03-continuously-deploying-apollo.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ You can see the feedback for every build in wercker:
## Deploy
Wercker allows you to deploy your application into supported platforms like Heroku or Openshift or you can create you own Deployment Target.
Wercker allows you to deploy your application into supported platforms like Heroku or OpenShift or you can create you own Deployment Target.
Every successful build from any specific commit can be deployed either automatically or manually.
Expand Down
2 changes: 1 addition & 1 deletion _posts/2015-09-04-bdd-test-execution-throughput.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ The obvious solution is to run multiple tests in parallel. After investigation t

SpecFlow has a tool called SpecFlow+ Runner. This is a paid-for addition. We're not against purchasing extra software, but for this aspect of the project we're trying to avoid tie-in to a particular tool. From the documentation it was also unclear if this tool would definitely help us.

A tool called PNunit came up. Unfortunately that tool doesn't really run tests in parallel. What it does is split tests into sets to distribute across many build agents - not really what we are looking for.
A tool called PNUnit came up. Unfortunately that tool doesn't really run tests in parallel. What it does is split tests into sets to distribute across many build agents - not really what we are looking for.

### Set Tests Running and Collect Results Later

Expand Down
2 changes: 1 addition & 1 deletion _posts/2015-09-14-lead-developer.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ The late morning sessions consisted of a whistle-stop tour of AngularJS and Go i

The morning then concluded with [Russ Miles](https://twitter.com/russmiles) using an [electric guitar, AC/DC](https://twitter.com/russmiles/status/642581244631470080) and a [marriage proposal](https://twitter.com/geek_manager/status/642391161924120576) to keep us on the right direction on the Highway to (Microservices) Hell. Russ gave a thoroughly entertaining talk, leading the audience through his views on achieving success with a microservices architecture (and some hints on avoiding failure) by focusing not on what you have built, but what you can do with it. As always, the war stories and warnings were as valuable as the tips for success.

The after lunch slot, normally a bit of a graveyard as everyone digests, was filled by [Sam Barnes](https://twitter.com/thesambarnes) presenting one of the highlights of the day in his talk ["People are Weird, I’m Weird"](https://speakerdeck.com/thesambarnes/people-are-weird-im-weird-the-lead-developer-london-2015). Highlighting that every person we meet is different, and that we only consider weird from our own perspectives, Sam used a very personal story combined with some highly amusing animated gifs to dive into the heart of the issue and remind us how close team leadership and psychology are:
The after lunch slot, normally a bit of a graveyard as everyone digests, was filled by [Sam Barnes](https://twitter.com/thesambarnes) presenting one of the highlights of the day in his talk ["People are Weird, I’m Weird"](https://speakerdeck.com/thesambarnes/people-are-weird-im-weird-the-lead-developer-london-2015). Highlighting that every person we meet is different, and that we only consider weird from our own perspectives, Sam used a very personal story combined with some highly amusing animated GIFs to dive into the heart of the issue and remind us how close team leadership and psychology are:

> [Psychology/Team management] is a profession where it's important to study people; how they think, how they act, react and interact. It's concerned with all aspects of behaviour and the thoughts, feelings and motivation underlying them.
Expand Down
2 changes: 1 addition & 1 deletion _posts/2015-10-23-super-smashing-great.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,4 @@ Zach Leatherman provided plenty of useful insight and practical suggestions for

Andrew Clarke rounded things off, as he did in Oxford, with more of a conceptual talk, touching on the lessons from advertising, and the difficulty of balancing creativity with processes and systems. A lot of Andrew's ideas provided a callback to Espen's discussion of the way that so many websites are becoming predictable. Again, a lot of food for thought.

My flight time meant that I had to miss the photowalk, but coming home with my mind (and my Evernote) full of ideas, I know that I'll be revisiting a lot of the talks via the [collaborative notes](http://smashed.by/bcn-notes) and the slides and videos, once they've been [collected on Lanyrd](http://lanyrd.com/2015/smashingconf-barcelona/), and hopefully I'll be able to go to another Smashing conference before too long.
My flight time meant that I had to miss the photo walk, but coming home with my mind (and my Evernote) full of ideas, I know that I'll be revisiting a lot of the talks via the [collaborative notes](http://smashed.by/bcn-notes) and the slides and videos, once they've been [collected on Lanyrd](http://lanyrd.com/2015/smashingconf-barcelona/), and hopefully I'll be able to go to another Smashing conference before too long.
2 changes: 1 addition & 1 deletion _posts/2016-01-26-docker-ci-workflows.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ Here is a diagram of the CI flow we have just undergone.

Now the container is running, we want to put some checks in to make sure it stays secure, so we make sure the apparmor or seccomp profile are implemented, we also want to make sure we am running something that is going to check for security updates such as the tools mentioned earlier e.g. Clair or libsecurity.

Now we want to test the performance of our container from the point of view of security and load, so we can see if this has changed over time and if we are regressing our application. For this we are going to use our [Vegeta](https://github.com/tsenart/vegeta) test harness, but something like [Bonesi](https://github.com/markus-go/bonesi) will do the job. While running load we are going to be running chaos monkey at our applications and hosts, to make sure they behave correctly and don't do anything we are not expecting, when they move hosts or restart. We are also going to be running [Minion](https://github.com/mozilla/minion). Looks to be a fairly good security framework from Mozilla. Minion will aggregate all our security tools reporting, issues and scans. This will be our final security and performance quality gate.
Now we want to test the performance of our container from the point of view of security and load, so we can see if this has changed over time and if we are regressing our application. For this we are going to use our [Vegeta](https://github.com/tsenart/vegeta) test harness, but something like [BoNeSi](https://github.com/markus-go/bonesi) will do the job. While running load we are going to be running chaos monkey at our applications and hosts, to make sure they behave correctly and don't do anything we are not expecting, when they move hosts or restart. We are also going to be running [Minion](https://github.com/mozilla/minion). Looks to be a fairly good security framework from Mozilla. Minion will aggregate all our security tools reporting, issues and scans. This will be our final security and performance quality gate.

At this point we have a pretty high degree of confidence in our new container. We then deploy to production and start on our next brilliant idea. As a side note, we need to make sure our host OS is secure as well, so using many of the [CoreOS principles of trusted computing](https://coreos.com/blog/coreos-trusted-computing) or running [DockerBench](https://github.com/docker/docker-bench-security), over your host, you will go along way to securing your host, hardware and all the way up to your application.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ When thinking about an area of waste we need to run it through a thought process

#### 5.) Is there any risk to implementing the solution?

* We need to understand the effects of what we do, if fixing one thing breaks several others is it worthwhile? For instance, if we are updating a class that effects the way a webpage works, have we got a comprehensive set of both unit and automated regression tests we can run, to ensure we have not caused any unwanted side effects?
* We need to understand the effects of what we do, if fixing one thing breaks several others is it worthwhile? For instance, if we are updating a class that effects the way a web page works, have we got a comprehensive set of both unit and automated regression tests we can run, to ensure we have not caused any unwanted side effects?

It's also a good idea but not always practical to run a root-cause analysis on why these problems have occurred as well. (If you are unfamiliar: [5 whys wiki](https://en.wikipedia.org/wiki/5_Whys), [5 whys](https://www.mindtools.com/pages/article/newTMC_5W.htm))

Expand Down
2 changes: 1 addition & 1 deletion _posts/2016-05-09-were-heading-to-devoxx.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,4 @@ Don't forget we're hiring (see the ad below this post). Here are just a few of t
* Surrounded by a growing set of talented and inspiring individuals.
* Flexible working time and environment.
* Two weeks of training and conference attendance a year. We love sending people to SkillsMatter’s CodeNode in London.
* The best tools - we let developers choose Windows, OSX (and in the future Ubuntu – we’re working hard on it) for their corporate machine. We provide tricked out Macbook Pros to our developers if you want one. We also provide IntelliJ IDEA licences for everyone who’s broken away from Eclipse.
* The best tools - we let developers choose Windows, OSX (and in the future Ubuntu – we’re working hard on it) for their corporate machine. We provide tricked out MacBook Pros to our developers if you want one. We also provide IntelliJ IDEA licences for everyone who’s broken away from Eclipse.
10 changes: 5 additions & 5 deletions _posts/2016-06-03-cleaning-the-camel.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ final Predicate orderTypeIsSuper
from("direct:fulfilOrder")
.choice()
.when(orderTypeIsBasic)
.to("direct:fufilBasicOrder")
.to("direct:fulfilBasicOrder")
.when(orderTypeIsSuper)
.to("direct:fulfilSuperOrder")
.otherwise()
Expand Down Expand Up @@ -151,8 +151,8 @@ from("file:orderReporting")
.bean(OrderFileProcessor.class, "transformShopOrderLineMessage")
.endChoice()
.unmarshal(orderDataReportFormat)
.aggregate(header(SALES_CHANNEL_ID), new OrderLineAggregrationStrategy())
.completionTimeout(orderAggregrationTimeout)
.aggregate(header(SALES_CHANNEL_ID), new OrderLineAggregationStrategy())
.completionTimeout(orderAggregationTimeout)
.to("file:///temp/order_reporting_output?autoCreate=true")
.end()
.end();
Expand All @@ -173,8 +173,8 @@ from("direct:getOrderLineDataForSalesChannel")
....
from("direct:writeToReportFile")
.aggregate(header(SALES_CHANNEL_ID), new OrderLineAggregrationStrategy())
.completionTimeout(orderAggregrationTimeout)
.aggregate(header(SALES_CHANNEL_ID), new OrderLineAggregationStrategy())
.completionTimeout(orderAggregationTimeout)
.to("file:///temp/order_reporting_output?autoCreate=true")
.end();
Expand Down
Loading

0 comments on commit 5a4ce07

Please sign in to comment.