<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Coding Architect</title>
		<link>https://www.grahambrooks.com/</link>
		<description>Recent content on Coding Architect</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
			<copyright>© 2026 Graham Brooks. All rights reserved.</copyright>
		
		
			<lastBuildDate>Sat, 25 Jul 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://www.grahambrooks.com/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>A Control Plane for a Personal GitHub Account</title>
				<link>https://www.grahambrooks.com/post/automating-github-account-management/</link>
				<pubDate>Sat, 25 Jul 2026 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/automating-github-account-management/</guid>
				<description>&lt;p&gt;I have around 120 repositories under my personal GitHub account. Some are active, most are dormant, and all of them rot at the same rate. Dependencies drift, GitHub Actions pin to versions that get deprecated, CVEs land in transitive packages, issues arrive and sit unlabelled, and the Rust MSRV I set eighteen months ago quietly falls three releases behind.&lt;/p&gt;&#xA;&lt;p&gt;The usual answer is to commit a &lt;code&gt;renovate.json&lt;/code&gt; and a couple of workflow files into every repo. I&amp;rsquo;ve done that. It doesn&amp;rsquo;t work at this scale — not because it fails, but because &lt;em&gt;changing your mind&lt;/em&gt; fails. A policy tweak becomes 120 pull requests. The config drifts per repo. Half the repos end up on a stale copy of a workflow nobody remembers writing.&lt;/p&gt;</description>
			</item>
			<item>
				<title>facts: Porting Midje&#39;s Arrow to Rust</title>
				<link>https://www.grahambrooks.com/post/facts-rust-testing-library/</link>
				<pubDate>Mon, 25 May 2026 10:00:00 -0600</pubDate>
				<guid>https://www.grahambrooks.com/post/facts-rust-testing-library/</guid>
				<description>&lt;h2 id=&#34;the-reading-order-problem&#34; class=link_owner&gt;&#xA;  The reading order problem&#xA;  &lt;a href=&#34;#the-reading-order-problem&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Stock Rust testing is fine, in the sense that a hammer is fine. You get &lt;code&gt;assert!&lt;/code&gt;, &lt;code&gt;assert_eq!&lt;/code&gt;, &lt;code&gt;assert_ne!&lt;/code&gt;, and the &lt;code&gt;#[test]&lt;/code&gt; attribute. Everything past that — better diffs, fuzzy float comparisons, collection matchers, mocks, table-driven cases — is a separate crate with its own conventions: &lt;code&gt;pretty_assertions&lt;/code&gt;, &lt;code&gt;assert2&lt;/code&gt;, &lt;code&gt;claim&lt;/code&gt;, &lt;code&gt;approx&lt;/code&gt;, &lt;code&gt;mockall&lt;/code&gt;, &lt;code&gt;rstest&lt;/code&gt;, &lt;code&gt;proptest&lt;/code&gt;. Each crate is good. Together they form a Galápagos of small DSLs that all read slightly differently.&lt;/p&gt;</description>
			</item>
			<item>
				<title>bx: Running Local MCP Servers Without a Node or Python Runtime</title>
				<link>https://www.grahambrooks.com/post/bx-lighter-mcp-servers/</link>
				<pubDate>Sat, 23 May 2026 12:00:00 -0600</pubDate>
				<guid>https://www.grahambrooks.com/post/bx-lighter-mcp-servers/</guid>
				<description>&lt;p&gt;&lt;em&gt;MCP server configs across the ecosystem default to &lt;code&gt;npx&lt;/code&gt;. That quietly forces a Node runtime onto every machine that wants to run a native binary tool. &lt;code&gt;bx&lt;/code&gt; is the missing primitive for the other case.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;I spent the weekend building &lt;a href=&#34;https://github.com/grahambrooks/bx&#34;&gt;bx&lt;/a&gt; — short for &lt;em&gt;binary execute&lt;/em&gt; — a single static binary whose only job is to fetch, cache, and exec other single static binaries from GitHub releases. Think &lt;code&gt;npx&lt;/code&gt;/&lt;code&gt;uvx&lt;/code&gt;/&lt;code&gt;pipx&lt;/code&gt;, except there is no Node and no Python anywhere in the picture.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The Agentic Inner Loop: Sensors, Substrate, and Skills for Polyglot Development</title>
				<link>https://www.grahambrooks.com/post/inner-loop-agentic-development/</link>
				<pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/inner-loop-agentic-development/</guid>
				<description>&lt;p&gt;The developer inner loop — &lt;em&gt;edit, build, test, debug&lt;/em&gt; — is the highest-leverage piece of any engineering team&amp;rsquo;s workflow. It runs hundreds of times a day per developer. Shaving seconds off it compounds into hours; lengthening it by minutes kills momentum.&lt;/p&gt;&#xA;&lt;p&gt;What we used to optimise was the human&amp;rsquo;s cycle time. Faster compilers, hot reload, snappier test runners. The human stayed in the seat throughout, dispatching each step and reading the output.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Casual-Review: A CLI for Team Code Review Without the Server</title>
				<link>https://www.grahambrooks.com/post/casual-review-cli-team-code-review/</link>
				<pubDate>Thu, 30 Apr 2026 14:00:00 -0600</pubDate>
				<guid>https://www.grahambrooks.com/post/casual-review-cli-team-code-review/</guid>
				<description>&lt;p&gt;&lt;em&gt;Most code review tools want to be a service. The interesting question is what falls out when you refuse to run one — and use git itself as the sync layer instead.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve spent the last few weeks building &lt;a href=&#34;https://github.com/grahambrooks/casual-review&#34;&gt;casual-review&lt;/a&gt; — &lt;code&gt;cr&lt;/code&gt; on the command line — a single static binary that delivers &lt;code&gt;rustc&lt;/code&gt;-quality diagnostics across Rust, Python, TypeScript, TSX, and Java. It&amp;rsquo;s diff-aware by default, runs equally on a developer workstation and in CI, and is designed for both human and agent (LLM) consumers.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Code Review After the Pull Request</title>
				<link>https://www.grahambrooks.com/post/code-review-after-the-pull-request/</link>
				<pubDate>Sun, 26 Apr 2026 19:15:00 -0600</pubDate>
				<guid>https://www.grahambrooks.com/post/code-review-after-the-pull-request/</guid>
				<description>&lt;p&gt;&lt;em&gt;The pull request was built for a world where humans wrote most of the code. We don&amp;rsquo;t live there anymore.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;The pull request as a unit of review is a recent invention. GitHub shipped it in 2008. Before that, code review meant Fagan inspections, pair programming, or the homegrown pre-commit systems Google and Facebook ran internally. The PR didn&amp;rsquo;t just give us a UI — it institutionalized &lt;em&gt;the change&lt;/em&gt; as the thing we look at. Eighteen years later, &amp;ldquo;review&amp;rdquo; and &amp;ldquo;review the diff&amp;rdquo; mean the same thing to almost everyone.&lt;/p&gt;</description>
			</item>
			<item>
				<title>A Code Knowledge Graph for Review, Not Generation</title>
				<link>https://www.grahambrooks.com/post/code-knowledge-graph-for-review/</link>
				<pubDate>Sun, 26 Apr 2026 18:30:00 -0600</pubDate>
				<guid>https://www.grahambrooks.com/post/code-knowledge-graph-for-review/</guid>
				<description>&lt;p&gt;&lt;em&gt;The same graph that helps an agent write code can help a reviewer trust it. Almost nobody is using it that way.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Every AI coding tool I&amp;rsquo;ve looked at in the last eighteen months — including &lt;a href=&#34;https://www.grahambrooks.com/post/building-a-code-knowledge-graph-for-ai-agents/&#34;&gt;codemap&lt;/a&gt; now called symgraph— is built around the &lt;em&gt;write&lt;/em&gt; side. Index the codebase, expose a semantic surface, hand the agent enough context to make a competent edit. The graph is plumbing for generation.&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s the obvious application. It&amp;rsquo;s also the smaller half of the problem.&lt;/p&gt;</description>
			</item>
			<item>
				<title>A Rust-Native Architecture Toolchain: forge, puml, and adoc</title>
				<link>https://www.grahambrooks.com/post/rust-native-architecture-toolchain/</link>
				<pubDate>Sun, 26 Apr 2026 17:54:39 -0600</pubDate>
				<guid>https://www.grahambrooks.com/post/rust-native-architecture-toolchain/</guid>
				<description>&lt;h1 id=&#34;a-rust-native-architecture-toolchain-forge-puml-and-adoc&#34; class=link_owner&gt;&#xA;  A Rust-Native Architecture Toolchain: forge, puml, and adoc&#xA;  &lt;a href=&#34;#a-rust-native-architecture-toolchain-forge-puml-and-adoc&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;replacing-the-jvm-and-ruby-pieces-of-the-architecture-documentation-stack-with-single-static-binaries&#34; class=link_owner&gt;&#xA;  Replacing the JVM and Ruby pieces of the architecture documentation stack with single static binaries&#xA;  &lt;a href=&#34;#replacing-the-jvm-and-ruby-pieces-of-the-architecture-documentation-stack-with-single-static-binaries&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Most of the tools I reach for when documenting architecture were built in another era. PlantUML wants a JVM. Asciidoctor wants Ruby. Structurizr wants both, depending on which piece you&amp;rsquo;re using. Each one is a perfectly fine tool. Together they&amp;rsquo;re a small operations problem &amp;ndash; the kind of thing that quietly breaks every CI pipeline I&amp;rsquo;ve ever set up, and the kind of thing AI coding agents have an especially hard time bootstrapping inside a sandbox.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Sandboxing AI Coding Agents: Why Isolation Matters</title>
				<link>https://www.grahambrooks.com/post/ai-coding-isolation/</link>
				<pubDate>Sun, 22 Mar 2026 12:13:20 -0600</pubDate>
				<guid>https://www.grahambrooks.com/post/ai-coding-isolation/</guid>
				<description>&lt;p&gt;The more context and tools an AI coding agent has access to, the better it performs. But more power means more risk. How&#xA;do we harness the full capability of AI coding assistants while keeping our systems safe?&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-problem-power-vs-safety&#34; class=link_owner&gt;&#xA;  The Problem: Power vs. Safety&#xA;  &lt;a href=&#34;#the-problem-power-vs-safety&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;AI coding agents like Claude Code, Codex, GitHub Copilot and Gemini CLI are remarkably capable — they can read your codebase, run&#xA;commands, install packages, and modify files across your project. To be most useful, you want to give them broad access.&#xA;To maintain flow you want the agent to run to completion without continuously interrupting and asking for permission for&#xA;every action or confirming that it can use use something safely in the future. But every tool you grant is a tool that&#xA;can misfire.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Exploring Your Backstage Catalog Without Backstage</title>
				<link>https://www.grahambrooks.com/post/exploring-your-backstage-catalog-without-backstage/</link>
				<pubDate>Sat, 21 Feb 2026 12:00:00 -0700</pubDate>
				<guid>https://www.grahambrooks.com/post/exploring-your-backstage-catalog-without-backstage/</guid>
				<description>&lt;h1 id=&#34;exploring-your-backstage-catalog-without-backstage&#34; class=link_owner&gt;&#xA;  Exploring Your Backstage Catalog Without Backstage&#xA;  &lt;a href=&#34;#exploring-your-backstage-catalog-without-backstage&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;how-bsv-gives-you-instant-visibility-into-your-software-catalog-from-the-terminal&#34; class=link_owner&gt;&#xA;  How bsv gives you instant visibility into your software catalog from the terminal&#xA;  &lt;a href=&#34;#how-bsv-gives-you-instant-visibility-into-your-software-catalog-from-the-terminal&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Backstage has become the de facto standard for software catalogs. Thousands of organizations use it to track their services, APIs, teams, and infrastructure through &lt;code&gt;catalog-info.yaml&lt;/code&gt; files scattered across their repositories. The format is well-designed, the ecosystem is mature, and the idea &amp;ndash; a single catalog of everything your organization builds and operates &amp;ndash; is genuinely powerful.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Seeing Your Codebase as a City</title>
				<link>https://www.grahambrooks.com/post/seeing-your-codebase-as-a-city/</link>
				<pubDate>Sat, 21 Feb 2026 00:00:00 -0700</pubDate>
				<guid>https://www.grahambrooks.com/post/seeing-your-codebase-as-a-city/</guid>
				<description>&lt;h1 id=&#34;seeing-your-codebase-as-a-city&#34; class=link_owner&gt;&#xA;  Seeing Your Codebase as a City&#xA;  &lt;a href=&#34;#seeing-your-codebase-as-a-city&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;why-we-need-better-ways-to-understand-code-at-scale--and-how-3d-visualization-can-help&#34; class=link_owner&gt;&#xA;  Why we need better ways to understand code at scale &amp;ndash; and how 3D visualization can help&#xA;  &lt;a href=&#34;#why-we-need-better-ways-to-understand-code-at-scale--and-how-3d-visualization-can-help&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Software teams accumulate code the way cities accumulate buildings. One project at a time, one service at a time, one quick prototype that somehow became permanent infrastructure. Before long you have dozens or hundreds of repositories, and nobody has a clear picture of what&amp;rsquo;s actually there.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Visualizing Project Structure with rv</title>
				<link>https://www.grahambrooks.com/post/visualizing-project-structure-with-rv/</link>
				<pubDate>Sat, 21 Feb 2026 00:00:00 -0700</pubDate>
				<guid>https://www.grahambrooks.com/post/visualizing-project-structure-with-rv/</guid>
				<description>&lt;h1 id=&#34;visualizing-project-structure-with-rv&#34; class=link_owner&gt;&#xA;  Visualizing Project Structure with rv&#xA;  &lt;a href=&#34;#visualizing-project-structure-with-rv&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;a-fast-interactive-way-to-see-whats-actually-in-your-project&#34; class=link_owner&gt;&#xA;  A fast, interactive way to see what&amp;rsquo;s actually in your project&#xA;  &lt;a href=&#34;#a-fast-interactive-way-to-see-whats-actually-in-your-project&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every developer has had the experience of opening an unfamiliar codebase and trying to figure out what&amp;rsquo;s where. You run &lt;code&gt;tree&lt;/code&gt;, get a wall of text, and scroll past hundreds of lines of filenames that all blur together. Or you click through directories in your editor, building a mental model one folder at a time. Neither approach gives you the kind of immediate, intuitive sense of a project&amp;rsquo;s shape that you get from actually working in it for weeks.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Building a Code Knowledge Graph for Ai Agents</title>
				<link>https://www.grahambrooks.com/post/building-a-code-knowledge-graph-for-ai-agents/</link>
				<pubDate>Sun, 15 Feb 2026 08:35:20 -0700</pubDate>
				<guid>https://www.grahambrooks.com/post/building-a-code-knowledge-graph-for-ai-agents/</guid>
				<description>&lt;h1 id=&#34;building-a-code-knowledge-graph-for-ai-agents&#34; class=link_owner&gt;&#xA;  Building a Code Knowledge Graph for AI Agents&#xA;  &lt;a href=&#34;#building-a-code-knowledge-graph-for-ai-agents&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;how-i-rebuilt-codegraph-in-rust-to-give-ai-coding-assistants-a-semantic-map-of-your-codebase&#34; class=link_owner&gt;&#xA;  How I rebuilt codegraph in Rust to give AI coding assistants a semantic map of your codebase&#xA;  &lt;a href=&#34;#how-i-rebuilt-codegraph-in-rust-to-give-ai-coding-assistants-a-semantic-map-of-your-codebase&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;There&amp;rsquo;s a fundamental tension at the heart of agentic coding today. AI models are remarkably good at writing code, but they&amp;rsquo;re surprisingly bad at &lt;em&gt;understanding&lt;/em&gt; the codebase they&amp;rsquo;re writing it in.&lt;/p&gt;&#xA;&lt;p&gt;When you ask Claude, Copilot, or Codex to make a change to your project, the agent does what any new developer would do: it greps around, reads some files, builds a mental model, and starts editing. But unlike a human developer who accumulates understanding over weeks and months, the AI starts from scratch every session. Worse, it&amp;rsquo;s working through a keyhole &amp;ndash; reading files one at a time, piecing together relationships from text patterns, burning context window on exploration before it can even begin the real work.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Vibe Coding</title>
				<link>https://www.grahambrooks.com/post/vibe-coding/</link>
				<pubDate>Sun, 25 Jan 2026 15:18:33 -0700</pubDate>
				<guid>https://www.grahambrooks.com/post/vibe-coding/</guid>
				<description>&lt;p&gt;Vibe Coding is an innovative approach to software development that emphasizes creativity, flow, and emotional engagement in the coding process. It encourages developers to tap into their intuition and passion for coding, fostering a more enjoyable and productive work environment.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-essence-of-vibe-coding&#34; class=link_owner&gt;&#xA;  The Essence of Vibe Coding&#xA;  &lt;a href=&#34;#the-essence-of-vibe-coding&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;At its core, Vibe Coding is about creating a positive and immersive experience while coding. It involves setting the right atmosphere, whether through music, lighting, or workspace arrangement, to enhance focus and inspiration. The goal is to enter a state of &amp;ldquo;flow,&amp;rdquo; where developers are fully absorbed in their work, leading to higher quality code and increased satisfaction.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Pair Programming, Mob Programming, and AI Co-Pilots: A Comparative Analysis</title>
				<link>https://www.grahambrooks.com/post/2023-07-05-pair-mob-programming-ai-co-pilots/</link>
				<pubDate>Wed, 05 Jul 2023 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2023-07-05-pair-mob-programming-ai-co-pilots/</guid>
				<description>&lt;p&gt;Hello there, fellow tech enthusiasts! Today, we dive into a stimulating topic that has been stirring the world of software development: a comparison between pair programming, mob programming, and working with AI co-pilots. Let’s explore how these methodologies play out in real-world development scenarios and see if we can tease out their advantages, disadvantages, and areas of best fit.&lt;/p&gt;&#xA;&lt;h1 id=&#34;pair-programming&#34; class=link_owner&gt;&#xA;  Pair Programming&#xA;  &lt;a href=&#34;#pair-programming&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Pair programming, a well-established practice from the agile development world, involves two developers working together at one workstation. One developer, &amp;ldquo;the driver&amp;rdquo;, writes the code, while the other, &amp;ldquo;the navigator&amp;rdquo;, reviews each line of code as it’s written, providing a fresh perspective and immediate feedback. The two programmers often switch roles.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Working in Interesting Times: Generative AI as Disruptive Tech in Software Development</title>
				<link>https://www.grahambrooks.com/post/2023-07-03-interesting-times-gen-ai/</link>
				<pubDate>Mon, 03 Jul 2023 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2023-07-03-interesting-times-gen-ai/</guid>
				<description>&lt;p&gt;As someone delving into the world of software development, the journey seemed smooth and set. With incremental releases, continuous integration, and agile methodologies, it appeared the path was that of constant and iterative improvement. But just as I started getting comfortable, a seemingly disruptive technology, Generative AI, came into the scene. This turned the world of development upside down, thus making life fascinatingly intriguing.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;This blog post was almost entirely generated with the help of AI Assistant based on the following prompt to explore the possible.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Iteration Zero - the first iteration</title>
				<link>https://www.grahambrooks.com/post/2022-11-25-iteration-zero/</link>
				<pubDate>Fri, 25 Nov 2022 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2022-11-25-iteration-zero/</guid>
				<description>&lt;p&gt;There has been quite a lot of commentary on various social media channels about agile ceremonies and the traps that they often pose to enterprises. if not taken in the context of the value that they provide.&lt;/p&gt;&#xA;&lt;p&gt;This is not a n agile problem. Agile principles are not agile ceremonies. Becoming or being agile is very different from doing agile.&lt;/p&gt;&#xA;&lt;p&gt;Iteration Zero or sprint zero could be considered to be an agile ceremony fraught with the dangers we have seen with other activities that have been brought under the agile umbrella. Just like the other things in this umbrella, like stand-ups, retrospectives, and so on, Iteration Zero is a tool that can be used by a team to delivery value to customers more quickly and with better safety. It is not to applied blindly. There are likely cases and projects where it does not make sense but in today’s web based world it should be more of a decision not to use it.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Kilpse Blogging</title>
				<link>https://www.grahambrooks.com/post/2021-09-11-kilpse-bloging/</link>
				<pubDate>Sat, 11 Sep 2021 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2021-09-11-kilpse-bloging/</guid>
				<description>&lt;p&gt;Interactive web applications are always more appealing than static sites. This blog explores using the &lt;a href=&#34;https://github.com/viebel/klipse&#34;&gt;klipse&lt;/a&gt; plugin to add interactive code snippets to this blog.&lt;/p&gt;&#xA;&lt;p&gt;Very often seeing the output of running code is key. I was really excited when &lt;a href=&#34;http://lighttable.com&#34;&gt;http://lighttable.com&lt;/a&gt; became available . It seems to be a very quiet project these days but the output and value of variables while working on the code is really exciting - especially when writing unit tests. The RED/GREEN refactor loop running as you type is a real boost&lt;/p&gt;</description>
			</item>
			<item>
				<title>User-defined build settings for Bazel builds</title>
				<link>https://www.grahambrooks.com/post/2021-08-30-user-defined-bazel-arguments/</link>
				<pubDate>Mon, 30 Aug 2021 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2021-08-30-user-defined-bazel-arguments/</guid>
				<description></description>
			</item>
			<item>
				<title>Text fingerprints</title>
				<link>https://www.grahambrooks.com/post/2021-06-06-text-fingerprinting/</link>
				<pubDate>Sun, 06 Jun 2021 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2021-06-06-text-fingerprinting/</guid>
				<description></description>
			</item>
			<item>
				<title>Installing built binaries locally with Bazel</title>
				<link>https://www.grahambrooks.com/post/2021-05-31-bazel-local-install/</link>
				<pubDate>Mon, 31 May 2021 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2021-05-31-bazel-local-install/</guid>
				<description></description>
			</item>
			<item>
				<title>Go and Bazel to build containers</title>
				<link>https://www.grahambrooks.com/post/2020-04-05-go-bazel-container/</link>
				<pubDate>Sun, 05 Apr 2020 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2020-04-05-go-bazel-container/</guid>
				<description>&lt;p&gt;Yesterday I spent some time experimenting with building containerized Go applications. Writing a small restful web service in go is really quite straightforward and there are many better examples out there on the web.&lt;/p&gt;&#xA;&lt;p&gt;What was interesting for me was seeing how Bazel supports a typical workflow building and running containerized web services. In this case using a small Go program.&lt;/p&gt;&#xA;&lt;p&gt;Bazel is still relatively new but gaining in popularity. Over the last 6 months or so stability and functionality has really improved. Bazel really shines when combined with a mono-repo approach. For this example the bazel configuration feels more than required to achieve the result.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Technical Health over Technical Debt</title>
				<link>https://www.grahambrooks.com/post/2018-12-27-technical-health-over-technical-debt/</link>
				<pubDate>Thu, 27 Dec 2018 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2018-12-27-technical-health-over-technical-debt/</guid>
				<description>&lt;p&gt;Ward Cunningham is credited with the first use of the team &lt;a href=&#34;http://wiki.c2.com/?ComplexityAsDebt&#34;&gt;Complexity as Debt&lt;/a&gt; or Technical Debt &lt;a href=&#34;https://www.youtube.com/watch?v=pqeJFYwnkjE&#34;&gt;(YouTube video)&lt;/a&gt; as a metaphor poor software implementation. For a software application or system technical debt refers to the internal code quality. We have accrued Technical Debt when the implementation does not match &lt;strong&gt;current&lt;/strong&gt; requirements or when implementation shortcuts lead to complex and coupled code. Over time people have added more and more items to the general bucket of technical debt.&lt;/p&gt;</description>
			</item>
			<item>
				<title></title>
				<link>https://www.grahambrooks.com/post/2018-12-09-of-languages-and-containers/</link>
				<pubDate>Sun, 09 Dec 2018 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2018-12-09-of-languages-and-containers/</guid>
				<description>&lt;p&gt;At the start of my career I worked with fairly dumb terminals and mainframes. Programs were natively compiled but resources were limited and shared with the other users of the system. Shared computing power meant that we favored languages that were efficient typically compiling to binaries.&lt;/p&gt;&#xA;&lt;p&gt;As personal computers made their appearance developers and users had much more computing power at their disposal. That power was reflected in the servers that powered the early internet. With the increase in computing power both memory and CPU meant that less efficient but more effective runtimes could be supported. Java, .NET, Ruby all benefited from this additional power.&lt;/p&gt;</description>
			</item>
			<item>
				<title></title>
				<link>https://www.grahambrooks.com/post/2018-04-29-orchestration-and-choreography/</link>
				<pubDate>Sun, 29 Apr 2018 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2018-04-29-orchestration-and-choreography/</guid>
				<description>&lt;p&gt;Orchestration and Choreography are often discussed as design options for event driven systems. Some use the term interchangeably while others feel that the two are very distinct. I am in the later group in thinking that the two are very distinct and lead to very different implementations and outcomes.&lt;/p&gt;&#xA;&lt;p&gt;When thinking about these two patterns I find it helpful to relate their behaviors to the most popular implementations - music and dance.&lt;/p&gt;</description>
			</item>
			<item>
				<title></title>
				<link>https://www.grahambrooks.com/post/2018-02-17-quantifying-commit-risk/</link>
				<pubDate>Sat, 17 Feb 2018 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2018-02-17-quantifying-commit-risk/</guid>
				<description>&lt;p&gt;Risk is typically expressed as a function of likelihood and severity or impact. Probability is an important factor but this article is about understanding the potential impact of change on a production software environment.&lt;/p&gt;&#xA;&lt;p&gt;All changes carry an element of risk. Key to managing that risk is understanding and quantifying the risks inherent in a change. Not all changes present the same level of risk. A single character change in an HTML file or template is much lower risk than the same level of change in a configuration setting that affects the behavior of the entire application or service. Let assume that each cause a problem. In the first case a error affects a single view. In the later the impact could be the entire application crashes if the configuration setting is unexpected in production.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The path to a million (loc)</title>
				<link>https://www.grahambrooks.com/post/2017-07-07-path-to-a-million/</link>
				<pubDate>Fri, 07 Jul 2017 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2017-07-07-path-to-a-million/</guid>
				<description>&lt;p&gt;Over the last month or so I have been writing some data collection and simple analysis routines for the things we (developers) use every day. The ultimate goal is to have a system that can collect, interpret and recommend actions based on data from source code, version control, build and other systems related to software development. The project is &lt;a href=&#34;http://kuona.io&#34;&gt;kuona&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com&#34;&gt;GitHub&lt;/a&gt; has 1000s of project repositories publicly available. This article is about one of them &lt;a href=&#34;https://github.com/elastic/elasticsearch/&#34;&gt;elasticsearch&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Builder anti-patterns</title>
				<link>https://www.grahambrooks.com/post/2017-06-19-builder-antipatterns/</link>
				<pubDate>Mon, 19 Jun 2017 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2017-06-19-builder-antipatterns/</guid>
				<description></description>
			</item>
			<item>
				<title>Commit History Metrics</title>
				<link>https://www.grahambrooks.com/post/2017-06-15-commit-history-metrics/</link>
				<pubDate>Thu, 15 Jun 2017 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2017-06-15-commit-history-metrics/</guid>
				<description>&lt;p&gt;For the last few years I have been very interested in what we can learn about our software development processes by looking at the data generated by the tools that we use to manage and deploy our work. This work started the Kuona project (Kuona is the &lt;a href=&#34;https://en.wikipedia.org/wiki/Shona_people&#34;&gt;shona&lt;/a&gt; word &amp;ldquo;To see..&amp;rdquo; &lt;a href=&#34;http://kuona.io&#34;&gt;http://kuona.io&lt;/a&gt;. All the code is open source on github &lt;a href=&#34;https://github.com/kuona&#34;&gt;https://github.com/kuona&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Initial work focused on creating a dashboard from gathered metrics. Building full stack meant great flexibility but a lot of work and finding time for that work challenging with busy schedules. Over the past couple of weeks I have been working on feeding data from the collectors into &lt;a href=&#34;https://www.elastic.co/products/elasticsearch&#34;&gt;elasticsearch&lt;/a&gt; and then using &lt;a href=&#34;https://www.elastic.co/products/kibana&#34;&gt;kibana&lt;/a&gt; to visualise the collected data.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Defending the Domain Model</title>
				<link>https://www.grahambrooks.com/post/2017-06-06-defending-the-domain-model/</link>
				<pubDate>Tue, 06 Jun 2017 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2017-06-06-defending-the-domain-model/</guid>
				<description>&lt;p&gt;Creating useful software models that represent the buisness they serve is hard. Creating a single model for a business at a point in time might be possible but as the business changes models need to be continually updated. Because these models are hard to produce and require a lot of analysis keeping them up to date becomes an impossibility. One model just can’t keep up with business reality.&lt;/p&gt;&#xA;&lt;p&gt;Domain Driven Design (DDD) offers an alternate approach. By decomposing systems around bounded contexts and domains the models we produce are not only simpler because the capture less of the overall business domain but they are also optimized for a particular context. Each domain maintains its own models. Changes to a domain should have little or no impact on another domain.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Testing Logging</title>
				<link>https://www.grahambrooks.com/post/2017-05-26-testing-logging/</link>
				<pubDate>Fri, 26 May 2017 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2017-05-26-testing-logging/</guid>
				<description>&lt;p&gt;As a developer I recognise the importance of generating logs for the systems that I help design and develop. At the outset often everyone recognizes the importance of logging but somehow it’s very difficult to engage stake-holders in requirements.&lt;/p&gt;&#xA;&lt;p&gt;Building an application or system is a learning process that involves feedback. Agile software development practices highlight the importance of these feedback cycles with showcases of the developing application. Quite often these ceremonies highlight the functionality delivered and leave little room for conversations around cross functional requirements. For most development projects this is quite reaonable - after all the functionality is what is going to generate revenue. Logging and other cross functional requirements are considered a cost of doing business. This is true for logging as much as other cross cutting concerns.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Templated styles</title>
				<link>https://www.grahambrooks.com/post/2017-05-20-templated-styles/</link>
				<pubDate>Sat, 20 May 2017 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2017-05-20-templated-styles/</guid>
				<description>&lt;p&gt;While developing web applications I have often needed to change the style of one or more elements based on the state of the data model used by the application. I have an inherent aversion to conditionals in views so went looking for other options. I came up with templated styles that works with both server and client side templating systems.&lt;/p&gt;&#xA;&lt;p&gt;The code examples use Angular and can be found &lt;a href=&#34;https://www.grahambrooks.com/examples/templated-styles&#34;&gt;here&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;The example displays a traffic light which has 4 states&lt;/p&gt;</description>
			</item>
			<item>
				<title>Emacs es-mode - REPL experiences for ElasticSearch development</title>
				<link>https://www.grahambrooks.com/post/2016-08-09-elasticsearch-emacs-mode/</link>
				<pubDate>Tue, 09 Aug 2016 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2016-08-09-elasticsearch-emacs-mode/</guid>
				<description>&lt;p&gt;I don’t usually write reviews but I was so deleted by es-mode for&#xA;emacs that I felt compelled to share. If you have worked with REST&#xA;APIs and ElasticSearch in particular you probably have had similar&#xA;experiences of using something to develop queries. Coding in one of&#xA;the client libraries does not provide the interactive experience you&#xA;need to develop quickly and it often becomes a frustrating&#xA;exercise. es-mode takes away a lot of that pain.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Dependency Inversion - Applying the principle</title>
				<link>https://www.grahambrooks.com/post/2016-07-11-dependency-inversion/</link>
				<pubDate>Mon, 11 Jul 2016 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2016-07-11-dependency-inversion/</guid>
				<description></description>
			</item>
			<item>
				<title>The Value of Value Types</title>
				<link>https://www.grahambrooks.com/post/2015-01-25-the-value-of-value-types/</link>
				<pubDate>Sun, 25 Jan 2015 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2015-01-25-the-value-of-value-types/</guid>
				<description>&lt;p&gt;In domain driven design (DDD) we talk a lot about entities; objects that have identity and lifetimes that typically outlive their values. e.g. An account lives longer than the email address, name, postal address etc. Value types might be mentioned in discussion but then quickly fade. This is a shame because they are the fundamental building blocks, after all they hold the application data. One reason for this lack of attention is that we have some pretty powerful substitutes already supported by our implementation languages - int, double, string. But is that really good enough?&lt;/p&gt;</description>
			</item>
			<item>
				<title>Build Analytics - better development understanding</title>
				<link>https://www.grahambrooks.com/post/2015-01-19-build-analytics/</link>
				<pubDate>Mon, 19 Jan 2015 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2015-01-19-build-analytics/</guid>
				<description>&lt;p&gt;Working with small teams is a lot of fun and I find it fairly easy to&#xA;keep track of what is happening with version control and build&#xA;systems. Errors and failures don&amp;rsquo;t come up that often and when they do&#xA;they can quite often get solved there and then. On larger projects or&#xA;working in a large organisation it&amp;rsquo;s impossible to keep track of&#xA;everything. There are too many moving parts and changes. Incidents are&#xA;more frequent and their impact much larger. A broken build or build&#xA;system can affect 10s or 100s of people. For these larger development&#xA;projects I find I have to collect and chart data, looking for tends&#xA;and anomalies and then delve deeper into the data if and systems if&#xA;there are problems.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Container-less web apps</title>
				<link>https://www.grahambrooks.com/post/2014-04-07-container-less-web-applications/</link>
				<pubDate>Mon, 07 Apr 2014 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2014-04-07-container-less-web-applications/</guid>
				<description>&lt;p&gt;In his keynote&#xA;&lt;a href=&#34;http://nealford.com/abstracts.html#water&#34;&gt;&amp;lsquo;This is water&amp;rsquo;&lt;/a&gt; Neal Ford&#xA;talks about &amp;ldquo;Yesterday&amp;rsquo;s best practices become tomorrow&amp;rsquo;s&#xA;anti-patterns&amp;rdquo;. This seems to be the case for application servers&#xA;like WebSphere, WebLogic and JBoss.&lt;/p&gt;&#xA;&lt;p&gt;When these containers started to become popular (typically in large&#xA;enterprises) servers took a long time to commission and&#xA;configure. Containers were a way of deploying applications more&#xA;quickly and with greater safety. But time change and today&amp;rsquo;s patterns&#xA;and teams favour lighter weight, nimble solutions. Our ability to&#xA;manage servers and networks through code is one of the key drivers for&#xA;this change.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Service IoC containers</title>
				<link>https://www.grahambrooks.com/post/2014-04-07-service-ioc-containers/</link>
				<pubDate>Mon, 07 Apr 2014 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2014-04-07-service-ioc-containers/</guid>
				<description>&lt;p&gt;How can we get the benefits of IoC containers at a higher level - the&#xA;services that we deploy into environments? Typical service tiers are&#xA;implemented with a fronting load balancer that allocates servers to&#xA;satisfy requests. Applications or services that need these services&#xA;are give domain or IP information of the load balancers and the load&#xA;balancers are given details of the servers running instances of the&#xA;services that they need. Essentially each system with dependencies&#xA;&lt;em&gt;new&lt;/em&gt;s an instance of its dependencies. Inverting this dependency&#xA;requires a container but it leads to some interesting advantages.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Team Distribution Models and Conways Law</title>
				<link>https://www.grahambrooks.com/post/2014-03-31-team-distribution-models/</link>
				<pubDate>Mon, 31 Mar 2014 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2014-03-31-team-distribution-models/</guid>
				<description>&lt;p&gt;If Conway&amp;rsquo;s law applies the how we set up and organise teams should&#xA;either be aligned to the architecture of the applicaiton or system&#xA;being developed or application/system architecture will shift to match&#xA;the team structure.&lt;/p&gt;&#xA;&lt;h2 id=&#34;conways-law&#34; class=link_owner&gt;&#xA;  Conways law&#xA;  &lt;a href=&#34;#conways-law&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;organizations which design systems &amp;hellip; are constrained to produce designs which are copies of the communication structures of these organizations&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Conway, Melvin E. (April 1968), &amp;ldquo;How do Committees Invent?&amp;rdquo;, Datamation 14 (5): 28–31, retrieved 2009-04-05&lt;/p&gt;</description>
			</item>
			<item>
				<title>lazybuilder v0.3</title>
				<link>https://www.grahambrooks.com/post/2014-02-23-lazybuilder-v0-3/</link>
				<pubDate>Sun, 23 Feb 2014 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2014-02-23-lazybuilder-v0-3/</guid>
				<description>&lt;p&gt;The idea for&#xA;&lt;a href=&#34;https://github.com/grahambrooks/lazybuilder&#34;&gt;lazybuilder&lt;/a&gt; came up&#xA;during a recent coding dojo doing code kata. We were using Vim and a&#xA;separate terminal to run the tests. Switching back and forth between&#xA;two windows when trying to move quickly seemed like a waste of time.&lt;/p&gt;&#xA;&lt;p&gt;There are several tools in this space but most of them work by polling&#xA;for changes or use linux events that are not available on a mac. lazy&#xA;builder uses &lt;a&gt;CoreServices&lt;/a&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>CODE keyboard</title>
				<link>https://www.grahambrooks.com/post/2014-01-28-code-keyboard/</link>
				<pubDate>Tue, 28 Jan 2014 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2014-01-28-code-keyboard/</guid>
				<description>&lt;p&gt;After a long wait &lt;a href=&#34;http://codekeyboards.com&#34; title=&#34;CODE&#xA;keyboard&#34;&gt;CODE keyboard&lt;/a&gt;s are available again and I received mine&#xA;last night. I have to confess that I am a bit of a keyboard junkie. I&#xA;am reluctant to count them all but I am edging into double digits :(.&lt;/p&gt;&#xA;&lt;p&gt;The keyboard arrived nicely packaged inside a larger box with lots of&#xA;packing material to avoid damage in transit. The box containing the&#xA;keyboard itself is minimal but nicely designed.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Cling A C&#43;&#43; REPL?!</title>
				<link>https://www.grahambrooks.com/post/2013-12-19-cling-a-c-repl/</link>
				<pubDate>Thu, 19 Dec 2013 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2013-12-19-cling-a-c-repl/</guid>
				<description>&lt;p&gt;Browsing some blogs recently I came across some interesting C++11&#xA;lambda code and thought it would be cool to try it out for myself. The&#xA;idea of spinning up a project or even putting a new test in an&#xA;existing project did not feel right. Wouldn&amp;rsquo;t a C++ REPL be useful for&#xA;just these occasions?&lt;/p&gt;&#xA;&lt;p&gt;A couple of web searches later turned up &lt;a href=&#34;http://root.cern.ch/drupal/content/cling&#34;&gt;Cling&lt;/a&gt; which seemed to be&#xA;just the thing. There was no distribution for OS X so my first thought&#xA;was to build from source. This is a little more complex than I thought&#xA;it should be. You need to set up a viable llvm development environment&#xA;and run some patches to get cling to compile. I ran into a number of&#xA;problems doing this both on my Mac and on an Ubuntu VM. (compilation,&#xA;linking and version incompatibilities between the repositories). Really&#xA;wished for some CI goodness at that point.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Boost program_options</title>
				<link>https://www.grahambrooks.com/post/2013-12-06-boost-program_options/</link>
				<pubDate>Fri, 06 Dec 2013 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2013-12-06-boost-program_options/</guid>
				<description>&lt;p&gt;I have been spending time recently writing command line apps in&#xA;C++11. Each time I wanted a way of handling command line arguments&#xA;flexibly. I chose to use the boost::program_options library. The&#xA;documentation is pretty good but there are some assumptions (aliased&#xA;namespace) and the example code is broken up with paragraphs of text&#xA;explaining what the code does.&lt;/p&gt;&#xA;&lt;p&gt;When I start to explore an API to a library I start by writing&#xA;tests. After working with the program_options library on a few small&#xA;applications the same pattern came up each time so I thought I would&#xA;share the results as a complete app, although admittedly the app does&#xA;nothing other than accept command line parameters.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Java build tools 2013</title>
				<link>https://www.grahambrooks.com/post/2013-11-15-java-build-tools-2013/</link>
				<pubDate>Fri, 15 Nov 2013 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2013-11-15-java-build-tools-2013/</guid>
				<description>&lt;p&gt;I am about to embark on a new Java project so I thought I would take a&#xA;look at the current state of build tools for Java projects. First I&#xA;thought I would draw up some assessment criteria to use as a loose&#xA;guide. This is what I came up with:&lt;/p&gt;&#xA;&lt;p&gt;Fast&lt;/p&gt;&#xA;&lt;p&gt;I want a build tool that spends as much time as possible building my&#xA;application and not setting itself up to perform the task.&lt;/p&gt;</description>
			</item>
			<item>
				<title>ci console 0.0.2 released</title>
				<link>https://www.grahambrooks.com/post/2013-10-12-ci-console-0-0-2-released/</link>
				<pubDate>Sat, 12 Oct 2013 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2013-10-12-ci-console-0-0-2-released/</guid>
				<description>&lt;p&gt;I like to commit code frequently when working on a project. I also&#xA;like to use the command line for building, testing and committing&#xA;code. So I thought it would be nice to have a way to check the build&#xA;status from the command line. I have been wanting to write something&#xA;in C++11 and a small lightweight command line tool seemed like a good&#xA;opportunity.&lt;/p&gt;&#xA;&lt;p&gt;My efforts can be found here &lt;a href=&#34;https://github.com/grahambrooks/ci/&#34;&gt;https://github.com/grahambrooks/ci/&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Zero Down-time - relational databases</title>
				<link>https://www.grahambrooks.com/post/2013-08-29-zero-down-time-relational-databases/</link>
				<pubDate>Thu, 29 Aug 2013 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2013-08-29-zero-down-time-relational-databases/</guid>
				<description>&lt;p&gt;Continuous Deployment is the act of automatically deploying an&#xA;application every time the build is successful. I am currently working&#xA;with a development team that is working towards continuous deployment&#xA;as part of their continuous delivery adoption plans. The system&#xA;involves several internal web services which seemed like a good place&#xA;to start working on not only automating the deployments but&#xA;maintaining a very high degree of up-time during those&#xA;deployments. Automating deployments involves both development and&#xA;techops groups so I thought I would search for some worked examples&#xA;that would help illustrate the techniques and steps required. I found&#xA;several blogs and articles talking about different approaches but no&#xA;worked examples.&lt;/p&gt;</description>
			</item>
			<item>
				<title>word-finder</title>
				<link>https://www.grahambrooks.com/post/2013-08-13-word-finder/</link>
				<pubDate>Tue, 13 Aug 2013 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2013-08-13-word-finder/</guid>
				<description>&lt;p&gt;Following up on the [next_permutation]({% post_url 2013-08-03-next_permutation %}) from a&#xA;couple of weeks ago&#xA;&lt;a href=&#34;https://github.com/grahambrooks/word-finder&#34;&gt;word finder&lt;/a&gt; uses&#xA;next_permutation to find words in character sequences. Uses the&#xA;&lt;a href=&#34;http://aspell.net&#34;&gt;aspell&lt;/a&gt; C api to look up each&#xA;permutation. Searching for 3,4,5 and 6 character words in a 6&#xA;character sequence takes about 200ms.&lt;/p&gt;&#xA;&lt;p&gt;Using C++11 meant that I could use a nice lambda expression to process each permutation by passing the function object to the permute() function.&lt;/p&gt;</description>
			</item>
			<item>
				<title>What&#39;s in a name?</title>
				<link>https://www.grahambrooks.com/post/2013-08-10-whats-in-a-name/</link>
				<pubDate>Sat, 10 Aug 2013 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2013-08-10-whats-in-a-name/</guid>
				<description>&lt;p&gt;Graham Brooks: Architect, Software Engineer&lt;/p&gt;&#xA;&lt;p&gt;Over the years I have been described as a programmer, analyst programmer, software developer, software engineer and many other derivation of software X professional. For most of the time it has not seemed to be important. Recently though I have started to wonder how these names might affect the way software professionals see their role and perhaps how they view themselves.&lt;/p&gt;&#xA;&lt;p&gt;In certain countries and regions the term engineer has more special&#xA;definition. &lt;a href=&#34;https://en.wikipedia.org/wiki/Software_engineering&#34;&gt;Wikipedia&lt;/a&gt;&#xA;emphasizes the method or approach to developing software. In Europe&#xA;the term infers that someone has undergone formal training and&#xA;attained a status through examination or peer election to a learned&#xA;society.&lt;/p&gt;</description>
			</item>
			<item>
				<title>next_permutation</title>
				<link>https://www.grahambrooks.com/post/2013-08-03-next_permutation/</link>
				<pubDate>Sat, 03 Aug 2013 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2013-08-03-next_permutation/</guid>
				<description>&lt;p&gt;Working on a small program recently I found a quirk in&#xA;next_permutation. The prorgam read a sequence of characters from the&#xA;command line and then tried to find words by testing each&#xA;permuation. For a sequence of 3 characters there are 6 permutations.&lt;/p&gt;&#xA;&lt;p&gt;Most of the online examples look something like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;vector&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;sc&#34;&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;auto&lt;/span&gt; &lt;span class=&#34;nl&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;next_permutation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;begin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;p&gt;Which produces:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;abc&#xA;acb&#xA;bac&#xA;bca&#xA;cab&#xA;cba&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;No surprises but when I cam to process input like &amp;lsquo;bac&amp;rsquo; the number of&#xA;permutations found were far too small.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Emacs Sharing</title>
				<link>https://www.grahambrooks.com/post/2013-07-25-emacs-sharing/</link>
				<pubDate>Thu, 25 Jul 2013 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2013-07-25-emacs-sharing/</guid>
				<description>&lt;p&gt;I like Emacs. Some people like VI(M) but emacs has been in my toolbox for a long time and I feel very at home working with it.&lt;/p&gt;&#xA;&lt;p&gt;Updating the editor has become easier over the years and installing an update is a simple matter of drag and on my Mac. But I use several computers and keeping each in sync with my current favorite settings was becoming a problem.&lt;/p&gt;&#xA;&lt;p&gt;I recently came up with the idea of using Dropbox to share a single configuration file set for all the computers I use.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Campaign for better IO</title>
				<link>https://www.grahambrooks.com/post/2013-03-03-campaign-for-better-io/</link>
				<pubDate>Sun, 03 Mar 2013 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2013-03-03-campaign-for-better-io/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://www.grahambrooks.com/blog/wp-content/uploads/2013/03/keyboards.png&#34;&gt;&lt;img class=&#34;alignnone size-medium wp-image-487&#34; alt=&#34;keyboards&#34; src=&#34;http://www.grahambrooks.com/blog/wp-content/uploads/2013/03/keyboards-300x70.png&#34; width=&#34;300&#34; height=&#34;70&#34; /&gt;&lt;/a&gt;&#xA;Over the last 30 years I have used a lot of computers ranging from teletypes to laptops. I have also visited a lot of offices and seen the standard keyboards that people are using on a daily basis. In my opinion it is time for an upgrade. We humans interact with computers through keyboards, mice and screens and yet quite often these are afterthoughts. Keyboards and mice can be bought very cheaply and naturally suppliers opt for these when putting together a package.&lt;/p&gt;</description>
			</item>
			<item>
				<title>All truth</title>
				<link>https://www.grahambrooks.com/post/2013-02-14-all-truth/</link>
				<pubDate>Thu, 14 Feb 2013 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2013-02-14-all-truth/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;All truth passes through three stages. First, it is&#xA;ridiculed. Second, it is violently opposed.  Third, it is accepted&#xA;as being self-evident.&amp;rdquo;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Arthur Schopenhauer, German philosopher (1788 – 1860)&lt;/p&gt;</description>
			</item>
			<item>
				<title>If</title>
				<link>https://www.grahambrooks.com/post/2013-02-14-if/</link>
				<pubDate>Thu, 14 Feb 2013 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2013-02-14-if/</guid>
				<description>&lt;p&gt;Quotes: Things that inspire and be remembered&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;If you can dream - and not make dreams your master; If you can&#xA;think - and not make thoughts your aim; If you can meet with&#xA;Triumph and Disaster And treat those two impostors just the&#xA;same;&amp;quot;&lt;/blockquote&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.kipling.org.uk/poems_if.htm&#34;&gt;Kipling&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>I can&#39;t believe I missed this!</title>
				<link>https://www.grahambrooks.com/post/2013-02-06-i-cant-believe-i-missed-this/</link>
				<pubDate>Wed, 06 Feb 2013 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2013-02-06-i-cant-believe-i-missed-this/</guid>
				<description>&lt;p&gt;Just over 20 years ago&#xA;&lt;a href=&#34;http://www.bleading-edge.com/Publications/list.htm&#34;&gt;Jack W. Reeves&lt;/a&gt;&#xA;wrote an article in the C++ Journal entitled &amp;ldquo;What is Software&#xA;Design?&amp;rdquo; and I missed it. Not only that but no one thought to point&#xA;out that I was missing a very important article. An article that&#xA;challenged and changed/clarified my mental model of software design&#xA;and construction - 20 years after it was published. A copy of the&#xA;original article can be found&#xA;&lt;a href=&#34;http://www.developerdotstar.com/mag/articles/reeves_design.html&#34;&gt;here&lt;/a&gt;. I&#xA;guess it is better late than never and it demonstrates that some&#xA;things stay relevant and important. Sometimes they remain&#xA;controversial.&lt;/p&gt;</description>
			</item>
			<item>
				<title>DRYing out code</title>
				<link>https://www.grahambrooks.com/post/2012-12-31-drying-out-code/</link>
				<pubDate>Mon, 31 Dec 2012 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2012-12-31-drying-out-code/</guid>
				<description>&lt;p&gt;Removing duplicate code is a great way to improve the internal quality&#xA;of your application code. Duplications mean that you have more code&#xA;than you should and are often the source of more subtle bugs of the&#xA;&amp;ldquo;I&amp;rsquo;ve already fixed that ..&amp;rdquo; variety.&lt;/p&gt;&#xA;&lt;p&gt;While working on a scriptable command line tool for Java (see &lt;a&#xA;href=&#34;http://www.grahambrooks.com/blog/autmated-refactoring-for-library-updates/&#34;&#xA;title=&#34;Automated refactoring for library updates&#34;&gt;Automated&#xA;refactoring for library updates&lt;/a&gt;) I discovered a neat way of&#xA;identifying duplications at the method and block level.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Integrating GPUs in Application Development - From Concept to Deployment</title>
				<link>https://www.grahambrooks.com/post/2012-12-24-integrating-gpus-in-application-development-from-concept-to-deployment/</link>
				<pubDate>Mon, 24 Dec 2012 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2012-12-24-integrating-gpus-in-application-development-from-concept-to-deployment/</guid>
				<description>&lt;p&gt;This post is a little overdue :(&lt;/p&gt;&#xA;&lt;p&gt;In June I presented at &lt;a&#xA;href=&#34;http://qconnewyork.com/qcon-nyc-2012/&#34;&gt;QCon NYC&lt;/a&gt; on using&#xA;GPUs. It was a great chance to catch up on all the changes to C and&#xA;C++ that I have missed out on in recent years. You can catch up on the&#xA;presentation over on &lt;a title=&#34;Integrating GPUs in Application&#xA;Development - From Concept to Deployment&#34;&#xA;href=&#34;http://www.infoq.com/presentations/GPU-Application&#34;&#xA;target=&#34;_blank&#34;&gt;InfoQ&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;The source code used in the presentation is on github &lt;a&#xA;href=&#34;https://github.com/grahambrooks/qcon-ctod&#34;&gt;&lt;a href=&#34;https://github.com/grahambrooks/qcon-ctod&#34;&gt;https://github.com/grahambrooks/qcon-ctod&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Automated refactoring for library updates</title>
				<link>https://www.grahambrooks.com/post/2012-07-23-autmated-refactoring-for-library-updates/</link>
				<pubDate>Mon, 23 Jul 2012 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2012-07-23-autmated-refactoring-for-library-updates/</guid>
				<description>&lt;p&gt;After watching&#xA;&lt;a href=&#34;http://youtu.be/mVbDzTM21BQ&#34;&gt;Clang MapReduce &amp;ndash; Automatic C++ Refactoring at Google Scale&lt;/a&gt;&#xA;I was struck with the idea that this could help with the upgrade&#xA;problem. Almost every application uses libraries. Those libraries need&#xA;to be updated from time but each time they are updated all the code&#xA;using those libraries also needs to be updated. For development teams&#xA;finding time to upgrade to the latest libraries against competing&#xA;functional updates is challenging.  What if as part of the release a&#xA;set of refactoring commands or programs accompanied the&#xA;libraries. These refactoring scripts would automatically update the&#xA;consuming application code to use the new libraries saving time and&#xA;money.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Metrics based Refactoring for cleaner code</title>
				<link>https://www.grahambrooks.com/post/2012-01-02-metrics-based-refactoring-for-cleaner-code/</link>
				<pubDate>Mon, 02 Jan 2012 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2012-01-02-metrics-based-refactoring-for-cleaner-code/</guid>
				<description>&lt;p&gt;Refactoring is a key practice to improved code hygiene. Making&#xA;refactoring part of your next project is one thing but if you have&#xA;just joined a team or project with a significant amount of debt how do&#xA;you work on making things better? Over the last few months I have been&#xA;assessing a number of code-bases and speaking about technical debt&#xA;management. While preparing for these engagements I realized that&#xA;combining two code and project metrics could be used to help focus&#xA;efforts on code that would deliver the most benefit. Toxicity is a&#xA;combined measurement of static code analysis metrics. Volatility a&#xA;measure of changes made to files within a code-base over time. By&#xA;combining these two measures we can create a source file scatter chart&#xA;correlating toxicity against volatility.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Oh My ZSH shell productivity</title>
				<link>https://www.grahambrooks.com/post/2011-12-27-oh-my-zsh/</link>
				<pubDate>Tue, 27 Dec 2011 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2011-12-27-oh-my-zsh/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://github.com/robbyrussell/oh-my-zsh&#34;&gt;oh-my-zsh&lt;/a&gt; is framework&#xA;for managing zsh configuration. The default configuration adds some&#xA;interesting enhancements.&lt;/p&gt;&#xA;&lt;p&gt;The following shows all the Java files in the current and sub&#xA;directories.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;ls **/*.java&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Ryan Bates has a nice&#xA;&lt;a href=&#34;http://railscasts.com/episodes/308-oh-my-zsh&#34;&gt;Railscast&lt;/a&gt; episode&#xA;covering oh-my-zsh&lt;/p&gt;&#xA;&lt;p&gt;I have been using oh-my-zsh for the last couple of weeks. The GIT&#xA;enhancement showing the current git branch in the prompt is a nice&#xA;useful and elegant enhancement.&lt;/p&gt;</description>
			</item>
			<item>
				<title>AgileDC - Introduction to Continuous Delivery</title>
				<link>https://www.grahambrooks.com/post/2011-10-27-agiledc-introduction-to-continuous-delivery/</link>
				<pubDate>Thu, 27 Oct 2011 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2011-10-27-agiledc-introduction-to-continuous-delivery/</guid>
				<description>&lt;p&gt;Yesterday I presented a talk entitled &lt;em&gt;Introduction to Continuous&#xA;Delivery&lt;/em&gt; at &lt;a href=&#34;http://agiledc.org/&#34;&gt;AgileDC&lt;/a&gt;. The audience was great&#xA;and the room packed which is always a recipe for success. I really&#xA;enjoyed talking about Continuous Delivery and there were some really&#xA;interesting questions.&lt;/p&gt;&#xA;&lt;p&gt;As promised I have uploaded the slides from the presentation to &lt;em&gt;broken link&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;As I mentioned yesterday &lt;a href=&#34;http://jezhumble.net/&#34;&gt;Jez&#xA;Humble&lt;/a&gt; was kind enough to donate his slides from which I borrowed&#xA;shamelessly.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Agile DC</title>
				<link>https://www.grahambrooks.com/post/2011-10-25-agile-dc/</link>
				<pubDate>Tue, 25 Oct 2011 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2011-10-25-agile-dc/</guid>
				<description>&lt;p&gt;I am really syched about talking at &lt;a href=&#34;http://agiledc.org/&#34;&gt;AgileDC&lt;/a&gt;&#xA;tomorrow. The topic of my talk is an Introduction to&#xA;&lt;a href=&#34;http://continuousdelivery.com/&#34;&gt;Continuous Delivery&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Encapsulating Databases</title>
				<link>https://www.grahambrooks.com/post/2011-08-11-encapsulating-databases/</link>
				<pubDate>Thu, 11 Aug 2011 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2011-08-11-encapsulating-databases/</guid>
				<description>&lt;p&gt;Small systems grow with success. As these systems grow they often take&#xA;on more and more functionality either directly into the main system&#xA;component or into sub-systems. As the systems grow in complexity and&#xA;responsibility their database requirements grow at a similar rate&#xA;become more and more complex.&lt;/p&gt;&#xA;&lt;p&gt;In these complex systems each component needs to not only have access&#xA;to data but also to transitive data generated by other&#xA;components. This need often leads to &lt;em&gt;the&lt;/em&gt; database becoming the&#xA;inter-component communication channel.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Insulating against failure using Caching Reverse Proxies</title>
				<link>https://www.grahambrooks.com/post/2011-07-07-insulating-against-failure-using-caching-reverse-proxies/</link>
				<pubDate>Thu, 07 Jul 2011 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2011-07-07-insulating-against-failure-using-caching-reverse-proxies/</guid>
				<description>&lt;p&gt;Reverse proxies have been around for a very long time and depending on&#xA;your application either interesting additions or a key element to your&#xA;architecture.&lt;/p&gt;&#xA;&lt;p&gt;Despite their long history I was recently reminded of some interesting&#xA;applications of Caching reverse proxies that are worth revisiting.&lt;/p&gt;&#xA;&lt;p&gt;First lets look at a fairly typical configuration where a caching&#xA;reverse proxy is fronting some sort of web application. The web&#xA;application exposes its functionality on one port (say 8080) and the&#xA;proxy connects to this port for in-bound HTTP requests (say on port&#xA;80). The application responds with the data matching the request and&#xA;if cacheable the proxy stores a copy of that content in its&#xA;cache. There are lots of other paths - typically around failure and&#xA;different responses but essentially the proxy acts as a pipe between&#xA;the Internet and the application.&lt;/p&gt;</description>
			</item>
			<item>
				<title>asciidoc experiments</title>
				<link>https://www.grahambrooks.com/post/2011-06-26-asciidoc-experiments/</link>
				<pubDate>Sun, 26 Jun 2011 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2011-06-26-asciidoc-experiments/</guid>
				<description>&lt;p&gt;I have always been interested in text processing systems. This is&#xA;probably rooted in the time that I discovered computing and&#xA;programming. At that time the state of the art was ROFF (T)ROFF and a&#xA;whole family of plain text processing engines that produced nicely&#xA;formatted output.&lt;/p&gt;&#xA;&lt;p&gt;With the advent of word processing applications the emphasis moved&#xA;away from plain test precessing systems to more sophisticated systems&#xA;involving opaque binary formats. More recently the use of binary&#xA;formats has fallen out of favor and many word processing systems now&#xA;provide a level of interoperability with other systems though more open&#xA;document formats.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Open Source project durations</title>
				<link>https://www.grahambrooks.com/post/2011-04-28-open-source-project-durations/</link>
				<pubDate>Thu, 28 Apr 2011 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2011-04-28-open-source-project-durations/</guid>
				<description>&lt;p&gt;During a recent discussion about open source development we wondered&#xA;how long these projects lasted. In particular if there was a rapid&#xA;drop off in activity.&lt;/p&gt;&#xA;&lt;p&gt;One of the great things about recent open source code repositories is&#xA;that they often provide APIs allowing this sort of analysis. The chart&#xA;below was generated from a sample of 2360 public&#xA;&lt;a href=&#34;http://www.github.com&#34;&gt;GitHub&lt;/a&gt; repositories. I took the started&#xA;pushed-at and created-at dates to calculate how many days a repository&#xA;had been worked on. I then grouped them together into 30 day&#xA;increments and charted the count in each 30 day period.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Stabilizing Velocity</title>
				<link>https://www.grahambrooks.com/post/2011-03-26-stabilizing-velocity/</link>
				<pubDate>Sat, 26 Mar 2011 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2011-03-26-stabilizing-velocity/</guid>
				<description>&lt;p&gt;I came across this post by Michael Norton and thought I would reference it here: &lt;a href=&#34;http://www.docondev.com/2011/03/stabilizing-velocity.html&#34;&gt;Stabilising Velocity&lt;/a&gt; Michael makes some keen observations on both causes and effects of unstable velocity.&lt;/p&gt;&#xA;&lt;p&gt;Predictable velocity is a key agile planning metric. There is an implicit assumption in agile planning that this iterations velocity will be similar to the last iteration. Without this predicability it is very difficult, if not impossible, to provide and sort of forecast.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Create MySQL database with Capistrano</title>
				<link>https://www.grahambrooks.com/post/2011-01-24-create-mysql-database-with-capistrano/</link>
				<pubDate>Mon, 24 Jan 2011 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2011-01-24-create-mysql-database-with-capistrano/</guid>
				<description>&lt;p&gt;I was playing about with &lt;a href=&#34;https://github.com/capistrano/capistrano&#34;&gt;Capistrano&lt;/a&gt; over&#xA;the weekend. I wanted to automate the deployment of a Rails&#xA;application to my server. The server was (I thought) just about ready&#xA;to accept the app but I did not want to go through another manual&#xA;deployment. I thought I would take the opportunity to script the&#xA;deployment. The first task I set myself was to create a production&#xA;MySQL database. Searching for how to do this threw up lots of&#xA;interesting information about building and deploying database.yml&#xA;files, but not much about configuring MySQL. The first set of tasks I&#xA;came up with were:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Rake db:migrate MySQL gem dependency</title>
				<link>https://www.grahambrooks.com/post/2011-01-24-rake-dbmigrate-mysql-gem-dependency/</link>
				<pubDate>Mon, 24 Jan 2011 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2011-01-24-rake-dbmigrate-mysql-gem-dependency/</guid>
				<description>&lt;p&gt;If you have already added &lt;code lang=&#39;ruby&#39;&gt;gem &amp;lsquo;mysql2&amp;rsquo;&lt;/code&gt; to&#xA;your Gemfile but get a message saying that it is missing when you try&#xA;to migrate&lt;/p&gt;&#xA;&lt;p&gt;Make sure that you have installed libmysql-ruby&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo apt-get install libmysql-ruby&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;This one caught me out on the weekend and it took a while to work out&#xA;what was going on. I am guessing that not having libmysql-ruby&#xA;installed caused the gem to incorrectly advertise that it was not&#xA;available. I did not get any errors when installing the mysql2 gem&#xA;which is strange.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Five Ws sitting on a bench</title>
				<link>https://www.grahambrooks.com/post/2011-01-22-five-ws-sitting-on-a-bench/</link>
				<pubDate>Sat, 22 Jan 2011 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2011-01-22-five-ws-sitting-on-a-bench/</guid>
				<description>&lt;p&gt;Over the past year I have been involved in preparing quite a few&#xA;documents, proposals, presentations etc. I have also been asked to&#xA;review quite a few of these documents. As an author or reviewer I like&#xA;test what I am working on against 5 Ws and one H to see if the&#xA;important aspects have been covered. The&#xA;&lt;a href=&#34;http://en.wikipedia.org/wiki/Five_Ws&#34;&gt;Wikipedia&lt;/a&gt; article provides a&#xA;good background and history, including the 1902 reference to&#xA;&lt;a href=&#34;http://en.wikipedia.org/wiki/Rudyard_Kipling&#34;&gt;Rudyard Kipling&lt;/a&gt;&#xA;&lt;a href=&#34;http://en.wikipedia.org/wiki/Just_So_Stories%22&#34;&gt;Just So Stories&lt;/a&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Pulse Camp 1.0 and RHoK</title>
				<link>https://www.grahambrooks.com/post/2011-01-07-pulse-camp-1-0-and-rhok/</link>
				<pubDate>Fri, 07 Jan 2011 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2011-01-07-pulse-camp-1-0-and-rhok/</guid>
				<description>&lt;p&gt;One of the great things about working at a consultancy is that I get to meet a wide range of interesting clients with interesting problems that need solving. One of the most interesting for me was &lt;a href=&#34;http://www.unglobalpulse.org/blog/pulse-camp-and-beyond&#34;&gt;Pulse Camp 1.0&lt;/a&gt;, a 3 day event to start defining a system framework that can help NGOs and other groups make better informed decisions based on real-time data.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;http://www.unglobalpulse.org/&#34;&gt;UN Global Pulse&lt;/a&gt; initiative is in the early stages of development but the excitement, participation and drive I experienced at Pulse Camp 1.0 fills me with hope that this ambitious program of work will be successful.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The new Mac App Store</title>
				<link>https://www.grahambrooks.com/post/2011-01-07-the-new-mac-app-store/</link>
				<pubDate>Fri, 07 Jan 2011 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2011-01-07-the-new-mac-app-store/</guid>
				<description>&lt;p&gt;When Apple announced the new App Store for OS X I have to say I was a little underwhelmed at the prospect and did not think the new store would hold much interest. After all I have been pretty happy with finding and installing apps. I could see the point for the iPhone and iPad but for my laptop?&lt;/p&gt;&#xA;&lt;p&gt;So with today&amp;rsquo;s updates came the new App Store application and out of general interest in what has been updated and installed I decided to take the app for spin.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Emacs Package manager</title>
				<link>https://www.grahambrooks.com/post/2010-12-24-emacs-package-manager/</link>
				<pubDate>Fri, 24 Dec 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-12-24-emacs-package-manager/</guid>
				<description>&lt;p&gt;I have a long history with text editors and I have always been&#xA;facinated with the different flavours of interfaces and&#xA;capabilities. After working my way through ED and then VI&#xA;&lt;a href=&#34;http://www.gnu.org/software/emacs/&#34;&gt;Emacs&lt;/a&gt; was a bit of a&#xA;revalation. I found myself idle for a few minutes this morning and&#xA;thought I would do some editor maintenance and install haml-mode into&#xA;my copy of Emacs. While surfing around I came across the&#xA;&lt;a href=&#34;http://tromey.com/elpa/install.html&#34;&gt;Emacs Lisp Package Archive&lt;/a&gt;&#xA;which made the installation a breeze and I then found myself&#xA;installing all sorts of other additions that might be useful in the&#xA;future.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Progressive Enhancement</title>
				<link>https://www.grahambrooks.com/post/2010-12-24-progressive-enhancement/</link>
				<pubDate>Fri, 24 Dec 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-12-24-progressive-enhancement/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Progressive_enhancement&#34;&gt;Progressive Enhancement&lt;/a&gt;&#xA;is a web development technique or pattern. The basic premise is that a&#xA;web site should be accessible to all users and then to overlay&#xA;additional functionality based on the client&amp;rsquo;s capability.&lt;/p&gt;&#xA;&lt;p&gt;Web technologies and good web development practices over the last few&#xA;years had encouraged this approach. Popular web sites delivery&#xA;semantic HTML to allow screen readers and other client devices to&#xA;understand the content of being delivered. Advances in both browser&#xA;capabilities and CSS have encouraged this and the use of inline styles&#xA;has reduced over time. The advent of JavaScript libraries that hide&#xA;browser compatibility problems have made the development of&#xA;progressively enhanced content easier to achieve.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Haml</title>
				<link>https://www.grahambrooks.com/post/2010-12-19-haml/</link>
				<pubDate>Sun, 19 Dec 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-12-19-haml/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://haml-lang.com/editors.html&#34;&gt;Haml&lt;/a&gt; is a markup language for generating xml and other markup - most&#xA;popularly HTML. Over the past few weeks I have been writing a few&#xA;&lt;a href=&#34;http://rubyonrails.org/&#34;&gt;Ruby on Rails&lt;/a&gt; applications and chose Haml&#xA;as the templating language. For someone who has traditionally avoided&#xA;positional languages this was a strange choice. Having written a few&#xA;simple applications I find that the writing HTML in Haml is both&#xA;straightforward and intuitive. Good HTML is naturally hierarchical and&#xA;having this structure both encouraged and enforced in Haml feels&#xA;right.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Watching the white horses on the Hudson ...</title>
				<link>https://www.grahambrooks.com/post/2010-12-12-watching-the-white-horses-on-the-hudson/</link>
				<pubDate>Sun, 12 Dec 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-12-12-watching-the-white-horses-on-the-hudson/</guid>
				<description>&lt;p&gt;Watching the white horses on the Hudson today and wondering why I am flying on a day like today.&lt;/p&gt;</description>
			</item>
			<item>
				<title>A good day of discussions in Chicago tod...</title>
				<link>https://www.grahambrooks.com/post/2010-11-16-a-good-day-of-discussions-in-chicago-tod/</link>
				<pubDate>Tue, 16 Nov 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-11-16-a-good-day-of-discussions-in-chicago-tod/</guid>
				<description>&lt;p&gt;A good day of discussions in Chicago today. Although I should say yesterday given the time.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Test Driven Talks</title>
				<link>https://www.grahambrooks.com/post/2010-11-07-test-driven-talks/</link>
				<pubDate>Sun, 07 Nov 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-11-07-test-driven-talks/</guid>
				<description>&lt;p&gt;Taking a leaf out of the XP book and in particular test driven&#xA;development I have had some successes in using this idea when doing a&#xA;presentation. I have dubbed the idea &amp;lsquo;Test driven talks&amp;rsquo;. The basic&#xA;idea is to quickly canvas the audience for things that they would like&#xA;covered during the presentation. Once these have been captured on a&#xA;whiteboard or flip-chart.&lt;/p&gt;&#xA;&lt;p&gt;The next step is to filter the topics in the same way as an agile team&#xA;accepts stories into an iteration it is likely that I wont be able to&#xA;cover all the expectations from the audience. The nice thing about&#xA;this step is that I can manage people&amp;rsquo;s expectations. If I accept a&#xA;question or topic then people should expect me to satisfy them. If I&#xA;reject the topic then people know that I won&amp;rsquo;t be able to satisfy&#xA;their need.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Technology Synergy</title>
				<link>https://www.grahambrooks.com/post/2010-10-20-technology-synergy/</link>
				<pubDate>Wed, 20 Oct 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-10-20-technology-synergy/</guid>
				<description>&lt;p&gt;I started writing this post quite some time ago but never got around&#xA;to wrapping up the loose ends. The article is really a summary of what&#xA;I learnt during a pretty intense media web site development&#xA;project. Since pictures equate to 1000s of words here is my effort to&#xA;express how technologies can work symbiotically to delivery value that&#xA;is more than the sum of their parts.&lt;/p&gt;&#xA;&lt;p&gt;![Technology Synergy]({{ site.url }}/images/technology-synergy.jpg)&lt;/p&gt;&#xA;&lt;p&gt;But since systems are built from parts: here are the parts that we used.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.opensymphony.com/sitemesh/&#34;&gt;Extended SiteMesh&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;SiteMesh is a pretty amazing technology for creating web sites mashups&#xA;– or combining HTML documents on the server. We found that by&#xA;partitioning the content and the parts of the server that delivered&#xA;that content before combining the individual HTML documents together&#xA;using SiteMesh to be extremely effective. The server code for each&#xA;HTML document need only handle the a well defined area but the site&#xA;could be easily reconfigured to aggregate the content for new&#xA;purposes.&lt;/p&gt;&#xA;&lt;h2 id=&#34;in-memory-tests&#34; class=link_owner&gt;&#xA;  In memory tests&#xA;  &lt;a href=&#34;#in-memory-tests&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Think super fast builds, no deployment (in fact no need for a web&#xA;server), pure Java acceptance tests (i.e. refactorable) and the 80/20&#xA;rule on what is good enough to give you confidence that the system&#xA;works.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Post/Redirect/Get&#34;&gt;Post/Redirect/Get pattern&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;We built into the application framework that enforced the PRG&#xA;pattern. POST request handlers could only return a redirect. Any&#xA;database access performed during a GET request worked with a read only&#xA;connection or a connection with an transaction rollback making GET&#xA;requests idempotent.&lt;/p&gt;&#xA;&lt;h2 id=&#34;simple-transaction-boundaries&#34; class=link_owner&gt;&#xA;  Simple transaction boundaries&#xA;  &lt;a href=&#34;#simple-transaction-boundaries&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Transaction boundaries have been enforced so that developers do not&#xA;need to worry about them at all in production code. GET requests run&#xA;in a transaction that will always be rolled back, POST requests will&#xA;always commit if successful and always roll back if an exception is&#xA;thrown. Some serious work went into taming Hibernate so that it did&#xA;not auto commit, had no mutable static state and was completely&#xA;encapsulated.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://microformats.org/wiki/rest/ahah&#34;&gt;AHAH (Asynchronous HTML and HTTP)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;This enables much simpler JavaScript to be written (think JavaScript&#xA;that never needs to replicate the domain model or business rules on&#xA;the client) and allows for complete reuse of server side logic. This&#xA;combined with behaviour CSS bindings (&#xA;&lt;a href=&#34;http://www.bennolan.com/behaviour/&#34;&gt;http://www.bennolan.com/behaviour/&lt;/a&gt; ) leads to NO in-line JavaScript&#xA;nastiness and more semantic html.&lt;/p&gt;&#xA;&lt;h2 id=&#34;no-session-state-just-persistent-documents&#34; class=link_owner&gt;&#xA;  No Session State just persistent documents&#xA;  &lt;a href=&#34;#no-session-state-just-persistent-documents&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The application servers had NO session state, all state changes to&#xA;documents are persisted which leads to a number of advantages: Users&#xA;never loose data they have filled in, marketing can see exactly how&#xA;far a user got before bailing out of a work flow. Users can return to&#xA;incomplete work and complete the tasks. Users can fill in data in any&#xA;order they want and only when they are ready do we action their&#xA;request. Domain objects are only updated once the document has been&#xA;validated.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Progressive_Enhancement&#34;&gt;Progressive Enhancement and Accessibility&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;All stories are played vanilla html version first and a second story&#xA;for JavaScript enhancements. This leads to cleaner simpler semantic&#xA;html and also allows feedback from the first story to be tacked onto&#xA;the second story.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.stringtemplate.org/&#34;&gt;NO Logic in the View&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;We are using StringTemplate to enforce that NO logic can be written in&#xA;the view, plus it&amp;rsquo;s super fast, has no &amp;ldquo;or loops&amp;rdquo; (think ruby each&#xA;blocks).&lt;/p&gt;</description>
			</item>
			<item>
				<title>Testing - what to test when</title>
				<link>https://www.grahambrooks.com/post/2010-10-20-testing-what-to-test-when/</link>
				<pubDate>Wed, 20 Oct 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-10-20-testing-what-to-test-when/</guid>
				<description>&lt;p&gt;After tweeting that I wanted to have suggestions for blog entries I got a single reply asking for my thoughts on DAO and unit testing – essentially asking should DAO be unit tested.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51Ia3QYtb-L._SL75_.jpg&#34; alt=&#34;Growing Object-Oriented Software, Guided by Tests&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The problem with me answering this question is not that I don&amp;rsquo;t have&#xA;an opinion but as the question was posed I was reading Steve Freeman,&#xA;Nat Pryce on just that topic in their new book &amp;lsquo;Growing&#xA;Object-Oriented Software, Guided by Tests&amp;rsquo;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Eben Bayer: Are mushrooms the new plastic?</title>
				<link>https://www.grahambrooks.com/post/2010-10-06-eben-bayer-are-mushrooms-the-new-plastic/</link>
				<pubDate>Wed, 06 Oct 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-10-06-eben-bayer-are-mushrooms-the-new-plastic/</guid>
				<description>&lt;p&gt;Fascinating TED video on using mushrooms to create materials with plastic characteristics. It looks like Nature got there first...&lt;/p&gt;&#xA;&lt;p&gt;&lt;object width=&#34;446&#34; height=&#34;326&#34;&gt;&lt;param name=&#34;movie&#34; value=&#34;http://video.ted.com/assets/player/swf/EmbedPlayer.swf&#34;&gt;&lt;/param&gt;&lt;param name=&#34;allowFullScreen&#34; value=&#34;true&#34; /&gt;&lt;param name=&#34;allowScriptAccess&#34; value=&#34;always&#34;/&gt;&lt;param name=&#34;wmode&#34; value=&#34;transparent&#34;&gt;&lt;/param&gt;&lt;param name=&#34;bgColor&#34; value=&#34;#ffffff&#34;&gt;&lt;/param&gt; &lt;param name=&#34;flashvars&#34; value=&#34;vu=http://video.ted.com/talks/dynamic/EbenBayer_2010G-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/EbenBayer-2010G.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=971&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=eben_bayer_are_mushrooms_the_new_plastic;year=2010;theme=tales_of_invention;theme=inspired_by_nature;theme=what_s_next_in_tech;theme=a_greener_future;theme=a_taste_of_tedglobal_2010;theme=not_business_as_usual;theme=design_like_you_give_a_damn;event=TEDGlobal+2010;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;&#34; /&gt;&lt;embed src=&#34;http://video.ted.com/assets/player/swf/EmbedPlayer.swf&#34; pluginspace=&#34;http://www.macromedia.com/go/getflashplayer&#34; type=&#34;application/x-shockwave-flash&#34; wmode=&#34;transparent&#34; bgColor=&#34;#ffffff&#34; width=&#34;446&#34; height=&#34;326&#34; allowFullScreen=&#34;true&#34; allowScriptAccess=&#34;always&#34; flashvars=&#34;vu=http://video.ted.com/talks/dynamic/EbenBayer_2010G-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/EbenBayer-2010G.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=971&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=eben_bayer_are_mushrooms_the_new_plastic;year=2010;theme=tales_of_invention;theme=inspired_by_nature;theme=what_s_next_in_tech;theme=a_greener_future;theme=a_taste_of_tedglobal_2010;theme=not_business_as_usual;theme=design_like_you_give_a_damn;event=TEDGlobal+2010;&#34;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Fighting layout bugs</title>
				<link>https://www.grahambrooks.com/post/2010-10-06-fighting-layout-bugs/</link>
				<pubDate>Wed, 06 Oct 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-10-06-fighting-layout-bugs/</guid>
				<description>&lt;p&gt;Finding problems in the layout of web pages is just plain hard. But&#xA;&lt;a href=&#34;http://code.google.com/p/fighting-layout-bugs/&#34;&gt;fighting layout bugs&lt;/a&gt;&#xA;seems to hold a glimmer of light for web developers. Definitely&#xA;something to check out. Michael Tamm presenting his brainchild is&#xA;available &lt;a href=&#34;http://www.infoq.com/presentations/Fighting-Layout-Bugs&#34;&gt;http://www.infoq.com/presentations/Fighting-Layout-Bugs&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Dallas geek night</title>
				<link>https://www.grahambrooks.com/post/2010-08-18-dallas-geek-night/</link>
				<pubDate>Wed, 18 Aug 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-08-18-dallas-geek-night/</guid>
				<description>&lt;p&gt;Last week I happened to be in Dallas for a client and was invited&#xA;along to the &lt;a href=&#34;http://www.meetup.com/Geeknight-Dallas/&#34;&gt;Dallas&#xA;Geeknight&lt;/a&gt; held at the &lt;a&#xA;href=&#34;http://www.thoughtworks.com&#34;&gt;ThoughtWorks&lt;/a&gt; offices there.&lt;/p&gt;&#xA;&lt;p&gt;The Dallas Geeknight is &amp;lsquo;oldschool&amp;rsquo; which is not surprising since Paul&#xA;Hammant informed me he formed the original Geeknight in the UK. The&#xA;primary driver is producing code and committing that code to a&#xA;repository.&lt;/p&gt;&#xA;&lt;p&gt;At the start of the evening people offered up their current open&#xA;source projects elevator pitch style. I pitched two projects &lt;a&#xA;href=&#34;http://github.com/grahambrooks/bvira&#34;&gt;bvira&lt;/a&gt; and &lt;a&#xA;href=&#34;http://github.com/grahambrooks/intercept&#34;&gt;Intercept&lt;/a&gt;. There&#xA;was interest in both but as most people have their own web frameworks&#xA;the consensus was to work on &lt;a&#xA;href=&#34;http://github.com/grahambrooks/intercept&#34;&gt;Intercept&lt;/a&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Using a local Wiki for personal knowledge management</title>
				<link>https://www.grahambrooks.com/post/2010-08-03-using-a-local-wiki-for-personal-knowledge-management/</link>
				<pubDate>Tue, 03 Aug 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-08-03-using-a-local-wiki-for-personal-knowledge-management/</guid>
				<description>&lt;p&gt;For sometime I have been wondering how best to manage all the information that collects in my laptop. I don&amp;rsquo;t even have to try to collect data it just arrives in an irregular stream of emails, instant messenger and other symptoms of this connected world. And then there are the other things I want to collect, data from websites, blog articles, eBooks, PDFs and other documents. Added to this meeting notes, observations, ideas for new projects.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Agile Software Development and Golf</title>
				<link>https://www.grahambrooks.com/post/2010-06-30-agile-software-development-and-golf/</link>
				<pubDate>Wed, 30 Jun 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-06-30-agile-software-development-and-golf/</guid>
				<description>&lt;p&gt;![Golf putting]({{ site.url }}/images/golf-putting-banner.jpg)&lt;/p&gt;&#xA;&lt;p&gt;Faced with the question &amp;lsquo;What do you do?&amp;rsquo; from family and friends is&#xA;more challenging than it should be. Most other professions have been&#xA;around longer than a generation but writing software applications is&#xA;different. Especially for my parents and so this is for the vast&#xA;majority of people who don&amp;rsquo;t do what I do but would like some sort of&#xA;idea of what I do.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Optimising build times</title>
				<link>https://www.grahambrooks.com/post/2010-06-28-optimising-build-times/</link>
				<pubDate>Mon, 28 Jun 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-06-28-optimising-build-times/</guid>
				<description>&lt;p&gt;I just came across this post and want to remember it so posing here. &lt;a href=&#34;http://doublebuffered.com/2009/02/11/optimizing-build-times-for-large-c-projects/&#34;&gt;&lt;a href=&#34;http://doublebuffered.com/2009/02/11/optimizing-build-times-for-large-c-projects/&#34;&gt;http://doublebuffered.com/2009/02/11/optimizing-build-times-for-large-c-projects/&lt;/a&gt;&lt;/a&gt;. I am most interested in the uplift in compilation time based on unused #includes and build reductions for SSDs.&lt;/p&gt;</description>
			</item>
			<item>
				<title>New BTree algorithms for virtual memory systems</title>
				<link>https://www.grahambrooks.com/post/2010-06-20-new-btree-algorithms-for-virtual-memory-systems/</link>
				<pubDate>Sun, 20 Jun 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-06-20-new-btree-algorithms-for-virtual-memory-systems/</guid>
				<description>&lt;p&gt;This is a very interesting article &lt;a href=&#34;http://queue.acm.org/detail.cfm?id=1814327&#34;&gt;&lt;a href=&#34;http://queue.acm.org/detail.cfm?id=1814327&#34;&gt;http://queue.acm.org/detail.cfm?id=1814327&lt;/a&gt;&lt;/a&gt; which demonstrates that we should not take things for granted - including algorithms that have been around for a long time.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Blogging from emacs</title>
				<link>https://www.grahambrooks.com/post/2010-05-05-blogging-from-emacs/</link>
				<pubDate>Wed, 05 May 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-05-05-blogging-from-emacs/</guid>
				<description>&lt;p&gt;After installing &lt;a&#xA;href=&#34;http://www.emacswiki.org/emacs/WebloggerMode&#34;&gt;WebloggerMode&lt;/a&gt;&#xA;some time ago I had not gotten around to trying it out so I thought I&#xA;would take it for a spin with this entry.&lt;/p&gt;&#xA;&lt;p&gt;Nothing earth shattering but the interface is clean and I have a&#xA;personal commitment to reaquaint myself with the power of emacs.&lt;/p&gt;&#xA;&lt;p&gt;Installation and setup is straightforward although I would like a&#xA;little more 1,2,3 style instructions. But then there are only 3 basic&#xA;instructions before this point:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Performance testing web applications</title>
				<link>https://www.grahambrooks.com/post/2010-04-25-performance-testing-web-applications/</link>
				<pubDate>Sun, 25 Apr 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-04-25-performance-testing-web-applications/</guid>
				<description>&lt;p&gt;When performance testing a web application (as in raw operations per second) I have seem many people try to benchmark their new system against the agreed performance level right off the bat. The problem with this approach is that most applications need to be tuned to get the most out of them. Optimistically firing off 100s of requests will most likely cause the server to choke and if you are unlucky die in a gibbering heap.&lt;/p&gt;</description>
			</item>
			<item>
				<title>7 days with the iPad</title>
				<link>https://www.grahambrooks.com/post/2010-04-10-7-days-with-the-ipad/</link>
				<pubDate>Sat, 10 Apr 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-04-10-7-days-with-the-ipad/</guid>
				<description>&lt;p&gt;So it has been 7 days since buying an iPad. Has it been the life changing event promised by all the pre-launch advertising?&lt;/p&gt;&#xA;&lt;p&gt;In my case I don&amp;rsquo;t think my life has changed but it has been enhanced by having one. In a similar way that the iPhone made many on the go tasks easier and in a lot of cases fun the iPad has made other tasks more engaging and fun. I wanted an eReader that would allow me to read technical books while on the go and was willing to pay for that facility. The iPad delivers. Reading is a pleasure and since I already had a nice collection of books from &lt;a href=&#34;http://www.pragprog.com&#34;&gt;the pragmatic programmers&lt;/a&gt; who offer multiple formats for each of their books my bookshelf is nicely full. For other publications in PDF Calibri does a reasonable conversion.&lt;/p&gt;</description>
			</item>
			<item>
				<title>ReleaseIt partial review</title>
				<link>https://www.grahambrooks.com/post/2010-04-10-releaseit-partial-review/</link>
				<pubDate>Sat, 10 Apr 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-04-10-releaseit-partial-review/</guid>
				<description>&lt;p&gt;I have been catching up on my reading recently and one of the books I&#xA;have been trying looking forward to reading is &lt;a&#xA;HREF=&#34;http://pragprog.com/titles/mnee/release-it&#34;&gt;ReleaseIt&lt;/a&gt;. I had&#xA;heard very good things about the book and to my delight they are&#xA;true. If you are a developer building almost any sort of application&#xA;but in particular working on java based web applications you need to&#xA;read this book! I wish it had been available years ago and that I had&#xA;read it.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Scraping Railscasts</title>
				<link>https://www.grahambrooks.com/post/2010-04-07-scraping-railscasts/</link>
				<pubDate>Wed, 07 Apr 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-04-07-scraping-railscasts/</guid>
				<description>&lt;p&gt;I had a few moments today to get reacquainted with Ruby and Rails programming. It has been a while but I have found time to watch the occasional &lt;a href=&#34;http://railscasts.com/&#34;&gt;Railscast&lt;/a&gt;. I want to watch these videos while on the move but unfortunately the iTunes podcasts are not compatible with the iPad/iPhone. Downloading each one is tedious so I came up with the following:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;require&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;open-uri&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;require&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;hpricot&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;..&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;each&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;doc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;Hpricot&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;http://railscasts.com/episodes?page=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;doc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;each&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;href&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:href&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;href&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=~&lt;/span&gt; &lt;span class=&#34;sr&#34;&gt;/.*ipod_videos.*/&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;file_name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;basename&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;k&#34;&gt;unless&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exist?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;puts&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Downloading &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file_name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;no&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;basename&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;w&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>iPad and keyboards</title>
				<link>https://www.grahambrooks.com/post/2010-04-06-ipad-and-keyboards/</link>
				<pubDate>Tue, 06 Apr 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-04-06-ipad-and-keyboards/</guid>
				<description>&lt;p&gt;There are some quirks to the way the apple bluetooth keyboard works with the iPad. Most of the keys work as you might expect and the pairing system works just fine. There is no real way to navigate around applications and the system that I have found using the a keyboard though so I find myself switching back and forth between screen and keyboard.&lt;/p&gt;&#xA;&lt;p&gt;The dock is quite vertical which can make the screen position a little off if your are tall and working on a normal desk and chair.&lt;/p&gt;</description>
			</item>
			<item>
				<title>iPad first day on the road</title>
				<link>https://www.grahambrooks.com/post/2010-04-05-ipad-first-day-on-the-road/</link>
				<pubDate>Mon, 05 Apr 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-04-05-ipad-first-day-on-the-road/</guid>
				<description>&lt;p&gt;Today I took my new iPad for a day at work:&lt;/p&gt;&#xA;&lt;p&gt;A colleague had a 3G card for his laptop and shared the connection. Strangely this caused the iPad to pause quite often as if it were trying to connect to something on the net. The connection seemed to drop quite frequently and I was asked to reconnect quite often.&lt;/p&gt;&#xA;&lt;p&gt;In a meeting I took notes using Pages. On the whole that was successful but downlighting from the ceiling was a little distracting. I was using the iPad with the apple case which inclines the iPad at an angle that makes the keyboard easier to use.&lt;/p&gt;</description>
			</item>
			<item>
				<title>iPad first impressions</title>
				<link>https://www.grahambrooks.com/post/2010-04-04-ipad-first-impressions/</link>
				<pubDate>Sun, 04 Apr 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-04-04-ipad-first-impressions/</guid>
				<description>&lt;p&gt;There has been a lot of hype around the iPad and I have to confess&#xA;that after watching the original advertisement I was hooked. But was&#xA;all the hype justified?&lt;/p&gt;&#xA;&lt;p&gt;On first use if you are an iPhone user there are few surprises. The&#xA;larger touch screen is truly superb as an interface and the apps load&#xA;quickly. I was disappointed that the iBook application was not&#xA;installed by default and it took me a while to realize I had to&#xA;download it from the app store.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Post Redirect Get web interaction pattern</title>
				<link>https://www.grahambrooks.com/post/2010-03-27-post-redirect-get-web-interaction-pattern/</link>
				<pubDate>Sat, 27 Mar 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-03-27-post-redirect-get-web-interaction-pattern/</guid>
				<description>&lt;p&gt;&lt;a&#xA;href=&#34;http://en.wikipedia.org/wiki/Post/Redirect/Get&#34;&gt;Post/Redirect/Get&lt;/a&gt;&#xA;or &lt;a&#xA;href=&#34;http://www.theserverside.com/news/1365146/Redirect-After-Post&#34;&gt;Redirect&#xA;after Post&lt;/a&gt; is an HTTP interaction pattern that can be used when&#xA;developing web applications. I have been mentioning it quite a few&#xA;times in my consulting work and thought I would take a stab a at&#xA;diving a little deeper in the pattern and its benefits.&lt;/p&gt;&#xA;&lt;h2 id=&#34;post-redirect-get-pattern&#34; class=link_owner&gt;&#xA;  Post-Redirect-Get pattern&#xA;  &lt;a href=&#34;#post-redirect-get-pattern&#34; class=&#34;link icon&#34;&gt;&#xA;    &lt;svg&gt;&#xA;      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;![Basic Post Redirect Get pattern]({{ site.url }}/images/Basic-Post-Redirect-Get.png)&lt;/p&gt;&#xA;&lt;p&gt;The sequence diagram above shows how the pattern works to create a&#xA;resource. First the client requests a form that is used to create the&#xA;resource. The server obliges returning a HTTP 200 status code and the&#xA;mark up containing the form.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Collaborating distributed teams</title>
				<link>https://www.grahambrooks.com/post/2010-03-23-collaborating-distributed-teams/</link>
				<pubDate>Tue, 23 Mar 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-03-23-collaborating-distributed-teams/</guid>
				<description>&lt;p&gt;Internet Relay Chat (IRC) has been around for a very long time (1988)&#xA;and Instant Messaging (IM) for even longer – although IM did not&#xA;become really popular until the mid 90&amp;rsquo;s with the emergence of GUI&#xA;clients. There are many similarities between the two systems but for&#xA;this article I am concentrating on the differences, specifically&#xA;around their use as a team communication medium.&lt;/p&gt;&#xA;&lt;p&gt;IM is optimised for point to point communication between&#xA;two people. There are options for group communication but this is&#xA;more of an exception where one person takes on the role of organiser&#xA;and brings other people into the conversation. IRC on the other&#xA;hand uses the channel concept, where a channel is synonymous with a&#xA;topic of conversation. The channel exists independent of the&#xA;participants in the conversation. Neither system offers a view of the&#xA;entire conversation, although a lot of clients log conversations.&lt;/p&gt;</description>
			</item>
			<item>
				<title>It always takes a second</title>
				<link>https://www.grahambrooks.com/post/2010-03-18-it-always-takes-a-second/</link>
				<pubDate>Thu, 18 Mar 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-03-18-it-always-takes-a-second/</guid>
				<description>&lt;p&gt;Why do application developers think that adding more functionality is&#xA;always a good thing for the user? When I first started working on GUI&#xA;applications (Windows 1.0) we worked very hard to get sub-second&#xA;response times. Now in theory applications running on multi-core 2+GHz&#xA;processors should out strip 286 CPUs running in the MHz range. What&#xA;seems to have append instead is that applications have maintained the&#xA;same sort of response times (in general) taking 1 or more seconds to&#xA;perform a task.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Inclined Keyboard on MBP</title>
				<link>https://www.grahambrooks.com/post/2010-03-06-inclined-keyboard-on-mbp/</link>
				<pubDate>Sat, 06 Mar 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-03-06-inclined-keyboard-on-mbp/</guid>
				<description>&lt;p&gt;![Raising the MBP Keyboard]({{ site.url }}/images/raised-mbp-keyboard.jpg)&lt;/p&gt;&#xA;&lt;p&gt;As anyone who knows me will say I have a thing about keyboards and&#xA;have a few in my current collection.&lt;/p&gt;&#xA;&lt;p&gt;On a whim today I bought the apple wireless keyboard thinking that I&#xA;would pair it with my laptop for when I am at home working at my&#xA;desk. I already have the wired version and have been very happy with&#xA;the feel of the keyboard. Unfortunately it occupies a USB slot and&#xA;when I have both my external drive and SLR connected I have to keep&#xA;swapping peripherals.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Face to Face pairing</title>
				<link>https://www.grahambrooks.com/post/2010-02-28-face-to-face-pairing/</link>
				<pubDate>Sun, 28 Feb 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-02-28-face-to-face-pairing/</guid>
				<description>&lt;p&gt;Since joining &lt;a href=&#34;http://www.thoughtworks.com&#34;&gt;ThoughtWorks&lt;/a&gt; in 2004 I&#xA;have enjoyed&#xA;&lt;a href=&#34;http://www.extremeprogramming.org/rules/pair.html&#34;&gt;Pair Programming&lt;/a&gt;&#xA;and my programming skills have improved significantly. Working on a&#xA;problem with someone else full time is one of those practices that is&#xA;difficult to convince people off until they have actually tried&#xA;it. &lt;cite&gt;&lt;a href=&#34;http://collaboration.csc.ncsu.edu/laurie/&#34;&gt;Laurie&#xA;Williams&lt;/a&gt; at NCSU&lt;/cite&gt; has done some pretty interesting research&#xA;into the effectiveness of of pair programming, which is well worth a&#xA;read.&lt;/p&gt;&#xA;&lt;p&gt;There are various different styles of pair programming &lt;a&#xA;href=&#34;http://en.wikipedia.org/wiki/Pair_programming&#34;&gt;WikiPedia&lt;/a&gt;&#xA;talks about remote and ping-pong paring where people sit side by side&#xA;using the same screen, keyboard and mouse. Work is typically split&#xA;along test/application boundaries where one pair writes a test and the&#xA;other then implements the code to support the test. Control switches&#xA;back and forth between each of the pairs. The are many variations on&#xA;this including the use of two keyboards and mice. Pairing in this way&#xA;with a laptop is often quite difficult unless a separate keyboard and&#xA;mouse are used.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Server Rebuild - Part II</title>
				<link>https://www.grahambrooks.com/post/2010-02-25-server-rebuild-part-ii/</link>
				<pubDate>Thu, 25 Feb 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-02-25-server-rebuild-part-ii/</guid>
				<description>&lt;p&gt;So after having the server nicely set up and ready for configuration I&#xA;could not resist just &amp;lsquo;getting on with it&amp;rsquo;. I had grand plans to plan&#xA;it out and record everything (good practice) but each step seemed so&#xA;simple it seemed simplest just to get stuck in.&lt;/p&gt;&#xA;&lt;p&gt;And for the most part it was simple. Running Unbuntu makes installing&#xA;software and tools a breeze and after a few hours of intermittent&#xA;changes everything was up and running from the old server.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Age discrimination in technology</title>
				<link>https://www.grahambrooks.com/post/2010-02-18-age-discrimination-in-technology/</link>
				<pubDate>Thu, 18 Feb 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-02-18-age-discrimination-in-technology/</guid>
				<description>&lt;p&gt;This article post &amp;lsquo;&lt;a&#xA;href=&#34;http://www.infoworld.com/d/adventures-in-it/painful-truth-about-age-discrimination-in-tech-209?page=0,3&#34;&gt;The&#xA;painful truth about age discrimination in tech&lt;/a&gt;&amp;rsquo; left me a little&#xA;confused. Am I still considered a developer or have I given up the&#xA;mantle and considered a statistic.&lt;/p&gt;&#xA;&lt;p&gt;Do I cut code? - yes but not as much as I would like and it is not the&#xA;thing I do every day.&lt;/p&gt;&#xA;&lt;p&gt;Is there age discrimination? If there is it not that explicit or&#xA;something I have taken an offence at.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Don&#39;t use application Zoom</title>
				<link>https://www.grahambrooks.com/post/2010-02-18-dont-use-application-zoom/</link>
				<pubDate>Thu, 18 Feb 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-02-18-dont-use-application-zoom/</guid>
				<description>&lt;p&gt;A plaintive call to not over use the lovely zoom features in Excel and Word. The zoom parameters are stored in the document so when you receive them it is very unlikely that your zoom setting will match my zoom requirements.&lt;/p&gt;&#xA;&lt;p&gt;If I change the zoom setting then the document has been changed.&lt;/p&gt;&#xA;&lt;p&gt;If you store your documents in version control like me then playing about with the zoom settings means a lot more binary style checkins too.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Look after your tools</title>
				<link>https://www.grahambrooks.com/post/2010-02-18-look-after-your-tools/</link>
				<pubDate>Thu, 18 Feb 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-02-18-look-after-your-tools/</guid>
				<description>&lt;img src=&#34;https://www.grahambrooks.com/images/istock-000007402056xsmall.jpg&#34; border=&#34;0&#34; alt=&#34;iStock_000007402056XSmall.jpg&#34; width=&#34;283&#34; height=&#34;424&#34; align=&#34;right&#34; /&gt;&#xA;Look after your tools and they will look after you!&#xA;&lt;p&gt;I was very lucky to grow up in the country with a father who enjoyed teaching me practical skills like carpentry, motor mechanics and just about every other skill needed to keep the house, car and garden up to scratch. One of the things that was drummed into me at this early age was to look after the tools (at that time I had to borrow my father&amp;rsquo;s tools).&lt;/p&gt;</description>
			</item>
			<item>
				<title>Server rebuild – part 1</title>
				<link>https://www.grahambrooks.com/post/2010-02-18-server-rebuild-part-1/</link>
				<pubDate>Thu, 18 Feb 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-02-18-server-rebuild-part-1/</guid>
				<description>&lt;p&gt;I have been running my own server for some time now but my requirements have changed and the current underlying VM architecture does not conveniently support what I want to do.&lt;/p&gt;&#xA;&lt;p&gt;The current linux server is running under OpenVZ which is not that conducive to running Java Applications. So after spending quite a few hours struggling with that thorny problem I have decided to stay with my current hosting provider (&lt;a href=&#34;http://www.vpslink.com&#34;&gt;VPSlink&lt;/a&gt;) but switch to Xen.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The rise and fall of waterfall - on you tube</title>
				<link>https://www.grahambrooks.com/post/2010-02-09-the-rise-and-fall-of-waterfall-on-you-tube/</link>
				<pubDate>Tue, 09 Feb 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-02-09-the-rise-and-fall-of-waterfall-on-you-tube/</guid>
				<description>&lt;p&gt;If you have been in software development for a while this might make you chuckle :)&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.youtube.com/watch?v=X1c2--sP3o0&#34;&gt;The Rise And Fall Of Waterfall&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;object width=&#34;425&#34; height=&#34;344&#34;&gt;&lt;param name=&#34;movie&#34; value=&#34;http://www.youtube.com/v/X1c2--sP3o0&amp;hl=en_US&amp;fs=1&amp;&#34;&gt;&lt;/param&gt;&lt;param name=&#34;allowFullScreen&#34; value=&#34;true&#34;&gt;&lt;/param&gt;&lt;param name=&#34;allowscriptaccess&#34; value=&#34;always&#34;&gt;&lt;/param&gt;&lt;embed src=&#34;http://www.youtube.com/v/X1c2--sP3o0&amp;hl=en_US&amp;fs=1&amp;&#34; type=&#34;application/x-shockwave-flash&#34; allowscriptaccess=&#34;always&#34; allowfullscreen=&#34;true&#34; width=&#34;425&#34; height=&#34;344&#34;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Switching back and forth - Intellij IDEA and Eclipse</title>
				<link>https://www.grahambrooks.com/post/2010-02-05-switching-back-and-forth-intellij-idea-and-eclipse/</link>
				<pubDate>Fri, 05 Feb 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-02-05-switching-back-and-forth-intellij-idea-and-eclipse/</guid>
				<description>&lt;p&gt;I have to confess that I am an &lt;a href=&#34;http://www.jetbrains.com/idea/&#34;&gt;IntelliJ Idea&lt;/a&gt; fan. I will confess that the key bindings take a little getting used to - especially on a Mac but I find I am most productive using it.&lt;/p&gt;&#xA;&lt;p&gt;I do like to keep up with what is happening with the Eclipse project and thought I would pick p the latest Eclipse 3.6M5 (Helios) release. Not really intending to do more than load up a couple of projects and play around for a while.&lt;/p&gt;</description>
			</item>
			<item>
				<title>XP and the cost of change</title>
				<link>https://www.grahambrooks.com/post/2010-02-01-xp-and-the-cost-of-change/</link>
				<pubDate>Mon, 01 Feb 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-02-01-xp-and-the-cost-of-change/</guid>
				<description>&lt;p&gt;I have found myself drawing the classic cost of change graph a few&#xA;times recently so thought I would blog about it. The graph was popular&#xA;a few year ago in explaining the differences between and eXtream&#xA;Programming (XP) team cost and a waterfall team cost.  &lt;img&#xA;src=&#34;https://www.grahambrooks.com/images/XP-Wall-Graph.png&#34;&#xA;alt=&#34;XP Wall Graph.png&#34; border=&#34;0&#34; width=&#34;341&#34; height=&#34;209&#34;/&gt;&lt;/p&gt;&#xA;&lt;p&gt;The important thing to remember in interpreting the graph is that the&#xA;lifetime of a software system is typically far longer than the initial&#xA;development. Most systems spend much longer in ‘maintenance’ than they&#xA;ever did in ‘development’ so anything that can be done to make&#xA;maintenance (ongoing development) more effective has to make sense.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Screen casting</title>
				<link>https://www.grahambrooks.com/post/2010-01-31-screen-casting/</link>
				<pubDate>Sun, 31 Jan 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-01-31-screen-casting/</guid>
				<description>&lt;p&gt;There have been a number of threads recently talking about screen/podcasting and the software required to do a decent job so I thought I would blog about the setup I am using.&lt;/p&gt;&#xA;&lt;p&gt;After trying a few applications I eventually settled on &lt;a href=&#34;http://www.shinywhitebox.com/ishowuhd/main.html&#34;&gt;IShowU HD&lt;/a&gt;. It handles screen capture well and supports a wide range of formats.&lt;/p&gt;&#xA;&lt;p&gt;![Samson microphone]({{ site.url }}/images/0F73A0E6-AE9E-440A-9593-D4D6B19E1F25.jpg)&lt;/p&gt;&#xA;&lt;p&gt;I tried a couple of microphones (including the built in mic on my MBP)&#xA;before settling on the &lt;a&#xA;href=&#34;http://www.samsontech.com/images/productimages/C01U-web.jpg&#34;&gt;Samson&#xA;C10U&lt;/a&gt;. The mic works well but I have not found it to be that&#xA;sensitive so have to position it between the laptop and me which&#xA;sometimes makes it difficult to type. Perhaps I will have to invest in&#xA;a boom to bring the mike over the top - although that may make it more&#xA;difficult to see the screen.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Wordpress theme update failure</title>
				<link>https://www.grahambrooks.com/post/2010-01-30-wordpress-theme-update-failure/</link>
				<pubDate>Sat, 30 Jan 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-01-30-wordpress-theme-update-failure/</guid>
				<description>&lt;p&gt;If like me you installed WordPress and added some themes before understanding that WordPress has a great way of adding themes through the UI then make sure that you have changed the ownership of the folders containing those themes.&lt;/p&gt;&#xA;&lt;p&gt;Otherwise the autoupdate fails and if you update the current theme end up with a maintenance screen. Getting rid of the maintenance screen is pretty easy (delete the .maintenance file) in the blog folder but it still takes a few minutes to solve the problem.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Web application testing - episode 1</title>
				<link>https://www.grahambrooks.com/post/2010-01-20-web-application-testing-episode-1/</link>
				<pubDate>Wed, 20 Jan 2010 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2010-01-20-web-application-testing-episode-1/</guid>
				<description>&lt;p&gt;This is my first screencast so all and any comments welcome!!&lt;/p&gt;&#xA;&lt;p&gt;This screencast is about adding an acceptance test to validate the title element in the returned HTML from the application.&lt;/p&gt;&#xA;&lt;p&gt;[flowplayer src=http://www.grahambrooks.com/video/testing-web-apps-episode-1.mp4 width=550 height=413 ]&lt;/p&gt;&#xA;&lt;p&gt;The companion code for this episode can be downloaded from &lt;a href=&#34;http://www.github.com/wookie870/bvira&#34;&gt;http://www.github.com/wookie870/bvira&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Cross post: A Brief And Incomplete History Of Build Pipelines</title>
				<link>https://www.grahambrooks.com/post/2009-12-13-cross-post-a-brief-and-incomplete-history-of-build-pipelines/</link>
				<pubDate>Sun, 13 Dec 2009 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2009-12-13-cross-post-a-brief-and-incomplete-history-of-build-pipelines/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://www.magpiebrain.com&#34;&gt;Sam Newman&lt;/a&gt; has just published a&#xA;&lt;a href=&#34;http://www.magpiebrain.com/2009/12/13/a-brief-and-incomplete-history-of-build-pipelines/%22&#34;&gt;Brief And Incomplete History Of Build Pipelines&lt;/a&gt;&#xA;which makes interesting reading.&lt;/p&gt;&#xA;&lt;p&gt;It will be interesting to see where the concepts take us in the next&#xA;few years.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Subway reading</title>
				<link>https://www.grahambrooks.com/post/2009-12-13-subway-reading/</link>
				<pubDate>Sun, 13 Dec 2009 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2009-12-13-subway-reading/</guid>
				<description>&lt;p&gt;Over the last month I have been reading &lt;a href=&#34;http://pragprog.com/titles/snfocus/pomodoro-technique-illustrated&#34;&gt;Prmodoro Technique Illustrated&lt;/a&gt; a fascinating book detailing a technique to apply real focus to problem solving and work in general. One problem I have with almost any kind of reading is finding the time to actually read. But this book is nicely split up into bite-sized chapters which can be read on short journeys. I have taken to downloading books to Stanza an iPhone application which accepts epub format documents. The transfer is a little fiddly but once a URL to the book download is entered Stanza takes care of the download.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Testing abstrations</title>
				<link>https://www.grahambrooks.com/post/2009-11-18-testing-abstrations/</link>
				<pubDate>Wed, 18 Nov 2009 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2009-11-18-testing-abstrations/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;These ideas were presented as at &lt;a&#xA;href=&#34;http://www.thoughtworks.com&#34;&gt;ThoughtWorks&lt;/a&gt; &lt;a&#xA;href=&#34;http://connect.thoughtworks.com/agilesoutheast/&#34;&gt;Agile&#xA;Southeast&lt;/a&gt; conference in Atlanta. The idea for these diagrams&#xA;came about after the first time I spoke about web test driven&#xA;development at &lt;a&#xA;href=&#34;http://connect.thoughtworks.com/agileeast/&#34;&gt;Agile East&lt;/a&gt; in&#xA;Philadelphia and New York. I am striving to show how introducing a&#xA;level of abstraction affects development costs.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Web applications should testing at various levels, from unit tests&#xA;through acceptance, workflow and performance (to name just a few&#xA;categories). For the purposes of this article Acceptance and Workflow&#xA;tests are defined as follows:&lt;/p&gt;</description>
			</item>
			<item>
				<title>How the Pendulum Swings</title>
				<link>https://www.grahambrooks.com/post/2009-11-05-how-the-pendulum-swings/</link>
				<pubDate>Thu, 05 Nov 2009 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2009-11-05-how-the-pendulum-swings/</guid>
				<description>&lt;p&gt;![Car parts in a box]({{ site.url }}/images/car-parts-in-a-box.jpg)&lt;/p&gt;&#xA;&lt;p&gt;A couple of decades ago I spent quite a lot of time working on my&#xA;car. To be honest it was near the end of its life when I bought it at&#xA;auction but I had only saved/borrowed enough for a car of that age and&#xA;at the time I thought I knew a lot more about maintenance than I&#xA;really did but what I did not know I now had my own car to learn&#xA;from. As you might expect it was not too long before disaster struck&#xA;and driving home one day the engine died and resisted my attempts to&#xA;revive it. Time to to get stuck into car maintenance 101.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Prag Pro Wri Mo</title>
				<link>https://www.grahambrooks.com/post/2009-10-31-prag-pro-wri-mo/</link>
				<pubDate>Sat, 31 Oct 2009 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2009-10-31-prag-pro-wri-mo/</guid>
				<description>&lt;p&gt;I am going to take part in &lt;a href=&#34;http://praglife.typepad.com/pragmatic_life/2009/10/prag-pro-wri-mo.html&#34;&gt;Prag Pro Wri Mo&lt;/a&gt; to find out if I have the inclination and capacity to write or if I am one of those people who would have liked to have written a book.&lt;/p&gt;&#xA;&lt;p&gt;This initiative seems like a really fun and challenging idea and I am looking forward to getting started.&lt;/p&gt;</description>
			</item>
			<item>
				<title>WebTDD at Agile East</title>
				<link>https://www.grahambrooks.com/post/2009-10-31-webtdd-at-agile-east/</link>
				<pubDate>Sat, 31 Oct 2009 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2009-10-31-webtdd-at-agile-east/</guid>
				<description>&lt;p&gt;Just a quick note to say thank you to everyone who attended my talk on Test Driven Web Development at &lt;a href=&#34;http://connect.thoughtworks.com/agileeast&#34;&gt;Agile East&lt;/a&gt; this week.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Agile East WebTDD</title>
				<link>https://www.grahambrooks.com/post/2009-10-26-agile-east-webtdd/</link>
				<pubDate>Mon, 26 Oct 2009 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2009-10-26-agile-east-webtdd/</guid>
				<description>&lt;p&gt;On Thursday this week I will presenting a talk entitled &amp;lsquo;WebTDD&amp;rsquo; at the &lt;a href=&#34;http://www.thoughtworks.com&#34;&gt;ThoughtWorks&lt;/a&gt; Agile East conference in Conshohocken  PA. It is the first outing for this talk and I have been working on the supporting software for some time.&lt;/p&gt;&#xA;&lt;p&gt;I am really looking forward to this first speaking opportunity in the US this year.&lt;/p&gt;&#xA;&lt;p&gt;If you are reading this and attending I look forward to meeting you there.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Wednesday evening in Seattle</title>
				<link>https://www.grahambrooks.com/post/2009-10-08-wednesday-evening-in-seattle/</link>
				<pubDate>Thu, 08 Oct 2009 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2009-10-08-wednesday-evening-in-seattle/</guid>
				<description>&lt;p&gt;![Hyatt Regency]({{ site.url }}/images/IMG_0018.jpg)&lt;/p&gt;&#xA;&lt;p&gt;This photo was taken from the hotel bar on the top floor of the&#xA;&lt;a href=&#34;http://bellevue.hyatt.com/hyatt/hotels/index.jsp&#34;&gt;Hyatt Regency&lt;/a&gt;. We&#xA;were lucky to arrive just as the sun was setting. If you look closely&#xA;at the horizon you can just make out the mountain profile. Some are&#xA;already topped with snow.&lt;/p&gt;&#xA;&lt;p&gt;Just for a moment looking at the sunset makes all the travel worthwhile.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Its Tuesday in Seattle</title>
				<link>https://www.grahambrooks.com/post/2009-10-07-its-tuesday-in-seattle/</link>
				<pubDate>Wed, 07 Oct 2009 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2009-10-07-its-tuesday-in-seattle/</guid>
				<description>&lt;p&gt;Not that I have seen anything of the city but I now find myself on the&#xA;west cost after arriving on the east cost just over a week ago.&lt;/p&gt;&#xA;&lt;p&gt;The&#xA;&lt;a href=&#34;http://bellevue.hyatt.com/hyatt/hotels/index.jsp%22&#34;&gt;Hyatt Regency&lt;/a&gt;&lt;/a&gt;&#xA;here is a pretty nice hotel though and I look forward to a nice nights&#xA;sleep.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Another excellent talk on Ted</title>
				<link>https://www.grahambrooks.com/post/2009-10-02-another-excellent-talk-on-ted/</link>
				<pubDate>Fri, 02 Oct 2009 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2009-10-02-another-excellent-talk-on-ted/</guid>
				<description>&lt;p&gt;&lt;object width=&#34;334&#34; height=&#34;326&#34;&gt;&lt;param name=&#34;movie&#34; value=&#34;http://video.ted.com/assets/player/swf/EmbedPlayer.swf&#34;&gt;&lt;/param&gt;&lt;param name=&#34;allowFullScreen&#34; value=&#34;true&#34; /&gt;&lt;param name=&#34;wmode&#34; value=&#34;transparent&#34;&gt;&lt;/param&gt;&lt;param name=&#34;bgColor&#34; value=&#34;#ffffff&#34;&gt;&lt;/param&gt; &lt;param name=&#34;flashvars&#34; value=&#34;vu=http://video.ted.com/talks/dynamic/SirKenRobinson_2006-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/SirKenRobinson-2006.embed_thumbnail.jpg&amp;vw=320&amp;vh=240&amp;ap=0&amp;ti=66&amp;introDuration=16500&amp;adDuration=4000&amp;postAdDuration=2000&amp;adKeys=talk=ken_robinson_says_schools_kill_creativity;year=2006;theme=the_creative_spark;theme=master_storytellers;theme=bold_predictions_stern_warnings;theme=how_the_mind_works;theme=how_we_learn;theme=top_10_tedtalks;event=TED2006;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;&#34; /&gt;&lt;embed src=&#34;http://video.ted.com/assets/player/swf/EmbedPlayer.swf&#34; pluginspace=&#34;http://www.macromedia.com/go/getflashplayer&#34; type=&#34;application/x-shockwave-flash&#34; wmode=&#34;transparent&#34; bgColor=&#34;#ffffff&#34; width=&#34;334&#34; height=&#34;326&#34; allowFullScreen=&#34;true&#34; flashvars=&#34;vu=http://video.ted.com/talks/dynamic/SirKenRobinson_2006-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/SirKenRobinson-2006.embed_thumbnail.jpg&amp;vw=320&amp;vh=240&amp;ap=0&amp;ti=66&amp;introDuration=16500&amp;adDuration=4000&amp;postAdDuration=2000&amp;adKeys=talk=ken_robinson_says_schools_kill_creativity;year=2006;theme=the_creative_spark;theme=master_storytellers;theme=bold_predictions_stern_warnings;theme=how_the_mind_works;theme=how_we_learn;theme=top_10_tedtalks;event=TED2006;&#34;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>The big apple</title>
				<link>https://www.grahambrooks.com/post/2009-10-02-the-big-apple/</link>
				<pubDate>Fri, 02 Oct 2009 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2009-10-02-the-big-apple/</guid>
				<description>&lt;p&gt;![New York]({{ site.url }}/images/IMG_0009.jpg)&lt;/p&gt;&#xA;&lt;p&gt;October finds me in New York and for the last couple of days I have been walking to and from work (about 10 blocks).&lt;br/&gt;&#xA;One thing that has struck me is that finding your way around the city is a piece of cake in comparison to say London. In NY the grid system not only makes is easy to find a place but also to know how far away you are.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Adium 1.4ß</title>
				<link>https://www.grahambrooks.com/post/2009-08-24-adium-1-4s/</link>
				<pubDate>Mon, 24 Aug 2009 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2009-08-24-adium-1-4s/</guid>
				<description>&lt;p&gt;I have just discovered that Adium - my favourite IM client for the mac has a new ß version available and now supports IRC so one less application to run every day.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Relaxation</title>
				<link>https://www.grahambrooks.com/post/2009-07-19-relaxation/</link>
				<pubDate>Sun, 19 Jul 2009 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2009-07-19-relaxation/</guid>
				<description>&lt;p&gt;&lt;a title=&#34;Relaxing in Shenandoah by Graham Brooks, on Flickr&#34; href=&#34;http://www.flickr.com/photos/grahambrooks/3735018840/&#34;&gt;&lt;img class=&#34;alignleft&#34; src=&#34;http://farm3.static.flickr.com/2577/3735018840_c44805696b_m.jpg&#34; alt=&#34;Relaxing in Shenandoah&#34; width=&#34;240&#34; height=&#34;180&#34; /&gt;&lt;/a&gt;Another photo from the trip to Shenandoah. Yours truly taking time out&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;I remember there was a cool breeze drifting up the river - it was a warm day&lt;/p&gt;</description>
			</item>
			<item>
				<title>Shenandoah &#39;06</title>
				<link>https://www.grahambrooks.com/post/2009-07-19-shenandoah-06/</link>
				<pubDate>Sun, 19 Jul 2009 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2009-07-19-shenandoah-06/</guid>
				<description>&lt;p&gt;&lt;a title=&#34;DSC00731.JPG by Graham Brooks, on Flickr&#34;&#xA;href=&#34;http://www.flickr.com/photos/grahambrooks/3734206465/&#34;&gt;&lt;img&#xA;class=&#34;alignleft&#34;&#xA;src=&#34;http://farm3.static.flickr.com/2547/3734206465_d72df18767.jpg&#34;&#xA;alt=&#34;DSC00731.JPG&#34; width=&#34;375&#34; height=&#34;500&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;I found this whilst going through some old(ish) photos taken in&#xA;Shenandoah national park in 2006.&lt;/p&gt;&#xA;&lt;p&gt;It brought a lot of memories back about that trip - which was just a&#xA;weekend away but a little adventurous - the first time I had seen a&#xA;Bear in the wild and probably the hottest, dampest walk I have every&#xA;done.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Ultimate agility?</title>
				<link>https://www.grahambrooks.com/post/2009-07-19-ultimate-agility/</link>
				<pubDate>Sun, 19 Jul 2009 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2009-07-19-ultimate-agility/</guid>
				<description>&lt;h1&gt;The truly amazing Dan Osman&lt;/h1&gt;&#xA;&lt;p&gt;&#xA;              This has got to be one of the ultimate demonstrations of agility, confidence and poise....&#xA;              &lt;object width=&#34;425&#34; height=&#34;344&#34;&gt;&#xA;                &lt;param name=&#34;movie&#34; value=&#34;http://www.youtube.com/v/l-oc-lhqpIA&amp;amp;hl=en&amp;amp;fs=1&amp;amp;&#34;&gt;&lt;/param&gt;&#xA;                &lt;param name=&#34;allowFullScreen&#34; value=&#34;true&#34;&gt;&lt;/param&gt;&#xA;                &lt;param name=&#34;allowscriptaccess&#34; value=&#34;always&#34;&gt;&lt;/param&gt;&#xA;                &lt;embed src=&#34;http://www.youtube.com/v/l-oc-lhqpIA&amp;amp;hl=en&amp;amp;fs=1&amp;amp;&#34; type=&#34;application/x-shockwave-flash&#34; allowscriptaccess=&#34;always&#34; allowfullscreen=&#34;true&#34; width=&#34;425&#34; height=&#34;344&#34;&gt;&lt;/embed&gt;&#xA;              &lt;/object&gt;&#xA;            &lt;/p&gt;</description>
			</item>
			<item>
				<title>Java Properties handling - 1</title>
				<link>https://www.grahambrooks.com/post/2009-07-18-java-properties-handling-1/</link>
				<pubDate>Sat, 18 Jul 2009 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/post/2009-07-18-java-properties-handling-1/</guid>
				<description>&lt;p&gt;I have been on a number of Java projects recently and one of the&#xA;things I end up brewing for each of these projects is some enhanced&#xA;management of runtime properties.&lt;/p&gt;&#xA;&lt;p&gt;Having said there are problems with using .properties files they are&#xA;well understood and supported by all the major Java tools and&#xA;IDEs. There would have to be a very strong reason to use another&#xA;format (and no I don&amp;rsquo;t mean XML).&lt;/p&gt;</description>
			</item>
			<item>
				<title>Search</title>
				<link>https://www.grahambrooks.com/search/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://www.grahambrooks.com/search/</guid>
				<description></description>
			</item>
	</channel>
</rss>
