<?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 — essays</title>
    <link>https://www.grahambrooks.com/</link>
    <description>Essays on Coding Architect, without release notes</description>
    <generator>ferrisite</generator>
    <language>en-us</language>
    <copyright>© 2026 Graham Brooks. All rights reserved.</copyright>
    <lastBuildDate>Sun, 25 Oct 2026 09:07:00 -0600</lastBuildDate>
    <atom:link href="https://www.grahambrooks.com/essays.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Open source update: six new tools and what changed, September to October 2026</title>
      <link>https://www.grahambrooks.com/post/open-source-update-october-2026/</link>
      <pubDate>Sun, 25 Oct 2026 09:07:00 -0600</pubDate>
      <guid>https://www.grahambrooks.com/post/open-source-update-october-2026/</guid>
      <description>&lt;p&gt;&lt;em&gt;Between 1 September and 25 October 2026, my public repositories at &lt;a href=&#34;https://github.com/grahambrooks&#34;&gt;github.com/grahambrooks&lt;/a&gt; cut 92 releases across 27 repositories. Most of those numbers are plumbing. This post separates the plumbing from the parts you’d notice.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It’s for anyone who uses one of these tools, or who’s wondering whether one of them is worth trying. Each project gets a one-line definition the first time it appears, so you shouldn’t need to have read anything else here first.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Reading a change as two aligned files, in a terminal (increment)</title>
      <link>https://www.grahambrooks.com/post/increment-aligned-diffs-in-the-terminal/</link>
      <pubDate>Sun, 25 Oct 2026 09:06:00 -0600</pubDate>
      <guid>https://www.grahambrooks.com/post/increment-aligned-diffs-in-the-terminal/</guid>
      <description>&lt;p&gt;&lt;em&gt;A patch shows you what changed. It doesn’t show you the file the change landed in. increment is my attempt at showing both, without leaving the terminal.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;increment&lt;/strong&gt; is a terminal diff viewer. The command is &lt;code&gt;inc&lt;/code&gt;. It renders a change as two aligned panes, old on the left and new on the right, with each line level with the line it corresponds to. Modified lines get word-level highlighting, unchanged regions fold away, and in the interactive browser there’s a change map down the right edge. The reference I was copying is the JetBrains diff view, and the goal was to get that view in a terminal and in a pipe.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mermaid to SVG without a browser, and with the labels still there (mmd)</title>
      <link>https://www.grahambrooks.com/post/mmd-mermaid-to-svg-without-a-browser/</link>
      <pubDate>Sun, 25 Oct 2026 09:05:00 -0600</pubDate>
      <guid>https://www.grahambrooks.com/post/mmd-mermaid-to-svg-without-a-browser/</guid>
      <description>&lt;p&gt;&lt;em&gt;Convert a Mermaid diagram to PDF with an SVG-only toolchain and you can get boxes and arrows with no words in them, and no error telling you the words are gone. mmd exists because of that failure.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;mmd&lt;/strong&gt; is a command-line tool and Rust library that renders &lt;a href=&#34;https://mermaid.js.org&#34;&gt;Mermaid&lt;/a&gt; diagram source to SVG. It’s pure Rust: no Node, no headless browser, no JavaScript runtime, no C toolchain. It’s for anyone who publishes Mermaid diagrams somewhere other than a web page that runs Mermaid’s own JavaScript, such as a PDF, a static docs build, or an editor preview that wants to draw the diagram itself.&lt;/p&gt;</description>
    </item>
    <item>
      <title>When an agent can already write the file, what is an MCP server for?</title>
      <link>https://www.grahambrooks.com/post/what-is-an-mcp-server-for/</link>
      <pubDate>Sun, 04 Oct 2026 08:25:17 -0600</pubDate>
      <guid>https://www.grahambrooks.com/post/what-is-an-mcp-server-for/</guid>
      <description>&lt;p&gt;&lt;em&gt;Agents are very good at writing files. So when a tool’s input is a file, an MCP server in front of it starts out with a problem: the agent can already do the job without it. The server has to earn its place by doing something a file can’t. Most of the ones I’ve considered building didn’t.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This post is about the one that did, and about how much narrower its win turned out to be than the plan said.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The release pipeline four tools kept reinventing (release-kit)</title>
      <link>https://www.grahambrooks.com/post/release-pipeline-as-a-tool/</link>
      <pubDate>Sun, 27 Sep 2026 08:34:15 -0600</pubDate>
      <guid>https://www.grahambrooks.com/post/release-pipeline-as-a-tool/</guid>
      <description>&lt;p&gt;&lt;em&gt;Every tool I build for myself needs the same last mile: binaries for my machines, a Homebrew formula, something &lt;code&gt;bx&lt;/code&gt; can run. That’s the same work each time, and I kept writing it again for each tool. The fix wasn’t a smarter workflow. It was admitting that the release process is a tool with a user of its own, and that user is me.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In &lt;a href=&#34;https://www.grahambrooks.com/post/building-your-own-tools/&#34;&gt;Building Your Own Tools&lt;/a&gt; I argued that software with one known user gets to delete its configuration layer. There’s no need for options when you know exactly who’s running it. This post is about what I missed in that argument. Once there are several of those tools, the work &lt;em&gt;around&lt;/em&gt; them starts repeating, and each copy grows its own small configuration layer. Nobody designs it. It just builds up.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Stop declaring what you can already read (myspec)</title>
      <link>https://www.grahambrooks.com/post/stop-declaring-what-you-can-read/</link>
      <pubDate>Sun, 27 Sep 2026 08:34:11 -0600</pubDate>
      <guid>https://www.grahambrooks.com/post/stop-declaring-what-you-can-read/</guid>
      <description>&lt;p&gt;&lt;em&gt;Every time you ask someone to tell your tool something it could have found out, you’ve created a second copy of a fact. Second copies drift. In an agent’s toolchain there are a lot of facts, and until recently I was asking for a lot of second copies.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is the first post about &lt;strong&gt;myspec&lt;/strong&gt;. It’s a Rust CLI that wraps Claude Code and keeps my repositories consistent and their agents well-equipped. It started as a personal spec-driven development workflow, meaning the agent works from a written change proposal and its spec deltas rather than straight from a prompt. Then on 18 September it changed direction. The design doc records the reason as a critique of the original plan: “The spec workflow alone doesn’t keep repositories consistent as practice moves, doesn’t make sure agents have their tools, and can’t tell a running session what happened in the repository.”&lt;/p&gt;</description>
    </item>
    <item>
      <title>Letting an agent read your mail: split the reader from the network</title>
      <link>https://www.grahambrooks.com/post/letting-an-agent-read-your-mail/</link>
      <pubDate>Sat, 26 Sep 2026 17:19:50 -0600</pubDate>
      <guid>https://www.grahambrooks.com/post/letting-an-agent-read-your-mail/</guid>
      <description>&lt;p&gt;&lt;em&gt;Every email in your inbox was written by someone else, and most of them were written by someone you’ve never met. Hand that inbox to a model and you’ve handed it several hundred prompts from strangers. You can ask the model nicely to ignore them. Or you can arrange things so that when it doesn’t, nothing much happens.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is the first post about &lt;strong&gt;agentic-twin&lt;/strong&gt;, “the twin” from here on. It’s a personal agent system that runs on my Mac and takes on recurring work I’ve handed to it. It checks my GitHub repositories every morning, gathers news, drafts blog topics and writes a daily note. Most of that work is done by small deterministic programs, and a model is used only where judgement is actually needed. I wrote about &lt;a href=&#34;https://www.grahambrooks.com/post/ai-coding-isolation/&#34;&gt;sandboxing coding agents&lt;/a&gt; in March, and about &lt;a href=&#34;https://www.grahambrooks.com/post/automating-github-account-management/&#34;&gt;a bounded role for the model in running my GitHub account&lt;/a&gt; in July. This is the same argument applied to something more personal than a repository: my email.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cadence is a budget line: what scheduled automation cost a private repo</title>
      <link>https://www.grahambrooks.com/post/cadence-is-a-budget-line/</link>
      <pubDate>Sat, 26 Sep 2026 17:19:28 -0600</pubDate>
      <guid>https://www.grahambrooks.com/post/cadence-is-a-budget-line/</guid>
      <description>&lt;p&gt;&lt;em&gt;A cron line looks like a latency setting. &lt;code&gt;0 * * * *&lt;/code&gt; reads as “check every hour, so nothing waits long.” In a private repository it’s also a purchase order, and it reorders every hour whether or not there’s anything to buy.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In July I wrote about &lt;a href=&#34;https://www.grahambrooks.com/post/automating-github-account-management/&#34;&gt;running a personal GitHub account as a control plane&lt;/a&gt;: configuration as code, scheduled workflows, a deliberately non-admin GitHub App, and a bounded role for the model. This post follows up on part of that design, the scheduled part, after it did something I hadn’t priced in. On 26 September my account’s GitHub Actions budget was $30 over. Development CI didn’t overrun it. The automation meant to make the portfolio cheaper to maintain did.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making a Code Graph Admit What It Doesn&#39;t Know (symgraph)</title>
      <link>https://www.grahambrooks.com/post/symgraph-admitting-what-it-does-not-know/</link>
      <pubDate>Tue, 22 Sep 2026 06:30:00 -0600</pubDate>
      <guid>https://www.grahambrooks.com/post/symgraph-admitting-what-it-does-not-know/</guid>
      <description>&lt;p&gt;&lt;em&gt;A tool that says “I don’t know” is annoying. A tool that guesses, and returns the guess in the same shape and the same confident tone as a fact, is worse than useless — because the thing reading it is an agent, and an agent has no way to tell the two apart.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/grahambrooks/symgraph&#34;&gt;symgraph&lt;/a&gt; indexes a codebase into a symbol graph — functions, types, the calls and imports between them — and serves it to a coding agent over MCP, the protocol Claude Code and similar tools use to reach external capabilities. I’ve written about &lt;a href=&#34;https://www.grahambrooks.com/post/building-a-code-knowledge-graph-for-ai-agents/&#34;&gt;why I built it&lt;/a&gt; and about &lt;a href=&#34;https://www.grahambrooks.com/post/code-knowledge-graph-for-review/&#34;&gt;using the same graph for review rather than generation&lt;/a&gt;. This post is about the month since, which went somewhere I didn’t plan.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building Your Own Tools</title>
      <link>https://www.grahambrooks.com/post/building-your-own-tools/</link>
      <pubDate>Mon, 07 Sep 2026 12:54:34 -0600</pubDate>
      <guid>https://www.grahambrooks.com/post/building-your-own-tools/</guid>
      <description>&lt;p&gt;&lt;em&gt;Configuration is the tax you pay for not knowing who your user is. It has always been priced into the cost of building software, so we stopped noticing it was there. Build something for exactly one person and the tax disappears — along with the onboarding, the migration path, and the entire “but what if they want it the other way” branch of every decision.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Agents have changed the economics of building tools. That much is now uncontroversial and it is also the boring half of the observation. The interesting half is what the new economics let you build, which is not &lt;em&gt;more software&lt;/em&gt; but &lt;em&gt;a different kind of software&lt;/em&gt;: software with exactly one user, whose habits, directory layout and tool preferences the author knows precisely, because the author is the user.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Giving the Consumer a Representative in the Working Tree (brake)</title>
      <link>https://www.grahambrooks.com/post/brake-exit-criteria-for-the-consumer/</link>
      <pubDate>Mon, 24 Aug 2026 09:30:00 -0600</pubDate>
      <guid>https://www.grahambrooks.com/post/brake-exit-criteria-for-the-consumer/</guid>
      <description>&lt;p&gt;&lt;em&gt;An agent decides it is done when the checks it can run come back green. Every one of those checks is a question about the repository it is standing in. The team that generates a client from your OpenAPI file is not in that repository, is not in the test suite, and is not in the agent’s context window — so nothing in the loop objects when a field quietly disappears from a response.&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Architecture the Agentic Loop Can Actually Check (tropism)</title>
      <link>https://www.grahambrooks.com/post/tropism-architecture-in-the-agentic-loop/</link>
      <pubDate>Sat, 08 Aug 2026 10:12:00 -0600</pubDate>
      <guid>https://www.grahambrooks.com/post/tropism-architecture-in-the-agentic-loop/</guid>
      <description>&lt;p&gt;&lt;em&gt;Types made “this value is a string” checkable. Tests made behaviour checkable. Nothing ever made “the API layer must not talk to the data layer” checkable — cheaply, across every language in the repository, in the second before a commit. That gap is where agents do the most damage.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I’ve spent the last few weeks building &lt;a href=&#34;https://github.com/grahambrooks/tropism&#34;&gt;tropism&lt;/a&gt;, a dependency and architecture analyzer for polyglot repositories. This post is about the problem it’s aimed at, the one design decision the whole thing hangs off, and — at some length, because it’s the part most tool posts skip — what it measurably cannot do.&lt;/p&gt;</description>
    </item>
    <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;
&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’ve done that. It doesn’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>Porting Midje&#39;s Arrow to Rust (facts)</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;
  The reading order problem
  &lt;a href=&#34;#the-reading-order-problem&#34; class=&#34;link icon&#34; aria-label=&#34;Link to section: The reading order problem&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&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>Running Local MCP Servers Without a Node or Python Runtime (bx)</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;
&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’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;
&lt;p&gt;What we used to optimise was the human’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>Team Code Review Without the Server: a CLI (casual-review)</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;
&lt;p&gt;I’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’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’t live there anymore.&lt;/em&gt;&lt;/p&gt;
&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’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, “review” and “review the diff” 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;
&lt;p&gt;Every AI coding tool I’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;
&lt;p&gt;That’s the obvious application. It’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;
  A Rust-Native Architecture Toolchain: forge, puml, and adoc
  &lt;a href=&#34;#a-rust-native-architecture-toolchain-forge-puml-and-adoc&#34; class=&#34;link icon&#34; aria-label=&#34;Link to section: A Rust-Native Architecture Toolchain: forge, puml, and adoc&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id=&#34;replacing-the-jvm-and-ruby-pieces-of-the-architecture-documentation-stack-with-single-static-binaries&#34; class=link_owner&gt;
  Replacing the JVM and Ruby pieces of the architecture documentation stack with single static binaries
  &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; aria-label=&#34;Link to section: Replacing the JVM and Ruby pieces of the architecture documentation stack with single static binaries&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&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’re using. Each one is a perfectly fine tool. Together they’re a small operations problem – the kind of thing that quietly breaks every CI pipeline I’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
do we harness the full capability of AI coding assistants while keeping our systems safe?&lt;/p&gt;
&lt;h2 id=&#34;the-problem-power-vs-safety&#34; class=link_owner&gt;
  The Problem: Power vs. Safety
  &lt;a href=&#34;#the-problem-power-vs-safety&#34; class=&#34;link icon&#34; aria-label=&#34;Link to section: The Problem: Power vs. Safety&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;AI coding agents like Claude Code, Codex, GitHub Copilot and Gemini CLI are remarkably capable — they can read your codebase, run
commands, install packages, and modify files across your project. To be most useful, you want to give them broad access.
To maintain flow you want the agent to run to completion without continuously interrupting and asking for permission for
every action or confirming that it can use use something safely in the future. But every tool you grant is a tool that
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;
  Exploring Your Backstage Catalog Without Backstage
  &lt;a href=&#34;#exploring-your-backstage-catalog-without-backstage&#34; class=&#34;link icon&#34; aria-label=&#34;Link to section: Exploring Your Backstage Catalog Without Backstage&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id=&#34;how-bsv-gives-you-instant-visibility-into-your-software-catalog-from-the-terminal&#34; class=link_owner&gt;
  How bsv gives you instant visibility into your software catalog from the terminal
  &lt;a href=&#34;#how-bsv-gives-you-instant-visibility-into-your-software-catalog-from-the-terminal&#34; class=&#34;link icon&#34; aria-label=&#34;Link to section: How bsv gives you instant visibility into your software catalog from the terminal&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&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 – a single catalog of everything your organization builds and operates – is genuinely powerful.&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;
  Visualizing Project Structure with rv
  &lt;a href=&#34;#visualizing-project-structure-with-rv&#34; class=&#34;link icon&#34; aria-label=&#34;Link to section: Visualizing Project Structure with rv&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id=&#34;a-fast-interactive-way-to-see-whats-actually-in-your-project&#34; class=link_owner&gt;
  A fast, interactive way to see what’s actually in your project
  &lt;a href=&#34;#a-fast-interactive-way-to-see-whats-actually-in-your-project&#34; class=&#34;link icon&#34; aria-label=&#34;Link to section: A fast, interactive way to see what’s actually in your project&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Every developer has had the experience of opening an unfamiliar codebase and trying to figure out what’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’s shape that you get from actually working in it for weeks.&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;
  Seeing Your Codebase as a City
  &lt;a href=&#34;#seeing-your-codebase-as-a-city&#34; class=&#34;link icon&#34; aria-label=&#34;Link to section: Seeing Your Codebase as a City&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h1&gt;
&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;
  Why we need better ways to understand code at scale – and how 3D visualization can help
  &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; aria-label=&#34;Link to section: Why we need better ways to understand code at scale – and how 3D visualization can help&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&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’s actually there.&lt;/p&gt;
&lt;p&gt;This is a surprisingly common problem. A new engineer joins the team and asks: “Which services are the big ones? What’s old? What language is everything written in?” The answers live in people’s heads, in outdated wiki pages, or buried across GitHub’s repository listings. There’s no way to just &lt;em&gt;look&lt;/em&gt; at your codebase and see the shape of it.&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;
  Building a Code Knowledge Graph for AI Agents
  &lt;a href=&#34;#building-a-code-knowledge-graph-for-ai-agents&#34; class=&#34;link icon&#34; aria-label=&#34;Link to section: Building a Code Knowledge Graph for AI Agents&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h1&gt;
&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;
  How I rebuilt codegraph in Rust to give AI coding assistants a semantic map of your codebase
  &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; aria-label=&#34;Link to section: How I rebuilt codegraph in Rust to give AI coding assistants a semantic map of your codebase&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;There’s a fundamental tension at the heart of agentic coding today. AI models are remarkably good at writing code, but they’re surprisingly bad at &lt;em&gt;understanding&lt;/em&gt; the codebase they’re writing it in.&lt;/p&gt;
&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’s working through a keyhole – 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;
&lt;h2 id=&#34;the-essence-of-vibe-coding&#34; class=link_owner&gt;
  The Essence of Vibe Coding
  &lt;a href=&#34;#the-essence-of-vibe-coding&#34; class=&#34;link icon&#34; aria-label=&#34;Link to section: The Essence of Vibe Coding&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&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 “flow,” 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;
&lt;h1 id=&#34;pair-programming&#34; class=link_owner&gt;
  Pair Programming
  &lt;a href=&#34;#pair-programming&#34; class=&#34;link icon&#34; aria-label=&#34;Link to section: Pair Programming&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Pair programming, a well-established practice from the agile development world, involves two developers working together at one workstation. One developer, “the driver”, writes the code, while the other, “the navigator”, 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;
&lt;blockquote&gt;
&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;
&lt;p&gt;A blog article in asciidoc format that talks about working in interesting times. Just when I thought that software development was set on a path of continuous improvement a disruptive technology of generative ai comes along to throw a spanner in the works and makes life fascinating&lt;/p&gt;
&lt;p&gt;— Graham Brooks&lt;/p&gt;
&lt;/blockquote&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;
&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;
&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;
&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;
&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;
&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;
&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;
&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;
&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;
&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 “To see..” &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;
&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;
&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;
&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;
&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;</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
emacs that I felt compelled to share. If you have worked with REST
APIs and ElasticSearch in particular you probably have had similar
experiences of using something to develop queries. Coding in one of
the client libraries does not provide the interactive experience you
need to develop quickly and it often becomes a frustrating
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
keep track of what is happening with version control and build
systems. Errors and failures don’t come up that often and when they do
they can quite often get solved there and then. On larger projects or
working in a large organisation it’s impossible to keep track of
everything. There are too many moving parts and changes. Incidents are
more frequent and their impact much larger. A broken build or build
system can affect 10s or 100s of people. For these larger development
projects I find I have to collect and chart data, looking for tends
and anomalies and then delve deeper into the data if and systems if
there are problems.&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
services that we deploy into environments? Typical service tiers are
implemented with a fronting load balancer that allocates servers to
satisfy requests. Applications or services that need these services
are give domain or IP information of the load balancers and the load
balancers are given details of the servers running instances of the
services that they need. Essentially each system with dependencies
&lt;em&gt;new&lt;/em&gt;s an instance of its dependencies. Inverting this dependency
requires a container but it leads to some interesting advantages.&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
&lt;a href=&#34;http://nealford.com/abstracts.html#water&#34;&gt;‘This is water’&lt;/a&gt; Neal Ford
talks about “Yesterday’s best practices become tomorrow’s
anti-patterns”. This seems to be the case for application servers
like WebSphere, WebLogic and JBoss.&lt;/p&gt;
&lt;p&gt;When these containers started to become popular (typically in large
enterprises) servers took a long time to commission and
configure. Containers were a way of deploying applications more
quickly and with greater safety. But time change and today’s patterns
and teams favour lighter weight, nimble solutions. Our ability to
manage servers and networks through code is one of the key drivers for
this change.&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’s law applies the how we set up and organise teams should
either be aligned to the architecture of the applicaiton or system
being developed or application/system architecture will shift to match
the team structure.&lt;/p&gt;
&lt;h2 id=&#34;conways-law&#34; class=link_owner&gt;
  Conways law
  &lt;a href=&#34;#conways-law&#34; class=&#34;link icon&#34; aria-label=&#34;Link to section: Conways law&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;organizations which design systems … are constrained to produce designs which are copies of the communication structures of these organizations&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Conway, Melvin E. (April 1968), “How do Committees Invent?”, 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
&lt;a href=&#34;https://github.com/grahambrooks/lazybuilder&#34;&gt;lazybuilder&lt;/a&gt; came up
during a recent coding dojo doing code kata. We were using Vim and a
separate terminal to run the tests. Switching back and forth between
two windows when trying to move quickly seemed like a waste of time.&lt;/p&gt;
&lt;p&gt;There are several tools in this space but most of them work by polling
for changes or use linux events that are not available on a mac. lazy
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
keyboard&#34;&gt;CODE keyboard&lt;/a&gt;s are available again and I received mine
last night. I have to confess that I am a bit of a keyboard junkie. I
am reluctant to count them all but I am edging into double digits :(.&lt;/p&gt;
&lt;p&gt;The keyboard arrived nicely packaged inside a larger box with lots of
packing material to avoid damage in transit. The box containing the
keyboard itself is minimal but nicely designed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cling A C++ 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
lambda code and thought it would be cool to try it out for myself. The
idea of spinning up a project or even putting a new test in an
existing project did not feel right. Wouldn’t a C++ REPL be useful for
just these occasions?&lt;/p&gt;
&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
just the thing. There was no distribution for OS X so my first thought
was to build from source. This is a little more complex than I thought
it should be. You need to set up a viable llvm development environment
and run some patches to get cling to compile. I ran into a number of
problems doing this both on my Mac and on an Ubuntu VM. (compilation,
linking and version incompatibilities between the repositories). Really
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
C++11. Each time I wanted a way of handling command line arguments
flexibly. I chose to use the boost::program_options library. The
documentation is pretty good but there are some assumptions (aliased
namespace) and the example code is broken up with paragraphs of text
explaining what the code does.&lt;/p&gt;
&lt;p&gt;When I start to explore an API to a library I start by writing
tests. After working with the program_options library on a few small
applications the same pattern came up each time so I thought I would
share the results as a complete app, although admittedly the app does
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
look at the current state of build tools for Java projects. First I
thought I would draw up some assessment criteria to use as a loose
guide. This is what I came up with:&lt;/p&gt;
&lt;p&gt;Fast&lt;/p&gt;
&lt;p&gt;I want a build tool that spends as much time as possible building my
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
like to use the command line for building, testing and committing
code. So I thought it would be nice to have a way to check the build
status from the command line. I have been wanting to write something
in C++11 and a small lightweight command line tool seemed like a good
opportunity.&lt;/p&gt;
&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
application every time the build is successful. I am currently working
with a development team that is working towards continuous deployment
as part of their continuous delivery adoption plans. The system
involves several internal web services which seemed like a good place
to start working on not only automating the deployments but
maintaining a very high degree of up-time during those
deployments. Automating deployments involves both development and
techops groups so I thought I would search for some worked examples
that would help illustrate the techniques and steps required. I found
several blogs and articles talking about different approaches but no
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
couple of weeks ago
&lt;a href=&#34;https://github.com/grahambrooks/word-finder&#34;&gt;word finder&lt;/a&gt; uses
next_permutation to find words in character sequences. Uses the
&lt;a href=&#34;http://aspell.net&#34;&gt;aspell&lt;/a&gt; C api to look up each
permutation. Searching for 3,4,5 and 6 character words in a 6
character sequence takes about 200ms.&lt;/p&gt;
&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;
&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;
&lt;p&gt;In certain countries and regions the term engineer has more special
definition. &lt;a href=&#34;https://en.wikipedia.org/wiki/Software_engineering&#34;&gt;Wikipedia&lt;/a&gt;
emphasizes the method or approach to developing software. In Europe
the term infers that someone has undergone formal training and
attained a status through examination or peer election to a learned
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
next_permutation. The prorgam read a sequence of characters from the
command line and then tried to find words by testing each
permuation. For a sequence of 3 characters there are 6 permutations.&lt;/p&gt;
&lt;p&gt;Most of the online examples look something like this:&lt;/p&gt;
&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;sx-source sx-c++&#34;&gt;    vector&lt;span class=&#34;sx-punctuation sx-section sx-generic sx-begin sx-c++&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;sx-storage sx-type sx-c&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-section sx-generic sx-end sx-c++&#34;&gt;&amp;gt;&lt;/span&gt; set &lt;span class=&#34;sx-meta sx-block sx-c++&#34;&gt;&lt;span class=&#34;sx-punctuation sx-section sx-block sx-begin sx-c++&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;sx-string sx-quoted sx-single sx-c&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-begin sx-c&#34;&gt;&amp;#39;&lt;/span&gt;a&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-end sx-c&#34;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-separator sx-c++&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;sx-string sx-quoted sx-single sx-c&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-begin sx-c&#34;&gt;&amp;#39;&lt;/span&gt;b&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-end sx-c&#34;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-separator sx-c++&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;sx-string sx-quoted sx-single sx-c&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-begin sx-c&#34;&gt;&amp;#39;&lt;/span&gt;c&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-end sx-c&#34;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-section sx-block sx-end sx-c++&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-terminator sx-c++&#34;&gt;;&lt;/span&gt;
    
    &lt;span class=&#34;sx-keyword sx-control sx-c++&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;sx-meta sx-block sx-c++&#34;&gt;&lt;span class=&#34;sx-punctuation sx-section sx-block sx-begin sx-c++&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;sx-keyword sx-control sx-c++&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;sx-meta sx-group sx-c++&#34;&gt;&lt;span class=&#34;sx-punctuation sx-section sx-group sx-begin sx-c++&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sx-storage sx-type sx-c&#34;&gt;auto&lt;/span&gt; x &lt;span class=&#34;sx-keyword sx-operator sx-ternary sx-c&#34;&gt;:&lt;/span&gt; set&lt;span class=&#34;sx-punctuation sx-section sx-group sx-end sx-c++&#34;&gt;)&lt;/span&gt;&lt;/span&gt;
            cout &lt;span class=&#34;sx-keyword sx-operator sx-arithmetic sx-c&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;sx-meta sx-group sx-c++&#34;&gt;&lt;span class=&#34;sx-punctuation sx-section sx-group sx-begin sx-c++&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sx-storage sx-type sx-c&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-section sx-group sx-end sx-c++&#34;&gt;)&lt;/span&gt;&lt;/span&gt;x&lt;span class=&#34;sx-punctuation sx-terminator sx-c++&#34;&gt;;&lt;/span&gt;
        cout &lt;span class=&#34;sx-keyword sx-operator sx-arithmetic sx-c&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span class=&#34;sx-punctuation sx-terminator sx-c++&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;sx-punctuation sx-section sx-block sx-end sx-c++&#34;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;sx-keyword sx-control sx-c++&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;sx-meta sx-group sx-c++&#34;&gt;&lt;span class=&#34;sx-punctuation sx-section sx-group sx-begin sx-c++&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sx-meta sx-function-call sx-c++&#34;&gt;&lt;span class=&#34;sx-variable sx-function sx-c++&#34;&gt;next_permutation&lt;/span&gt;&lt;span class=&#34;sx-meta sx-group sx-c++&#34;&gt;&lt;span class=&#34;sx-punctuation sx-section sx-group sx-begin sx-c++&#34;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-meta sx-function-call sx-c++&#34;&gt;&lt;span class=&#34;sx-meta sx-group sx-c++&#34;&gt;set&lt;span class=&#34;sx-punctuation sx-accessor sx-dot sx-c++&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;sx-meta sx-method-call sx-c++&#34;&gt;&lt;span class=&#34;sx-variable sx-function sx-member sx-c++&#34;&gt;begin&lt;/span&gt;&lt;span class=&#34;sx-meta sx-group sx-c++&#34;&gt;&lt;span class=&#34;sx-punctuation sx-section sx-group sx-begin sx-c++&#34;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-meta sx-method-call sx-c++&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sx-meta sx-method-call sx-c++&#34;&gt;&lt;span class=&#34;sx-meta sx-group sx-c++&#34;&gt;&lt;span class=&#34;sx-punctuation sx-section sx-group sx-end sx-c++&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-separator sx-c++&#34;&gt;,&lt;/span&gt; set&lt;span class=&#34;sx-punctuation sx-accessor sx-dot sx-c++&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;sx-meta sx-method-call sx-c++&#34;&gt;&lt;span class=&#34;sx-variable sx-function sx-member sx-c++&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;sx-meta sx-group sx-c++&#34;&gt;&lt;span class=&#34;sx-punctuation sx-section sx-group sx-begin sx-c++&#34;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-meta sx-method-call sx-c++&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sx-meta sx-method-call sx-c++&#34;&gt;&lt;span class=&#34;sx-meta sx-group sx-c++&#34;&gt;&lt;span class=&#34;sx-punctuation sx-section sx-group sx-end sx-c++&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-meta sx-function-call sx-c++&#34;&gt;&lt;span class=&#34;sx-meta sx-group sx-c++&#34;&gt;&lt;span class=&#34;sx-punctuation sx-section sx-group sx-end sx-c++&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-section sx-group sx-end sx-c++&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-terminator sx-c++&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;
&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;
&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;
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>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;
&lt;blockquote&gt;
&lt;p&gt;“If you can dream - and not make dreams your master; If you can
think - and not make thoughts your aim; If you can meet with
Triumph and Disaster And treat those two impostors just the
same;”&lt;/blockquote&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&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>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;
&lt;p&gt;“All truth passes through three stages. First, it is
ridiculed. Second, it is violently opposed.  Third, it is accepted
as being self-evident.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Arthur Schopenhauer, German philosopher (1788 – 1860)&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
&lt;a href=&#34;http://www.bleading-edge.com/Publications/list.htm&#34;&gt;Jack W. Reeves&lt;/a&gt;
wrote an article in the C++ Journal entitled “What is Software
Design?” and I missed it. Not only that but no one thought to point
out that I was missing a very important article. An article that
challenged and changed/clarified my mental model of software design
and construction - 20 years after it was published. A copy of the
original article can be found
&lt;a href=&#34;http://www.developerdotstar.com/mag/articles/reeves_design.html&#34;&gt;here&lt;/a&gt;. I
guess it is better late than never and it demonstrates that some
things stay relevant and important. Sometimes they remain
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
of your application code. Duplications mean that you have more code
than you should and are often the source of more subtle bugs of the
“I’ve already fixed that ..” variety.&lt;/p&gt;
&lt;p&gt;While working on a scriptable command line tool for Java (see &lt;a
href=&#34;http://www.grahambrooks.com/blog/autmated-refactoring-for-library-updates/&#34;
title=&#34;Automated refactoring for library updates&#34;&gt;Automated
refactoring for library updates&lt;/a&gt;) I discovered a neat way of
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;
&lt;p&gt;In June I presented at &lt;a
href=&#34;http://qconnewyork.com/qcon-nyc-2012/&#34;&gt;QCon NYC&lt;/a&gt; on using
GPUs. It was a great chance to catch up on all the changes to C and
C++ that I have missed out on in recent years. You can catch up on the
presentation over on &lt;a title=&#34;Integrating GPUs in Application
Development - From Concept to Deployment&#34;
href=&#34;http://www.infoq.com/presentations/GPU-Application&#34;
target=&#34;_blank&#34;&gt;InfoQ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The source code used in the presentation is on github &lt;a
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
&lt;a href=&#34;http://youtu.be/mVbDzTM21BQ&#34;&gt;Clang MapReduce – Automatic C++ Refactoring at Google Scale&lt;/a&gt;
I was struck with the idea that this could help with the upgrade
problem. Almost every application uses libraries. Those libraries need
to be updated from time but each time they are updated all the code
using those libraries also needs to be updated. For development teams
finding time to upgrade to the latest libraries against competing
functional updates is challenging.  What if as part of the release a
set of refactoring commands or programs accompanied the
libraries. These refactoring scripts would automatically update the
consuming application code to use the new libraries saving time and
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
refactoring part of your next project is one thing but if you have
just joined a team or project with a significant amount of debt how do
you work on making things better? Over the last few months I have been
assessing a number of code-bases and speaking about technical debt
management. While preparing for these engagements I realized that
combining two code and project metrics could be used to help focus
efforts on code that would deliver the most benefit. Toxicity is a
combined measurement of static code analysis metrics. Volatility a
measure of changes made to files within a code-base over time. By
combining these two measures we can create a source file scatter chart
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
for managing zsh configuration. The default configuration adds some
interesting enhancements.&lt;/p&gt;
&lt;p&gt;The following shows all the Java files in the current and sub
directories.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;ls **/*.java
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ryan Bates has a nice
&lt;a href=&#34;http://railscasts.com/episodes/308-oh-my-zsh&#34;&gt;Railscast&lt;/a&gt; episode
covering oh-my-zsh&lt;/p&gt;
&lt;p&gt;I have been using oh-my-zsh for the last couple of weeks. The GIT
enhancement showing the current git branch in the prompt is a nice
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
Delivery&lt;/em&gt; at &lt;a href=&#34;http://agiledc.org/&#34;&gt;AgileDC&lt;/a&gt;. The audience was great
and the room packed which is always a recipe for success. I really
enjoyed talking about Continuous Delivery and there were some really
interesting questions.&lt;/p&gt;
&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;
&lt;p&gt;As I mentioned yesterday &lt;a href=&#34;http://jezhumble.net/&#34;&gt;Jez
Humble&lt;/a&gt; was kind enough to donate his slides from which I borrowed
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;
tomorrow. The topic of my talk is an Introduction to
&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
on more and more functionality either directly into the main system
component or into sub-systems. As the systems grow in complexity and
responsibility their database requirements grow at a similar rate
become more and more complex.&lt;/p&gt;
&lt;p&gt;In these complex systems each component needs to not only have access
to data but also to transitive data generated by other
components. This need often leads to &lt;em&gt;the&lt;/em&gt; database becoming the
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
your application either interesting additions or a key element to your
architecture.&lt;/p&gt;
&lt;p&gt;Despite their long history I was recently reminded of some interesting
applications of Caching reverse proxies that are worth revisiting.&lt;/p&gt;
&lt;p&gt;First lets look at a fairly typical configuration where a caching
reverse proxy is fronting some sort of web application. The web
application exposes its functionality on one port (say 8080) and the
proxy connects to this port for in-bound HTTP requests (say on port
80). The application responds with the data matching the request and
if cacheable the proxy stores a copy of that content in its
cache. There are lots of other paths - typically around failure and
different responses but essentially the proxy acts as a pipe between
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
probably rooted in the time that I discovered computing and
programming. At that time the state of the art was ROFF (T)ROFF and a
whole family of plain text processing engines that produced nicely
formatted output.&lt;/p&gt;
&lt;p&gt;With the advent of word processing applications the emphasis moved
away from plain test precessing systems to more sophisticated systems
involving opaque binary formats. More recently the use of binary
formats has fallen out of favor and many word processing systems now
provide a level of interoperability with other systems though more open
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
how long these projects lasted. In particular if there was a rapid
drop off in activity.&lt;/p&gt;
&lt;p&gt;One of the great things about recent open source code repositories is
that they often provide APIs allowing this sort of analysis. The chart
below was generated from a sample of 2360 public
&lt;a href=&#34;http://www.github.com&#34;&gt;GitHub&lt;/a&gt; repositories. I took the started
pushed-at and created-at dates to calculate how many days a repository
had been worked on. I then grouped them together into 30 day
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;
&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>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 ‘mysql2’&lt;/code&gt; to
your Gemfile but get a message saying that it is missing when you try
to migrate&lt;/p&gt;
&lt;p&gt;Make sure that you have installed libmysql-ruby&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;sudo apt-get install libmysql-ruby
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This one caught me out on the weekend and it took a while to work out
what was going on. I am guessing that not having libmysql-ruby
installed caused the gem to incorrectly advertise that it was not
available. I did not get any errors when installing the mysql2 gem
which is strange.&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
the weekend. I wanted to automate the deployment of a Rails
application to my server. The server was (I thought) just about ready
to accept the app but I did not want to go through another manual
deployment. I thought I would take the opportunity to script the
deployment. The first task I set myself was to create a production
MySQL database. Searching for how to do this threw up lots of
interesting information about building and deploying database.yml
files, but not much about configuring MySQL. The first set of tasks I
came up with were:&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
documents, proposals, presentations etc. I have also been asked to
review quite a few of these documents. As an author or reviewer I like
test what I am working on against 5 Ws and one H to see if the
important aspects have been covered. The
&lt;a href=&#34;http://en.wikipedia.org/wiki/Five_Ws&#34;&gt;Wikipedia&lt;/a&gt; article provides a
good background and history, including the 1902 reference to
&lt;a href=&#34;http://en.wikipedia.org/wiki/Rudyard_Kipling&#34;&gt;Rudyard Kipling&lt;/a&gt;
&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>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;
&lt;p&gt;So with today’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>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;
&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>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;
is a web development technique or pattern. The basic premise is that a
web site should be accessible to all users and then to overlay
additional functionality based on the client’s capability.&lt;/p&gt;
&lt;p&gt;Web technologies and good web development practices over the last few
years had encouraged this approach. Popular web sites delivery
semantic HTML to allow screen readers and other client devices to
understand the content of being delivered. Advances in both browser
capabilities and CSS have encouraged this and the use of inline styles
has reduced over time. The advent of JavaScript libraries that hide
browser compatibility problems have made the development of
progressively enhanced content easier to achieve.&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
facinated with the different flavours of interfaces and
capabilities. After working my way through ED and then VI
&lt;a href=&#34;http://www.gnu.org/software/emacs/&#34;&gt;Emacs&lt;/a&gt; was a bit of a
revalation. I found myself idle for a few minutes this morning and
thought I would do some editor maintenance and install haml-mode into
my copy of Emacs. While surfing around I came across the
&lt;a href=&#34;http://tromey.com/elpa/install.html&#34;&gt;Emacs Lisp Package Archive&lt;/a&gt;
which made the installation a breeze and I then found myself
installing all sorts of other additions that might be useful in the
future.&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
popularly HTML. Over the past few weeks I have been writing a few
&lt;a href=&#34;http://rubyonrails.org/&#34;&gt;Ruby on Rails&lt;/a&gt; applications and chose Haml
as the templating language. For someone who has traditionally avoided
positional languages this was a strange choice. Having written a few
simple applications I find that the writing HTML in Haml is both
straightforward and intuitive. Good HTML is naturally hierarchical and
having this structure both encouraged and enforced in Haml feels
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
development I have had some successes in using this idea when doing a
presentation. I have dubbed the idea ‘Test driven talks’. The basic
idea is to quickly canvas the audience for things that they would like
covered during the presentation. Once these have been captured on a
whiteboard or flip-chart.&lt;/p&gt;
&lt;p&gt;The next step is to filter the topics in the same way as an agile team
accepts stories into an iteration it is likely that I wont be able to
cover all the expectations from the audience. The nice thing about
this step is that I can manage people’s expectations. If I accept a
question or topic then people should expect me to satisfy them. If I
reject the topic then people know that I won’t be able to satisfy
their need.&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;
&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;
&lt;p&gt;The problem with me answering this question is not that I don’t have
an opinion but as the question was posed I was reading Steve Freeman,
Nat Pryce on just that topic in their new book ‘Growing
Object-Oriented Software, Guided by Tests’.&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
to wrapping up the loose ends. The article is really a summary of what
I learnt during a pretty intense media web site development
project. Since pictures equate to 1000s of words here is my effort to
express how technologies can work symbiotically to delivery value that
is more than the sum of their parts.&lt;/p&gt;
&lt;p&gt;![Technology Synergy]({{ site.url }}/images/technology-synergy.jpg)&lt;/p&gt;
&lt;p&gt;But since systems are built from parts: here are the parts that we used.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.opensymphony.com/sitemesh/&#34;&gt;Extended SiteMesh&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;SiteMesh is a pretty amazing technology for creating web sites mashups
– or combining HTML documents on the server. We found that by
partitioning the content and the parts of the server that delivered
that content before combining the individual HTML documents together
using SiteMesh to be extremely effective. The server code for each
HTML document need only handle the a well defined area but the site
could be easily reconfigured to aggregate the content for new
purposes.&lt;/p&gt;
&lt;h2 id=&#34;in-memory-tests&#34; class=link_owner&gt;
  In memory tests
  &lt;a href=&#34;#in-memory-tests&#34; class=&#34;link icon&#34; aria-label=&#34;Link to section: In memory tests&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Think super fast builds, no deployment (in fact no need for a web
server), pure Java acceptance tests (i.e. refactorable) and the 80/20
rule on what is good enough to give you confidence that the system
works.&lt;/p&gt;
&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;
&lt;p&gt;We built into the application framework that enforced the PRG
pattern. POST request handlers could only return a redirect. Any
database access performed during a GET request worked with a read only
connection or a connection with an transaction rollback making GET
requests idempotent.&lt;/p&gt;
&lt;h2 id=&#34;simple-transaction-boundaries&#34; class=link_owner&gt;
  Simple transaction boundaries
  &lt;a href=&#34;#simple-transaction-boundaries&#34; class=&#34;link icon&#34; aria-label=&#34;Link to section: Simple transaction boundaries&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Transaction boundaries have been enforced so that developers do not
need to worry about them at all in production code. GET requests run
in a transaction that will always be rolled back, POST requests will
always commit if successful and always roll back if an exception is
thrown. Some serious work went into taming Hibernate so that it did
not auto commit, had no mutable static state and was completely
encapsulated.&lt;/p&gt;
&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;
&lt;p&gt;This enables much simpler JavaScript to be written (think JavaScript
that never needs to replicate the domain model or business rules on
the client) and allows for complete reuse of server side logic. This
combined with behaviour CSS bindings (
&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
nastiness and more semantic html.&lt;/p&gt;
&lt;h2 id=&#34;no-session-state-just-persistent-documents&#34; class=link_owner&gt;
  No Session State just persistent documents
  &lt;a href=&#34;#no-session-state-just-persistent-documents&#34; class=&#34;link icon&#34; aria-label=&#34;Link to section: No Session State just persistent documents&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The application servers had NO session state, all state changes to
documents are persisted which leads to a number of advantages: Users
never loose data they have filled in, marketing can see exactly how
far a user got before bailing out of a work flow. Users can return to
incomplete work and complete the tasks. Users can fill in data in any
order they want and only when they are ready do we action their
request. Domain objects are only updated once the document has been
validated.&lt;/p&gt;
&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;
&lt;p&gt;All stories are played vanilla html version first and a second story
for JavaScript enhancements. This leads to cleaner simpler semantic
html and also allows feedback from the first story to be tacked onto
the second story.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.stringtemplate.org/&#34;&gt;NO Logic in the View&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We are using StringTemplate to enforce that NO logic can be written in
the view, plus it’s super fast, has no “or loops” (think ruby each
blocks).&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
&lt;a href=&#34;http://code.google.com/p/fighting-layout-bugs/&#34;&gt;fighting layout bugs&lt;/a&gt;
seems to hold a glimmer of light for web developers. Definitely
something to check out. Michael Tamm presenting his brainchild is
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>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;
&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>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
along to the &lt;a href=&#34;http://www.meetup.com/Geeknight-Dallas/&#34;&gt;Dallas
Geeknight&lt;/a&gt; held at the &lt;a
href=&#34;http://www.thoughtworks.com&#34;&gt;ThoughtWorks&lt;/a&gt; offices there.&lt;/p&gt;
&lt;p&gt;The Dallas Geeknight is ‘oldschool’ which is not surprising since Paul
Hammant informed me he formed the original Geeknight in the UK. The
primary driver is producing code and committing that code to a
repository.&lt;/p&gt;
&lt;p&gt;At the start of the evening people offered up their current open
source projects elevator pitch style. I pitched two projects &lt;a
href=&#34;http://github.com/grahambrooks/bvira&#34;&gt;bvira&lt;/a&gt; and &lt;a
href=&#34;http://github.com/grahambrooks/intercept&#34;&gt;Intercept&lt;/a&gt;. There
was interest in both but as most people have their own web frameworks
the consensus was to work on &lt;a
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’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;
&lt;p&gt;Faced with the question ‘What do you do?’ from family and friends is
more challenging than it should be. Most other professions have been
around longer than a generation but writing software applications is
different. Especially for my parents and so this is for the vast
majority of people who don’t do what I do but would like some sort of
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
href=&#34;http://www.emacswiki.org/emacs/WebloggerMode&#34;&gt;WebloggerMode&lt;/a&gt;
some time ago I had not gotten around to trying it out so I thought I
would take it for a spin with this entry.&lt;/p&gt;
&lt;p&gt;Nothing earth shattering but the interface is clean and I have a
personal commitment to reaquaint myself with the power of emacs.&lt;/p&gt;
&lt;p&gt;Installation and setup is straightforward although I would like a
little more 1,2,3 style instructions. But then there are only 3 basic
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>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
have been trying looking forward to reading is &lt;a
HREF=&#34;http://pragprog.com/titles/mnee/release-it&#34;&gt;ReleaseIt&lt;/a&gt;. I had
heard very good things about the book and to my delight they are
true. If you are a developer building almost any sort of application
but in particular working on java based web applications you need to
read this book! I wish it had been available years ago and that I had
read it.&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;
&lt;p&gt;In my case I don’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>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;
&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;sx-source sx-ruby&#34;&gt;&lt;span class=&#34;sx-meta sx-require sx-ruby&#34;&gt;&lt;span class=&#34;sx-keyword sx-other sx-special-method sx-ruby&#34;&gt;require&lt;/span&gt; &lt;span class=&#34;sx-string sx-quoted sx-single sx-ruby&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-begin sx-ruby&#34;&gt;&amp;#39;&lt;/span&gt;open-uri&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-end sx-ruby&#34;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;sx-meta sx-require sx-ruby&#34;&gt;&lt;span class=&#34;sx-keyword sx-other sx-special-method sx-ruby&#34;&gt;require&lt;/span&gt; &lt;span class=&#34;sx-string sx-quoted sx-single sx-ruby&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-begin sx-ruby&#34;&gt;&amp;#39;&lt;/span&gt;hpricot&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-end sx-ruby&#34;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-begin sx-ruby&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sx-constant sx-numeric sx-ruby&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;sx-keyword sx-operator sx-ruby&#34;&gt;..&lt;/span&gt;&lt;span class=&#34;sx-constant sx-numeric sx-ruby&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-end sx-ruby&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-accessor sx-ruby&#34;&gt;.&lt;/span&gt;each &lt;span class=&#34;sx-keyword sx-control sx-start-block sx-ruby&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;sx-meta sx-block sx-parameters sx-ruby&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-parameters sx-begin sx-ruby&#34;&gt;|&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-meta sx-block sx-parameters sx-ruby&#34;&gt;&lt;span class=&#34;sx-variable sx-parameter sx-ruby&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;sx-meta sx-block sx-parameters sx-ruby&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-parameters sx-end sx-ruby&#34;&gt;|&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;

  doc &lt;span class=&#34;sx-keyword sx-operator sx-assignment sx-ruby&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;sx-variable sx-other sx-constant sx-ruby&#34;&gt;Hpricot&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-begin sx-ruby&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sx-support sx-function sx-builtin sx-ruby&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-begin sx-ruby&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sx-string sx-quoted sx-double sx-ruby&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-begin sx-ruby&#34;&gt;&amp;quot;&lt;/span&gt;http://railscasts.com/episodes?page=&lt;span class=&#34;sx-source sx-ruby sx-embedded sx-source&#34;&gt;&lt;span class=&#34;sx-punctuation sx-section sx-embedded sx-ruby&#34;&gt;#{&lt;/span&gt;page&lt;span class=&#34;sx-punctuation sx-section sx-embedded sx-ruby&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-end sx-ruby&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-end sx-ruby&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-end sx-ruby&#34;&gt;)&lt;/span&gt;

  &lt;span class=&#34;sx-punctuation sx-definition sx-group sx-begin sx-ruby&#34;&gt;(&lt;/span&gt;doc&lt;span class=&#34;sx-keyword sx-operator sx-arithmetic sx-ruby&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;sx-string sx-quoted sx-double sx-ruby&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-begin sx-ruby&#34;&gt;&amp;quot;&lt;/span&gt;a&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-end sx-ruby&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-end sx-ruby&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-accessor sx-ruby&#34;&gt;.&lt;/span&gt;each &lt;span class=&#34;sx-keyword sx-control sx-start-block sx-ruby&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;sx-meta sx-block sx-parameters sx-ruby&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-parameters sx-begin sx-ruby&#34;&gt;|&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-meta sx-block sx-parameters sx-ruby&#34;&gt;&lt;span class=&#34;sx-variable sx-parameter sx-ruby&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;sx-meta sx-block sx-parameters sx-ruby&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-parameters sx-end sx-ruby&#34;&gt;|&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    href &lt;span class=&#34;sx-keyword sx-operator sx-assignment sx-ruby&#34;&gt;=&lt;/span&gt; l&lt;span class=&#34;sx-punctuation sx-section sx-array sx-ruby&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;sx-constant sx-other sx-symbol sx-ruby&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-constant sx-ruby&#34;&gt;:&lt;/span&gt;href&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-section sx-array sx-ruby&#34;&gt;]&lt;/span&gt;
    &lt;span class=&#34;sx-keyword sx-control sx-ruby&#34;&gt;if&lt;/span&gt; href &lt;span class=&#34;sx-keyword sx-operator sx-comparison sx-ruby&#34;&gt;=~&lt;/span&gt; &lt;span class=&#34;sx-string sx-regexp sx-classic sx-ruby&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-ruby&#34;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-string sx-regexp sx-classic sx-ruby&#34;&gt;.*ipod_videos.*&lt;/span&gt;&lt;span class=&#34;sx-string sx-regexp sx-classic sx-ruby&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-ruby&#34;&gt;/&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;sx-keyword sx-control sx-ruby&#34;&gt;then&lt;/span&gt;
      file_name &lt;span class=&#34;sx-keyword sx-operator sx-assignment sx-ruby&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;sx-support sx-class sx-ruby&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-accessor sx-ruby&#34;&gt;.&lt;/span&gt;basename&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-begin sx-ruby&#34;&gt;(&lt;/span&gt;href&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-end sx-ruby&#34;&gt;)&lt;/span&gt;

      &lt;span class=&#34;sx-keyword sx-control sx-ruby&#34;&gt;unless&lt;/span&gt; &lt;span class=&#34;sx-support sx-class sx-ruby&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-accessor sx-ruby&#34;&gt;.&lt;/span&gt;exist?&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-begin sx-ruby&#34;&gt;(&lt;/span&gt;file_name&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-end sx-ruby&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;sx-keyword sx-control sx-ruby&#34;&gt;then&lt;/span&gt;
        &lt;span class=&#34;sx-support sx-function sx-builtin sx-ruby&#34;&gt;puts&lt;/span&gt; &lt;span class=&#34;sx-string sx-quoted sx-double sx-ruby&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-begin sx-ruby&#34;&gt;&amp;quot;&lt;/span&gt;Downloading &lt;span class=&#34;sx-source sx-ruby sx-embedded sx-source&#34;&gt;&lt;span class=&#34;sx-punctuation sx-section sx-embedded sx-ruby&#34;&gt;#{&lt;/span&gt;file_name&lt;span class=&#34;sx-punctuation sx-section sx-embedded sx-ruby&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-end sx-ruby&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;

        &lt;span class=&#34;sx-support sx-class sx-ruby&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-accessor sx-ruby&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;sx-support sx-function sx-builtin sx-ruby&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-begin sx-ruby&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sx-support sx-class sx-ruby&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-accessor sx-ruby&#34;&gt;.&lt;/span&gt;basename&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-begin sx-ruby&#34;&gt;(&lt;/span&gt;href&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-end sx-ruby&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-separator sx-ruby&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;sx-string sx-quoted sx-double sx-ruby&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-begin sx-ruby&#34;&gt;&amp;quot;&lt;/span&gt;w&lt;span class=&#34;sx-punctuation sx-definition sx-string sx-end sx-ruby&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-end sx-ruby&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;sx-keyword sx-control sx-start-block sx-ruby&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;sx-meta sx-block sx-parameters sx-ruby&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-parameters sx-begin sx-ruby&#34;&gt;|&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;sx-meta sx-block sx-parameters sx-ruby&#34;&gt;&lt;span class=&#34;sx-variable sx-parameter sx-ruby&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;sx-meta sx-block sx-parameters sx-ruby&#34;&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-parameters sx-end sx-ruby&#34;&gt;|&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
          file&lt;span class=&#34;sx-punctuation sx-accessor sx-ruby&#34;&gt;.&lt;/span&gt;write&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-begin sx-ruby&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sx-support sx-function sx-builtin sx-ruby&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-begin sx-ruby&#34;&gt;(&lt;/span&gt;href&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-end sx-ruby&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;sx-punctuation sx-accessor sx-ruby&#34;&gt;.&lt;/span&gt;read&lt;span class=&#34;sx-punctuation sx-definition sx-group sx-end sx-ruby&#34;&gt;)&lt;/span&gt;
        &lt;span class=&#34;sx-keyword sx-control sx-ruby&#34;&gt;end&lt;/span&gt;
      &lt;span class=&#34;sx-keyword sx-control sx-ruby&#34;&gt;end&lt;/span&gt;
    &lt;span class=&#34;sx-keyword sx-control sx-ruby&#34;&gt;end&lt;/span&gt;
  &lt;span class=&#34;sx-keyword sx-control sx-ruby&#34;&gt;end&lt;/span&gt;
&lt;span class=&#34;sx-keyword sx-control sx-ruby&#34;&gt;end&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;
&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;
&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;
&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
that after watching the original advertisement I was hooked. But was
all the hype justified?&lt;/p&gt;
&lt;p&gt;On first use if you are an iPhone user there are few surprises. The
larger touch screen is truly superb as an interface and the apps load
quickly. I was disappointed that the iBook application was not
installed by default and it took me a while to realize I had to
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
href=&#34;http://en.wikipedia.org/wiki/Post/Redirect/Get&#34;&gt;Post/Redirect/Get&lt;/a&gt;
or &lt;a
href=&#34;http://www.theserverside.com/news/1365146/Redirect-After-Post&#34;&gt;Redirect
after Post&lt;/a&gt; is an HTTP interaction pattern that can be used when
developing web applications. I have been mentioning it quite a few
times in my consulting work and thought I would take a stab a at
diving a little deeper in the pattern and its benefits.&lt;/p&gt;
&lt;h2 id=&#34;post-redirect-get-pattern&#34; class=link_owner&gt;
  Post-Redirect-Get pattern
  &lt;a href=&#34;#post-redirect-get-pattern&#34; class=&#34;link icon&#34; aria-label=&#34;Link to section: Post-Redirect-Get pattern&#34;&gt;
    &lt;svg aria-hidden=&#34;true&#34; focusable=&#34;false&#34;&gt;
      &lt;use xlink:href=&#34;#anchor-link&#34;&gt;&lt;/use&gt;
    &lt;/svg&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;![Basic Post Redirect Get pattern]({{ site.url }}/images/Basic-Post-Redirect-Get.png)&lt;/p&gt;
&lt;p&gt;The sequence diagram above shows how the pattern works to create a
resource. First the client requests a form that is used to create the
resource. The server obliges returning a HTTP 200 status code and the
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)
and Instant Messaging (IM) for even longer – although IM did not
become really popular until the mid 90’s with the emergence of GUI
clients. There are many similarities between the two systems but for
this article I am concentrating on the differences, specifically
around their use as a team communication medium.&lt;/p&gt;
&lt;p&gt;IM is optimised for point to point communication between
two people. There are options for group communication but this is
more of an exception where one person takes on the role of organiser
and brings other people into the conversation. IRC on the other
hand uses the channel concept, where a channel is synonymous with a
topic of conversation. The channel exists independent of the
participants in the conversation. Neither system offers a view of the
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
always a good thing for the user? When I first started working on GUI
applications (Windows 1.0) we worked very hard to get sub-second
response times. Now in theory applications running on multi-core 2+GHz
processors should out strip 286 CPUs running in the MHz range. What
seems to have append instead is that applications have maintained the
same sort of response times (in general) taking 1 or more seconds to
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;
&lt;p&gt;As anyone who knows me will say I have a thing about keyboards and
have a few in my current collection.&lt;/p&gt;
&lt;p&gt;On a whim today I bought the apple wireless keyboard thinking that I
would pair it with my laptop for when I am at home working at my
desk. I already have the wired version and have been very happy with
the feel of the keyboard. Unfortunately it occupies a USB slot and
when I have both my external drive and SLR connected I have to keep
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
have enjoyed
&lt;a href=&#34;http://www.extremeprogramming.org/rules/pair.html&#34;&gt;Pair Programming&lt;/a&gt;
and my programming skills have improved significantly. Working on a
problem with someone else full time is one of those practices that is
difficult to convince people off until they have actually tried
it. &lt;cite&gt;&lt;a href=&#34;http://collaboration.csc.ncsu.edu/laurie/&#34;&gt;Laurie
Williams&lt;/a&gt; at NCSU&lt;/cite&gt; has done some pretty interesting research
into the effectiveness of of pair programming, which is well worth a
read.&lt;/p&gt;
&lt;p&gt;There are various different styles of pair programming &lt;a
href=&#34;http://en.wikipedia.org/wiki/Pair_programming&#34;&gt;WikiPedia&lt;/a&gt;
talks about remote and ping-pong paring where people sit side by side
using the same screen, keyboard and mouse. Work is typically split
along test/application boundaries where one pair writes a test and the
other then implements the code to support the test. Control switches
back and forth between each of the pairs. The are many variations on
this including the use of two keyboards and mice. Pairing in this way
with a laptop is often quite difficult unless a separate keyboard and
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
could not resist just ‘getting on with it’. I had grand plans to plan
it out and record everything (good practice) but each step seemed so
simple it seemed simplest just to get stuck in.&lt;/p&gt;
&lt;p&gt;And for the most part it was simple. Running Unbuntu makes installing
software and tools a breeze and after a few hours of intermittent
changes everything was up and running from the old server.&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;
&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>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;
Look after your tools and they will look after you!
&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’s tools).&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;
&lt;p&gt;If I change the zoom setting then the document has been changed.&lt;/p&gt;
&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>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 ‘&lt;a
href=&#34;http://www.infoworld.com/d/adventures-in-it/painful-truth-about-age-discrimination-in-tech-209?page=0,3&#34;&gt;The
painful truth about age discrimination in tech&lt;/a&gt;’ left me a little
confused. Am I still considered a developer or have I given up the
mantle and considered a statistic.&lt;/p&gt;
&lt;p&gt;Do I cut code? - yes but not as much as I would like and it is not the
thing I do every day.&lt;/p&gt;
&lt;p&gt;Is there age discrimination? If there is it not that explicit or
something I have taken an offence at.&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;
&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;
&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;
&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
times recently so thought I would blog about it. The graph was popular
a few year ago in explaining the differences between and eXtream
Programming (XP) team cost and a waterfall team cost.  &lt;img
src=&#34;https://www.grahambrooks.com/images/XP-Wall-Graph.png&#34;
alt=&#34;XP Wall Graph.png&#34; border=&#34;0&#34; width=&#34;341&#34; height=&#34;209&#34;/&gt;&lt;/p&gt;
&lt;p&gt;The important thing to remember in interpreting the graph is that the
lifetime of a software system is typically far longer than the initial
development. Most systems spend much longer in ‘maintenance’ than they
ever did in ‘development’ so anything that can be done to make
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;
&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;
&lt;p&gt;![Samson microphone]({{ site.url }}/images/0F73A0E6-AE9E-440A-9593-D4D6B19E1F25.jpg)&lt;/p&gt;
&lt;p&gt;I tried a couple of microphones (including the built in mic on my MBP)
before settling on the &lt;a
href=&#34;http://www.samsontech.com/images/productimages/C01U-web.jpg&#34;&gt;Samson
C10U&lt;/a&gt;. The mic works well but I have not found it to be that
sensitive so have to position it between the laptop and me which
sometimes makes it difficult to type. Perhaps I will have to invest in
a boom to bring the mike over the top - although that may make it more
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;
&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;
&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;
&lt;p&gt;[flowplayer src=http://www.grahambrooks.com/video/testing-web-apps-episode-1.mp4 width=550 height=413 ]&lt;/p&gt;
&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>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>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
&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;
which makes interesting reading.&lt;/p&gt;
&lt;p&gt;It will be interesting to see where the concepts take us in the next
few years.&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;
&lt;p&gt;These ideas were presented as at &lt;a
href=&#34;http://www.thoughtworks.com&#34;&gt;ThoughtWorks&lt;/a&gt; &lt;a
href=&#34;http://connect.thoughtworks.com/agilesoutheast/&#34;&gt;Agile
Southeast&lt;/a&gt; conference in Atlanta. The idea for these diagrams
came about after the first time I spoke about web test driven
development at &lt;a
href=&#34;http://connect.thoughtworks.com/agileeast/&#34;&gt;Agile East&lt;/a&gt; in
Philadelphia and New York. I am striving to show how introducing a
level of abstraction affects development costs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Web applications should testing at various levels, from unit tests
through acceptance, workflow and performance (to name just a few
categories). For the purposes of this article Acceptance and Workflow
tests are defined as follows:&lt;/p&gt;&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;
&lt;p&gt;A couple of decades ago I spent quite a lot of time working on my
car. To be honest it was near the end of its life when I bought it at
auction but I had only saved/borrowed enough for a car of that age and
at the time I thought I knew a lot more about maintenance than I
really did but what I did not know I now had my own car to learn
from. As you might expect it was not too long before disaster struck
and driving home one day the engine died and resisted my attempts to
revive it. Time to to get stuck into car maintenance 101.&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>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;
&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>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 ‘WebTDD’ 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;
&lt;p&gt;I am really looking forward to this first speaking opportunity in the US this year.&lt;/p&gt;
&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;
&lt;p&gt;This photo was taken from the hotel bar on the top floor of the
&lt;a href=&#34;http://bellevue.hyatt.com/hyatt/hotels/index.jsp&#34;&gt;Hyatt Regency&lt;/a&gt;. We
were lucky to arrive just as the sun was setting. If you look closely
at the horizon you can just make out the mountain profile. Some are
already topped with snow.&lt;/p&gt;
&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
west cost after arriving on the east cost just over a week ago.&lt;/p&gt;
&lt;p&gt;The
&lt;a href=&#34;http://bellevue.hyatt.com/hyatt/hotels/index.jsp%22&#34;&gt;Hyatt Regency&lt;/a&gt;&lt;/a&gt;
here is a pretty nice hotel though and I look forward to a nice nights
sleep.&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;
&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;
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>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>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>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;
&lt;p&gt;
              This has got to be one of the ultimate demonstrations of agility, confidence and poise....
              &lt;object width=&#34;425&#34; height=&#34;344&#34;&gt;
                &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;
                &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/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;
              &lt;/object&gt;
            &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;
href=&#34;http://www.flickr.com/photos/grahambrooks/3734206465/&#34;&gt;&lt;img
class=&#34;alignleft&#34;
src=&#34;http://farm3.static.flickr.com/2547/3734206465_d72df18767.jpg&#34;
alt=&#34;DSC00731.JPG&#34; width=&#34;375&#34; height=&#34;500&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I found this whilst going through some old(ish) photos taken in
Shenandoah national park in 2006.&lt;/p&gt;
&lt;p&gt;It brought a lot of memories back about that trip - which was just a
weekend away but a little adventurous - the first time I had seen a
Bear in the wild and probably the hottest, dampest walk I have every
done.&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…&lt;/p&gt;
&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>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
things I end up brewing for each of these projects is some enhanced
management of runtime properties.&lt;/p&gt;
&lt;p&gt;Having said there are problems with using .properties files they are
well understood and supported by all the major Java tools and
IDEs. There would have to be a very strong reason to use another
format (and no I don’t mean XML).&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
