<?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-03-28T00:00:00Z</updated>
  <id>https://jasonduffett.net/</id>
  <author>
    <name>Jason Duffett</name>
  </author>
  
  
  <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>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;&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;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://jasonduffett.net/assets/posts/29148252480/2.jpg&quot; alt=&quot;&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;&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;http://jasonduffett.net/tagged/Object%20Equality%20Guide&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;http://jasonduffett.net/tagged/Object%20Equality%20Guide&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;http://jasonduffett.net/tagged/Object%20Equality%20Guide&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>Using TeamCity to deploy software 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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&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>
