<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Jason Duffett</title>
  <subtitle>these things I do</subtitle>
  <link href="https://jasonduffett.net/feed.xml" rel="self" />
  <link href="https://jasonduffett.net/" />
  <updated>2026-06-11T00:00:00Z</updated>
  <id>https://jasonduffett.net/</id>
  <author>
    <name>Jason Duffett</name>
  </author>
  
  
  <entry>
    <title>Lose the constructs. Keep your composure.</title>
    <link href="https://jasonduffett.net/tech/introducing-composure-cdk/" />
    <updated>2026-06-11T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/introducing-composure-cdk/</id>
    <rights>© 2026 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;h2&gt;1. A better way, by example&lt;/h2&gt;
&lt;p&gt;In &lt;a href=&quot;https://jasonduffett.net/tech/what-is-wrong-with-cdk/&quot;&gt;Your infrastructure isn’t an app. So why is your CDK?&lt;/a&gt;
I argued that CDK’s most familiar frustrations all trace back to one design choice.
Think of the props threaded through five constructors, the stacks you can’t split
without a fight, the base class you extended because there was nowhere else to put
the behaviour. They’re symptoms of one cause: a Construct builds itself in its
constructor, so to &lt;em&gt;describe&lt;/em&gt; your infrastructure you have to run a program that
&lt;em&gt;constructs&lt;/em&gt; it. There’s no plain value you can read, diff, or hand to a colleague.&lt;/p&gt;
&lt;p&gt;Experienced teams avoid much of this with discipline and convention; my argument is that CDK’s
defaults make the good architecture the harder path, and &lt;strong&gt;&lt;a href=&quot;https://github.com/laazyj/composureCDK&quot;&gt;composureCDK&lt;/a&gt;&lt;/strong&gt;
makes it the path of least resistance. And it does so without leaving CDK behind:
&lt;em&gt;composureCDK&lt;/em&gt; keeps the language, the L2 constructs, and the whole ecosystem.
It changes only the part I wanted to change: how you describe the system before any of
it runs. You get the conciseness of a declarative structure and the clarity of explicit
dependencies, in a project that still reads as CDK to anyone who already knows CDK.&lt;/p&gt;
&lt;p&gt;Enough hand-waving. Here’s a whole system as a single value. It stands up a small
website: an S3 bucket behind a CloudFront distribution, an ACM certificate, Route 53
DNS, and a health check to confirm the thing’s actually up. It’s a trimmed-down cut
of the CDK that ships this very page, so it’s not a toy
(&lt;a href=&quot;https://github.com/laazyj/jasonduffett.net/blob/main/packages/cdk/src/system.ts&quot;&gt;source&lt;/a&gt;):&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// app.ts&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Components — a flat map of named builders.&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// DNS&lt;/span&gt;
    zone&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createHostedZoneBuilder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;zoneName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;domain&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    aliasRecords&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;zoneRecords&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token constant&quot;&gt;ALIAS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cloudfrontAliasTarget&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;cdn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;d&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; d&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;distribution&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token constant&quot;&gt;ALIAS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;www&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cloudfrontAliasTarget&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;cdn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;d&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; d&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;distribution&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;zone&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;zone&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;z&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; z&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hostedZone&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Certificate — DNS-validated against the zone&lt;/span&gt;
    cert&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createCertificateBuilder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;domainName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;domain&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;subjectAlternativeNames&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;www&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;validationZone&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;zone&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;z&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; z&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hostedZone&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Site&lt;/span&gt;
    bucket&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createBucketBuilder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    cdn&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createDistributionBuilder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;domainNames&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;domain&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; www&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;certificate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;cert&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;certificate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;defaultRootObject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;index.html&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;origin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bucket&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;b&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; S3BucketOrigin&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;withOriginAccessControl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;b&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;bucket&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;defaultBehavior&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; viewerProtocolPolicy&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ViewerProtocolPolicy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;REDIRECT_TO_HTTPS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    deploy&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createBucketDeploymentBuilder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sources&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Source&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;asset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;../site/dist&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;destinationBucket&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bucket&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;b&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;bucket&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;distribution&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;cdn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;d&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; d&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;distribution&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;distributionPaths&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/*&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Uptime health check on the public apex&lt;/span&gt;
    health&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createHealthCheckBuilder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;HealthCheckType&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;HTTPS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fqdn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;domain&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Dependencies — as data.&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    zone&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    aliasRecords&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;zone&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cdn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    cert&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;zone&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    bucket&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    cdn&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bucket&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cert&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    deploy&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bucket&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cdn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    health&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;stack&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Site&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2. Walkthrough — reading the example&lt;/h2&gt;
&lt;p&gt;The first thing you notice is that this is a clear declaration of the system’s
infrastructure: no misdirection, and no need to trace through levels of constructs
to grasp the high-level architecture. It declares the DNS zone (&lt;code&gt;zone&lt;/code&gt;) and records
(&lt;code&gt;aliasRecords&lt;/code&gt;), the site’s certificate (&lt;code&gt;cert&lt;/code&gt;), its asset store (&lt;code&gt;bucket&lt;/code&gt;),
distribution (&lt;code&gt;cdn&lt;/code&gt;), deployment (&lt;code&gt;deploy&lt;/code&gt;), and health checker (&lt;code&gt;health&lt;/code&gt;) right
there in front of you. You also see each component’s &lt;em&gt;dependencies&lt;/em&gt; laid out as a
second map.&lt;/p&gt;
&lt;p&gt;Each of those components is a &lt;a href=&quot;https://jasonduffett.net/tech/introducing-composure-cdk/#lifecycle&quot;&gt;&lt;em&gt;Lifecycle&lt;/em&gt;&lt;/a&gt;: &lt;em&gt;composureCDK&lt;/em&gt;’s minimal
contract for something that can be built. &lt;a href=&quot;https://jasonduffett.net/tech/introducing-composure-cdk/#compose&quot;&gt;&lt;code&gt;compose&lt;/code&gt;&lt;/a&gt; takes the map of
named Lifecycles, together with the dependency map, and assembles them into a
single Lifecycle of its own. That’s why &lt;em&gt;Lifecycle&lt;/em&gt; is the spine of the composure
architecture — because a composed system is itself a Lifecycle, systems nest as
components inside larger systems.&lt;/p&gt;
&lt;p&gt;The second thing you’ll notice (I’m guessing) is the &lt;a href=&quot;https://jasonduffett.net/tech/introducing-composure-cdk/#builder&quot;&gt;&lt;em&gt;Builders&lt;/em&gt;&lt;/a&gt;.
composureCDK uses the &lt;a href=&quot;https://en.wikipedia.org/wiki/Builder_pattern&quot;&gt;Builder Pattern&lt;/a&gt;
to express the underlying CDK constructs. This has many advantages, but most
importantly it separates the &lt;em&gt;declaration&lt;/em&gt; of a component’s configuration from the
&lt;em&gt;construction&lt;/em&gt; of the component itself.&lt;/p&gt;
&lt;p&gt;And finally, you’ll notice the &lt;a href=&quot;https://jasonduffett.net/tech/introducing-composure-cdk/#ref&quot;&gt;&lt;code&gt;ref&lt;/code&gt;&lt;/a&gt; that glues components to their
dependencies.&lt;/p&gt;
&lt;p&gt;For this simplified example, I’ve pushed everything into a single Stack. We’ll talk
more about Stack management in a future article.&lt;/p&gt;
&lt;p&gt;Now let’s drill down into the four core shapes we’ve identified.&lt;/p&gt;
&lt;h2&gt;3. The shapes&lt;/h2&gt;
&lt;p&gt;&lt;a id=&quot;lifecycle&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Lifecycle — good posture, by design&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Lifecycle&lt;/strong&gt; is the contract every component implements: a single
&lt;code&gt;build(scope, id, context)&lt;/code&gt; method that creates its CDK constructs and hands them
back. It is deliberately minimal — one method, no base class to extend, no
&lt;code&gt;super()&lt;/code&gt; to call; a component is anything with a matching &lt;code&gt;build&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Lifecycle&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Context&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;scope&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; IConstruct&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; context&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Context&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a id=&quot;compose&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;compose — a system is a value&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;compose&lt;/code&gt; assembles components (which are &lt;em&gt;Lifecycles&lt;/em&gt;) into a system, itself also a &lt;em&gt;Lifecycle&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;When compose is called, it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Builds a directed acyclic graph from the dependency declarations.&lt;/li&gt;
&lt;li&gt;Validates that the graph has no cycles. If a cycle is found, a &lt;code&gt;CyclicDependencyError&lt;/code&gt; is thrown immediately.&lt;/li&gt;
&lt;li&gt;Returns a new &lt;em&gt;Lifecycle&lt;/em&gt; whose build method topologically sorts the graph and builds each component in dependency order, passing the resolved outputs of its dependencies as context.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The &lt;em&gt;eager validation&lt;/em&gt; is a big win for CDK projects. Catching cyclic references this way
surfaces errors earlier, and with better diagnostics, than at synthesis time.&lt;/p&gt;
&lt;p&gt;Because the composed system returned by &lt;code&gt;compose&lt;/code&gt; is also a &lt;em&gt;Lifecycle&lt;/em&gt;, it can also
be used as a component in a larger system. Composition is recursive — systems can be
nested without special handling.&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Components &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; Record&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Lifecycle&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  components&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Components&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  dependencies&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Property &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;keyof&lt;/span&gt; Components&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Dependency&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Components&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a id=&quot;builder&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;The fluent builder — intent, not mutation&lt;/h3&gt;
&lt;p&gt;composureCDK exposes CDK constructs through fluent builder APIs. The shape buys a few things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The API surface is more discoverable than a large tree of nested props: after each &lt;code&gt;.&lt;/code&gt;, the IDE offers the next valid option with its documentation inline, so you configure a resource by autocompletion instead of having to know the shape of a deeply nested props object up front.&lt;/li&gt;
&lt;li&gt;It can enforce constraints between props (e.g. mutual exclusivity).&lt;/li&gt;
&lt;li&gt;It provides the extensibility behind another of composureCDK’s pillars: secure, operationally sound defaults (more in a later article).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To avoid re-declaring the entire &lt;code&gt;aws-cdk-lib&lt;/code&gt; API surface, builders are proxies over their
underlying construct’s props. The footprint stays small, and each builder automatically inherits
whatever the peer &lt;code&gt;aws-cdk-lib&lt;/code&gt; version exposes.&lt;/p&gt;
&lt;p&gt;&lt;a id=&quot;ref&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;ref — lazy wiring&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Lifecycle&lt;/em&gt;, &lt;em&gt;Builder&lt;/em&gt;, and &lt;code&gt;compose&lt;/code&gt; each solve a distinct problem. But there is a gap between them: &lt;strong&gt;builders are configured before their dependencies are built&lt;/strong&gt;. &lt;code&gt;Ref&amp;lt;T&amp;gt;&lt;/code&gt; lets us capture a reference at configuration time that resolves at build time and its partner &lt;code&gt;Resolvable&amp;lt;T&amp;gt;&lt;/code&gt; signposts the sites where
a lazy reference can be used.&lt;/p&gt;
&lt;p&gt;You can see this in the code snippet where the ACM &lt;code&gt;CertificateBuilder&lt;/code&gt; has the member
&lt;code&gt;validationZone(Resolvable&amp;lt;acm.IHostedZone&amp;gt;)&lt;/code&gt;. The system’s declaration glues this with a
&lt;code&gt;ref&lt;/code&gt;. The snippet above uses composure’s concise shorthand; annotate the callback parameter
and the same wiring is fully typed:&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;zone&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;z&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; HostedZoneBuilderResult&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; z&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hostedZone&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;zone&amp;quot;&lt;/code&gt; is the sibling component, declared as a dependency of &lt;code&gt;cert&lt;/code&gt; in the dependency map.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z&lt;/code&gt; is the result of building zone’s &lt;em&gt;Lifecycle&lt;/em&gt; (a &lt;code&gt;HostedZoneBuilderResult&lt;/code&gt; in this case).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hostedZone&lt;/code&gt; is an &lt;code&gt;IHostedZone&lt;/code&gt; prop of &lt;code&gt;HostedZoneBuilderResult&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With the parameter annotated, TypeScript checks the transform end to end: &lt;code&gt;z.hostedZone&lt;/code&gt; must
exist and must satisfy the &lt;code&gt;Resolvable&amp;lt;acm.IHostedZone&amp;gt;&lt;/code&gt; that &lt;code&gt;validationZone&lt;/code&gt; expects, so a
mistyped property or the wrong shape is a compile error.
The names you wire with are checked too, in two different ways. A dependency in the second
map is &lt;code&gt;keyof&lt;/code&gt; the component map, so a typo like &lt;code&gt;cdn: [&amp;quot;bukcet&amp;quot;]&lt;/code&gt; won’t compile. The component
name inside a &lt;code&gt;ref&lt;/code&gt; is a plain string, resolved when the system is built — so a typo there
fails fast with a clear error at build time, rather than passing silently.&lt;/p&gt;
&lt;p&gt;This is how cross-component wiring stays declarative instead of post-build glue.&lt;/p&gt;
&lt;h2&gt;4. “But an agent writes my CDK anyway”&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;That’s all very nice, Jason, but why do I care? I’m a 100x vibe-coder and agents do
all my coding!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Fair. So let’s assume an agent writes all of it. That makes the case for composure
&lt;em&gt;stronger&lt;/em&gt;, not weaker.&lt;/p&gt;
&lt;figure class=&quot;post-figure&quot;&gt;
  &lt;img src=&quot;https://jasonduffett.net/assets/vibe-coding-like-a-boss.webp&quot; alt=&quot;Hand-drawn editorial cartoon: a developer reclines in a deck chair with a drink and a closed laptop beside them, while a friendly robot lays bricks labelled S3, Lambda and Queue into a slightly crooked wall — building their cloud infrastructure for them.&quot; width=&quot;1584&quot; height=&quot;672&quot; decoding=&quot;async&quot; /&gt;
  &lt;figcaption&gt;The agent lays the bricks. The architecture is still yours.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;LLM coding agents like Claude Code are improving at a remarkable pace, but some limitations
in how they work are already clear. They behave like a capable but pressured engineer: they
read &lt;em&gt;just enough&lt;/em&gt; to start, then follow whatever patterns they find in the slice of the
codebase they’ve loaded. It’s fast, and in a small field of view it looks good: the local code
is neat and readable. Zoom out, though, and it is often not architecturally sound. Personal
experience and a growing body of research agree the costs land on the maintainability and
coherence of a codebase, for humans and agents alike.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem 1: Limited context.&lt;/strong&gt; An agent reasons over a bounded context window and reads only
&lt;em&gt;just enough&lt;/em&gt; to start. Tight coupling, like inheritance, and opaque API surfaces (a CDK Construct
is a fine example) force it to drag a swathe of the codebase into context just to understand one
function, diluting the signal it needs with noise. And context is finite: every token spends the
model’s
&lt;a href=&quot;https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents&quot;&gt;attention budget&lt;/a&gt;,
and recall degrades as the window fills.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem 2: Patterns compound.&lt;/strong&gt; Agents build on what already exists. An
&lt;a href=&quot;https://wiki.c2.com/?DeepClassHierarchies&quot;&gt;inheritance tower&lt;/a&gt; begets another level; props get
threaded through one more constructor; each session adds a little opacity. Thoughtworks names the
mechanism plainly: drift
&lt;a href=&quot;https://www.thoughtworks.com/radar/techniques/architecture-drift-reduction-with-llms&quot;&gt;“compounds as agents and humans replicate existing patterns, including degraded ones, creating a feedback loop where poor code begets poorer code”&lt;/a&gt;.
Whatever your codebase rewards, you get more of.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem 3: Conventions aren’t constraints.&lt;/strong&gt; The usual defence against all this is a convention:
a comment, a docstring, a line in &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; that says “register the dependency here.” But a
convention is text, and an agent treats it as text: a suggestion it can quietly ignore while still
producing code that compiles and runs. Only something the type system or the build &lt;em&gt;enforces&lt;/em&gt; is a
boundary it cannot cross. Leave an illegal state merely discouraged and
&lt;a href=&quot;https://aipatternbook.com/make-illegal-states-unrepresentable&quot;&gt;the agent will still write code that reaches it&lt;/a&gt;;
make that state unrepresentable and the option is gone.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ok, yeah. But how does composureCDK help?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;It’s declarative, not imperative.&lt;/strong&gt; A &lt;code&gt;compose&lt;/code&gt; system is &lt;em&gt;declared&lt;/em&gt;: every component, and every
dependency, laid out as data in one place. The agent gets the high-level architecture
without spelunking through constructors to reconstruct it. Research comparing a declarative
vs imperative user interface with computer-use agents measured a &lt;a href=&quot;https://arxiv.org/abs/2510.04607&quot;&gt;67% jump in success rate and a 43.5% drop in error-prone interaction steps&lt;/a&gt;. Describe the
&lt;em&gt;what&lt;/em&gt; instead of a program that builds it, and there’s far less for the agent to get wrong.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It’s local and loosely coupled.&lt;/strong&gt; The whole description lives in one value, so there’s less to
assemble in-context and less to hallucinate when it can’t. A component’s coupling is spelled out in
the dependency map, not hidden in a constructor, so its context carries more signal and less noise,
and re-use beats duplication. One controlled study found agents on cleaner code used
&lt;a href=&quot;https://arxiv.org/abs/2605.20049&quot;&gt;7–8% fewer tokens and revisited files 34% less often&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It enforces, rather than suggests.&lt;/strong&gt; A convention can be ignored; the dependency map can’t. To
connect one component to another you declare the dependency and reach it through a &lt;code&gt;ref&lt;/code&gt;. There’s no
implicit way to couple them, so coupling stays explicit: if two components are connected, the map
says so.&lt;/p&gt;
&lt;h2&gt;5. Conclusion + what’s next&lt;/h2&gt;
&lt;p&gt;I’ll be honest about the limits. This is a young project, and the larger claim, that a composure
codebase stays coherent as it grows, is still to prove. But my experience so far is that the
paradigm shift, moving from a program that &lt;em&gt;builds&lt;/em&gt; a description to a description you can &lt;em&gt;read&lt;/em&gt;
and &lt;em&gt;diff&lt;/em&gt;, is proving to be a satisfying and effective way to describe AWS infrastructure.&lt;/p&gt;
&lt;p&gt;In the next article, we’ll talk about one of the other pillars of composureCDK: infrastructure that
is secure and operationally mature — out of the box.&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;If you want to go deeper into any of the above topics, or are curious to know more, I
recommend the following links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/laazyj/composureCDK/blob/main/docs/architecture.md&quot;&gt;composureCDK/architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/stuartsierra/component&quot;&gt;Stuart Sierra’s Component framework for Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.thoughtworks.com/radar/techniques/architecture-drift-reduction-with-llms&quot;&gt;Thoughtworks Technology Radar (Apr 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dasroot.net/posts/2026/05/code-for-ai-reader-redesigning-architecture-llm-era/&quot;&gt;Code for the AI Reader: Redesigning Architecture for the LLM Era (dasroot)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents&quot;&gt;Effective Context Engineering for AI Agents (Anthropic)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2510.04607&quot;&gt;From Imperative to Declarative: Towards LLM-friendly OS Interfaces for Boosted Computer-Use Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/pdf/2603.13723&quot;&gt;Do AI Agents Really Improve Code Readability? (Mar 2026)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Your infrastructure isn&#39;t an app. So why is your CDK?</title>
    <link href="https://jasonduffett.net/tech/what-is-wrong-with-cdk/" />
    <updated>2026-05-23T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/what-is-wrong-with-cdk/</id>
    <rights>© 2026 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;Your CDK code &lt;em&gt;looks&lt;/em&gt; like a description of your infrastructure. It isn’t — it’s an &lt;em&gt;app&lt;/em&gt; that &lt;strong&gt;builds&lt;/strong&gt; the description, first in memory as a construct tree, then on disk as a CloudFormation template you didn’t write. Almost everything awkward about working with CDK starts there.&lt;/p&gt;
&lt;p&gt;Here’s a simple order/fulfilment system. Utterly ordinary CDK:&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// orders/orders-stack.ts&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;OrdersStack&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Stack&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;readonly&lt;/span&gt; uploads&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Bucket&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;scope&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Construct&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; props&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; StackProps&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;scope&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; props&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;uploads &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Bucket&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Uploads&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      encryption&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; BucketEncryption&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;S3_MANAGED&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; events &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Queue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Events&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; handler &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token builtin&quot;&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Handler&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      runtime&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Runtime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;NODEJS_20_X&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      handler&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;index.handler&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      code&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Code&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fromAsset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;dist&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      environment&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;BUCKET&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;uploads&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;bucketName &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;uploads&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;grantReadWrite&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;handler&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    handler&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventSource&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;SqsEventSource&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;events&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        batchSize&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        reportBatchItemFailures&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// fulfilment/fulfilment-stack.ts&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FulfilmentStackProps&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;StackProps&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  uploads&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Bucket&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FulfilmentStack&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Stack&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;scope&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Construct&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; props&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; FulfilmentStackProps&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;scope&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; props&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fulfil &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token builtin&quot;&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Fulfil&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      runtime&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Runtime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;NODEJS_20_X&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      handler&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;index.handler&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      code&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Code&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fromAsset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;dist/fulfilment&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    props&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;uploads&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;grantRead&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fulfil&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    props&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;uploads&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventNotification&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;EventType&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;OBJECT_CREATED&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;LambdaDestination&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fulfil&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And an &lt;code&gt;app.ts&lt;/code&gt; binds the two together:&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// app.ts&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; app &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; orders &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;OrdersStack&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;app&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Orders&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FulfilmentStack&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;app&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Fulfilment&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  uploads&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; orders&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;uploads&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Run this and synthesis does the rest, or so the pitch goes: each constructor mutates the tree, lazy tokens resolve into cross-references, and CloudFormation falls out the other end — no template written by hand.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But where is the description of the system?&lt;/strong&gt;
Even for this simple example it’s spread over 3 files, entwined in the ordering of the procedural code in the constructors of the two components, and dependencies must be hunted for by looking for method calls across the files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don’t believe me?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Fair enough. Then I guess you’ve already spotted the bug. This system fails at synthesis time. &lt;code&gt;grantRead&lt;/code&gt; puts an IAM policy on the fulfilment Lambda’s role pointing at the orders bucket; the bucket’s notification points back at the Lambda. Across the stack boundary those two references close a loop, and synthesis halts with a cyclic-reference error before any template exists. Nothing in the code looks wrong — and that’s exactly the problem. The form that would show the cycle at a glance — the dependencies laid out as data — is the one thing CDK never asks you to write.&lt;/p&gt;
&lt;p&gt;There &lt;em&gt;is&lt;/em&gt; a description — synthesis assembles one, and normally &lt;code&gt;cdk synth&lt;/code&gt; hands it to you as generated CloudFormation. But that’s an output, not the thing you author or reason about — and it’s the last place you’d catch a loop like this. You wrote a program to generate a description. The docs call it a “CDK app”, after all.&lt;/p&gt;
&lt;figure class=&quot;post-figure&quot;&gt;
  &lt;img src=&quot;https://jasonduffett.net/assets/your-infrastructure-as-an-app.webp&quot; alt=&quot;Cartoon hand holding a phone running infragram, a made-up social app for cloud infrastructure: an S3 bucket, an SQS queue and a Lambda function shown as likeable feed posts, above a big orange Deploy button.&quot; width=&quot;1693&quot; height=&quot;929&quot; decoding=&quot;async&quot; /&gt;
  &lt;figcaption&gt;Infrastructure-as-an-app, taken at its word.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;That’s the trade CDK made. Other popular infrastructure-as-code systems — &lt;a href=&quot;https://developer.hashicorp.com/terraform/intro&quot;&gt;Terraform’s HCL&lt;/a&gt;, &lt;a href=&quot;https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html&quot;&gt;CloudFormation’s own templates&lt;/a&gt;, &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview&quot;&gt;Azure’s Bicep&lt;/a&gt; — are &lt;em&gt;declarative&lt;/em&gt;: the file &lt;em&gt;is&lt;/em&gt; the description; the engine reconciles. CDK gave that up for the conveniences of a real programming language: types, loops, functions, the ability to factor out a pattern once and use it everywhere. That trade bought us something great, and cost us something we’re still paying for.&lt;/p&gt;
&lt;p&gt;But going back to YAML can’t be the answer. YAML &lt;em&gt;is&lt;/em&gt; the data, but YAML is miserable: no types, no reuse, no way to say “all my buckets look like this.” A typed declarative language like Bicep proves the concept — you can have types and reuse in the description itself without turning it into a program. CDK leaned on generic TypeScript instead, and lost the declarative context that makes infrastructure-as-code what it is. A language was the right instinct; the mistake was using it to write a &lt;em&gt;program&lt;/em&gt; that builds the description, instead of using it to write the description itself.&lt;/p&gt;
&lt;p&gt;Once you see that, the jankiness of CDK starts to line up: the props threaded through five constructors, the stacks you can’t split without a fight, the base class you extended because there was nowhere else to put the behaviour. None of these is the disease; they’re symptoms of one.&lt;/p&gt;
&lt;p&gt;This post is about that one idea. The cure can wait for another day; first I want to convince you the problem is real.&lt;/p&gt;
&lt;h2&gt;It isn’t the Stack&lt;/h2&gt;
&lt;p&gt;If you’ve worked on a CDK codebase that grew, you’ve had this conversation. How many stacks should this app have? Where should the database live — its own stack, the application stack, a shared “data” stack with the analytics warehouse? When you split, how do you pass values across? AWS publishes guidance. Every consultancy publishes guidance. None of it agrees, and none of it ever feels right.&lt;/p&gt;
&lt;p&gt;That argument is the most visible symptom of the problem I’m pointing at. It’s also a misdirection. A Stack is a unit of deployment, not a runtime resource. The argument keeps coming back because &lt;em&gt;something&lt;/em&gt; resists being lined up, and the Stack is the biggest knob the tool gives you. But the resistance isn’t coming from the Stack. It’s coming from every Construct underneath it.&lt;/p&gt;
&lt;p&gt;And it bites before you ever split a stack. Keep everything in &lt;code&gt;OrdersStack&lt;/code&gt;, let the team grow, and group the bucket, queue, and function into an &lt;code&gt;OrdersService&lt;/code&gt; so the stack just composes services. Now a second team needs a Lambda that also reads the orders queue, and every place to put it is a compromise: inside the service, where one team’s class grows another’s feature; beside it, where the service must expose its queue as a public field; or hoisted up to the stack, where the service no longer owns the queue that made it a service. None is wrong — they’re the same move in different clothes: there is no way to refer to a Construct except through the construct tree, and the only way to put one into the tree is to instantiate it, in place. Anything that needs a reference has to sit adjacent to it, or you thread the reference up to a common ancestor and back down.&lt;/p&gt;
&lt;p&gt;Faced with that, the easy move is to stop composing and start subclassing. Look at the familiar complaints with that frame in place — starting with the one it leads straight to.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://wiki.c2.com/?DeepClassHierarchies&quot;&gt;Inheritance towers&lt;/a&gt;.&lt;/strong&gt; Because a component &lt;em&gt;is&lt;/em&gt; a construct and a construct &lt;em&gt;is&lt;/em&gt; a class, the only handle you have for varying one is the class itself. “A service like &lt;em&gt;this&lt;/em&gt;, but with X” becomes a subclass; “but also with Y” becomes a subclass of that, or an ever-widening props object, or both. Shared L3 libraries are where this breaks down fastest: reuse is expressed through inheritance, so every consumer’s special case bloats the base or deepens the hierarchy, until the abstraction is too rigid to reuse and teams quietly fork it. Composition would sidestep all of it — but CDK only composes by construction. You can nest a construct inside another; you can’t hold a description as a value and assemble it later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/reactjs/what-is-prop-drilling-and-how-to-avoid-it/&quot;&gt;Props-drilling&lt;/a&gt;.&lt;/strong&gt; A reference can only travel through constructor calls. So when a value needs to reach somewhere five constructors away, it gets threaded through every constructor in between — including the ones that don’t use it. The wider the tree, the wider the props.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Implicit dependency graphs.&lt;/strong&gt; Dependencies between resources are inferred from where you reference one in another’s props. There’s no place to write “this depends on that.” When the inference is wrong, you fall back to &lt;code&gt;addDependency&lt;/code&gt; — the manual version of the thing the tool was meant to do for you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Duplicate Boilerplate.&lt;/strong&gt; When the same shape needs to appear with small differences (per-environment, per-tenant, per-region), the differences live in code, not data — because there is no data to vary, only constructors to call. Three stacks that should be one shape and three configurations become three classes that drift.&lt;/p&gt;
&lt;p&gt;Cross a Stack boundary and every one of these gets worse. A reference can no longer be a TypeScript variable; it has to become a &lt;code&gt;CfnOutput&lt;/code&gt; on one side, a &lt;code&gt;Fn::ImportValue&lt;/code&gt; on the other.&lt;/p&gt;
&lt;p&gt;You already watched this bite. The grant helpers read one way and wire the other: &lt;code&gt;bucket.grantRead(fulfil)&lt;/code&gt; looks like bucket-grants-to-fulfil, but &lt;a href=&quot;https://docs.aws.amazon.com/cdk/v2/guide/permissions.html&quot;&gt;the policy is attached to the grantee’s role&lt;/a&gt;, referencing the bucket. Within a stack that’s invisible; across the boundary the dependency runs opposite to the API, and the moment anything points back — as the bucket notification did — the two directions close into the circular reference from the opener. &lt;a href=&quot;https://github.com/aws/aws-cdk/issues/14213&quot;&gt;Open since 2021&lt;/a&gt;, &lt;a href=&quot;https://github.com/aws/aws-cdk/issues/26539&quot;&gt;still biting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The community calls this “stack splitting pain”. But splitting doesn’t create the problem — it only exposes it. The same dependency constraints exist entirely within a stack; the boundary merely makes them impossible to ignore, forcing you to admit in writing that your references were never values to begin with.&lt;/p&gt;
&lt;p&gt;None of this is a user mistake. The CDK didn’t ship a confusing template; it shipped the only template the model allows. &lt;code&gt;cdk init&lt;/code&gt; gives you layout, not architecture, because in the construct-composition model there is no other architecture available. Every codebase that grows past a few resources rediscovers the same shape — and the same fights — because there is no other shape to discover.&lt;/p&gt;
&lt;h2&gt;The fix&lt;/h2&gt;
&lt;p&gt;If all of this sounds depressing, it isn’t. There’s a way out — and it doesn’t involve giving up on CDK.&lt;/p&gt;
&lt;p&gt;Imagine the system from earlier looked like this:&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; system &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// resources&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    uploads&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bucket&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; encryption&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;S3_MANAGED&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    events&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;queue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    handler&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;lambda&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      runtime&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;nodejs20.x&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      handler&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;index.handler&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      code&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fromAsset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;dist&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      environment&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;BUCKET&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;uploads&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;bucketName &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      reads&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;uploads&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      consumes&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;events&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    fulfil&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;lambda&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      runtime&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;nodejs20.x&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      handler&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;index.handler&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      code&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fromAsset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;dist/fulfilment&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      reads&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;uploads&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      observes&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;uploads&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// dependencies&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    uploads&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    events&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    handler&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;uploads&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;events&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    fulfil&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;uploads&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No &lt;code&gt;new&lt;/code&gt;. No &lt;code&gt;this&lt;/code&gt;. No constructor side effects. Just the resources and the dependencies between them, laid out as data in a single file — a &lt;em&gt;clear, concise, unambiguous&lt;/em&gt; description of the system.&lt;/p&gt;
&lt;p&gt;This is what I want from infrastructure code: not a program that builds a description, but a description I can read, diff, and hand to someone else without a guided tour of five constructors. It isn’t a new wish — it’s what Terraform and Bicep already give you, what Stuart Sierra’s &lt;a href=&quot;https://github.com/stuartsierra/component&quot;&gt;Component&lt;/a&gt; gives you in Clojure. I just want it on CDK, without leaving the ecosystem I’m already in.&lt;/p&gt;
&lt;p&gt;So I’m building it. &lt;strong&gt;composureCDK&lt;/strong&gt; is my attempt at that shape. It’s still CDK underneath — it doesn’t escape what CDK can’t escape: CloudFormation’s gravity, logical-ID churn on rename, impure synth via &lt;code&gt;fromLookup&lt;/code&gt;, slow deploys. What it changes is the part I actually wanted to change: how I describe the system before any of that runs.&lt;/p&gt;
&lt;p&gt;And the symptoms from earlier — props-drilling, inheritance towers, implicit dependency graphs, the cross-stack grant inversion — stop being problems you have to live with. They stop being problems at all.&lt;/p&gt;
&lt;p&gt;That’s a tease. The next post unpacks the model — and shows why the shared-library reuse engineers have chased for years finally starts to click.&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Tidy your tests with ts-fake 1.0.0</title>
    <link href="https://jasonduffett.net/tech/tidy-your-tests-with-ts-fake/" />
    <updated>2026-03-28T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/tidy-your-tests-with-ts-fake/</id>
    <rights>© 2026 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;I spent a lot of 2024 and 2025 working on TypeScript monorepo projects. One thing that really bugged me: changes to database schema, API model, or DTO interfaces that would cascade type-check failures across dozens of unrelated tests. The tests didn’t actually depend on the new field — they just held a fully-populated fixture, and the literal stopped compiling.&lt;/p&gt;
&lt;p&gt;We tried a few approaches across these teams; none felt satisfying. So I wrote a ten-line utility called &lt;a href=&quot;https://github.com/laazyj/ts-fake&quot;&gt;&lt;code&gt;ts-fake&lt;/code&gt;&lt;/a&gt;, and after a year of using it across projects and - more recently watching coding agents pick it up cleanly - it’s now at &lt;strong&gt;1.0.0&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This post is a walk through the problem, the implementation (it really is ten lines), and how the library behaves when interfaces evolve.&lt;/p&gt;
&lt;h2&gt;The test I want to write&lt;/h2&gt;
&lt;p&gt;Suppose I’m testing this function:&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;processUser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; UserProfile&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Processing &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;username&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; from &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;organization&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;UserProfile&lt;/code&gt; is the usual chunky DTO:&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserProfile&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  userId&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  username&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  email&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  roles&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Role&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  organization&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Organization&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  metadata&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Record&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The function reads two fields. So the test should only need to mention two fields:&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;processUser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;/* ??? */&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Processing testuser from Test Co&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The question is what goes in the &lt;code&gt;???&lt;/code&gt;. Every option I’d reach for has a problem.&lt;/p&gt;
&lt;h2&gt;Four wrong answers&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. Build the whole object.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; user&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; UserProfile &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  userId&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;u-1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  username&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;testuser&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  email&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test@example.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  roles&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  organization&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;o-1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Test Co&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    settings&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  metadata&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Verbose, brittle, and the test now lies about what it depends on. Add a non-optional field to &lt;code&gt;UserProfile&lt;/code&gt; and every literal like this one breaks — including this test, which doesn’t care about the new field.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Share a fixture.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; aUser &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./fixtures&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; user &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;aUser&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; username&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;testuser&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now this test and every other one importing &lt;code&gt;aUser&lt;/code&gt; share state. Tweaking &lt;code&gt;aUser&lt;/code&gt; to suit one test risks breaking others, so people stop tweaking it. They adapt
their assertions to whatever data &lt;code&gt;aUser&lt;/code&gt; already has, rather than writing the data their test actually needs. The fixture becomes a constraint and the variation
that was the whole point of having multiple tests quietly disappears. Less typing that option 1, but a worse outcome.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Double-assert through &lt;code&gt;unknown&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; user &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  username&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;testuser&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  organization&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Test Co&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;unknown&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; UserProfile&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Compiles. Runs. Also compiles when you write &lt;code&gt;usrname: &amp;quot;testuser&amp;quot;&lt;/code&gt;. Also compiles when you forget &lt;code&gt;organization&lt;/code&gt; entirely and the function throws at runtime. The cast bypasses the type system — which is the only reason you reached for TypeScript in the first place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Use &lt;code&gt;Partial&amp;lt;UserProfile&amp;gt;&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; user&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Partial&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;UserProfile&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  username&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;testuser&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  organization&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Test Co&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; Organization&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;processUser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// ❌ Partial&amp;lt;UserProfile&gt; is not assignable to UserProfile&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Closer — at least the input is type-checked. But the function expects a &lt;code&gt;UserProfile&lt;/code&gt;, not a &lt;code&gt;Partial&amp;lt;UserProfile&amp;gt;&lt;/code&gt;, so you have to cast back, and now you’re at option 3 with extra steps.&lt;/p&gt;
&lt;h2&gt;The fix&lt;/h2&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; fake &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ts-fake&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; user &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;fake&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;UserProfile&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  username&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;testuser&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  organization&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Test Co&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;processUser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Processing testuser from Test Co&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The input is checked: &lt;code&gt;usrname&lt;/code&gt; errors, &lt;code&gt;organization: { naem: &amp;quot;x&amp;quot; }&lt;/code&gt; errors, passing a &lt;code&gt;number&lt;/code&gt; for &lt;code&gt;username&lt;/code&gt; errors. The output is typed as &lt;code&gt;UserProfile&lt;/code&gt;, so it slots straight into &lt;code&gt;processUser&lt;/code&gt; with no cast.&lt;/p&gt;
&lt;h2&gt;The whole library&lt;/h2&gt;
&lt;p&gt;Here’s the source. The whole thing:&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;DeepPartial&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;args&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;unknown&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;unknown&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;P&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;keyof&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; DeepPartial&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;P&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;fake&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;partial&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; DeepPartial&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;partial &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; partial &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s it. No proxies, no defaults, no runtime magic. The value &lt;code&gt;fake&amp;lt;T&amp;gt;(x)&lt;/code&gt; returns is literally &lt;code&gt;x&lt;/code&gt;. The work is all at the type level:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The input is &lt;code&gt;DeepPartial&amp;lt;T&amp;gt;&lt;/code&gt;, so the call site is checked against the interface — typos and shape mismatches fail to compile.&lt;/li&gt;
&lt;li&gt;The return type is &lt;code&gt;T&lt;/code&gt;, so callers don’t need to cast back. The function lies to the type system on the way out.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That lie is the whole point. At runtime &lt;code&gt;fake&amp;lt;T&amp;gt;(x)&lt;/code&gt; is just &lt;code&gt;x&lt;/code&gt; — unset fields are genuinely undefined, regardless of what TypeScript says. That’s the contract, not a hazard: the fake declares what the test depends on, and a test that reads past its declaration fails loudly. The failure tells you the test was depending on something the fixture never claimed, which is exactly what you want to know.&lt;/p&gt;
&lt;h2&gt;What happens when the interface changes&lt;/h2&gt;
&lt;p&gt;Here are three day-in-the-life scenarios demonstrating the maintainability claim.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 1 — you write the test.&lt;/strong&gt; As above. Two fields, three lines, passes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 30 — someone adds a field.&lt;/strong&gt; A non-optional &lt;code&gt;shippingAddress: Address&lt;/code&gt; is added to &lt;code&gt;UserProfile&lt;/code&gt;. Each option behaves differently:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The full-object fixture (option 1) breaks at the literal. The author has to invent a plausible &lt;code&gt;shippingAddress&lt;/code&gt; even though this test doesn’t read it.&lt;/li&gt;
&lt;li&gt;The double-assertion (option 3) silently keeps “working.” If anything reads &lt;code&gt;user.shippingAddress.country&lt;/code&gt; it returns &lt;code&gt;undefined&lt;/code&gt; and the test passes anyway, masking real bugs.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;fake&amp;lt;UserProfile&amp;gt;&lt;/code&gt; version compiles unchanged. If the test never touched the new field, it passes — zero maintenance cost. If something does read it (because the function under test was updated alongside the interface), the test fails loudly with &lt;code&gt;undefined&lt;/code&gt;, per the contract above, pointing at the exact field the fixture is missing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Day 60 — a typo.&lt;/strong&gt; Someone writes &lt;code&gt;fake&amp;lt;UserProfile&amp;gt;({ usrname: &amp;quot;testuser&amp;quot; })&lt;/code&gt;. TypeScript flags it as an unknown property. With &lt;code&gt;as unknown as UserProfile&lt;/code&gt; the same typo compiles, and you find out at runtime — if at all.&lt;/p&gt;
&lt;h2&gt;Nesting&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/laazyj/ts-fake/tree/main/examples&quot;&gt;examples in the repo&lt;/a&gt; use &lt;code&gt;fake&amp;lt;&amp;gt;&lt;/code&gt; recursively:&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; customer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;fake&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Customer&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jane&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  address&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;fake&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Address&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; city&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;NYC&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;DeepPartial&lt;/code&gt; already recurses, so you don’t strictly need the inner &lt;code&gt;fake&amp;lt;Address&amp;gt;&lt;/code&gt; — &lt;code&gt;address: { city: &amp;quot;NYC&amp;quot; }&lt;/code&gt; works fine. The reason to write the inner &lt;code&gt;fake&amp;lt;&amp;gt;&lt;/code&gt; is reuse:&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; nycAddress &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;fake&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Address&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; city&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;NYC&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; customer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;fake&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Customer&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jane&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; address&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; nycAddress &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; business &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;fake&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Customer&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Acme&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; address&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; nycAddress &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For one-off tests, inline the partial. For shared scaffolding, extract a &lt;code&gt;fake&amp;lt;&amp;gt;&lt;/code&gt; and reuse it.&lt;/p&gt;
&lt;h2&gt;When not to use it&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Not for production data.&lt;/strong&gt; There are no defaults — just &lt;code&gt;undefined&lt;/code&gt;. If something downstream actually needs a real &lt;code&gt;UserProfile&lt;/code&gt;, build a real &lt;code&gt;UserProfile&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not for realistic values or default-populated objects.&lt;/strong&gt; Use a value generator (e.g. &lt;code&gt;@faker-js/faker&lt;/code&gt;) or factory library (e.g. &lt;code&gt;fishery&lt;/code&gt;) instead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not when the type is small and pure data.&lt;/strong&gt; A literal you can write in full is its own spec. &lt;code&gt;fake&amp;lt;&amp;gt;&lt;/code&gt; earns its keep on types that carry hard-to-build pieces (nested objects, inline functions, injected dependencies) the test doesn’t exercise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not for runtime validation.&lt;/strong&gt; &lt;code&gt;fake&amp;lt;&amp;gt;&lt;/code&gt; produces a value the type system &lt;em&gt;believes&lt;/em&gt; is a &lt;code&gt;T&lt;/code&gt;. If you need an actual &lt;code&gt;T&lt;/code&gt;, build one.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;A note on coding agents&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;fake&amp;lt;T&amp;gt;&lt;/code&gt; is unusually friendly to coding agents because the type signature is the spec, and the spec is enforced at the call site. An agent can’t hallucinate &lt;code&gt;naem&lt;/code&gt;, can’t cast around the type system, and can’t drift from the interface as it evolves. This is why I’ve kept reaching for it on agent-driven projects: the boundary between “what the test cares about” and “what the type system enforces” stays sharp without anyone having to police it.&lt;/p&gt;
&lt;h2&gt;Try it&lt;/h2&gt;
&lt;p&gt;Ten lines on &lt;a href=&quot;https://www.npmjs.com/package/ts-fake&quot;&gt;npm&lt;/a&gt; and on &lt;a href=&quot;https://github.com/laazyj/ts-fake&quot;&gt;GitHub&lt;/a&gt;. Read the source — it’s quicker than reading this post. Break it and tell me what’s missing.&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>This Is the Life (uke arrangement)</title>
    <link href="https://jasonduffett.net/music/this-is-the-life/" />
    <updated>2025-09-13T00:00:00Z</updated>
    <id>https://jasonduffett.net/music/this-is-the-life/</id>
    
    <content type="html">&lt;p&gt;Amy Macdonald’s &lt;em&gt;This Is the Life&lt;/em&gt; is the title track from her 2007 debut — a
Scottish indie-folk anthem built on a single four-chord loop that never lets up.
The whole song circles &lt;strong&gt;Am – F – C – Em&lt;/strong&gt;, driven by a chugging “chuck” strum,
a catchy melodic hook, and strings and additional instrumentation (slide guitar?)
adding atmosphere. It was one of our favourite tracks from &lt;strong&gt;UkeHoot&lt;/strong&gt;’s 2025
Edinburgh Fringe shows, and it’s stayed in the set ever since — we still play it
regularly around toon, and it always gets the crowd singing along.&lt;/p&gt;
&lt;p&gt;This arrangement keeps things simple for a roomful of ukes: everyone holds the
Am–F–C–Em loop on a chucking strum leaving room for fiddle or other instruments to
riff over the melody. The tabs below pick out the little instrumental hooks —
&lt;em&gt;riff1&lt;/em&gt; is the rolling intro/instrumental run, &lt;em&gt;riff2&lt;/em&gt; sits under the second
verse, and &lt;em&gt;riff3&lt;/em&gt; answers it in the middle section. Transposed to &lt;strong&gt;Am&lt;/strong&gt; from
the original’s &lt;strong&gt;C#m&lt;/strong&gt;, and it rattles along at about 190 bpm.&lt;/p&gt;
&lt;p&gt;You can hear the original on Spotify:
&lt;a href=&quot;https://open.spotify.com/track/2T3jgoAMbBXiMMD8pSc6QL&quot;&gt;This Is the Life — Amy Macdonald&lt;/a&gt;.
And find out more about UkeHoot at &lt;a href=&quot;https://ukehoot.net/&quot;&gt;ukehoot.net&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This Is the Life&lt;/em&gt; was written by Amy Macdonald and released as the title track
of her 2007 debut album &lt;em&gt;This Is the Life&lt;/em&gt; (© 2007 Vertigo / Universal Music).
The lyrics and the underlying composition remain the property of their
copyright holders. The arrangement below is an unofficial fan transcription,
shared for personal study and non-commercial performance — no claim of
ownership is made over the song itself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Chords &amp;amp; lyrics&lt;/h2&gt;
&lt;pre class=&quot;language-chords&quot;&gt;&lt;code class=&quot;language-chords&quot;&gt;&lt;span class=&quot;token section&quot;&gt;[intro - chucking]&lt;/span&gt;
&lt;span class=&quot;token chord&quot;&gt;(Am)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Em)&lt;/span&gt;   &lt;span class=&quot;token section&quot;&gt;[stays this progression through the whole song]&lt;/span&gt;

Oh, the &lt;span class=&quot;token chord&quot;&gt;(Am)&lt;/span&gt; wind whistles down, the &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; cold dark street tonight
And the &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt; people they were dancing &lt;span class=&quot;token chord&quot;&gt;(Em)&lt;/span&gt; to the music vibe
And the &lt;span class=&quot;token chord&quot;&gt;(Am)&lt;/span&gt; boys chase the girls with the curls in their hair
While the &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; shy tormented youth sit way over there
And the &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt; songs they get louder, each one better than &lt;span class=&quot;token chord&quot;&gt;(Em)&lt;/span&gt; before   &lt;span class=&quot;token section&quot;&gt;[pause]&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[Chorus]&lt;/span&gt;
And you&#39;re singing the &lt;span class=&quot;token chord&quot;&gt;(Am)&lt;/span&gt; songs, thinking this is the life
And you wake up in the &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; morning and your head feels twice the size
Where you gonna go? &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt; Where you gonna go?
Where you gonna sleep &lt;span class=&quot;token chord&quot;&gt;(Em)&lt;/span&gt; tonight

And you&#39;re singing the &lt;span class=&quot;token chord&quot;&gt;(Am)&lt;/span&gt; songs, thinking this is the life
And you wake up in the &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; morning and your head feels twice the size
Where you gonna go? &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt; Where you gonna go?
Where you gonna sleep &lt;span class=&quot;token chord&quot;&gt;(Em)&lt;/span&gt; tonight
Where you gonna sleep &lt;span class=&quot;token chord&quot;&gt;(Am)&lt;/span&gt; tonight

&lt;span class=&quot;token section&quot;&gt;[instrumental: riff1]&lt;/span&gt;
&lt;span class=&quot;token chord&quot;&gt;(Am)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Em)&lt;/span&gt;   &lt;span class=&quot;token section&quot;&gt;[single strums, fiddle providing rhythm]&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[verse]&lt;/span&gt;
So you&#39;re &lt;span class=&quot;token chord&quot;&gt;(Am)&lt;/span&gt; heading down the road in your taxi for four
And you&#39;re &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; waiting outside Jimmy&#39;s front door
But &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt; nobody&#39;s in and nobody&#39;s home &#39;til &lt;span class=&quot;token chord&quot;&gt;(Em)&lt;/span&gt; four

&lt;span class=&quot;token section&quot;&gt;[verse: riff2]&lt;/span&gt;
So you&#39;re &lt;span class=&quot;token chord&quot;&gt;(Am)&lt;/span&gt; sitting there with nothing to do
Talking &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; about Robert Riger and his motley crew
And &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt; where you&#39;re gonna go and where you&#39;re gonna sleep &lt;span class=&quot;token chord&quot;&gt;(Em)&lt;/span&gt; tonight

&lt;span class=&quot;token section&quot;&gt;[Chorus]&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[instrumental: uke + fiddle]&lt;/span&gt;
&lt;span class=&quot;token chord&quot;&gt;(Am)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Em)&lt;/span&gt;   &lt;span class=&quot;token section&quot;&gt;[w/riff1]&lt;/span&gt;
&lt;span class=&quot;token chord&quot;&gt;(Am)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Em)&lt;/span&gt;   &lt;span class=&quot;token section&quot;&gt;[riff1 + riff3]&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[Chorus]&lt;/span&gt;   quiet, shuffle strum &lt;span class=&quot;token hint&quot;&gt;(with riff2 &amp;amp; fiddle)&lt;/span&gt;
&lt;span class=&quot;token section&quot;&gt;[Chorus]&lt;/span&gt;   verse 1 counterpoint singing &lt;span class=&quot;token hint&quot;&gt;(w/ riff2 &amp;amp; fiddle)&lt;/span&gt;
&lt;span class=&quot;token section&quot;&gt;[Chorus]&lt;/span&gt;   verse 2 counterpoint singing &lt;span class=&quot;token hint&quot;&gt;(w/ riff2, riff1 &amp;amp; fiddle)&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[outro: strumming + fiddle]&lt;/span&gt;
&lt;span class=&quot;token chord&quot;&gt;(Am)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Em)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Am)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Riff tabs&lt;/h2&gt;
&lt;p&gt;The instrumental hooks that the fiddle and a lead uke trade through the song.&lt;/p&gt;
&lt;pre class=&quot;language-tab&quot;&gt;&lt;code class=&quot;language-tab&quot;&gt;&lt;span class=&quot;token section&quot;&gt;[riff1]&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
C&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;

A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;
C&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;


&lt;span class=&quot;token section&quot;&gt;[riff2]&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
C&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;


&lt;span class=&quot;token section&quot;&gt;[riff3]&lt;/span&gt; &lt;span class=&quot;token hint&quot;&gt;(x2)&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
C&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Download&lt;/h2&gt;
&lt;p&gt;The full chart, lyrics, and tabs are in one PDF:
&lt;a href=&quot;https://jasonduffett.net/assets/posts/this-is-the-life/this-is-the-life.pdf&quot;&gt;This Is the Life (uke arrangement) — PDF&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>In Hell I&#39;ll Be in Good Company (uke arrangement)</title>
    <link href="https://jasonduffett.net/music/in-hell-ill-be-in-good-company/" />
    <updated>2025-08-02T00:00:00Z</updated>
    <id>https://jasonduffett.net/music/in-hell-ill-be-in-good-company/</id>
    
    <content type="html">&lt;p&gt;The Dead South’s &lt;em&gt;In Hell I’ll Be in Good Company&lt;/em&gt; is a banjo-and-cello murder
ballad that has no business being so damn catchy. It lurks in &lt;strong&gt;Gm&lt;/strong&gt;, marches
along on an off-beat strum, and is held together by a whistled hook and a banjo
riff that gets everyone stomping along. I saw them perform at &lt;em&gt;The Usher Hall&lt;/em&gt;
earlier in the year and I knew it was a perfect candidate for a ukulele strum-a-long.&lt;/p&gt;
&lt;p&gt;I worked this arrangement for &lt;em&gt;Routes &amp;amp; Rhythms&lt;/em&gt; — &lt;strong&gt;UkeHoot&lt;/strong&gt;’s 2025 Edinburgh
Fringe show. The transcription below splits the parts out so a roomful of ukes
can cover the original’s banjo, cello and vocal lines between them: melody/strumming
ukes carry the chords and whistling, a baritone takes the cello’s walking line,
and a banjo-uke handles the rolling banjo riff.&lt;/p&gt;
&lt;p&gt;You can hear the original on Spotify:
&lt;a href=&quot;https://open.spotify.com/track/6svak3qVN5xdaRDO1K041S&quot;&gt;In Hell I’ll Be in Good Company — The Dead South&lt;/a&gt;.
And find out more about UkeHoot at &lt;a href=&quot;https://ukehoot.net/&quot;&gt;ukehoot.net&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;In Hell I’ll Be in Good Company&lt;/em&gt; was written by Colton Crawford, Nate Hilts,
Danny Kenyon and Scott Pringle, and released by The Dead South on their 2014
album &lt;em&gt;Good Company&lt;/em&gt; (© 2014 Curve Music). The lyrics and the underlying
composition remain the property of their copyright holders. The arrangement
below is an unofficial fan transcription, shared for personal study and
non-commercial performance — no claim of ownership is made over the song
itself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Chords &amp;amp; lyrics&lt;/h2&gt;
&lt;pre class=&quot;language-chords&quot;&gt;&lt;code class=&quot;language-chords&quot;&gt;&lt;span class=&quot;token section&quot;&gt;[bass/baritone only]&lt;/span&gt;
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[whistling (w/melody ukes only)]&lt;/span&gt;
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt;      &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt;
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Cm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(D7)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[banjo riff, strumming]&lt;/span&gt;
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(D7)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt;

&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; Dead love couldn&#39;t go no further
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; Proud of and disgusted by her
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; Push, shove, a little bruised and battered
&lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; Oh Lord I ain&#39;t &lt;span class=&quot;token chord&quot;&gt;(D7)&lt;/span&gt; coming home with &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; you

&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; My life&#39;s a bit more colder
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; Dead wife is what I told her
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; Brass knife sinks into my shoulder
&lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; Oh babe don&#39;t know &lt;span class=&quot;token chord&quot;&gt;(D7)&lt;/span&gt; what I&#39;m gonna &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; do   &lt;span class=&quot;token section&quot;&gt;[banjo interlude]&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[off-beat strum]&lt;/span&gt;
&lt;span class=&quot;token hint&quot;&gt;(D7 single strum / bass run)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[off-beat strum]&lt;/span&gt;
I see my &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; red head, messed bed, tear shed, queen bee - my squeeze &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt;
The stage it &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; smells tells, hell&#39;s bells, misspells, knocks me on my &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; knees
It didn&#39;t &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; hurt flirt, blood squirt, stuffed shirt, hang me on a &lt;span class=&quot;token chord&quot;&gt;(Cm)&lt;/span&gt; tree
After I &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; count down, three rounds, in &lt;span class=&quot;token chord&quot;&gt;(D7)&lt;/span&gt; hell I&#39;ll be in good company &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[banjo riff, strumming]&lt;/span&gt;
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(D7)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt;

&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; Dead love couldn&#39;t go no further
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; Proud of and disgusted by her
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; Push, shove, a little bruised and battered
&lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; Oh Lord I ain&#39;t &lt;span class=&quot;token chord&quot;&gt;(D7)&lt;/span&gt; coming home with &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; you

&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; My life&#39;s a bit more colder
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; Dead wife is what I told her
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; Brass knife sinks into my shoulder
&lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; Oh babe don&#39;t know &lt;span class=&quot;token chord&quot;&gt;(D7)&lt;/span&gt; what I&#39;m gonna &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; do   &lt;span class=&quot;token section&quot;&gt;[banjo interlude]&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[off-beat strum]&lt;/span&gt;
&lt;span class=&quot;token hint&quot;&gt;(D7 single strum / bass run)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[off-beat strum]&lt;/span&gt;
I see my &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; red head, messed bed, tear shed, queen bee - my squeeze &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt;
The stage it &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; smells tells, hell&#39;s bells, misspells, knocks me on my &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; knees
It didn&#39;t &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; hurt flirt, blood squirt, stuffed shirt, hang me on a &lt;span class=&quot;token chord&quot;&gt;(Cm)&lt;/span&gt; tree
After I &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; count down, three rounds, in &lt;span class=&quot;token chord&quot;&gt;(D7)&lt;/span&gt; hell I&#39;ll be in good company &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[banjo riff, strumming]&lt;/span&gt;
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; In hell I&#39;ll be in &lt;span class=&quot;token chord&quot;&gt;(D7)&lt;/span&gt; good company &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt; In hell I&#39;ll be in &lt;span class=&quot;token chord&quot;&gt;(D7)&lt;/span&gt; good company &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[off-beat strum]&lt;/span&gt;
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[whistling, off-beat strum]&lt;/span&gt;
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt;      &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(F)&lt;/span&gt;
&lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Cm)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(D7)&lt;/span&gt; &lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Gm)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Baritone ukulele tab&lt;/h2&gt;
&lt;p&gt;Transposed from the original cello part — this is the walking bass line that
drives the verses.&lt;/p&gt;
&lt;pre class=&quot;language-tab&quot;&gt;&lt;code class=&quot;language-tab&quot;&gt;&lt;span class=&quot;token section&quot;&gt;[Intro]&lt;/span&gt;
 &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
B&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
D&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;


&lt;span class=&quot;token section&quot;&gt;[Whistling Verse]&lt;/span&gt;
 &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;F&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
B&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
D&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;

 &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;Cm&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;        &lt;span class=&quot;token chord&quot;&gt;D7&lt;/span&gt;        &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
B&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
D&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;


&lt;span class=&quot;token section&quot;&gt;[Pre-verse]&lt;/span&gt;
 &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                 &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;F&lt;/span&gt;         &lt;span class=&quot;token chord&quot;&gt;D7&lt;/span&gt;        &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
B&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
D&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;


&lt;span class=&quot;token section&quot;&gt;[Verse]&lt;/span&gt; &lt;span class=&quot;token hint&quot;&gt;(x2)&lt;/span&gt;
 &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;F&lt;/span&gt;         &lt;span class=&quot;token chord&quot;&gt;D7&lt;/span&gt;        &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
B&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
D&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;


&lt;span class=&quot;token section&quot;&gt;[Interlude]&lt;/span&gt;
 &lt;span class=&quot;token hint&quot;&gt;(n/c)&lt;/span&gt;             &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
B&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
D&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Banjo-ukulele tab&lt;/h2&gt;
&lt;p&gt;Transposed from the banjo. The verse and interlude are approximations of the
original’s rolls — close enough to sit under the strumming ukes.&lt;/p&gt;
&lt;pre class=&quot;language-tab&quot;&gt;&lt;code class=&quot;language-tab&quot;&gt;&lt;span class=&quot;token section&quot;&gt;[whistling]&lt;/span&gt;
 &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                                  &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------------------------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
C&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------------------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------------------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;


 &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;        &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                          &lt;span class=&quot;token chord&quot;&gt;F&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------------------------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
C&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------------------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------------------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;


 &lt;span class=&quot;token chord&quot;&gt;F&lt;/span&gt;         &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                          &lt;span class=&quot;token chord&quot;&gt;Cm&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------------------------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
C&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------------------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------------------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;


 &lt;span class=&quot;token chord&quot;&gt;Cm&lt;/span&gt;        &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                  &lt;span class=&quot;token chord&quot;&gt;D7&lt;/span&gt;        &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------------------------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
C&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------------------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------------------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;


&lt;span class=&quot;token section&quot;&gt;[verse]&lt;/span&gt; &lt;span class=&quot;token hint&quot;&gt;(approximation of original banjo)&lt;/span&gt;
 &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                                 &lt;span class=&quot;token chord&quot;&gt;F&lt;/span&gt;   &lt;span class=&quot;token chord&quot;&gt;D7&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------------------------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
C&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;


&lt;span class=&quot;token section&quot;&gt;[interlude]&lt;/span&gt;
 &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                                                     &lt;span class=&quot;token hint&quot;&gt;(D7 - bass run)&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;
C&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------------------------------------------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------------------------------------------------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;


&lt;span class=&quot;token section&quot;&gt;[chorus]&lt;/span&gt; &lt;span class=&quot;token hint&quot;&gt;(x = denotes un-played 1/8s)&lt;/span&gt;
 &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                  &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
C&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;


 &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;F&lt;/span&gt;                   &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;Cm&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
C&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;


 &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;        &lt;span class=&quot;token chord&quot;&gt;D7&lt;/span&gt;        &lt;span class=&quot;token chord&quot;&gt;Gm&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
C&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Download&lt;/h2&gt;
&lt;p&gt;The full chart, both tabs, and the section notes are in one PDF:
&lt;a href=&quot;https://jasonduffett.net/assets/posts/in-hell-ill-be-in-good-company/in-hell-ill-be-in-good-company.pdf&quot;&gt;In Hell I’ll Be in Good Company (uke arrangement) — PDF&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Don&#39;t Let Me Down (uke arrangement)</title>
    <link href="https://jasonduffett.net/music/dont-let-me-down/" />
    <updated>2025-07-18T00:00:00Z</updated>
    <id>https://jasonduffett.net/music/dont-let-me-down/</id>
    
    <content type="html">&lt;p&gt;The Beatles’ &lt;em&gt;Don’t Let Me Down&lt;/em&gt; is a raw, slow-burning Lennon love song with a
chorus you can bawl across a room. The &lt;strong&gt;5/4&lt;/strong&gt; bars in the verse leave the listener
hanging for the resolution of the second line, and then in comes that chorus —
“Don’t Let Me Down”! I’ve transposed it down a step to &lt;strong&gt;Dm&lt;/strong&gt; for ukulele ergonomics
and included a fair approximation of Billy Preston’s Rhodes riff. Big thanks to
UkeHoot’s Jonathan for the bass parts.&lt;/p&gt;
&lt;p&gt;The Beatles only ever played this one in public once — on the rooftop of the
Apple building in London on 30 January 1969, during what turned out to be their
final live performance. UkeHoot’s own debut was a shade lower-key: the 2024
Beatles Marathon at &lt;em&gt;Portobello Town Hall&lt;/em&gt; in November 2024, where it went down
a storm. So we’re dusting it off for &lt;em&gt;Routes &amp;amp; Rhythms&lt;/em&gt; — &lt;strong&gt;UkeHoot&lt;/strong&gt;’s 2025
Edinburgh Fringe show.&lt;/p&gt;
&lt;p&gt;The transcription below splits the parts so a roomful of ukes can cover the
original between them: melody ukes carry the chords and the four riffs, and a
bass (or a baritone an octave up) takes Macca’s bass line — set out separately
for the chorus, verses, middle 8 and outro.&lt;/p&gt;
&lt;p&gt;You can hear the original on Spotify:
&lt;a href=&quot;https://open.spotify.com/track/3evG0BIqEFMMP7lVJh1cSf&quot;&gt;Don’t Let Me Down — The Beatles&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To find out more about UkeHoot and upcoming Fringe shows, head to &lt;a href=&quot;https://ukehoot.net/&quot;&gt;ukehoot.net&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Don’t Let Me Down&lt;/em&gt; was written by John Lennon and Paul McCartney, and released
by The Beatles in 1969 as the B-side to &lt;em&gt;Get Back&lt;/em&gt; (© 1969 Apple Records). The
lyrics and the underlying composition remain the property of their copyright
holders. The arrangement below is an unofficial fan transcription, shared for
personal study and non-commercial performance — no claim of ownership is made
over the song itself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Chords &amp;amp; lyrics&lt;/h2&gt;
&lt;pre class=&quot;language-chords&quot;&gt;&lt;code class=&quot;language-chords&quot;&gt;&lt;span class=&quot;token section&quot;&gt;[Intro (riff)]&lt;/span&gt;
&lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[chorus]&lt;/span&gt;
Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(Dm7)&lt;/span&gt;, Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;
Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(Dm7)&lt;/span&gt;, Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[verse]&lt;/span&gt;
&lt;span class=&quot;token section&quot;&gt;[5/4]&lt;/span&gt; &lt;span class=&quot;token hint&quot;&gt;(n/c)&lt;/span&gt; Nobody ever loved me like she
&lt;span class=&quot;token section&quot;&gt;[4/4]&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Dm7)&lt;/span&gt; does, ooh she does, yes she does &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;
&lt;span class=&quot;token section&quot;&gt;[5/4]&lt;/span&gt; &lt;span class=&quot;token hint&quot;&gt;(n/c)&lt;/span&gt; And if somebody loved me like she
&lt;span class=&quot;token section&quot;&gt;[4/4]&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Dm7)&lt;/span&gt; do me, ooh she do me, yes she does &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[chorus]&lt;/span&gt;
Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(Dm7)&lt;/span&gt;, Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;
Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(Dm7)&lt;/span&gt;, Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[middle 8]&lt;/span&gt;
&lt;span class=&quot;token hint&quot;&gt;(n/c, bass only)&lt;/span&gt; I&#39;m in love for the &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt; first time, don&#39;t you know it&#39;s gonna
&lt;span class=&quot;token chord&quot;&gt;(G)&lt;/span&gt; last. It&#39;s a &lt;span class=&quot;token chord&quot;&gt;(G7)&lt;/span&gt; love that lasts &lt;span class=&quot;token chord&quot;&gt;(G)&lt;/span&gt; forever, it&#39;s a &lt;span class=&quot;token chord&quot;&gt;(G7)&lt;/span&gt; love that had no past &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;
&lt;span class=&quot;token chord&quot;&gt;(Csus4)&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[chorus]&lt;/span&gt;
Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(Dm7)&lt;/span&gt;, Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;
Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(Dm7)&lt;/span&gt;, Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[verse]&lt;/span&gt;
&lt;span class=&quot;token section&quot;&gt;[5/4]&lt;/span&gt; &lt;span class=&quot;token hint&quot;&gt;(n/c)&lt;/span&gt; And from the first time that she really
&lt;span class=&quot;token section&quot;&gt;[4/4]&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Dm7)&lt;/span&gt; done me, ooh she done me, she done me good &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;
&lt;span class=&quot;token section&quot;&gt;[5/4]&lt;/span&gt; &lt;span class=&quot;token hint&quot;&gt;(n/c)&lt;/span&gt; I guess nobody ever really
&lt;span class=&quot;token section&quot;&gt;[4/4]&lt;/span&gt; &lt;span class=&quot;token chord&quot;&gt;(Dm7)&lt;/span&gt; done me, ooh she done me, she done me good &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[chorus]&lt;/span&gt;
Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(Dm7)&lt;/span&gt;, Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;
Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(Dm7)&lt;/span&gt;, Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[chorus (squeals and adlibs)]&lt;/span&gt;
Oooooooo, squeal &lt;span class=&quot;token chord&quot;&gt;(Dm7)&lt;/span&gt;, and other weird noises &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;
keep on &lt;span class=&quot;token chord&quot;&gt;(Dm7)&lt;/span&gt;, squealing &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;[chorus]&lt;/span&gt;
Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(Dm7)&lt;/span&gt;, Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;
Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(Dm7)&lt;/span&gt;, Don&#39;t let me down &lt;span class=&quot;token chord&quot;&gt;(C)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Lead ukulele riffs&lt;/h2&gt;
&lt;p&gt;The four riffs that carry the song. Tempo is a slow &lt;strong&gt;76 bpm&lt;/strong&gt; — or count it in
double time at 152 if that sits better under your strum.&lt;/p&gt;
&lt;pre class=&quot;language-tab&quot;&gt;&lt;code class=&quot;language-tab&quot;&gt;&lt;span class=&quot;token section&quot;&gt;[Riff 1: Intro]&lt;/span&gt;
  &lt;span class=&quot;token chord&quot;&gt;C&lt;/span&gt;                                      &lt;span class=&quot;token chord&quot;&gt;Dm&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;/&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;/&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
C&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token technique&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;


&lt;span class=&quot;token section&quot;&gt;[Riff 2: intro to verse]&lt;/span&gt;
   &lt;span class=&quot;token chord&quot;&gt;C&lt;/span&gt;                              &lt;span class=&quot;token chord&quot;&gt;Dm7&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
C&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------------------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------------------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
  No&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;bo&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;dy ev&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;er loved me like she  does...


&lt;span class=&quot;token section&quot;&gt;[Riff 3: verse]&lt;/span&gt;
  &lt;span class=&quot;token chord&quot;&gt;Dm7&lt;/span&gt;                            &lt;span class=&quot;token chord&quot;&gt;Dm7&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
C&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------------------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------------------------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;


&lt;span class=&quot;token section&quot;&gt;[Riff 4: bridge]&lt;/span&gt;
  &lt;span class=&quot;token chord&quot;&gt;C&lt;/span&gt;               &lt;span class=&quot;token chord&quot;&gt;C&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;G&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;G7&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;G&lt;/span&gt;               &lt;span class=&quot;token chord&quot;&gt;G7&lt;/span&gt;               &lt;span class=&quot;token chord&quot;&gt;C&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
C&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Bass tab&lt;/h2&gt;
&lt;p&gt;Macca’s bass line, split out by section. Each block loops under the chords above.&lt;/p&gt;
&lt;pre class=&quot;language-tab&quot;&gt;&lt;code class=&quot;language-tab&quot;&gt;&lt;span class=&quot;token section&quot;&gt;[Bass: chorus]&lt;/span&gt;
   &lt;span class=&quot;token chord&quot;&gt;Dm7&lt;/span&gt;                                &lt;span class=&quot;token chord&quot;&gt;C&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
D&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;


&lt;span class=&quot;token section&quot;&gt;[Bass: verses]&lt;/span&gt;
   &lt;span class=&quot;token chord&quot;&gt;Dm7&lt;/span&gt;                                &lt;span class=&quot;token chord&quot;&gt;C&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
D&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;


&lt;span class=&quot;token section&quot;&gt;[Bass: middle 8]&lt;/span&gt;
    N/C              &lt;span class=&quot;token chord&quot;&gt;C&lt;/span&gt;                 &lt;span class=&quot;token chord&quot;&gt;C&lt;/span&gt;               &lt;span class=&quot;token chord&quot;&gt;G&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
D&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;

    &lt;span class=&quot;token chord&quot;&gt;G&lt;/span&gt;    &lt;span class=&quot;token chord&quot;&gt;G7&lt;/span&gt;          &lt;span class=&quot;token chord&quot;&gt;G&lt;/span&gt;                &lt;span class=&quot;token chord&quot;&gt;G&lt;/span&gt;    &lt;span class=&quot;token chord&quot;&gt;G7&lt;/span&gt;      &lt;span class=&quot;token chord&quot;&gt;C&lt;/span&gt;         &lt;span class=&quot;token chord&quot;&gt;G&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
D&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;


&lt;span class=&quot;token section&quot;&gt;[Bass: outro]&lt;/span&gt;
   &lt;span class=&quot;token chord&quot;&gt;Dm7&lt;/span&gt;                               &lt;span class=&quot;token chord&quot;&gt;C&lt;/span&gt;
G&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
D&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
A&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token fret&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;--------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;
E&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;----------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token dash&quot;&gt;---------------&lt;/span&gt;&lt;span class=&quot;token bar&quot;&gt;|&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or slide the G-string notes up to the 12th and 10th frets on the D string —
sounds great if you can reach it.&lt;/p&gt;
&lt;h2&gt;Download&lt;/h2&gt;
&lt;p&gt;The full chart, both tabs, and the section notes are in one PDF:
&lt;a href=&quot;https://jasonduffett.net/assets/posts/dont-let-me-down/dont-let-me-down.pdf&quot;&gt;Don’t Let Me Down (uke arrangement) — PDF&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Don&#39;t Worry Be Happy (uke arrangement)</title>
    <link href="https://jasonduffett.net/music/dont-worry-be-happy/" />
    <updated>2018-04-07T00:00:00Z</updated>
    <id>https://jasonduffett.net/music/dont-worry-be-happy/</id>
    
    <content type="html">&lt;p&gt;Bobby McFerrin’s &lt;em&gt;Don’t Worry Be Happy&lt;/em&gt; for ukulele, including the whistling riff.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.dropbox.com/s/srhxumiqm614ag7/Don%27t%20Worry%20Be%20Happy.pdf?dl=0&quot;&gt;Don’t Worry Be Happy.pdf&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>The Boys Are Back In Town (uke arrangement)</title>
    <link href="https://jasonduffett.net/music/the-boys-are-back-in-town/" />
    <updated>2017-06-13T00:00:00Z</updated>
    <id>https://jasonduffett.net/music/the-boys-are-back-in-town/</id>
    
    <content type="html">&lt;p&gt;The Thin Lizzy classic — &lt;em&gt;The Boys Are Back In Town&lt;/em&gt; — as they always intended it to be played… on ukulele! Transcribed in ‘A’, original was down a half step in Ab.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.dropbox.com/s/9hi8dninxw2ihef/The%20Boys%20Are%20Back%20In%20Town.pdf?dl=0&quot;&gt;The Boys Are Back In Town.pdf&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Citrix NetScaler VPX + Safari compatibility</title>
    <link href="https://jasonduffett.net/tech/citrix-netscaler-vpx-safari-compatibility/" />
    <updated>2015-01-02T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/citrix-netscaler-vpx-safari-compatibility/</id>
    <rights>© 2015 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;I found an interesting problem while configuring cipher suites on a NetScaler VPX appliance. With the 10.5+ firmware you have access to all of the &lt;a href=&quot;http://support.citrix.com/proddocs/topic/netscaler-traffic-management-10-5-map/ns-ssl-supported-ciphers-list-ref.html&quot;&gt;TLS1.2 cipher suites&lt;/a&gt; even though they are not compatible with the VPX platform (only MDX/SDX/etc).&lt;/p&gt;
&lt;p&gt;We use both MPX &amp;amp; VPX so I wanted to keep the configurations consistent across both platforms. This shouldn’t have been a problem as they just aren’t used, so I configured a cipher group using the following suites in order to enable &lt;a href=&quot;https://community.qualys.com/blogs/securitylabs/2013/06/25/ssl-labs-deploying-forward-secrecy&quot;&gt;Perfect Forward Secrecy&lt;/a&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;TLS1.2-ECDHE-RSA-AES128-GCM-SHA256&lt;/li&gt;
&lt;li&gt;TLS1.2-ECDHE-RSA-AES-128-SHA256&lt;/li&gt;
&lt;li&gt;TLS1-ECDHE-RSA-AES128-SHA&lt;/li&gt;
&lt;li&gt;TLS1.2-DHE-RSA-AES128-GCM-SHA256&lt;/li&gt;
&lt;li&gt;TLS1.2-DHE-RSA-AES-128-SHA256&lt;/li&gt;
&lt;li&gt;TLS1-DHE-RSA-AES-128-CBC-SHA&lt;/li&gt;
&lt;li&gt;SSL3-EDH-RSA-DES-CBC3-SHA&lt;/li&gt;
&lt;li&gt;TLS1.2-AES128-GCM-SHA256&lt;/li&gt;
&lt;li&gt;TLS1.2-AES-128-SHA256&lt;/li&gt;
&lt;li&gt;TLS1-AES-128-CBC-SHA&lt;/li&gt;
&lt;li&gt;SSL3-DES-CBC3-SHA&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This worked great with most browsers I tested and &lt;a href=&quot;https://www.ssllabs.com/ssltest/&quot;&gt;Qualys SSL Labs&lt;/a&gt; showed it compatible with everything but IE6/XP. As expected the TLS1.2 suites were ignored and most browsers negotiated to use TLS-ECDHE-RSA-AES128-SHA.&lt;/p&gt;
&lt;p&gt;But Safari, on both OS X Yosemite and iOS 8.1.2, failed to establish a connection. Wireshark showed that although the client + server negotiated to use TLS_ECDHE_RSA_WITH_ARS_128_CBC_SHA256 but the Client Key Exchange failed with TLS Alert 21 (Decryption Failed).
On OS X, both Chrome + Firefox were fine and used the same suite, and IE11 on Windows 8.1 also had no problems. But for whatever reason Safari on both OS X and iOS wouldn’t establish a secure connection…&lt;/p&gt;
&lt;p&gt;Anyway, to save you the trouble the fix is quite simple - just remove all the &lt;strong&gt;TLS1.2-*&lt;/strong&gt; cipher suites. Since they don’t work on VPX anyway the only inconvenience is a slightly different configuration between VPX and MPX.&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Recording deployments in New Relic with PowerShell&#39;s Invoke-WebRequest</title>
    <link href="https://jasonduffett.net/tech/recording-deployments-in-new-relic-with-powershells/" />
    <updated>2014-04-15T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/recording-deployments-in-new-relic-with-powershells/</id>
    <rights>© 2014 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;If you’re not using &lt;a href=&quot;http://newrelic.com/&quot;&gt;New Relic&lt;/a&gt; to monitor your ASP.NET applications then you definitely should be, it’s an awesome tool providing a huge insight into how your application is running in the real world.&lt;/p&gt;
&lt;p&gt;One of the useful things you can do is record deployment events in New Relic so you can see the relative performance of different versions of your applications. There is documentation provided for using curl to do this, but we don’t have curl available in our environment. Rather than pushing it out onto the servers I wrote a simple PowerShell script that is included in our deployment process (using the excellent &lt;a href=&quot;https://octopusdeploy.com/&quot;&gt;Octopus Deploy&lt;/a&gt;).&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$NewRelicUri&lt;/span&gt; = &lt;span class=&quot;token string&quot;&gt;&quot;https://api.newrelic.com/deployments.xml&quot;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$body&lt;/span&gt; = @&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;deployment[application_id]&quot;&lt;/span&gt; = &lt;span class=&quot;token string&quot;&gt;&quot;123456&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;deployment[description]&quot;&lt;/span&gt;=&lt;span class=&quot;token string&quot;&gt;&quot;This deployment was sent using PowerShell&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;deployment[revision]&quot;&lt;/span&gt;= &lt;span class=&quot;token string&quot;&gt;&quot;2242&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;deployment[changelog]&quot;&lt;/span&gt;= &lt;span class=&quot;token string&quot;&gt;&quot;many hands make light work&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;deployment[user]&quot;&lt;/span&gt;=&lt;span class=&quot;token string&quot;&gt;&quot;Your name&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Sending notification to &lt;span class=&quot;token variable&quot;&gt;$NewRelicUri&lt;/span&gt;...&quot;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Invoke-WebRequest&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Uri &lt;span class=&quot;token variable&quot;&gt;$NewRelicUri&lt;/span&gt; `
    &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Headers @&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;x-api-key&quot;&lt;/span&gt;=&lt;span class=&quot;token string&quot;&gt;&quot;aa11bb22bffbbfbf...&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; `
    &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Method Post `
    &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Body &lt;span class=&quot;token variable&quot;&gt;$body&lt;/span&gt; `
    &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;UseBasicParsing&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Replace the different values, including the x-api-key, with the ones appropriate for your application.&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>iDoneThis + AlfredApp = daily standup nirvana</title>
    <link href="https://jasonduffett.net/tech/idonethis-alfredapp-daily-standup-nirvana/" />
    <updated>2013-12-13T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/idonethis-alfredapp-daily-standup-nirvana/</id>
    <rights>© 2013 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;I’ve been testing out &lt;a href=&quot;http://idonethis.com/&quot;&gt;iDoneThis&lt;/a&gt; as a way of steam-lining the reporting for our team’s morning stand-up meetings.&lt;/p&gt;
&lt;p&gt;It’s a simple concept. It sends you a reminder email each day which you reply to with what you completed, this goes into a daily calendar and a digest is sent to all your team members each morning. There are other useful features too but that’s a good summary.&lt;/p&gt;
&lt;p&gt;Previously I was keeping things in a list in &lt;a href=&quot;http://trello.com/&quot;&gt;Trello&lt;/a&gt;, but my personal Trello boards were getting out of control so I’m hoping iDoneThis will be a good way of moving some of the clutter elsewhere.&lt;/p&gt;
&lt;p&gt;So far, so good. But I wanted to reduce the friction a bit further and found that &lt;a href=&quot;http://www.digitalnomad.im/&quot;&gt;Chad Stovern&lt;/a&gt; had created a workflow for the &lt;a href=&quot;http://www.alfredapp.com/&quot;&gt;Alfred launcher&lt;/a&gt; (which I friggin’ love). There is a &lt;a href=&quot;http://www.digitalnomad.im/idonethis-for-alfred-2-plugin-howto/&quot;&gt;how-to and download link for it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One thing was missing though… It relies on having Postfix properly configured in OS X, which it isn’t out of the box. So here are the instructions you’ll need to configure Postfix to use Gmail as a mail relay…&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open a Terminal window&lt;/li&gt;
&lt;li&gt;sudo vim /etc/postfix/main.cf&lt;/li&gt;
&lt;li&gt;Add the following lines to the file and save it.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;# Gmail Relay Configuration relayhost = [smtp.gmail.com]:587 smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous smtp_use_tls = yes smtp_tls_security_level=encrypt tls_random_source = dev:/dev/urandom
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;sudo vim /etc/postfix/sasl_passwd&lt;/li&gt;
&lt;li&gt;Add the following line (use an application-specific password if you have 2-factor authentication enabled on your Google account):&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;[smtp.gmail.com]:587    USERNAME@gmail.com:PASSWORD
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;sudo chmod go-rx /etc/postfix/sasl_passwd&lt;/li&gt;
&lt;li&gt;sudo postmap /etc/postfix/sasl_passwd&lt;/li&gt;
&lt;li&gt;Test it out… printf “Subject: Testing Postfix” | sendmail -f USERNAME@gmail.com USERNAME@gmail.com&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That’s it… Now sign up for &lt;a href=&quot;http://idonethis.com/&quot;&gt;iDoneThis&lt;/a&gt;, install the &lt;a href=&quot;http://www.digitalnomad.im/idonethis-for-alfred-2-plugin-howto/&quot;&gt;Alfred Workflow&lt;/a&gt; and “&lt;strong&gt;idid Made the stand-up meeting that much quicker &amp;amp; more focussed&lt;/strong&gt;”…&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>.NET Development with source code on a network share</title>
    <link href="https://jasonduffett.net/tech/net-development-with-source-code-on-a-network-share/" />
    <updated>2012-09-17T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/net-development-with-source-code-on-a-network-share/</id>
    <rights>© 2012 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;1st thing. Disable UAC. I know it’s bad but I was never able to get EnableLinkedConnections to work with an elevated Powershell prompt. This was a show-stopper for me as I need to deploy sites to IIS, manage MSMQ queues, and stop/start/deploy windows services as part of my development.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.tekrevue.com/tip/how-to-disable-user-account-control-in-windows-8/&quot;&gt;http://www.tekrevue.com/tip/how-to-disable-user-account-control-in-windows-8/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;loadFromRemoteSources enabled=true, either in each application + test project + R# task runners + NServiceBus.host.exe.config for each application + test, or fuck it, just put in machine.config…&lt;/p&gt;
&lt;p&gt;(Link to fav stack overflows)&lt;/p&gt;
&lt;p&gt;Great so far… except…&lt;/p&gt;
&lt;p&gt;System.ConfigurationManager static methods. In particular if you use a linked configuration file (sample UnicastBus.config)…&lt;/p&gt;
&lt;p&gt;Link to hotfix: http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=2580188&amp;amp;kbln=en-us&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://support.microsoft.com/kb/2580188&quot;&gt;http://support.microsoft.com/kb/2580188&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Error example: http://social.msdn.microsoft.com/Forums/en-AU/netfxbcl/thread/cfe1f43b-eaf3-4698-a6d1-35b9214f70c9&lt;/p&gt;
&lt;p&gt;This then worked great except for T4MVC which still crapped out an error about being unable to include the settings file (see below). This was solved by adding “file://psf” to trusted sites in Internet Properties.&lt;/p&gt;
&lt;p&gt;Error 34 Failed to resolve include text for file:The path ‘Y:&#92;Repositories&#92;levity&#92;Applications&#92;BackOffice&#92;BackOffice&#92;T4MVC.tt.settings.t4’ must be either local to this computer or part of your trusted zone. If you have downloaded this template, you may need to &#39;Unblock’ it using the properties page for the template file in Windows Explorer. Y:&#92;Repositories&#92;levity&#92;Applications&#92;BackOffice&#92;BackOffice&#92;T4MVC.tt 0 0&lt;/p&gt;
&lt;p&gt;Scratch that. Adding the path to Trusted zone fucks up everything else. Leave it in Intranet zone and try and work out why the fuck T4MVC.tt needs it to be in trusted zone…&lt;/p&gt;
&lt;p&gt;.NET 2 (eg. PowerShell, NUnit). CasPol (link to script + Hanselman)&lt;/p&gt;
&lt;p&gt;Of course you could try setting FullTrust on the Trusted zone but that doesn’t work (fucking stupid shit):
caspol.exe -machine -chggroup 1.5. FullTrust&lt;/p&gt;
&lt;p&gt;to checkout the policies that apply to an assembly
CasPol.exe -rsg path-to-assembly&lt;/p&gt;
&lt;p&gt;to remove groups, find the group numbers using -rsg and then
caspol.exe -remgroup 1.2.3.&lt;/p&gt;
&lt;p&gt;Right. Screw all the old CasPol stuff… Just trust the zone. It’s a VM right? You know what you’re doing with it.&lt;/p&gt;
&lt;p&gt;Also, apply the change to ALL frameworks as you never know which framework something is going to use. ie. NAnt uses .NET 4 (x64) on my machine…&lt;/p&gt;
&lt;p&gt;So…&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Add the server hosting your repo to the trusted zone in Internet Options. For Parallels this is “file://psf”. T4 Templates require it in the trusted zone as they don’t work on intranet zone (I couldn’t find what permissions they specifically need).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Grant FullTrust to the Trusted zone (I couldn’t make caspol groups with urls work for whatever reason):
caspol.exe -machine -chggroup 1.5. FullTrust&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run this caspol under Framework&#92;v2, Framework&#92;v4, Framework64&#92;v2, Framework64&#92;v4&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sweet (for now).&lt;/p&gt;
&lt;p&gt;Add example exception trace from Nant.&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>GBBF 2012, Day 3</title>
    <link href="https://jasonduffett.net/misc/gbbf-day-3/" />
    <updated>2012-08-10T00:00:00Z</updated>
    <id>https://jasonduffett.net/misc/gbbf-day-3/</id>
    <rights>© 2012 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;I went to the Great British Beer Festival again yesterday, meeting up with &lt;a href=&quot;http://twitter.com/TPCasey&quot;&gt;@TPCasey&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/UncleSpong&quot;&gt;@UncleSpong&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/29148252480/0.jpg&quot; alt=&quot;Two men downing glasses of ale at the beer festival&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Here are the beers sampled:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.purplemoose.co.uk/&quot;&gt;Purple Moose&lt;/a&gt; - Glaswyn Ale (N.W. Wales)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://brewstersbrewery.wordpress.com/&quot;&gt;Brewsters&lt;/a&gt; - Hophead (Lincolnshire)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.cotleighbrewery.com/&quot;&gt;Cotleigh&lt;/a&gt; - Commando Hoofing (Somerset)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://penzancebrewing.wordpress.com/&quot;&gt;Penzance&lt;/a&gt; - Potion No. 9 (Cornwall)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.icenibrewery.co.uk/&quot;&gt;Iceni&lt;/a&gt; - Raspberry Wheat (Norfolk)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.highlandbrewingcompany.co.uk/&quot;&gt;Highland&lt;/a&gt; - St Magnus Ale (Orkney)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://flackmanor.co.uk/&quot;&gt;Flack Manor&lt;/a&gt; - Flacks Double Drop (Hampshire)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.blindmansbrewery.co.uk/&quot;&gt;Blindmans&lt;/a&gt; - Golden Spring (Somerset)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.rogue.com/index.php&quot;&gt;Rogue&lt;/a&gt; - Nutless Hazelnut Brown (USA)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/29148252480/1.jpg&quot; alt=&quot;Two men posing for a selfie inside the beer festival hall&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/29148252480/2.jpg&quot; alt=&quot;Man sitting on a chopper motorbike by the Hogs Back brewery stand&quot; /&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>GBBF 2012, Day 1</title>
    <link href="https://jasonduffett.net/misc/gbbf-day-1/" />
    <updated>2012-08-07T00:00:00Z</updated>
    <id>https://jasonduffett.net/misc/gbbf-day-1/</id>
    <rights>© 2012 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;Today is the start of the &lt;a href=&quot;http://gbbf.org.uk/&quot;&gt;Great British Beer Festival&lt;/a&gt;, relocated for 2012 to its old home of Kensington Olympia due to some Olympian Volleyballists laying claim to Earl’s Court.&lt;/p&gt;
&lt;p&gt;Some technical problems with my &lt;a href=&quot;http://www.camra.org.uk/&quot;&gt;CAMRA&lt;/a&gt; membership (expired membership card) made entry a bit more tedious than necessary but once in I have to admit I much prefer Olympia as a venue to Earls Court.&lt;/p&gt;
&lt;p&gt;Beers tasted today (in chronological order):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://www.hogsback.co.uk/&quot;&gt;Hogs Back&lt;/a&gt; Summer Ale&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://darkstarbrewing.co.uk/&quot;&gt;Dark Star&lt;/a&gt; American Pale Ale (Bronze Medal - Overall)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.green-jack.com/&quot;&gt;Green Jack&lt;/a&gt; Trawlerboys Best Bitter (Silver Medal - Overall, Gold Medal - Best Bitters)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.cheddarales.co.uk/crownandglory.php&quot;&gt;Cheddar Crown &amp;amp; Glory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.kissingate.co.uk/Welcome.html&quot;&gt;Kissingate&lt;/a&gt; Black Cherry Mild&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sierranevada.com/&quot;&gt;Sierra Nevada&lt;/a&gt; Torpedo Extra Pale (on cask)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://darkstarbrewing.co.uk/&quot;&gt;Dark Star&lt;/a&gt; Festival (Gold Medal - Strong Bitters)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ratebeer.com/beer/orgasmic-parton-perry/135174/&quot;&gt;Orgasmic Parton Perry&lt;/a&gt; (at TC’s insistence)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Hoping to continue the beer journey later this week…&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>I&#39;m sure this wasn&#39;t Ayende&#39;s intention...</title>
    <link href="https://jasonduffett.net/tech/apple-basic-in-csharp/" />
    <updated>2012-05-10T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/apple-basic-in-csharp/</id>
    <rights>© 2012 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;&lt;a href=&quot;http://ayende.com/blog/155073/reviewing-xenta-and-wishing-i-hadnrsquo-t&quot;&gt;I’m sure this wasn’t Ayende’s intention…&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But now that I know C# has a GOTO statement I can bang out this classic from my Apple II days…&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code class=&quot;language-csharp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;ConsoleApplication1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Program&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            ten&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hello world&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            twenty&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;goto&lt;/span&gt; ten&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; msg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            Console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Backing up all databases in Microsoft SQL Server</title>
    <link href="https://jasonduffett.net/tech/backing-up-sql-server/" />
    <updated>2012-04-16T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/backing-up-sql-server/</id>
    <rights>© 2012 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;I’m not a big fan of Maintenance Plans. I know they can work quite well, but I don’t like the UI and the way it hides the actual SQL being used.&lt;/p&gt;
&lt;p&gt;Yesterday I set about writing a stored proc that can manage backups (full and transaction log) for all databases on a server. We source control (using the awesome &lt;a href=&quot;http://www.red-gate.com/products/sql-development/sql-source-control/&quot;&gt;SQL Source Control&lt;/a&gt; from Red Gate) this script in our &lt;strong&gt;db_maintenance&lt;/strong&gt; database so the same script is easily maintained and deployed to all SQL servers.&lt;/p&gt;
&lt;p&gt;I started out using a script from SQLTeam.com that I found &lt;a href=&quot;http://www.sqlteam.com/article/database-backup-script&quot;&gt;here&lt;/a&gt;. It looked like a good start but having been written in 2002 needed some updating!&lt;/p&gt;
&lt;p&gt;This is what I ended up with.&lt;/p&gt;
&lt;p&gt;You can specify whether the database is included in full backups, included in transaction log backups and how many days to retain backups for each. By default it will backup all databases (excluding tempdb), and support transaction log backups on all databases with FULL or BULK_LOGGED recovery models. The default retention period is 7 days for both full and transaction log backups.&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;procedure&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;dbo&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;upDBA_Backup_All_Databases&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
                &lt;span class=&quot;token variable&quot;&gt;@Path&lt;/span&gt;  &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;128&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token variable&quot;&gt;@Type&lt;/span&gt;  &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token comment&quot;&gt;-- Full / Log&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/*
    Backup file format
        _Full_yyyymmdd_hhmmss.bak
        _Log_yyyymmdd_hhmmss.bak
*/&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/*
    Usage example
        exec [upDBA_Backup_All_Databases] &#39;c:&#92;SQLBackups&#39;, &#39;Full&#39;
*/&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/*
    Configuration table
        create table dbo.tbDatabase_Backup_Setting (
            Name                 varchar(128) primary key nonclustered ,
            BackupFlagFull       varchar(1) not null check (BackupFlagFull in (&#39;Y&#39;,&#39;N&#39;)) ,
            BackupFlagLog        varchar(1) not null check (BackupFlagLog in (&#39;Y&#39;,&#39;N&#39;)) ,
            RetentionDaysFull    SmallInt not null ,
            RetentionDaysLog     SmallInt not null
       )
*/&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;-- NOTE: These should be single backslash characters, I just put double to fix a problem with the syntax highlighter!&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;Right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;@Path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#92;&#92;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@Path&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@Path&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#92;&#92;&#39;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;declare&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@sql&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;set&lt;/span&gt; nocount &lt;span class=&quot;token keyword&quot;&gt;on&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/*** Include new databases with default settings **/&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;insert&lt;/span&gt; dbo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tbDatabase_Backup_Setting
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
                Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                BackupFlagFull&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                BackupFlagLog&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                RetentionDaysFull &lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                RetentionDaysLog
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt;
                S&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token string&quot;&gt;&#39;Y&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;-- Always full backup&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;when&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;S&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;master&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;model&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;msdb&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                                &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; DATABASEPROPERTYEX&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;S&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Recovery&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;FULL&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;BULK_LOGGED&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
                                &lt;span class=&quot;token string&quot;&gt;&#39;Y&#39;&lt;/span&gt;            &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;N&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;-- No txn log backup on master, model, msdb, tempdb or databases with recovery models not supporting it&lt;/span&gt;
                &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;                            &lt;span class=&quot;token comment&quot;&gt;-- keep full backups for 7 days&lt;/span&gt;
                &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;                              &lt;span class=&quot;token comment&quot;&gt;-- keep log backups for 7 days&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt;
                master&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sysdatabases S
                &lt;span class=&quot;token keyword&quot;&gt;left&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;outer&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;join&lt;/span&gt; dbo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tbDatabase_Backup_Setting DBS &lt;span class=&quot;token keyword&quot;&gt;on&lt;/span&gt; DBS&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; S&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name
&lt;span class=&quot;token keyword&quot;&gt;where&lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;-- Exclude temp dbs&lt;/span&gt;
                S&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;tempdb&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;ReportServerTempDB&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;and&lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;-- Exclude existing, known databases&lt;/span&gt;
                DBS&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name &lt;span class=&quot;token operator&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;null&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Added &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; Cast&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;@&lt;span class=&quot;token variable&quot;&gt;@rowcount&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; new databases to tbDatabase_Backup_Setting.&#39;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/*** Remove any non-existant databases ***/&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt; dbo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tbDatabase_Backup_Setting
&lt;span class=&quot;token keyword&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;exists&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; name
                &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; master&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sysdatabases
                &lt;span class=&quot;token keyword&quot;&gt;where&lt;/span&gt; master&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sysdatabases&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dbo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tbDatabase_Backup_Setting&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Removed &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; Cast&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;@&lt;span class=&quot;token variable&quot;&gt;@rowcount&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; old databases from tbDatabase_Backup_Setting.&#39;&lt;/span&gt;



&lt;span class=&quot;token comment&quot;&gt;-- Tables for output from xp_cmdshell&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;create&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;table&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#ExistingBackups (Name varchar(128), ID int identity (1,1))&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;create&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;table&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#output ([message] varchar(128))&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;declare&lt;/span&gt;
                &lt;span class=&quot;token variable&quot;&gt;@Name&lt;/span&gt;                                                               &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;128&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token variable&quot;&gt;@RetentionDays&lt;/span&gt;                              &lt;span class=&quot;token keyword&quot;&gt;SmallInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token variable&quot;&gt;@LastBackupToKeep&lt;/span&gt;     &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token variable&quot;&gt;@filename&lt;/span&gt;                                          &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;512&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token variable&quot;&gt;@error&lt;/span&gt;                                                 &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;max&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/*** Get databases and retention period for backups ***/&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;declare&lt;/span&gt; db_cursor &lt;span class=&quot;token keyword&quot;&gt;cursor&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt;
                                Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;when&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@Type&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Full&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt; RetentionDaysFull &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; RetentionDaysLog &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dbo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tbDatabase_Backup_Setting
                &lt;span class=&quot;token keyword&quot;&gt;where&lt;/span&gt;
                                &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;@Type&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Full&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;and&lt;/span&gt; BackupFlagFull &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Y&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;or&lt;/span&gt;
                                &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;@Type&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Log&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;and&lt;/span&gt; BackupFlagLog &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Y&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/*** Loop through each database ***/&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;begin&lt;/span&gt; try
                &lt;span class=&quot;token keyword&quot;&gt;open&lt;/span&gt; db_cursor
                &lt;span class=&quot;token keyword&quot;&gt;fetch&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;next&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; db_cursor &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@Name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@RetentionDays&lt;/span&gt;

                &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; @&lt;span class=&quot;token variable&quot;&gt;@FETCH_STATUS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;begin&lt;/span&gt;
                                &lt;span class=&quot;token comment&quot;&gt;/*** Backup the database ***/&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@filename&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@Path&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@Name&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;_&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@Type&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;_&#39;&lt;/span&gt;
                                                                &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;convert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;getdate&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;112&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;_&#39;&lt;/span&gt;
                                                                &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;convert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;getdate&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;108&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;:&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;.bak&#39;&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Backing up [&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@Name&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;] to &#39;&#39;&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@filename&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&#39;&#39;&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@Type&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Full&#39;&lt;/span&gt;
                                                &lt;span class=&quot;token keyword&quot;&gt;backup&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;database&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@Name&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;disk&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@filename&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
                                                &lt;span class=&quot;token keyword&quot;&gt;backup&lt;/span&gt; log &lt;span class=&quot;token variable&quot;&gt;@Name&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;disk&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@filename&lt;/span&gt;

                                &lt;span class=&quot;token comment&quot;&gt;/*** Clean up existing backups ***/&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@sql&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;dir /B &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@Path&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@sql&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@sql&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@Name&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;_&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@Type&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;*.*&#39;&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#ExistingBackups&lt;/span&gt;

                                &lt;span class=&quot;token keyword&quot;&gt;insert&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#ExistingBackups exec master..xp_cmdshell @sql&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#ExistingBackups where Name is null&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;exists&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#ExistingBackups where Name like &#39;%File Not Found%&#39;)&lt;/span&gt;
                                                &lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#ExistingBackups&lt;/span&gt;

                                &lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@LastBackupToKeep&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;convert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;DateAdd&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dd&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@RetentionDays&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; GetDate&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;112&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#ExistingBackups where Name &gt; @Name + &#39;_&#39; + @Type + &#39;_&#39; + @LastBackupToKeep&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Keeping &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; cast&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;@&lt;span class=&quot;token variable&quot;&gt;@rowcount&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; existing backups within retention period of &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; Cast&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;@RetentionDays&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; days.&#39;&lt;/span&gt;

                                &lt;span class=&quot;token keyword&quot;&gt;declare&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@eID&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@eMaxID&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;
                                &lt;span class=&quot;token comment&quot;&gt;-- loop round all the out of date backups&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@eID&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@eMaxID&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;coalesce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ID&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#ExistingBackups&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@eID&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@eMaxID&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;begin&lt;/span&gt;
                                                &lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@eID&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ID&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#ExistingBackups where ID &gt; @eID&lt;/span&gt;
                                                &lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@filename&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@Path&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; Name &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#ExistingBackups where ID = @eID&lt;/span&gt;
                                                &lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@sql&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;del &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@filename&lt;/span&gt;
                                                &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Deleting &#39;&#39;&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@filename&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&#39;&#39;&lt;/span&gt;
                                                &lt;span class=&quot;token keyword&quot;&gt;insert&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#output exec master..xp_cmdshell @sql&lt;/span&gt;
                                                &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#output where [message] is not null) &gt; 0&lt;/span&gt;
                                                &lt;span class=&quot;token keyword&quot;&gt;begin&lt;/span&gt;
                                                                &lt;span class=&quot;token keyword&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@error&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;
                                                                &lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@error&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@error&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; [&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;]&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#output where [message] is not null&lt;/span&gt;
                                                                &lt;span class=&quot;token keyword&quot;&gt;raiserror&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;An error occurred deleting old backup file: &#39;&#39;%s&#39;&#39;.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                                                &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
                                                &lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#output&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;#ExistingBackups&lt;/span&gt;

                                &lt;span class=&quot;token comment&quot;&gt;-- Fetch next database&lt;/span&gt;
                                &lt;span class=&quot;token keyword&quot;&gt;fetch&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;next&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; db_cursor &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@Name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@RetentionDays&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt; try
&lt;span class=&quot;token keyword&quot;&gt;begin&lt;/span&gt; catch
                &lt;span class=&quot;token comment&quot;&gt;-- Error reporting via RAISERROR&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;declare&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@ErrorNumber&lt;/span&gt;    &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt;            &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ERROR_NUMBER&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;declare&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@ErrorMessage&lt;/span&gt;   NVARCHAR&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ERROR_MESSAGE&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;declare&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@ErrorProcedure&lt;/span&gt; NVARCHAR&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ERROR_PROCEDURE&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;declare&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@ErrorLine&lt;/span&gt;      &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt;            &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ERROR_LINE&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

                &lt;span class=&quot;token keyword&quot;&gt;RAISERROR&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;An error occurred during database backup.
                                                                Error Number        : %d
                                                                Error Message       : %s
                                                                Database Name       : %s
                                                                Affected Procedure  : %s
                                                                Affected Line Number: %d&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                                                                &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                                                                &lt;span class=&quot;token variable&quot;&gt;@ErrorNumber&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@ErrorMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@Name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@ErrorProcedure&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;@ErrorLine&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt; catch

&lt;span class=&quot;token comment&quot;&gt;-- Ensure cursor is closed&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; CURSOR_STATUS&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;global&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;db_cursor&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;begin&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;close&lt;/span&gt; db_cursor
                &lt;span class=&quot;token keyword&quot;&gt;deallocate&lt;/span&gt; db_cursor
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;

GO&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Beware Dell PowerConnect firmware upgrade</title>
    <link href="https://jasonduffett.net/tech/beware-dell-powerconnect-firmware-upgrade/" />
    <updated>2012-03-30T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/beware-dell-powerconnect-firmware-upgrade/</id>
    <rights>© 2012 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;We had a bit of a hair-pulling here at &lt;a href=&quot;http://www.espares.co.uk/&quot;&gt;eSpares&lt;/a&gt; this morning. The plan was to upgrade the firmware in the Dell PowerConnect 6224 switches in one of our testing environments.&lt;/p&gt;
&lt;p&gt;Moving from version 3.2.1.3 to &lt;strong&gt;3.3.1.10&lt;/strong&gt;. According to the documentation it should’ve been a no-brainer, firmware release notes had nothing of concern, but after applying the update our iSCSI network was inaccessible and VMware was having a fit.&lt;/p&gt;
&lt;p&gt;After much aggravation we found the culprit. The firmware upgrade reconfigured some of the ports on the switch, re-enabling STP and changing the VLAN config from untagged to tagged. Re-applied our (source-controlled of course) configurations and it was back up and running.&lt;/p&gt;
&lt;p&gt;Nothing is ever as easy or side-effect free as the documentation suggests.&lt;/p&gt;
&lt;p&gt;Lesson learned.&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>So nuget.org is down...</title>
    <link href="https://jasonduffett.net/tech/nuget-is-down/" />
    <updated>2012-03-09T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/nuget-is-down/</id>
    <rights>© 2012 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;Has your Microsoft dev shop gone on vacation because of the &lt;a href=&quot;http://nuget.org/&quot;&gt;Nuget.org&lt;/a&gt; breakdown?&lt;/p&gt;
&lt;p&gt;There are some quick fixes!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Add your local nuget cache as an alternative package source.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You probably want to use the same packages you’ve used before &amp;amp; these are hopefully still cached on your PC.
Open the Package Manager Settings dialogue and add a new source:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;%LocalAppData%&#92;NuGet&#92;Cache&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;http://i44.tinypic.com/j5ksxd.jpg&quot; alt=&quot;NuGet Package Manager settings dialog for adding a package source&quot; /&gt;&lt;/p&gt;
&lt;p&gt;****Or you can edit your **NuGet.Config** file located under C:&#92;Users_[username]_&#92;AppData&#92;Roaming&#92;NuGet as follows:&lt;/p&gt;
&lt;blockquote&gt;&lt;/blockquote&gt;
&lt;p&gt;The config file won’t expand environment variables so you’ll have to hard code the location of your nuget cache.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Host your own NuGet feed&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can setup your own NuGet feed, mirroring packages that you regularly need. See &lt;a href=&quot;http://docs.nuget.org/docs/creating-packages/hosting-your-own-nuget-feeds&quot;&gt;http://docs.nuget.org/docs/creating-packages/hosting-your-own-nuget-feeds&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use a 3rd party to host a NuGet feed for you&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I haven’t tried this yet but it’s something I plan on having a look at in case, heaven forbid, NuGet goes down again!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.myget.org/&quot;&gt;http://www.myget.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Add the local package source to your NuGet.config&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Have you enabled NuGet Package Restore on your solution?&lt;/p&gt;
&lt;p&gt;Open the.nuget/nuget.configsolution file and add the following element:&lt;/p&gt;
&lt;blockquote&gt;&lt;/blockquote&gt;
&lt;p&gt;****&lt;em&gt;UPDATE: This doesn’t actually work as you expect, unless nuget.config is in the current working directory. Please vote for &lt;a href=&quot;http://nuget.codeplex.com/workitem/1861&quot;&gt;this work item&lt;/a&gt; to have it work as expected.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>&#39;sudo&#39; for PowerShell</title>
    <link href="https://jasonduffett.net/tech/sudo-for-powershell/" />
    <updated>2011-12-28T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/sudo-for-powershell/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;I came across this earlier while looking for a way to avoid opening a new PowerShell window in order to get elevated privileges for a command I wanted to run. This really should’ve been built-in to PowerShell…&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.ainotenshi.org/710/%E2%80%98sudo%E2%80%99-for-powershell-sorta&quot;&gt;‘sudo’ for PowerShell&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Gmail, custom domain name &amp; &quot;on behalf of...&quot;</title>
    <link href="https://jasonduffett.net/tech/gmail-custom-domain-name-on-behalf-of/" />
    <updated>2011-06-10T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/gmail-custom-domain-name-on-behalf-of/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;I use Gmail for all my different email addresses including some custom domain names.&lt;/p&gt;
&lt;p&gt;One of the annoying things with the default setup is that it includes the “Sender” field in the message, for DomainKeys compatiblity, which some email clients (Outlook &amp;amp; Hotmail for starters) use to display the email as “From myemail@gmail.com on behalf of myemail@mycustomdomain.com”.&lt;/p&gt;
&lt;p&gt;This just looks ugly.&lt;/p&gt;
&lt;p&gt;The solution is to configure Gmail to use a different SMTP server (eg. from your ISP) to send emails from your custom domain, but not everyone has access to an SMTP server that supports this. For instance Sky’s SMTP server rewrites all messages as coming from your sky.com address.&lt;/p&gt;
&lt;p&gt;There is a solution though. Use Gmail’s SMTP servers.&lt;/p&gt;
&lt;p&gt;Open Gmail options and edit the account for your custom domain email address and set it up as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SMTP Server: &lt;strong&gt;smtp.gmail.com&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Port: &lt;strong&gt;587&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Username: &lt;em&gt;&lt;strong&gt;Your google account (including @gmail.com/@googlemail.com)&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Password: &lt;em&gt;&lt;strong&gt;Your google password&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Secured using &lt;strong&gt;TLS&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;http://i54.tinypic.com/20h97wn.png&quot; alt=&quot;Gmail options screenshot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;One more thing… If you are using Google’s &lt;a href=&quot;http://www.google.com/support/accounts/bin/static.py?page=guide.cs&amp;amp;guide=1056283&amp;amp;topic=1056284&quot;&gt;2 Step Verification&lt;/a&gt;, then you will need to setup an application-specific password for the Gmail SMTP server and use that instead of your google password.&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>VMware ESXi, Active Directory, and domain trusts</title>
    <link href="https://jasonduffett.net/tech/esxi-active-directory-domain-trust/" />
    <updated>2011-06-03T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/esxi-active-directory-domain-trust/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;Following the work I’ve been doing with getting &lt;a href=&quot;http://jasonduffett.net/post/5448151233/administering-cross-forest-domains-with-a-single-login&quot;&gt;Domain Admins working across an Active Directory cross-forest trust&lt;/a&gt;, I also found a quirk integrating VMware ESXi 4.1 in the same environment…&lt;/p&gt;
&lt;p&gt;I had created a Domain Local security group in the remote domain containing the administrators on my local trusted domain. I added permission for this group to VMware ESXi but was still unable to login using credentials from administrators of my local domain. If I created similar permissions for users on the remote domain it worked fine. I couldn’t even see any authentication requests being made to my domain controllers for the login attempts.&lt;/p&gt;
&lt;p&gt;Here is the layout I was working with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Two domains (in separate forests with a 2-way trust) - DOMAIN1 and DOMAIN2.&lt;/li&gt;
&lt;li&gt;A security group in DOMAIN1 containing my administrators: DOMAIN1&#92;Remote Administrators&lt;/li&gt;
&lt;li&gt;A security group in DOMAIN2 for my ESXi administrators:DOMAIN2&#92;ESXi Administrators&lt;/li&gt;
&lt;li&gt;DOMAIN1&#92;Remote Administrators is a member of DOMAIN2&#92;ESXi Administrators.&lt;/li&gt;
&lt;li&gt;A VMware ESXi 4.1u1 host in DOMAIN2: ESX1.domain2.com&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After a bit of trial and error I found that ESXi wasn’t able to recognise users from the trusted domain (DOMAIN1) as members of its local domain (DOMAIN2) groups. So I added the security group from the trusted domain (DOMAIN1&#92;Remote Administrators) directly into ESXi and it was then able to authenticate users from the trusted domain correctly.&lt;/p&gt;
&lt;p&gt;Hopefully someone finds this helpful!&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Domain Admin rights on a cross-forest domain trust</title>
    <link href="https://jasonduffett.net/tech/administering-cross-forest-domains-with-a-single-login/" />
    <updated>2011-06-02T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/administering-cross-forest-domains-with-a-single-login/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;&lt;em&gt;Update 02/06/2011: BUILTIN&#92;Administrators on the domain controllers is just not enough, see &lt;a href=&quot;https://jasonduffett.net/tech/administering-cross-forest-domains-with-a-single-login/#grouppolicy&quot;&gt;Group Policy&lt;/a&gt;…&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I needed to setup some of our domain administrators as administrators on a new prototype domain we are setting up. There are plenty of resources on setting up trust-relationships between domains in the same forest but what about between two separate, unrelated forests?&lt;/p&gt;
&lt;p&gt;Here are the steps I took:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Check your firewalls&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This got me stuck for a while since the egress filter on the firewall at the new site wasn’t allowing all traffic via the VPN. Make sure you are not blocking any traffic between the domain controllers in each forest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Setup conditional forwarder DNS zones in each network&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You won’t accomplish much if each network can’t properly resolve resources in the other. Adding forwarder zones to your DNS setup in each network allows them to forward DNS requests to the other network’s DNS servers for resources in that network. eg.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Given the two forests below, we can use the following commands to create forwarder zones for both the forestX.mycompany.com zone and the appropriate reverse lookup zones.
local_dom.mycompany.com* Subnet: 192.168.1.0/24* DNS servers: 192.168.1.2, 192.168.1.3
remote_dom.mycompany.com* Subnet: 192.168.2.0/24* DNS servers: 192.168.2.2, 192.168.2.3
At LOCAL_DOM…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;dnscmd 192.168.1.2 /ZoneAdd remote_dom.mycompany.com /DsForwarder 192.168.2.2 192.168.2.3

dnscmd 192.168.1.2 /ZoneAdd 2.168.192.in-addr.arpa /DsForwarder 192.168.2.2 192.168.2.3
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;At REMOTE_DOM…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;dnscmd 192.168.2.2 /ZoneAdd local_dom.mycompany.com /DsForwarder 192.168.1.2 192.168.1.3

dnscmd 192.168.2.2 /ZoneAdd 1.168.192.in-addr.arpa /DsForwarder 192.168.1.2 192.168.1.3
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;You can now test it:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;nslookup dc1.remote_dom.mycompany.com 192.168.1.2

nslookup 192.168.2.2 192.168.1.2

nslookup dc1.local_dom.mycompany.com 192.168.2.2

nslookup 192.168.1.2 192.168.2.2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. Create a forest-forest trust relationship&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Open the Active Directory Domains and Trusts console (domain.msc) in one of the domains. Go to the properties of the domain and, under the Trusts tab, click New Trust and enter the following details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS name of the other domain.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forest Trust&lt;/strong&gt; - users from any domain in either forest can authenticate in any domain in the other forest.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Two-way&lt;/strong&gt; relationship&lt;/li&gt;
&lt;li&gt;Create the trust relationship in both domains&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forest-wide authentication&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Once the trust is completed use the wizard to confirm the incoming/outgoing trust.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Users in LOCAL_DOM are now part of Everyone &amp;amp; Authenticated Users in REMOTE_DOM but don’t have many rights to do anything yet… You can verify this by opening Active Directory Users &amp;amp; Computers (dsa.msc) and changing the domain to remote_dom.mycompany.com - you can view, but not modify, the other domain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Create a security group for administrators of REMOTE_DOM&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Our goal is to have the domain administrators of LOCAL_DOM also administrators of REMOTE_DOM. The first thing to do is to create a security group to manage which users have rights on REMOTE_DOM - call it “REMOTE_DOM Administrators”. Make sure you create the group as either &lt;strong&gt;Global&lt;/strong&gt; or &lt;strong&gt;Universal&lt;/strong&gt; otherwise it will not be visible to the REMOTE_DOM domain (Domain Local scoped groups are just that, local to the domain).&lt;/p&gt;
&lt;p&gt;Add the users who should have rights (or just Domain Admins) to this group.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Grant REMOTE_DOM Administrators rights in the REMOTE_DOM domain&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now open dsa.msc on the REMOTE_DOM domain. Because Domain Admins is a Global scoped group you won’t be able to add users/groups from LOCAL_DOM to it. To grant the LOCAL_DOM users full administrator rights on the REMOTE_DOM domain you need to add them to the &lt;strong&gt;BUILTIN&#92;Administrators&lt;/strong&gt; group which is locally scoped.&lt;/p&gt;
&lt;p&gt;Open the group and click Add under the Members tab. Change the location from remote_dom.mycompany.com to local_dom.mycompany.com and add the LOCAL_DOM&#92;REMOTE_DOM Administrators group.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Setup a Group Policy to grant administrator rights across the domain.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Although after completing step 4 you’ll have Administrator rights on the domain controller, this just isn’t the same as Domain Admins. The first thing you’ll notice is that you have only user rights on other machines in the domain.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;Create a domain local group in REMOTE_DOM (eg. REMOTE_DOM&#92;LOCAL_DOM Administrators).&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Add the security group we created in our local domain (LOCAL_DOM&#92;REMOTE_DOM Administrators) to this group.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Open REMOTE_DOM’s Group Policy Management console (gpmc.msc).&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Create a new Group Policy Object, linked to the route of the REMOTE_DOM domain. Call it “LOCAL_DOM Administrators.”&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Edit the GPO and find the Preferences &#92; Control Panel Settings &#92; Local Users and Groups policy settings.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;Add an action that will add LOCAL_DOM Administrators as a member of the BUILTIN&#92;Administrators group.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This policy will now be applied to all computers on the domain, granting members of “LOCAL_DOM&#92;REMOTE_DOM Administrators” administrative rights on all machines.&lt;/p&gt;
&lt;p&gt;Note: There are still permissions that Domain/Enterprise Admins have that are not granted using this procedure (eg. editing Group Policy Objects). I’m still working through them - any suggestions welcome!&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>More ReSharper and MSpec - playing nice</title>
    <link href="https://jasonduffett.net/tech/more-resharper-and-mspec-playing-nice/" />
    <updated>2011-05-25T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/more-resharper-and-mspec-playing-nice/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;Stop the annoying re-formatting of your specs.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://codebetter.com/aaronjensen/2008/10/19/getting-resharper-and-vs-to-play-nice-with-mspec/&quot;&gt;More ReSharper and MSpec - playing nice&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>ReSharper, StyleCop and MSpec playing nice</title>
    <link href="https://jasonduffett.net/tech/resharper-stylecop-and-mspec-playing-nice/" />
    <updated>2011-05-23T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/resharper-stylecop-and-mspec-playing-nice/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;&lt;a href=&quot;http://consultingblogs.emc.com/merrickchaffer/archive/2010/04/01/how-to-have-resharper-ignore-mspec-tests.aspx&quot;&gt;ReSharper, StyleCop and MSpec playing nice&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Could not load type &#39;Machine.Specifications.Utility.Naming&#39;</title>
    <link href="https://jasonduffett.net/tech/machine-specifications-utility-naming/" />
    <updated>2011-05-20T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/machine-specifications-utility-naming/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;Ever seen this error in ReSharper test runner using MSpec?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;System.TypeLoadException: Could not load type &#39;Machine.Specifications.Utility.Naming&#39; from assembly &#39;Machine.Specifications, Version=0.4.12.0, Culture=neutral, PublicKeyToken=null&#39;.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Did you recently update the version of MSpec you are using?&lt;/p&gt;
&lt;p&gt;Did you forget to update the ReSharper runner?&lt;/p&gt;
&lt;p&gt;Sure you did.&lt;/p&gt;
&lt;p&gt;Close Visual Studio &amp;amp; re-run the &lt;strong&gt;InstallResharperRunner.X.X - VSXXXX.bat&lt;/strong&gt; script that is distributed with Machine.Specifications and all will be well.&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>A guide to object equality in .NET (part 4)</title>
    <link href="https://jasonduffett.net/tech/guide-to-object-equality-part-4/" />
    <updated>2011-05-20T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/guide-to-object-equality-part-4/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;The IEquality interface.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&amp;amp;l=EN-US&amp;amp;k=k%28%22SYSTEM.IEQUATABLE%601%22%29;k%28TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22%29;k%28DevLang-CSHARP%29&amp;amp;rd=true&quot;&gt;http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&amp;amp;l=EN-US&amp;amp;k=k%28%22SYSTEM.IEQUATABLE%601%22%29;k%28TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22%29;k%28DevLang-CSHARP%29&amp;amp;rd=true&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Update answer at &lt;a href=&quot;http://stackoverflow.com/questions/798121/date-vs-datetime&quot;&gt;http://stackoverflow.com/questions/798121/date-vs-datetime&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Microsoft Key Management Service</title>
    <link href="https://jasonduffett.net/tech/microsoft-key-management-service/" />
    <updated>2011-05-19T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/microsoft-key-management-service/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;Microsoft’s Key Management Service (KMS) is a great way to manage licensing of a large number of machines. All you need is to have a KMS server running on your network, registered in DNS, and all the latest versions of Windows will activate themselves automatically.&lt;/p&gt;
&lt;p&gt;It’s recommended that you have multiple KMS servers on your network, for redundancy, but this can be tricky as a KMS server will not activate any clients until it has a minimum number of PCs contact it for activation (5x server OS, or 25x client OS).&lt;/p&gt;
&lt;p&gt;You can use the following commands on 5x Windows 2008 PCs to quickly reach this minimum and activate the KMS server. These commands will first update the KMS server that the PC is using, then re-activate Windows.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:&#92;&amp;gt;cscript c:&#92;Windows&#92;system32&#92;slmgr.vbs /skms fqdn-of-kms-server.mydomain.com

C:&#92;&amp;gt;cscript c:&#92;Windows&#92;system32&#92;slmgr.vbs /ato
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You will receive the following error until you have activated enough PCs, then they will start activating successfully – at which point you can stop and let windows manage activations automatically again.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Error: 0xC004F038 The computer could not be activated. The returned count from your Key Management Service is insufficient.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To see the current count of activations on the KMS server:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:&#92;&amp;gt;cscript c:&#92;Windows&#92;system32&#92;slmgr.vbs /dli
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For more information on KMS see these Technet resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://technet.microsoft.com/en-us/library/dd979804.aspx&quot;&gt;http://technet.microsoft.com/en-us/library/dd979804.aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://technet.microsoft.com/en-us/library/cc303276.aspx&quot;&gt;http://technet.microsoft.com/en-us/library/cc303276.aspx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Tumblr Tag Clouds</title>
    <link href="https://jasonduffett.net/misc/tumblr-tag-clouds/" />
    <updated>2011-05-18T00:00:00Z</updated>
    <id>https://jasonduffett.net/misc/tumblr-tag-clouds/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;A great, simple tag cloud plugin for Tumblr blogs from Heather Rivers.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://rive.rs/projects/tumblr-tag-clouds/&quot;&gt;Tumblr Tag Clouds&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>iSCSI, VMware recommended reading</title>
    <link href="https://jasonduffett.net/tech/iscsi-vmware-recommended-reading/" />
    <updated>2011-05-12T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/iscsi-vmware-recommended-reading/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;If you are setting up a VMware environment using iSCSI storage (especially EqualLogic) then I recommend reading these links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Michael Ellerbeck’s “So you bought an EqualLogic SAN, now what?” series (&lt;a href=&quot;http://michaelellerbeck.com/2009/11/23/so-you-bought-an-equallogic-san-now-what-part-one/&quot;&gt;part 1&lt;/a&gt;, &lt;a href=&quot;http://michaelellerbeck.com/2009/11/30/so-you-bought-an-equallogic-san-now-what-part-two/&quot;&gt;part 2&lt;/a&gt;, &lt;a href=&quot;http://michaelellerbeck.com/2009/12/08/so-you-bought-an-equallogic-san-now-what-part-three/&quot;&gt;part 3&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://virtualgeek.typepad.com/virtual_geek/2009/01/a-multivendor-post-to-help-our-mutual-iscsi-customers-using-vmware.html&quot;&gt;A “Multivendor Post” to help our mutual iSCSI customers using VMware&lt;/a&gt; (written by experts from VMware, NetApp, EqualLogic, HP/Lefthand and EMC).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.equallogic.com/resourcecenter/assetview.aspx?id=8453&quot;&gt;Configuring VMware vSphere Software iSCSI with Dell EqualLogic PS Series Storage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And some tips when configuring your VMware storage…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keep your VM swap files with the VM.&lt;/li&gt;
&lt;li&gt;Use shared LUNs, only use a LUN per VM when performance or security requires it.&lt;/li&gt;
&lt;li&gt;Make your shared LUNs at least 500GB.&lt;/li&gt;
&lt;li&gt;Keep a maximum of 15-20 VMs on each LUN.&lt;/li&gt;
&lt;li&gt;Use the Software iSCSI adaptor, jumbo frames aren’t supported in VMware on hardware adaptors and you’ll get much more performance from jumbo-frames than from offloading iSCSI processing to a HBA - &lt;a href=&quot;http://www.vmadmin.co.uk/vmware/35-esxserver/252-esxihwswiscsijumbo&quot;&gt;see benchmarks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;But if you need to boot from an iSCSI volume then you’ll have to use a hardware adaptor.&lt;/li&gt;
&lt;li&gt;Set Round-Robin MPIO policy on each volume.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, see my previous post about &lt;a href=&quot;http://jasonduffett.net/post/5356826166/iscsi-configuration-for-vmware-esxi&quot;&gt;configuring VMware ESXi iSCSI software adaptor via PowerShell&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Editing /etc/hosts in Mac OS X</title>
    <link href="https://jasonduffett.net/tech/editing-etchosts-in-mac-os-x/" />
    <updated>2011-05-11T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/editing-etchosts-in-mac-os-x/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;Something I usually forget since I don’t do it often…&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://decoding.wordpress.com/2009/04/06/how-to-edit-the-hosts-file-in-mac-os-x-leopard/&quot;&gt;Editing /etc/hosts in Mac OS X&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Recommended iSCSI configuration for VMware ESXi</title>
    <link href="https://jasonduffett.net/tech/iscsi-configuration-for-vmware-esxi/" />
    <updated>2011-05-10T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/iscsi-configuration-for-vmware-esxi/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;I’ve recently been working with a couple of VMware environments using Dell EqualLogic and MD3000i iSCSI SANs, and developed the attached PowerShell script for configuring the ESXi hosts to connect to them.&lt;/p&gt;
&lt;p&gt;To optimise iSCSI traffic there are many things you should configure in your iSCSI ethernet network but for the ESXi hosts, the important things are:&lt;/p&gt;
&lt;h4&gt;Use Jumbo Frames.&lt;/h4&gt;
&lt;p&gt;Jumbo frames will give a great performance boost to your iSCSI storage, but they must be supported (and configured) on all devices in the setup (eg. ESXi Host, Switches, SAN).&lt;/p&gt;
&lt;h4&gt;Setup multiple paths between each ESXi Host and the SAN&lt;/h4&gt;
&lt;p&gt;You’ll need at least 2 switches, 2 NICs dedicated to iSCSI on each ESXi host, and 2 NICs/Controllers on the SAN. Cable the devices so that they are fully redundant - if any single device should fail (host NIC, switch, SAN NIC/Controller) then the host can still communicate with the SAN.&lt;/p&gt;
&lt;h4&gt;Configure ESXi MPIO (Multi-path I/O) correctly.&lt;/h4&gt;
&lt;p&gt;Once you have the redundant paths configured you need to configure ESXi to make the best use of these paths by configuring round-robin MPIO allowing it to use both paths at once.&lt;/p&gt;
&lt;h3&gt;So what about this script?&lt;/h3&gt;
&lt;p&gt;One problem I found when configuring this is that I couldn’t find anywhere in the vSphere GUI to configure the MTU of the iSCSI vSwitch and pNICs for Jumbo Frames. There are also a lot of bits &amp;amp; pieces to configure so I wrote this PowerShell script to automate it.
The script will configure the following on the specified ESXi host:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Disables &lt;strong&gt;Disk.UseDeviceReset&lt;/strong&gt; as recommended by VMware.&lt;/li&gt;
&lt;li&gt;Lowers the maximum number of LUNs to speed up boot time.&lt;/li&gt;
&lt;li&gt;Create a virtual switch for iSCSI traffic and bind the physical NICs to it.&lt;/li&gt;
&lt;li&gt;Configure the virtual switch to use jumbo frames.&lt;/li&gt;
&lt;li&gt;Create and configure VMkernel ports and NIC bindings for MPIO.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The full script can be downloaded from &lt;a href=&quot;https://github.com/laazyj/blogAttachments/raw/master/esxi_iscsi_configuration.ps1&quot;&gt;here&lt;/a&gt;. The script has been developed and tested with ESXi 4.1 update 1, using PowerCLI 4.1.1.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: If you are using a free version of ESXi then PowerCLI commands are read-only, you should switch your ESXi to use an evaluation license before running the scripts and switch it back to the free license afterwards.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;__&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;#load Vmware Module&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Get-PSSnapin&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Where-Object&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name &lt;span class=&quot;token operator&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;VMware.VimAutomation.Core&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Add-PSSnapin&lt;/span&gt; VMware&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;VimAutomation&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Core &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Load up the VMware PowerCLI cmdlets that we’ll require. You’ll need to have VMware PowerCLI installed.&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;### iSCSI Configuration (Configure for your environment) ###&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$Script&lt;/span&gt;:hostName = &lt;span class=&quot;token string&quot;&gt;&quot;esx01.mynetwork.co.uk&quot;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$iscsiNics&lt;/span&gt; = @&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;vmnic1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;vmnic2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$iscsiIps&lt;/span&gt; = @&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;192.168.130.101&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;192.168.131.101&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$iscsiSwitchName&lt;/span&gt; = &lt;span class=&quot;token string&quot;&gt;&quot;vSwitchiSCSI&quot;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$mtu&lt;/span&gt; = 9000
&lt;span class=&quot;token comment&quot;&gt;### End iSCSI Configuration ###&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Configure the script for your environment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enter the hostname or IP of the ESXi host being configured&lt;/li&gt;
&lt;li&gt;Enter the NICs that will be dedicated to iSCSI traffic&lt;/li&gt;
&lt;li&gt;Enter the IP addresses for the iSCSI NICs&lt;/li&gt;
&lt;li&gt;The name of the iSCSI virtual switch&lt;/li&gt;
&lt;li&gt;MTU size for jumbo frames, 9000 is usually good but ensure you have configured your switches and SAN with the same value.&lt;/li&gt;
&lt;li&gt;Enable the Software iSCSI adaptor and bind it to the VMkernel ports&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;### Global Script Variables ###&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$Global&lt;/span&gt;:VIServer = &lt;span class=&quot;token variable&quot;&gt;$null&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$Global&lt;/span&gt;:VMHost = &lt;span class=&quot;token variable&quot;&gt;$null&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;### End Global Script Variables ###&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;### Functions ###&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Exit-WithError&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
		&lt;span class=&quot;token namespace&quot;&gt;[string]&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$ErrorMessage&lt;/span&gt; = &lt;span class=&quot;token string&quot;&gt;&quot;An unspecified error occurred.&quot;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

	&lt;span class=&quot;token function&quot;&gt;Write-Error&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$ErrorMessage&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;Disconnect-VMHost&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;exit&lt;/span&gt; 1
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Disconnect-VMHost&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$VIServer&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-ne&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Disconnecting from VIServer: &lt;span class=&quot;token variable&quot;&gt;$VIServer&lt;/span&gt;&quot;&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;Disconnect-VIServer&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Server &lt;span class=&quot;token variable&quot;&gt;$VIServer&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;force &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;confirm:&lt;span class=&quot;token boolean&quot;&gt;$false&lt;/span&gt;
		&lt;span class=&quot;token variable&quot;&gt;$Global&lt;/span&gt;:VIServer = &lt;span class=&quot;token variable&quot;&gt;$null&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Connect-VMHost&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$VIServer&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Connecting to &lt;span class=&quot;token variable&quot;&gt;$hostName&lt;/span&gt;&quot;&lt;/span&gt;
		&lt;span class=&quot;token variable&quot;&gt;$Global&lt;/span&gt;:VIServer = &lt;span class=&quot;token function&quot;&gt;Connect-VIServer&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Server &lt;span class=&quot;token variable&quot;&gt;$hostName&lt;/span&gt;
		&lt;span class=&quot;token variable&quot;&gt;$Global&lt;/span&gt;:VMhost = &lt;span class=&quot;token function&quot;&gt;Get-VMHost&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Server &lt;span class=&quot;token variable&quot;&gt;$VIServer&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Set-AdvancedConfigurationValue&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;param&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;[string]&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$Setting&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;[int]&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$Value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Get-VMHostAdvancedConfiguration&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Name &lt;span class=&quot;token variable&quot;&gt;$Setting&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Item&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$Setting&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-ne&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$Value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ForegroundColor green &lt;span class=&quot;token string&quot;&gt;&quot;Setting advanced configuration &lt;span class=&quot;token variable&quot;&gt;$Setting&lt;/span&gt; to &lt;span class=&quot;token variable&quot;&gt;$Value&lt;/span&gt;&quot;&lt;/span&gt;
		&lt;span class=&quot;token variable&quot;&gt;$VMhost&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Set-VMHostAdvancedConfiguration&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Name &lt;span class=&quot;token variable&quot;&gt;$Setting&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Value &lt;span class=&quot;token variable&quot;&gt;$Value&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# iSCSI port groups are named starting at 1, not 0.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get-iSCSINameFromIndex&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;param&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;[int]&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$Index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;iSCSI&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$Index&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;### End Functions ###&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Variables and functions used internally by the script.&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;Connect-VMHost&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Checking advanced Disk configuration&quot;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Set-AdvancedConfigurationValue&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Disk.UseDeviceReset&quot;&lt;/span&gt; 0
&lt;span class=&quot;token function&quot;&gt;Set-AdvancedConfigurationValue&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Disk.UseLunReset&quot;&lt;/span&gt; 1
&lt;span class=&quot;token function&quot;&gt;Set-AdvancedConfigurationValue&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Disk.MaxLUN&quot;&lt;/span&gt; 50&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Connect to the ESXi host and configure advanced disk configuration options. If you expect to have more than 50 LUNs on a SCSI adaptor then adjust this value accordingly.&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Get/Create virtual switch&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$iscsiVirtualSwitch&lt;/span&gt; = &lt;span class=&quot;token function&quot;&gt;Get-VirtualSwitch&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;VMHost &lt;span class=&quot;token variable&quot;&gt;$VMhost&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Where-object&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name &lt;span class=&quot;token operator&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$iscsiSwitchName&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$iscsiVirtualSwitch&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ForegroundColor green &lt;span class=&quot;token string&quot;&gt;&quot;Creating new virtual switch for iSCSI: &lt;span class=&quot;token variable&quot;&gt;$iscsiSwitchName&lt;/span&gt;&quot;&lt;/span&gt;
	&lt;span class=&quot;token variable&quot;&gt;$iscsiVirtualSwitch&lt;/span&gt; = &lt;span class=&quot;token function&quot;&gt;New-VirtualSwitch&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;VMHost &lt;span class=&quot;token variable&quot;&gt;$VMhost&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Name &lt;span class=&quot;token variable&quot;&gt;$iscsiSwitchName&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Create the new iSCSI virtual switch if it doesn’t exist.&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Jumbo Frames&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$iscsiVirtualSwitch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Mtu &lt;span class=&quot;token operator&quot;&gt;-ne&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$mtu&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ForegroundColor green &lt;span class=&quot;token string&quot;&gt;&quot;Enabling Jumbo Frames (MTU:&lt;span class=&quot;token variable&quot;&gt;$mtu&lt;/span&gt;) on iSCSI switch: &lt;span class=&quot;token variable&quot;&gt;$iscsiSwitchName&lt;/span&gt;&quot;&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;Set-VirtualSwitch&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;VirtualSwitch &lt;span class=&quot;token variable&quot;&gt;$iscsiVirtualSwitch&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;MTU &lt;span class=&quot;token variable&quot;&gt;$mtu&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Confirm:&lt;span class=&quot;token boolean&quot;&gt;$false&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enable jumbo frames on the virtual switch.&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# NIC binding&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Checking vNIC bindings of vSwitch: &lt;span class=&quot;token variable&quot;&gt;$iscsiSwitchName&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$nicsRequireUpdating&lt;/span&gt; = &lt;span class=&quot;token variable&quot;&gt;$iscsiVirtualSwitch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Nic&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Length &lt;span class=&quot;token operator&quot;&gt;-ne&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$iscsiNics&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Length
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$nicsRequireUpdating&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token variable&quot;&gt;$existingNics&lt;/span&gt; = &lt;span class=&quot;token function&quot;&gt;New-Object&lt;/span&gt; System&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Collections&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ArrayList&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$iscsiVirtualSwitch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Nic&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token variable&quot;&gt;$iscsiNics&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Foreach-object&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$existingNics&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Contains&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$nicsRequireUpdating&lt;/span&gt; = &lt;span class=&quot;token boolean&quot;&gt;$true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$nicsRequireUpdating&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ForegroundColor green &lt;span class=&quot;token string&quot;&gt;&quot;Binding iSCSI virtual NICs [&lt;span class=&quot;token variable&quot;&gt;$iscsiNics&lt;/span&gt;] to virtual switch: &lt;span class=&quot;token variable&quot;&gt;$iscsiSwitchName&lt;/span&gt;&quot;&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;Set-VirtualSwitch&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;VirtualSwitch &lt;span class=&quot;token variable&quot;&gt;$iscsiVirtualSwitch&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Nic &lt;span class=&quot;token variable&quot;&gt;$iscsiNics&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Confirm:&lt;span class=&quot;token boolean&quot;&gt;$false&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bind the specified physical NICs to the iSCSI virtual switch.&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# VMKernel ports&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Checking VMKernel ports and IP addresses&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Load existing IP addresses&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$existingIPs&lt;/span&gt; = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$VMhost&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Get-VMHostNetworkAdapter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Where-object&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;IP &lt;span class=&quot;token operator&quot;&gt;-ne&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;IP &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$existingIPs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;GetType&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;FullName &lt;span class=&quot;token operator&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;System.String&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token variable&quot;&gt;$existingIPs&lt;/span&gt; = &lt;span class=&quot;token function&quot;&gt;New-Object&lt;/span&gt; System&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Collections&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ArrayList&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; @&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$existingIPs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token variable&quot;&gt;$existingIPs&lt;/span&gt; = &lt;span class=&quot;token function&quot;&gt;New-Object&lt;/span&gt; System&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Collections&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ArrayList&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$existingIPs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Check desired IP addresses&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; = 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-lt&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$iscsiIps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token variable&quot;&gt;$ip&lt;/span&gt; = &lt;span class=&quot;token variable&quot;&gt;$iscsiIps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$existingIPs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Contains&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$ip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token variable&quot;&gt;$iscsiName&lt;/span&gt; = &lt;span class=&quot;token function&quot;&gt;get-iSCSINameFromIndex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ForegroundColor green &lt;span class=&quot;token string&quot;&gt;&quot;Creating new VMKernel port &lt;span class=&quot;token variable&quot;&gt;$iscsiName&lt;/span&gt; with address: &lt;span class=&quot;token variable&quot;&gt;$ip&lt;/span&gt;&quot;&lt;/span&gt;
		&lt;span class=&quot;token variable&quot;&gt;$VMhost&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;New-VMHostNetworkAdapter&lt;/span&gt; `
			&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;PortGroup &lt;span class=&quot;token variable&quot;&gt;$iscsiName&lt;/span&gt; `
			&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;IP &lt;span class=&quot;token variable&quot;&gt;$ip&lt;/span&gt; `
			&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;SubnetMask 255&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;255&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;255&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;0 `
			&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Mtu &lt;span class=&quot;token variable&quot;&gt;$mtu&lt;/span&gt; `
			&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ManagementTrafficEnabled &lt;span class=&quot;token boolean&quot;&gt;$false&lt;/span&gt; `
			&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;VMotionEnabled &lt;span class=&quot;token boolean&quot;&gt;$false&lt;/span&gt; `
			&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;VirtualSwitch &lt;span class=&quot;token variable&quot;&gt;$iscsiVirtualSwitch&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Network adaptor with IP address &lt;span class=&quot;token variable&quot;&gt;$ip&lt;/span&gt; already exists, checking settings&quot;&lt;/span&gt;
		&lt;span class=&quot;token variable&quot;&gt;$vmnic&lt;/span&gt; = &lt;span class=&quot;token variable&quot;&gt;$VMhost&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Get-VMHostNetworkAdapter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Where-object&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;IP &lt;span class=&quot;token operator&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$ip&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$vmnic&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ManagementTrafficEnabled&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token function&quot;&gt;Write-Warning&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;[string]&lt;/span&gt;::Format&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Disabling Management Traffic on {0}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$vmnic&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			&lt;span class=&quot;token variable&quot;&gt;$VMhost&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Set-VMHostNetworkAdaptor&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;VirtualNic &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ManagementTrafficEnabled &lt;span class=&quot;token boolean&quot;&gt;$false&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$vmnic&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;VMotionEnabled&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token function&quot;&gt;Write-Warning&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;[string]&lt;/span&gt;::Format&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Disabling VMotion on {0}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$vmnic&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			&lt;span class=&quot;token variable&quot;&gt;$VMhost&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Set-VMHostNetworkAdaptor&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;VirtualNic &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;VMotionEnabled &lt;span class=&quot;token boolean&quot;&gt;$false&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$vmnic&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;IPv6Enabled&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token function&quot;&gt;Write-Warning&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;[string]&lt;/span&gt;::Format&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Disabling IPv6 on {0}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$vmnic&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			&lt;span class=&quot;token variable&quot;&gt;$VMhost&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Set-VMHostNetworkAdaptor&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;VirtualNic &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;IPv6Enabled &lt;span class=&quot;token boolean&quot;&gt;$false&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$vmnic&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Mtu &lt;span class=&quot;token operator&quot;&gt;-ne&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$mtu&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token function&quot;&gt;Write-Warning&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;[string]&lt;/span&gt;::Format&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Setting MTU to &lt;span class=&quot;token variable&quot;&gt;$mtu&lt;/span&gt; on {0}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$vmnic&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			&lt;span class=&quot;token variable&quot;&gt;$VMhost&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Set-VMHostNetworkAdaptor&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;VirtualNic &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Mtu &lt;span class=&quot;token variable&quot;&gt;$mtu&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here we have configured 2 VMKernel ports (1 for each pNIC) for iSCSI traffic.&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Nic Teaming Policy&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; = 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-lt&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$iscsiIps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token variable&quot;&gt;$iscsiName&lt;/span&gt; = &lt;span class=&quot;token function&quot;&gt;get-iSCSINameFromIndex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token variable&quot;&gt;$activeNic&lt;/span&gt; = &lt;span class=&quot;token variable&quot;&gt;$iscsiNics&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Checking NIC teaming policy for &lt;span class=&quot;token variable&quot;&gt;$iscsiName&lt;/span&gt; port group&quot;&lt;/span&gt;
	&lt;span class=&quot;token variable&quot;&gt;$portGroupTeamingPolicy&lt;/span&gt; = &lt;span class=&quot;token variable&quot;&gt;$VMhost&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Get-VirtualPortGroup&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;VirtualSwitch &lt;span class=&quot;token variable&quot;&gt;$iscsiVirtualSwitch&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Name &lt;span class=&quot;token variable&quot;&gt;$iscsiName&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Get-NicTeamingPolicy&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$portGroupTeamingPolicy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ActiveNic&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Length &lt;span class=&quot;token operator&quot;&gt;-ne&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-or&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$portGroupTeamingPolicy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ActiveNic&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-ne&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$activeNic&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ForegroundColor green &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;[string]&lt;/span&gt;::Format&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Binding port group {0} to NIC {1}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$iscsiName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$activeNic&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token variable&quot;&gt;$unusedNics&lt;/span&gt; = @&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$j&lt;/span&gt; = 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$j&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-lt&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$iscsiNics&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$j&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$j&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-ne&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$unusedNics&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$iscsiNics&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$j&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;Set-NicTeamingPolicy&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;VirtualPortGroup &lt;span class=&quot;token variable&quot;&gt;$portGroupTeamingPolicy&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;MakeNicUnused &lt;span class=&quot;token variable&quot;&gt;$unusedNics&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;MakeNicActive &lt;span class=&quot;token variable&quot;&gt;$iscsiNics&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Configure NIC teaming on each of the VMkernel ports so that they have 1 active adaptor each and no standby. This is the configuration recommended by Dell &amp;amp; VMware for MPIO.&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Get Software iSCSI Adaptor HBA number&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Checking iSCSI HBA&quot;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$iscsiHba&lt;/span&gt; = &lt;span class=&quot;token variable&quot;&gt;$VMhost&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Get-VMHostHba&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Where-object&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Type&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-match&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;IScsi&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Where-object&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model &lt;span class=&quot;token operator&quot;&gt;-match&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;iSCSI Software Adapter&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$iscsiHbaNumber&lt;/span&gt; = &lt;span class=&quot;token variable&quot;&gt;$iscsiHba&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Device&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Get a CLI instance&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$esxCli&lt;/span&gt; = &lt;span class=&quot;token function&quot;&gt;Get-EsxCli&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Server &lt;span class=&quot;token variable&quot;&gt;$VIServer&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Check each vmk binding&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$iscsiIps&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Foreach-object&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token variable&quot;&gt;$ip&lt;/span&gt; = &lt;span class=&quot;token variable&quot;&gt;$_&lt;/span&gt;
	&lt;span class=&quot;token variable&quot;&gt;$iscsiVmkNumber&lt;/span&gt; = &lt;span class=&quot;token variable&quot;&gt;$VMhost&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Get-VMHostNetworkAdapter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Where-object&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;IP &lt;span class=&quot;token operator&quot;&gt;-match&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$ip&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ForegroundColor green &lt;span class=&quot;token string&quot;&gt;&quot;Binding VMKernel Port &lt;span class=&quot;token variable&quot;&gt;$iscsiVmkNumber&lt;/span&gt; to &lt;span class=&quot;token variable&quot;&gt;$iscsiHbaNumber&lt;/span&gt;&quot;&lt;/span&gt;
	&lt;span class=&quot;token variable&quot;&gt;$esxCli&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;swiscsi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nic&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;add&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$iscsiHbaNumber&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$iscsiVmkNumber&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;Disconnect-VMHost&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enable the iSCSI Software Adaptor and bind it to the VMkernel ports. PowerCLI doesn’t include any cmdlets to do this so I use an EsxCli object.&lt;/p&gt;
&lt;p&gt;VMware’s iSCSI SAN Configuration documentation can be found &lt;a href=&quot;http://www.vmware.com/pdf/vsphere4/r40/vsp_40_iscsi_san_cfg.pdf&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>A guide to value object equality in .NET (part 2)</title>
    <link href="https://jasonduffett.net/tech/guide-to-value-object-equality-part-2/" />
    <updated>2011-05-09T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/guide-to-value-object-equality-part-2/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;In the 2nd part of &lt;a href=&quot;https://jasonduffett.net/tech/guide-to-value-object-equality-part-1/&quot;&gt;the series&lt;/a&gt; I’ll explain the GetHashCode() method and how you should implement this in your value-type classes.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://jasonduffett.net/post/5220416027/guide-to-value-object-equality-part-1&quot;&gt;Part 1&lt;/a&gt; of the series shows how to correctly implement Equals, and the ==/!= operators.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Continuing our work on the EmailAddress class, we have so far implemented an immutable class that compares to other instances of the same type or to strings in the format “display name &lt;email address=&quot;&quot;&gt;”…&lt;/email&gt;&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code class=&quot;language-csharp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;EmailAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; displayName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	    DisplayName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; displayName&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		Address &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; address&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; Address &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; DisplayName &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ToString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; String&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;IsNullOrWhiteSpace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;DisplayName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		    &lt;span class=&quot;token punctuation&quot;&gt;?&lt;/span&gt; Address
			&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; String&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;{0} &amp;lt;{1}&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; DisplayName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt; other&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReferenceEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; other&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReferenceEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; other&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; other&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;DisplayName &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; DisplayName &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
		    other&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Address &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; Address&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; emailNameAndAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReferenceEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; emailNameAndAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; emailNameAndAddress &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ToString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;object&lt;/span&gt;&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;GetHashCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	    &lt;span class=&quot;token comment&quot;&gt;// TODO: What do I do with GetHashCode?&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;GetHashCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;operator&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt; emailAddress1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt; emailAddress2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReferenceEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;emailAddress1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; emailAddress1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;emailAddress2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;operator&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt; emailAddress1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt; emailAddress2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReferenceEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;emailAddress1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;emailAddress1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;emailAddress2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;operator&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt; emailAddress&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; nameAndAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReferenceEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;emailAddress&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; emailAddress&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nameAndAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;operator&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt; emailAddress&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; nameAndAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReferenceEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;emailAddress&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;emailAddress&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nameAndAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Just what do I do with GetHashCode()?&lt;/h3&gt;
&lt;p&gt;The requirements for GetHashCode() are best described by &lt;a href=&quot;http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when-equals-method-is-overriden-in-c/371348#371348&quot;&gt;Mark Gravell in this StackOverflow answer&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if two things are equal (Equals(…) == true) then they must return the same value for GetHashCode()&lt;/li&gt;
&lt;li&gt;if the GetHashCode() is equal, it is not necessary for them to be the same; this is a collision, and Equals will be called to see if it is a real equality or not.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also found a good &lt;a href=&quot;http://stackoverflow.com/questions/638761/c-gethashcode-override-of-object-containing-generic-array/639098#639098&quot;&gt;demonstration of what happens if you don’t provide a correct GetHashCode() implementation (again on StackOverflow)&lt;/a&gt;. In the demonstration it shows that HashSet wouldn’t consider the two instances as equal and ends up adding them both to the set. This might seem like a small problem in the demonstration but it is incorrect behaviour for an immutable value type and would be frustrating and difficult to debug if it got into a large-scale application.&lt;/p&gt;
&lt;p&gt;There seemed to be quite a few different ways of implementing GetHashCode, a lot of them by people who didn’t seem to really understand the requirements. After looking around, it seemed to me that the bst way of implementing it is &lt;a href=&quot;http://stackoverflow.com/questions/1008633/gethashcode-problem-using-xor/1008666#1008666&quot;&gt;described here&lt;/a&gt;. You take two &lt;a href=&quot;http://en.wikipedia.org/wiki/Coprime&quot;&gt;co-prime numbers&lt;/a&gt; (See &lt;a href=&quot;http://wiki.answers.com/Q/List_of_co_prime_numbers_in_between_1_to_31&quot;&gt;http://wiki.answers.com/Q/List_of_co_prime_numbers_in_between_1_to_31&lt;/a&gt; for some example sets of coprimes), and use these to compute a hash in the following way:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code class=&quot;language-csharp&quot;&gt;&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt;&lt;/span&gt; hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;
hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hash &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; MyFieldValue1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hash &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; MyFieldValue2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;MyReferenceTypeField &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hash &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; MyReferenceTypeField&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;GetHashCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; hash&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You should also setup some tests to prove that two instances that are equal have the same hash code…&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code class=&quot;language-csharp&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token attribute&quot;&gt;&lt;span class=&quot;token class-name&quot;&gt;Subject&lt;/span&gt;&lt;span class=&quot;token attribute-arguments&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;“Equality test”&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;when_an_instance_is_equal_to_another&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;It&lt;/span&gt; should_return_true_for_equals &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token constructor-invocation class-name&quot;&gt;MyValueClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Field1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Field2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ShouldBeTrue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token class-name&quot;&gt;It&lt;/span&gt; should_have_the_same_hashcode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;GetHashCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token constructor-invocation class-name&quot;&gt;MyValueClass&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Field1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Field2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;GetHashCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ShouldBeTrue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;…&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Given that equality of our &lt;strong&gt;EmailAddress&lt;/strong&gt; is based on the &lt;strong&gt;DisplayName&lt;/strong&gt; and &lt;strong&gt;Address&lt;/strong&gt; fields, the correct implementation is:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code class=&quot;language-csharp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;GetHashCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt;&lt;/span&gt; hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;23&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hash &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;37&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; DisplayName&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;GetHashCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hash &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;37&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; Address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;GetHashCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; hash&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  
  <entry>
    <title>A guide to value object equality in .NET (part 3)</title>
    <link href="https://jasonduffett.net/tech/guide-to-value-object-equality-part-3/" />
    <updated>2011-05-08T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/guide-to-value-object-equality-part-3/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;In the 3rd part of &lt;a href=&quot;https://jasonduffett.net/tech/guide-to-value-object-equality-part-1/&quot;&gt;this series&lt;/a&gt; I’ll show the tests I used to define, and confirm, my assumptions on how comparison of the EmailAddress object should work.&lt;/p&gt;
&lt;p&gt;If you didn’t catch the &lt;a href=&quot;https://jasonduffett.net/tech/guide-to-value-object-equality-part-1/&quot;&gt;other instalments in this series&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In &lt;a href=&quot;http://jasonduffett.net/post/5220416027/guide-to-value-object-equality-part-1&quot;&gt;part 1&lt;/a&gt; I explained how comparisons should work for value-type objects and implemented Equals and the ==/!= operators.&lt;/li&gt;
&lt;li&gt;In part 2 I covered GetHashCode() - why you can’t just use base.GetHashCode().&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My current favourite .NET testing framework is the excellent &lt;a href=&quot;https://github.com/machine/machine.specifications#readme&quot;&gt;Machine.Specifications&lt;/a&gt; (a.k.a. MSpec). If you’re not familiar with this framework than I highly recommend it and the BDD style syntax that it encourages.&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;using&lt;/span&gt; eSpares&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Levity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Primitives&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;using&lt;/span&gt; Machine&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Specifications&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

namespace eSpares&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Levity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Specs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Primitives
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	public abstract &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; EmailAddressComparisonContext
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		private const string TestName = &lt;span class=&quot;token string&quot;&gt;&quot;my name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		private const string TestEmail = &lt;span class=&quot;token string&quot;&gt;&quot;my@address.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		Establish context = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			SUT = new EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;TestName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; TestEmail&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		protected static EmailAddress SUT &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; get&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; private &lt;span class=&quot;token function&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Subject&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;EmailAddress Equality&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	public &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; when_comparing_equality_of_email_address_to_another_email_address : EmailAddressComparisonContext
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		It should_not_be_equal_to_null = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT == &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeFalse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_equal_itself = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT == SUT&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeTrue&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_equal_an_email_address_with_the_same_name_and_address = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT == new EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeTrue&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_have_the_same_hashcode_as_an_email_address_with_the_same_name_and_address = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;GetHashCode&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; == new EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;GetHashCode&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeTrue&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_not_equal_an_email_address_with_different_name = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT == new EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;a different name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeFalse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_not_equal_an_email_address_with_different_address = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT == new EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;some other address&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeFalse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_equal_an_email_address_with_the_same_string_value = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT == new EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ToString&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeTrue&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Subject&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;EmailAddress Equality&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	public &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; when_comparing_equality_of_email_address_using_equals : EmailAddressComparisonContext
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		It should_not_be_equal_to_null = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Equals&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeFalse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_equal_itself = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Equals&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeTrue&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_equal_an_email_address_with_the_same_name_and_address = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Equals&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;new EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeTrue&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_not_equal_an_email_address_with_different_name = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Equals&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;new EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;another name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeFalse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_not_equal_an_email_address_with_different_address = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Equals&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;new EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;not_my_address&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeFalse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_equal_a_string_matching_its_string_value = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Equals&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ToString&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeTrue&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_not_equal_a_string_that_doesnt_match_its_string_value = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Equals&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;a different string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeFalse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Subject&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;EmailAddress Equality&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	public &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; when_comparing_inequality_of_email_address_to_another_email_address : EmailAddressComparisonContext
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		It should_not_be_equal_to_null = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;= &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeTrue&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_equal_itself = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;= SUT&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeFalse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_equal_an_email_address_with_the_same_name_and_address = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;= new EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeFalse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_not_equal_an_email_address_with_different_name = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;= new EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;not my name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeTrue&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_not_equal_an_email_address_with_different_address = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;= new EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;not my address&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeTrue&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Subject&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;EmailAddress Equality&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	public &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; when_comparing_equality_of_email_address_to_a_string : EmailAddressComparisonContext
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		It should_equal_a_value_matching_its_string_value = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT == SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ToString&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeTrue&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_not_equal_a_value_that_doesnt_match_its_string_value = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT == &lt;span class=&quot;token string&quot;&gt;&quot;this is not me&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeFalse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Subject&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;EmailAddress Equality&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	public &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; when_comparing_inequality_of_email_address_to_a_string : EmailAddressComparisonContext
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		It should_equal_a_value_matching_its_string_value = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;= SUT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ToString&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeFalse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_not_equal_a_value_that_doesnt_match_its_string_value = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SUT &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;= &lt;span class=&quot;token string&quot;&gt;&quot;nope&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeTrue&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally… let’s just add some candy to the implementation to make it easier to use…&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;using&lt;/span&gt; System&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;using&lt;/span&gt; eSpares&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Levity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Primitives&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;using&lt;/span&gt; Machine&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Specifications&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

namespace eSpares&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Levity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Specs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Primitives
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Subject&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;EmailAddress Construction&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	public &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; When_creating_primitive_from_a_valid_email_address_string
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		private const string valid_email_address = &lt;span class=&quot;token string&quot;&gt;&quot;valid@email.address.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_set_the_address_property_to_the_email_address = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldEqual&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;valid_email_address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_set_the_name_property_to_null = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldEqual&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		Because of = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			email = new EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;valid_email_address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		static EmailAddress email&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Subject&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;EmailAddress Construction&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	public &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; When_creating_primitive_from_a_valid_name_and_email_address_string
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		private const string valid_name_and_email_address = &lt;span class=&quot;token string&quot;&gt;&quot;My Name &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		private const string Name = &lt;span class=&quot;token string&quot;&gt;&quot;My Name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		private const string Address = &lt;span class=&quot;token string&quot;&gt;&quot;valid@email.address.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_set_the_address_property_to_the_email_address = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldEqual&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_set_the_name_property_to_the_name = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldEqual&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		Because of = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			email = new EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;valid_name_and_email_address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		static EmailAddress email&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Subject&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;EmailAddress Construction&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	public &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; When_creating_primitive_from_string_ending_with_opening_angle_bracket
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		private const string invalid_name_and_email_address = &lt;span class=&quot;token string&quot;&gt;&quot;My Name &amp;lt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_set_the_address_property_to_the_string = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldEqual&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;invalid_name_and_email_address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_not_set_the_name_property = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldEqual&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		Because of = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			email = new EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;invalid_name_and_email_address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		static EmailAddress email&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Subject&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;EmailAddress Construction&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	public &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; When_creating_primitive_from_string_without_closing_angle_bracket
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		private const string invalid_name_and_email_address = &lt;span class=&quot;token string&quot;&gt;&quot;My Name
			email.Address.ShouldEqual(invalid_name_and_email_address);

		It should_not_set_the_name_property = () =&gt;
			email.Name.ShouldEqual(null);

		Because of = () =&gt;
			email = new EmailAddress(invalid_name_and_email_address);

		static EmailAddress email;
	}

	[Subject(&quot;&lt;/span&gt;EmailAddress Construction&lt;span class=&quot;token string&quot;&gt;&quot;)]
	public class When_creating_primitive_from_string_without_opening_angle_bracket
	{
		private const string invalid_name_and_email_address = &quot;&lt;/span&gt;My Name &gt;nothing interesting&lt;span class=&quot;token string&quot;&gt;&quot;;

		It should_set_the_address_property_to_the_string = () =&gt;
			email.Address.ShouldEqual(invalid_name_and_email_address);

		It should_not_set_the_name_property = () =&gt;
			email.Name.ShouldEqual(null);

		Because of = () =&gt;
			email = new EmailAddress(invalid_name_and_email_address);

		static EmailAddress email;
	}

	[Subject(&quot;&lt;/span&gt;EmailAddress Construction&lt;span class=&quot;token string&quot;&gt;&quot;)]
	public class When_creating_primitive_from_string_with_empty_angle_brackets
	{
		private const string invalid_name_and_email_address = &quot;&lt;/span&gt;My Name &amp;lt;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;;
		private const string name = &quot;&lt;/span&gt;My Name&lt;span class=&quot;token string&quot;&gt;&quot;;

		It should_set_the_address_property_to_an_empty_string = () =&gt;
			email.Address.ShouldEqual(string.Empty);

		It should_set_the_name = () =&gt;
			email.Name.ShouldEqual(name);

		Because of = () =&gt;
			email = new EmailAddress(invalid_name_and_email_address);

		static EmailAddress email;
	}

	[Subject(&quot;&lt;/span&gt;EmailAddress Construction&lt;span class=&quot;token string&quot;&gt;&quot;)]
	public class When_creating_primitive_from_invalid_string
	{
		private const string invalid_name_and_email_address = &quot;&lt;/span&gt;just something or other&lt;span class=&quot;token string&quot;&gt;&quot;;

		It should_set_the_address_property_to_the_string = () =&gt;
			email.Address.ShouldEqual(invalid_name_and_email_address);

		It should_not_set_the_name_property = () =&gt;
			email.Name.ShouldEqual(null);

		Because of = () =&gt;
			email = new EmailAddress(invalid_name_and_email_address);

		static EmailAddress email;
	}

	[Subject(&quot;&lt;/span&gt;EmailAddress Primitive&lt;span class=&quot;token string&quot;&gt;&quot;)]
	public class When_using_email_address_as_a_string
	{
		private const string name = &quot;&lt;/span&gt;My Name&lt;span class=&quot;token string&quot;&gt;&quot;;
		private const string address = &quot;&lt;/span&gt;email@address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com&lt;span class=&quot;token string&quot;&gt;&quot;;

		It should_return_the_name_and_address_in_standard_name_address_format = () =&gt;
			email.ToString().ShouldEqual(String.Format(&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &amp;lt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;, name, address));

		Because of = () =&gt;
			email = new EmailAddress(name, address);

		static EmailAddress email;
	}

	[Subject(&quot;&lt;/span&gt;EmailAddress Primitive&lt;span class=&quot;token string&quot;&gt;&quot;)]
	public class When_email_address_has_no_name
	{
		private const string address = &quot;&lt;/span&gt;my@email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;address&lt;span class=&quot;token string&quot;&gt;&quot;;

		It should_return_a_string_value_of_just_the_address = () =&gt;
			email.ToString().ShouldEqual(address);

		Because of = () =&gt;
			email = new EmailAddress(null, address);

		static EmailAddress email;
	}

	[Subject(&quot;&lt;/span&gt;EmailAddress Construction&lt;span class=&quot;token string&quot;&gt;&quot;)]
	public class When_creating_email_address_using_a_name_containing_angle_brackets
	{
		private const string invalid_name = &quot;&lt;/span&gt;My &amp;lt; Name&lt;span class=&quot;token string&quot;&gt;&quot;;
		private const string address = &quot;&lt;/span&gt;email@address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com&lt;span class=&quot;token string&quot;&gt;&quot;;

		It should_throw_a_format_exception = () =&gt;
			Exception.ShouldBeOfType(typeof(FormatException));

		Because of = () =&gt;
			Exception = Catch.Exception(() =&gt; new EmailAddress(invalid_name, address));

		static Exception Exception;
	}

	[Subject(&quot;&lt;/span&gt;EmailAddress Construction&lt;span class=&quot;token string&quot;&gt;&quot;)]
	public class When_creating_email_address_using_an_address_containing_angle_brackets
	{
		private const string invalid_address = &quot;&lt;/span&gt;&gt;not@an&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;email&lt;span class=&quot;token string&quot;&gt;&quot;;
		private const string name = &quot;&lt;/span&gt;name&lt;span class=&quot;token string&quot;&gt;&quot;;

		It should_throw_a_format_exception = () =&gt;
			Exception.ShouldBeOfType(typeof(FormatException));

		Because of = () =&gt;
			Exception = Catch.Exception(() =&gt; new EmailAddress(name, invalid_address));

		static Exception Exception;
	}

	[Subject(&quot;&lt;/span&gt;EmailAddress Construction&lt;span class=&quot;token string&quot;&gt;&quot;)]
	public class When_creating_email_address_without_specifying_an_address
	{
		private const string invalid_address = &quot;&lt;/span&gt;      &lt;span class=&quot;token string&quot;&gt;&quot;;
		private const string name = &quot;&lt;/span&gt;name&quot;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		It should_throw_a_format_exception = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			Exception&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ShouldBeOfType&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;typeof&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FormatException&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		Because of = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt;
			Exception = &lt;span class=&quot;token keyword&quot;&gt;Catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Exception&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; =&gt; new EmailAddress&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; invalid_address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		static Exception Exception&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code class=&quot;language-csharp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;eSpares&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Levity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Primitives&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt; InvalidNameChars &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&#39;&amp;lt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&#39;&gt;&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt; InvalidAddressChars &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&#39;&amp;lt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&#39;&gt;&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;EmailAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; nameAndEmailAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			Name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseNameFromNameAndAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nameAndEmailAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			Address &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseAddressFromNameAndAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nameAndEmailAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;EmailAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			Guard&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Against&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isNameValid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Value is invalid for EmailAddress.Name: [{0}]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			Guard&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Against&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isAddressValid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Value is invalid for EmailAddress.Address: [{0}]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			Name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			Address &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; address&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; Address &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; Name &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ToString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; String&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;IsNullOrWhiteSpace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;?&lt;/span&gt; Address
				&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; String&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;{0} &amp;lt;{1}&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt; other&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReferenceEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; other&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReferenceEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; other&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; other&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; Name &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
			       other&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Address &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; Address&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; emailNameAndAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReferenceEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; emailNameAndAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; emailNameAndAddress &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ToString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;object&lt;/span&gt;&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;GetHashCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt;&lt;/span&gt; hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;23&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hash &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;37&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; Name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;GetHashCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hash &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;37&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; Address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;GetHashCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; hash&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;operator&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt; emailAddress1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt; emailAddress2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReferenceEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;emailAddress1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; emailAddress1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;emailAddress2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;operator&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt; emailAddress1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt; emailAddress2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReferenceEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;emailAddress1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;emailAddress1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;emailAddress2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;operator&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt; emailAddress&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; nameAndAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReferenceEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;emailAddress&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; emailAddress&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nameAndAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;operator&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt; emailAddress&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; nameAndAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReferenceEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;emailAddress&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;emailAddress&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nameAndAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isNameValid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;IndexOfAny&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;InvalidNameChars&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isAddressValid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;address &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Trim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Length &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;IndexOfAny&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;InvalidAddressChars&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;token comment&quot;&gt;///&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;/// Returns the name portion of a string in format &quot;Name &amp;lt;email&gt;&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;///&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseNameFromNameAndAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; nameAndEmailAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; nameAndEmailAddress&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;IndexOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token char&quot;&gt;&#39;&amp;lt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; nameAndEmailAddress&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Contains&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			       	&lt;span class=&quot;token punctuation&quot;&gt;?&lt;/span&gt; nameAndEmailAddress&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Substring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Trim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			       	&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;span class=&quot;token comment&quot;&gt;///&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;/// Returns the address portion of a string in format &quot;Name &amp;lt;email&gt;&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;///&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseAddressFromNameAndAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; nameAndEmailAddress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt;&lt;/span&gt; start &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; nameAndEmailAddress&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;IndexOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token char&quot;&gt;&#39;&amp;lt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt;&lt;/span&gt; end &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; nameAndEmailAddress&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;IndexOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token char&quot;&gt;&#39;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; start &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;start &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; end &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; nameAndEmailAddress&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Trim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; end &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;?&lt;/span&gt; nameAndEmailAddress&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Substring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;start &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; end &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; start &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Trim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; nameAndEmailAddress&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Substring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;start &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Usage of static members</title>
    <link href="https://jasonduffett.net/tech/usage-of-static-members/" />
    <updated>2011-05-06T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/usage-of-static-members/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;Fixed a rather nasty race condition that had been left in our code base by one of our previous employees, caused by liberal usage of static methods and variables. When I saw the code it was one of those jaw-dropping moments. I emailed round this ‘back to basics’ guide from Patrick Smacchia on using the static keyword.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://codebetter.com/patricksmacchia/2011/05/04/back-to-basics-usage-of-static-members/&quot;&gt;Usage of static members&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Code Syntax Highlighting in Tumblr</title>
    <link href="https://jasonduffett.net/misc/code-syntax-highlighting-in-tumblr/" />
    <updated>2011-05-06T00:00:00Z</updated>
    <id>https://jasonduffett.net/misc/code-syntax-highlighting-in-tumblr/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;This is a great tool for adding code syntax-highlighting to Tumblr (or any other blog).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://alexgorbatchev.com/SyntaxHighlighter/manual/installation.html&quot;&gt;Code Syntax Highlighting in Tumblr&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>A guide to value object equality in .NET (Part 1)</title>
    <link href="https://jasonduffett.net/tech/guide-to-value-object-equality-part-1/" />
    <updated>2011-05-05T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/guide-to-value-object-equality-part-1/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;This is a guide to providing equality functionality to Value type classes in .NET. These are complex, immutable classes that behave like a value type.&lt;/p&gt;
&lt;p&gt;Implementing complex business primitives as value types is a core part of &lt;a href=&quot;http://domaindrivendesign.org/resources/what_is_ddd&quot;&gt;Domain Driven Design&lt;/a&gt; and creates a rich domain model and language that closely represents your actual business processes. For instance Money (Decimal value + Currency), Price (Ex-tax amount + sales tax amount).&lt;/p&gt;
&lt;p&gt;In this example I’ll use an &lt;strong&gt;EmailAddress&lt;/strong&gt; which we’ll define as the Address [string], and an optional Display Name [string].&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code class=&quot;language-csharp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; _displayName&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; _address&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;EmailAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; displayName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        _displayName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; displayName&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        _address &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; address&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;EmailAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        _address &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; address&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; DisplayName
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;get&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; _displayName&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt; Address
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;get&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; _address&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;///&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// Provide the standard string representation of a display name + email address.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;///&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ToString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; _displayName &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;?&lt;/span&gt; _address
            &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; String&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;{0} &amp;lt;{1}&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _displayName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The important attributes of a value type are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It is immutable.&lt;/li&gt;
&lt;li&gt;Two different instances of the type are equal if they represent the same value.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The core thing that we’re trying to achieve when implementing equality functionality for value objects is to have any equality comparisons (==, !=, .Equals(…), etc) follow the semantics of the value type. By default CLR classes derived from the System.Object type always perform reference equality – that is 2 instances of a class are not equal, even if all the properties of the class are equal – our aim is reverse this. Unfortunately, it’s very easy to make a mess of code doing this, run into infinite recursion, code duplication and other rubbish. Here is how I’m going about it with the EmailAddress class…&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Start with tests!&lt;/strong&gt; Tackling this problem test-first is a no-brainer. It allows you to clarify your ideas of what comparisons should be equal, and what shouldn’t be.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implement a custom version of Equals&lt;/strong&gt; The first thing to do is make the comparison with objects of the same type work. Don’t start by overriding &lt;strong&gt;Object.Equals(object)&lt;/strong&gt;, start by creating a method for your specific type. In the case of EmailAddress this is:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code class=&quot;language-csharp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token return-type class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt; other&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReferenceEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; other&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReferenceEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; other&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; other&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;DisplayName &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; DisplayName
       &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; other&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Address &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; Address&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Simple. It checks if “other” is null. It checks if “other” is the same reference as “this”. Then it does the custom property comparison required for this type (compares Address and DisplayName). 3. &lt;strong&gt;Use ReferenceEquals() not ==&lt;/strong&gt; This is where you can get stuck in a recursive loop. Eventually we’ll be overriding the == operator to use our Equals() method. If Equals() used == which used Equals() which used ==…. And so on… we have a problem. ReferenceEquals solves this. 4. &lt;strong&gt;Check for null and the same instance first&lt;/strong&gt; Duh. 5. &lt;strong&gt;Now override Equals(object)&lt;/strong&gt; Check for null, check for the same reference, then call your custom Equals method, use the “as” keyword to cast the object as the type you expect – if it’s not of the correct type then the cast will produce null to which our Equals method returns false.&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code class=&quot;language-csharp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;&lt;strong&gt;Override GetHashCode()&lt;/strong&gt; This is a more complex topic that I’ll cover in a later post… For now let’s just return base.GetHashCode() - which is bad but will work for our purposes now.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Override the == and != operators&lt;/strong&gt; Keep it simple. Check for null then defer to our Equals() method.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code class=&quot;language-csharp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;operator&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt; emailAddress1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;EmailAddress&lt;/span&gt; emailAddress2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReferenceEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;emailAddress1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; emailAddress1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;emailAddress2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;&lt;strong&gt;Now start adding complexity if you need it.&lt;/strong&gt; With this in place you can start adding extra complexity, but remember DRY! For instance to add string comparison to the string representation of an EmailAddress (&lt;em&gt;Display Name &lt;emailaddress&gt;&lt;/emailaddress&gt;&lt;/em&gt;) we would do the following: &lt;ul&gt;&lt;li&gt;Add an Equals(string emailAddressString) method which includes the comparison logic.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code class=&quot;language-csharp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;9&quot;&gt;
&lt;li&gt;Add the ==/!= operators – check for null and defer to our custom method.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Follow these steps and adding value-type comparison functionality to your class should be easy!!&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Windows 2008 R2 Service Pack 1 won&#39;t install!</title>
    <link href="https://jasonduffett.net/tech/windows-2008-r2-service-pack-1-error/" />
    <updated>2011-05-04T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/windows-2008-r2-service-pack-1-error/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;Error code &lt;strong&gt;800f0818&lt;/strong&gt; installing Windows 2008 R2 Service Pack 1?&lt;/p&gt;
&lt;p&gt;We rolled out Service Pack 1 to about 10 servers without any issues until today. A brand new installation of Windows 2008 R2 which failed with error code 800f0818. I had trouble finding a definitive guide on how to resolve it so here are steps I took…&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://i55.tinypic.com/5lxz87.png&quot; alt=&quot;Windows Update Error Message&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Install System Update Readiness Tool for Windows Server 2009 R2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This can be &lt;a href=&quot;http://www.microsoft.com/downloads/en/details.aspx?FamilyId=c4b0f52c-d0e4-4c18-aa4b-93a477456336&amp;amp;displaylang=en&quot;&gt;downloaded from Microsoft&lt;/a&gt;. After you’ve installed it, try the service pack again. Some people have reported this was all that was necessary to fix the problem. But for me it was more difficult…&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I referenced this &lt;a href=&quot;http://technet.microsoft.com/en-us/library/ee619779%28WS.10%29.aspx&quot;&gt;Microsoft Technet article&lt;/a&gt; to debug this problem.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check the System Update Readiness Tool log&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Check the SUR log at &lt;strong&gt;%windir%&#92;logs&#92;cbs&#92;checksur.log&lt;/strong&gt; and see what files caused problems. eg.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Unavailable repair files:
                 servicing&#92;packages&#92;Package_for_KB2446709_RTM~31bf3856ad364e35~amd64~~6.1.1.2.mum
                 servicing&#92;packages&#92;Package_for_KB2446709_RTM~31bf3856ad364e35~amd64~~6.1.1.2.cat
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Backup these files. eg.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:&#92;&amp;gt; copy %windir%&#92;servicing&#92;packages&#92;Package_for_KB2446709_RTM~31bf3856ad364e35~amd64~~6.1.1.2.cat C:&#92;backup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Take ownership of the files (so you can modify permissions)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:&#92;&amp;gt;  takeown /f c:&#92;windows&#92;servicing&#92;packages&#92;Package_for_KB2446709_RTM~31bf3856ad364e35~amd64~~6.1.1.2.cat
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Grant Administrators permissions to overwrite the files. eg.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:&#92;&amp;gt; icacls c:&#92;Windows&#92;servicing&#92;Packages&#92;Package_for_KB2446709_RTM~31bf3856ad364e35~amd64~~6.1.1.2.mum /grant administrators:F
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Copy the files from another, working, Windows 2008 R2 machine&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:&#92;&amp;gt; copy &#92;&#92;myworkingpc&#92;c$&#92;windows&#92;servicing&#92;packages&#92;Package_for_KB2446709_RTM~31bf3856ad364e35~amd64~~6.1.1.2.mum &amp;quot;%windir%&#92;servicing&#92;packages&#92;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you’re unlucky, like me, then you’ll find that you don’t have another PC with the correct files available on it. Check out the &lt;a href=&quot;http://technet.microsoft.com/en-us/library/ee619779%28WS.10%29.aspx&quot;&gt;Technet article&lt;/a&gt;, under &lt;em&gt;Options for obtaining files&lt;/em&gt;, it details how you can download the update package and extract the files to a temporary directory.&lt;/p&gt;
&lt;p&gt;Once you replaced the files, re-run the System Update Readiness Tool, then re-install the service pack.&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>TeamCity: deploy to an Active Directory group</title>
    <link href="https://jasonduffett.net/tech/teamcity-deploy-software-to-active-directory-group/" />
    <updated>2011-05-02T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/teamcity-deploy-software-to-active-directory-group/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;One of the goals we’re trying to achieve in our environment is simple, one-touch, deployment of our software to all environments. One of the applications we have is a small service that runs on each of the workstations in our warehouse (approximately 13 PCs at the moment).&lt;/p&gt;
&lt;p&gt;The main piece of work here is the PowerShell script that does all the work. But it relies on some infrastructure to make it all work…&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Active Directory security group containing each of the computers that run the application.&lt;/li&gt;
&lt;li&gt;A Group Policy Object that applies only to this security group. This GPO adds the TeamCity Build Agent domain account to the local Administrators group so that it has the right to stop &amp;amp; start the service when deploying the application.&lt;/li&gt;
&lt;li&gt;A TeamCity build for building &amp;amp; packaging the application as a zip file. The zip file should be published as an artifact of the build.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;PowerShell Script&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I include this script in a deployment tools folder in our source repository.&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;param&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token namespace&quot;&gt;[string]&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$PackageFilename&lt;/span&gt; = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Read-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Package filename to deploy&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token namespace&quot;&gt;[string]&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$ADGroupDistinguishedName&lt;/span&gt; = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Read-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Distinguished Name of Active Directory group to deploy to&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token namespace&quot;&gt;[string]&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$DestinationUNCPath&lt;/span&gt; = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Read-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;UNC path for installation on each computer&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token namespace&quot;&gt;[string]&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$ServiceName&lt;/span&gt; = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Read-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Name of the service being deployed&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Import Utilities&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Join-Path&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Path &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Split-Path&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;parent &lt;span class=&quot;token variable&quot;&gt;$MyInvocation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;MyCommand&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Definition&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ChildPath &lt;span class=&quot;token string&quot;&gt;&quot;.&#92;7-zip.ps1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;First we define the parameters for the script, and import the 7-zip function we’ll use for extracting the zip files later on. See my &lt;a href=&quot;http://jasonduffett.net/post/5103879646/using-7zip-from-powershell&quot;&gt;previous post&lt;/a&gt; for this function.&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;### Check package file exists&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Checking package file...&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Test-Path&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$PackageFilename&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;Write-Error&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Package file [&lt;span class=&quot;token variable&quot;&gt;$PackageFilename&lt;/span&gt;] could not be found or accessed.&quot;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;exit&lt;/span&gt; 1
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Check that the package file exists.&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;### Get Active Directory group&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Looking up group in active directory...&quot;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$adRoot&lt;/span&gt; = &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;[ADSI]&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;distinguishedName
&lt;span class=&quot;token variable&quot;&gt;$ADGroupDistinguishedName&lt;/span&gt; = &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$ADGroupDistinguishedName&lt;/span&gt;,&lt;span class=&quot;token variable&quot;&gt;$adRoot&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$adGroup&lt;/span&gt; = &lt;span class=&quot;token namespace&quot;&gt;[ADSI]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;LDAP://&lt;span class=&quot;token variable&quot;&gt;$ADGroupDistinguishedName&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$adGroup&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$null&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-or&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$adGroup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;distinguishedName &lt;span class=&quot;token operator&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;Write-Error&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Group was not found in directory: [&lt;span class=&quot;token variable&quot;&gt;$ADGroupDistinguishedName&lt;/span&gt;]&quot;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;exit&lt;/span&gt; 1
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Active directory group found: [&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$adGroup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;distinguishedName &lt;span class=&quot;token string&quot;&gt;&quot;].&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;### Get computer members of group&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Looking up members of group...&quot;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$filter&lt;/span&gt; = &lt;span class=&quot;token string&quot;&gt;&quot;(&amp;amp;(objectCategory=computer)(memberOf=&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$adGroup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;distinguishedName &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;))&quot;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$search&lt;/span&gt; = &lt;span class=&quot;token function&quot;&gt;New-Object&lt;/span&gt; System&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;DirectoryServices&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;DirectorySearcher&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token namespace&quot;&gt;[void]&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$search&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PropertiesToLoad&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Add&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;dNSHostName&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$members&lt;/span&gt; = &lt;span class=&quot;token variable&quot;&gt;$search&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;FindAll&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Error handling is a bit odd since FindAll() is not executed until comparing the result with $null&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token variable&quot;&gt;$error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Clear&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$members&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$null&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-or&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$members&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Count &lt;span class=&quot;token operator&quot;&gt;-eq&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Write-Error&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;No computers found in group.&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token variable&quot;&gt;$memberCount&lt;/span&gt; = &lt;span class=&quot;token variable&quot;&gt;$members&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Count
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;Write-Error&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;exit&lt;/span&gt; 1
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$memberCount&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;computers found in group.&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We use ADSI to look up the Active Directory group by its Distinguished Name then, using the &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.aspx&quot;&gt;System.DirectoryServices.DirectorySearcher&lt;/a&gt;, enumerate the FQDN of all the computers in the group.&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;### Deploy to each member&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$deployedCount&lt;/span&gt; = 0
&lt;span class=&quot;token keyword&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$member&lt;/span&gt; in &lt;span class=&quot;token variable&quot;&gt;$members&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token variable&quot;&gt;$computerFQDN&lt;/span&gt; = &lt;span class=&quot;token variable&quot;&gt;$member&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Properties&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Item&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;dNSHostName&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Starting deploy to &lt;span class=&quot;token variable&quot;&gt;$computerFQDN&lt;/span&gt;...&quot;&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;### Test connection to computer&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Testing connection...&quot;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Test-Connection&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$computerFQDN&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;quiet&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;Write-Error&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Unable to deploy to &lt;span class=&quot;token variable&quot;&gt;$computerFQDN&lt;/span&gt;. Computer is not reachable.&quot;&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;### Get the remote service&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Getting service: [&lt;span class=&quot;token variable&quot;&gt;$ServiceName&lt;/span&gt;]&quot;&lt;/span&gt;
        &lt;span class=&quot;token variable&quot;&gt;$service&lt;/span&gt; = &lt;span class=&quot;token function&quot;&gt;Get-Service&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;DisplayName &lt;span class=&quot;token variable&quot;&gt;$ServiceName&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ComputerName &lt;span class=&quot;token variable&quot;&gt;$computerFQDN&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ErrorAction SilentlyContinue
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$service&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;Write-Error&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Service [&lt;span class=&quot;token variable&quot;&gt;$ServiceName&lt;/span&gt;] was not found, or there are insufficient permissions to query the service on &lt;span class=&quot;token variable&quot;&gt;$computerFQDN&lt;/span&gt;.&quot;&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;### Stop service&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$service&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Status &lt;span class=&quot;token operator&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Running&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Stopping service...&quot;&lt;/span&gt;
                &lt;span class=&quot;token variable&quot;&gt;$error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Clear&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;Stop-Service&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;InputObject &lt;span class=&quot;token variable&quot;&gt;$service&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ErrorAction SilentlyContinue
                &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;$?&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;token function&quot;&gt;Write-Error&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
                        &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

                &lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Waiting for service to stop...&quot;&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;Sleep&lt;/span&gt; 5
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;Write-Warning&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Service [&lt;span class=&quot;token variable&quot;&gt;$ServiceName&lt;/span&gt;] is already stopped on [&lt;span class=&quot;token variable&quot;&gt;$computerFQDN&lt;/span&gt;].&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;### Check service has stopped&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$service&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Status &lt;span class=&quot;token operator&quot;&gt;-ne&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Stopped&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;Write-Error&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Service has not responded to stop request, cannot continue deployment to &lt;span class=&quot;token variable&quot;&gt;$computerFQDN&lt;/span&gt;.&quot;&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;### Unzip and overwrite existing files&lt;/span&gt;
        &lt;span class=&quot;token variable&quot;&gt;$error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Clear&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token variable&quot;&gt;$destinationPath&lt;/span&gt; = &lt;span class=&quot;token string&quot;&gt;&quot;&#92;&#92;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Join-Path&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$computerFQDN&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$DestinationUNCPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Testing destination path...&quot;&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Test-Path&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$destinationPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Unzipping &lt;span class=&quot;token variable&quot;&gt;$PackageFilename&lt;/span&gt; to &lt;span class=&quot;token variable&quot;&gt;$destinationPath&lt;/span&gt;...&quot;&lt;/span&gt;
                        Unzip-File &lt;span class=&quot;token variable&quot;&gt;$PackageFilename&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$destinationPath&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Could not access destination path [&lt;span class=&quot;token variable&quot;&gt;$destinationPath&lt;/span&gt;]. Unable to deploy to &lt;span class=&quot;token variable&quot;&gt;$computerFQDN&lt;/span&gt;.&quot;&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;Write-Error&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;finally&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;### Start service&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Starting service...&quot;&lt;/span&gt;
                &lt;span class=&quot;token variable&quot;&gt;$error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Clear&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;Start-Service&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;InputObject &lt;span class=&quot;token variable&quot;&gt;$service&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ErrorAction SilentlyContinue
                &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;$?&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;token function&quot;&gt;Write-Error&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
                        &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ForegroundColor green &lt;span class=&quot;token string&quot;&gt;&quot;Deployed successfully to &lt;span class=&quot;token variable&quot;&gt;$computerFQDN&lt;/span&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;token variable&quot;&gt;$deployedCount&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;### Check final results&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$deployedCount&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$memberCount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;Write-Host&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ForegroundColor green &lt;span class=&quot;token string&quot;&gt;&quot;Successfully deployed to all clients.&quot;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;exit&lt;/span&gt; 0
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;Write-Warning&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;[string]&lt;/span&gt;::Format&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Deployed to {0} of {1} computers.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$deployedCount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$memberCount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;exit&lt;/span&gt; 1
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For each computer we identified, do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Check that the computer is contactable using &lt;a href=&quot;http://technet.microsoft.com/en-us/library/dd315259.aspx&quot;&gt;Test-Connection&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Get the service on the remote computer using &lt;a href=&quot;http://technet.microsoft.com/en-us/library/ee176858.aspx&quot;&gt;Get-Service&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check the service status and stop it if necessary.&lt;/li&gt;
&lt;li&gt;Unzip the package file using &lt;a href=&quot;http://jasonduffett.net/post/5103879646/using-7zip-from-powershell&quot;&gt;7-zip&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Restart the service on the remote computer.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This script can now be used in a TeamCity build configuration to deploy from an artifact of a previous successful build.&lt;/p&gt;
&lt;p&gt;You can download the full PowerShell script at GitHub: &lt;a href=&quot;https://github.com/laazyj/blogAttachments/raw/master/deploy_updated_service.ps1&quot;&gt;deploy_updated_service.ps1&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Using 7zip from PowerShell</title>
    <link href="https://jasonduffett.net/tech/using-7zip-from-powershell/" />
    <updated>2011-05-01T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/using-7zip-from-powershell/</id>
    <rights>© 2011 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;Although it is possible to invoke the Shell’s zip functions from within PowerShell to unzip a file, I’ve found that it is slow and problematic for automated scripts since it will show confirmation dialogues when it encounters a problem.&lt;/p&gt;
&lt;p&gt;One solution is to use the excellent &lt;a href=&quot;http://www.7-zip.org/&quot;&gt;7-zip&lt;/a&gt; command line utility instead.&lt;/p&gt;
&lt;p&gt;This PowerShell function neatly wraps the 7-zip command making it easier to use in your scripts…&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$ZipCommand&lt;/span&gt; = &lt;span class=&quot;token function&quot;&gt;Join-Path&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Path &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Split-Path&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;parent &lt;span class=&quot;token variable&quot;&gt;$MyInvocation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;MyCommand&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Definition&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ChildPath &lt;span class=&quot;token string&quot;&gt;&quot;7z.exe&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Test-Path&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$ZipCommand&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;7z.exe was not found at &lt;span class=&quot;token variable&quot;&gt;$ZipCommand&lt;/span&gt;.&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;set-alias&lt;/span&gt; zip &lt;span class=&quot;token variable&quot;&gt;$ZipCommand&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; Unzip-File &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;param&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;token namespace&quot;&gt;[string]&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$ZipFile&lt;/span&gt; = $&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ZipFile must be specified.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token namespace&quot;&gt;[string]&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$OutputDir&lt;/span&gt; = $&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;OutputDir must be specified.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Test-Path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$ZipFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Zip filename does not exist: &lt;span class=&quot;token variable&quot;&gt;$ZipFile&lt;/span&gt;&quot;&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

        zip x &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;y &lt;span class=&quot;token string&quot;&gt;&quot;-o&lt;span class=&quot;token variable&quot;&gt;$OutputDir&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$ZipFile&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;$?&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;7-zip returned an error unzipping the file.&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The script relies on &lt;strong&gt;7z.exe&lt;/strong&gt; and &lt;strong&gt;7z.dll&lt;/strong&gt; being in the same directory as the script.&lt;/p&gt;
&lt;p&gt;Using it is as simple as…&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Import 7zip module&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Join-Path&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Path &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Split-Path&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;parent &lt;span class=&quot;token variable&quot;&gt;$MyInvocation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;MyCommand&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Definition&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ChildPath &lt;span class=&quot;token string&quot;&gt;&quot;.&#92;7-zip.ps1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Unzip a file&lt;/span&gt;
Unzip-File &lt;span class=&quot;token string&quot;&gt;&quot;c:&#92;myzipfile.zip&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;c:&#92;destination-folder&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  
  <entry>
    <title>iPhone 4 and Sky wireless</title>
    <link href="https://jasonduffett.net/tech/iphone-4-and-sky-wireless/" />
    <updated>2010-11-15T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/iphone-4-and-sky-wireless/</id>
    <rights>© 2010 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;So, here I am. 2 months into a new flat and Sky have finally managed to get my broadband connected.&lt;br /&gt;
I’m running around the house madly hooking devices up to the wireless network and everything is grand… everything except my iPhone 4…&lt;/p&gt;
&lt;p&gt;It can see the network but when I enter the WPA key it gives me a nice “Unable to join network” message.&lt;/p&gt;
&lt;p&gt;Browsing the web for solutions finds such useful nuggets of wisdom, as “get a real phone”, etc.&lt;/p&gt;
&lt;p&gt;Luckily there is a simple solution.&lt;/p&gt;
&lt;p&gt;The CAPS lock function just didn’t do its job. Sky WPA passwords are all in capitals by default so of course I used the iPhone double-shift-tap to enable CAPS lock when entering the key, but for whatever reason that didn’t work.&lt;br /&gt;
Trying again, but using the tedious, tap-shift, tap-letter, tap-shift… method got me online.&lt;/p&gt;
&lt;p&gt;Of course, I’m completely unable to reproduce it now. Forgetting the network and trying to rejoin using CAPS lock works fine…&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Premature Optimisation - The root of all evil...</title>
    <link href="https://jasonduffett.net/tech/premature-optimisation-root-of-all-evil/" />
    <updated>2010-09-05T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/premature-optimisation-root-of-all-evil/</id>
    <rights>© 2010 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;“Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97% of the time: &lt;strong&gt;premature optimization is the root of all evil&lt;/strong&gt;. Yet we should not pass up our opportunities in that critical 3%.” - Donald Knuth.&lt;/p&gt;
&lt;p&gt;What are your thoughts?&lt;/p&gt;
&lt;p&gt;My thinking is that the most important considerations, in some sort of rough order, are:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Is the code clean, clear, understandable and maintainable?&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;This is my number 1 because if the code is clear &amp;amp; maintainable then fixing any of the following steps becomes much easier.&lt;/em&gt;&lt;br /&gt;
&lt;strong&gt;2. Does it do what it says on the tin?&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;3. Is step 2 proven by unit tests, etc?&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;4. &lt;em&gt;(insert individual pet-peeves about maintainability, consistency, testability, etc)&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;5. Does it perform well?&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;If you’ve got 1-4 sorted then the profiling and optimising required to meet step 5 is easy.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;And that’s the point…&lt;/p&gt;
&lt;p&gt;How do you know what to optimise (the 97%) until you’ve actually got something working that you can either profile in a reasonable testing environment or, in the case of a brand-new feature, deploy it to production to see how it will perform with actual users in a real-life situation?&lt;/p&gt;
&lt;p&gt;This observation also applies to “god” or future-proofing designs. Don’t write extra code to cater for hypothetical situations.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;See the full article at &lt;a href=&quot;http://c2.com/cgi/wiki?PrematureOptimization&quot;&gt;http://c2.com/cgi/wiki?PrematureOptimization&lt;/a&gt; for a more balanced and less-loaded definition of Premature Optimization.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Are you a ferengi programmer or want to become one?</title>
    <link href="https://jasonduffett.net/tech/are-you-ferengi-programmer-or-want-to/" />
    <updated>2010-08-27T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/are-you-ferengi-programmer-or-want-to/</id>
    <rights>© 2010 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.codinghorror.com/blog/2009/02/the-ferengi-programmer.html&quot;&gt;http://www.codinghorror.com/blog/2009/02/the-ferengi-programmer.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One of my colleagues (&lt;a href=&quot;http://theminimalistdeveloper.com/&quot;&gt;the minimalist developer&lt;/a&gt;) pointed this article out to me with the following warning:&lt;/p&gt;
&lt;p&gt;&amp;quot;Good read but a General Health Warning to those with the soft spot for patterns, SOLID and all those patterns that spews out of a la Martin Fowler cliché. The post will probably make you squirm, increase indigestion, make you vomit or all of them in no particular sequence.&lt;/p&gt;
&lt;p&gt;You have been warned. &amp;quot;&lt;/p&gt;
&lt;p&gt;Patterns, practises, etc are &lt;strong&gt;guidelines, &lt;em&gt;not rules&lt;/em&gt;&lt;/strong&gt; that people have found work in certain situations. They can’t and shouldn’t be forced upon every situation.&lt;/p&gt;
&lt;p&gt;It’s like using sample code you find on the web.&lt;br /&gt;
You don’t just paste it verbatim into your project and then beat all the surrounding code with a hammer to make it fit. You read it, digest it and implement the bits of it that sense, in a way that makes sense to your project.&lt;/p&gt;
&lt;p&gt;Patterns are the same. It is important to know of them, just as it’s important to know the standard libraries in your language of choice, because it gives you a library of knowledge that you can quickly draw upon to solve problems. It also increases your ability to communicate with other developers without having to explain the full details of what your trying to do.&lt;br /&gt;
But they need to be applied only when and in ways that make sense to what you’re trying to achieve.&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Mac OS, camera and auto-launching application</title>
    <link href="https://jasonduffett.net/tech/mac-os-camera-and-auto-launching/" />
    <updated>2010-06-29T00:00:00Z</updated>
    <id>https://jasonduffett.net/tech/mac-os-camera-and-auto-launching/</id>
    <rights>© 2010 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;For some reason that I can’t remember, I installed the Canon EOS utility for my Canon digital camera on my Mac a few weeks back.&lt;br /&gt;
Now every time I plug in either my digital camera or my iPhone an application called “Camera Window” would launch and then display an error.&lt;/p&gt;
&lt;p&gt;To fix this problem you should launch the &lt;strong&gt;Image Capture&lt;/strong&gt; application (found in Applications), select your iPhone (or other device) and there is a setting for which application, or no application, to launch when the device is connected.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/5867318857560650310/0.png&quot; alt=&quot;Mac Image Capture window with the connect-device app dropdown highlighted&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;http://www.dcresource.com/forums/showthread.php?p=413504&quot;&gt;this thread&lt;/a&gt; for the info on how to fix it.&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Beer Ambassadors Half-Time Score</title>
    <link href="https://jasonduffett.net/misc/beer-ambassadors-half-time-score/" />
    <updated>2010-06-23T00:00:00Z</updated>
    <id>https://jasonduffett.net/misc/beer-ambassadors-half-time-score/</id>
    <rights>© 2010 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;Well this is it for me. The final day of my leg of the Beer Ambassadors at Large USA tour.&lt;br /&gt;
It’s been a whirlwind tour of hops, malt and yeast. There have been many highs and almost as many lows in this crazy tour. One Beer Ambassador is still without a passport and another is on prescription medicine, but we have sampled some awesome beers and it has opened my eyes to the world of these beer-nerds. I’ll never drink another pint of Foster’s, that’s for sure!&lt;/p&gt;
&lt;p&gt;The last few days in Portland (formerly Beer-City USA - a title that now belongs to Ashville NC) have been given us a well-earned rest from constant drinking and travelling - we haven’t done any travelling.&lt;br /&gt;
The Portland beer-market is dominated by craft breweries, 1 in every 2 beers sold are craft beers. It shows. The number of brew-pubs, breweries and beer-bars in this town is amazing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/7460032368915027057/0.jpg&quot; alt=&quot;Rows of hop bines growing on trellises at an Oregon hop farm&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We started off with a visit to &lt;a href=&quot;http://www.bridgeportbrew.com/&quot;&gt;the Bridgeport brewery&lt;/a&gt; with Matt Sage who also took us out of town to visit an Oregon hop farm. Thanks to Matt and Gayle Goschie for your time and insights.&lt;/p&gt;
&lt;p&gt;The next day we continued paying visits on Portland’s finest purveyors of amber liquids, but the highlight must’ve been the unexpected passing of the annual &lt;a href=&quot;http://www.shift2bikes.org/wnbr/min.php&quot;&gt;Portland World Naked Bike Ride&lt;/a&gt; - a couple of the Beer Ambassadors also managed to attend the mostly-naked after-party (but they shall remain nameless).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/7460032368915027057/1.jpg&quot; alt=&quot;Darts stuck in a pub dartboard mounted on the wall&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I am Laazy J, Prince of Darts…&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;And on the third day they rested. Sort of. A quiet walk around the down-town area visiting &lt;a href=&quot;http://www.rogue.com/&quot;&gt;Rogue’s&lt;/a&gt; Portland pub and the &lt;a href=&quot;http://www.deschutesbrewery.com/brewery/brew-pubs/portland-pub/default.aspx&quot;&gt;Deschutes&lt;/a&gt; brew-pub.&lt;br /&gt;
Dinner and a few bars and the night was capped off back at the hotel with some bottles of oak-aged &lt;a href=&quot;http://odellbrewing.com/home&quot;&gt;Odells&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The full Beer Ambassadors report on Portland is available at &lt;a href=&quot;http://beerambassadors.blogspot.com/2010/06/welcome-to-portland-city-whose-claim-to.html&quot;&gt;BeerAmbassadors.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Anyone in the London area on the 1st-4th July should make there way to the &lt;a href=&quot;http://www.whitehorsesw6.com/news-events.php&quot;&gt;White Horse in Parson’s Green&lt;/a&gt; where Doug Odell will be attending the Great American Beer Festival.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://picasaweb.google.com/lh/photo/is_Nym-8c2lAg6FZrOgCsA?feat=embedwebsite&quot;&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/7460032368915027057/2.jpg&quot; alt=&quot;Three men toasting glasses of beer in front of brewery tanks&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;From &lt;a href=&quot;http://picasaweb.google.com/laazyj/BeerambassadorsUsaJune2010?feat=embedwebsite&quot;&gt;beerambassadors-usa (June 2010)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The final day we woke and made our way to Portland Union Station to catch the Amtrak to Seattle.&lt;br /&gt;
We arrived in Seattle late afternoon and had to be at the airport at 6AM the next morning to catch our flights. But there was still time for a couple for breweries &amp;amp; bars: &lt;a href=&quot;http://www.pikebrewing.com/&quot;&gt;Pike Brewing&lt;/a&gt;, &lt;a href=&quot;http://halesbrewery.com/&quot;&gt;Hales Ales&lt;/a&gt; and &lt;a href=&quot;http://brouwerscafe.blogspot.com/&quot;&gt;Brouwer’s Cafe&lt;/a&gt;.&lt;br /&gt;
A four bed dorm, Tom’s snoring, Miro’s farting and a 5AM alarm and the next thing I knew it was over…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fare thee well ye noble men of beer.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Don’t forget to follow the east-coast stage of Beer Ambassadors at Large USA on &lt;a href=&quot;http://www.beerambassadors.com/&quot;&gt;www.beerambassadors.com&lt;/a&gt; and at &lt;a href=&quot;http://twitter.com/beerambassadors&quot;&gt;twitter.com/beerambassadors&lt;/a&gt;. To read up on some of the previous west-coast adventures see my &lt;a href=&quot;http://blog.ponchoslament.com/search/label/beerambassadors&quot;&gt;blog history&lt;/a&gt; and the &lt;a href=&quot;http://picasaweb.google.com/laazyj/BeerambassadorsUsaJune2010&quot;&gt;photo album&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The full (brewery/brew-pub/specialty beer bars only) itinerary so far…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 1 (LA)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.libraryalehouse.com/&quot;&gt;Library Alehouse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.fathersoffice.com/&quot;&gt;Father’s Office&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Day 2 (Escondido)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.stonebrew.com/home.asp&quot;&gt;Stone&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Day 3 (San Diego)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://ballastpointbrewingandspirits.com/Welcome.html&quot;&gt;Ballast Point&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.homebrewmart.com/&quot;&gt;Ballast Point Home Brew Mart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.greenflashbrew.com/&quot;&gt;Green Flash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.pizzaport.com/&quot;&gt;Pizza Port&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Day 4 (Denver)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.greatdivide.com/&quot;&gt;Great Divide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Day 5 (Boulder)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.averybrewing.com/&quot;&gt;Avery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mountainsunpub.com/&quot;&gt;Mountain Sun&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.oskarblues.com/&quot;&gt;Oscar Blues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Day 6 (Fort Collins)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://odellbrewing.com/home&quot;&gt;Odells&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.newbelgium.com/&quot;&gt;New Belgium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.pumphousebrewery.com/&quot;&gt;Pumphouse&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Day 7 (San Francisco)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.toronado.com/&quot;&gt;Toronados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.magnoliapub.com/index.html&quot;&gt;Magnolias&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Day 8 (Berkeley)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.trumer-international.com/trumer-web/trumer-breweries/trumer-breweries.html&quot;&gt;Trummers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.takarasake.com/&quot;&gt;Sake Factory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lucky13alameda.com/&quot;&gt;Lucky 13s&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Day 9&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.anchorbrewing.com/&quot;&gt;Anchor&lt;/a&gt; (San Francisco)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.russianriverbrewing.com/&quot;&gt;Russian River&lt;/a&gt; (Santa Rosa)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Day 10 (Chico)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sierranevada.com/&quot;&gt;Sierra Nevada&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Day 11&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lostcoast.com/&quot;&gt;Lost Coast&lt;/a&gt; (Eureka)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.humboldtbrews.com/index.php&quot;&gt;Humboldt Brews&lt;/a&gt; (Arcata)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Day 12 (Newport)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.rogue.com/&quot;&gt;Rogue&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Day 13 (Portland)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.bridgeportbrew.com/&quot;&gt;Bridgeport&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.bridgeportbrew.com/&quot;&gt;&lt;/a&gt;Goschie Hop farm&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://apexbar.com/&quot;&gt;Apex&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Day 14 (Portland)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://henrystavern.com/page/home&quot;&gt;Henry’s Tavern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.horsebrass.com/&quot;&gt;Horse Brass Pub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://belmont-station.com/&quot;&gt;Belmont Station&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.pdxgreendragon.com/&quot;&gt;Green Dragon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Day 15 (Portland)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.rogue.com/&quot;&gt;Rogue&lt;/a&gt; (Portland)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.deschutesbrewery.com/brewery/brew-pubs/portland-pub/default.aspx&quot;&gt;Deschutes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Day 16 (Seattle)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.pikebrewing.com/&quot;&gt;Pikes Brewing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://halesbrewery.com/&quot;&gt;Hale’s Ales&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://brouwerscafe.blogspot.com/&quot;&gt;Brouwer’s Cafe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PS. If Barney is reading this &lt;a href=&quot;http://picasaweb.google.com/laazyj/BeerambassadorsUsaJune2010&quot;&gt;CLICK HERE&lt;/a&gt; to access the photo album.&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>The Rogue Nation</title>
    <link href="https://jasonduffett.net/misc/rogue-nation/" />
    <updated>2010-06-21T00:00:00Z</updated>
    <id>https://jasonduffett.net/misc/rogue-nation/</id>
    <rights>© 2010 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/2993909445725299666/0.jpg&quot; alt=&quot;Tall red Rogue Ales tower marking the brewery entrance&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Earlier this week, Beer Ambassadors said “&lt;a href=&quot;https://jasonduffett.net/misc/thank-you-for-your-wine-california/&quot;&gt;so long California&lt;/a&gt;” and drove up the beautiful highway 101 into Oregon. Our first stop was a noon appointment in Newport with &lt;a href=&quot;http://www.rogue.com/nation/nation.php&quot;&gt;Rogue Ales&lt;/a&gt;.&lt;br /&gt;
There was a bit of a buzz in the back of the Beer Ambassador Nissan as we approached this little seaside town. Rogue beers are one of the few american craft beers that are semi-regularly available in Australia and the boys were keen to sample them at the source.&lt;/p&gt;
&lt;p&gt;We were met at the brewery Jim Cline (Vice President/Manager) who showed us around the premises. Rogue brewery is a great example of a brewery growing “organically”. None of their equipment was bought new, a lot of it is converted dairy and other bits and pieces. It was amazing to see how they can make such great beer amongst such chaos.&lt;/p&gt;
&lt;p&gt;We also visited their on-site distillery to sample the Gin, Whisky and Rum that they are making using the wort from the brewery.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/2993909445725299666/1.jpg&quot; alt=&quot;Black Rogue-branded kegs stacked on pallets by the waterfront&quot; /&gt;&lt;/p&gt;
&lt;p&gt;After the tour we checked into the hotel and headed to the old town where Rogue have their alehouse. Jim had invited us to an oyster and beer party they were throwing for one their distributors who was visiting from North Carolina.&lt;/p&gt;
&lt;p&gt;Free Rogue ales? Free Oysters? Beer Ambassadors would not pass up such a generous offer.&lt;/p&gt;
&lt;p&gt;The Rogue guys then showed us what a night in little Newport could really be. Beer, oysters, seafood, more beer and just general good times.&lt;br /&gt;
Miro even managed to find his way back to the hotel this time.&lt;/p&gt;
&lt;p&gt;The next morning, Beer ambassadors were suffering the effects, but Jim spotted us to a good, cooked breakfast and we were once again on the road. Next stop… Portland.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;As always, beer nerd details, some videos and more photos are available at &lt;a href=&quot;http://beerambassadors.blogspot.com/2010/06/welcome-to-rogue-army.html&quot;&gt;BeerAmbassadors.com&lt;/a&gt; and my &lt;a href=&quot;http://picasaweb.google.com/laazyj/BeerambassadorsUsaJune2010#&quot;&gt;photo album&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://picasaweb.google.com/lh/photo/kpcYgfhUYT9mvoZKmxJoig?feat=embedwebsite&quot;&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/2993909445725299666/2.jpg&quot; alt=&quot;Rogue beer bottles displayed on a shelf near the ceiling&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://picasaweb.google.com/lh/photo/fPkh9pSYJpN2mLK02_PTaA?feat=embedwebsite&quot;&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/2993909445725299666/3.jpg&quot; alt=&quot;Row of Chatoe Rogue Oregon single malt whiskey bottles&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://picasaweb.google.com/lh/photo/13vSLP1NRSYBuI614v4vYA?feat=embedwebsite&quot;&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/2993909445725299666/4.jpg&quot; alt=&quot;Men in aprons shucking oysters over a grill at the party&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://picasaweb.google.com/lh/photo/AGaRyEfccVjks3kVvfMC1w?feat=embedwebsite&quot;&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/2993909445725299666/5.jpg&quot; alt=&quot;Two men holding beers in front of fermentation tanks at Rogue&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;From &lt;a href=&quot;http://picasaweb.google.com/laazyj/BeerambassadorsUsaJune2010?feat=embedwebsite&quot;&gt;beerambassadors-usa (June 2010)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Beer Ambassadors are sworn into the Rogue Nation&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Thank you for your wine, California</title>
    <link href="https://jasonduffett.net/misc/thank-you-for-your-wine-california/" />
    <updated>2010-06-20T00:00:00Z</updated>
    <id>https://jasonduffett.net/misc/thank-you-for-your-wine-california/</id>
    <rights>© 2010 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;…your &lt;a href=&quot;http://en.wikipedia.org/wiki/Barley_wine&quot;&gt;Barley Wine&lt;/a&gt; that is.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;San Francisco and the Bay Area&lt;/strong&gt;&lt;br /&gt;
After the shenanigans of Colorado (see &lt;a href=&quot;https://jasonduffett.net/misc/rocky-mountain-high/&quot;&gt;earlier post&lt;/a&gt; and &lt;a href=&quot;http://beerambassadors.blogspot.com/2010/06/death-from-above.html&quot;&gt;beerambassadors.com&lt;/a&gt;), and now that the Beer Ambassadors were 4 again, we were all looking forward to a relaxing time in San Francisco.&lt;/p&gt;
&lt;p&gt;Our hotel seemed to be in the area known as Civic Center but which we fondly remember as Crack-Town. For a bunch of sweaty, hungover aussies it wasn’t a great introduction to the what San Francisco has to offer. Still, we made the best of it. Laundry, showers, walk around in the sun and it was time to visit the first 2 locations we had ear-marked: A beer-bar called &lt;a href=&quot;http://www.toronado.com/&quot;&gt;Toronado&lt;/a&gt;; and a brew-pub called &lt;a href=&quot;http://www.magnoliapub.com/index.html&quot;&gt;Magnolia&lt;/a&gt; in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Haight-Ashbury&quot;&gt;Haight-Ashbury area&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The next day, after the first full-night’s sleep in an age, we were ready to get serious again. Jaime Jurando from the &lt;a href=&quot;http://www.gambrinus.com/&quot;&gt;Gambrinus Company&lt;/a&gt;, who had kindly offered to be our tour guide in the bay area, extracted us from Crack Town and took us to a great bay-side hotel in Berkeley. He then gave us the best tour of San Francisco, Berkeley, Oakland and the general bay area that we could have asked for - including a number of beer-bars, the old naval base, a private tour of the &lt;a href=&quot;http://www.trumer-international.com/trumer.php&quot;&gt;Trummer Pils&lt;/a&gt; brewery in Berkeley and a tasting at a Sake factory.&lt;/p&gt;
&lt;p&gt;We also visited two Apple stores in search of an iPad but they couldn’t be had for love nor money…&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/4593956378464589738/0.jpg&quot; alt=&quot;Grinning man in a lobster bib with a bowl of cioppino&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Beer Ambassador Miro enjoys a San Francisco Cioppino…&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Our last day in San Francisco started with a ferry ride across the bay and a trip to America’s oldest craft brewery - &lt;a href=&quot;http://www.anchorbrewing.com/&quot;&gt;Anchor Brewing&lt;/a&gt; in San Francisco, home of the famous Anchor Steam Beer. Before setting off we met up again with Jaime, and Darren and Lars from Trummer, for lunch and then hit the road to Santa Rosa…&lt;/p&gt;
&lt;p&gt;Or so we thought.&lt;/p&gt;
&lt;p&gt;Some technical difficulties with the tom-tom meant that we drove 45 minutes south towards LA before doubling back…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Santa Rosa&lt;/strong&gt;&lt;br /&gt;
Our next stop was &lt;a href=&quot;http://www.russianriverbrewing.com/&quot;&gt;Russian River Brewing Co&lt;/a&gt; in Santa Rosa, northern California. The boys were pretty excited about this one as it included one of their favourite beers, &lt;a href=&quot;http://www.russianriverbrewing.com/pages/brews/plinytheelder.htm&quot;&gt;Pliny the Elder&lt;/a&gt;. It was a good, fun pub but whatever you do watch out for the “Savage” wings!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chico&lt;/strong&gt;&lt;br /&gt;
Another day, another drive north. Today the destination was Chico where we’d arranged to meet Terrence Sullivan from the &lt;a href=&quot;http://www.sierranevada.com/index2.html&quot;&gt;Sierra Nevada Brewery&lt;/a&gt; - the largest, privately owned, craft brewery in the US. The Sierra Nevada setup was much bigger than anything we’d seen before and Terrence gave us a great tour through the facilities including tasting a number of beers fresh from the tanks.&lt;br /&gt;
Using a combination of solar panels, fuel cells and CO2 reclamation they actually generate 83% of their total power requirements on-site.&lt;/p&gt;
&lt;p&gt;Full beer-nerd details available at &lt;a href=&quot;http://beerambassadors.blogspot.com/2010/06/sierra-nevada.html&quot;&gt;BeerAmbassadors.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Beer Ambassadors video interview with Terrence, explaining the Sierra Nevada beer bike.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Eureka, Arcata and back to the coast&lt;/strong&gt;&lt;br /&gt;
The next leg of our journey was a driving paradise. An undulating, windy road over the mountains to get us back to highway 101, via &lt;a href=&quot;http://www.lostcoast.com/&quot;&gt;Lost Coast Brewing&lt;/a&gt; in Eureka. A few tasters and some oysters with buffalo sauce and we were back on the road to drop in on Terrence from Sierra Nevada’s brother Dutch in Arcata. Dutch and Andy showed us around their bar, &lt;a href=&quot;http://www.humboldtbrews.com/index.php&quot;&gt;Humboldt Brews&lt;/a&gt; (no longer a brew-pub, unfortunately) and we got back on the 101 and said so long, California. Thanks for the beers!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://picasaweb.google.com/lh/photo/Sa-r7CJxOiJFIyDwjleIyg?feat=embedwebsite&quot;&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/4593956378464589738/1.jpg&quot; alt=&quot;Four men raising glasses of beer together in a bar&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;From &lt;a href=&quot;http://picasaweb.google.com/laazyj/BeerambassadorsUsaJune2010?feat=embedwebsite&quot;&gt;beerambassadors-usa (June 2010)&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Rocky Mountain High</title>
    <link href="https://jasonduffett.net/misc/rocky-mountain-high/" />
    <updated>2010-06-14T00:00:00Z</updated>
    <id>https://jasonduffett.net/misc/rocky-mountain-high/</id>
    <rights>© 2010 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;&lt;a href=&quot;http://blog.ponchoslament.com/search/label/beerambassadors&quot;&gt;Beer Ambassadors&lt;/a&gt; at large USA was taken to a whole new level over the last couple of days in Colorado.&lt;br /&gt;
Things started well enough as we landed in the mile-high city of Denver. The sun was shining and all was well.&lt;br /&gt;
To really immerse ourselves in the mountain culture we decided we needed a mode of transport that would be familiar to the locals - the biggest pickup truck Denver airport had to offer…&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/4911063165632067993/0.jpg&quot; alt=&quot;Man standing beside a white pickup truck below the Rockies&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Once we’d found a hotel we paid a visit to the &lt;a href=&quot;http://www.greatdivide.com/&quot;&gt;Great Divide&lt;/a&gt; brewery. As usual great beers, much less hops than we were getting on the west coast.&lt;br /&gt;
Thanks to Colin for the tour.&lt;br /&gt;
We followed this up with dinner (a great buffalo prime rib) at the &lt;a href=&quot;http://buckhornexchange.com/&quot;&gt;Buckhorn Exchange&lt;/a&gt; (not Buttcorn) and a random taxi ride around the metro area to check out the “ghettos”.&lt;/p&gt;
&lt;p&gt;Details and videos are at &lt;a href=&quot;http://beerambassadors.blogspot.com/2010/06/denver.html&quot;&gt;BeerAmbassadors.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The following morning I took the truck out for a drive, and as much as I usually hate driving american cars, I can see why so many people drive these things. Although it was as big as a tank the visibility was great and the V8 had some real guts. It certainly ain’t green but it’s fun. Me and Barney were trying to find some great coffee shop but mixed up the GPS and ended up driving an hour or more around the greater metro area just to find another hotel. Still it was a nice, sunny day and a good drive…&lt;/p&gt;
&lt;p&gt;Our next stop was Boulder to visit &lt;a href=&quot;http://www.averybrewing.com/&quot;&gt;Avery Brewing&lt;/a&gt; where someone named “Truck” was going to teach us aussies how to drink and arm wrestle. We arrived pretty early (11am) so went in for a few quick tasters and arranged to meet up again later in the afternoon for the beer/arm-wrestling.&lt;br /&gt;
We headed downtown for lunch at the &lt;a href=&quot;http://www.mountainsunpub.com/&quot;&gt;Mountain Sun&lt;/a&gt; brew pub where I devoured a much-needed avocado and salad sandwich and a pint of their Resinous IPA.&lt;/p&gt;
&lt;p&gt;Things were still good. The sun was still shining and the mountains were still calling. So we jumped in the truck and headed up to see what the Rockies had to offer…&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/4911063165632067993/1.jpg&quot; alt=&quot;Mountain road winding through pine forest toward the Rockies&quot; /&gt;&lt;/p&gt;
&lt;p&gt;At first things went well. The scenery was beautiful (&lt;a href=&quot;http://picasaweb.google.com/laazyj/BeerambassadorsUsaJune2010#&quot;&gt;photos available&lt;/a&gt;), there was a random &lt;a href=&quot;http://www.jewforjebus.com/wp-content/uploads/2009/03/jebus.jpg&quot;&gt;Jebus&lt;/a&gt; and we were all enjoying ourselves. Then Barney started freakin’ out.&lt;/p&gt;
&lt;p&gt;Later on we discovered it was pretty common altitude sickness caused by a combination of the thin air and dehydration but at the time it just meant that we had to get down out of the mountains and call 911 as quick as we could. Kudos for Tom for not killing us on the way down, to Dodge for making an awesome truck and to myself for handling my first ever 911 call with aplomb and grace.&lt;br /&gt;
I also have to thank the Lyons Fire &amp;amp; Rescue dudes, the paramedics from Longmont and the bottle-shop owner from Lyons who didn’t object to us taking over her parking lot for the whole palaver.&lt;/p&gt;
&lt;p&gt;Once we’d got Barney tucked up in the gurney and on his way (with sirens blazing) the rest of us took the opportunity to look around where we were and discovered that we’d parked up at yet another brew-pub - the &lt;a href=&quot;http://www.oskarblues.com/restaurant/grill-brew&quot;&gt;Oscar Blues Grill &amp;amp; Brew&lt;/a&gt; in Lyons, but we thought that it might be viewed as callous to leave Barney to fend for himself through the american healthcare system and just grabbed a few takeaways for the road.&lt;br /&gt;
Once we got to the hospital and found Barney rigged up to a plethora of sensors and shit, but otherwise unharmed, we took the opportunity to visit &lt;a href=&quot;http://www.oskarblues.com/restaurant/liquids-solids&quot;&gt;Oscar Blues other venue in Longmont&lt;/a&gt; where we sampled their Dales Pale Ale among others. We also found some time to eat, drink some more and make an uncomplimentary video blog about Barney’s little episode. As usual these are all available at &lt;a href=&quot;http://beerambassadors.blogspot.com/2010/06/day-in-boulder.html&quot;&gt;BeerAmbassadors.com&lt;/a&gt;, with some photos at &lt;a href=&quot;http://picasaweb.google.com/laazyj/BeerambassadorsUsaJune2010&quot;&gt;http://picasaweb.google.com/laazyj/BeerambassadorsUsaJune2010&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The next morning we picked up Barney’s prescription Xanax (which is turning into a constant cause of frustration and hilarity) and headed to Fort Collins for an appointment with Doug Odell at &lt;a href=&quot;http://odellbrewing.com/home&quot;&gt;Odell Brewing Co&lt;/a&gt;.&lt;br /&gt;
Doug gave us one of the best tours we’ve had thus far. Showing us every small part of their operation including the huge solar array on the roof of the main building and sampling, from the casks, the oak-aged beers that were still being developed. Not to mention all the tasters and take-aways that he loaded us up with. The thing that stood out the most for me was the much more balanced style of beer that Odells were making compared to the extreme hoppiness of the west-coast breweries we had been visiting. As usual beer-nerd facts, including a video by Doug Odell, are available at &lt;a href=&quot;http://www.beerambassadors.blogspot.com/&quot;&gt;BeerAmbassadors.com&lt;/a&gt;.&lt;br /&gt;
For those interested in London, Doug will be showing his beers at the &lt;a href=&quot;http://www.whitehorsesw6.com/&quot;&gt;White Horse&lt;/a&gt; in Parsons Green on the weekend starting Thursday 1st July. I definitely recommend coming along and seeing what these guys are doing in Colorado, I’ll definitely be there.&lt;/p&gt;
&lt;p&gt;The next appointment was at &lt;a href=&quot;http://www.newbelgium.com/&quot;&gt;New Belgium&lt;/a&gt; where Beer Ambassadors had arranged to meet with Chris, an Irish ex-pat who was making it his mission to break the Australians.&lt;br /&gt;
He was to be bitterly, perhaps irreparably, broken in the process.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/4911063165632067993/2.jpg&quot; alt=&quot;Four men in costumes piled onto a tandem bike at New Belgium&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Beer Ambassadors at large appreciate Fat-Tyre.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;New Belgium was a much bigger brewery than any of the craft breweries we had visited thus far, making more than 600,000 &lt;a href=&quot;http://en.wikipedia.org/wiki/Barrel_(volume)&quot;&gt;american barrels&lt;/a&gt; annually, making them the third largest craft brewery in the USA (after Samuel Adams and Sierra Nevada). After doing the standard tour, Lauren and Chris showed us some of the interesting things they were doing with sour beers and we imbibed a few of their finer brews. Chris then took us downtown for a bit night out in Fort Collins.&lt;/p&gt;
&lt;p&gt;Things got very loose.&lt;/p&gt;
&lt;p&gt;Very.&lt;/p&gt;
&lt;p&gt;Although we still broke Irish Chris before he broke us!&lt;/p&gt;
&lt;p&gt;At some point, probably after Miro vomited in that bar, the beer ambassadors got split up only to slowly regroup at the best western through-out the wee hours of the morning. But when morning did finally come we were one short… Miro had disappeared.&lt;br /&gt;
Phone calls were made…hospitals, police, jail. No-one had found a random Australian and we were running short of time to catch our flight from Denver to San Francisco. There was nothing else to do but to leave his bag, our phone number and a note and hope he could fend for himself.&lt;/p&gt;
&lt;p&gt;Beer Ambassadors were now down to 3!&lt;/p&gt;
&lt;p&gt;Thankfully, later that morning, Miro was able to meet us in Denver in time for the flight. Minus $200 for the taxi. Missing his passport. Missing his camera (which we probably left in the truck). And missing whatever dignity the mexican dude who’s couch he woke up on had taken from him in the night. (I’m only kidding of course, the guy was super-helpful and drove Miro to his hotel, and probably wasn’t mexican either).&lt;/p&gt;
&lt;p&gt;So, very worse for wear, perhaps wiser, definitely much-aged by our experiences, the beer ambassadors were together again and on a plane to San Francisco.&lt;/p&gt;
&lt;p&gt;Colorado had been interesting, friendly, tasty and awesome fun. And we were glad to be rid of it…&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>San Diego</title>
    <link href="https://jasonduffett.net/misc/san-diego/" />
    <updated>2010-06-13T00:00:00Z</updated>
    <id>https://jasonduffett.net/misc/san-diego/</id>
    <rights>© 2010 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;The morning after &lt;a href=&quot;https://jasonduffett.net/misc/beer-garden-of-eden/&quot;&gt;Stone Brewery&lt;/a&gt; started off with a fender-bender in the car park. A &lt;a href=&quot;http://beerambassadors.blogspot.com/2010/06/car.html&quot;&gt;giant, black Challenger&lt;/a&gt; that was honking incessantly wasn’t conspicuous enough as someone very slowly backed into us. Still, it was a small hiccup in the schedule. We needed to get moving to make our 12 noon appointment at San Diego’s &lt;a href=&quot;http://ballastpointbrewingandspirits.com/Welcome.html&quot;&gt;Ballast Point Brewing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As always, all the beer nerd facts are available at &lt;a href=&quot;http://beerambassadors.blogspot.com/2010/06/west-coast-ipas.html&quot;&gt;BeerAmbassadors.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Earl and Matt at Ballast Point were great and spent a lot of time chatting with us and giving us a tour of their brewery and distillery.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/8275268147069768752/0.jpg&quot; alt=&quot;Chalkboard beer menu listing styles, ABV and prices at Ballast Point&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Here’s a copy of their menu.&lt;br /&gt;
At the time they’d completely run out of their award-winning &lt;a href=&quot;http://ballastpointbrewingandspirits.com/seasonal_beers.html&quot;&gt;Sculpin IPA&lt;/a&gt;, but Matt took us across San Diego to the home brew mart where the brewery originally started where they still had 1 last keg on tap.&lt;/p&gt;
&lt;p&gt;After Ballast Point we drove to &lt;a href=&quot;http://www.greenflashbrew.com/&quot;&gt;Green Flash&lt;/a&gt;, especially loved their IPA.&lt;/p&gt;
&lt;p&gt;All the beer details at &lt;a href=&quot;http://beerambassadors.blogspot.com/2010/06/west-coast-ipas.html&quot;&gt;http://beerambassadors.blogspot.com/2010/06/west-coast-ipas.html&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We rounded off our last day in southern California watching the Lakers game at &lt;a href=&quot;http://www.pizzaport.com/&quot;&gt;Pizza Port&lt;/a&gt; in Calsbad.&lt;/p&gt;
&lt;p&gt;The next morning we did a little celebrity-watching when we spotted &lt;a href=&quot;http://en.wikipedia.org/wiki/Mark_Philippoussis&quot;&gt;Mark “The Poo” Philippoussis&lt;/a&gt; enjoying a breakfast burrito at &lt;a href=&quot;http://www.pipescafe.com/Home.htm&quot;&gt;Pipes Cafe&lt;/a&gt; in Cardiff.&lt;/p&gt;
&lt;p&gt;So long California, next stop - Denver…&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Beer Ambassadors at large, Ballast Point Brewery.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/8275268147069768752/1.jpg&quot; alt=&quot;Group of men beside the mash-lauter tun at Ballast Point Brewery&quot; /&gt;&lt;/p&gt;
&lt;p&gt;More photos are available at &lt;a href=&quot;http://picasaweb.google.com/laazyj/BeerambassadorsUsaJune2010#&quot;&gt;http://picasaweb.google.com/laazyj/BeerambassadorsUsaJune2010#&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>The Beer Garden of Eden</title>
    <link href="https://jasonduffett.net/misc/beer-garden-of-eden/" />
    <updated>2010-06-08T00:00:00Z</updated>
    <id>https://jasonduffett.net/misc/beer-garden-of-eden/</id>
    <rights>© 2010 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;Our 2nd day of the &lt;a href=&quot;http://blog.ponchoslament.com/search/label/beerambassadors&quot;&gt;Beer Ambassadors at large tour of the states&lt;/a&gt; started innocently enough.&lt;/p&gt;
&lt;p&gt;While the rest of us got our bags packed, Barney walked down to the hire car place to get us some transportation to our next destination - Escondido.&lt;/p&gt;
&lt;p&gt;4 guys, all slightly hungover, with bags. We’ll need a nice, big comfortable family sedan right?&lt;/p&gt;
&lt;p&gt;But Barney had other ideas and decided that we needed a bit of style. He returned with a tribute to the american auto-industry’s form-over-function attitude - a Dodge Challenger.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/6186593108690961558/0.jpg&quot; alt=&quot;Black Dodge Challenger parked in a California car park&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Our destination was &lt;a href=&quot;http://www.stonebrew.com/home.asp&quot;&gt;Stone Brewery&lt;/a&gt; in Escondido, home of &lt;a href=&quot;http://www.stonebrew.com/arrogantbastard/&quot;&gt;The Arrogant Bastard Ale&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ken Wright, from Stone, gave us a tour of the facilities followed by tastings of all the different brews they had. A big thanks to Ken, it was very interesting - even for a non beer-nerd like myself. And the choice &amp;amp; quality of the beers was awesome, the Arrogant Bastard and the Stone Porter were both stand-outs.&lt;/p&gt;
&lt;p&gt;The building and grounds themselves were amazing - it flowed from the industrial area of the brewery, through the stone, wood and old metal decor of the shop, lobby and restaurant and out to what could only be described as the Beer Garden of Eden.&lt;/p&gt;
&lt;p&gt;After the tour we got ourselves a nice table in the southern californian sunshine, a beer &amp;amp; food menu, and enjoyed the afternoon, and into the evening…&lt;/p&gt;
&lt;p&gt;Thanks to our waitress Jamie for being so patient with a bunch of drunken aussies.&lt;/p&gt;
&lt;p&gt;Full set of photos are available at: &lt;a href=&quot;http://picasaweb.google.com/laazyj/BeerambassadorsUsaJune2010&quot;&gt;http://picasaweb.google.com/laazyj/BeerambassadorsUsaJune2010&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As usual beer details + videos are available at &lt;a href=&quot;http://beerambassadors.blogspot.com/2010/06/stone-brewery-co-escondido.html&quot;&gt;BeerAmbassadors.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/6186593108690961558/1.jpg&quot; alt=&quot;Three men posing together in the green Stone Brewery beer garden&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Mountain Goat Tom, Beer Ambassador Miro &amp;amp; myself&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Welcome to my hangover...</title>
    <link href="https://jasonduffett.net/misc/welcome-to-my-hangover/" />
    <updated>2010-06-07T00:00:00Z</updated>
    <id>https://jasonduffett.net/misc/welcome-to-my-hangover/</id>
    <rights>© 2010 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;Starting the first full day of &lt;a href=&quot;http://blog.ponchoslament.com/search/label/beerambassadors&quot;&gt;BeerAmbassadors USA&lt;/a&gt; and what better way than a hangover to help me remember our first night?&lt;/p&gt;
&lt;p&gt;The thing that stood out the most was how big LA is. It seems like we spent half the night in a cab. It probably doesn’t help that we’re staying in the Travelodge at the airport (again, thanks to the cat lady).&lt;/p&gt;
&lt;p&gt;The evening started sedately enough on the balcony of our room with a dozen Samual Adams from the &lt;a href=&quot;https://jasonduffett.net/assets/posts/1490058972884388038/0.png&quot;&gt;Circle K&lt;/a&gt; across the road. We then headed out to Santa Monica and had a great time at &lt;a href=&quot;http://www.libraryalehouse.com/&quot;&gt;The Library Alehouse&lt;/a&gt;. The guy’s there were great value and shared a few great beers with us. I’ve got to admit that the beer-nerd talk was way over my head most of the time but I’ve got a feeling there’s gonna be a lot of that during this trip.&lt;/p&gt;
&lt;p&gt;It was also great to see Barney ingratiate himself with the staff by picking a fault with my first beer. It tasted fine to me, does that say something about my under-developed beer palette?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/1490058972884388038/1.jpg&quot; alt=&quot;Two men drinking bottles of Samuel Adams on a hotel balcony&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If you are ever in Santa Monica, and you enjoy a great beer you could certainly do a lot worse than this place. Great atmosphere and friendly staff. Thanks again guys!&lt;/p&gt;
&lt;p&gt;For all the technical details check out &lt;a href=&quot;http://www.beerambassadors.com/&quot;&gt;Beerambassadors.com&lt;/a&gt;. I know Miro was taking tasting notes on the back of some coasters. There will also be some video if we can work out how to get it off the camera…&lt;/p&gt;
&lt;p&gt;Time for another cab ride, of course.&lt;/p&gt;
&lt;p&gt;Still in Santa Monica, this time we went to &lt;a href=&quot;http://www.fathersoffice.com/&quot;&gt;Father’s Office&lt;/a&gt;. Another good selection of beers but not quite the same atmosphere as the Library (sorry beerchick!).&lt;/p&gt;
&lt;p&gt;But…&lt;/p&gt;
&lt;p&gt;They do the best burger that I have had in my reasonably burger-experienced life. Seriously. &lt;a href=&quot;http://www.hotdougs.com/&quot;&gt;Hot Doug’s&lt;/a&gt; in Chicago for hot-dogs and Father’s Office in Santa Monica for burgers.&lt;/p&gt;
&lt;p&gt;After that things started to get a little hazy. For some reason we decided that a bourbon bar right across LA would be the next stop, but our cab driver couldn’t quite work it out. Everyone in the back of the cab passed out and we ended up somewhere in West Hollywood.&lt;/p&gt;
&lt;p&gt;We found possibly the only alcohol-free strip club in the world (passed right on by, of course) and another bar which was thankfully not. I think by this time the jet-lag, beers, and endless cab-rides had taken their toll and we called it a night, topping the evening off with another long cab-ride back to cat-lady mansions.&lt;/p&gt;
&lt;p&gt;Barney has strolled off somewhere to find a hire-car to get us to Escondido where we’re visiting &lt;a href=&quot;http://www.stonebrew.com/home.asp&quot;&gt;Stone Brewery&lt;/a&gt; this afternoon. I’m hoping I can find a decent coffee before then.&lt;/p&gt;
&lt;p&gt;Finally I’ll leave you with one great piece of americana, the giant donut…&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/1490058972884388038/2.jpg&quot; alt=&quot;Giant rooftop doughnut sign at Randy&#39;s Donuts in LA&quot; /&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Beer Ambassadors Trip to the United States</title>
    <link href="https://jasonduffett.net/misc/beer-ambassadors-trip-to-united-states/" />
    <updated>2010-06-05T00:00:00Z</updated>
    <id>https://jasonduffett.net/misc/beer-ambassadors-trip-to-united-states/</id>
    <rights>© 2010 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;&lt;strong&gt;30 Breweries In 30 Days&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On Sunday the 6th of June, three dedicated “men of beer” (and one IT Technician from London - &lt;em&gt;that’s me&lt;/em&gt;) set out to explore the new world beer frontier, the home of the beer avant garde, the United States of America.&lt;/p&gt;
&lt;p&gt;These men are the Beer Ambassadors. Beer Academics traveling on behalf of beer, in the pursuit of beer, for the sake of beer. The journey will be documented on &lt;a href=&quot;http://www.beerambassadors.com/&quot;&gt;www.beerambassadors.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;During the month of June, Barney Matthews &amp;amp; Miro Bellini of Beer DeLuxe, Tom Delmont of Mountain Goat Brewery and Jason Duffett (technical support) will attempt to visit 30 breweries and taste upwards of 300 beers in 30 days.&lt;/p&gt;
&lt;p&gt;Australia’s beer culture is experiencing somewhat of a renaissance.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New beers/breweries are bubbling forth&lt;/li&gt;
&lt;li&gt;Home brewing is at a height unseen since the depression&lt;/li&gt;
&lt;li&gt;The overall beer market is shrinking, while the craft beer segment is growing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Similar factors were apparent in the USA during the 90’s. The real beer revolution struck hard in the States and today they enjoy well over 1500 craft breweries.&lt;/p&gt;
&lt;p&gt;The Beer Ambassadors have organized tours of some of the most highly regarded breweries. Some eccentric, some historic, some giant, some tiny, all of them driven by epicurean values.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.beerambassadors.com/&quot;&gt;BeerAmbassadors.com&lt;/a&gt; will be a regularly updated source where you can enjoy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Photos of the breweries and products&lt;/li&gt;
&lt;li&gt;Interviews with the brewers&lt;/li&gt;
&lt;li&gt;An insight into the beer &amp;amp; food culture developing in the US&lt;/li&gt;
&lt;li&gt;Menus from specialty beer bars&lt;/li&gt;
&lt;li&gt;Gentlemanly discourse/anecdotes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;I’ve been graciously invited by the Beer Ambassadors as an honorary ambassador for the west coast part of the trip, or maybe it was just for technical support to keep the vast IT machine that will publicise and power this trip running. Either way, I’m not complaining.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Keep watching the ambassadors blog (&lt;a href=&quot;http://www.beerambassadors.com/&quot;&gt;http://www.beerambassadors.com/&lt;/a&gt;) and &lt;a href=&quot;http://twitter.com/beerambassadors&quot;&gt;follow us on twitter&lt;/a&gt; for news, photos and videos.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  
  <entry>
    <title>Le Vacherin, Chiswick. Restaurant Review - March 2009</title>
    <link href="https://jasonduffett.net/misc/le-vacherin-chiswick-restaurant-review/" />
    <updated>2009-03-08T00:00:00Z</updated>
    <id>https://jasonduffett.net/misc/le-vacherin-chiswick-restaurant-review/</id>
    <rights>© 2009 Jason Duffett, CC BY 4.0</rights>
    <content type="html">&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/2068742053355556723/0.jpg&quot; alt=&quot;Le Vacherin restaurant frontage with black awnings in Chiswick&quot; /&gt;&lt;br /&gt;
I was actually going to go to Kew to check out this Bistro that I’d seen when I was there getting guitar strings yesterday, but the weather turned and what I really needed was somewhere close by to eat.&lt;/p&gt;
&lt;p&gt;In the interests of full disclosure I have to admit that I used to go to Le Vacherin a lot, usually for big decadent dinners instead of sensible Sunday lunches, but I haven’t been in a few years.&lt;/p&gt;
&lt;p&gt;They are currently doing a “France for a tenner” deal; steak frites and a glass of wine for £9.95 (+ tip). It sounded much better than a tin of soup at home so I thought I’d brave the wind &amp;amp; rain and see how it stacked up.&lt;/p&gt;
&lt;p&gt;The place can seem a bit daunting for a lunch destination. It is really nice inside, and unless it’s hugely busy the room by the entrance is usually empty, all the white table-clothes, cutlery and wine-glasses laid out everywhere made me a feel a bit out-of-place in jeans and an old, drenched, army parker.&lt;/p&gt;
&lt;p&gt;The main dining room though, was reasonably full and had a great atmosphere. The standard cliche would be to say that it was a mixed crowd, but it wasn’t. A few families and larger groups but mostly the usual Chiswick clientele of older couples and friends.&lt;/p&gt;
&lt;p&gt;Complimentary bread &amp;amp; butter was served within a couple of minutes. The butter was this anchovy &amp;amp; green peppercorn stuff they make and it is great, but could’ve done with 20 minutes out of the fridge before serving.&lt;/p&gt;
&lt;p&gt;The rump steak was medium and had that great charcoal smell and flavour like it had just come off the bbq. Simply served with a thin gravy-ish sauce, it wasn’t a huge steak but was a good size for lunch. There was a choice of mustards to go with it.&lt;/p&gt;
&lt;p&gt;The fries could’ve been crispier but overall, a cracking good meal which was finished off nicely with the free glass of wine - a Duras Cabernet from south-west France (Is that Vin-de-pays? I don’t know).&lt;/p&gt;
&lt;p&gt;The real surprise was how quick the steak came! Honestly, I had ordered, eaten and could’ve got up &amp;amp; left within 30 minutes of stepping through the door. But a glass of wine and the fact it was still pouring with rain outside had left me in a more contemplative mood. In for a penny, in for a pound…&lt;/p&gt;
&lt;p&gt;Another glass of wine and the desert menu sil-vous-plait…&lt;/p&gt;
&lt;p&gt;I ordered a lemon tart for dessert which I can highly recommend.&lt;/p&gt;
&lt;p&gt;Not too sweet, not too tart…&lt;/p&gt;
&lt;p&gt;It really was a great desert, the filling wasn’t too eggy or heavy either.&lt;/p&gt;
&lt;p&gt;So to conclude. For about £11, including tip, its a damn good, quick, steak, fries and glass of wine. If you’re like me and can’t really stop once you get started then go for the lemon tart but kiss the budget option good bye.&lt;/p&gt;
&lt;p&gt;Total: £27 including water (when will I remember to order tap!), 2 glasses wine, dessert, coffee and tip.&lt;/p&gt;
&lt;p&gt;The £10 meal option is available for lunch on weekends and dinner during the week.&lt;/p&gt;
&lt;p&gt;Le Vacherin&lt;/p&gt;
&lt;p&gt;76-77 South Parade&lt;/p&gt;
&lt;p&gt;Chiswick W4 5LF&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.levacherin.co.uk/&quot;&gt;http://www.levacherin.co.uk/&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
</feed>
