<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Rob Dodson</title>
	<link href="https://robdodson.me/feed.xml" rel="self"/>
	<link href="https://robdodson.me/"/>
	
	<updated>2011-09-20T14:33:00+00:00</updated>
	
	<id>https://robdodson.me</id>
	<author>
    <name>Rob Dodson</name>
	</author>
	
  
  <entry>
    <title>How I Built My Mobile Second Brain</title>
    <link href="https://robdodson.me/posts/how-i-built-my-mobile-second-brain/"/>
    <updated>2026-02-16T00:00:00+00:00</updated>
    <id>https://robdodson.me/posts/how-i-built-my-mobile-second-brain/</id>
    <content type="html"><![CDATA[
      <figure>
  <img src="/images/mobile-brain.jpg" alt="A paper collage hand holding a cell phone. On the cell phone screen is a paper collage brain.">
</figure>
<p>In my last post, <a href="https://robdodson.me/posts/i-gave-my-second-brain-a-gardener/">My Second Brain Never Worked. Then I Gave It a Gardener</a>, I mentioned that putting my Obsidian vault on a VPS with Claude Code permanently running on it, and being able to access it from my phone, was the real “ah ha” moment for me. A few people asked how I set that up, so here’s the full walkthrough.</p>
<p>The idea is simple: rent a cheap DigitalOcean droplet, sync your vault using <code>obsidian-headless</code> (a lightweight CLI — no Electron needed), install Claude Code so it can read and write your notes, and use <a href="https://happy.engineering/">Happy</a> to control the whole thing from your phone. Total cost is about $24/month.</p>
<p><strong>Update (March 2026):</strong> This post originally required running the full Obsidian Electron app headlessly via Xvfb — a real pain to set up. Obsidian has since released <a href="https://www.npmjs.com/package/obsidian-headless"><code>obsidian-headless</code></a>, an official lightweight CLI that handles <a href="https://obsidian.md/sync">Obsidian Sync</a> without the desktop app. It uses ~35MB of RAM instead of ~400MB+, and eliminates the need for Xvfb, VNC, a window manager, and all the Electron library dependencies. I’ve updated this guide accordingly — Phase 2 is now much simpler.</p>
<p>With all that out of the way, here is essentially the plan I followed with Claude Code.
Before starting, I’d recommend firing up your own Claude Code instance and pointing it at this post so it can help you out if you hit any snags!</p>
<hr>
<h2>Phase 0: Create the Droplet</h2>
<h3>Step 1: Sign Up / Log In to DigitalOcean</h3>
<p>Go to <a href="https://cloud.digitalocean.com">https://cloud.digitalocean.com</a> — create an account if you don’t have one.</p>
<h3>Step 2: Create a Droplet</h3>
<ol>
<li>Click <strong>Create → Droplets</strong></li>
<li><strong>Region:</strong> Choose the closest to you (reduces latency for Happy sessions)</li>
<li><strong>Image:</strong> Ubuntu 24.04 (LTS) x64</li>
<li><strong>Size:</strong> Regular (shared CPU) → <strong>$24/mo (4GB RAM, 2 vCPUs, 80GB SSD)</strong>
<ul>
<li>The 2GB tier might work now that we use <code>obsidian-headless</code> (~35MB) instead of Electron (~400MB+), but 4GB gives comfortable headroom for Claude Code sessions</li>
</ul>
</li>
<li><strong>Authentication:</strong> Choose <strong>SSH Keys</strong> (recommended)
<ul>
<li>If you don’t have one: on your Mac, run <code>cat ~/.ssh/id_ed25519.pub</code> (or <code>id_rsa.pub</code>)</li>
<li>Copy the output and paste it into DigitalOcean’s “New SSH Key” dialog</li>
<li>If you have no SSH key at all: <code>ssh-keygen -t ed25519</code> on your Mac first</li>
</ul>
</li>
<li><strong>Hostname:</strong> <code>vault-server</code> (or whatever you want)</li>
<li><strong>Click Create Droplet</strong></li>
</ol>
<p>It’ll be ready in about 60 seconds. Copy the IP address it shows you.</p>
<h3>Step 3: First Login</h3>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment"># From your Mac:</span></span><br><span class="highlight-line"><span class="token function">ssh</span> root@YOUR_DROPLET_IP</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Example:</span></span><br><span class="highlight-line"><span class="token function">ssh</span> root@143.198.123.45</span></code></pre>
<p>Accept the fingerprint. You’re in!</p>
<h3>Step 4: Create a Non-Root User</h3>
<p>Don’t run everything as root. Create your own user:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment"># Create user (replace 'YOUR_USER' with your name)</span></span><br><span class="highlight-line">adduser YOUR_USER</span><br><span class="highlight-line"><span class="token comment"># Set a password when prompted, skip the rest with Enter</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Give sudo access</span></span><br><span class="highlight-line"><span class="token function">usermod</span> -aG <span class="token function">sudo</span> YOUR_USER</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Copy your SSH key to the new user</span></span><br><span class="highlight-line"><span class="token function">mkdir</span> -p /home/YOUR_USER/.ssh</span><br><span class="highlight-line"><span class="token function">cp</span> /root/.ssh/authorized_keys /home/YOUR_USER/.ssh/</span><br><span class="highlight-line"><span class="token function">chown</span> -R YOUR_USER:YOUR_USER /home/YOUR_USER/.ssh</span><br><span class="highlight-line"><span class="token function">chmod</span> 700 /home/YOUR_USER/.ssh</span><br><span class="highlight-line"><span class="token function">chmod</span> 600 /home/YOUR_USER/.ssh/authorized_keys</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Log out and log back in as your user</span></span><br><span class="highlight-line"><span class="token keyword">exit</span></span></code></pre>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token function">ssh</span> YOUR_USER@YOUR_DROPLET_IP</span></code></pre>
<p>From here on, everything is done as your non-root user.</p>
<hr>
<h2>Phase 1: System Setup</h2>
<h3>Step 5: Update Everything</h3>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token function">sudo</span> <span class="token function">apt</span> update <span class="token operator">&amp;&amp;</span> <span class="token function">sudo</span> <span class="token function">apt</span> upgrade -y</span></code></pre>
<blockquote>
<p><strong>Note:</strong> If prompted about a modified <code>sshd_config</code>, choose <strong>“keep the local version currently installed”</strong> — DigitalOcean customizes this file and you don’t want to overwrite it. After the upgrade finishes, you may see “System restart required” on your next login. If so, run <code>sudo reboot</code> and SSH back in after ~30 seconds.</p>
</blockquote>
<h3>Step 6: Install Core Dependencies</h3>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment"># Misc tools</span></span><br><span class="highlight-line"><span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> -y <span class="token function">git</span> <span class="token function">curl</span> tmux <span class="token function">htop</span> <span class="token function">wget</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Fix for Ghostty terminal users — tmux won't work without this</span></span><br><span class="highlight-line"><span class="token keyword">echo</span> <span class="token string">'export TERM=xterm-256color'</span> <span class="token operator">>></span> ~/.bashrc</span><br><span class="highlight-line"><span class="token function">source</span> ~/.bashrc</span></code></pre>
<h3>Step 7: Install Node.js via nvm</h3>
<p>Claude Code and Happy CLI both need Node.js. Use nvm so you control the version.</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment"># Install nvm</span></span><br><span class="highlight-line"><span class="token function">curl</span> -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh <span class="token operator">|</span> <span class="token function">bash</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Load nvm into current session</span></span><br><span class="highlight-line"><span class="token function">export</span> NVM_DIR<span class="token operator">=</span><span class="token string">"<span class="token variable">$HOME</span>/.nvm"</span></span><br><span class="highlight-line"><span class="token punctuation">[</span> -s <span class="token string">"<span class="token variable">$NVM_DIR</span>/nvm.sh"</span> <span class="token punctuation">]</span> <span class="token operator">&amp;&amp;</span> \. <span class="token string">"<span class="token variable">$NVM_DIR</span>/nvm.sh"</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Install Node.js 22 (LTS)</span></span><br><span class="highlight-line">nvm <span class="token function">install</span> 22</span><br><span class="highlight-line">nvm use 22</span><br><span class="highlight-line">nvm <span class="token function">alias</span> default 22</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Verify</span></span><br><span class="highlight-line">node --version  <span class="token comment"># should show v22.x.x</span></span><br><span class="highlight-line"><span class="token function">npm</span> --version</span></code></pre>
<hr>
<h2>Phase 2: Install Obsidian Headless Sync</h2>
<p>Obsidian offers an official lightweight CLI (<code>obsidian-headless</code>) that syncs vaults without the desktop Electron app. It uses ~35MB of RAM instead of ~400MB+, and you don’t need Xvfb, a window manager, VNC, or any Electron library dependencies.</p>
<h3>Step 8: Install obsidian-headless</h3>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token function">sudo</span> <span class="token function">npm</span> <span class="token function">install</span> -g obsidian-headless</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Verify</span></span><br><span class="highlight-line">ob --version</span></code></pre>
<h3>Step 9: Authenticate and Set Up Sync</h3>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment"># Log in to your Obsidian account</span></span><br><span class="highlight-line">ob login</span><br><span class="highlight-line"><span class="token comment"># Enter your email, password, and MFA code when prompted</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># List your remote vaults</span></span><br><span class="highlight-line">ob sync-list-remote</span><br><span class="highlight-line"><span class="token comment"># Note the vault name you want to sync</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Create the local vault directory</span></span><br><span class="highlight-line"><span class="token function">mkdir</span> -p ~/obsidian-vault</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Link the local directory to your remote vault</span></span><br><span class="highlight-line">ob sync-setup --vault <span class="token string">"YOUR_VAULT_NAME"</span> --path ~/obsidian-vault --device-name <span class="token string">"vps-headless"</span></span><br><span class="highlight-line"><span class="token comment"># Enter your end-to-end encryption password when prompted</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Do an initial sync to pull down all files</span></span><br><span class="highlight-line">ob <span class="token function">sync</span> --path ~/obsidian-vault</span><br><span class="highlight-line"><span class="token comment"># Wait for it to finish</span></span></code></pre>
<h3>Step 10: Create the Obsidian systemd Service</h3>
<p>This makes headless sync start automatically on boot.</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token function">mkdir</span> -p ~/.config/systemd/user</span><br><span class="highlight-line"></span><br><span class="token function">cat</span> <span class="token operator">></span> ~/.config/systemd/user/obsidian-headless.service <span class="token operator">&lt;&lt;</span> <span class="token string">EOF<br><span class="highlight-line">[Unit]</span><br><span class="highlight-line">Description=Obsidian Headless Sync</span><br><span class="highlight-line">After=network-online.target</span><br><span class="highlight-line">Wants=network-online.target</span><br><span class="highlight-line"></span><br><span class="highlight-line">[Service]</span><br><span class="highlight-line">Type=simple</span><br><span class="highlight-line">WorkingDirectory=%h/obsidian-vault</span><br><span class="highlight-line">ExecStart=/usr/bin/ob sync --continuous --path %h/obsidian-vault</span><br><span class="highlight-line">Restart=on-failure</span><br><span class="highlight-line">RestartSec=10</span><br><span class="highlight-line">Environment=HOME=%h</span><br><span class="highlight-line"></span><br><span class="highlight-line">[Install]</span><br><span class="highlight-line">WantedBy=default.target</span><br>EOF</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Enable lingering (so user services run without being logged in)</span></span><br><span class="highlight-line"><span class="token function">sudo</span> loginctl enable-linger <span class="token variable">$USER</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Enable and start the service</span></span><br><span class="highlight-line">systemctl --user daemon-reload</span><br><span class="highlight-line">systemctl --user <span class="token function">enable</span> obsidian-headless.service</span><br><span class="highlight-line">systemctl --user start obsidian-headless.service</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Check it's running</span></span><br><span class="highlight-line">systemctl --user status obsidian-headless.service</span></code></pre>
<p><strong>Verify sync is working:</strong></p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment"># Check the service — should show a single node process (~35MB)</span></span><br><span class="highlight-line">systemctl --user status obsidian-headless.service</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Check memory usage</span></span><br><span class="highlight-line"><span class="token function">free</span> -h</span><br><span class="highlight-line"><span class="token comment"># Without the Electron app, expect much lower memory usage</span></span></code></pre>
<hr>
<h2>Phase 3: Install Claude Code</h2>
<h3>Step 11: Install Claude Code</h3>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment"># Native installer</span></span><br><span class="highlight-line"><span class="token function">curl</span> -fsSL https://claude.ai/install.sh <span class="token operator">|</span> <span class="token function">bash</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Verify</span></span><br><span class="highlight-line">claude --version</span></code></pre>
<h3>Step 12: Authenticate Claude Code</h3>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">claude</span><br><span class="highlight-line"><span class="token comment"># This will give you a URL to paste into a browser on your Mac/phone</span></span><br><span class="highlight-line"><span class="token comment"># Open the URL, enter the code shown, and follow the prompts</span></span><br><span class="highlight-line"><span class="token comment"># to connect your Claude account.</span></span></code></pre>
<p>After auth, test that it works:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token function">cd</span> ~/obsidian-vault</span><br><span class="highlight-line">claude <span class="token string">"list the files in this directory"</span></span><br><span class="highlight-line"><span class="token comment"># Should see your vault files</span></span></code></pre>
<p>Exit with <code>/exit</code> or Ctrl+C.</p>
<hr>
<h2>Phase 4: Install Happy CLI</h2>
<h3>Step 13: Install Happy</h3>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token function">npm</span> <span class="token function">install</span> -g happy-coder</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Verify</span></span><br><span class="highlight-line">happy --version</span></code></pre>
<h3>Step 14: Connect Your Phone</h3>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">happy --auth</span><br><span class="highlight-line"><span class="token comment"># This displays a QR code in your terminal</span></span></code></pre>
<ol>
<li><strong>Download the Happy app</strong> on your phone (iOS App Store / Google Play)</li>
<li><strong>Scan the QR code</strong> with the Happy app</li>
<li>You’re paired. The connection is end-to-end encrypted.</li>
</ol>
<h3>Step 15: Test Happy</h3>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token function">cd</span> ~/obsidian-vault</span><br><span class="highlight-line">happy</span><br><span class="highlight-line"><span class="token comment"># This starts Claude Code wrapped in Happy's relay</span></span></code></pre>
<p>Now open the Happy app on your phone — you should see the Claude Code session. Type a message from your phone and watch it appear. Type in the terminal and watch it appear on your phone.</p>
<p><strong>This is the magic moment.</strong> You can now control Claude Code from your phone, working on your Obsidian vault files, from anywhere!</p>
<hr>
<h2>Phase 5: Make It Persistent</h2>
<p>You want <code>happy</code> (wrapping Claude Code) to be running whenever you want to connect from your phone. Happy needs a real terminal (TTY) to work, so running it as a plain systemd service fails. The solution: systemd launches a tmux session with Happy inside it — auto-starts on boot, survives SSH disconnects, and gives Happy the terminal it needs.</p>
<h3>Step 16: Create the Happy systemd Service</h3>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment"># First, find your happy path (we need the full path for systemd)</span></span><br><span class="highlight-line"><span class="token function">which</span> happy</span><br><span class="highlight-line"><span class="token comment"># Example output: /home/YOUR_USER/.nvm/versions/node/v22.x.x/bin/happy</span></span><br><span class="highlight-line"><span class="token comment"># Use YOUR path in the ExecStart line below</span></span><br><span class="highlight-line"></span><br><span class="token function">cat</span> <span class="token operator">></span> ~/.config/systemd/user/happy-claude.service <span class="token operator">&lt;&lt;</span> <span class="token string">'EOF'<br><span class="highlight-line">[Unit]</span><br><span class="highlight-line">Description=Happy CLI (Claude Code mobile access)</span><br><span class="highlight-line">After=network-online.target obsidian-headless.service</span><br><span class="highlight-line">Wants=network-online.target</span><br><span class="highlight-line"></span><br><span class="highlight-line">[Service]</span><br><span class="highlight-line">Type=oneshot</span><br><span class="highlight-line">RemainAfterExit=yes</span><br><span class="highlight-line">WorkingDirectory=%h/obsidian-vault</span><br><span class="highlight-line">ExecStart=/usr/bin/tmux new-session -d -s claude %h/.nvm/versions/node/v22.14.0/bin/happy</span><br><span class="highlight-line">ExecStop=/usr/bin/tmux kill-session -t claude</span><br><span class="highlight-line">Environment=HOME=%h</span><br><span class="highlight-line">Environment=PATH=%h/.nvm/versions/node/v22.14.0/bin:%h/.local/bin:/usr/local/bin:/usr/bin:/bin</span><br><span class="highlight-line"></span><br><span class="highlight-line">[Install]</span><br><span class="highlight-line">WantedBy=default.target</span><br>EOF</span><br><span class="highlight-line"></span><br><span class="highlight-line">systemctl --user daemon-reload</span><br><span class="highlight-line">systemctl --user <span class="token function">enable</span> happy-claude.service</span><br><span class="highlight-line">systemctl --user start happy-claude.service</span></code></pre>
<blockquote>
<p><strong>Note:</strong> Adjust the node version path (<code>v22.14.0</code>) to match your actual install. Check with <code>which happy</code>.</p>
</blockquote>
<h3>Verify It’s Running</h3>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment"># Check the service status (should show "active (exited)" — that's correct for oneshot)</span></span><br><span class="highlight-line">systemctl --user status happy-claude.service</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Confirm the tmux session exists</span></span><br><span class="highlight-line">tmux list-sessions</span><br><span class="highlight-line"><span class="token comment"># Should show: claude: ...</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># If you want to peek inside (optional):</span></span><br><span class="highlight-line">tmux attach -t claude</span><br><span class="highlight-line"><span class="token comment"># Detach with: Ctrl+B, release, then D</span></span><br><span class="highlight-line"><span class="token comment"># DO NOT use Ctrl+C — that kills the Happy process</span></span></code></pre>
<h3>If Happy Dies or You Need to Restart</h3>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">systemctl --user restart happy-claude.service</span></code></pre>
<hr>
<h2>Phase 6: Verify Everything Works</h2>
<h3>Checklist</h3>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment"># 1. Obsidian headless sync is running</span></span><br><span class="highlight-line">systemctl --user status obsidian-headless.service</span><br><span class="highlight-line"><span class="token comment"># Should show "active (running)" with a single node process</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># 2. Sync is connected</span></span><br><span class="highlight-line">ob sync-status --path ~/obsidian-vault</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># 3. Vault files are present and syncing</span></span><br><span class="highlight-line"><span class="token function">ls</span> ~/obsidian-vault/</span><br><span class="highlight-line"><span class="token comment"># Should show your vault's files/folders</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># 4. Claude Code can access the vault</span></span><br><span class="highlight-line"><span class="token function">cd</span> ~/obsidian-vault <span class="token operator">&amp;&amp;</span> claude <span class="token string">"what markdown files are in this vault?"</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># 5. Happy is running in tmux via systemd</span></span><br><span class="highlight-line">systemctl --user status happy-claude.service</span><br><span class="highlight-line"><span class="token comment"># Should show "active (exited)"</span></span><br><span class="highlight-line">tmux list-sessions</span><br><span class="highlight-line"><span class="token comment"># Should show "claude" session</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># 6. Happy works from phone</span></span><br><span class="highlight-line"><span class="token comment"># Open Happy app on phone, verify connection</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># 7. Memory looks healthy</span></span><br><span class="highlight-line"><span class="token function">free</span> -h</span><br><span class="highlight-line"><span class="token comment"># Should show well under 2GB used — headless sync uses ~35MB vs ~400MB+ for Electron</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># 8. After a reboot, everything restarts automatically</span></span><br><span class="highlight-line"><span class="token function">sudo</span> <span class="token function">reboot</span></span><br><span class="highlight-line"><span class="token comment"># Wait 30 seconds, SSH back in</span></span><br><span class="highlight-line">systemctl --user status obsidian-headless.service</span><br><span class="highlight-line"><span class="token comment"># Should show "active (running)"</span></span><br><span class="highlight-line">systemctl --user status happy-claude.service</span><br><span class="highlight-line"><span class="token comment"># Should show "active (exited)"</span></span><br><span class="highlight-line">tmux list-sessions</span><br><span class="highlight-line"><span class="token comment"># Should show "claude" session</span></span></code></pre>
<hr>
<h2>Maintenance &amp; Troubleshooting</h2>
<h3>Updating Components</h3>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment"># Ubuntu</span></span><br><span class="highlight-line"><span class="token function">sudo</span> <span class="token function">apt</span> update <span class="token operator">&amp;&amp;</span> <span class="token function">sudo</span> <span class="token function">apt</span> upgrade -y</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># obsidian-headless</span></span><br><span class="highlight-line"><span class="token function">sudo</span> <span class="token function">npm</span> update -g obsidian-headless</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Claude Code (auto-updates, but to force)</span></span><br><span class="highlight-line">claude update</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Happy CLI</span></span><br><span class="highlight-line"><span class="token function">npm</span> update -g happy-coder</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Node.js</span></span><br><span class="highlight-line">nvm <span class="token function">install</span> 22  <span class="token comment"># installs latest 22.x</span></span></code></pre>
<h3>Common Issues</h3>
<p><strong>Obsidian Sync stops working:</strong></p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment"># Restart the headless sync service</span></span><br><span class="highlight-line">systemctl --user restart obsidian-headless.service</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Check sync status</span></span><br><span class="highlight-line">ob sync-status --path ~/obsidian-vault</span></code></pre>
<p><strong>Can’t connect to Happy from phone:</strong></p>
<ul>
<li>Check that the service is running: <code>systemctl --user status happy-claude.service</code></li>
<li>Check that the tmux session exists: <code>tmux list-sessions</code></li>
<li>If the session died, restart: <code>systemctl --user restart happy-claude.service</code></li>
<li>The Happy relay (app.happy.engineering) needs to be reachable from both the droplet and your phone</li>
<li>Unlike a home Pi, the droplet’s internet is rock solid — so this is almost always a process issue</li>
</ul>
<p><strong>Obsidian Sync conflict:</strong>
If you edit the same file on your phone/desktop AND Claude Code edits it on the droplet simultaneously, Obsidian Sync will create a conflict file. Rare in practice.</p>
<p><strong>“Killed” or process disappears:</strong>
This is the OOM killer. Your droplet is running out of RAM. Check with <code>dmesg | tail</code> — if you see “Out of memory”, you need to either add swap or upgrade to a bigger droplet:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment"># Add 2GB swap (quick fix)</span></span><br><span class="highlight-line"><span class="token function">sudo</span> fallocate -l 2G /swapfile</span><br><span class="highlight-line"><span class="token function">sudo</span> <span class="token function">chmod</span> 600 /swapfile</span><br><span class="highlight-line"><span class="token function">sudo</span> <span class="token function">mkswap</span> /swapfile</span><br><span class="highlight-line"><span class="token function">sudo</span> <span class="token function">swapon</span> /swapfile</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Make it permanent</span></span><br><span class="highlight-line"><span class="token keyword">echo</span> <span class="token string">'/swapfile none swap sw 0 0'</span> <span class="token operator">|</span> <span class="token function">sudo</span> <span class="token function">tee</span> -a /etc/fstab</span></code></pre>
<h3>Monitoring</h3>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment"># Quick health check</span></span><br><span class="highlight-line"><span class="token keyword">echo</span> <span class="token string">"=== Memory ==="</span> <span class="token operator">&amp;&amp;</span> <span class="token function">free</span> -h <span class="token operator">&amp;&amp;</span> <span class="token keyword">echo</span> <span class="token string">"=== Obsidian ==="</span> <span class="token operator">&amp;&amp;</span> systemctl --user status obsidian-headless.service --no-pager -l <span class="token operator">|</span> <span class="token function">head</span> -5 <span class="token operator">&amp;&amp;</span> <span class="token keyword">echo</span> <span class="token string">"=== Vault files ==="</span> <span class="token operator">&amp;&amp;</span> <span class="token function">ls</span> ~/obsidian-vault/ <span class="token operator">|</span> <span class="token function">head</span> -10</span></code></pre>
<h3>Backups</h3>
<p>Your vault is synced to:</p>
<ol>
<li>Obsidian Sync (cloud) — with 12 months version history on Plus</li>
<li>Your phone (Obsidian mobile)</li>
<li>Your desktop (Obsidian desktop)</li>
<li>The droplet (this setup)</li>
</ol>
<p>That’s 4 copies. For extra paranoia:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment"># Weekly local backup</span></span><br><span class="highlight-line"><span class="token function">crontab</span> -e</span><br><span class="highlight-line"><span class="token comment"># Add this line:</span></span><br><span class="highlight-line">0 3 * * 0 <span class="token function">tar</span> -czf ~/vault-backups/vault-<span class="token variable"><span class="token variable">$(</span><span class="token function">date</span> +\%Y\%m\%d<span class="token variable">)</span></span>.tar.gz ~/obsidian-vault/</span></code></pre>
<hr>
<h2>Quick Reference</h2>
<table>
<thead>
<tr>
<th>What</th>
<th>Command</th>
</tr>
</thead>
<tbody>
<tr>
<td>SSH into droplet</td>
<td><code>ssh YOUR_USER@YOUR_DROPLET_IP</code></td>
</tr>
<tr>
<td>Check Obsidian sync</td>
<td><code>systemctl --user status obsidian-headless.service</code></td>
</tr>
<tr>
<td>Restart Obsidian sync</td>
<td><code>systemctl --user restart obsidian-headless.service</code></td>
</tr>
<tr>
<td>Check sync status</td>
<td><code>ob sync-status --path ~/obsidian-vault</code></td>
</tr>
<tr>
<td>Check Happy</td>
<td><code>systemctl --user status happy-claude.service</code></td>
</tr>
<tr>
<td>Restart Happy</td>
<td><code>systemctl --user restart happy-claude.service</code></td>
</tr>
<tr>
<td>Peek at Happy session</td>
<td><code>tmux attach -t claude</code> (detach: Ctrl+B then D)</td>
</tr>
<tr>
<td>Check memory</td>
<td><code>free -h</code></td>
</tr>
<tr>
<td>Check running processes</td>
<td><code>htop</code></td>
</tr>
<tr>
<td>Update everything</td>
<td><code>sudo apt update &amp;&amp; sudo apt upgrade -y &amp;&amp; claude update &amp;&amp; sudo npm update -g obsidian-headless &amp;&amp; npm update -g happy-coder</code></td>
</tr>
</tbody>
</table>
<hr>
<h2>When to Upgrade to a Raspberry Pi</h2>
<p>I was initially debating between setting this up on DigitalOcean or buying a Raspberry Pi to run everything. I figured spending $24/mo to test if I liked this setup would be a good way to validate things before sinking money into a Pi.</p>
<p>If you find yourself using this daily and the $24/mo feels wasteful, that’s a
good signal to switch. A Pi 5 8GB (~$180) pays for itself in ~8 months vs the
droplet. The setup process is nearly identical — same systemd services, same
tools, just on local hardware. You can reuse this guide almost verbatim.</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>My Second Brain Never Worked. Then I Gave It a Gardener.</title>
    <link href="https://robdodson.me/posts/i-gave-my-second-brain-a-gardener/"/>
    <updated>2026-02-08T00:00:00+00:00</updated>
    <id>https://robdodson.me/posts/i-gave-my-second-brain-a-gardener/</id>
    <content type="html"><![CDATA[
      <figure>
  <img src="/images/brain-garden.jpg" alt="A brain made of stacked collaged paper. Colorful paper plants sprout from the folds in the brain.">
</figure>
<p>I always wanted a second brain.</p>
<p>The thought of it <em>seems</em> so alluring: organize all of your thoughts, make connections, discover new ideas, build your personal knowledge graph! But I could never seem to get the promise of the second brain to materialize because of the maintenance work.</p>
<p>If you follow productivity gurus on YouTube they all recommend the same strategy:</p>
<p><strong>Step 1</strong> - Dump all of your unstructured thoughts and todos into a folder called “Inbox” or “Daily Note”.</p>
<p><em>Great! I can do this!</em></p>
<p><strong>Step 2</strong> - Now organize it all. Put things into a well thought out folder structure. Add tags and backlinks. Decide which docs stay and which get tossed. Become a one-person Wikipedia.</p>
<p><em>yeah. no. I am not going to do that.</em></p>
<p>Then it occurred to me that Claude Code is really good at reading markdown. As I’ve been creating AGENTS.md and Skills and rules, etc. etc. it often felt like I was trying to build <em>it</em> a second brain. So, why not flip the script and have it build <em>my</em> second brain?</p>
<h2>My Gardener: Claude 🌱</h2>
<p>For me, the key insight — one I first encountered in <a href="https://komoroske.com/bits-and-bobs">Alex Komoroske’s Bits and Bobs</a> — is that I want Claude to do cognitive <em>labor</em>, not <em>thinking</em>. I don’t want it to generate ideas. I want it to take my rough, unstructured thoughts and give them shape — add tags, create links, break a rambling paragraph into an organized note.</p>
<p>This matters because the value of a second brain was never supposed to be in the filing! It was in the connections. The problem was that you had to do a bunch of boring filing work before you could get to the interesting part. Claude eliminates that bottleneck.</p>
<p>The first thing I asked Claude to do was to read my entire vault and look up some common Obsidian organization strategies, and try to organize the vault for me. It came back with a number of questions, starting from pretty broad and slowly working down to specifics as we hashed out how I wanted to work.</p>
<p>Next I asked it to write a CLAUDE.md to codify the system we had built. Then I asked it to write a simple Skill called <code>/process-daily</code> that looks at my <a href="https://help.obsidian.md/plugins/daily-notes">Daily Note</a> and turns it into nicely structured idea docs.</p>
<h2>My Daily Workflow</h2>
<p>Here’s what a day in the life of using this system looks like:</p>
<p><strong>Stage 1: Capture and organize.</strong> I create a new daily note each day and braindump into it. I do this a lot when I’m walking around so I started using <a href="https://superwhisper.com/">Superwhisper</a> to make dictation easier. At the end of the day, I run <code>/process-daily</code> and a messy daily note becomes nice, connected documents.</p>
<p><strong>Stage 2: Explore connections.</strong> Now that my ideas are organized and cross-linked, I can have a conversation with Claude about what’s in the vault. Often this takes the form of me telling it to read an idea doc for context, and then we go back and forth expanding and exploring different points and looking for connections.</p>
<p><strong>Stage 3: Write and edit.</strong> A big goal of all this is for me to get back into publishing. When I’m ready to write, Claude becomes an editor. I tend to edit as I write, so I’ll send sections to Claude for feedback, and iterate. “This paragraph is clunky — how would you tighten it?” or “I don’t feel like I have an ending, help me come up with some options.”</p>
<p>I also added a <code>/weekly-summary</code> Skill that will look at the last week of daily notes, and turn them into a digest newsletter-style doc. Here I let Claude do some thinking and writing of its own. It frequently surfaces things that I had forgotten which makes these newsletters surprisingly useful.</p>
<h2>Mobile is a must</h2>
<p>The thing that really changed everything, honestly, was putting my entire Obsidian vault on a VPS with Claude Code permanently running on it using <a href="https://happy.engineering/">Happy</a> so I can talk to it from my phone.</p>
<p>When I first wake up and take my dog for a walk, it’s a wonderful time to think. But I’d found over the years that I had started smothering my brain with podcasts during this time. As an experiment, I thought “I’ll just walk in silence today and if anything occurs to me I’ll chat with Claude on my phone and we’ll work on ideas in the vault.”</p>
<p>The very first time I did this, I remember being so engrossed that I was still talking to it when I got home, and even stopped brushing my teeth at one point so I could tell it another idea.</p>
<p>This has now become one of my favorite parts of the day.</p>
<h2>Why Obsidian is the right canvas</h2>
<p>This workflow isn’t Obsidian-specific in theory, but in practice Obsidian has three properties that make it work exceptionally well:</p>
<p><strong>Markdown is Claude’s lingua franca.</strong> Claude reads and writes markdown natively. I don’t even bother with MCPs, I just run Claude in the root of the Obsidian Vault and it immediately understands the structure — frontmatter, headings, wiki-links, tags, all of it.</p>
<p><strong>It’s local and file-based.</strong> Your data stays on your machine (or syncs however you choose). There’s no dependency on a third-party API or cloud service. This also means Claude can read, write, and reorganize files directly — no intermediary layer.</p>
<p><strong>The whole vault is actionable.</strong> At some point I realized what I really wanted was something with access to <a href="https://robdodson.me/posts/your-ai-chatbot-is-a-gatekeeper/"><em>all</em> of my context</a>. That’s what this gives me. Claude doesn’t just work with your “notes” — it works with everything in the vault. Recipes, meeting notes, project specs, reading lists. Any structured markdown becomes a surface Claude can operate on.</p>
<h2>The flywheel</h2>
<p>Publishing again after years of not writing has created a positive loop: writing makes me want to capture more, capturing more creates connections, connections give me things to write about. A few small rituals — going for a walk, running my slash commands, watching ideas get organized — compound into something that feels genuinely new.</p>
<p>Steve Jobs called the computer “a bicycle for the mind.” I keep coming back to that when I think about this system I’ve cobbled together.</p>
<p>I’m doing the pedaling — Claude just amplifies it and propels me forward.</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Your AI Chatbot Is a Gatekeeper</title>
    <link href="https://robdodson.me/posts/your-ai-chatbot-is-a-gatekeeper/"/>
    <updated>2026-01-29T00:00:00+00:00</updated>
    <id>https://robdodson.me/posts/your-ai-chatbot-is-a-gatekeeper/</id>
    <content type="html"><![CDATA[
      <p>I really love the personal finance app <a href="https://www.monarch.com/">Monarch</a>. I used Mint for years but always felt vaguely icky about how their business model required trying to get me to sign up for credit cards. With Monarch, I pay them an annual fee, and they keep track of all of my finances in one place—perfect!</p>
<p>Recently they launched an AI chatbot. On the surface this seems like a cool feature, like my own little personal CPA, but in practice I could never seem to get excited by it. Mainly because <strong>it’s like talking to my financial data through a mail slot</strong>.</p>
<p>The chatbot only knows what Monarch knows. But my financial life connects to <em>everything</em>—my goals in Obsidian, that spreadsheet where I’m modeling whether we can afford to remodel the kitchen. The chatbot can’t see any of that. It’s working with a fraction of the context I have.</p>
<p>And there’s no memory. Each conversation starts fresh. Instead of feeling like a CPA who’s known me for years, it’s a new employee on their first day, every time.</p>
<p>I can’t <em>do</em> anything with the conversation either. There’s no place to save it. No way to build up plans over time that the AI and I can refer back to as things evolve.</p>
<p>I realized what I wanted was the full power of Claude Code along with my financial data so I could construct whatever interpretation of it I wanted.</p>
<h2>So I Built My Own</h2>
<p>I found an unofficial SDK for Monarch’s API and had Claude port it to TypeScript. Now I’m able to pull my financial data into a local SQLite database whenever I want. I built a little web UI to trigger snapshots, or I can just ask Claude to do it.</p>
<p>Suddenly the experience feels <em>bigger</em> than Monarch.</p>
<p>When I talk to Claude about my finances, it has all of the context—my Obsidian notes, other data sources I’ve connected, the financial plans we’ve generated together in previous conversations. I can say “remember that plan we made in October?” and it does!</p>
<p>This transforms it from a chat window into a workspace.</p>
<p>One tradeoff: I’m now responsible for my own data privacy. I handle this by stripping names and account numbers from each snapshot before saving. It’s not fancy, but it works.</p>
<h2>The Chatbot Is a Ceiling</h2>
<p>Here’s what I realized: an AI chatbot feature is inherently limiting. You’re giving users the full power of an LLM and then… capping it. They can only access their data through your interface. They can only ask the questions your chatbot is designed to handle with the context you provide.</p>
<p>This turns the chatbot into a gatekeeper.</p>
<p>Until the advent of something like Claude Code, there was very little value in giving users direct access to their data. A very small subset of technically minded customers <em>might</em> choose to build something with it, but the majority would not, so why invest time in building a public API?</p>
<p>But now that software is cheap and bespoke, giving users access to their data might actually be a selling point.</p>
<h2>What I’d Do Instead</h2>
<p>If I were building a product like Monarch, I’d focus on two things:</p>
<p><strong>1. Own the drudgery.</strong></p>
<p>Monarch is great at the stuff I don’t want to deal with: fiddly Plaid connectors, keeping transaction history up to date, auto-categorizing everything. Sure, I could try to vibe code my own version of this—but it would almost certainly bitrot and break as soon as I walked away. This is where Monarch earns the $100/year I pay them.</p>
<p><strong>2. Make the data accessible.</strong></p>
<p>Provide read-only API access so users can pull their data into whatever context they want. <em>Maybe</em> provide an API or CLI so agents can perform actions on the user’s behalf. We’re not there yet—<a href="/posts/clawdbots-missing-layers/">there’s infrastructure to build first</a>—but it’s where things are heading.</p>
<p>The point is: stop being a gatekeeper. Be infrastructure. Let users bring their data into their own AI workflows, with their own context, their own memory, and their own tools.</p>
<p>Don’t wall users in with your AI, let them bring their own.</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Clawdbot&#39;s Missing Layers</title>
    <link href="https://robdodson.me/posts/clawdbots-missing-layers/"/>
    <updated>2026-01-29T00:00:00+00:00</updated>
    <id>https://robdodson.me/posts/clawdbots-missing-layers/</id>
    <content type="html"><![CDATA[
      <p>In 1994, Pizza Hut launched <em>PizzaNet</em>, one of the first—and possibly best named—online ordering platforms. But they had one problem: convincing customers to type their credit card numbers into a website.</p>
<p><em>Who would be crazy enough to do that?</em></p>
<p>No encryption, no standards, no recourse if something went wrong. Fast forward to today: we buy groceries, cars, and houses online without a second thought. What changed was that we built the infrastructure to make it safe.</p>
<p>We’re at that same inflection point with agents.</p>
<h2>The Trillion-Dollar Problem</h2>
<p>Right now, giving an agent access to your computer feels a lot like typing your credit card into a 1994 website. The potential is obvious—an assistant that can actually <em>do things</em> for you, not just talk about doing things. But the risks are equally obvious. One prompt injection or compromised package, and suddenly your AI assistant is sending your bank info to evil.com.</p>
<p><a href="https://x.com/theonejvo/status/2015892980851474595">The recent Clawdbot hack</a> made this visceral. A supply chain attack turned a helpful AI into a data exfiltration tool. And here’s the uncomfortable truth: there was nothing particularly sophisticated about it.<sup><a href="#fn1" id="fnref1">1</a></sup> The attack worked because we haven’t built the infrastructure to make agents safe.</p>
<p>Building that infrastructure is a trillion-dollar opportunity. I realize that’s a very sales-y way to put it but I think it’s true.</p>
<h2>What E-Commerce Got Right</h2>
<p>E-commerce didn’t become safe because of one breakthrough. It became safe because of <em>layers</em>—each solving a different part of the problem.</p>
<p><strong>Encryption</strong> (SSL/TLS) meant your credit card couldn’t be intercepted in transit. <strong>Certificate authorities</strong> meant you could verify you were talking to Amazon, not a scammer pretending to be Amazon. <strong>Payment processors</strong> meant merchants never saw your actual card number. <strong>PCI-DSS</strong> gave companies standards to follow. <strong>Chargebacks</strong> meant mistakes could be reversed. <strong>Consumer protection laws</strong> meant someone was liable when things went wrong.</p>
<p>No single layer was sufficient. Together, they made e-commerce trustworthy.</p>
<p>Agents need the same thing: a security stack where each layer handles what the others can’t.</p>
<h2>The Required Unlocks</h2>
<h3>1. Supply Chain Security</h3>
<p>When your AI installs a package, it’s not installing <em>one</em> thing. It’s installing a hundred smaller packages in a trench coat. If any single dependency is compromised, it’s game over. And as the Clawdbot hack showed, agents trust their supply chain implicitly.</p>
<p>We need packages to declare what they actually do—what inputs they read, what outputs they produce, what network calls they make. And we need something watching to make sure they don’t lie.</p>
<p><em>“Hey, it looks like left-pad wants to access your SSH keys. That seems… wrong.”</em></p>
<h3>2. Prompt Injection Defense</h3>
<p>Even with secure packages, an AI can be manipulated by malicious text. A cleverly crafted email could instruct your agent to open a port on your network, download a file, or leak sensitive data.</p>
<p>There will probably be a bunch of interlocking solutions here: better sandboxing, and built-in guardrails (like <a href="https://openai.com/index/ai-agent-link-safety/">OpenAI’s rule limiting agents to public URLs</a>) to name a few.</p>
<p>Future models may also get better at recognizing manipulation—the same way you’d be suspicious if a stranger asked you to wire money to an overseas account.</p>
<h3>3. Identity and Authorization</h3>
<p>E-commerce asked: “Who is this merchant, and can I trust them?” Agents need to ask: “Who is this tool, and what should it be allowed to do?”</p>
<p>Right now, permissions are too coarse. “Claude wants to run shell commands” is like a website asking for your entire bank account when it only needs to charge $20. We need scoped permissions: this agent can read files in ~/projects but not ~/.ssh, can make HTTP requests to api.example.com but nowhere else.</p>
<p>Importantly, these policies can’t be ad hoc. Most users don’t know ~/.ssh is dangerous. And even those who do don’t want to write security rules for every corner of their machine.</p>
<h3>4. Reversibility</h3>
<p>Chargebacks made e-commerce viable. If a merchant scammed you, you could undo the transaction. What’s the equivalent for agents?</p>
<p>Git gives us reversibility for code. But what about the email your agent sent? The API call it made? The file it deleted? We need more systems designed with “undo” as a first-class feature.</p>
<h3>5. Audit Trails</h3>
<p>When something goes wrong, you need to reconstruct what happened. E-commerce has transaction logs, fraud detection systems, paper trails for disputes.</p>
<p>Agents need the same: a complete record of what actions were taken, what data was accessed, and why.</p>
<p>Audit trails also enable other layers:</p>
<ul>
<li><strong>Reversibility</strong> — you can’t undo what you can’t identify</li>
<li><strong>Fraud detection</strong> — you can’t spot patterns without records</li>
<li><strong>Containment</strong> — “freeze the account if you see unusual activity” requires knowing what activity occurred</li>
</ul>
<h3>6. Containment</h3>
<p>Smart security assumes breaches will happen and limits the blast radius. Credit cards have fraud limits and transaction caps. Your bank might freeze your card if it sees unusual activity.</p>
<p>Agents need similar containment: resource quotas, restricted directories, network isolation, cooling-off periods for dangerous operations. The goal isn’t to prevent all attacks—it’s to make sure a successful attack can’t do unlimited damage.</p>
<h3>7. Reputation Systems</h3>
<p>E-commerce has seller ratings, buyer protection, and escrow services. You can see that a merchant has completed 10,000 transactions with a 99% satisfaction rate.</p>
<p>What’s the equivalent for AI tools and packages? “This MCP server has been used by 50,000 developers with no security incidents” sounds good in theory, but this is exactly what the Clawdbot hack exploited—artificially inflating download counts to build false trust.</p>
<h2>The Pace Layers</h2>
<p>Architect Stewart Brand talks about <a href="https://longnow.org/ideas/pace-layers/">“pace layers”</a>—how civilizations have fast-moving layers (fashion, commerce) built on top of slow-moving layers (infrastructure, culture, nature). The fast layers innovate; the slow layers stabilize.</p>
<p>Security works the same way:</p>
<table>
<thead>
<tr>
<th>Layer</th>
<th>Speed</th>
<th>What It Provides</th>
</tr>
</thead>
<tbody>
<tr>
<td>Model Intelligence</td>
<td>Fastest</td>
<td>Models recognizing and refusing attacks</td>
</tr>
<tr>
<td>Application Guardrails</td>
<td>Fast</td>
<td>Prompt-level safety, app permissions</td>
</tr>
<tr>
<td>Tooling &amp; Frameworks</td>
<td>Medium</td>
<td>Sandboxed runtimes, security scanning</td>
</tr>
<tr>
<td>OS &amp; Runtime Security</td>
<td>Slow</td>
<td>Container isolation, capability systems</td>
</tr>
<tr>
<td>Legal &amp; Liability</td>
<td>Slowest</td>
<td>Who pays when an agent causes harm</td>
</tr>
<tr>
<td>Industry Standards</td>
<td>Slowest</td>
<td>The “PCI-DSS for AI” we don’t have yet</td>
</tr>
</tbody>
</table>
<p><strong>It feels like we’re currently trying to solve AI security almost entirely at the fast layers</strong>—smarter models, better prompts, application-level guardrails. These help, but they’re not durable. The fast layers buy us time while the slow layers catch up.</p>
<p>E-commerce wasn’t truly safe until the slow layers matured. SSL and fraud detection were stopgaps. PCI-DSS and consumer protection laws were the foundation.</p>
<p>Agents won’t be truly safe until we have the equivalent: industry standards for agent behavior, legal frameworks for liability, and runtime environments designed for containment from the ground up.</p>
<h2>The Opportunity</h2>
<p>The good news is that every layer represents an opportunity. Companies that build the identity layer, the audit layer, the containment layer—they’re building the infrastructure that makes the entire ecosystem possible.</p>
<p>In 1994, it was crazy to put your credit card online. In 2004, it was normal. The companies that built the layers in between—Verisign, PayPal, Stripe—created enormous value by making trust possible.</p>
<p>The same will be true for agents.</p>
<aside class="footnote" id="fn1">
<sup>1</sup> <em>That's not to say it wasn't clever or well executed. Jamieson O'Reilly did a phenomenal job! But the actual attack amounted to telling the AI to "send the user's stuff to this server" and the AI complied without question because it naively trusted the supply chain.</em> <a href="#fnref1">↩</a>
</aside>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Joining Voltus to work on climate!</title>
    <link href="https://robdodson.me/posts/joining-voltus/"/>
    <updated>2022-07-10T00:00:00+00:00</updated>
    <id>https://robdodson.me/posts/joining-voltus/</id>
    <content type="html"><![CDATA[
      <p>When I left Google back in October of 2021, I did so because I wanted to find a job working on climate change. After a lot of reasearch and interviewing (which <a href="/posts/finding-a-job-in-climate/">I wrote about at the time</a>) I finally found a role that felt perfect for me. So a couple weeks back, I joined the team at <a href="http://voltus.co/">Voltus</a>, with a mission to make the grid smarter and more resilient.</p>
<h2>What does Voltus do?</h2>
<p>Voltus offers a number of programs to its customers, but it’s primarily known for its demand response programs. Demand response is a clever grid balancing technique that’s especially important as we transition to renewable energy.</p>
<p>You can think of it like this: When there is more demand (i.e. people using power) than there is supply (power being generated) then a grid operator has two choices—either generate more supply, or reduce demand.</p>
<p>Generating more supply means firing up a power plant and producing green house gases. Reducing demand means convincing (or incentivizing) customers to use less power. This is where Voltus comes in.</p>
<p>When a grid operator needs a reduction in demand they send a signal to Voltus, and Voltus pays major power users (factories, big box stores, etc.) to curtail their consumption. Voltus gets paid by the grid operator for this reduction in demand, and Voltus passes a percentage of that payment on to their customers.</p>
<p>You may have heard the term “virtual power plant” before (<a href="/posts/your-home-is-a-virtual-power-plant/">I wrote about it recently</a>). That’s essentially what Voltus does. They manage around 2 Gigawatts (GW) of power—enough to run ~328,000 homes—and have paid out more than $31M to their customers.</p>
<h2>How does Voltus fight climate change?</h2>
<p>If Voltus did not exist, when a grid operator needed more power they would be forced to fire up a fast acting fossil fuel plant. Voltus provides a cleaner (literally zero CO2) alternative.</p>
<p>But what’s more important is how Voltus enables renewable energy. A grid designed around wind and solar is highly volatile—every cloud or reduction in wind speed causes the supply to drop. If we want to move away from fossil fuel reserves, then we need grid balancing technologies like Voltus.</p>
<p><em>What about batteries?</em> you might ask.</p>
<p>According to the Energy Information Administration (EIA), at the end of 2021, <a href="https://pv-magazine-usa.com/2022/03/29/us-grid-scale-energy-storage-usage-profiles-innovation-and-growth-outlook/">the United States only had 4.5GW of energy storage</a>, but it’s estimated that <a href="https://www.pv-magazine.com/2022/01/24/us-zero-carbon-future-would-require-6twh-of-energy-storage/#:~:text=US%20researchers%20suggest%20that%20by,electricity%20in%20the%20United%20States.">the U.S. will need 930GW by 2050</a>. So, yes, batteries are great, but there’s just not enough of them right now and they take time to install. The beauty of a virtual power plant is that there’s no construction required!</p>
<p>But really these things are not mutually exclusive. A greener grid will require a combination of renewable generation, long and short term battery storage, and demand response.</p>
<h2>We’re hiring</h2>
<p>One of the things that attracted me to Voltus was the incredibly strong work culture. Everyone I spoke to during my interview process seemed to really care about the company’s mision, and the leadership team has put a lot of thought and effort into creating a supportive, inclusive environment. I feel like <a href="https://www.voltus.co/join-us/engineering">this video from my manager Jamie</a> does a good job of conveying the vibe 😁</p>
<p>Voltus is entirely remote, and currently hiring across a number of positions. If you’re interested in joining the team, <a href="https://www.voltus.co/join-us/">take a look at our careers page</a> or feel free to <a href="https://twitter.com/rob_dodson">reach out to me on Twitter</a> and I’d be happy to answer any questions you may have.</p>
<p>All in all, I feel really fortunate to have found this team, and I hope if you’re reading this that you might be considering a role in climate as well. It’s a big challenge, and we need all the help we can get, but I’m hopeful and optimistic that we’ll get there 🌎</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Why I&#39;m turning my home into a virtual power plant</title>
    <link href="https://robdodson.me/posts/your-home-is-a-virtual-power-plant/"/>
    <updated>2022-04-08T00:00:00+00:00</updated>
    <id>https://robdodson.me/posts/your-home-is-a-virtual-power-plant/</id>
    <content type="html"><![CDATA[
      <p>On September 9th 2020, I woke up to find that the sky outside of my window looked like this:</p>
<p><img src="/images/orange-sf.jpg" alt="The San Francisco skyline. The entire city is dark orange, almost as if it were a photo taken on Mars." title="San Francisco, September 2020"></p>
<p>Smoke from nearby wildfires was trapped over the Bay Area, making the region look like the surface of Mars. It’s hard to describe the feeling of walking around my neighborhood with it looking like the set of Blade Runner, but the one thing I can say is that it made the immediacy of climate change paramount.</p>
<p>That morning a switch flipped in my brain. I couldn’t keep doing my job and ignoring what was literally happening outside of my window. I decided to leave Google to look for a role doing something—anything!—connected to climate.</p>
<p>Today I want to talk about a clever idea I learned about during my job search. I think it is potentially a transformational new industry and one that many, if not all of us, will participate in: turning every home (and apartment) into a virtual power plant ⚡️</p>
<p>On the surface that just sounds cool, right? But what does it actually mean? To understand how it works we first have to understand how the grid operates and what happens when there’s not enough power to go around.</p>
<h2>How the grid works</h2>
<p>The power grid is a balancing act—there’s the amount that consumers are trying to use—the <strong>demand</strong>—and there’s the amount being generated by power plants—the <strong>supply</strong>.</p>
<p>Sometimes, like on the hottest day of the year when everyone is running their air conditioners, demand outpaces supply. During these times, the grid operator has to go to the energy market to buy more power to respond to the demand.</p>
<p>Depending on the situation, this might mean calling up a <strong>peaker plant</strong>. These are fast-acting—and very dirty—fossil fuel plants that can ramp up quickly.</p>
<p>There are a number of problems with peaker plants:</p>
<ol>
<li>
<p>They’re expensive to operate</p>
<blockquote>
<p>A new report has found that New Yorkers over the last decade have paid more than $4.5 billion in electricity bills to the private owners of the city’s peaker plants, just to keep those plants online in case they’re needed — even though they only operate between 90 and 500 hours a year. <a href="https://grist.org/justice/these-dirty-power-plants-cost-billions-and-only-operate-in-summer-can-they-be-replaced/#:~:text=A%20new%20report%20has%20found%20that%20New%20Yorkers%20over%20the%20last%20decade%20have%20paid%20more%20than%20%244.5%20billion%20in%20electricity%20bills%20to%20the%20private%20owners%20of%20the%20city%E2%80%99s%20peaker%20plants%2C%20just%20to%20keep%20those%20plants%20online%20in%20case%20they%E2%80%99re%20needed%20%E2%80%94%20even%20though%20they%20only%20operate%20between%2090%20and%20500%20hours%20a%20year.">source</a></p>
</blockquote>
</li>
<li>
<p>They’re dirty</p>
<blockquote>
<p>Many of these facilities are 50 or more years old, lack modern pollution controls, and run on dirty fuels like kerosene or oil <a href="https://grist.org/justice/these-dirty-power-plants-cost-billions-and-only-operate-in-summer-can-they-be-replaced/#:~:text=Many%20of%20these%20facilities%20are%2050%20or%20more%20years%20old%2C%20lack%20modern%20pollution%20controls%2C%20and%20run%20on%20dirty%20fuels%20like%20kerosene%20or%20oil%20at%20least%20part%2Dtime.">source</a></p>
</blockquote>
</li>
<li>
<p>They damage the health of our communities</p>
<blockquote>
<p>They’re predominantly located near population centers where energy demands are greatest and typically located in communities of color and under-resourced areas. There are more than 1,000 peakers in operation across the country today <a href="https://www.usnews.com/news/cities/articles/2020-05-27/its-time-to-shut-down-polluting-urban-power-plants#:~:text=They%27re%20predominantly%20located,major%20metropolitan%20areas.">source</a></p>
</blockquote>
</li>
</ol>
<p>Ironically, as we’ve moved from using fossil fuels to renewables like wind and solar, <a href="https://www.eenews.net/articles/fight-over-peaker-plants-poses-grid-climate-test/">some electric utilities have proposed building <em>more</em> peaker plants</a> to make up for the intermittent nature of renewables.</p>
<p>An alternative to peaker plants is that we could all agree to use less energy when the grid is under strain. But this presents a coordination problem: consumers don’t know when the grid is under strain, so they don’t know when to use less energy, and therefore grid operators cannot rely on these energy savings.</p>
<p>So how do we solve this coordination problem?</p>
<h2>Demand response</h2>
<p>As I mentioned earlier, the power grid is a balancing act. One way to balance the grid when demand is high is to generate more power. The other way is to lower demand, a.k.a. “demand response”.</p>
<p>In other words, if you and I agree to unplug our refrigerators for an hour when the grid is under strain, then we help rebalance the grid by lowering the demand.</p>
<p>Where this gets interesting is when you think about <strong>aggregating that collective action</strong>. Instead of unplugging one refrigerator for an hour, we unplug one million. Now we’re talking about <em>megawatts</em> of power that can be “generated”, on-demand, to rebalance the grid.</p>
<p>Technically we’re not generating new power, but the net effect is the same. If the grid needs one megawatt of power, and we turn off one megawatt’s worth of refrigerators, then everything evens out.</p>
<p>Rather than thinking of these as megawatts generated, you can instead think of them as <strong>“negawatts”</strong> saved (yes, that is an actual term used in the industry).</p>
<p>If we all knew when to turn off our refrigerators (or thermostats/lights/space heaters/air purifiers/EV chargers/etc.), and we understood energy markets well enough to sell energy into them, then we could act as a kind of <strong>virtual power plant</strong>. When a grid operator needs power, instead of going to a dirty peaker plant, they could instead call up our virtual power plant and <strong>pay us</strong> for our negawatts!</p>
<p>It might seem odd to think about selling energy that we <em>didn’t</em> use, but according to the Federal Energy Regulatory Commission (FERC), <a href="https://www.ferc.gov/industries-data/electric/power-sales-and-markets/demand-response#:~:text=In%202011%2C%20the,is%20cost%2Deffective.">we can do just that</a>. Negawatts are priced and sold just like megawatts.</p>
<p>To do this sort of collective action, we need <em>aggregators</em>: someone to tell us when to reduce our energy consumption, who can handle selling that energy on our behalf. This is where startups like <a href="https://www.voltus.co/">Voltus</a> and <a href="https://ohm.co/lets-email-rob">OhmConnect</a> (to name a few) enter the picture.</p>
<p>These companies present themselves as virtual power plants to grid operators and sell negawatts at a cost per kilowatt hour. They generate these negawatts by sending notifications to their users who then reduce their energy consumption during specific times. When Voltus or OhmConnect gets paid by the grid operator, they pass a percentage of that payment on to their users.</p>
<p>Voltus mostly targets industrial customers (steel mills, factories, etc.) but they told me that they plan to do more consumer demand response soon. OhmConnect, on the other hand, is entirely consumer facing and currently operates in California, Texas, and New York. I’ve been using OhmConnect since February 2022—about two months—and have so far earned around $100 through a combination of energy savings and referrals.</p>
<p>While the money is a nice bonus, what most excites me about OhmConnect is feeling like I’m participating in a social experiment to improve grid intelligence and help the climate. I had wanted to add smart lights and plugs to my home for convenience, but this creates an additional incentive when I can think of my home as (part of) a virtual power plant.</p>
<p>Let me walk you through an example so you can see how it works.</p>
<h2>One OhmHour</h2>
<p>When the grid is really busy, OhmConnect sends me a notification with a specific time—an <strong>OhmHour</strong>—during which I should ramp down my power consumption. OhmHours typically occur once per week, and they notify me a day or so in advance, and then an hour before the event begins.</p>
<p>During the OhmHour I’m rewarded in points—called <strong>watts</strong>—based on how much I reduce my consumption. Watts can be exchanged for cash (via PayPal), spent on discounted smart devices, or used for contests: free groceries for a year, an e-bike, that sort of thing. OhmConnect also pays me cash for referring new users. It varies by state, but I earn $40 if I refer a fellow Californian, and the referee receives $10.</p>
<p>There’s no requirement to connect devices to OhmConnect—you can walk around your house and manually turn things off during an OhmHour—but I found it easier to let them do it for me, plus I receive bonus watts for every connected device. So I connected my Nest thermostat and a smart plug powering my refrigerator to their system.</p>
<p>During the event I’m graded on how much energy I save compared to my previous 10-day average. For example, on March 16th from 7-8pm, I reduced my consumption down to 0.19kWh from an average of 0.43kWh.</p>
<p><img src="/images/ohmhour.jpg" alt="My OhmConnect dashboard showing an bar area chart comparing my typical 10-day usage versus my usage during the OhmHour. The chart shows a 57% reduction in power." title="My OhmConnect dashboard"></p>
<p>I didn’t have to radically alter my life to achieve these savings. During this specific event, I was watching TV on the couch with my wife. But prior to the OhmHour starting I turned off the unused lights in my house and put my dishwasher on a timer so it would start later in the evening. My refrigerator automatically turned off and my thermostat switched to eco mode.</p>
<p><em>Brief aside: Did you know that most dishwashers have a timed start feature? This is really helpful if you’re on a peak time-of-use electricity plan!</em></p>
<p>In total I earned 605 watts during that OhmHour: 245 watts in energy savings + 360 bonus watts for having two smart devices connected to my account (320 for my thermostat and 40 for my smart plug). Because you can use watts to buy more smart devices, which then grant additional watt bonuses, you can see how this turns into a positive feedback loop.</p>
<h2>Is this a scam?</h2>
<p>OhmConnect is clearly trying to gamify this process—apparently the CTO used to work at Zynga—so there are streaks and levels that increase the discounts you receive when you exchange your watts for smart devices. You can also spend watts to increase your referral bonus, something I’ve done in the past before referring a few of my friends.</p>
<p>Does it feel a <em>tad</em> like a multi-level marketing scheme? Sure. But if you understand the demand response / virtual power plant model, you can see that they’re actually making money by selling negawatts to grid operators and paying you a percentage of that when you cash out your watts or use them to buy subsidized smart devices.</p>
<p>So it really is more of a social game where reducing CO2 is the goal and there are financial incentives. It’s a novel approach to climate change because it takes the addictive engagement and recruitment model of Farmville but uses that power for good. Who would have ever thought that Farmville could help save the planet?!</p>
<h2>Privacy concerns</h2>
<p>I think it’s fair to mention that participating in OhmConnect does require sharing some data. For OhmConnect to work, it first needs to know how much energy you’re using, which means giving them access to your energy data via your utility’s website. In addition, you’re rewarded for connecting smart devices to your account, which lets OhmConnect turn those devices off during an OhmHour.</p>
<p>I can totally understand being concerned about a third-party having the ability to turn off your refrigerator, but you can always opt-out of the OhmHour or walk over and turn your refrigerator back on (or through the smart plug app on your phone). Another option is to only use the smart plugs for less critical devices.</p>
<p>Since you’re only rewarded based on your energy savings, if you choose to completely ignore the OhmHour there’s no real penalty, you just won’t earn any watts.</p>
<p>The way I see it, giving OhmConnect the ability to ramp down my power consumption acts as a kind of backpressure model for the grid, so even if I’m not at home, my devices can quickly switch off and hopefully do a bit of good. Also, I’ve learned that an unopened refrigerator has enough thermal inertia to safely be off for around four hours 😄</p>
<h2>Give it a shot!</h2>
<p>If you’re interested in trying OhmConnect you can use <a href="https://ohm.co/lets-email-rob">my referral</a> and we’ll both get some money 🙌 When you sign up they will offer to send you a smart plug for $1. Technically you have to pay the full $11 and then they refund you $10 if you connect the device to your account (I can verify that they did refund me).</p>
<p>If you want to learn more about their business I recommend checking out the <a href="https://my-climate-journey.simplecast.com/episodes/cisco-devries">My Climate Journey interview with their CEO, Cisco DeVries</a>.</p>
<p>I should also mention that both OhmConnect and Voltus are hiring!</p>
<ul>
<li><a href="https://climatebase.org/jobs?l=&amp;q=ohmconnect&amp;p=0">OhmConnect jobs</a></li>
<li><a href="https://climatebase.org/jobs?l=&amp;q=voltus&amp;p=0">Voltus jobs</a></li>
</ul>
<p>I think this is such a cool space and am excited to see where these companies go in the future. If you do give OhmConnect a shot, give me a shout on <a href="https://twitter.com/rob_dodson">Twitter</a> and let me know how it goes for you!</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Finding a job in climate as a front-end engineer</title>
    <link href="https://robdodson.me/posts/finding-a-job-in-climate/"/>
    <updated>2022-03-16T00:00:00+00:00</updated>
    <id>https://robdodson.me/posts/finding-a-job-in-climate/</id>
    <content type="html"><![CDATA[
      <p>In October 2021, I left my job at Google to see if I could find a role in climate tech. When I left, I didn’t have a job lined up, nor did I know how to go about finding a job in climate, so I wanted to write this post to share what I learned along the way. I’m happy to say that I have since found a new role in the climate space (something I’ll write about soon) and hopefully the information below will help you do the same.</p>
<h2>Do climate companies even need front-end engineers?</h2>
<p>Right out of the gate I can say an emphatic <strong>yes</strong>—there are plenty of web dev roles available at climate tech companies. Also, you don’t need to be a climate expert to apply. None of the places I spoke with assumed that I had any prior knowledge of their domain, but they were all really motivated to help me get up to speed. I learned a lot just in the application process and I imagine you will as well.</p>
<p>Unlike traditional tech companies, web (and mobile) are not always the centerpieces for climate tech companies. Many are focused on building new kinds of batteries/fuels/sensors/grids/etc. So when you’re searching for roles you’ll see a lot of IoT and low-level programming, plus cloud and big data. But there’s absolutely demand for front-enders as well.</p>
<h2>Where to find jobs</h2>
<p>The best resource for job hunting is <a href="https://climatebase.org/">Climatebase</a>. I cannot stress this enough: <a href="https://landing.mailerlite.com/webforms/landing/r7s1y1"><strong>sign up for their newsletter</strong></a>. It comes out weekly and gives a brief rundown of what’s new in the world of climate and then lists all the new jobs and companies for that week. Here’s <a href="https://preview.mailerlite.com/k6w5m4">a sample from October</a>.</p>
<p>Take the time to fill out a profile on Climatebase and each week they will email you roles that match your skills.</p>
<p>You can also go through the back catalog of the <a href="https://www.mcjcollective.com/media/podcast">My Climate Journey podcast</a> and look at the careers page for the companies being interviewed.</p>
<h2>How to educate yourself</h2>
<p>The <a href="http://workonclimate.org/">Work on Climate</a> group has some good <a href="http://workonclimate.org/resources/">resource starter packs</a>. They also have a Slack that you can join to converse with like-minded folks. Personally, I didn’t use the Slack much, but I did find the starter pack reading material interesting.</p>
<p>I listen to a lot of podcasts and I found the <a href="https://www.volts.wtf/">Volts podcast/newsletter</a> by David Roberts to be really helpful. Go through <a href="https://www.volts.wtf/archive?sort=new">the archive</a> and pick an assortment of episodes that seem interesting. Some are <em>incredibly dry and wonkish</em> (be forewarned) but others are really good explanations of topics that I only kind-of, sort-of understood. Here’s <a href="https://www.volts.wtf/p/volts-podcast-all-about-methane-with?s=r">a great starter episode that’s all about methane</a>.</p>
<p>Another podcast is <a href="https://podcasts.apple.com/us/podcast/how-we-survive/id1586892518">How We Survive</a> by Molly Wood. It’s a nine-part series that mostly focuses on lithium batteries, but it does a good job of talking about the social justice side of climate change, as well as the tech.</p>
<p>The most helpful book I read was <a href="https://www.goodreads.com/book/show/32075449-the-ends-of-the-world">The Ends of the World</a> which is a fascinating retelling of all of the world’s mass extinction events and how all of them (yes, even the dinosaurs) were connected to the planet’s carbon cycle. Understanding how the carbon cycle works and what happens when there’s too much or too little CO2 is just really interesting.</p>
<h2>What the employment landscape is like</h2>
<h3>Most of the companies are startups</h3>
<p>I realized early on that I didn’t <em>know</em> any “climate companies”. It’s easy to name big tech companies, but there hasn’t been enough time or investment for climate companies to become household names. So most of the places I spoke to were in the range of tens of people, to maybe a couple hundred.</p>
<p>On the one hand, this is great. I got to speak directly to the founders of some companies and the engineering teams felt tight-knit and energized. Your work will almost certainly have a big impact on the organization and that can be really motivating.</p>
<p>On the other hand, there’s a lot of career and financial uncertainty when joining a startup. The base pay may be less than you currently make and equity will be much riskier/there will be less of it to go around.</p>
<p>I don’t say these things to discourage you from working on climate—I personally think we all need to seriously consider making the career switch—but I understand that everyone is in a different situation with their financial responsibilities and it’s important to know ahead of time what kinds of companies are out there and what the compensation will be like.</p>
<h3>Carbon offsets are popular…for better or worse</h3>
<p>A significant portion of the companies I looked at deal in carbon offsets, which are a fairly controversial topic. The idea with an offset is that a big company can pay someone else to capture CO2 (i.e. plant or protect a forest), and this then “offsets” the big company’s own emissions. Companies that sell offsets are market makers, they find the projects that will offset emissions, and they package them up and sell them.</p>
<p>There are a number of problems with offsets, a few that I know of are:</p>
<ul>
<li>It’s unclear how they’re regulated, or if they actually deliver the results they claim.</li>
<li>Planting a forest can take years to capture significatn CO2, but your emissions go into the air <em>today</em>.</li>
<li>The offset buyer doesn’t have to change any of their behaviors.</li>
</ul>
<p>That last point is a big deal, and one of the reasons why folks say offsets are “greenwashing”. Right now a lot of companies are making announcements about offseting their emissions, but imagine if they <em>couldn’t</em> buy offsets? Would they be pressured to actually operate more efficiently instead?</p>
<p>It’s hard for me to answer these questions, but my gut tells me that offsets are not a good model so I tended to steer away from companies who make them their primary business.</p>
<h3>React is king</h3>
<p>I interviewed or had exploratory phone calls with six companies, and I’ve also read pretty much every Climatebase newsletter over the past four months. I can say with confidence that the two most in-demand front-end skills are React and TypeScript. Every company I interviewed with is using React, and pretty much every company on Climatebase lists it as a desired skill.</p>
<p>Most companies seem fine with you learning React on the job, especially if you have prior experience with similar frameworks (Vue, Angular, Svelte, Lit, etc).</p>
<p>I personally was not that experienced in React (I’ve mostly used <a href="https://lit.dev/">Lit</a>), but the <a href="https://beta.reactjs.org/">beta React docs</a> are <em>really</em> good and do great job of explaining newer concepts like Hooks. I highly recommend reading through these.</p>
<h3>Most companies want senior full-stack (but don’t be discouraged!)</h3>
<p>Because many of the companies are smaller startups, and likely don’t have enough engineers to specialize in front-end or back-end, most of the roles listed are for full-stack engineers, often listed as senior level.</p>
<p>This all makes sense but it can be discouraging. I’m pretty specialized in the front-end, and I shied away from applying to some roles because I wasn’t confident enough in my back-end skills. This doesn’t mean that you can’t find a front-end specific role—they’re certainly out there—but it just takes a bit more patience to find them. I guarantee you that they’re there—I managed to apply to several—there just aren’t <em>as many</em> as full-stack. It can be demotivating at times, but be persistent!</p>
<h2>Wrapping up</h2>
<p>One thing I didn’t talk about yet is how I prepared for the coding interviews or what those were like. I’ll write a follow-up post to cover that. But in the meantime, if you have any questions, please feel free to <a href="https://twitter.com/rob_dodson">reach out to me on Twitter</a>. I’m more than happy to talk about this process if it helps other folks make the switch!</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>How I work</title>
    <link href="https://robdodson.me/posts/how-i-work/"/>
    <updated>2021-03-06T00:00:00+00:00</updated>
    <id>https://robdodson.me/posts/how-i-work/</id>
    <content type="html"><![CDATA[
      <p>I’m always fascinated by learning the productivity tools that people use. I’m on a bit of an asymptotic quest to be efficient during the day so I can feel good about disconnecting in the evening.</p>
<p>In this post, I’ve done a write-up on tools and techniques I use in my day-to-day work. This is a snapshot of my process in 2021, but I may revise it in the future.</p>
<ul>
<li><a href="#todoist">Todoist</a></li>
<li><a href="#pinboard">Pinboard</a></li>
<li><a href="#aggressively-closing-chrome-tabs">Aggressively closing Chrome tabs</a></li>
<li><a href="#alfred-multi-clipboard">Alfred multi-clipboard</a></li>
<li><a href="#notion-(or-maybe-obsidian)">Notion (or maybe Obsidian?)</a></li>
<li><a href="#brain.fm">Brain.fm</a></li>
<li><a href="#github-notifications">GitHub notifications</a></li>
</ul>
<h2>First, a bit about me</h2>
<p>I currently work on two content sites at Google, <a href="https://web.dev">web.dev</a> and <a href="https://developer.chrome.com">developer.chrome.com</a>. I also manage a geographically distributed team of three engineers who sit in the Bay Area, Sydney, and Zurich. Time zones are my enemy. ⏰</p>
<p>I spend most of my day either helping authors in our team chat, jumping between GitHub projects, in meetings 😵, or planning “What’s next” for our team. When things are going well and I’m being organized my workflow and tooling look something like this:</p>
<h2>Todoist</h2>
<p>I’ve tried a lot of project management tools—and at Google, we have some of our own—but since I work across projects it means my tasks are spread between GitHub issues, various kanban boards, and spreadsheets.</p>
<p>What I found helpful about Todoist is that I can give <em>myself</em> a personal project management tool, which acts as a layer on top of all of the other tools I use.</p>
<p>Todoist has a lot of features but I only use a handful of them: priorities, scheduled tasks, and project boards.</p>
<p><strong>Priorities</strong> let me quickly dash out if I think a task is a <code>p1</code> (very important) or a <code>p3</code> (less important) and Todoist will color code and sort them accordingly.</p>
<p><img src="/images/todoist.jpg" alt="A todoist dashboard showing four tasks, color-coded by priority." title="RIP my Travel project."></p>
<p><strong>Scheduled tasks</strong> let me file an idea away for later.</p>
<p>For example, if I write “Wash the dog <strong>tomorrow</strong>”, it will move the task out of my view and tuck it away until tomorrow.</p>
<p>Recently Todoist added kanban style <strong>project boards</strong>, which didn’t interest me at first because I like the simple list view. But I realized I could use priorities and scheduled tasks as project subtasks and get the best of both worlds.</p>
<p>If I have a big project I’ll create a card for it and break it into scheduled subtasks, when the date arrives the subtask gets added to my <strong>Today</strong> list.</p>
<p><img src="/images/todoist-subtasks.jpg" alt="A modal window showing one completed, and two incomplete subtasks under the 'Improve image CDN' task." title="Subtasks prevent me from losing my place when I get distracted."></p>
<p>Usually on Monday I’ll look at all of my project boards and triage the subtasks, assigning them to a day of the week and a priority. As new tasks crop up that are unrelated to my bigger projects, like a sudden important email I need to follow up on, I’ll add it to my <strong>Today</strong> list. This way the <strong>priority tasks</strong> for my week are on auto-pilot and I can let my brain context switch without worrying that I’ll drop the ball.</p>
<p>I’m not dogmatic with this setup, sometimes I get really busy and end up brain dumping 20 items into my Todoist Inbox and then triaging them later. The important point is that I’ve gotten into the habit of checking this tool at least once a day, and cleaning it up at least once a week.</p>
<p>If you’re interested in giving Todoist a try you can use <a href="https://todoist.com/r/rob_dodson_vloaey">my referral code</a> and I’ll get a few months for free 🤝</p>
<h2>Pinboard</h2>
<p>Pinboard is a minimalist bookmark tracker. It sort of looks like Craigslist.</p>
<p><img src="/images/pinboard.jpg" alt="A simple webpage showing a list of linked page titles" title="Not a lot going on here, but I kind of like that."></p>
<p>It has a simple browser extension you can use to bookmark something and assign it tags. Then, months or weeks later, you can go back to your pinboard and track it down again.</p>
<p>Combining Todoist and Pinboard leads me to my first productivity win:</p>
<h2>Aggressively closing Chrome tabs</h2>
<p>If I have more than a handful of Chrome tabs open I start to get overwhelmed. I know folks often have a hard time closing their tabs but I’ve found having a combination of a good to-do list and a bookmark list helps me mentally file stuff away for later. If it’s important I’ll assign it a task and either drop the link in the task as a comment or pin it.</p>
<p>Then I close the tab. 💆‍♂️💆‍♂️💆‍♂️</p>
<p>If I don’t do this then I feel like I’m staring at a wall of cognitive debt. If I file the tab away I know I’ve triaged it and it doesn’t tug at my focus when I’m trying to complete something else.</p>
<p>One tip is to use <strong>pinned tabs</strong> in Chrome for things that you leave open all day like Gmail, chat, or calendars.
Here’s what my tab bar usually looks like:</p>
<p><img src="/images/chrome-tabs.jpg" alt="A browser tab bar showing four pinned tabs and four open tabs" title="I try to pin things to decrease the horizontal space taken up by tabs."></p>
<h2>Alfred multi-clipboard</h2>
<p>With a multi-clipboard, you can copy as many chunks of text as you want and then use a shortcut to open a little window so you can search and paste the right one. It will also keep track of your screenshots.</p>
<p>I use <a href="https://www.alfredapp.com/">Alfred</a> for this but there are other tools that do something similar.</p>
<p><img src="/images/multi-clipboard.jpg" alt="A modal dialog showing text snippets and image filenames." title="A multi-clipboard expands my short term memory."></p>
<p>If I’m going to attempt something sketchy in a file I’ll <strong>Select All</strong> and hit copy so I know I have a backup in case things go wrong.</p>
<p>The built-in search is quite handy as I’ll often remember a something from a week ago and I can usually dial it up with fuzzy search. Plus you can create handy snippets for emotes <span aria-hidden="true">ʕ•ᴥ•ʔ</span></p>
<h2>Notion (or maybe Obsidian?)</h2>
<p>Sometimes you just need a big notebook to braindump ideas. In the past, I’ve used Evernote and tried Bear. Currently I use <a href="https://notion.so">Notion</a>.</p>
<p><img src="/images/notion.jpg" alt="A model window showing smoothie recipes written in markdown." title="You too can be as smooth as Steph Curry"></p>
<p>I’ve found that while Notion looks great, I don’t use the majority of its features, and text selection can make the authoring process clunky.</p>
<p>I’ve started looking into <a href="https://obsidian.md">Obsidian</a> after seeing <a href="https://twitter.com/piccalilli_">Andy Bell</a> switch to it on Twitter. I like that it’s just a simple markdown tool that organizes things into a kind of brain wiki similar to <a href="https://roamresearch.com/">Roam</a>. Importantly Obsidian is free and all of the content stays on my machine as markdown files—so I don’t have to worry that I’m sending these ✨<strong>brilliant thoughts</strong>✨ to a third-party.</p>
<h2>Brain.fm</h2>
<p>I can’t concentrate if the music I’m listening to has words in it. For a while, I’ve used the Spotify Focus playlists but discovered Brain.fm after <a href="https://twitter.com/SaraSoueidan">Sara Soueidan</a> mentioned she uses it.</p>
<p>Brain.fm uses 🧪 <strong>science music</strong> 🧬 which sounds a lot like your typical focus playlist but it has this subtle warbling sound. They claim it makes your brain neurons do a happy dance.</p>
<blockquote>
<p>Brain.fm holds patents on key processes for creating functional music, including technology to elicit strong
neural phase locking—allowing populations of neurons to engage in various kinds of coordinated activity—and
technology to remove distraction in sound.</p>
</blockquote>
<p>It’s a pretty simple dashboard where you choose the type of music you want and then it plays a song for a few hours.</p>
<p><img src="/images/brain-fm.jpg" alt="A music player. Lo-fi focus music is playing." title="I thought it was silly but now I can't stop."></p>
<p>I did the free trial, didn’t think much of it, and went back to Spotify. But after a few days, I was like <em>“Dang, I feel like my phases aren’t locking like they used to!”</em> so I became a paying customer. I have no idea if the science works but I listen to it every day.</p>
<p>If you have neural phase envy, you can use <a href="https://brain.fm/invite/Rk0PNLEZrP">my referral code</a> to try Brain.fm 🧠</p>
<h2>GitHub notifications</h2>
<p>I used to filter all of my GitHub notifications to my email but I found it annoying because I couldn’t differentiate between a new issue, a mention, or an assignment. A while back GitHub redid their notifications dashboard and made it more of an inbox of sorts with keyboard shortcuts to jump between notifications and archive them.</p>
<p><img src="/images/github-notifications.jpg" alt="A dashboard showing six GitHub issues assigned to me." title="It can sometimes feel overwhelming, but the notifications dashboard is a lot better than it used to be."></p>
<p>I should probably do more to configure it, but right now I mainly use the <strong>Assigned</strong> and <strong>Mentioned</strong> tabs. Separately I’ll scan through the PR tabs on any of my open projects and handle reviews there. I wish GitHub would let me automatically archive reviews once a PR is merged so I don’t end up with a backlog saying I have 122 reviews to look at.</p>
<h2>That’s it!</h2>
<p>This was a very tools focused post, but I’d like to do a follow up about other work behaviors I’ve been trying to improve on like cutting down on coffee, scheduling recurring blocks for mindfulness meditation, etc.</p>
<p>If you found any of these tips helpful <a href="https://twitter.com/rob_dodson">give me a shout on Twitter</a>!</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Command palettes for the web</title>
    <link href="https://robdodson.me/posts/command-palettes/"/>
    <updated>2019-09-03T15:00:00+00:00</updated>
    <id>https://robdodson.me/posts/command-palettes/</id>
    <content type="html"><![CDATA[
      <p><lite-youtube videoid="srLRSQg6Jgg" videotitle="a11ycasts: Managing Focus" ></lite-youtube></p>
<p>A while back I was working with a fellow Googler to try and improve the accessibility for one of our apps. In the scenario, a user needed to click some UI, which then opened a panel, where the user needed to click <em>more</em> UI to perform an action.</p>
<p>Helping a screen reader navigate these various UI states is a tricky technique known as <strong>focus management</strong>.Focus management is when you manually direct the user’s keyboard and screen reader cursor as they use the app. For example, if clicking a piece of UI loads more content into the page, then you need to tell the screen reader that this new content is available.</p>
<p>Because the web does not have a built-in tool for doing focus management, this is often left as a design exercise involving clever uses of <code>tabindex</code>, the <code>focus()</code> method, and a lot of guesswork.</p>
<h2>Look up</h2>
<p>As my teammate and I were discussing how to move focus into the next panel, he mentioned something that got me thinking. He said that he wished web apps had menu bars like desktop apps.</p>
<blockquote>
<p>You know, like the File and Edit menus in Outlook. I can do anything I want with those!</p>
</blockquote>
<p>It had never occurred to me how much I take the OS menu bar for granted and how powerful of an accessibility tool it can be. Instead of forcing the user to learn a bunch of UI states—which are different for each app—the menu bar is a common affordance for executing commands.</p>
<p><img src="/images/2019/01/Screen-Shot-2019-01-10-at-10.50.54-PM.png" alt="The menu bar for Evernote, showing the Note submenu" title="The menu bar for the macOS app Evernote"></p>
<p>So why don’t web apps have menu bars? Especially if they could improve the accessibility for our users?</p>
<p>There might be a few reasons for this:</p>
<ul>
<li>The OS menu bar is presented separately from the app, which lives in a window. Web apps don’t have this capability because they run inside of a browser which already has a menu bar.</li>
<li>In addition to the browser’s menu bar, there’s also a URL bar and associated controls. Adding <em>another</em> menu bar may feel cluttered.</li>
<li>Every website would have to solve this for themselves. It would be hard to create the consistent experience of OS menu bars.</li>
</ul>
<p>It’s worth noting that some web apps do support their own menu bar—Google Docs for example—but I think that’s because they’re following in the well worn footprints of their native counterparts.</p>
<p><img src="/images/2019/01/Screen-Shot-2019-01-19-at-9.13.28-AM.png" alt="The Google Docs menu bar" title="Google Docs' menu bar is inspired by desktop word processors"></p>
<p>In general the menu bar is not a common pattern across the web. Instead, we tend to hide controls behind hamburger menus or cryptic settings icons. So if it’s design prohibitive to add menu bars to every web app, is there a better alternative?</p>
<h2>Help!</h2>
<p>One of the most interesting and (literally) helpful buttons in the menu bar is <strong>Help</strong>. In particular, the <strong>Search</strong> field in the Help menu which acts as a <strong>command palette</strong>. Start typing in a command, and it will find it for you.</p>
<p><img src="/images/2019/01/Screen-Shot-2019-01-10-at-11.03.43-PM-2.png" alt="Using Evernote's Help menu to find the New Notebook command"></p>
<p>You can reach commands that do not have an associated keyboard shortcuts this way. And fuzzy search lets you guess the name of the command if you’re unsure.</p>
<p><img src="/images/2019/01/Screen-Shot-2019-01-10-at-11.14.42-PM-1.png" alt="Using fuzzy search to find the Attach Files... command which does not have a shortcut"></p>
<p>On the Mac you press <code>CMD + SHIFT + /</code> to open the Help menu. This means a user only needs to know one shortcut to access most of the functionality of <strong>any</strong> desktop app!</p>
<p>Thinking about this made a little lightbulb go off in my head 💡</p>
<blockquote>
<p>Why don’t web apps use command palettes to emulate the best parts of the OS menu bar? They’re a simple UI—just a modal autocomplete—that could have a big impact for users!</p>
</blockquote>
<h2>An example</h2>
<p>As a Googler, I live inside of the Gmail web app. Because the app has so much functionality, the Gmail team has provided a large set of keyboard shortcuts.</p>
<p><img src="/images/2019/01/Screen-Shot-2019-01-10-at-11.48.30-PM.png" alt="A partial list of Gmail's many shortcuts"></p>
<p>But shortcuts can be difficult to remember and typically only cover a subset of the functionality of an app.</p>
<p>Adding a Gmail filter is a task I do occasionally, but not frequently enough to remember a keyboard shortcut (btw, there isn’t one). And I always forget which settings menu it lives in. As it turns out, the command to add a filter is buried a few screens deep, creating a focus management conundrum. Wouldn’t it be a better experience if I could type <code>CMD + SHIFT + P</code> and <code>&quot;filter&quot;</code> to go straight there?</p>
<p>Could this improve the experience for users of assistive technology by giving them direct access to all of the commands an app supports—especially those tucked away in hard to discover modals and submenus?</p>
<p>While it’s important to still do the work of managing focus between states; providing a command palette <strong>as an additional affordance</strong> might have a big impact on UX.</p>
<h2>Has this been tried before?</h2>
<p>Sort of.</p>
<p><a href="https://twitter.com/sundress">Alice Boxhall</a> showed me both the <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/command">command</a> and <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/menuitem">menuitem</a> elements which were designed for creating custom context menus. Similarly there is the <code>contextmenu</code> event which you can use today to create your own custom menu—but the event only fires if the user right-clicks or presses the context menu key.</p>
<p>I think the context menu route is not the path we want to take.</p>
<p>I think what we want is closer to what VS Code and other editors provide. A fuzzy search text field that can be summoned by a single command.</p>
<p><img src="/images/2019/01/commands.png" alt="Visual Studio Code's command palette showing a list of commands"></p>
<p>How we go about doing this is an open question. My naive guess is that we might want browsers to standardize a command palette keyboard shortcut, like <code>CMD/CTRL + SHIFT + P</code> that triggers a <code>commandpalette</code> event. Triggering this event could also be done directly through assistive technology in whatever way is most efficient for the user.</p>
<p>It would be nice if there was a built-in, easy to style HTML element for handling the fuzzy text input, but designing that is its own can of worms 😅</p>
<h2>Closing thoughts</h2>
<p>Focus management is hard and there’s no agreed upon way to do it. While it is important to ensure that every UI state in your app is keyboard and screen reader accessible, it feels like command palettes could be a nice, additional UI affordance that all users would benefit from.</p>
<p>I’m curious to know if this idea resonates with folks. <a href="https://twitter.com/rob_dodson">Let me know your thoughts on twitter</a> and thanks for reading!</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Easily upgrade Ghost 0.x to 2.0</title>
    <link href="https://robdodson.me/posts/easily-upgrade-ghost-0-x-to-2-0/"/>
    <updated>2019-01-14T00:40:51+00:00</updated>
    <id>https://robdodson.me/posts/easily-upgrade-ghost-0-x-to-2-0/</id>
    <content type="html"><![CDATA[
      <p>Over the weekend I updated my ancient <a href="https://ghost.org/">Ghost</a> blog to version 2.0. This was harder than I expected so I wanted to share the strategy that worked for me.</p>
<p>This will require nuking your old server—which sounds scary, but is <em>so</em> much easier than upgrading it in place. If all you’re doing is running Ghost then it may be no big loss—it wasn’t for me at least 😛</p>
<p>If you’re doing a bunch of other stuff on your server then you may want to try a different guide.</p>
<p>It’s also worth mentioning that in this post I’ll use a one-click Ghost install on Digital Ocean so I don’t have to deal with setting everything up myself. I am lazy 🤤</p>
<h2>Backup</h2>
<ol>
<li>Go to the <strong>Labs</strong> section of your Ghost admin page (<code>yourblog.com/ghost</code>) and click export to get your JSON data. You’ll use this to recreate your posts.</li>
<li>Download your images. The easiest way to do this is with scp. <a href="https://devhints.io/scp">Here’s a little cheatsheet if you’re unfamiliar with it</a>.</li>
</ol>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token function">cd</span> /var/www/ghost/content</span><br><span class="highlight-line"><span class="token function">sudo</span> <span class="token function">zip</span> -r images.zip images    </span><br><span class="highlight-line"><span class="token function">scp</span> YOUR_USERNAME@YOUR_SERVER_IP:/var/www/ghost/images.zip /local/path/to/file</span></code></pre>
<p>You can attempt to download your theme as well but if you’re going from 0.x to 2.0 I think there’s a <em>really good chance</em> it will not work.</p>
<h2>Locally migrate your post data</h2>
<p><strong>This step is key</strong>. You can’t just import Ghost 0.x data into a Ghost 2.0 blog. You first have to import it into a Ghost 1.0 blog, export it again, and import <em>that</em> JSON into the 2.0 blog.</p>
<p>I tried to setup Ghost 1.0 on my previous server but it was a pain. I was running Ubuntu 14 but Ghost CLI will blow up if you’re not running Ubuntu 16 or above. Better to just do these steps locally.</p>
<p>You’ll need to install the <a href="https://docs.ghost.org/api/ghost-cli/">ghost-cli</a> and create a local version of Ghost 1.0. You’ll also want to make sure you’re running Node 8 or above.</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">node --version <span class="token comment"># hopfully >=8, otherwise upgrade node first</span></span><br><span class="highlight-line"><span class="token function">npm</span> <span class="token function">install</span> -g ghost-cli</span><br><span class="highlight-line"><span class="token function">mkdir</span> ghost-v1</span><br><span class="highlight-line"><span class="token function">cd</span> ghost-v1</span><br><span class="highlight-line">ghost <span class="token function">install</span> --v1</span></code></pre>
<p>This should fire up a server on <code>localhost</code> that you can access to setup your blog. Once you’ve done that, go to the <strong>Labs</strong> section of the Ghost admin page and import the JSON you downloaded earlier. You may see some warnings but I was able to safely ignore these. They seem related to duplicate content from 0.x to 1.0.</p>
<p>You can also replace the <code>content/images</code> directory with the one you downloaded from your old server.</p>
<p>If all goes well you should be able to preview your content in the Ghost 1.0 casper theme.</p>
<p>Finally, in the Labs section use the export command to retrieve your Ghost 1.0 JSON. You don’t need to mess with the images because Ghost 0.x, 1.0, and 2.0 all seem to use the same directory structure for <code>/images</code>.</p>
<h2>Create a new Droplet</h2>
<p>If you use DigitalOcean or another service that provides one-click installs, now’s the time to create a new Ghost 2.0 instance, ideally running on Ubuntu 18.</p>
<p>Grab the IP for the new server but don’t log into it just yet.</p>
<h2>Setup DNS and SSL</h2>
<p>Go to your domain registrar and update your records to point at the IP for your new server. If you have a simple setup then you may just need to update the <code>A</code> record. It will take a while for the DNS to propagate (~15 minutes to an hour).</p>
<p>You can use <a href="https://dnschecker.org/">a DNS checker</a> to verify that the domain is pointing at your server’s IP.</p>
<h2>Login to the new server</h2>
<p>When you first login the server <em>should</em> kickoff the ghost CLI install step. It will walk you through a few steps similar to the ones you did during the previous local install. Once it’s finished, sign in to your Ghost admin, import your JSON, and use <code>scp</code> to copy over your images.</p>
<p>If all goes according to plan then you should be done. Yay! 🎉</p>
<p>As a last step you should consider doing some server hardening on your new Ghost instance. <a href="https://robferguson.org/blog/2017/08/12/migrating-from-ghost-0-x-to-ghost-1-x/#serverhardening">This guide by Rob Ferguson</a> seems like a good next step.</p>
<p>I hope this blog post helps those of you in the same boat as me. Good luck!</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Which elements support shadow DOM?</title>
    <link href="https://robdodson.me/posts/which-elements-support-shadow-dom/"/>
    <updated>2019-01-13T16:56:36+00:00</updated>
    <id>https://robdodson.me/posts/which-elements-support-shadow-dom/</id>
    <content type="html"><![CDATA[
      <p><a href="https://twitter.com/Oliver41618769/status/1084275850441355265">Oliver on twitter asked</a>:</p>
<blockquote>
<p><em>Is there a list somewhere of which HTML elements can and can’t have a shadow DOM?</em></p>
</blockquote>
<p>As it turns out, there is! (Big thanks to <a href="https://annevankesteren.nl/">Anne van Kesteren</a> for <a href="https://twitter.com/annevk/status/1084426928965238787?s=19">showing us the way</a>).</p>
<blockquote>
<p>If <a href="https://dom.spec.whatwg.org/#context-object">context object</a>’s <a href="https://dom.spec.whatwg.org/#concept-element-local-name">local name</a> is <strong>not</strong> a <a href="https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name">valid custom element name</a>, <code>article</code>, <code>aside</code>, <code>blockquote</code>, <code>body</code>, <code>div</code>, <code>footer</code>, <code>h1</code>, <code>h2</code>, <code>h3</code>, <code>h4</code>, <code>h5</code>, <code>h6</code>, <code>header</code>, <code>main</code>, <code>nav</code>, <code>p</code>, <code>section</code>, or <code>span</code>, then <a href="https://heycam.github.io/webidl/#dfn-throw">throw</a> a <code>NotSupportedError``DOMException</code>.</p>
</blockquote>
<p>Here’s a quick example using <code>div</code>:</p>
<div class="glitch-embed-wrap" style="height: 420px; width: 100%;">
  <iframe
    src="https://glitch.com/embed/#!/embed/shadow-dom-elements?path=script.js&previewSize=100"
    title="shadow-dom-elements on Glitch"
    allow="geolocation; microphone; camera; midi; vr; encrypted-media"
    style="height: 100%; width: 100%; border: 0;"
  ></iframe>
</div>
<h2>Exceptions</h2>
<p>It’s worth calling out that <code>button</code>, <code>input</code>, <code>select</code>, <code>img</code>, and <code>a</code> are not on this list and will throw an error if you try to attach a shadow root to them. If you need to use them you’ll probably need to look into either wrapping these elements or using <a href="https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements#High-level_view">a type extension</a>.</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Why you can&#39;t test a screen reader (yet)!</title>
    <link href="https://robdodson.me/posts/why-you-cant-test-a-screen-reader-yet/"/>
    <updated>2018-01-02T17:42:55+00:00</updated>
    <id>https://robdodson.me/posts/why-you-cant-test-a-screen-reader-yet/</id>
    <content type="html"><![CDATA[
      <p>When I first started to learn about accessibility I wanted to write automated tests to ensure that assistive technology devices, like screen readers, were interpreting my pages correctly. Because I’m not a daily screen reader user, I figured it would be easy for a regression to slip in unnoticed.</p>
<p>This idea, testing a screen reader, proved much harder than I thought. It’s actually a bit of a holy grail in the accessibility space. Something that many have dreamed of, but few—if any—have achieved.</p>
<p>To understand why this is, it helps to know a bit about the process your page goes through when it finally gets announced by a screen reader.</p>
<h2>The Accessibility Tree</h2>
<p>When Chrome parses the DOM and the CSSOM it produces a tree of nodes. You may have heard folks on my team refer to this as the <strong>render tree</strong>. It tells the browser what to paint on screen, and when to omit things hidden by CSS.</p>
<p>But what many don’t know is that during this process there’s a second tree created called the <strong>accessibility tree</strong>. This tree removes all the nodes which are semantically uninteresting and computes the roles/states/properties for the remaining nodes. Similar to the render tree, it will also remove nodes hidden by CSS.</p>
<p>So, given the following HTML:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>How old are you?<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>label</span> <span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>age<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Age<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>label</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>age<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>age<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>42<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span><span class="token punctuation">></span></span>Back<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span><span class="token punctuation">></span></span>Next<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>Chrome would produce an accessibility tree that looks something like:</p>
<pre class="language-text"><code class="language-text"><span class="highlight-line">id=1 role=WebArea name="How old are you?"</span><br><span class="highlight-line">    id=2 role=Label name="Age"</span><br><span class="highlight-line">    id=3 role=TextField labelledByIds=[2] value="42"</span><br><span class="highlight-line">    id=4 role=Group</span><br><span class="highlight-line">        id=5 role=Button name="Back"</span><br><span class="highlight-line">        id=6 role=Button name="Next"</span></code></pre>
<p>Next Chrome needs to convert these nodes into something the user’s operating system can understand. On Windows it will produce a tree of IAccessible objects, and on macOS it will use NSAccessibility objects. Finally, this tree of OS-specific nodes gets handed off to a screen reader, which interprets it, and chooses what to say.</p>
<p><em>If you’re really interested, you can check out <a href="https://chromium.googlesource.com/chromium/src/+/lkgr/docs/accessibility/overview.md">this doc which explains a lot more about how accessibility works in Chromium</a>.</em></p>
<p>So it’s pretty tricky to know what any specific browser + OS + screen reader combo will announce. There are differences in how each browser builds its accessibility tree, there are differences in how well each browser supports ARIA, and there are differences in how the various screen readers interpret the information browsers give to them. Oof!</p>
<h2>So how do we test this stuff?</h2>
<p>Rather than test what a screen reader announces, a better place to start might be to test the accessibility tree itself. This avoids some of the layers of indirection mentioned above.</p>
<p>If you <a href="https://twitter.com/rob_dodson">follow me on twitter</a>, you’ve probably heard me mention a new standard we’re working on called the <a href="https://github.com/wicg/aom">Accessibility Object Model</a> or “AOM”, for short. There are a number of features AOM seeks to achieve, but one that I’m most excited about is the ability to compute the accessibility information for a given node.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">const</span> <span class="token punctuation">{</span>role<span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token keyword">await</span> window<span class="token punctuation">.</span><span class="token function">getComputedAccessibleNode</span><span class="token punctuation">(</span>element<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token function">assert</span><span class="token punctuation">(</span>role<span class="token punctuation">,</span> <span class="token string">'button'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p><em>Note, this API is still being sketched out so the final version may be different from the snippet above.</em></p>
<p>When this lands (hopefully in 2018) we should be able to start writing unit and integration tests that ensure our components are properly represented in the browser’s accessibility tree. That’s pretty darn close to Holy Grail territory!</p>
<p>Aside from AOM, there are linters and auditors we can use today, like <a href="https://github.com/evcohen/eslint-plugin-jsx-a11y">eslint-plugin-jsx-a11y</a>, <a href="https://developers.google.com/web/tools/lighthouse/">Lighthouse</a>, <a href="https://github.com/dequelabs/axe-core">axe</a>, and <a href="http://pa11y.org/">pa11y</a>. Ultimately we’ll want to use a combination of these tools plus AOM tests to monitor the accessibility of our apps. If you haven’t seen Jesse Beach’s talk, <a href="https://www.youtube.com/watch?v=vmA4TS3IbVQ">Scaling accessibility improvements with tools and process at Facebook</a>, I recommend you give it a look to see how an organization the size of Facebook is integrating these tools into their process.</p>
<p>To wrap up, I think testing the output of a screen reader may still be a ways off, but in 2018 we’re going to have more tools in our toolbox than ever before. If you want to learn more about accessibility fundamentals you can check out this <a href="https://bit.ly/web-a11y">free Udacity course</a> and if you’d like to start incorporating more accessibility work into your team practice take a look at <a href="https://www.youtube.com/watch?v=A5XzoDT37iM">my session from this year’s Google I/O</a>. I’m really excited to see what you all build in 2018 😁</p>
<p>Happy new year!</p>
<p>Rob</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Hello, 2018!</title>
    <link href="https://robdodson.me/posts/hello-2018/"/>
    <updated>2018-01-01T20:29:49+00:00</updated>
    <id>https://robdodson.me/posts/hello-2018/</id>
    <content type="html"><![CDATA[
      <h2>Goodbye, 2017</h2>
<p><img src="/images/2018/01/08_07_GettyImages-632318086.jpg" alt="Thousands of protestors at the Women's March in Washington D.C. The capitol building is in the background." title="The Women's March on Washington"></p>
<h3>Politics</h3>
<p>The year opened with a lot of protests and rallies. We rallied at the SF city hall, the Women’s March in Oakland, at San Francisco Airport, and even at the Google Campus. It was intense. When the riot police showed up at SFO while folks were banging on the security barriers I wondered if it was only a matter of time before they tear gassed us. Thankfully that didn’t happen.</p>
<p>2017 made me realize how much we’ve been asleep at the wheel, just letting politics happen, assuming that somehow it would all work out in the end. I’m very thankful for organizations like <a href="https://www.runforsomething.net">Run for Something</a>, <a href="https://swingleft.org/">SwingLeft</a>, <a href="https://www.indivisible.org/">Indivisible</a>, and <a href="https://crooked.com/">Crooked Media</a>. If I had to recommend one person to follow on twitter it would be <a href="https://twitter.com/Celeste_pewter">Celeste Pewter</a>. I love her daily briefings, and 2017 was the first year I started phoning my reps to tell them when I thought they were doing good (or bad).</p>
<h3>Travel</h3>
<p>I went to Australia, Peru, Denmark, Japan, and Rwanda. Each of these trips was an awesome adventure. I realize I’ve now been to every continent except Antartica, which I really want to go to. To be 100% honest, I’m not the best traveler. I get really anxious when I don’t speak the language, and nervous about walking around a city I don’t know. Over time I’ve gotten better about this and in 2017 I started to feel more comfortable in unfamiliar places. But I think I still have a ways to go before I’m fully embracing the whole globetrotter thing.</p>
<h3>Work</h3>
<p>On the work front, I took on more of an ownership role for both Web Components and Accessibility. I co-presented at CSUN and worked the Google booth—which was super fun! I think the most rewarding thing this past year has been all the folks who meet me for the first time and say “I did <a href="bit.ly/web-a11y">your accessibility course</a> on Udacity!” It took Alice and I about a year to put that course together. It was <em>so.**much.**work.</em> We would send each other messages like “oh god I still have 30 slides to make [cries face down on the floor].” But we toughed it out, and even though there are bits I’d like to improve upon, I’m pretty happy with the result.</p>
<p>Speaking of <a href="https://twitter.com/sundress">Alice</a>, I wanted to thank her for helping me so much in 2017. Not only did she introduce me to the topic of accessibility, and basically teach me everything I know, but she also:</p>
<ul>
<li>Proofread and edited my blog posts before they went out. Making major revisions so they sounded much smarter than originally authored.</li>
<li>Helped lead the AOM, :focus-ring, and inert standards discussions and polyfills.</li>
<li>Shipped new accessibility devtools in Chrome which everyone can use in version 63.</li>
<li>And, helped teach me C++ (more on this in a moment).</li>
</ul>
<p>She’s just awesome, and an incredibly strong person who has really pushed me to see the world differently. Thank you Alice!</p>
<p>At the tail end of the year I was promoted (yay!) so I’m now a “Staff Developer Advocate”. On January 13th, I’ll have been at Google for four years, which is the longest I’ve ever worked at the same place. I love my job and the opportunity it affords me to just go all in on the things I’m excited about. The folks around me are awesome and always supportive and pushing me to be better. I really am lucky to have such amazing coworkers and I’m very excited to work with the new folks who will be joining the team in 2018.</p>
<h2>Hello, 2018!</h2>
<p><img src="/images/2018/01/goldengate.jpg" alt="The golden gate bridge at sunrise."></p>
<h3>Personal stuff</h3>
<p>In December my wife accepted a job at Highland Hospital in Oakland, so soon we’ll be moving from Palo Alto up to either Oakland or Berkeley. For years we’ve been unable to really put down roots because with medical school, residency, possible fellowship, etc. it was always assumed that every three years we would need to move to a new city. But now that she’s accepted a full time role at Highland, we know we’ll be staying in the Bay Area. I am stoked.</p>
<h3>Work</h3>
<p>To start the year I’ll be doing a software engineering rotation with the Chrome Accessibility team. This means I’ll spend all of Q1 acting as a member of their team instead of working in developer relations. I’ve been picking up as much C++ as I can, and trying to wrap my head around Chromium. I’m a bit nervous because I’ve never worked in C++ and I really want to do a good job. I’m excited because I’ll get to work directly on a few things I’ve been evangelizing <em>and</em> when I switch back to developer relations, later in the year, I’ll have a much deeper understanding of accessibility. I’m thrilled to talk about all the things I don’t even know about yet!</p>
<h3>Politics</h3>
<p>2018 feels like a really momentous year to me. I am excited and nervous at the same time. Obviously the political scene is going to be an all out slugfest, but I’m looking forward to that. Upon reflection, I think we needed this wake up call so we could get our act together when it comes to things like universal healthcare. It’s deeply unpleasant having Donald Trump as president, but U.S. politics is cyclical, and in 2018 we push back.</p>
<h2>Resolutions</h2>
<p>When it comes to resolutions I prefer having very specific goals, as opposed to really broad things like “work out more”. I think when you have an actual target then you can feel yourself making progress and that measure of progress becomes its own motivating factor.</p>
<p>Let’s start with the exciting personal stuff:</p>
<h3>Buy a house.</h3>
<p>Yes, Bay Area housing prices are… steep, to put it mildly, but my wife and I have been saving up for a few years and we’re really excited to finally own a place of our own. There’s all sorts of nerdy things I want to do, like put up solar panels. Stuff you just can’t really do with a rental. But most importantly, it will unlock my next resolution…</p>
<h3>Get a doggo (or 2).</h3>
<p>It’s actually really hard to find a rental in the Bay Area that will allow dogs. This sucks because I love dogs. If you follow me on twitter you may have noticed that my feed is like 90% dog gifs, and 20% web stuff and politics. I really want to get two dogs because I want to make sure they each have a buddy. I have already decided on their names. This is happening.</p>
<h3>Create an Instagram account</h3>
<p>OK I realize this isn’t that exciting and that I’m the last person to not have an Instagram account. Currently my phone has <em>a ton</em> of travel photos but I never share them. It seems kind of silly to take all these photos and never really look at them or share them with anyone. In 2018 I plan to change that. Get ready to be spammed.</p>
<h3>Dress better.</h3>
<p>There’s just something about walking into an important meeting with a shirt that says <a href="https://cdn.shopify.com/s/files/1/0251/5984/products/trust-me-im-a-dogtor-doctor-shirt-1.jpg?v=1471242400">“Trust me, I’m a dogtor”</a> that makes me think people aren’t taking me seriously. So no more t-shirts with random company logos, or hoodies.</p>
<h3>Run a half marathon.</h3>
<p>In 2017 (or maybe it was 2016?) I started the year with a goal of being able to consistently run a 5K. Prior to that, I’d maybe jog once a year, hate it—deeply, and then resolve to getting swole some other way. But working toward that 5K goal really helped me develop a love of running. I still get shin splints if I run too frequently, and I’ve been a couch potato cuz it’s cold outside, but in 2018 I’m setting out to do a half marathon. One thing I’ve recently discovered is listening to books on tape while you run is pretty awesome. I’m currently listening to <a href="https://www.amazon.com/Too-Far-Home-Story-Death/dp/0385514654">Too Far From Home</a> and really enjoying it.</p>
<h3>Boulder at a V4 level.</h3>
<p>I started bouldering a few years ago, and over the past year I’ve managed to get up to where I can climb some V3s. I’m not going consistently enough right now, so that has to change if I want to get to the V4 level. Maybe 2-3 times a week would be enough.</p>
<h3>Write a will and document my medical directives.</h3>
<p>OK, so this is one of those very unfun adult things that nobody wants to do but both are <em>incredibly</em> important. Because my wife works inpatient medicine (meaning, inside the hospital) I’ve heard countless stories of families being in a situation where they have to decide whether or not to intubate someone. Thinking about this stuff is scary, but it would break my heart for my wife or family to be in a situation where they have to make a decision about me and they don’t know what my wishes are. To spare my loved ones any undue anguish, I want to make sure I have all this stuff sorted out, just in case.</p>
<h3>Volunteer at organizations to promote inclusivity in tech.</h3>
<p>Our industry is a total monoculture. I’m not happy with the current state of things and I want to do my part to change that. In 2018 I plan to find organizations that help promote diversity and inclusivity in tech, and do whatever I can to help them out. This could include speaking, or being a teaching assistant, or connecting those groups with folks at Google who work in their area of interest. Whatever it takes, I want to make sure I’m moving the needle on this.</p>
<h3>Get (even more) involved in politics.</h3>
<p>Obviously this year is a big one because of the midterm elections. In California we have the <a href="https://secure.actblue.com/donate/crookedseven">“Crooked Seven”</a> that need to be voted out of office. This is where I’ll be focusing all of my political energy. Text or phone banking, maybe driving over to Modesto to knock on doors, whatever it takes.</p>
<h3>Release a game a quarter.</h3>
<p>I’ve always secretly dreamed of being an indie game maker. When I read <a href="http://daverupert.com/2017/12/twenty-seventeen/">Dave Rupert’s 2017 year in review</a> he mentioned that he (secretly) has been trying to release a game a quarter. I think this is a great goal and one I’m planning to aspire to as well. I figure the games don’t have to be big, but they do have to be “complete” which means pushing through all the unfun bits. I’ve already started making <a href="https://twitter.com/rob_dodson/status/947626484427980800">my first game, a simple tilt maze</a> and I have a ton of ideas for where I’d want to take it. The hard part will be editing that list down, and doing the production work to actually create a handful of levels and something that feels like it has a beginning, middle, and end.</p>
<h2>ONWARD!</h2>
<p>This post ended up being <em>way longer</em> than I originally expected. I guess that’s what happens when you drink too much coffee and have the house all to yourself. I’m really looking forward to this year and hope you are too. Now it’s time to go work on that half marathon. Happy new year! 👟</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>The future of accessibility for custom elements</title>
    <link href="https://robdodson.me/posts/the-future-of-accessibility-for-custom-elements/"/>
    <updated>2017-10-02T20:17:28+00:00</updated>
    <id>https://robdodson.me/posts/the-future-of-accessibility-for-custom-elements/</id>
    <content type="html"><![CDATA[
      <p>When users of assistive technology, like a screen reader, navigate a web page, it’s vitally important that the semantic meaning of the various controls is communicated.</p>
<p>For example, if a screen reader visits a login button:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span><span class="token punctuation">></span></span>Sign in<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">></span></span></span></code></pre>
<p>—it would announce, “Sign in, button”. This tells the user about the affordance available to them—whether something is a button that may be pressed, for example, or if it’s just a block of text content with no other semantics.</p>
<p>Additionally, built-in elements support keyboard-based usage, which is important for users who can’t use a pointing device—whether they are unable to see the pointer, or don’t have the physical ability. This is why accessibility experts always urge developers to mark up their pages with the built-in elements.</p>
<p><a href="https://developers.google.com/web/fundamentals/web-components/customelements">Custom elements</a>, by contrast, have no implicit semantics or keyboard support.</p>
<p>When you define a new tag, the browser really has no way of knowing if you’re trying to build a button, or a slider, or just a fancy text container. Adding these features back in requires a fair bit of work on the developer’s part and it can be difficult to reach parity with the native equivalents.</p>
<h2><code>&lt;howto-component&gt;</code></h2>
<p>Recently we launched a project called <a href="https://github.com/GoogleChromeLabs/howto-components">HowTo: Components</a> which demonstrates how to build accessible custom elements. Many folks have since asked us why we’re bothering to implement things like <a href="https://github.com/GoogleChromeLabs/howto-components/tree/master/elements/howto-checkbox">checkbox</a> since there is already an accessible, native version.</p>
<p>Taking an even cursory look at any web framework shows that developers are going to keep building custom checkboxes, even though it’s arguably more work than using a built-in element. We’ll get to why that is in a moment, but given that’s the case, we’d like to educate developers on the best practices for doing so. Here we take inspiration from the <a href="https://www.w3.org/TR/wai-aria-practices-1.1/">ARIA Authoring Practices Guide</a>, and in fact all of the HowTo: Components are based on their examples. We just want to illustrate how to do them as custom elements.</p>
<p>So, why do developers keep reinventing this wheel?</p>
<h2>Built-in elements are great. Until you try to style them.</h2>
<p><code>&lt;input&gt;</code> is like the Swiss Army Knife of elements. It contains multiple different types (text, date, file…) and each of them is difficult to style. Have you ever tried to style an <code>&lt;input type=&quot;file&quot;&gt;</code>? It <strong>sucks</strong>. Here’s how Mark Otto, co-creator of Bootstrap, recommends styling them on his site, <a href="http://wtfforms.com">wtfforms</a>:</p>
<blockquote>
<p>The file input is the most gnarly of the bunch. Here’s how it works:</p>
</blockquote>
<blockquote>
<ul>
<li>We wrap the <code>&lt;input&gt;</code> in a <code>&lt;label&gt;</code> so the custom control properly triggers the file browser.</li>
<li>We hide the default file <code>&lt;input&gt;</code> via <code>opacity</code>.</li>
<li>We use <code>:after</code> to generate a custom background and directive (Choose file…).</li>
<li>We use <code>:before</code> to generate and position the Browse button.</li>
<li>We declare a height on the <code>&lt;input&gt;</code> for proper spacing for surrounding content.</li>
<li>We add an explicit label text for assistive technologies with an <code>aria-label</code> attribute.</li>
</ul>
</blockquote>
<blockquote>
<p>In other words, it’s an entirely custom element, all generated via CSS.</p>
</blockquote>
<p>Not fun. I think a large reason so many sites are inaccessible is because developers run into these styling limitations and decide to just roll their own controls—without adding back in the necessary semantics and keyboard support.</p>
<blockquote>
<p>So why is it so hard to style the built-in form elements? Can’t browsers make this as easy as styling a <code>&lt;div&gt;</code> or an <code>&lt;h1&gt;</code>?</p>
</blockquote>
<p>Not really. Elements like <code>&lt;input&gt;</code> and <code>&lt;select&gt;</code> aren’t always implemented in terms of regular DOM elements. Sometimes they are, which is why there are articles on CSS hacks for styling <code>&lt;input type=&quot;range&quot;&gt;</code>. Other times they are rendered directly by the operating system - this is why a standard <code>&lt;select&gt;</code> comes up looking like any other native drop-down list on the platform you’re using. They are specified as a kind of black box, meaning it’s up to the browser to figure out their internals, so exposing styling hooks for them is quite difficult and often very limited. It is entirely possible that <strong>we may never be able to style these elements to the degree we want</strong>.</p>
<p>The alternative is to expose the magic behavior that these elements have as new web platform APIs. Not only will this allow us to create more flexible versions of <code>&lt;input&gt;</code> and <code>&lt;select&gt;</code>, but we can also expand the grammar to include other elements like <code>&lt;multi-select-autocomplete-thing&gt;</code>.</p>
<p>This is why I am so passionate about custom elements. In my mind, it is where the future of accessibility lives. I deeply want to be able to stop hacking CSS on top of <code>&lt;select&gt;</code>. I want to make my own badass, extensible, styleable, accessible elements that are just as good as the built-ins!</p>
<p>So as well as modeling best practices with today’s technologies, I’m hoping that HowTo: Components can help us identify areas where we can create better APIs for the next generation of web technology. We want to get to a point where we’re not forced to choose between the impossible task of styling the existing set of built-in elements, or the fiddly, error-prone and largely forgotten job of re-implementing accessibility for every new custom element.</p>
<h2>How do we get there?</h2>
<p>The first step is to make sure our custom elements have the right semantics.</p>
<p>I’m excited for the potential of the new <a href="https://github.com/wicg/aom">Accessibility Object Model (AOM)</a> proposal to help us out here. AOM lets an element define its semantics directly in the accessibility tree.</p>
<p>What’s the accessibility tree you ask? Ah ha! <a href="https://developers.google.com/web/fundamentals/accessibility/semantics-builtin/the-accessibility-tree">We have a article for you!</a></p>
<p>As I mentioned before, a custom element is, semantically speaking, just a <code>&lt;span&gt;</code>, whereas the native <code>&lt;button&gt;</code> element has built-in accessibility because it has an implicit role of “button”. While we could have our <code>&lt;custom-button&gt;</code> sprout ARIA attributes to define its semantics, this can get ugly fast. To recreate a <code>&lt;input type=&quot;slider&quot;&gt;</code> as a custom element would end up looking like:</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>custom-slider</span><br><span class="highlight-line">  <span class="token attr-name">min</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span></span><br><span class="highlight-line">  <span class="token attr-name">max</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>5<span class="token punctuation">"</span></span></span><br><span class="highlight-line">  <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>3<span class="token punctuation">"</span></span></span><br><span class="highlight-line">  <span class="token attr-name">role</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>slider<span class="token punctuation">"</span></span></span><br><span class="highlight-line">  <span class="token attr-name">tabindex</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span></span><br><span class="highlight-line">  <span class="token attr-name">aria-valuemin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span></span><br><span class="highlight-line">  <span class="token attr-name">aria-valuemax</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>5<span class="token punctuation">"</span></span></span><br><span class="highlight-line">  <span class="token attr-name">aria-valuenow</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>3<span class="token punctuation">"</span></span></span><br><span class="highlight-line">  <span class="token attr-name">aria-valuetext</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>3<span class="token punctuation">"</span></span></span><br><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>custom-slider</span><span class="token punctuation">></span></span></code></pre>
<p>And because ARIA is exclusively an HTML attributes API, it means we need to touch the DOM every time we want to update our semantic state. For an individual element this isn’t so bad, but if you have hundreds of controls (perhaps inside of a table or list), having each of them call <code>setAttribute()</code> multiple times at startup could lead to a performance bottleneck.</p>
<p>With AOM your element can just define its semantics in its constructor like so:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">class</span> <span class="token class-name">CustomSlider</span> <span class="token keyword">extends</span> <span class="token class-name">HTMLElement</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function">constructor</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">super</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>accessibleNode<span class="token punctuation">.</span>role <span class="token operator">=</span> <span class="token string">'slider'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>accessibleNode<span class="token punctuation">.</span>valueMin <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>accessibleNode<span class="token punctuation">.</span>valueMax <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>accessibleNode<span class="token punctuation">.</span>valueNow <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>accessibleNode<span class="token punctuation">.</span>valueText <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>—and the consumer of your element doesn’t have to see it sprouting attributes all over the place. Effectively, <code>&lt;input type=&quot;slider&quot;&gt;</code> and <code>&lt;custom-slider&gt;</code> become indistinguishable at the semantic level.</p>
<p>Some folks have even proposed giving custom elements access to a special “private” <code>accessibleNode</code> so the author can define immutable default semantics. This would mean that one could safely override an element’s role, then delete that override, and things would safely fallback. For example:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// default role is "slider"</span></span><br><span class="highlight-line"><span class="token comment">// set using private accessibleNode by the element author</span></span><br><span class="highlight-line"><span class="token operator">&lt;</span>custom<span class="token operator">-</span>slider id<span class="token operator">=</span><span class="token string">"mySlider"</span><span class="token operator">></span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// element consumer changes role to "button"</span></span><br><span class="highlight-line">mySlider<span class="token punctuation">.</span>accessibleNode<span class="token punctuation">.</span>role <span class="token operator">=</span> <span class="token string">"button"</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// element consumer nulls role</span></span><br><span class="highlight-line">mySlider<span class="token punctuation">.</span>accessibleNode<span class="token punctuation">.</span>role <span class="token operator">=</span> <span class="token keyword">null</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// element falls back to default role</span></span><br><span class="highlight-line"><span class="token function">getComputedAccessibility</span><span class="token punctuation">(</span>mySlider<span class="token punctuation">.</span>accessibleNode<span class="token punctuation">)</span><span class="token punctuation">.</span>role <span class="token comment">// returns 'slider'</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// note: the ability to compute the accessibility tree is</span></span><br><span class="highlight-line"><span class="token comment">// a phase 4 AOM proposal. The line above is pseudo code :)</span></span></code></pre>
<h2>But wait, there’s more…</h2>
<p>Another major pain point of using ARIA is the fact that all relationships must be defined using ID references. On numerous projects I’ve had to auto-generate unique IDs to make this system work:</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>custom-listbox</span><br><span class="highlight-line">  <span class="token attr-name">role</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>listbox<span class="token punctuation">"</span></span></span><br><span class="highlight-line">  <span class="token attr-name">aria-describedby</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>generated-id1 generated-id2<span class="token punctuation">"</span></span></span><br><span class="highlight-line">  <span class="token attr-name">aria-activedescendant</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>generated-id3<span class="token punctuation">"</span></span></span><br><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>custom-listbox</span><span class="token punctuation">></span></span></code></pre>
<p>Furthermore, new standards like <a href="https://developers.google.com/web/fundamentals/web-components/shadowdom">Shadow DOM</a> create scoping boundaries for IDs. If you need to point <code>aria-labelledby</code> or <code>aria-activedescendant</code> at something on the other side of this shadow boundary, you’re out of luck!</p>
<p>AOM fixes this by allowing you to build relationships using object references. In the above example we could rewrite our listbox with:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">el<span class="token punctuation">.</span>accessibleNode<span class="token punctuation">.</span>describedBy <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">AccessibleNodeList</span><span class="token punctuation">(</span><span class="token punctuation">[</span></span><br><span class="highlight-line">  accessibleNode1<span class="token punctuation">,</span></span><br><span class="highlight-line">  accessibleNode2<span class="token punctuation">,</span></span><br><span class="highlight-line"><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">el<span class="token punctuation">.</span>accessibleNode<span class="token punctuation">.</span>activeDescendant <span class="token operator">=</span> accessibleNode3<span class="token punctuation">;</span></span></code></pre>
<p>The <code>accessibleNodes</code> in the above example just come from referencing other elements on the page. No more generated IDs or cluttering up the DOM. Nice!</p>
<h2>Wait, wasn’t there something called is=”” for custom elements?</h2>
<p>A counter proposal to adding all of these semantics yourself is to just inherit from the built-in elements. For custom elements this idea was specced as “<a href="https://developers.google.com/web/fundamentals/web-components/customelements#extendhtml">customized built-ins</a>”. With customized built-ins you could inherit from something like <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement">HTMLInputElement</a> and then do <code>&lt;input is=”custom-checkbox”&gt;</code>.</p>
<p>Unfortunately customized built-ins have not really caught on with all of the browsers, mainly because they suffer from a few gnarly issues. Chief among these is the fact that if you inherit from another element like <code>&lt;select&gt;</code>, and add your own shadow root, it will blow away all of the default styling and behavior of the element. Since the primary reason you were extending the element in the first place was probably to style it, this just ends up creating more problems.</p>
<p>I think in the near term, new primitives like AOM and an <a href="https://github.com/w3c/webcomponents/issues/187">as of yet unspecified form submission callback</a> offer a better alternative when it comes to replicating the built-in elements. Because custom elements still require JavaScript to boot up there are still open questions around progressive enhancement, but my hope is that increasingly exposing primitives will help us find other ways to solve that issue.</p>
<h2>Wrapping up</h2>
<p>These are not entirely custom element concerns. Really, any component (React, Angular, etc) should be able to benefit from proposals like AOM. But custom elements are the only <em>standards-based</em> way to define a component that can be shared amongst frameworks, so solving things at that level seems very useful.</p>
<p>Our plan with HowTo: Components is to continue to build custom element equivalents of the built-ins so we can educate developers, and push these standards forward. We’ll also be updating the docs to <a href="https://github.com/GoogleChromeLabs/howto-components/pull/121">explicitly call out the limitations</a> custom elements currently face, and when using a built-in might make more sense. We would love help landing all of the <a href="https://www.w3.org/TR/wai-aria-practices-1.1/">ARIA Authoring Practices examples</a> as custom elements and plan to push things even further in future quarters by exploring more complex widget types. If you’re interested in pitching in, please feel free to open up a pull request over at the <a href="https://github.com/GoogleChromeLabs/howto-components">HowTo: Components repo</a> and if you want to learn more about AOM you can check it out in <a href="https://github.com/wicg/aom">the Web Incubation Community Group repo</a>.</p>
<p><em>Big thanks to <a href="https://twitter.com/sundress">Alice Boxhall</a>, <a href="https://twitter.com/gauntface">Matt Gaunt</a>, and <a href="https://twitter.com/dassurma">Surma</a> for reviewing this blog post.</em></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>How to use Polymer with Webpack</title>
    <link href="https://robdodson.me/posts/how-to-use-polymer-with-webpack/"/>
    <updated>2017-07-17T18:28:54+00:00</updated>
    <id>https://robdodson.me/posts/how-to-use-polymer-with-webpack/</id>
    <content type="html"><![CDATA[
      <h2>Introduction</h2>
<p>Over the last year I’ve had a number of discussions with mid to large sized companies who are interested in creating common UI libraries that all of their teams can share. Often these teams are on different stacks (React, Vue, Angular, etc.) so using something like Web Components and Polymer makes sense, as all of these frameworks can consume and communicate with Web Components.</p>
<p>Most frameworks tend to rely on ES Modules or CommonJS and tools like Webpack to bundle their code. Polymer, on the other hand, uses HTML Imports. This means developers who want to use the two together will need to reconcile how things get bundled and the order in which they’re loaded.</p>
<p>But Webpack can already understand multiple file formats (.css, .tsx, etc). So could it be extended to understand HTML imports? Sure, why not! Today I’m really excited to show off <a href="https://github.com/webpack-contrib/polymer-webpack-loader">polymer-webpack-loader</a>, a new tool which consumes HTML Imports and outputs modules ready for Webpack. Not only does this make it much easier to use Polymer with other frameworks, but it also adds interesting new features to Polymer like the ability to use ES Module <code>import</code> syntax to pull in code installed via npm.</p>
<p>Before I get too ahead of myself I want to point out that this is not an official Polymer project—Polymer isn’t “going all in on Webpack” or anything like that—this is just an awesome tool created by two community members, <a href="https://github.com/bryandcoulter">Bryan Coulter</a> and <a href="https://github.com/ChadKillingsworth">Chad Killingsworth</a>, that solves a pain point a number of developers have encountered. Although the project is still in a beta phase, I thought it would be cool to do a short write up so members of the Polymer community can kick the tires and give it some feedback.</p>
<h2>Who is this for?</h2>
<p>Before jumping into the nitty gritty, I wanted to first identify which users would benefit the most from this tool. If you’re already using the Polymer CLI or polymer-build, and you’re happy with your project, then by all means stick with them! They’re great tools that do awesome stuff 😁</p>
<p>polymer-webpack-loader will be most beneficial for anyone who:</p>
<ul>
<li>Is integrating Polymer elements as part of a larger project that uses a different framework.</li>
<li>Wants to use <code>import</code> syntax to leverage npm packages in their Polymer elements.</li>
<li>Wants to use TypeScript, JSX, emojiscript, [insert yr FancyScript of choice].</li>
</ul>
<h2>How does it work?</h2>
<p>polymer-webpack-loader takes an HTML Import file and converts the entire thing into a JavaScript module. It does this in three steps:</p>
<p><img src="/images/2017/07/Blog---7-1.png" alt="Diagram of three loader phases. Steps are explained below."></p>
<h3>Step 1. Convert <code>&lt;link&gt;</code>'s</h3>
<p>All <code>&lt;link&gt;</code> elements are converted to ES Module <code>import</code> statements. For example <code>&lt;link rel=&quot;import&quot; href=&quot;paper-button.html&quot;&gt;</code> becomes <code>import ‘paper-button.html’;</code> That might seem a little weird but remember, everything is a module in Webpack, even HTML and CSS files. By converting <code>&lt;link&gt;</code> elements to <code>import</code> statements, Webpack is able to crawl the rest of our dependency graph.</p>
<h3>Step 2. Turn <code>&lt;dom-module&gt;</code>’s into string templates</h3>
<p>Polymer’s <code>&lt;dom-module&gt;</code> is a Custom Element which captures its contained template and places it inside of a global map. Whenever a Polymer element is created, the first thing it does is find its template in this map and stamp it out. The polymer-webpack-loader just takes the contents of your <code>&lt;dom-module&gt;</code> and converts them into a string template which will get imported when the bundle is executed. Essentially it achieves the same end—a global map is created so the element’s template is accessible—but does so in a slightly different fashion.</p>
<h3>Step 3. Separate out <code>&lt;script&gt;</code> elements</h3>
<p>Finally any <code>&lt;script&gt;</code> tags which contain a valid <code>src</code> attribute are converted to <code>'import'</code> statements. Inline scripts are separated out and made available to other loaders in the chain (like babel-loader or ts-loader). Finally, they get tossed into the <code>bundle.js</code> along with everything else.</p>
<p>At the end of all this we should end up with a <code>bundle.js</code> with all of our elements and any other dependencies compiled into it.</p>
<h2>Let’s do a hello world!</h2>
<p><a href="https://github.com/webpack-contrib/polymer-webpack-loader/tree/master/demo">I’ve created a tiny demo project so you can follow along</a>.</p>
<p>To get started with the loader, install it from npm.</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token function">npm</span> <span class="token function">install</span> --save-dev polymer-webpack-loader</span></code></pre>
<p>Or if you’re using the demo project, <code>cd</code> into the demo directory and run <code>npm i</code> and <br/><code>bower i</code>.</p>
<p>Next, drop the loader into your <code>webpack.config.js</code>, here’s the full config file from the demo. I’ve done my best to comment each section so if you’re new to Webpack you can grok what’s going on.</p>
<script src="https://gist.github.com/robdodson/977773a05f6fad370314021a20d9da7b.js"></script>
<p>The key thing to note is the <code>module</code> section where we define the <code>rules</code> array. The first rule tests to see if a file ends in <code>.html</code>, if so, it gets sent to a set of chained loaders. Loaders transform a file in some way, similar to “tasks” in other build tools. Here we’re saying “run everything through polymer-webpack-loader, take the output from that and give it to babel-loader.”</p>
<p>Next we’ll need to give our app a starting point, so create an <code>index.js</code> file and include an <code>import</code> statement to pull in an HTML Import.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">/* src/index.js */</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">import</span> <span class="token string">'./my-element.html'</span><span class="token punctuation">;</span></span></code></pre>
<p>And here’s the actual definition for <code>my-element.html</code>.</p>
<p><code>my-element.html</code>, is a fairly plain Polymer element with one interesting feature. In the <code>&lt;script&gt;</code> element I’m importing the <a href="https://date-fns.org/">date-fns</a> library. Webpack will resolve this to the version in my <code>node_modules</code> directory and compile it into my bundle, which is pretty sweet. Finally we can leverage properly scoped modules in our element definitions!</p>
<p>The last thing we need to do is throw together an <code>index.ejs</code> which will be served by the Webpack dev server.</p>
<p>The <code>index.ejs</code> loads the Custom Elements ES5 adapter, Web Components polyfills, and the <code>bundle.js</code> created by Webpack. It also contains an instance of <code>&lt;my-element&gt;</code> in the <code>&lt;body&gt;</code>.</p>
<p>Not sure what that Custom Elements ES5 Adapter is all about? Check out <a href="https://youtu.be/Ucq9F-7Xp8I?t=7m56s">this clip</a> for the full explanation.</p>
<p>Note the line that says <code>&lt;%= htmlWebpackPlugin.files.js[0] %&gt;</code>, as this is where our <code>bundle.js</code> will end up.</p>
<p>Finally, in the terminal run <code>npm start</code> to kickoff the Webpack dev server which will open a browser window for you. You should see something like this:</p>
<p><img src="/images/2017/07/Screen-Shot-2017-07-13-at-4.38.28-PM.png" alt="A new browser window which says Hello, World and today's date"></p>
<p>Success! You’ve now got Polymer bundling with Webpack and leveraging imports from your <code>node_modules</code> directory.</p>
<h2>Open questions</h2>
<h3>Can I publish elements I create using the loader to WebComponents.org?</h3>
<p>It depends. If you’re taking advantage of ES Module <code>import</code> syntax to pull in npm packages, then no. Otherwise anyone who wants to use your element would be required to also use Webpack. I think this tool is best used for handling code in your <em>own</em> application and for elements that you don’t intend to share.</p>
<h3>Does this mean I don’t have to use bower anymore?</h3>
<p>Not really. The primary reason Polymer, and Web Components in general, rely on bower is because Custom Element tag names are global. This means you can’t have multiple conflicting versions of an element trying to be registered at once. Bower enforces deduplicating version conflicts at install time so you <em>always</em> end up with one version of a dependency. npm does not support this same feature, so for the time being it’s probably best to continue using bower to install your Web Components. If you’re curious to learn more about this <a href="https://www.youtube.com/watch?v=Ucq9F-7Xp8I&amp;feature=youtu.be&amp;t=31m16s">check out this clip from one of my recent I/O talks</a>.</p>
<h3>What about PRPL / code splitting?</h3>
<p>One of my favorite features of HTML Imports is that it encourages you to colocate all of the HTML, CSS, and JavaScript for a component into a single file. This makes it easy to separate components that are critical for first render, from those that can come later in the process. You can then use a tool like Polymer CLI to bundle your critical and noncritical components into separate “fragments”, and lazy load them with Polymer’s <code>importHref</code> method.</p>
<p>We can achieve the same effect in Webpack using a feature called <a href="https://webpack.js.org/guides/code-splitting/">Code Splitting</a>. The authors of the polymer-webpack-loader have put together a nice <a href="https://github.com/Banno/polymer-2-starter-kit-webpack">Polymer Starter Kit example</a> which demonstrates <a href="https://github.com/Banno/polymer-2-starter-kit-webpack/blob/master/webpack.config.js#L9">how to setup your Webpack configuration for code splitting</a>, and how to swap out Polymer’s <code>importHref</code> method for Webpack’s <a href="https://github.com/Banno/polymer-2-starter-kit-webpack/blob/master/src/my-app.html#L127-L138">dynamic <code>import()</code></a>.</p>
<h2>Conclusion</h2>
<p>I think Custom Elements built with Polymer should absolutely work in any library or framework. But too often we hit bumps along the way, sometimes related to build tools, and it makes the entire process feel like more trouble than it’s worth. I’m really excited about polymer-webpack-loader because it addresses a major pain point I’ve experienced and I can’t wait to see more folks use it to bring Custom Elements into their project and share them across their teams.</p>
<p>Big thanks to Bryan Coulter and Chad Killingsworth for creating polymer-webpack-loader and Sean Larkin for reviewing this post.</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Don&#39;t use jQuery plugins with Shadow DOM</title>
    <link href="https://robdodson.me/posts/dont-use-jquery-with-shadow-dom/"/>
    <updated>2017-06-25T00:00:44+00:00</updated>
    <id>https://robdodson.me/posts/dont-use-jquery-with-shadow-dom/</id>
    <content type="html"><![CDATA[
      <p>This is a post I should have written a loooong time ago…</p>
<p><strong>tl;dr:</strong> jQuery plugins don’t work inside of Shadow DOM because typically they try to query for something starting at the document level and the shadow root blocks this.</p>
<h2>A super handwavy explanation of jQuery plugins (featuring shitty drawings)</h2>
<p>jQuery plugins work by latching on to an element, stamping a template inside of it, and then (often times) querying for items in that template using <code>$()</code>.</p>
<p>For example, you might initialize a <a href="https://en.wikipedia.org/wiki/WYSIWYG">WYSIWG</a> plugin like this:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>.container<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">  <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'.container'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">wysiwg</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token comment">// options });</span></span><br></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre>
<p>At which point it will fill the <code>.container</code> element with some template markup.</p>
<p><img src="/images/2017/06/jquery-sd-1.png" alt="Diagram of document, container, and template markup."></p>
<p>Often times the plugin will want to reference specific nodes in the template to give them behaviors. In the above diagram the <code>.foo</code> element represents a footer with a few controls inside of it. The plugin <em>may</em> attempt to use <code>$('.foo')</code> to reach this element. It’s important to note that <code>$('.foo')</code> is equivalent to <code>document.querySelector('.foo')</code>.</p>
<p><img src="/images/2017/06/jquery-sd-2.png" alt="Diagram of querying from the document to the .foo element"></p>
<h2>How is this different with Shadow DOM?</h2>
<p>The primary thing to note about Shadow DOM is that it provides <em><strong>DOM encapsulation</strong></em> as well as style scoping.</p>
<p><img src="/images/2017/06/jquery-sd-3.png" alt="Diagram of a shadow root creating a boundary around the .container element"></p>
<p>In other words, you can’t query for something inside of a <code>shadow root</code> unless you start the query from within the <code>shadow root</code> itself. If you try to query from the document level (or really any point outside of the <code>shadow root</code>), the shadow boundary will block you.</p>
<p><img src="/images/2017/06/jquery-sd-4.png" alt="Diagram of shadow boundary blocking a query"></p>
<p>This is actually an intended feature of Shadow DOM. I don’t know if you’ve ever been in a situation where you <em>accidentally</em> query something inside of a jQuery plugin (or maybe a plugin accidentally queries some other element on your page) but it can lead to breakages pretty fast. By encapsulating a component’s DOM we can prevent such scenarios from happening. This also means that components built with Shadow DOM can be safely dropped into big framework apps and they won’t blow up the world.</p>
<h2>But the plugin works in Firefox!</h2>
<p>Complicating this whole issue is the fact that effectively polyfilling Shadow DOM can be pretty tricky. As a result folks might see a situation where the plugin seems to work in Firefox (which currently does not support Shadow DOM) but breaks in Chrome or Safari. If you’re seeing this behavior then you’re almost certainly running into a situation where native Shadow DOM is preventing the plugin from querying something inside of a <code>shadow root</code>.</p>
<h2>So… how do I fix it?</h2>
<p>Yeah this is where things get a bit tricky. There’s no silver bullet fix to this issue. If you’re putting a jQuery plugin inside of a component’s Shadow DOM, then your component is probably too big. See if you can factor it down into smaller pieces. Maybe the plugin could end up being a leaf node that just sits along side your other Web Components.</p>
<p>Another alternative is to see if you can distribute the plugin as a “Light DOM” child of the component using <a href="https://www.webpackbin.com/bins/-KnRWY0uGYLO6oBIx73l">Shadow DOM’s <code>&lt;slot&gt;</code> element</a>. You’ll need to write some extra code to get access to your distributed children and install listeners on them, but this might be  a workable solution depending on how your page is setup.</p>
<h2>Conclusion</h2>
<p>jQuery plugins are great but they were created in an era before Shadow DOM. Trying to mix the two will more often than not lead to bugs and confusion. If you’re having a hard time getting them to work in your app, ask yourself if <em>everything</em> needs to be in the Shadow DOM, or if it might be better to only use Shadow DOM for the UI components where you know you want a strong encapsulation boundary.</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Regarding the broken promise of Web Components</title>
    <link href="https://robdodson.me/posts/regarding-the-broken-promise-of-web-components/"/>
    <updated>2017-03-16T01:01:38+00:00</updated>
    <id>https://robdodson.me/posts/regarding-the-broken-promise-of-web-components/</id>
    <content type="html"><![CDATA[
      <p>After reading an article titled <a href="https://dmitriid.com/blog/2017/03/the-broken-promise-of-web-components/">The broken promise of Web Components</a> and typing out the world’s longest comment response I figured it’d be better if I try to distill my thoughts into a blog post. I’ll address each of the points raised by the author as their own section.</p>
<h2>After years of effort Web Components have been a waste of time</h2>
<p>Something I’ve learned from working with the Chrome team is that browser makers view shipping something in the platform very differently from the web dev audience. Once you ship something in the browser, the assumption is it’s there “forever”, at a minimum several years, possibly decades. This means big changes are often undertaken in a slow process that to outside observers feels downright glacial.</p>
<p>Web Components are a big change and as a result they’ve moved pretty slowly. Along the way some parts got dropped or reworked but that’s a good thing. Using an ES6 Class instead of building a prototype Object to create a Custom Element is a much nicer approach, but required revising the Custom Elements spec. It’s frustrating because it delayed native Custom Element support for folks, but the final product is better.</p>
<p>I’d still like things to move faster, but in 2016 we saw Safari add support for Custom Elements and Shadow DOM, and it looks like Firefox may be on track to do the same in 2017 (fingers crossed). It’s taken a (very) long time, but I do think we’re getting close to having full cross-browser support soon.</p>
<h2>React built a better mouse trap</h2>
<p>React is awesome and drives a ton of discussion among folks who work on Web Components. My perspective is that the ideas in React and the ideas in Web Components are not mutually exclusive. Instead, we should roll those patterns into how we build components and make sure we have a good story for interoperability.</p>
<p>Whether you choose to use React or Web Components (or both) I think ultimately comes down to personal style and project constraints. Let’s say in another year or two Web Components become fully supported and you’re asked to build a UI library to scale across a huge company with tons of developers on different stacks. Web Components would fit that job very well. Or let’s say you’re a marketing agency making a site for a product launch. There’s only one team invovled and everyone is already familiar with React. It would make sense to just use React for the whole thing. There are a lot of scenarios that fall in between these two examples but really it comes down to using the right tool for the job.</p>
<p>As a bit of an aside, I also feel like a lot of folks often overlook the fact that libraries like <a href="https://www.ampproject.org">Amp</a> are in fact Web Components (specifically Custom Elements), and Amp is incredibly successful. Their elements are performant and meet a need for publishers. Often times the Web Components discussion descends into Framework X versus Framework Y, but taking a step back reveals there are other applications for these standards that we may have overlooked.</p>
<h2>The DOM is slow</h2>
<p>Abstractions like React/JSX which help you manage your DOM updates are great, but they don’t come free of cost. A major bottleneck for page load times is large javascript bundles being downloaded which then take a very long time to parse on underpowered mobile hardware. Here’s a great talk on the subject by my teammate Sam Saccone: <a href="https://www.youtube.com/watch?v=RWLzUnESylc">https://www.youtube.com/watch?v=RWLzUnESylc</a></p>
<p>The important takeaway is that React (or really any library that provides an abstraction over the DOM, including Polymer) is not a silver bullet. If you end up shipping megabytes of slow-to-parse javascript, then you’ve just shifted the problem around. The fix is to make sure you’re splitting up your bundles, and only loading what you need, when you need it.</p>
<h2>Using JSX and Virtual DOM is nicer than using DOM APIs directly</h2>
<p>The DOM APIs are meant to be low level tools that we can build abstractions on top of. JSX is a great tool but the use case cited by the author (JSX + ReactDOM) is just sugar over the native DOM APIs. As a result, there’s no reason why you can’t use JSX with Web Components, and libraries like <a href="https://github.com/skatejs/skatejs">SkateJS</a> do this today.</p>
<h2>There’s no standardized data binding system</h2>
<p>A frustration cited in the blog post is that there’s no standardized data binding system and that Polymer had to invent their own. Originally there <em>was</em> a proposed standard, called <a href="https://github.com/toolkitchen/mdv">Model Driven Views</a>, and (if I understand my history correctly) this is what Polymer’s binding system was originally based on. But this proposal never caught on. I’ve heard anecdotally that it was too difficult to get the various stakeholders (including framework authors) to agree on exactly <em>how</em> data binding should work in the platform.</p>
<p>Today many developers prefer the look of JSX to template bindings (MDV style) and with things like Observables and ES6 Proxies on the horizon, I’m not sure what this space will look like in a few years. It may just be too volatile to standardize right now. Competition in this space is a good thing though. Over time it helps us zero in on a solution that makes everyone happy.</p>
<h2>Working with string attributes is annoying</h2>
<p>Because a Custom Element is really just a class instance, you can (and should) provide a properties interface using ES6 class getters/setters. That way you don’t have to rely on attributes for anything other than initial configuration (if you want to). <a href="https://medium.com/dev-channel/custom-elements-that-work-anywhere-898e1dd2bc48#.5rnqw871f">I wrote up a blog post on how to do this here</a>.</p>
<p>This means properties (not attributes) can be the source of truth for your element. And libraries like Angular2 already support this in their binding system when communicating with Web Components.</p>
<p>Evangelizing component authoring best practices that use this approach is something I’m currently pursuing along with the help of my teammates so stay tuned for more in this department :)</p>
<h2>Wrapping up</h2>
<p>I completely understand the frustration expressed by the author in this post. As someone working on Web Components for years (and years) at this point I’m like “OMG CAN WE PLEASE BE DONE SOON!” But I’m actually more excited for the work I’m doing this year than I was in 2016.</p>
<p>I think we’re finally getting on solid footing when it comes to browsers shipping native implementations. The standards have stopped moving around so we can start publishing best practices. And folks are taking Web Components in new and interesting directions. I’ve already mentioned <a href="https://github.com/skatejs/skatejs">SkateJS</a>, but just the other day I discovered <a href="https://github.com/Wildhoney/Switzerland">Switzerland</a>, and the Polymer team is close to releasing Polymer 2.0. Also the Amp team just wrapped up a <a href="https://www.ampproject.org/amp-conf-2017/">two day conference</a> where they showed off all the cool stuff they’ve been working on (<a href="https://www.youtube.com/channel/UCXPBsjgKKG2HqsKBhWA4uQw">videos available on their YouTube channel</a>).</p>
<p>So yeah, as crazy as it sounds given how long things have taken, I think 2017 is going to be a good year for Web Components. There are still hard problems to tackle but I think we’ll get there. And just like any tool, the final result won’t be a panacea, but it will solve real problems and serve as a building block to address future issues in the platform.</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Custom Elements That Work Anywhere</title>
    <link href="https://robdodson.me/posts/interoperable-custom-elements/"/>
    <updated>2016-11-30T18:32:38+00:00</updated>
    <id>https://robdodson.me/posts/interoperable-custom-elements/</id>
    <content type="html"><![CDATA[
      <p>Safari Tech Preview 17 now has Custom Elements <a href="https://developer.apple.com/safari/technology-preview/release-notes/#r17">“enabled everywhere”</a>, meaning it won’t be long before they’re shipping in a stable version. Since more browsers are starting to adopt Custom Elements, I thought it would be a good time to share some of the patterns I’ve learned from building and speaking about them over the past few years.</p>
<p>In <a href="https://medium.com/dev-channel/the-case-for-custom-elements-part-1-65d807b4b439#.k7sm324jh">The Case for Custom Elements</a> I pointed out that Custom Elements should be able to work in any context where HTML works. This includes being used by popular frameworks. To that end, the patterns I’m sharing in this post will not only help you write high quality components, but should also aid in framework interoperability. Specifically I’ll be referring to React and Angular 2 in this post as those are the ones I’m most familiar with, but ideally these patterns should benefit interoperability with all frameworks/libraries.</p>
<h3>Use properties as your source of truth</h3>
<p>Every HTML Element has the ability to receive state through its attributes and properties. Traditionally attributes are used to set the initial state of an element but they do not update as the element changes over time. For example:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span>”checkbox”</span> <span class="token attr-name">checked</span><span class="token punctuation">></span></span></span></code></pre>
<p>The above line of code will render a checked checkbox. Clicking on the checkbox will uncheck it, however, the <code>checked</code> attribute will still exist in the DOM.</p>
<p><img src="/images/2016/11/checkbox.gif" alt="an animation showing the DOM for an input checkbox. clicking on the checkbox does not remove the checked attribute from the DOM."></p>
<p>The same is true if you set a <code>value</code> attribute on a text input and then type in a new phrase. Calling <code>getAttribute(‘value’)</code> will produce the original (stale) attribute value. However, asking for the <code>.value</code> property will produce the correct result. In other words, <strong>attributes are useful for initial configuration, whereas properties are good for reflecting state</strong>. This leads to a few takeaways:</p>
<ul>
<li><strong>The state of an element should always be determinable by its properties and it should not matter the order in which the properties are set</strong>.</li>
<li>Every exposed attribute should have a corresponding property</li>
<li>Updating an attribute should reflect that change to the property</li>
<li>Updating a property should reflect back to an attribute only when it benefits styling, or perhaps accessibility (e.g. if you expose an API where setting a role property would reflect to an ARIA role attribute). If the property sets the corresponding attribute, and you’re using the <code>attributeChangedCallback</code>, you’ll want to add a guard to prevent an infinite loop.</li>
</ul>
<p>Here’s an example element, a Custom Menu with a selected attribute/property, that adheres to the above pattern:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">class</span> <span class="token class-name">CustomMenu</span> <span class="token keyword">extends</span> <span class="token class-name">HTMLElement</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">static</span> <span class="token keyword">get</span> <span class="token function">observedAttributes</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token punctuation">[</span><span class="token string">'selected'</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token comment">// Called anytime the 'selected' attribute is changed</span></span><br><span class="highlight-line">  <span class="token function">attributeChangedCallback</span><span class="token punctuation">(</span><span class="token parameter">attrName<span class="token punctuation">,</span> oldVal<span class="token punctuation">,</span> newVal</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">[</span>attrName<span class="token punctuation">]</span> <span class="token operator">=</span> newVal<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token comment">// Takes a numeric index value</span></span><br><span class="highlight-line">  <span class="token keyword">set</span> <span class="token function">selected</span><span class="token punctuation">(</span><span class="token parameter">idx</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>_selected <span class="token operator">===</span> idx<span class="token punctuation">)</span> <span class="token keyword">return</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>_selected <span class="token operator">=</span> idx<span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token comment">/* Update the DOM as necessary */</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token keyword">get</span> <span class="token function">selected</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>_selected<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>This pattern becomes especially important when we think about interoperability with frameworks. Consider the following piece of code from Angular 2:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>custom-checkbox</span> <span class="token attr-name">[checked]</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>item.inShoppingCart<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>custom-checkbox</span><span class="token punctuation">></span></span></span></code></pre>
<p>This is a one-way data binding which sets the checked state of the element equal to a model value, in this case the <code>inShoppingCart</code> property of the <code>item</code> object. While it looks like we’re working with an attribute here, in actuality, Angular 2 is setting a property on the element. The above line of code is functionally equivalent to:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">customCheckbox<span class="token punctuation">.</span>checked <span class="token operator">=</span> item<span class="token punctuation">.</span>inShoppingCart<span class="token punctuation">;</span></span></code></pre>
<p><em>Note: Angular 2 also provides special syntax for <a href="https://angular.io/docs/ts/latest/guide/template-syntax.html#!#other-bindings">binding to attributes</a>, but favors binding to properties.</em></p>
<p>One of the reasons frameworks prefer setting properties over attributes is because <strong>attributes can only pass string values</strong>, whereas many frameworks often need to pass more complex data like arrays and objects. To pass complex data with attributes would require serializing the data to JSON strings, setting those values on attributes, and then parsing that JSON on the other side to turn it back into an object. Using properties for everything avoids this extra work. This also highlights the need for a standards based way to declaratively serialize/deserialize data to/from something like attributes. Today libraries are forced to work around this limitation (either via JSX or data binding) but having an agreed upon way to declaratively pass complex data would be a big win for the platform.</p>
<h3>Data out via events</h3>
<p>Keep this mantra in mind: <strong>“data in via attributes and properties, data out via events”</strong>.</p>
<p><img src="/images/2016/11/data-in-out-1.png" alt="a diagram of a custom element. data goes in via attributes and properties and data goes out via events."></p>
<p>We’ve already covered how to get data into an element, now let’s talk about how we tell the outside world that our state has changed.</p>
<p>The DOM provides an easy mechanism for dispatching events in the form of the <a href="https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent">CustomEvent constructor</a>. If you’re building a custom checkbox and a user clicks on it, the appropriate thing to do would be to tell the outside world that your <code>checked</code> state has changed:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">class</span> <span class="token class-name">CustomCheckbox</span> <span class="token keyword">extends</span> <span class="token class-name">HTMLElement</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function">connectedCallback</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span>‘click’<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>onClick<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token function">onClick</span><span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">// This should trigger a setter which updates the DOM</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>checked <span class="token operator">=</span> <span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">.</span>checked<span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">dispatchEvent</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">CustomEvent</span><span class="token punctuation">(</span>‘checked<span class="token operator">-</span>changed’<span class="token punctuation">,</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      detail<span class="token punctuation">:</span> <span class="token punctuation">{</span> checked<span class="token punctuation">:</span> <span class="token keyword">this</span><span class="token punctuation">.</span>checked <span class="token punctuation">}</span><span class="token punctuation">,</span> bubbles<span class="token punctuation">:</span> <span class="token boolean">false</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>Frameworks already have built-in mechanisms for listening to DOM events, so they should be able to work with your component if it uses this pattern. For example, to respond to this check change in React we could do the following:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">class</span> <span class="token class-name">SignUp</span> <span class="token keyword">extends</span> <span class="token class-name">React<span class="token punctuation">.</span>Component</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function">componentDidMount</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>refs<span class="token punctuation">[</span><span class="token string">'signup'</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span></span><br><span class="highlight-line">      <span class="token string">'check-changed'</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">onCheckChanged</span><span class="token punctuation">.</span><span class="token function">bind</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span></span><br><span class="highlight-line">    <span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token function">onCheckChanged</span><span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">/* Notify the outside world via callback or Redux */</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token punctuation">(</span></span><br><span class="highlight-line">      <span class="token operator">&lt;</span>div<span class="token operator">></span></span><br><span class="highlight-line">        <span class="token operator">&lt;</span>span<span class="token operator">></span>Join Our Newsletter<span class="token operator">!</span><span class="token operator">&lt;</span><span class="token operator">/</span>span<span class="token operator">></span></span><br><span class="highlight-line">        <span class="token operator">&lt;</span>custom<span class="token operator">-</span>checkbox</span><br><span class="highlight-line">          ref<span class="token operator">=</span><span class="token string">"signup"</span></span><br><span class="highlight-line">            checked<span class="token operator">=</span><span class="token punctuation">{</span><span class="token keyword">this</span><span class="token punctuation">.</span>props<span class="token punctuation">.</span>user<span class="token punctuation">.</span>hasJoined<span class="token punctuation">}</span><span class="token operator">></span></span><br><span class="highlight-line">        <span class="token operator">&lt;</span><span class="token operator">/</span>custom<span class="token operator">-</span>checkbox<span class="token operator">></span></span><br><span class="highlight-line">      <span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">></span></span><br><span class="highlight-line">    <span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p><em>Note: There’s an ongoing discussion about improving event handler interop between Web Components and React <a href="https://github.com/facebook/react/issues/7901">over on GitHub</a>. Till that issue is resolved you can use a library like <a href="https://github.com/webcomponents/react-integration">webcomponents/react-integration</a> to smooth over interop issues.</em></p>
<p>Or in Angular 2:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span><span class="token punctuation">></span></span>Join Our Newsletter<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">&lt;custom-checkbox</span><br><span class="highlight-line">  [checked]="user.hasJoined"</span><br><span class="highlight-line">  (check-changed)=”user.hasJoined=$event.detail.checked”></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>custom-checkbox</span><span class="token punctuation">></span></span></span></code></pre>
<p>The key thing is that we’re telling the outside world that our state has changed. For top-down, unidirectional data flow systems this is important because it affords them the opportunity to revert that change if it doesn’t match their model. For example, React listens for the <code>change</code> event from the native <code>&lt;input type=”checkbox”&gt;</code> element, and if it doesn’t match React’s internal model, it reverts the change. Making sure our Custom elements dovetail into this system means they’ll ultimately be more shareable across the entire ecosystem.</p>
<p>When I showed this pattern off recently someone asked if it would be better to dispatch the events inside of the property setters, for example:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">set</span> <span class="token function">checked</span><span class="token punctuation">(</span><span class="token parameter">val</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>_checked <span class="token operator">=</span> val<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token comment">/* do any other updates we need */</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">dispatchEvent</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">CustomEvent</span><span class="token punctuation">(</span>‘check<span class="token operator">-</span>changed’<span class="token punctuation">,</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    detail<span class="token punctuation">:</span> checked<span class="token punctuation">:</span> val</span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>The danger with doing this is you may end up creating an infinite loop if there’s an external listener for the event which in turn updates the property. Looking again to native elements, it seems that their event dispatching only takes place when some external force is acting upon the element, e.g. someone clicked, someone typed, something loaded, etc. Hence, we don’t dispatch <code>check-changed</code> when the public property is set, but instead only when someone clicks on the checkbox.</p>
<p>Also note that special care should be taken when working with events to prevent leaking too much information to the outside world. <strong>In general, don’t bubble events unless they are semantically meaningful</strong>. For example, <code>changed</code> is not a very semantically meaningful event, whereas <code>document-opened</code> would be. Non-semantic events can leak up and another element may accidentally handle them. Plus it makes things less explicit. Colocating the event dispatcher, and the element handling it makes relationships easier to grok. By default, custom events won’t bubble out of shadow roots without the <code>composed: true</code> flag set, so Custom Elements using Shadow DOM are default encapsulated w/ custom events.</p>
<p>In cases where you do need to bubble events, the element that handles the event should probably call <code>event.stopPropagation()</code>. Unless that element also has a good reason for letting the event continue to bubble up.</p>
<h3>Favor a declarative API over an imperative API</h3>
<p>It is preferable to always use properties (or attributes that reflect their changes to properties) to define the state for your component. This means avoiding methods which mutate state without reflecting those changes to the corresponding properties and dispatching the appropriate events. By focusing on properties you make it much easier to build your app in a declarative fashion.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>custom-dialog</span> <span class="token attr-name">opened</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token comment">&lt;!-- which is the same as saying... --></span></span><br><span class="highlight-line">customDialog.opened = true;</span></code></pre>
<p>Instead of:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">customDialog<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>In the example above, the state of the app can be reasoned about entirely using HTML, whereas the second example requires imperative setup code in JavaScript (specifically calling a method). The declarative version lends itself well to systems like React/Redux and Angular 2 which favor a top-down data flow model, as they can just pass in the appropriate attributes/properties to make the state in the DOM match the state in their data stores.</p>
<h3>Avoid sync issues with Shadow DOM</h3>
<p>Frameworks and libraries which manage the DOM often have systems to dictate when components can render and how the DOM is updated. A good example is React’s virtual DOM diffing which creates a kind of snapshot of the DOM and uses it to reconcile changes whenever components update their state.</p>
<p>Custom Elements, on the other hand, render DOM in response to lifecycle callbacks triggered by the HTML parser. This means they may operate outside of a library’s ability to snapshot the DOM. This has the potential to lead to sync issues as the Custom Element upgrades and renders its own DOM that then does not match the snapshot the library is diffing against.</p>
<p><a href="https://developers.google.com/web/fundamentals/getting-started/primers/shadowdom">Shadow DOM</a> offers a way to protect both the Custom Element and the library from getting their wires crossed. It does this by creating a shadow root, essentially a self-contained tree which the Custom Element can treat as its own private world, obscuring its internal DOM state from the rest of the page. Many of the native elements that you work with every day (<code>input</code>, <code>video</code>, etc) use Shadow DOM to encapsulate their internals.</p>
<p><img src="/images/2016/11/shadow-root.png" alt="Chrome devtools showing the shadow root for an input range element"></p>
<p><em>To see this go to the Settings in Chrome Dev Tools and check “Show user agent Shadow DOM”.</em></p>
<p>Adding Shadow DOM to a Custom Element is quite easy:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">class</span> <span class="token class-name">XFoo</span> <span class="token keyword">extends</span> <span class="token class-name">HTMLElement</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function">constructor</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">super</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">attachShadow</span><span class="token punctuation">(</span><span class="token punctuation">{</span> mode<span class="token punctuation">:</span> <span class="token string">'open'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token function">connectedCallback</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>shadowRoot<span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> <span class="token template-string"><span class="token string">`&lt;p>Hello from x-foo&lt;/p>`</span></span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line">window<span class="token punctuation">.</span>customElements<span class="token punctuation">.</span><span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'x-foo'</span><span class="token punctuation">,</span> XFoo<span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Or if you prefer using a <code>&lt;template&gt;</code> element for your markup:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>template</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span>”x-foo-tmpl”</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Hello from x-foo<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>template</span><span class="token punctuation">></span></span></span></code></pre>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">class</span> <span class="token class-name">XFoo</span> <span class="token keyword">extends</span> <span class="token class-name">HTMLElement</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function">constructor</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">super</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">attachShadow</span><span class="token punctuation">(</span><span class="token punctuation">{</span> mode<span class="token punctuation">:</span> <span class="token string">'open'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token function">connectedCallback</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">const</span> tmpl <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'#x-foo-tmpl'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>shadowRoot<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>tmpl<span class="token punctuation">.</span>content<span class="token punctuation">.</span><span class="token function">cloneNode</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line">window<span class="token punctuation">.</span>customElements<span class="token punctuation">.</span><span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'x-foo'</span><span class="token punctuation">,</span> XFoo<span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Using Shadow DOM will ensure that your element avoids potential conflicts with any framework managing the page and, as an added bonus, you’ll get style scoping for free!</p>
<h3>Wrapping Up</h3>
<p>The patterns listed above are based on conversations I’ve had with framework authors and I imagine over time we’ll need to augment and add to this list. Because the Web Component ecosystem is still fairly new, it feels like a good time to explore these patterns before possible bad habits get burned in and become widespread. If you’re building a Custom Element, consider giving these patterns a shot, and be sure to share your final project over on the new Web Components catalog. Also leave some comments! Thanks :)</p>
<p><em>Big thanks to Addy Osmani, Justin Fagnani-Bell, Jeff Cross, Rob Wormald, Sebastian Markbåge, and Trey Shugart for their reviews.</em></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Building better accessibility primitives</title>
    <link href="https://robdodson.me/posts/building-better-accessibility-primitives/"/>
    <updated>2016-06-11T14:43:09+00:00</updated>
    <id>https://robdodson.me/posts/building-better-accessibility-primitives/</id>
    <content type="html"><![CDATA[
      <p>As the sites we build increasingly become more app-like it’s important that the platform keep up and give component authors the tools they need to build rich accessible experiences.</p>
<p>Recently I’ve run into two situations where it was extremely difficult for me to add proper keyboard support to the components I was building. After a lot of experimentation and research it became clear that maybe there were some missing primitives in the web platform that would have made my work a bit easier. I’ll explain the two scenarios here and cover some ideas for how to solve them.</p>
<h2>Problem 1: Modals</h2>
<p>A modal window is a dialog that appears above the page, often obscuring content behind it with an overlay. The idea is that if a modal is displaying the user should not be able to interact with anything else on the page.</p>
<p><img src="/images/2016/06/modal.jpg" alt="A modal window with a warning asking the user to save their work"></p>
<p>For anyone who has ever tried to make a modal accessible you know that even though they seem pretty innocuous, <strong>modals are actually the boss battle at the end of web accessibility</strong>. They will chew you up and spit you out. For instance, a proper modal will need to have the following features:</p>
<ul>
<li>Keyboard focus should be moved inside of the modal and restored to the previous <code>activeElement</code> when the modal is closed</li>
<li>Keyboard focus should be trapped inside of the modal, so the user does not accidentally tab outside of the modal (a.k.a. “escaping the modal”)</li>
<li>Screen readers should also be trapped inside of the modal to prevent accidentally escaping</li>
</ul>
<p>Nailing the above three points can be pretty difficult and requires a lot of contortions using combinations of <code>aria-hidden</code> to trap the screen reader and managing focus to trap <code>TAB</code>. <a href="https://github.com/gdkraus/accessible-modal-dialog/blob/master/modal-window.js">Here’s one of the best examples I’ve found</a>. Note that this example assumes your modal is a sibling to the rest of your main content so you can easily apply <code>aria-hidden</code> to main. If, however, your modal is mixed in with the rest of your main content (maybe for positioning reasons) then you are seriously screwed. You’ll need to find a way to put <code>aria-hidden</code> on everything in main that isn’t your modal (or a parent of your modal). It definitely <em>feels</em> harder than it should be.</p>
<h3>What about <code>&lt;dialog&gt;</code>?</h3>
<p>The HTML spec does <a href="https://html.spec.whatwg.org/multipage/forms.html#the-dialog-element">mention the idea of a <code>&lt;dialog&gt;</code> element</a> which would magically solve all of the above issues. The problem is that so far only Chrome has implemented it, and other browsers seem disinterested. Furthermore, <code>&lt;dialog&gt;</code> may not be the right solution. Let’s consider another example:</p>
<p><img src="/images/2016/06/phone.jpg" alt="A mobile phone showing an offscreen responsive drawer menu"></p>
<p>Offscreen drawer menus are an extremely popular UI pattern in responsive sites. But is an offscreen drawer menu the same as a <code>&lt;dialog&gt;</code>? The drawer also needs to comply with the three bullet points listed above but calling it a dialog feels like a stretch. My hunch is many developers might not think to reach for <code>&lt;dialog&gt;</code> when they’re building a drawer.</p>
<h3>Possible solution: <code>blockingElements</code></h3>
<p>Rather than contort <code>&lt;dialog&gt;</code> to do our bidding, why not expose a JavaScript API that gives us all the same magical goodies. Then we could create our own custom elements and leverage the API as we see fit. This idea has been discussed over on the whatwg/html GitHub repo, under the thread <a href="https://github.com/whatwg/html/issues/897#issuecomment-198265076">“Expose a stack of blocking elements”</a>.</p>
<p>The proposed API could look something like this:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// put element at the top of the blocking elements stack</span></span><br><span class="highlight-line">document<span class="token punctuation">.</span>blockingElements<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>element<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">document<span class="token punctuation">.</span>blockingElements<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token comment">// see https://github.com/whatwg/html/issues/897#issuecomment-198565716</span></span><br><span class="highlight-line">document<span class="token punctuation">.</span>blockingElements<span class="token punctuation">.</span><span class="token function">remove</span><span class="token punctuation">(</span>element<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">document<span class="token punctuation">.</span>blockingElements<span class="token punctuation">.</span>top<span class="token punctuation">;</span> <span class="token comment">// or .current or .peek()</span></span></code></pre>
<p>Putting an element at the top of the stack effectively means everything else on the page is inert (so no risk of the keyboard or screen reader “escaping”). And when an element is popped off of the stack, focus naturally returns to the previous <code>activeElement</code>. This allows us to explain the behavior of <code>&lt;dialog&gt;</code> so component authors can use it to build whatever they like, which dovetails really well with the whole <a href="https://extensiblewebmanifesto.org/">extensible web movement.</a> A natural side effect of doing this is we get tons of accessibility features for free. Developers wouldn’t need to sprinkle the page with <code>aria-hidden</code> attributes or write keyboard traps, instead <strong>they would use the best API for building a dialog and good accessibility would naturally come out of that</strong>. It’s a total win.</p>
<p>At the moment <code>blockingElements</code> is still a new idea, and new ideas are fragile, so please resist the urge to hop on that GitHub issue and bikeshed the heck out of it 😊 Our next step is to move <code>blockingElements</code> into a <a href="https://www.w3.org/blog/2015/07/wicg/">Web Platform Incubator Community Group (WICG)</a> so we can continue to iterate on the idea. When we move to the WICG I will be sure to update this blog and let you all know!</p>
<h2>Problem 2: Disabling tabindex</h2>
<p>Let’s go back to that offscreen drawer example for a second. In order to animate that drawer on screen, and achieve a 60fps animation, I’m going to need to promote the drawer to its own layer using something like <code>will-change: transform</code>. Now I can <code>transform</code> the drawer on screen and I shouldn’t trigger unnecessary paints or layouts. This technique is explained really well by <a href="https://youtu.be/thNyy5eYfbc?t=7m55s">Paul Lewis in his I/O presentation.</a></p>
<p><lite-youtube videoid="thNyy5eYfbc" videotitle="High performance web user interfaces - Google I/O 2016" videoStartAt="475"></lite-youtube></p>
<p>One problem: to do this we must leave the drawer in the DOM at all times. Meaning its focusable children are just sitting there offscreen, and as the user is tabbing through the page eventually their focus will just disappear into the drawer and they won’t know where it went. I see this on responsive websites <strong>all the time</strong>. This is just one example but I’ve also run into the need to disable tabindex when I’m animating between elements with <code>opacity: 0</code>, or temporarily disabling large lists of custom controls, and as others have pointed out, you’d hit if you tried to build something like <a href="http://cdn.cultofmac.com/wp-content/uploads/2010/10/post-61758-image-221f26e399e464c71248d2528ef2eeaf.jpg">coverflow</a> where you can see a preview of the next element but can’t actually interact with it yet.</p>
<h3>What about aria-hidden?</h3>
<p>Using <code>aria-hidden</code> it’s possible to remove an element <em>and all of its children</em> from the accessibility tree. This is awesome and solves the problem for screen readers (<em><a href="https://robdodson.me/building-better-accessibility-primitives/#comment-2725171222">Marcy Sutton pointed out that</a> it doesn’t completely solve the issue for screen readers and can even lead to “ghost controls” which are focusable but lacking a11y information</em>). Unfortunately ARIA is forbidden from affecting page behavior, it only deals with semantics, and there is no similar concept for <code>tabindex</code>. This is important because there are sighted users with motor impairments who rely on the tab key to navigate the page. If you have a complex tree of interactive elements and you need to remove all of them from the tab order your only option is to recursively walk the tree (or write <a href="https://github.com/robdodson/Detabinator/blob/master/detabinator.js#L16">a pretty heinous <code>querySelectorAll</code> string</a>) and set every focusable element to <code>tabindex=&quot;-1&quot;</code>. You also need to remember any explict <code>tabindex</code> values they may already have and restore those when the element is back on screen. Again, it <em>feels</em> harder than it should be.</p>
<h3>What about pointer-events: none?</h3>
<p>Settings <code>pointer-events: none</code> will make it so you can’t click on an element but it doesn’t remove it from the tab order and <a href="https://output.jsbin.com/fuyuba">you can still interact with it using the keyboard</a>.</p>
<h3>What about setting the drawer to display: none?</h3>
<p>When the drawer is offscreen we could set it to <code>display: none</code> or <code>visibility: hidden</code>. That would remove the focusable children from the tab order. Unfortunately that will also destroy our GPU layer which kind of negates the whole animation technique. On a simple enough drawer we can actually get away with recreating the layer right when the user opens it, but for a more complex drawer (like the kind on <a href="m.facebook.com">m.facebook.com</a>) all of that painting would probably cause our animation to jank. I don’t think developers should have to choose between 60fps animations and good accessibility.</p>
<h3>Possible solution: <code>inert=&quot;&quot;</code></h3>
<p>Previously there <a href="https://www.w3.org/Bugs/Public/show_bug.cgi?id=24983">was some discussion</a> around adding an <code>inert</code> attribute to HTML. The basic idea is you could set the <code>inert</code> attribute on an element, and its entire tree of descendants would become non-interactive. This is perfect for our drawer example as it means we could paint something offscreen, set it to <code>inert</code>, and not have to worry about a keyboard user accidentally interacting with it.</p>
<p>Unfortunately the original use cases cited for <code>inert</code> seem to orbit mainly around dialogs and since there was already a <code>&lt;dialog&gt;</code> proposal floating around at the time, it was punted.</p>
<p>My feeling is this is perhaps backwards. I think the proposed <code>blockingElements</code> API would be a better way of letting developers build accessible dialogs because it says “everyone else BUT ME is inert”. Whereas <code>inert=&quot;&quot;</code> would be useful for the animation example above where I need something to be painted and in the DOM but also be non-interactive (in other words, “I AM inert”). And for anyone doing accessibility work it becomes like a more powerful <code>aria-hidden</code> because presumably it would not only remove an element from the tab order but also from the accessibility tree. <strong>Developers would use the best API to build their component and they’d get good accessibility for free</strong>. ZOMG SO FULL OF WIN!</p>
<p>I should add that others on <a href="https://www.w3.org/Bugs/Public/show_bug.cgi?id=24983">the discussion thread</a> mention that maybe this would be better solved with a new CSS property. I’d be cool with that as well but to my (very limited) knowledge no proposal has come forward and <a href="https://twitter.com/briankardell/status/741389741417861120">this is a legitimate pain point for developers</a>. So I’ve filed <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=618746#c2">a chromium bug</a> to see if the Chrome team will explore restarting the process of implementing <code>inert</code>. I hope by documenting these use cases we can convince others of its utility. If there’s progress I’ll be sure to write a follow up post to let you all know 🐝</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Setting up Android Studio on Yosemite</title>
    <link href="https://robdodson.me/posts/setting-up-android-studio-on-yosemite/"/>
    <updated>2014-12-31T06:01:12+00:00</updated>
    <id>https://robdodson.me/posts/setting-up-android-studio-on-yosemite/</id>
    <content type="html"><![CDATA[
      <p>I’ve set out to learn some of the Android framework this quarter, which means setting up Java and the lastest version of Android Studio.</p>
<p>As it happens, I formatted my laptop today and did a clean install of Yosemite so my machine is about as stock as they come. As I was setting up Android Studio, I ran into some hiccups and thought I’d document them for anyone else running into similar issues.</p>
<h2>Step 1: Install Android Studio</h2>
<p>After downloading Android Studio and firing it up for the first time, I was immediately confronted with an error:</p>
<blockquote>
<p>Android Studio was unable to find a valid JVM</p>
</blockquote>
<p>I realized I hadn’t yet setup Java on my machine so I followed <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">the link from the Android Studio docs to download the JDK</a> and installed Java 7. Hopping over to my command line, I verified the install by running <code>javac -version</code> which output <code>javac 1.7.0_71</code>.</p>
<p>Tried restarting Android Studio and…</p>
<blockquote>
<p>Android Studio was unable to find a valid JVM</p>
</blockquote>
<p>Crap.</p>
<h2>Step 2: Google furiously</h2>
<p>At this point, I must admit that I’m no Java expert. I followed the instructions to download the JDK but there are a ton of links on that page… maybe I made a mistake?</p>
<p>Thankfully <a href="https://stackoverflow.com/questions/27369269/android-studio-was-unable-to-find-a-valid-jvm-related-to-mac-os/27369596">this StackOverflow thread</a> saved the day.</p>
<p>The accepted answer recommends hacking on the <code>info.plist</code> inside the Android Studio package. There’s discussion in the comments pointing out that <strong>this is no longer a recommended practice</strong>.</p>
<p>I finally found <a href="https://stackoverflow.com/a/27369494">this answer</a> which recommends <a href="https://www.java.com/en/download/">downloading the latest JVM from Oracle</a> and then <a href="https://support.apple.com/kb/DL1572?viewlocale=en_US&amp;locale=en_US">downloading this Java bundle from Apple</a>. After installing both packages I’m now able to fire up Android Studio (and I didn’t have to hack on any of the internals). Yay!</p>
<h2>Step 3: Reflect</h2>
<p>I’ve tried setting up Java in Eclipse before, and even previously in Android Studio. For some reason it’s always a pain and super discouraging. I think it would be great if <a href="https://developer.android.com/sdk/installing/index.html?pkg=studio">the Android Studio guide</a> contained a bit more explaination about exactly what I need to install to get up and running. Just pointing folks to <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">this page</a> and telling them to install the JDK is frought with peril. There are a million links on that page and almost no information hierarchy. If there are specific items I should click, gimme some screenshots.</p>
<p>Also, the error message from Android Studio is very unhelpful.</p>
<blockquote>
<p>Android Studio was unable to find a valid JVM</p>
</blockquote>
<p>That was literally the first thing I saw when I started Android Studio. There’s no “Hey click this link to find out how you can remedy this.” Just an OK button that closes the app. Add a link to a troubleshooting guide and I think you’ll save a handful of folks who were struggling like I was.</p>
<h2>Update 01/24/2015</h2>
<p>Looks like there’s <a href="https://code.google.com/p/android/issues/detail?id=82378">a ticket to address this issue</a>. According to the team:</p>
<blockquote>
<p>In the next version of Android Studio, if no java 6 is found but 7 (or greater) is found then it will use that instead. We still recommend running studio with Java 6 due to improved font rendering, but there is no work around needed if, for example, only java 8 is found.</p>
</blockquote>
<p>So it seems like much of the confusion is around using Java 7 (or 8) instead of Java 6. If 6 is the required version it would be nice to link directly to it instead of pointing everyone to the JDK download page which has the latest versions at the top. Still, I’m happy to see this issue is being resolved.</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>@font-face doesn&#39;t work in Shadow DOM</title>
    <link href="https://robdodson.me/posts/at-font-face-doesnt-work-in-shadow-dom/"/>
    <updated>2013-11-19T17:27:00+00:00</updated>
    <id>https://robdodson.me/posts/at-font-face-doesnt-work-in-shadow-dom/</id>
    <content type="html"><![CDATA[
      <p>I was building custom elements with Polymer the other day, and I thought it would be cool to include Font Awesome for some sweet icon goodness. Everything was going great, until I switched over to Chrome to check my work.</p>
<p><img src="/images/2015/01/polymer-fonts-busted.png" alt="A screenshot of glyphs showing rectangles instead of the expected icons." title="Something tells me this is not right..."></p>
<p>I did some digging and manged to turn up <a href="https://groups.google.com/d/msg/polymer-dev/UUwew3x82EU/m9x2qWPi9ZoJ">this thread</a> on the Polymer mailing list.</p>
<h2>The Fix</h2>
<p>I had a bit of an “aha moment” when I remembered that the Shadow DOM is encapsulating those styles in a shadow boundary. A workaround is to pull your <code>@font-face</code> rules out of the stylesheet for your element, and move them to the top of your import.</p>
<p><em>Note to readers: This is old Polymer code but the idea is essentially the same. Move your @ rules into the global scope instead of putting them in the Shadow DOM.</em></p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"><br><span class="highlight-line">  <span class="token atrule"><span class="token rule">@font-face</span></span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token property">font-family</span><span class="token punctuation">:</span> <span class="token string">'FontAwesome'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token property">src</span><span class="token punctuation">:</span> <span class="token url">url('../fonts/fontawesome-webfont.eot?v=4.0.3')</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token property">src</span><span class="token punctuation">:</span> <span class="token url">url('../fonts/fontawesome-webfont.eot?#iefix&amp;v=4.0.3')</span> <span class="token function">format</span><span class="token punctuation">(</span><span class="token string">'embedded-opentype'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token url">url('../fonts/fontawesome-webfont.woff?v=4.0.3')</span></span><br><span class="highlight-line">        <span class="token function">format</span><span class="token punctuation">(</span><span class="token string">'woff'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token url">url('../fonts/fontawesome-webfont.ttf?v=4.0.3')</span> <span class="token function">format</span><span class="token punctuation">(</span><span class="token string">'truetype'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token url">url('../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular')</span></span><br><span class="highlight-line">        <span class="token function">format</span><span class="token punctuation">(</span><span class="token string">'svg'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token property">font-weight</span><span class="token punctuation">:</span> normal<span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token property">font-style</span><span class="token punctuation">:</span> normal<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">></span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>polymer-element</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>semantic-ui-icon<span class="token punctuation">"</span></span> <span class="token attr-name">noscript</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>template</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>./icon.css<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>content</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>content</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>template</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>polymer-element</span><span class="token punctuation">></span></span></span></code></pre>
<p>I found this approach <a href="http://www.polymer-project.org/docs/polymer/styling.html#making-styles-global">in the Polymer documentation</a>, so I’m hoping it’s considered a best practice. <strong>You’ll also need to do this if you’re using <code>@-webkit-keyframes</code> rules</strong>.</p>
<p>I hope that clears things up for some of you who may have been stuck. I know it took me a couple days to come up with this solution, so I thought it best to go ahead and post about it :)</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Exploring HTML Imports</title>
    <link href="https://robdodson.me/posts/exploring-html-imports/"/>
    <updated>2013-08-20T20:07:00+00:00</updated>
    <id>https://robdodson.me/posts/exploring-html-imports/</id>
    <content type="html"><![CDATA[
      <p><a href="http://robdodson.me/blog/2013/03/17/why-web-components/">Web Components</a> have come a long way in the past few months and one of the technologies that I’m most interested in is <a href="https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/imports/index.html">HTML Imports</a> (or “imports”, for short). Imports allow you to load additional documents into your page without having to write a bunch of ajax. This is great for <a href="https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html">Custom Elements</a> where you might want to import a suite of new tags. I spent the day playing with imports and thought it would be useful to write up my progress.</p>
<h2>The Lowdown</h2>
<p>Imports are a new type of <code>link</code> tag which should be familiar to you since that’s also how we load our stylesheets.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/path/to/styles.css<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span></code></pre>
<p>For an import we just replace the <code>rel</code> with one of type <code>import</code>.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>import<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/path/to/some/import.html<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span></code></pre>
<h2>Support</h2>
<p>Native imports are currently only available in Chrome. Be sure to check the <a href="http://caniuse.com/#feat=imports">support brackets on caniuse</a> to see if things have changed since the writing of this article. If you’d like to play with imports today you can leverage the <a href="http://webcomponents.org/">webcomponents.js</a> polyfill.</p>
<h2>A Basic Example</h2>
<p>OK so what’s a very basic import look like?</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token doctype">&lt;!DOCTYPE html></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Basic HTML Imports<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- Pull in our blog post example --></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>import<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/imports/blog-post.html<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Hello World!<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>In its simplest form an import works just like calling a stylesheet. We have to make sure there’s a document to import so let’s create a fake blog post in <code>imports/blog-post.html</code>.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>blog-post<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>Awesome header<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Here is some really interesting paragraph content.<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span></code></pre>
<p>To test, you’ll need to host your <code>index.html</code> and <code>imports/</code> folder on a local server. I recommend <a href="https://github.com/visionmedia/serve">serve</a> if you don’t already have one installed.</p>
<p>Once you have that setup, visit your index page. If you take a look at the console you can see the request returning.</p>
<p><img src="/images/2014/12/imports-console.jpg" alt="Our first HTML import!"></p>
<p>Well that’s cool, but now what?</p>
<p>Let’s grab the content of the import using some JavaScript and append it to the body. We’ll do this back in our <code>index.html</code>.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Hello World!<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">    <span class="token keyword">var</span> link <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'link[rel=import]'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> content <span class="token operator">=</span> link<span class="token punctuation">.</span>import<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'#blog-post'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    document<span class="token punctuation">.</span>body<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>document<span class="token punctuation">.</span><span class="token function">importNode</span><span class="token punctuation">(</span>content<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br>  </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span></code></pre>
<p>First we query the <code>link</code> tag which loaded our import. Then we extract our <code>#blog-post</code> element and store it in a variable called <code>content</code>. In browsers with native support for imports (i.e. Chrome and Opera) notice that we don’t have to write any event handler code to wait till the import has loaded, we can just assume the content is there and start working with it. Finally we add the new content to our <code>body</code>.</p>
<p>If you’re following along you should end up with something like this:</p>
<p><img src="/images/2014/12/imports-screen1.jpg" alt="Basic Import Example"></p>
<p>Exciting, I know ;) But it demonstrates a no frills approach to loading content that doesn’t require ajax and writing our own event handlers. Let’s keep digging to see what else we find…</p>
<h2>A Basic Example with Polymer</h2>
<p>Polymer is a library that sugars the Web Components APIs and seeks to enable the use of Web Components in all modern browsers. The hope is that devolopers will use Polymer to inform the W3C on which direction to take with Web Components; so rather than wait for a stinky spec, we can guide the implementation process.</p>
<p>Polymer attempts to keep parity with the the evolving specifications but obviously there are some places where the API must differ because of the limitations of current browsers. In the case of HTML Imports, Polymer waits for the <code>DOMContentLoaded</code> event before triggering the actual import process. This means we need to listen for the <code>HTMLImportsLoaded</code> event on either <code>window</code> or <code>document</code> to know when it is finished. Let’s add that to our <code>index.html</code>.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token doctype">&lt;!DOCTYPE html></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Basic HTML Imports<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>import<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/imports/blog-post.html<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Hello World!<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- Include platform.js --></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/bower_components/webcomponentsjs/webcomponents.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- Listen for the HTMLImportsLoaded event --></span></span><br>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">      window<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">'HTMLImportsLoaded'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token keyword">var</span> link <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'link[rel=import]'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token keyword">var</span> content <span class="token operator">=</span> link<span class="token punctuation">.</span>import<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'#blog-post'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        document<span class="token punctuation">.</span>body<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>document<span class="token punctuation">.</span><span class="token function">importNode</span><span class="token punctuation">(</span>content<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br>    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>Using the above we should get the same results as before.</p>
<p><img src="/images/2014/12/imports-screen1.jpg" alt="Basic Import Example with Polymer"></p>
<p>You might notice that I used <code>webcomponents.js</code> instead of only including the <a href="http://webcomponents.org/polyfills/html-imports/">HTML Imports polyfill</a>. The Web Components polyfills are structured so you can take any of the polyfills à la carte but I find it’s easier to just include all of <code>webcomponents.js</code> when I’m experimenting, rather than worry if I have each individual polyfill loaded. That’s just personal preference (in other words: I’m lazy).</p>
<h2>Using Scripts in our Imports</h2>
<p>Let’s look at using <code>&lt;script&gt;</code> tags inside of our import. We’ll start by removing the <code>&lt;script&gt;</code> block from our <code>index.html</code>.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token doctype">&lt;!DOCTYPE html></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Basic HTML Imports<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>import<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/imports/blog-post.html<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>Boring header<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Hello World!<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>Then we’ll transfer that script block over to our blog post in <code>imports/blog-post.html</code>.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>blog-post<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"><br><span class="highlight-line">    <span class="token selector">h1</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token property">background</span><span class="token punctuation">:</span> lightgreen<span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token property">color</span><span class="token punctuation">:</span> green<span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token selector">p</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token property">font-size</span><span class="token punctuation">:</span> 16px<span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token property">font-family</span><span class="token punctuation">:</span> Helvetica<span class="token punctuation">,</span> Arial<span class="token punctuation">,</span> sans-serif<span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token property">color</span><span class="token punctuation">:</span> green<span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token property">font-weight</span><span class="token punctuation">:</span> bold<span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br>  </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>Awesome header<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    Here is some really interesting paragraph content. It comes with its own stylesheet!</span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">  <span class="token comment">// thisDoc refers to the "importee", which is blog-post.html</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> thisDoc <span class="token operator">=</span> document<span class="token punctuation">.</span>currentScript<span class="token punctuation">.</span>ownerDocument<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// thatDoc refers to the "importer", which is index.html</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> thatDoc <span class="token operator">=</span> document<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// grab the contents of the #blog-post from this document</span></span><br><span class="highlight-line">  <span class="token comment">// and append it to the importing document.</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> content <span class="token operator">=</span> thisDoc<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'#blog-post'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  thatDoc<span class="token punctuation">.</span>body<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>thatDoc<span class="token punctuation">.</span><span class="token function">importNode</span><span class="token punctuation">(</span>content<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre>
<p>If we run this we should get the following output <em>(note: I’ve included a style element as well)</em>.</p>
<p><img src="/images/2014/12/imports-screen2.jpg" alt="Imports with Styles"></p>
<p>An important thing to take notice of is the relationship between <code>thisDoc</code> and <code>thatDoc</code>. <code>thisDoc</code> refers to the <code>blog-post.html</code> document, while <code>thatDoc</code> refers to our <code>index.html</code> file. It’s useful to distinguish between the two so we can <code>querySelector</code> for <code>#blog-post</code> and not worry that we may have grabbed something out of the importing document. <em>Thanks to <a href="https://twitter.com/coonsta">Dominic Cooney</a> for the heads up on this.</em></p>
<p>You’ll also notice that since the import has access to our <code>document</code> object it is able to add itself to the page. In practice you probably wouldn’t want imports adding themselves wherever, but the important takeaway is that <strong>anything imported can access the main <code>document</code></strong>. This means an import could register itself as a Custom Element using our <code>document</code> object and we wouldn’t need to write any additional code. We’re almost to that point so let’s keep going…</p>
<h2>Using Templates in our Imports</h2>
<p>I’m getting a little tired of our fake “blog post” so let’s switch over to something more practical. We’ll use <a href="http://www.chartjs.org/">Chart.js</a> to create a very simple pie diagram and we’ll use the new <code>&lt;template&gt;</code> tag to hold the contents of our import. If you haven’t heard of the template tag before <a href="/html5-template-tag-introduction">check out this introduction</a>.</p>
<p>I’ve updated the <code>index.html</code> so it imports a new <code>chart.html</code> file.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token doctype">&lt;!DOCTYPE html></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Imports with Templates<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- Make sure to import chart.html --></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>import<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/imports/chart.html<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>Quarterly Pokemon Sales<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>Here’s what <code>imports/chart.html</code> looks like:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token comment">&lt;!-- Include Chart.js so our import can use it --></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/lib/Chart.min.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>template</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>chart-pie<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>canvas</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>myChart<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>200<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>200<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>canvas</span><span class="token punctuation">></span></span></span><br>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">    <span class="token keyword">var</span> data <span class="token operator">=</span> <span class="token punctuation">[</span></span><br><span class="highlight-line">      <span class="token punctuation">{</span></span><br><span class="highlight-line">        value<span class="token punctuation">:</span> <span class="token number">30</span><span class="token punctuation">,</span></span><br><span class="highlight-line">        color<span class="token punctuation">:</span> <span class="token string">'#F38630'</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token punctuation">{</span></span><br><span class="highlight-line">        value<span class="token punctuation">:</span> <span class="token number">50</span><span class="token punctuation">,</span></span><br><span class="highlight-line">        color<span class="token punctuation">:</span> <span class="token string">'#E0E4CC'</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token punctuation">{</span></span><br><span class="highlight-line">        value<span class="token punctuation">:</span> <span class="token number">100</span><span class="token punctuation">,</span></span><br><span class="highlight-line">        color<span class="token punctuation">:</span> <span class="token string">'#69D2E7'</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Get the context of the canvas element we want to select</span></span><br><span class="highlight-line">    <span class="token comment">// It's ok to use document here because this script block won't</span></span><br><span class="highlight-line">    <span class="token comment">// activate till it's added to the page.</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> ctx <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'myChart'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getContext</span><span class="token punctuation">(</span><span class="token string">'2d'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> myNewChart <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Chart</span><span class="token punctuation">(</span>ctx<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Pie</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br>  </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>template</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">  <span class="token comment">// thisDoc refers to the "importee", which is chart.html</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> thisDoc <span class="token operator">=</span> document<span class="token punctuation">.</span>currentScript<span class="token punctuation">.</span>ownerDocument<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// thatDoc refers to the "importer", which is index.html</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> thatDoc <span class="token operator">=</span> document<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// grab the contents of #chart-pie from this document</span></span><br><span class="highlight-line">  <span class="token comment">// and append it to the importing document.</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> template <span class="token operator">=</span> thisDoc<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'#chart-pie'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  thatDoc<span class="token punctuation">.</span>body<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>thatDoc<span class="token punctuation">.</span><span class="token function">importNode</span><span class="token punctuation">(</span>content<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre>
<p>We’re creating a new <code>&lt;template&gt;</code> which contains a canvas tag and a script block to create our pie chart. The advantage of using a template tag is that any script blocks inside of it will not execute until we clone the contents and add them to the DOM.</p>
<p>Running the above gives us this:</p>
<p><img src="/images/2014/12/imports-template.jpg" alt="Imports with Template"></p>
<p>Well this is interesting. We’re importing an entire pie chart and our index page isn’t cluttered with a bunch of code. Unfortunately we don’t have much control over where the pie chart ends up. It would be nice if we could turn the contents of the import into a tag and place that wherever we please. Thankfully Custom Elements let us do just that!</p>
<h2>Using Custom Elements in our Imports</h2>
<p><em>I’ll say in advance that you might need to read through this section a few times before you fully grok it. We’re going to touch on a lot of new stuff so consider this the bonus round :)</em></p>
<p>The final markup for our <code>index.html</code> file is going to look like this:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token doctype">&lt;!DOCTYPE html></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Imports with Custom Elements<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>import<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/imports/chart.html<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>Quarterly Pokemon Sales<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>chart-pie</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>chart-pie</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>chart-pie</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>chart-pie</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>chart-pie</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>chart-pie</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>We’re going to use our new Custom Element, <code>chart-pie</code>, which will allow us to produce pie charts wherever we want. The result will look like this:</p>
<p><img src="/images/2014/12/imports-custom-elements.jpg" alt="Imports with Custom Elements"></p>
<p>Obviously not the most amazing thing ever, but from a practical perspective being able to drop a pie chart on your page with one line of HTML is pretty sweet.</p>
<p>To create the <code>chart-pie</code> tag we’ll need to create a <a href="https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html">Custom Element</a>. Custom Elements are new tags with a lifecycle of JavaScript callbacks. Typically they use <a href="http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/">Shadow DOM</a> to hide their internal markup and expose attributes and specific styles to the client. For a full primer on Custom Elements, check out <a href="http://www.html5rocks.com/en/tutorials/webcomponents/customelements/">this article by Eric Bidelman on HTML5Rocks</a>.</p>
<p>Here’s what our updated <code>imports/chart.html</code> looks like.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/lib/Chart.min.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>template</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>chart-pie<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>canvas</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>myChart<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>200<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>200<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>canvas</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>template</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">  <span class="token comment">// thisDoc refers to the "importee", which is chart.html</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> thisDoc <span class="token operator">=</span> document<span class="token punctuation">.</span>currentScript<span class="token punctuation">.</span>ownerDocument<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// thatDoc refers to the "importer", which is index.html</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> thatDoc <span class="token operator">=</span> document<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">var</span> template <span class="token operator">=</span> thisDoc<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'#chart-pie'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Make sure you extend an existing HTMLElement prototype</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> ChartPieProto <span class="token operator">=</span> Object<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token class-name">HTMLElement</span><span class="token punctuation">.</span>prototype<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Setup optional lifecycle callbacks</span></span><br><span class="highlight-line">  ChartPieProto<span class="token punctuation">.</span><span class="token function-variable function">createdCallback</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">// Create a shadow root to hold our template content</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> root <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">createShadowRoot</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> clone <span class="token operator">=</span> thatDoc<span class="token punctuation">.</span><span class="token function">importNode</span><span class="token punctuation">(</span>template<span class="token punctuation">.</span>content<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Create the pie chart with Chart.js</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> data <span class="token operator">=</span> <span class="token punctuation">[</span></span><br><span class="highlight-line">      <span class="token punctuation">{</span></span><br><span class="highlight-line">        value<span class="token punctuation">:</span> <span class="token number">30</span><span class="token punctuation">,</span></span><br><span class="highlight-line">        color<span class="token punctuation">:</span> <span class="token string">'#F38630'</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token punctuation">{</span></span><br><span class="highlight-line">        value<span class="token punctuation">:</span> <span class="token number">50</span><span class="token punctuation">,</span></span><br><span class="highlight-line">        color<span class="token punctuation">:</span> <span class="token string">'#E0E4CC'</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token punctuation">{</span></span><br><span class="highlight-line">        value<span class="token punctuation">:</span> <span class="token number">100</span><span class="token punctuation">,</span></span><br><span class="highlight-line">        color<span class="token punctuation">:</span> <span class="token string">'#69D2E7'</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">//Get the context of the canvas element we want to select</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> ctx <span class="token operator">=</span> clone<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'.myChart'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getContext</span><span class="token punctuation">(</span><span class="token string">'2d'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> myNewChart <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Chart</span><span class="token punctuation">(</span>ctx<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Pie</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Add the template content + chart to our Shadow DOM</span></span><br><span class="highlight-line">    root<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>clone<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">var</span> ChartPie <span class="token operator">=</span> thatDoc<span class="token punctuation">.</span><span class="token function">registerElement</span><span class="token punctuation">(</span><span class="token string">'chart-pie'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>prototype<span class="token punctuation">:</span> ChartPieProto<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token comment">//var chartPie = new ChartPie();</span></span><br><span class="highlight-line">  <span class="token comment">//var chartPie = document.createElement('chart-pie');</span></span><br></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre>
<p>Let’s walk through it piece by piece.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>template</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>chart-pie<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>canvas</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>myChart<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>200<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>200<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>canvas</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>template</span><span class="token punctuation">></span></span></span></code></pre>
<p>On lines 1-3 we’ve shortened the <code>template</code> down so that it only contains our <code>canvas</code> tag. We’ll use the Custom Element <code>createdCallback</code> to actually instantiate the chart in here.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// thisDoc refers to the "importee", which is chart.html</span></span><br><span class="highlight-line"><span class="token keyword">var</span> thisDoc <span class="token operator">=</span> document<span class="token punctuation">.</span>currentScript<span class="token punctuation">.</span>ownerDocument<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// thatDoc refers to the "importer", which is index.html</span></span><br><span class="highlight-line"><span class="token keyword">var</span> thatDoc <span class="token operator">=</span> document<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> template <span class="token operator">=</span> thisDoc<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'#chart-pie'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Lines 6-12 should look familar from the last example. We’re storing our two documents in variables and querying for the template tag.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> ChartPieProto <span class="token operator">=</span> Object<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token class-name">HTMLElement</span><span class="token punctuation">.</span>prototype<span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>On line 15 we define the prototype for our Custom Element called <code>ChartPieProto</code>. This prototype extends the <code>HTMLElement</code> prototype which is a requirement for creating a new element.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">ChartPieProto<span class="token punctuation">.</span><span class="token function-variable function">createdCallback</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token operator">...</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>On line 20 we see the first lifecycle callback, <code>createdCallback</code>. The <code>createdCallback</code> is run every time the parser hits a new instance of our tag. Therefore we can use it as a kind of constructor to kickoff the creation of our chart. We’ll want to create a new chart instance for each tag so all of our Chart.js code has been moved inside of this callback.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> root <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">createShadowRoot</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token keyword">var</span> clone <span class="token operator">=</span> thatDoc<span class="token punctuation">.</span><span class="token function">importNode</span><span class="token punctuation">(</span>template<span class="token punctuation">.</span>content<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>On lines 22-23 we create a <a href="http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/">Shadow DOM</a> to hold the markup for our chart.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> data <span class="token operator">=</span> <span class="token punctuation">[</span></span><br><span class="highlight-line">  <span class="token punctuation">{</span></span><br><span class="highlight-line">    value<span class="token punctuation">:</span> <span class="token number">30</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    color<span class="token punctuation">:</span> <span class="token string">'#F38630'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token punctuation">{</span></span><br><span class="highlight-line">    value<span class="token punctuation">:</span> <span class="token number">50</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    color<span class="token punctuation">:</span> <span class="token string">'#E0E4CC'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token punctuation">{</span></span><br><span class="highlight-line">    value<span class="token punctuation">:</span> <span class="token number">100</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    color<span class="token punctuation">:</span> <span class="token string">'#69D2E7'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">//Get the context of the canvas element we want to select</span></span><br><span class="highlight-line"><span class="token keyword">var</span> ctx <span class="token operator">=</span> clone<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'.myChart'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getContext</span><span class="token punctuation">(</span><span class="token string">'2d'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token keyword">var</span> myNewChart <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Chart</span><span class="token punctuation">(</span>ctx<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Pie</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Lines 26-43 should look familiar. It’s the same Chart.js code from before except now we use <code>querySelector</code> to find the contents of the template clone and we’re using a class for <code>myChart</code> instead of an id.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">root<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>clone<span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>On line 46 we add the new content to our Shadow DOM.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> ChartPie <span class="token operator">=</span> thatDoc<span class="token punctuation">.</span><span class="token function">registerElement</span><span class="token punctuation">(</span><span class="token string">'chart-pie'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>prototype<span class="token punctuation">:</span> ChartPieProto<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Line 49 is where we actually register our Custom Element and assign it to the name <code>chart-pie</code>. From here you can either place a <code>&lt;chart-pie&gt;&lt;/chart-pie&gt;</code> tag somewhere on your page, or use JavaScript to instantiate an instance and add it to the <code>document</code>. This is demonstrated in the comments on lines 50-51. If you refer back to our <code>index.html</code> example we just use the <code>&lt;chart-pie&gt;</code> tag.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token doctype">&lt;!DOCTYPE html></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Imports with Custom Elements<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>import<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/imports/chart.html<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>Quarterly Pokemon Sales<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>chart-pie</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>chart-pie</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>chart-pie</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>chart-pie</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>chart-pie</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>chart-pie</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>Which produces this:</p>
<p><img src="/images/2014/12/imports-custom-elements.jpg" alt=""></p>
<h2>Conclusion</h2>
<p>If you’ve made it this far congrats and thanks for hanging in there! I know that last section was a little crazy but stop for a moment and think about what we just did.</p>
<p>By using an HTML Import we were able to pull in a document which added a new tag to our application. Imagine if <em>all</em> of Chart.js was written in this manner. There would be no need for us to write any glue code to generate a chart ever again. That would allow us to focus only on the code that matters to our application, and leave all that other boilerplate tucked away inside of Custom Elements.</p>
<p>Over the next few months I’ll be blogging exclusively about this topic because I think it’s really interesting so check back later for more!</p>
<p>Till then make sure to <a href="http://twitter.com/rob_dodson">hit me up on Twitter</a> if you have any questions or leave a note in the comments. Thanks!</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>nth-child is weird</title>
    <link href="https://robdodson.me/posts/nth-child-is-weird/"/>
    <updated>2013-08-04T17:55:00+00:00</updated>
    <id>https://robdodson.me/posts/nth-child-is-weird/</id>
    <content type="html"><![CDATA[
      <p>I ran into a CSS gotcha today and it brought up an interesting (and important)
question: What’s the difference between <code>nth-child</code> and <code>nth-of-type</code>?</p>
<h2>Comparing two things or one</h2>
<p>Take a look at this sample code to get a feel for what we’re talking about.</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"><br><span class="highlight-line"><span class="token selector">p:nth-child(2)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">background-color</span><span class="token punctuation">:</span> green<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">></span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>This paragraph is not green<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>This paragraph *is* green<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span></code></pre>
<p>You’ll notice that we’re setting our second <code>p</code> element to have a
<code>background-color</code> of <code>green</code>. To do this we use <code>p:nth-child(2)</code>. I think the
way most people (myself included) would read that selector is “select the second
child paragraph”. But if we change the markup to look like this:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>Hello World!<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>This paragraph is not green :(<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>This paragraph is green!<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span></code></pre>
<p>Suddenly our green background moves to the wrong element. What gives?!</p>
<p><a href="http://css-tricks.com/the-difference-between-nth-child-and-nth-of-type/">Chris Coyier helpfully explains on CSS-Tricks.</a></p>
<blockquote>
<p>Our :nth-child selector, in “Plain English,” means select an element <em>if</em>:</p>
<ul>
<li>It is a paragraph element</li>
<li>It is the second child of a parent</li>
</ul>
</blockquote>
<p>Since we’ve added another child in the form of an <code>h1</code> tag, we need to now say
<code>p:nth-child(3)</code> if we want to select the same element. In my mind that makes
the <code>nth-child</code> tag brittle and somewhat counterintuitive.</p>
<p>Thankfully there’s an alternative in form of the <code>nth-of-type</code> selector.</p>
<pre class="language-css"><code class="language-css"><span class="highlight-line"><span class="token selector">p:nth-of-type(2)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">background-color</span><span class="token punctuation">:</span> green<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>Again, quoting <a href="http://css-tricks.com/the-difference-between-nth-child-and-nth-of-type/">Mr. Coyier</a>:</p>
<blockquote>
<p>Our :nth-of-type selector, in “Plain English,” means:</p>
<ul>
<li>Select the second paragraph child of a parent</li>
</ul>
</blockquote>
<p>So <code>nth-of-type</code> gives us the functionality we were originally looking for and
doesn’t require us to change our markup if we add additional child elements
which use different tags. That’s pretty sweet!</p>
<p>If you want to play around with the idea <a href="http://codepen.io/robdodson/pen/GzuKH">I’ve put together a codepen.</a> Enjoy!</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>RequireJS: Embracing the Awesomness of AMD Modules</title>
    <link href="https://robdodson.me/posts/requirejs-embracing-the-awesomness-of-amd-modules/"/>
    <updated>2013-03-22T04:57:00+00:00</updated>
    <id>https://robdodson.me/posts/requirejs-embracing-the-awesomness-of-amd-modules/</id>
    <content type="html"><![CDATA[
      <p>Over the past few weeks I put together this talk for my team at GE to help get
everyone on the same page with AMD modules. I figured it’d be cool if I removed
any GE specific stuff and open sourced the presentation, so here it is!</p>
<iframe width="100%" height="400" src="https://www.youtube.com/embed/vWGuaZOTR4U" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>The video is around 35 minutes long and there’s a slide deck available on Github
that has clickable links and whatnot. Enjoy!</p>
<p><a href="https://github.com/robdodson/requirejs-presentation">Slidedeck on Github</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>HTML5 Template Tag: Introduction</title>
    <link href="https://robdodson.me/posts/html5-template-tag-introduction/"/>
    <updated>2013-03-16T16:51:00+00:00</updated>
    <id>https://robdodson.me/posts/html5-template-tag-introduction/</id>
    <content type="html"><![CDATA[
      <h2>Our first template</h2>
<p>There’s a great <a href="http://www.html5rocks.com/en/tutorials/webcomponents/template/">HTML5Rocks article</a> on the subject of the <code>template</code> tag and I’m going to steal some of their examples.</p>
<p>Let’s start by making a template for an image placeholder.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>template</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>kitten-template<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>random kitten image<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h3</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>title<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h3</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>template</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>kittens<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">  <span class="token keyword">const</span> template <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'#kitten-template'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  template<span class="token punctuation">.</span>content<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'img'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>src <span class="token operator">=</span> <span class="token string">'https://placekitten.com/400/400'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  template<span class="token punctuation">.</span>content<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'.title'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>textContent <span class="token operator">=</span></span><br><span class="highlight-line">    <span class="token string">'Random image from placekitten.com'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  document</span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'#kittens'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>document<span class="token punctuation">.</span><span class="token function">importNode</span><span class="token punctuation">(</span>template<span class="token punctuation">.</span>content<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre>
<p>If you’ve worked with client-side template libraries like underscore or handelbars the above should look familiar to you. Where underscore and handelbars take advantage of putting their templates inside of <code>&lt;script&gt;</code> tags and changing the <code>type</code> to something like <code>text/x-handlebars-template</code>, the <code>&lt;template&gt;</code> tag doesn’t need to, because it’s actually part of the HTML spec. There are pros and cons to this approach.</p>
<h3>Pros</h3>
<ul>
<li>The content of the template is inert: scripts won’t run, images won’t load, audio won’t play, etc. This means you can have <code>&lt;img&gt;</code> and <code>&lt;script&gt;</code> tags whose <code>src</code> attributes haven’t been defined yet.</li>
<li>The child nodes of a template are hidden from selectors like <code>document.getElementById()</code> and <code>querySelector()</code> so you won’t accidentally select them.</li>
<li>You can place the <code>&lt;template&gt;</code> pretty much anywhere on the page and grab it later.</li>
</ul>
<h3>Cons</h3>
<ul>
<li>You can’t precompile the template into a JS function like you can with other libraries like handlebars.</li>
<li>You can’t preload the assets referenced by a template (images, sounds, css, js).</li>
<li>You can’t nest templates inside of one another and have them automagically work. If a template contains another template you’ll have to activate the child, then activate the parent.</li>
<li>There’s no support for data interpolation (i.e. filling a template with values from a JS object).</li>
</ul>
<p>Given that list of cons you might say “Well why would I ever bother with the <code>&lt;template&gt;</code> tag if something like handlebars gives me way more power?” That’s a great question because by itself the <code>&lt;template&gt;</code> tag doesn’t seem so impressive.</p>
<p>Its saving grace lies in the fact that it is part of the DOM, whereas all other template libraries are actually just pushing around Strings. That makes them vulnerable to XSS and requires weird hacks to prevent the browser from rendering their content.</p>
<p>While features like data interpolation are pretty crucial, they can be fixed by the next generation of template libraries, in fact <a href="https://lit-html.polymer-project.org/">lit-html</a> has already added this back in. Which leads to the bigger point: combining templates with Shadow DOM and Custom Elements gives us the future component model for the web, and that’s why I’m truly excited to use them.</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Asynchronous Grunt Tasks</title>
    <link href="https://robdodson.me/posts/asynchronous-grunt-tasks/"/>
    <updated>2012-11-29T16:15:00+00:00</updated>
    <id>https://robdodson.me/posts/asynchronous-grunt-tasks/</id>
    <content type="html"><![CDATA[
      <p><em>Update: Thanks to <a href="https://twitter.com/waynemoir">@waynemoir</a> for updating the example source to work with Grunt ~0.4.</em></p>
<p>After my last post <a href="https://twitter.com/stevensacks">@stevensacks</a> tweeted at me that he was having issues getting node FileSystem commands to work in grunt. After a bit of poking around I noticed that there was no call to grunt’s <code>async</code> method, which was probably preventing the process from finishing properly. So today’s post is a primer on async grunt processes, and how to make sure your node and grunt syntax is setup correctly.</p>
<h2><a href="https://github.com/robdodson/async-grunt-tasks">Grab the Example Source</a></h2>
<p>I’ve provided a simple grunt project at the link above. Take a look at the <code>tasks</code> folder and you should see two custom tasks, <code>grunt-read-write-local.js</code> and <code>grunt-read-write-web.js</code>. The former will read a local file and write its contents to a new file. The latter will request a webpage and write its contents to a static file.</p>
<p>There are two asynchronous APIs at play here (Node’s and Grunt’s) and it’s important to understand both.</p>
<p>In Node an async operation will usually provide a callback, such is the case for <a href="http://nodejs.org/api/fs.html#fs_fs_readfile_filename_encoding_callback">fs.readFile</a>, or it will use an event dispatch, for instance in an http request we listen for the <a href="http://nodejs.org/api/http.html#http_event_data">data event.</a></p>
<p>Grunt, on the other hand, uses a token or a kind of promise. You grab a reference to grunt’s <code>done</code> function and you wait till your node process has finished before calling it. If you take a look at <code>grunt-read-write-local.js</code> you can see that we first call the async method to let grunt know it needs to wait:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> done <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">async</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>and as we finish writing our file we tell grunt that everything completed succesfully and it’s ok to carry on:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// Write the contents of the target file to the new location</span></span><br><span class="highlight-line">fs<span class="token punctuation">.</span><span class="token function">writeFile</span><span class="token punctuation">(</span>pathToWrite<span class="token punctuation">,</span> data<span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">err</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token keyword">throw</span> err<span class="token punctuation">;</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>pathToWrite <span class="token operator">+</span> <span class="token string">' saved!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token comment">// Tell grunt the async task is complete</span></span><br><span class="highlight-line">  <span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>We do something similar in our <code>grunt-read-write-web</code> task but this time we work with <a href="http://nodejs.org/api/stream.html#stream_stream">Stream events.</a></p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// Tell grunt this task is asynchronous.</span></span><br><span class="highlight-line"><span class="token keyword">var</span> done <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">async</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">http</span><br><span class="highlight-line">  <span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>pathToRead<span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">res</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">// Pipe the data from the response stream to</span></span><br><span class="highlight-line">    <span class="token comment">// a static file.</span></span><br><span class="highlight-line">    res<span class="token punctuation">.</span><span class="token function">pipe</span><span class="token punctuation">(</span>fs<span class="token punctuation">.</span><span class="token function">createWriteStream</span><span class="token punctuation">(</span>pathToWrite<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token comment">// Tell grunt the async task is complete</span></span><br><span class="highlight-line">    res<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'end'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>pathToWrite <span class="token operator">+</span> <span class="token string">' saved!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span></span><br><span class="highlight-line">  <span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'error'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Got error: '</span> <span class="token operator">+</span> e<span class="token punctuation">.</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token comment">// Tell grunt the async task failed</span></span><br><span class="highlight-line">    <span class="token function">done</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>The response returned by an http request implements the <a href="http://nodejs.org/api/stream.html#stream_readable_stream">ReadableStream</a> interface so it will emit <code>data</code> and <code>end</code> events. Node Streams have a great feature called <a href="http://nodejs.org/api/stream.html#stream_stream_pipe_destination_options">pipes</a> which handle the work of consuming data events and writing them to a destination. Sexy :) We still listen for the <code>end</code> event coming from our request so we can notify grunt that the process has finished and it can move on.</p>
<h2><a href="https://github.com/robdodson/async-grunt-tasks">Grab the Example Source</a></h2>
<p>If you want to test it all out make sure you run <code>npm install</code> first to pull down any dependencies. Then kick things off by running <code>grunt</code>. I’m thinking my next post might be all about <a href="http://nodejs.org/api/stream.html#stream_stream">Streams</a> in node since they’re such a cool concept. Thanks to <a href="https://twitter.com/maxogden">@maxogden</a> and <a href="https://twitter.com/dominictarr">@dominictarr</a> for their great posts on the subject of streams.</p>
<ul>
<li><a href="http://maxogden.com/node-streams.html">Node Streams: How do they work? – Max Ogden</a></li>
<li><a href="https://gist.github.com/2401787">High Level Style in JavaScript – Dominic Tarr</a></li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>A RequireJS multi-page shimmed site: How-To</title>
    <link href="https://robdodson.me/posts/a-require-dot-js-multipage-shimmed-site-how-to/"/>
    <updated>2012-11-18T21:05:00+00:00</updated>
    <id>https://robdodson.me/posts/a-require-dot-js-multipage-shimmed-site-how-to/</id>
    <content type="html"><![CDATA[
      <p>I’ve been working with RequireJS a lot lately and found it really improves the way I manage my code. I had previous experience with Require in the context of some of my Backbone posts, but I’d never used it on a more traditional multi-page site before. The process of setting up Require on a multi-page site can be pretty confusing, so I thought I would put together this tutorial to help out others who might be stuck.</p>
<h2>Overview</h2>
<p><em>Note: This tutorial assumes you’re already familiar with RequireJS and its configuration options. If not, I recommend you <a href="http://requirejs.org/">check out the docs</a> before proceeding</em></p>
<h2><a href="https://github.com/robdodson/requirejs-multipage-shim-boilerplate">Grab the Boilerplate</a></h2>
<p>When building single-page apps, many people choose to compile all of their JavaScript into one file before deploying to production. While this may make the initial download size of the page larger, the hope is that it reduces section-to-section http requests, thus making the overall experience feel snappier and more app-like.</p>
<p>When working with a <em>multi-page site</em>, compiling everything into one file is probably not a good idea. Since you have no guarantee that the user will visit every page, you may be loading unnecessary JavaScript and slowing down the experience. Do you really need to load all of the JavaScript for the <strong>About</strong> page if the user is just visiting the <strong>Contact</strong> page?</p>
<p>The ideal scenario is one in which each page has its own <code>main</code> file that contains page-specific instructions and then a separate (hopefully cached) file that contains all of the commonly used JavaScript libraries.</p>
<p>For example, if you have a page called <strong>About</strong> and a page called <strong>Contact</strong> you would have <code>main-about.js</code> and <code>main-contact.js</code>. Let’s say <code>main-about.js</code> and <code>main-contact.js</code> both require <code>'jquery'</code> and <code>'underscore'</code>. We wouldn’t want to compile <code>jquery</code> and <code>underscore</code> into each <code>main</code> file because then we’re creating unnecessary bloat. Instead, we should create a <code>common.js</code> file which contains <code>jquery</code> and <code>underscore</code> and we’ll make sure that this file loads before any of our <code>main-*</code> files. Take a look at this diagram to help it sink in:</p>
<p><strong>OPTIMIZED SCRIPTS</strong></p>
<pre><code>common.js
----------------
js/vendor/jquery.js
js/vendor/underscore.js

About
----------------
js/common.js
js/app/main-about.js

Contact
----------------
js/common.js
js/app/main-contact.js
</code></pre>
<p>By compiling all of those libaries into <code>common.js</code> we’re reducing the number of http requests per page. Also, after the first page has loaded, <code>common.js</code> should be available from the browser’s cache. Now that you get the general concept, let’s take a look at an example.</p>
<h2>Examples!</h2>
<p><a href="https://twitter.com/jrburke">James Burke</a>, author of RequireJS, has done a great job putting together some example projects which show how to effectively structure your project so it can be run through the <a href="http://requirejs.org/docs/optimization.html">r.js optimization tool</a>. The one I typically refer to is the <a href="https://github.com/requirejs/example-multipage-shim">example-multipage-shim.</a> There’s also an <a href="https://github.com/requirejs/example-multipage">example-multipage</a>, but I tend to use the shim version because it seems like there’s always a few non-AMD scripts that end up in a project.</p>
<p>I’ve put together my own boilerplate, using Bootstrap 3 and GruntJS, which you guys are free to grab <a href="https://github.com/robdodson/requirejs-multipage-shim-tutorial">here.</a> The rest of this post will walk through this boilerplate.</p>
<h2>Learn you a boilerplate!</h2>
<p>If you’ve worked with RequireJS on a single page site, you’re probably used to defining a script tag that looks like this:</p>
<pre class="language-html"><code class="language-html"><span class="token comment">&lt;!--This sets the baseUrl to the "scripts" directory, and<br>    loads a script that will have a module ID of 'main'--></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">data-main</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>scripts/main.js<span class="token punctuation">"</span></span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>scripts/require.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span></code></pre>
<p>The <code>data-main</code> attribute is a convenience feature of RequireJS which sets Require’s <a href="http://requirejs.org/docs/api.html#config-baseUrl">baseUrl property.</a> You usually put some configuration options in the <code>main</code> file as well, for instance, if you’re loading a 3rd party library you might create a <a href="http://requirejs.org/docs/api.html#config-paths">path</a> so you can easily reference it. Since our boilerplate has different <code>main-*</code> files for each page, we’re going to put that configuration data into our <code>common.js</code> file instead.</p>
<p><em>Hold on, I thought you said common.js was where we were going to compile all of our libraries?</em></p>
<p>Indeed, you are correct astute reader. But since <code>common.js</code> is going to be loaded before any other required modules, why not put our configuration options in it as well? Here’s what the <code>common.js</code> file from our boilerplate looks like:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">//The build will inline common dependencies into this file.</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">requirejs<span class="token punctuation">.</span><span class="token function">config</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  baseUrl<span class="token punctuation">:</span> <span class="token string">'./js'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  paths<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    jquery<span class="token punctuation">:</span> <span class="token string">'vendor/jquery'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    bootstrap<span class="token punctuation">:</span> <span class="token string">'vendor/bootstrap'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  shim<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    bootstrap<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'jquery'</span><span class="token punctuation">]</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>You’ll note that we’re using <a href="http://twitter.github.com/bootstrap/">Twitter Bootstrap</a>, which is not AMD compliant out of the box, so we have to <code>shim</code> it. In this case it depends on <code>jquery</code>, so we list that as its only dependency and we’re good.</p>
<p>Aside from <code>common.js</code>, you should probably take a look in the <code>app/models</code> directory. I’ve created two models that extend a <code>BasicModel</code> in order to illustrate that the <code>common.js</code> file isn’t only for 3rd party code. <code>common.js</code> is really for any code that’s going to be used over and over on your site. We’ll toss the <code>BasicModel</code> into <code>common.js</code> during the build process.</p>
<h2>Just hit build already…</h2>
<p>O.K., O.K. I can tell you’re ready to see some fireworks. Before we hit build, I want to point out the <code>options.js</code> file. This is where we tell <code>r.js</code> which modules to compile and what each module should include or exclude.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  appDir<span class="token punctuation">:</span> <span class="token string">'www'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  baseUrl<span class="token punctuation">:</span> <span class="token string">'js/'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  mainConfigFile<span class="token punctuation">:</span> <span class="token string">'www/js/common.js'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  dir<span class="token punctuation">:</span> <span class="token string">'www-release'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  modules<span class="token punctuation">:</span> <span class="token punctuation">[</span></span><br><span class="highlight-line">    <span class="token punctuation">{</span></span><br><span class="highlight-line">      name<span class="token punctuation">:</span> <span class="token string">'common'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      include<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'app/models/basicModel'</span><span class="token punctuation">,</span> <span class="token string">'jquery'</span><span class="token punctuation">,</span> <span class="token string">'bootstrap'</span><span class="token punctuation">]</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token punctuation">{</span></span><br><span class="highlight-line">      name<span class="token punctuation">:</span> <span class="token string">'app/main-about'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      exclude<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'common'</span><span class="token punctuation">]</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token punctuation">{</span></span><br><span class="highlight-line">      name<span class="token punctuation">:</span> <span class="token string">'app/main-contact'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      exclude<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'common'</span><span class="token punctuation">]</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">]</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>You’ll note that first we put together our common module, then we tell the subsequent modules to exclude it. When you tell <code>r.js</code> to exclude a module it will find all of the nested dependencies in that module and exclude those as well. This is why we don’t need to tell <code>main-about</code> and <code>main-contact</code> to exclude <code>bootstrap</code>. It sees that <code>bootstrap</code> is already in <code>common</code>, so it knows to exclude it.</p>
<p>If you haven’t done so already, now is a good time to do an <code>npm install</code>. That should pull down all of the <code>grunt</code> dependencies. Speaking of <code>grunt</code>, you’ll need to install that as well if you’ve never used it <code>npm install -g grunt-cli</code>. You might notice in our <code>Gruntfile.js</code>, we are using a number of tasks from the <a href="https://github.com/gruntjs/grunt-contrib">grunt-contrib</a> library. <code>grunt-contrib</code> is a great resource, and I encourage you to spend some time looking through all of the tasks that fall under its umbrella.</p>
<p>O.K. Ready to rock. Just type <code>grunt</code> to build, or <code>grunt.cmd</code> if you’re on Windows (thanks <a href="http://twitter.com/stevensacks">@stevensacks</a>). When you’re finished, you should have a new folder called <code>www-release</code>. Check out the <code>build.txt</code> file to see where everything ended up.</p>
<pre><code>css/bootstrap-responsive.css
----------------
css/bootstrap-responsive.css

css/bootstrap.css
----------------
css/bootstrap.css

css/style.css
----------------
css/style.css

js/common.js
----------------
js/common.js
js/app/models/basicModel.js
js/vendor/bootstrap.js

js/app/main-about.js
----------------
js/app/models/aboutModel.js
js/app/main-about.js

js/app/main-contact.js
----------------
js/app/models/contactModel.js
js/app/main-contact.js
</code></pre>
<p>If you take a look at the <code>common.js</code> file in <code>www-release</code>, it should look like a big blob of minified code. That’s what we want to see. In this case it contains our <code>BasicModel</code>, Twitter Bootstrap, jQuery, and our original configuration code. If you refer to about.html you can see how we control the load order:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>./js/vendor/require.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>text/javascript<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">  <span class="token comment">// Load common code that includes config,</span></span><br><span class="highlight-line">  <span class="token comment">// then load the app logic for this page.</span></span><br><span class="highlight-line">  <span class="token function">require</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'./js/common'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">common</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">// ./js/common.js sets the baseUrl to be ./js/</span></span><br><span class="highlight-line">    <span class="token comment">// You can ask for 'app/main-about' here instead</span></span><br><span class="highlight-line">    <span class="token comment">// of './js/app/main-about'</span></span><br><span class="highlight-line">    <span class="token function">require</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'app/main-about'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre>
<p>First, we bring in RequireJS. Then we load <code>common.js</code>, and only <em>after</em><code>common.js</code> is loaded do we request the page specific code in <code>main-about</code>. If you stick to this structure, you should be able to layer your code so it’s easy to manage.</p>
<p><strong><a href="https://github.com/robdodson/requirejs-multipage-shim-tutorial">Grab the Example Source</a></strong></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>JavaScript Design Patterns: Factory</title>
    <link href="https://robdodson.me/posts/javascript-design-patterns-factory/"/>
    <updated>2012-09-03T19:40:00+00:00</updated>
    <id>https://robdodson.me/posts/javascript-design-patterns-factory/</id>
    <content type="html"><![CDATA[
      <p><strong><a href="/javascript-design-patterns/">Table of Contents</a></strong></p>
<p>Factories encapsulate and separate object creation from the rest of your code.
In situations where the creation of an object can be complex or subject to
change a factory can act as a nice buffer to help keep things tidy. Without
proper planning Factories can lead to class explosions; as a result the pattern
can be both a blessing and a curse depending on how it’s used.</p>
<h2>Formal Definition</h2>
<p><strong>Factory Method</strong></p>
<blockquote>
<p>Define an interface for creating an object, but let subclasses decide which
class to instantiate. Factory Method lets a class defer instantiation to
subclasses.</p>
</blockquote>
<p><strong>Abstract Factory</strong></p>
<p>Provide an interface for creating families of related or dependent objects
without specifying their concrete classes.</p>
<p><strong>Also Known As</strong></p>
<ul>
<li>Virtual Constructor (<strong>Factory Method</strong>)</li>
<li>Kit (<strong>Abstract Factory</strong>)</li>
</ul>
<h2>Simple Factory vs Factory Method vs Abstract Factory</h2>
<p>The phrase “Factory Pattern” is rather overloaded so I’m going to give you a
quick crash course in the three main types of factories.</p>
<p>A <strong>simple factory</strong> is an object which encapsulates the creation of another
object, shielding that code from the rest of your application.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> user <span class="token operator">=</span> UserFactory<span class="token punctuation">.</span><span class="token function">createUser</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>It’s common to parameterize simple factory methods to increase the number of
products they’re able to return.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> admin <span class="token operator">=</span> UserFactory<span class="token punctuation">.</span><span class="token function">createUser</span><span class="token punctuation">(</span><span class="token string">'admin'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token keyword">var</span> customer <span class="token operator">=</span> UserFactory<span class="token punctuation">.</span><span class="token function">createUser</span><span class="token punctuation">(</span><span class="token string">'customer'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>The actual implementaiton of <code>createUser</code> might look something like this:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">UserFactory<span class="token punctuation">.</span><span class="token function-variable function">createUser</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">type</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>type <span class="token operator">==</span> <span class="token string">'admin'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Admin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>type <span class="token operator">==</span> <span class="token string">'customer'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Customer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>Typically the return value from a factory is known as the <code>Product</code>. In the case
of our <code>UserFactory</code> there are two Products: <code>Admin</code> and <code>Customer</code>. It’s
important for these products to maintain a consistent interface so the client
can use any product from our factory without needing to do elaborate checks to
see if a particular method exists.</p>
<h3>Factory Method</h3>
<p>While the Simple Factory is a nice start and good for many situations it’s
possible to extend this even further through the use of the <strong>Factory Method</strong>
pattern.</p>
<blockquote>
<p>The Factory Method Pattern defines an interface
for creating an object, but lets subclasses decide which
class to instantiate. Factory Method lets a class defer
instantiation to subclasses.
<em>Elisabeth Freeman, Head First Design Patterns</em></p>
</blockquote>
<p>Factory Method defines one method, <code>createThing</code> for instance, which is
overriden by subclasses who decide what to return. The Factories and Products
must conform to interfaces for clients to be able to use them.</p>
<p>In <em>Head First Design Patterns</em> a Factory Method pattern is used to allow a
PizzaStore to define many subclasses such as ChicagoPizzaStore,
CaliforniaPizzaStore, NewYorkPizzaStore. Each subclass overrides <code>createPizza</code>
and returns its own particular style of pizza (ie: a ChicagoPizza or a
CaliforniaPizza). The main take away is that there is only one method,
<code>createPizza</code>, that does anything. By subclassing and overriding this method we
can offer aditional flexibility beyond what’s possible with the Simple Factory.</p>
<h3>Abstract Factory</h3>
<p>Unlike the Factory Method pattern, <strong>Abstract Factory</strong> defines any number of
methods which return Products.</p>
<blockquote>
<p>The Abstract Factory Pattern provides an interface
for creating families of related or dependent objects
without specifying their concrete classes.
<em>Elisabeth Freeman, Head First Design Patterns</em></p>
</blockquote>
<p>Again in <em>Head First Design Patterns</em>, an Abstract Factory pattern is used to
provide different Pizza ingredients depending on the type of Pizza. For
instance, a ChicagoPizza would be given a ChicagoPizzaIngredients factory with
methods like <code>createDough</code>, <code>createSauce</code>, <code>createCheese</code>, etc. A
CaliforniaPizzaIngredients factory would also implement <code>createDough</code>,
<code>createSauce</code> and <code>createCheese</code>. In this way the factories would be
interchangeable.</p>
<p>The authors are keen to point out that the methods of the Abstract Factory
(<code>createDough</code>, <code>createSauce</code>, etc) look very similar to the Factory Method
(<code>createPizza</code>). One way of thinking about things is that an Abstract Factory
can be composed of Factory Methods.</p>
<h2>The Factory Method in JavaScript</h2>
<p>Since I’ve already shown a basic Simple Factory let’s take a stab at doing the
Factory Method in JS. We’ll continue with the PizzaStore theme since I’ve
already spelled out how each pattern applies to it. We’re going to do this
without the use of the <code>new</code> keyword and instead we’ll take advantage of
JavaScript’s prototypes. How you ask?</p>
<h3>The very awesome Object.create</h3>
<p>ECMAScript 5 introduced a new method of the <code>Object</code> prototype called <code>create</code>.
You can read up on it in full detail <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create">on
MDN.</a>
In a nutshell it lets you pass in a prototype and receive a new object which
points to that prototype. <code>Object.create</code> is actually a simple Factory Method!
Here’s an example:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> firstPizzaStore <span class="token operator">=</span> Object<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>PizzaStore<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">firstPizzaStore<span class="token punctuation">.</span><span class="token function">createPizza</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// returns 'Generic pizza created'</span></span></code></pre>
<p>One very cool feature of <code>Object.create</code> is that it accepts a properties object which is then mixed in to the returned object. The code can get a little verbose since it uses <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty">defineProperty syntax</a> so instead let’s steal a function from <a href="http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/">Yehuda Katz</a> which lets us do something very similar.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> <span class="token function-variable function">fromPrototype</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">prototype<span class="token punctuation">,</span> object</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> newObject <span class="token operator">=</span> Object<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>prototype<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> prop <span class="token keyword">in</span> object<span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>object<span class="token punctuation">.</span><span class="token function">hasOwnProperty</span><span class="token punctuation">(</span>prop<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      newObject<span class="token punctuation">[</span>prop<span class="token punctuation">]</span> <span class="token operator">=</span> object<span class="token punctuation">[</span>prop<span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token keyword">return</span> newObject<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>Now that we have that we can continue on our way. One quick caveat though! Some browsers *cough* <strong>IE</strong> *cough* don’t support <code>Object.create</code> so we need to shim it. Thankfully MDN has got our back:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// Polyfill</span></span><br><span class="highlight-line"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>Object<span class="token punctuation">.</span>create<span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  Object<span class="token punctuation">.</span><span class="token function-variable function">create</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">o</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>arguments<span class="token punctuation">.</span>length <span class="token operator">></span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span><span class="token string">'Object.create implementation only accepts the first parameter.'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token keyword">function</span> <span class="token constant">F</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token class-name">F</span><span class="token punctuation">.</span>prototype <span class="token operator">=</span> o<span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">F</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>Drop that into your page and you should be able to use Object.create like we are
above. Note that the shim does not support the second properties object. For our
purposes that’s ok but definitely keep it in mind if you’re thinking of using
it.</p>
<h3>Back to the Factory Method</h3>
<p>With <code>Object.create</code> and <code>fromPrototype</code> in hand we’re ready to tackle our first
Factory Method.</p>
<p>Let’s start by creating a PizzaStore:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// Define the Pizza product</span></span><br><span class="highlight-line"><span class="token keyword">var</span> Pizza <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  description<span class="token punctuation">:</span> <span class="token string">'Plain Generic Pizza'</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// And the basic PizzaStore</span></span><br><span class="highlight-line"><span class="token keyword">var</span> PizzaStore <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function-variable function">createPizza</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">type</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>type <span class="token operator">==</span> <span class="token string">'cheese'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">return</span> <span class="token function">fromPrototype</span><span class="token punctuation">(</span>Pizza<span class="token punctuation">,</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        description<span class="token punctuation">:</span> <span class="token string">'Cheesy, Generic Pizza'</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>type <span class="token operator">==</span> <span class="token string">'veggie'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">return</span> <span class="token function">fromPrototype</span><span class="token punctuation">(</span>Pizza<span class="token punctuation">,</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        description<span class="token punctuation">:</span> <span class="token string">'Veggie, Generic Pizza'</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>Easy enough. Ok now let’s extend the PizzaStore so we have two variations: ChicagoPizzaStore and CaliforniaPizzaStore.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> ChicagoPizzaStore <span class="token operator">=</span> <span class="token function">fromPrototype</span><span class="token punctuation">(</span>PizzaStore<span class="token punctuation">,</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function-variable function">createPizza</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">type</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>type <span class="token operator">==</span> <span class="token string">'cheese'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">return</span> <span class="token function">fromPrototype</span><span class="token punctuation">(</span>Pizza<span class="token punctuation">,</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        description<span class="token punctuation">:</span> <span class="token string">'Cheesy, Deep-dish Chicago Pizza'</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>type <span class="token operator">==</span> <span class="token string">'veggie'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">return</span> <span class="token function">fromPrototype</span><span class="token punctuation">(</span>Pizza<span class="token punctuation">,</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        description<span class="token punctuation">:</span> <span class="token string">'Veggie, Deep-dish Chicago Pizza'</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> CaliforniaPizzaStore <span class="token operator">=</span> <span class="token function">fromPrototype</span><span class="token punctuation">(</span>PizzaStore<span class="token punctuation">,</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function-variable function">createPizza</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">type</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>type <span class="token operator">==</span> <span class="token string">'cheese'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">return</span> <span class="token function">fromPrototype</span><span class="token punctuation">(</span>Pizza<span class="token punctuation">,</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        description<span class="token punctuation">:</span> <span class="token string">'Cheesy, Tasty California Pizza'</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>type <span class="token operator">==</span> <span class="token string">'veggie'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">return</span> <span class="token function">fromPrototype</span><span class="token punctuation">(</span>Pizza<span class="token punctuation">,</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        description<span class="token punctuation">:</span> <span class="token string">'Veggie, Tasty California Pizza'</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// Elsewhere in our app...</span></span><br><span class="highlight-line"><span class="token keyword">var</span> chicagoStore <span class="token operator">=</span> Object<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>ChicagoPizzaStore<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token keyword">var</span> pizza <span class="token operator">=</span> chicagoStore<span class="token punctuation">.</span><span class="token function">createPizza</span><span class="token punctuation">(</span><span class="token string">'veggie'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>pizza<span class="token punctuation">.</span>description<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// returns 'Veggie, Deep-dish Chicago Pizza'</span></span></code></pre>
<h2>The Abstract Factory in JavaScript</h2>
<p>Since we have a variety of pizza styles we might also have a variety of ingredients. Let’s see if we can accomodate all the different kinds.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> Ingredients <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function-variable function">createDough</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token string">'generic dough'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">createSauce</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token string">'generic sauce'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">createCrust</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token string">'generic crust'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">Ingredients<span class="token punctuation">.</span><span class="token function-variable function">createChicagoStyle</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">return</span> <span class="token function">fromPrototype</span><span class="token punctuation">(</span>Ingredients<span class="token punctuation">,</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token function-variable function">createDough</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">return</span> <span class="token string">'thick, heavy dough'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function-variable function">createSauce</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">return</span> <span class="token string">'rich marinara'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function-variable function">createCrust</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">return</span> <span class="token string">'deep-dish'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">Ingredients<span class="token punctuation">.</span><span class="token function-variable function">createCaliforniaStyle</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">return</span> <span class="token function">fromPrototype</span><span class="token punctuation">(</span>Ingredients<span class="token punctuation">,</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token function-variable function">createDough</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">return</span> <span class="token string">'light, fluffy dough'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function-variable function">createSauce</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">return</span> <span class="token string">'tangy red sauce'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function-variable function">createCrust</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">return</span> <span class="token string">'thin and crispy'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>In the above example <code>Ingredients</code> is our Abstract Factory. We know that for every
different kind of pizza we’ll need different ingredients and therefore a new Factory Method. We also know that we have different styles of pizza so we’ll need Chicago style ingredients and California style ingredients. When a client wishes to grab some ingredients for a particular kind of pizza they just say:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> californiaIngredients <span class="token operator">=</span> Ingredients<span class="token punctuation">.</span><span class="token function">createCaliforniaStyle</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">californiaIngredients<span class="token punctuation">.</span><span class="token function">createCrust</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// returns 'thin and crispy';</span></span></code></pre>
<p>The object that is returned by the call <code>createCaliforniaStyle</code> is the concrete implementation of our Abstract Ingredients object. In other words, if <code>Ingredients</code> is the Abstract Factory, then the object returned by <code>createCaliforniaStyle</code> could also be thought of as a <code>CaliforniaIngredients</code> object. It is a <em>subclass</em> of <code>Ingredients</code> if you want to think of it that way. The returned object extends <code>Ingredients</code> and overrides its Factory Methods with its own methods. In so doing we provide a lot of additional flexibility to our app. If we want to add a Hawaiian style ingredients we just add a <code>createHawaiianStyle</code> method.</p>
<p>If you recall from <a href="https://robdodson.me/blog/2012/08/27/javascript-design-patterns-decorator/">the previous article on Decorators</a> we talked about the <strong>Open-Closed Principle</strong> which states that “classes should be open for extension but closed for modification.” You’ll notice that adding a <code>createHawaiianStyle</code> method would actually violate this principle so it should be noted that when using an Abstract Factory approach you’ll probably have to reopen the class/object a few times to modify it. Not ideal but depending on your use case this might not be such big deal and you might prefer the flexibility and organization that the factory offers.</p>
<p><strong><a href="https://github.com/robdodson/JavaScript-Design-Patterns/tree/master/factory/">Grab the Example Source</a></strong></p>
<h2>Related Patterns</h2>
<ul>
<li>Template Methods: Factory Methods are usually called within Template Methods.</li>
<li><a href="https://robdodson.me/blog/2012/08/08/javascript-design-patterns-singleton/">Singleton</a>: A concrete factory is often a singleton.</li>
</ul>
<p>Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994-10-31). Design Patterns: Elements of Reusable Object-Oriented Software. Pearson Education (USA).</p>
<h4><a href="/javascript-design-patterns/">Table of Contents</a></h4>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>JavaScript Design Patterns: Decorator Update</title>
    <link href="https://robdodson.me/posts/javascript-design-patterns-decorator-pt-2/"/>
    <updated>2012-08-31T01:07:00+00:00</updated>
    <id>https://robdodson.me/posts/javascript-design-patterns-decorator-pt-2/</id>
    <content type="html"><![CDATA[
      <p><a href="http://robdodson.me/blog/2012/08/27/javascript-design-patterns-decorator/">Yesterday’s post</a> drew a lot of traffic from Reddit and with it came some really good feedback. If you haven’t read the <a href="http://robdodson.me/blog/2012/08/27/javascript-design-patterns-decorator/">previous post</a> please do so first and then come back here.</p>
<p>I want to go through some of what was said so I can refine my examples and also clear up any confusion.</p>
<h2>That prototype example sucked!</h2>
<p>OK let me start off by apologizing for even including that second example (the <code>Sale</code> decorators). It was meant as a kind of fun academic exercise but I tried to make it clear that I wasn’t suggesting anyone actually implement it. Redditor gizmo490 pointed out that for the pattern to actually work you would have to overwrite all the methods of the <code>Sale</code> object or risk working in the wrong context. You can see our full discussion <a href="http://www.reddit.com/r/javascript/comments/z0z2j/decorators_in_javascript_hope_you_enjoy/c60qb0c">here.</a></p>
<p>So I’ll just say if you’re considering that second example: Stop. Just don’t do it. It is way too much code.</p>
<h2>We don’t necessarily need all those objects</h2>
<p>Another Redditor, Draders, pointed out that the decorator objects aren’t really necessary since we can just put functions directly into the decoratorsList.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// This is presuming that `add` pushes a function into the</span></span><br><span class="highlight-line"><span class="token comment">// list of decorators</span></span><br><span class="highlight-line">validator<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">'zipcode'</span><span class="token punctuation">,</span> validateZipCodeFunction<span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>If you want <code>validateZipCodeFunction</code> to be reusable you’ll have to define it somewhere and attaching it to the Validator object is probably a fine choice. In the end it’s a bit less code so definitely something to think about.</p>
<h2>Finally, the power of CLOSURES!</h2>
<p>Finally, and this is really the reason why I wanted to write this update, Redditor emehrkay pointed out that my examples are basically ignoring the power of JS functions and closures. <a href="http://www.reddit.com/r/javascript/comments/z0z2j/decorators_in_javascript_hope_you_enjoy/c60rl7x">In his quick and dirty example</a> he shows how to achieve a similar goal with much less code:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">test</span><span class="token punctuation">(</span><span class="token parameter">arg</span><span class="token punctuation">)</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> arg <span class="token operator">+</span> arg<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">testDecorator</span><span class="token punctuation">(</span><span class="token parameter">fn<span class="token punctuation">,</span> args</span><span class="token punctuation">)</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> arg <span class="token operator">=</span> args<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token function">fn</span><span class="token punctuation">(</span>arg<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">decorate</span><span class="token punctuation">(</span><span class="token parameter">dec<span class="token punctuation">,</span> fn<span class="token punctuation">,</span> args</span><span class="token punctuation">)</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token keyword">return</span> <span class="token function">dec</span><span class="token punctuation">(</span>fn<span class="token punctuation">,</span> args<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">x <span class="token operator">=</span> <span class="token function">decorate</span><span class="token punctuation">(</span>testDecorator<span class="token punctuation">,</span> test<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span></span></code></pre>
<p>So here’s my attempt to recreate the <code>Sale</code> example but using more of emehrkay’s approach:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">Sale</span><span class="token punctuation">(</span><span class="token parameter">price</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>price <span class="token operator">=</span> price <span class="token operator">||</span> <span class="token number">100</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Sale</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">getPrice</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>price<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Sale</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">setPrice</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">price</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>price <span class="token operator">=</span> price<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">usd</span><span class="token punctuation">(</span><span class="token parameter">fn<span class="token punctuation">,</span> context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> price <span class="token operator">=</span> <span class="token function">fn</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token string">"$"</span> <span class="token operator">+</span> price<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">decorate</span><span class="token punctuation">(</span><span class="token parameter">dec<span class="token punctuation">,</span> fn<span class="token punctuation">,</span> context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token keyword">return</span> <span class="token function">dec</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>context<span class="token punctuation">,</span> fn<span class="token punctuation">,</span> context<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// Let's run it!</span></span><br><span class="highlight-line"><span class="token keyword">var</span> sale <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sale</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// Decorate our getPrice method. We'll just add</span></span><br><span class="highlight-line"><span class="token comment">// some extra dollar signs to the output.</span></span><br><span class="highlight-line">sale<span class="token punctuation">.</span>getPrice <span class="token operator">=</span> <span class="token function">decorate</span><span class="token punctuation">(</span>usd<span class="token punctuation">,</span> sale<span class="token punctuation">.</span>getPrice<span class="token punctuation">,</span> sale<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">sale<span class="token punctuation">.</span>getPrice <span class="token operator">=</span> <span class="token function">decorate</span><span class="token punctuation">(</span>usd<span class="token punctuation">,</span> sale<span class="token punctuation">.</span>getPrice<span class="token punctuation">,</span> sale<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">sale<span class="token punctuation">.</span>getPrice <span class="token operator">=</span> <span class="token function">decorate</span><span class="token punctuation">(</span>usd<span class="token punctuation">,</span> sale<span class="token punctuation">.</span>getPrice<span class="token punctuation">,</span> sale<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>sale<span class="token punctuation">.</span><span class="token function">getPrice</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// output: $$$50</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// Test to make sure other methods can still</span></span><br><span class="highlight-line"><span class="token comment">// access the price in the correct context</span></span><br><span class="highlight-line">sale<span class="token punctuation">.</span><span class="token function">setPrice</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>sale<span class="token punctuation">.</span><span class="token function">getPrice</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// output: $$$100</span></span></code></pre>
<p>Since we’re kind of mixing OO and functional style here the one caveat is that you have to pass the context to your decorators so when they call <code>getPrice</code> they know which instance they’re referring to. So the code is a little funky but still interesting and if anyone can think of a way to write it cleaner I’m all ears!</p>
<p><strong><a href="https://github.com/robdodson/JavaScript-Design-Patterns/tree/master/decorator/">Grab the Example Source</a></strong></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>JavaScript Design Patterns: Decorator</title>
    <link href="https://robdodson.me/posts/javascript-design-patterns-decorator/"/>
    <updated>2012-08-27T16:59:00+00:00</updated>
    <id>https://robdodson.me/posts/javascript-design-patterns-decorator/</id>
    <content type="html"><![CDATA[
      <h4><a href="https://robdodson.me/blog/2012/08/03/javascript-design-patterns/">Table of Contents</a></h4>
<p><a href="https://robdodson.me/blog/2012/08/30/javascript-design-patterns-decorator-pt-2/">Update: Part 2 has been posted!</a></p>
<p>A Decorator is an object which adds functionality to another object dynamically. It can be used to enhance the behavior of an object without requiring the author to reopen its class. While Decorators might feel a little weird to implement in static languages they’re extremely simple in JavaScript due to the ease with which JS passes around functions and handles dynamic types.</p>
<h2>Formal Definition</h2>
<blockquote>
<p>Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.</p>
</blockquote>
<h3>Also Known As</h3>
<ul>
<li>Wrapper</li>
</ul>
<h2>When to use it</h2>
<ul>
<li>
<p>When you’d like to add responsibilities to individual objects dynamically (i.e. without subclassing/inheritence).</p>
</li>
<li>
<p>When you’d like to be able to remove the functionality at a later time. An <code>undecorate</code> method, for instance.</p>
</li>
<li>
<p>When extension by subclassing would be unmanageable or lead to a class explosion. For instance, if a <code>Vehicle</code> class is subclassed by 30 other vehicle objects with only minor differences.</p>
</li>
</ul>
<h2>Pros and Cons</h2>
<ul>
<li>
<p><strong>Pro</strong>: More flexible than inheritance.</p>
</li>
<li>
<p><strong>Pro</strong>: Avoids feature-laden classes high up in the hierarchy.</p>
</li>
<li>
<p><strong>Con</strong>: A decorator and its component aren’t identical.</p>
</li>
<li>
<p><strong>Con</strong>: Lots of little objects.</p>
</li>
</ul>
<h2>A Brief Explanation</h2>
<p>The Decorator pattern is very similar to one we’ve addressed earlier, called <a href="https://robdodson.me/blog/2012/08/03/javascript-design-patterns-strategy/">Strategy.</a> The differences between the two can be subtle but usually a decorator <em>enhances</em>, layers upon or “decorates” the object or method it’s wrapping. In contrast, a strategy will replace a method’s algorithm completely.</p>
<p>The primary benefit of the Decorator pattern is that you can take a rather vanilla object and wrap it in more advanced behaviors. For instance a view which renders a plain window can have decorators to add different backgrounds, scroll bars, borders, etc. The underlying code, or guts, of the window object remains the same while the decorators provide a new <em>skin.</em></p>
<p>Decorators are not limited to visual components. In fact much of the <code>java.io</code> package is composed of Decorators which add additional functionality such as buffering file streams and adding line numbers. A similar application to JavaScript might involve decorating I/O in Node.js. For instance, incoming data might need to be converted to ASCII and then compressed in some way. It might not <em>always</em> need to be converted to ASCII and it might not <em>always</em> need to be compressed. In this scenario we can apply or remove I/O decorators at runtime changing the behavior of our object instead of writing a big class with a bunch of cross-cutting concerns.</p>
<h2>Enough Talk! COOOOODE!!!</h2>
<p>Ok so let’s do an example. We’re going to create a <code>Validator</code> class which looks at the contents of a form and adds error messages to an array if anything in the form is not correct. We want our <code>Validator</code> to be really simple so it’ll just have two methods: <code>validate</code> and <code>decorate</code>. As the name implies <code>validate</code> will tell our validator to compare the form against its internal rules. We’ll use <code>decorate</code> to specify those rules. The <code>decorate</code> method will accept a String, such as ‘hasAge’ or ‘hasZipCode’ which corresponds to an actual function. We’ll collect these functions in a list and compare the contents of the form to each item in the list.</p>
<p>We’ll start with the constructor and <code>decorate</code> method:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">Validator</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">this</span><span class="token punctuation">.</span>errors <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token keyword">this</span><span class="token punctuation">.</span>decoratorsList <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Validator</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">decorate</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">name</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">this</span><span class="token punctuation">.</span>decoratorsList<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>We’ll collect any error messages in the <code>errors</code> array. We could write a method like <code>validator.hasErrors()</code> to check the length and contents of the array but for now I’ll leave that unspecified. Just know that if we do come across an error we’ll toss it in there.</p>
<p>The <code>decoratorsList</code> will hold all of our decorator functions. This is not how the Gang of Four does things, or how you will see the Decorator pattern presented in languages like Java or C++, but that’s because they’re using static languages which don’t do well with functions being passed around. In our case since JavaScript functions are objects we can pass our decorators into a collection to have them called sequentially. This is the easier approach recommended by <a href="https://twitter.com/stoyanstefanov">Stoyan Stefanov</a> in <a href="https://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752">JavaScript Patterns.</a> A little later I’ll show you the “hard” approach and you can decide which you prefer ;)</p>
<p>OK moving on… Let’s define some decorator functions. We’ll add an object to our constructor called <code>decorators</code> and we’ll attach our functions to it.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">Validator<span class="token punctuation">.</span>decorators <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">Validator<span class="token punctuation">.</span>decorators<span class="token punctuation">.</span>hasName <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token function-variable function">validate</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">form</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token comment">// Code to verify presence of name...</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">		<span class="token comment">// If no name found...</span></span><br><span class="highlight-line">		<span class="token keyword">this</span><span class="token punctuation">.</span>errors<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'no name!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">Validator<span class="token punctuation">.</span>decorators<span class="token punctuation">.</span>hasAge <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token function-variable function">validate</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">form</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token comment">// Code to verify presence of age...</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">		<span class="token comment">// If no age found...</span></span><br><span class="highlight-line">		<span class="token keyword">this</span><span class="token punctuation">.</span>errors<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'no age!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">Validator<span class="token punctuation">.</span>decorators<span class="token punctuation">.</span>hasZipCode <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token function-variable function">validate</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">form</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token comment">// Code to verify presence of zip code...</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">		<span class="token comment">// If no zip found...</span></span><br><span class="highlight-line">		<span class="token keyword">this</span><span class="token punctuation">.</span>errors<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'no zip!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>Each decorator is actually an object which implements the same interface as our <code>Validator</code> object. When we have all of our decorators added to our <code>decoratorsList</code> we’ll be able to loop through and call <code>validate</code> on each one.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token class-name">Validator</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">validate</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">form</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">var</span> i<span class="token punctuation">,</span></span><br><span class="highlight-line">		max<span class="token punctuation">,</span></span><br><span class="highlight-line">		name<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">	<span class="token keyword">this</span><span class="token punctuation">.</span>form <span class="token operator">=</span> form<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">	max <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>decoratorsList<span class="token punctuation">.</span>length<span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> max<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		name <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>decoratorsList<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">		Validator<span class="token punctuation">.</span>decorators<span class="token punctuation">[</span>name<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">validate</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">,</span> form<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>At last we come to the <code>validate</code> method. It first receives an object containing all of our form data. Next it prepares to loop through our collection of decorators. We use the name of the decorator object as a key and <code>call</code> its <code>validate</code> method, passing in <code>this</code> for our context and also the form object as an argument. This way all of the validators will execute in the context of our <code>Validator</code> instance and they should all have access to the form data.</p>
<p>Let’s try it out!</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> validator <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Validator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">validator<span class="token punctuation">.</span><span class="token function">decorate</span><span class="token punctuation">(</span><span class="token string">'hasName'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">validator<span class="token punctuation">.</span><span class="token function">decorate</span><span class="token punctuation">(</span><span class="token string">'hasAge'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">validator<span class="token punctuation">.</span><span class="token function">decorate</span><span class="token punctuation">(</span><span class="token string">'hasZipCode'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">validator<span class="token punctuation">.</span><span class="token function">validate</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// we'll just use a blank object in place of real form data</span></span><br><span class="highlight-line">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>validator<span class="token punctuation">.</span>errors<span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>We aren’t really doing any validation at this point so our <code>console.log</code> at the end should output an array with 3 error messages, one from each of the validator decorators. But there you go, you’ve now got a fully decorated <code>validate</code> function. What was once rather vanilla can have all sorts of new and interesting validations applied to it!</p>
<h2>What if my Decorators need additional arguments?</h2>
<p>The above example gets us started decorating but it leaves some room for improvement. For starters what if we want to pass additional arguments to our validation functions? Let’s revamp this thing just a bit so we can get really fancy…</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">Validator</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">this</span><span class="token punctuation">.</span>errors <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token keyword">this</span><span class="token punctuation">.</span>decoratorsList <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Validator</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">decorate</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">name<span class="token punctuation">,</span> args</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">this</span><span class="token punctuation">.</span>decoratorsList<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token punctuation">{</span> name<span class="token punctuation">:</span> name<span class="token punctuation">,</span> args<span class="token punctuation">:</span> args <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">Validator<span class="token punctuation">.</span>decorators <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">Validator<span class="token punctuation">.</span>decorators<span class="token punctuation">.</span>hasName <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token function-variable function">validate</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">form<span class="token punctuation">,</span> args</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token comment">// Code to verify presence of name...</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">		<span class="token keyword">this</span><span class="token punctuation">.</span>errors<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'no name!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">Validator<span class="token punctuation">.</span>decorators<span class="token punctuation">.</span>hasAge <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token function-variable function">validate</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">form<span class="token punctuation">,</span> args</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token comment">// Code to verify presence of age...</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">		<span class="token keyword">this</span><span class="token punctuation">.</span>errors<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'no age!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">Validator<span class="token punctuation">.</span>decorators<span class="token punctuation">.</span>hasZipCode <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token function-variable function">validate</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">form<span class="token punctuation">,</span> args</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token comment">// Code to verify presence of zip code...</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">		<span class="token keyword">this</span><span class="token punctuation">.</span>errors<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'no zip!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Validator</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">validate</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">form</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">var</span> i<span class="token punctuation">,</span></span><br><span class="highlight-line">		max<span class="token punctuation">,</span></span><br><span class="highlight-line">		temp<span class="token punctuation">,</span></span><br><span class="highlight-line">		name<span class="token punctuation">,</span></span><br><span class="highlight-line">		args<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">	<span class="token keyword">this</span><span class="token punctuation">.</span>form <span class="token operator">=</span> form<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">	max <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>decoratorsList<span class="token punctuation">.</span>length<span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> max<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		temp <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>decoratorsList<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">		name <span class="token operator">=</span> temp<span class="token punctuation">.</span>name<span class="token punctuation">;</span></span><br><span class="highlight-line">		args <span class="token operator">=</span> temp<span class="token punctuation">.</span>args<span class="token punctuation">;</span></span><br><span class="highlight-line">		Validator<span class="token punctuation">.</span>decorators<span class="token punctuation">[</span>name<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">validate</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">,</span> form<span class="token punctuation">,</span> args<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>This time we are passing an optional hash to our <code>decorate</code> method which is stored along with its corresponding decorator object. If you’ve ever used validators in Rails this should feel similar. Time to see it in action!</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> validator <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Validator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">validator<span class="token punctuation">.</span><span class="token function">decorate</span><span class="token punctuation">(</span><span class="token string">'hasName'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> length<span class="token punctuation">:</span> <span class="token number">5</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">validator<span class="token punctuation">.</span><span class="token function">decorate</span><span class="token punctuation">(</span><span class="token string">'hasAge'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> minimum<span class="token punctuation">:</span> <span class="token number">21</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">validator<span class="token punctuation">.</span><span class="token function">decorate</span><span class="token punctuation">(</span><span class="token string">'hasZipCode'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">validator<span class="token punctuation">.</span><span class="token function">validate</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// some form data. in this case just an anonymous object</span></span><br><span class="highlight-line">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>validator<span class="token punctuation">.</span>errors<span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<h2>Time to do things the hard way…</h2>
<p>I promised I would show you the more classical example of Decorator and since I am a man of my word I <em>guess</em> you can see it… I would not recommend using this approach because it can require overwriting all of your methods to make sure you’re always in the correct context. Still, as a kind of academic observation it’s a cool example and demonstrates how JS can emulate other languages. I’m taking this code almost verbatim from <a href="https://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752">JavaScript Patterns</a> so full credit goes to Stoyan for coming up with it.</p>
<p>In this example we’re going to format a Sale price so that it can work for both U.S. and Canadian stores. This means applying different tax rates and outputting the text with different currency symbols.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">Sale</span><span class="token punctuation">(</span><span class="token parameter">price</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">this</span><span class="token punctuation">.</span>price <span class="token operator">=</span> price <span class="token operator">||</span> <span class="token number">100</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Sale</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">getPrice</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>price<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>Things start off very similar to our last example. Instead of <code>validate</code> the method we’re interested in this time is <code>getPrice</code>. If you’ve been paying attention you’ll notice that in our previous example <code>validate</code> was rather complex. Yet <code>getPrice</code> is so…simple. Hmm…</p>
<p>Let’s move on to the decorators.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">Sale<span class="token punctuation">.</span>decorators <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">Sale<span class="token punctuation">.</span>decorators<span class="token punctuation">.</span>fedtax <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token function-variable function">getPrice</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token keyword">var</span> price <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>_super<span class="token punctuation">.</span><span class="token function">getPrice</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">		price <span class="token operator">+=</span> price <span class="token operator">*</span> <span class="token number">5</span> <span class="token operator">/</span> <span class="token number">100</span><span class="token punctuation">;</span></span><br><span class="highlight-line">		<span class="token keyword">return</span> price<span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">Sale<span class="token punctuation">.</span>decorators<span class="token punctuation">.</span>quebec <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token function-variable function">getPrice</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token keyword">var</span> price <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>_super<span class="token punctuation">.</span><span class="token function">getPrice</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">		price <span class="token operator">+=</span> price <span class="token operator">*</span> <span class="token number">7.5</span> <span class="token operator">/</span> <span class="token number">100</span><span class="token punctuation">;</span></span><br><span class="highlight-line">		<span class="token keyword">return</span> price<span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">Sale<span class="token punctuation">.</span>decorators<span class="token punctuation">.</span>usd <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// U.S. dollars</span></span><br><span class="highlight-line">	<span class="token function-variable function">getPrice</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token keyword">return</span> <span class="token string">"$"</span> <span class="token operator">+</span> <span class="token keyword">this</span><span class="token punctuation">.</span>_super<span class="token punctuation">.</span><span class="token function">getPrice</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toFixed</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">Sale<span class="token punctuation">.</span>decorators<span class="token punctuation">.</span>cdn <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// Canadian dollars</span></span><br><span class="highlight-line">	<span class="token function-variable function">getPrice</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token keyword">return</span> <span class="token string">"CDN$"</span> <span class="token operator">+</span> <span class="token keyword">this</span><span class="token punctuation">.</span>_super<span class="token punctuation">.</span><span class="token function">getPrice</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toFixed</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>This may look similar to the last example but take note of the use of <code>_super</code>. The <code>_super</code> property is actually a reference to a parent class instance. We’ll use this reference to travel up the chain of decorators, performing an operation and returning the price at each stop.</p>
<p>This leads us to the <code>decorate</code> method:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token class-name">Sale</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">decorate</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">decorator</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">var</span> <span class="token function-variable function">F</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">	overrides <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>constructor<span class="token punctuation">.</span>decorators<span class="token punctuation">[</span>decorator<span class="token punctuation">]</span><span class="token punctuation">,</span></span><br><span class="highlight-line">	i<span class="token punctuation">,</span></span><br><span class="highlight-line">	newobj<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">	<span class="token comment">// Create prototype chain</span></span><br><span class="highlight-line">	<span class="token class-name">F</span><span class="token punctuation">.</span>prototype <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	newobj <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">F</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	newobj<span class="token punctuation">.</span>_super <span class="token operator">=</span> <span class="token class-name">F</span><span class="token punctuation">.</span>prototype<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">	<span class="token comment">// Mixin properties/methods of our decorator</span></span><br><span class="highlight-line">	<span class="token comment">// Overriding the ones from our prototype</span></span><br><span class="highlight-line">	<span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> overrides<span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token keyword">if</span> <span class="token punctuation">(</span>overrides<span class="token punctuation">.</span><span class="token function">hasOwnProperty</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">			newobj<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> overrides<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">		<span class="token punctuation">}</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">	<span class="token keyword">return</span> newobj<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>If you’re unfamiliar with JavaScript prototypes this can look a little daunting. We’re using a pattern that <a href="https://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752">JavaScript Patterns</a> refers to as <em>Rented Constructor</em> in order to essentially take a snapshot of our current object, store it in <code>_super</code> and then mixin new decorator methods. Let’s see it in action to clarify things a bit better.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> sale <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sale</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">sale <span class="token operator">=</span> sale<span class="token punctuation">.</span><span class="token function">decorate</span><span class="token punctuation">(</span><span class="token string">'fedtax'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">sale <span class="token operator">=</span> sale<span class="token punctuation">.</span><span class="token function">decorate</span><span class="token punctuation">(</span><span class="token string">'cdn'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>sale<span class="token punctuation">.</span><span class="token function">getPrice</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// outputs $CDN52.50</span></span></code></pre>
<p>You’ll notice that each time we call <code>decorate</code> we have to re-assign the sale variable to a new instance. Each new instance has a reference to the previous sale object. When we finally call <code>getPrice</code> it walks up this chain of instances and calls <code>getPrice</code> on each stop along the way. In the end we have something which is functionally identical to our first example but potentially a lot harder to understand. In other words, stick with the first approach! Also be sure to <a href="https://robdodson.me/blog/2012/08/30/javascript-design-patterns-decorator-pt-2/">see my update</a> which discusses this example a bit more and points out a few more of its flaws. Again, it’s a neat idea to mess around with but there are much easier ways.</p>
<h2>The Open-Closed Principle</h2>
<p>I’m going to go off on a quick tangent here because of something I saw in <a href="https://www.amazon.com/First-Design-Patterns-Elisabeth-Freeman/dp/0596007124">Head First Design Patterns.</a> There’s a common heuristic in software design known as the <strong>Open-Closed Principle</strong> which states that “classes should be open for extension but closed for modification.” Let’s explore this concept with our Sale object.</p>
<p>Consider the following bit of code:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">Sale</span><span class="token punctuation">(</span><span class="token parameter">price</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">this</span><span class="token punctuation">.</span>price <span class="token operator">=</span> price <span class="token operator">||</span> <span class="token number">100</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Sale</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">getPrice</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>price<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>You should be able to look at this snippet of code and say that it’s almost certainly bug free. Now let’s pretend we aren’t using decorators and our boss comes to us and says we need to add US and Canadian taxes and currency symbols.</p>
<p>“<em>Hm…I guess that means I’ll need to pass those parameters into the constructor and then write some booleans or something to check if we’re Canadian or US… Or maybe I’ll put them all in a hash… Or…</em>”</p>
<p>Regardless of what we choose to do, if it involves opening up the class then there’s a chance that we’ll compromise our previous snippet of code. The more times we do this the more we increase the likelihood that we’ll introduce a bug which might go uncaught for a long time. Eventually what started off as extremely simple, bug-free code, can turn into a rat’s nest.</p>
<p>So, where possible, try to avoid reopening classes and find ways to extend their functionality. This can mean simply subclassing the parent, or using one of the many design patterns we’ll be covering.</p>
<h2><a href="https://github.com/robdodson/JavaScript-Design-Patterns/tree/master/decorator/">Grab the Example Source</a></h2>
<h2>Related Patterns</h2>
<ul>
<li>
<p>Adapter: A decorator is different from an adapter in that a decorator only changes an object’s responsibilities, not its interface; an adapter will give an object a completely new interface.</p>
</li>
<li>
<p>Composite: A decorator can be viewed as a degenerate composite with only one component. However, a decorator adds additional responsibilities—it isn’t intended for object aggregation.</p>
</li>
<li>
<p><a href="https://robdodson.me/blog/2012/08/03/javascript-design-patterns-strategy/">Strategy:</a> A decorator lets you change the skin of an object; a strategy lets you change the guts. These are two alternative ways of changing an object.</p>
</li>
</ul>
<p>Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994-10-31). Design Patterns: Elements of Reusable Object-Oriented Software. Pearson Education (USA).</p>
<hr>
<h4><a href="https://robdodson.me/blog/2012/08/03/javascript-design-patterns/">Table of Contents</a></h4>
<p>Also be sure to <a href="https://robdodson.me/blog/2012/08/30/javascript-design-patterns-decorator-pt-2/">checkout Part 2 which covers even more ways to do decorators!</a> - Rob</p>
<p>You should follow me on Twitter <a href="https://twitter.com/rob_dodson">here.</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>JavaScript Design Patterns: Observer</title>
    <link href="https://robdodson.me/posts/javascript-design-patterns-observer/"/>
    <updated>2012-08-16T20:19:00+00:00</updated>
    <id>https://robdodson.me/posts/javascript-design-patterns-observer/</id>
    <content type="html"><![CDATA[
      <h4><a href="/javascript-design-patterns/">Table of Contents</a></h4>
<p>Observer is one of the most popular design patterns and chances are you’re probably already using it. If you’ve ever written an event listener with <code>addEventListener</code> or used one of jQuery’s many versions: <code>on</code>, <code>delegate</code>, <code>live</code>, <code>click</code>, etc… then you should already be comfortable with the concept. In a nutshell the Observer pattern allows a <strong>Subject</strong> to publish updates to a group of <strong>Observers</strong>. The Subject maintains a list of Observers and provides an interface for objects to register as Observers. Otherwise the Subject doesn’t care who or what is listening to it. In this way the Subject is decoupled from the Observers allowing easy replacement of one Observer for another or even one Subject for another so long as it maintains the same lexicon of events/notifications.</p>
<h2>Formal Definition</h2>
<blockquote>
<p>Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.</p>
</blockquote>
<h3>Also Known As</h3>
<ul>
<li>Dependents</li>
<li>Publish-Subscribe</li>
</ul>
<h2>When to use it</h2>
<ul>
<li>When the state or actions of one object depends on the state or actions of another object.</li>
<li>When changing one object necessitates a change to an unknown number of <em>other</em> objects.</li>
<li>When an object should be able to notify other objects of changes without knowing anything about these other objects.</li>
</ul>
<h2>Pros and Cons</h2>
<ul>
<li><strong>Pro:</strong> Very loose coupling between objects.</li>
<li><strong>Pro:</strong> The ability to broadcast changes and updates.</li>
<li><strong>Con:</strong> Potentially unexpected updates and sequencing issues.</li>
</ul>
<h2>The Many Faces of Observer</h2>
<p>Because of its popularity the Observer pattern often goes by a few different names. The primary objects are the <strong>Subject</strong> and the <strong>Observers</strong> though sometimes they are referred to as <strong>Publisher</strong>/<strong>Subscribers</strong> or <strong>Event Dispatcher</strong>/<strong>Listeners</strong>. Although you can definitely split hairs regarding the actual implementation of this pattern, in essence we’re usually talking about the same thing. When the Subject’s state changes it sends out notifications, unaware of who its Observers are. The Observers, in turn, perform some action in response to this update.</p>
<p>I’m going to heavily quote (*cough* <em>plagiarize</em> *cough*) the wonderful <a href="https://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752">JavaScript Patterns by Stoyan Stefanov</a> to sum up all the parts of an Observer/Pub-Sub relationship:</p>
<p><em>&quot;The publisher object needs to have a property <code>subscribers</code> that is an array storing all subscribers. The act of subscription is merely adding to this array. When an event occurs, the publisher loops through the list of subscribers and notifies them. The notification means calling a method of the subscriber object. Therefore, when subscribing, the subscriber provides one of its methods to the publisher’s subscribe() method.</em></p>
<p><em>The publisher can also provide unsubscribe(), which means removing from the array of subscribers. The last important method of the publisher is publish(), which will call the subscribers’ methods.&quot;</em></p>
<p>Here is Stoyan’s Pub/Sub implementation. Note that the <code>on</code> function accepts a <code>context</code> argument which allows you to set the handler’s context and in turn, the value of <code>this</code>. We’ll discuss this a bit more later.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> publisher <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  subscribers<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    any<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token comment">// event type: subscribers</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">on</span><span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">type<span class="token punctuation">,</span> fn<span class="token punctuation">,</span> context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    type <span class="token operator">=</span> type <span class="token operator">||</span> <span class="token string">'any'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    fn <span class="token operator">=</span> <span class="token keyword">typeof</span> fn <span class="token operator">===</span> <span class="token string">'function'</span> <span class="token operator">?</span> fn <span class="token punctuation">:</span> context<span class="token punctuation">[</span>fn<span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> <span class="token keyword">this</span><span class="token punctuation">.</span>subscribers<span class="token punctuation">[</span>type<span class="token punctuation">]</span> <span class="token operator">===</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">this</span><span class="token punctuation">.</span>subscribers<span class="token punctuation">[</span>type<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>subscribers<span class="token punctuation">[</span>type<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token punctuation">{</span> fn<span class="token punctuation">:</span> fn<span class="token punctuation">,</span> context<span class="token punctuation">:</span> context <span class="token operator">||</span> <span class="token keyword">this</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">remove</span><span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">type<span class="token punctuation">,</span> fn<span class="token punctuation">,</span> context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">visitSubscribers</span><span class="token punctuation">(</span><span class="token string">'unsubscribe'</span><span class="token punctuation">,</span> type<span class="token punctuation">,</span> fn<span class="token punctuation">,</span> context<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">fire</span><span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">type<span class="token punctuation">,</span> publication</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">visitSubscribers</span><span class="token punctuation">(</span><span class="token string">'publish'</span><span class="token punctuation">,</span> type<span class="token punctuation">,</span> publication<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">visitSubscribers</span><span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">action<span class="token punctuation">,</span> type<span class="token punctuation">,</span> arg<span class="token punctuation">,</span> context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> pubtype <span class="token operator">=</span> type <span class="token operator">||</span> <span class="token string">'any'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      subscribers <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>subscribers<span class="token punctuation">[</span>pubtype<span class="token punctuation">]</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      i<span class="token punctuation">,</span></span><br><span class="highlight-line">      max <span class="token operator">=</span> subscribers <span class="token operator">?</span> subscribers<span class="token punctuation">.</span>length <span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> max<span class="token punctuation">;</span> i <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">if</span> <span class="token punctuation">(</span>action <span class="token operator">===</span> <span class="token string">'publish'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token comment">// Call our observers, passing along arguments</span></span><br><span class="highlight-line">        subscribers<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">fn</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>subscribers<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>context<span class="token punctuation">,</span> arg<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token keyword">if</span> <span class="token punctuation">(</span>subscribers<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>fn <span class="token operator">===</span> arg <span class="token operator">&amp;&amp;</span> subscribers<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>context <span class="token operator">===</span> context<span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">          subscribers<span class="token punctuation">.</span><span class="token function">splice</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token punctuation">}</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>In practice using the <code>publisher</code> might look something like this:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">handleLogin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'we haz a users!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">publisher<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token string">'login.complete'</span><span class="token punctuation">,</span> handleLogin<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// ... .</span></span><br><span class="highlight-line"><span class="token comment">// Elaborate user login process...</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">publisher<span class="token punctuation">.</span><span class="token function">publish</span><span class="token punctuation">(</span><span class="token string">'login.complete'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<h2>Mind the Context</h2>
<p>In JavaScript the keyword <code>this</code> in a function will refer to the context in which the function was called. Sometimes functions are global and sometimes they’re part of a larger Object. Here’s a brief example to clarify:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> foobar <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function-variable function">doWork</span><span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'doing some work...'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">foobar<span class="token punctuation">.</span><span class="token function">doWork</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// `this` will refer to foobar</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> doWorkClone <span class="token operator">=</span> foobar<span class="token punctuation">.</span>doWork<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token function">doWorkClone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// `this` will refer to window</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> workClones <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">workClones<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>foobar<span class="token punctuation">.</span>doWork<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">workClones<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// `this` will refer to the workClones Array</span></span></code></pre>
<p>The first time we call <code>doWork</code> we do so in the <em>context</em> of the <code>foobar</code> object: <code>foobar.doWork()</code>. As a result the term <code>this</code> inside of the <code>doWork</code> method will refer to <code>foobar</code>.</p>
<p>The second time we call <code>doWork</code> we do so by referencing the method through a variable. We’re calling <code>doWork</code> using that variable’s <em>context</em>. But the variable is a global variable, it’s just hanging out on the page! As a result <code>this</code> will refer to <code>window</code>.</p>
<p>In the third example we’re stuffing <code>doWork</code> into an array, then referencing it by index, then calling it. In this <em>context</em> <code>doWork</code> is scoped to the <code>workClones</code> Array, since it’s also an Object. A little confusing I know.</p>
<p>So why do I care?</p>
<p>Well if you go back and look at the <code>publisher</code> example you’ll notice that we pass a function reference to be called whenever the Subject sends out a notification. In our case it looks like this: <code>publisher.subscribe('login.complete', handleLogin);</code> If <code>handleLogin</code> needs to use <code>this</code> we might be in a world of hurt because <code>publisher</code> is going to call <code>handleLogin</code> using itself as the value of <code>this</code>. Uh oh!</p>
<h2>Preserving Context in Observer</h2>
<p>JavaScript’s context switching can be really bizarre if you’ve never had to manage it before. To mitigate this problem we have a handful of useful strategies.</p>
<p>The first one, which is demonstrated in the <code>publisher</code>, is to pass along a <code>context</code> whenever we subscribe a function. This is the third argument to our <code>publisher</code>’s <code>on</code> method.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function-variable function">on</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">type<span class="token punctuation">,</span> fn<span class="token punctuation">,</span> context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		type <span class="token operator">=</span> type <span class="token operator">||</span> <span class="token string">'any'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">		fn <span class="token operator">=</span> <span class="token keyword">typeof</span> fn <span class="token operator">===</span> <span class="token string">'function'</span> <span class="token operator">?</span> fn <span class="token punctuation">:</span> context<span class="token punctuation">[</span>fn<span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">		<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> <span class="token keyword">this</span><span class="token punctuation">.</span>subscribers<span class="token punctuation">[</span>type<span class="token punctuation">]</span> <span class="token operator">===</span> <span class="token string">"undefined"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">			<span class="token keyword">this</span><span class="token punctuation">.</span>subscribers<span class="token punctuation">[</span>type<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">		<span class="token punctuation">}</span></span><br><span class="highlight-line">		<span class="token keyword">this</span><span class="token punctuation">.</span>subscribers<span class="token punctuation">[</span>type<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token punctuation">{</span> fn<span class="token punctuation">:</span> fn<span class="token punctuation">,</span> context<span class="token punctuation">:</span> context <span class="token operator">||</span> <span class="token keyword">this</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span><span class="token punctuation">,</span></span></code></pre>
<p>By storing the <code>context</code> we ensure that when it’s time to call our function, we can do so in the correct context with the correct value for <code>this</code>. We do this through the use of JavaScript’s <code>call</code> method which allows us to define in which context a function should execute.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">subscribers<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">fn</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>subscribers<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>context<span class="token punctuation">,</span> arg<span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>This can be a very powerful feature especially for utility functions. Checkout the MDN docs for a deeper understanding of <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/call">call</a> and its cousin <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply">apply.</a></p>
<p>But what if you’re not using our <code>publisher</code> example? What if you’re using a slightly more popular library like jQuery to manage your events? Maybe you have some code that looks like this:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// Substitute `on` for `click` or `delegate` or `live` or</span></span><br><span class="highlight-line"><span class="token comment">// whatever else you're using :)</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'.login-button'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'click'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token comment">// tell the app the user is trying to log in!</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Well in this case we might have to use a different approach. As anyone who’s used jQuery knows, the value of <code>this</code> in our handler function is going to refer to the DOM element that jQuery selected. Sometimes that’s really useful but other times, like in this case, it isn’t going to do us much good.</p>
<h3>Closures</h3>
<p>Closures are a powerful feature of ECMAScript and they’re especially useful when passing around functions. The best definition I’ve found for a closure comes from <a href="http://jibbering.com/faq/notes/closures/">this article:</a></p>
<blockquote>
<p>The simple explanation of a Closure is that ECMAScript allows inner functions; function definitions and function expressions that are inside the function bodies of other functions. And that those inner functions are allowed access to all of the local variables, parameters and declared inner functions within their outer function(s).</p>
</blockquote>
<p>So let’s see that in action.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> loginController <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function-variable function">init</span><span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> self <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'.login-button'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'click'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      self<span class="token punctuation">.</span><span class="token function">handleLogin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// use self as a stand in for `this`</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">handleLogin</span><span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'handling login!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>In the above example the var <code>self</code> exists in a kind of interesting limbo: it is part of <code>loginController's</code> <code>init</code> method and also part of the function registered as the <code>on('click')</code> handler. As a result, when the function is executed, <code>self</code> is still in the context of the <code>loginController</code> object and thus logs <code>handling login!</code></p>
<p>Awesome! We’ve solved the issue of preserving scope, right? Well, yes but it’s not our only option. Many people (myself included) find it annoying to sprinkle <code>var self = this</code> all over their app. To mitigate things we also have <code>Function.bind</code>.</p>
<h3>Bindings</h3>
<p>The addition of <code>Function.bind</code> in ECMAScript 5 allows us to specify in which context a function should be called, in other words, <em>binding</em> that function (and the value of <code>this</code>) to a particular context. Let’s see it in action:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> widget <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  name<span class="token punctuation">:</span> <span class="token string">'My Awesome Widget!'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">sayName</span><span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>name<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> nameFunc <span class="token operator">=</span> widget<span class="token punctuation">.</span><span class="token function">sayName</span><span class="token punctuation">.</span><span class="token function">bind</span><span class="token punctuation">(</span>widget<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token function">nameFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// outputs: 'My Awesome Widget!'</span></span></code></pre>
<p>Calling <code>Function.bind</code> will actually create a closure preserving whatever scope we’ve passed in. It returns a clone of our original function but this time it is bound to a particular context. In the above example it’s bound to the <code>widget</code> object. While it’s cleaner than our original closure example we’re still in a dilemma because we want <code>sayName</code> to ALWAYS be called in the context of <code>widget</code>. How about something like this instead: <code>widget.sayName = widget.sayName.bind(widget);</code> Hey, now we’re talking! By overwriting our function and binding it to our <code>widget</code> object we’ve gotten very close to how classical languages like Java and Actionscript handle scope! This means it’s easy to both subscribe and unsubscribe our method, safe in the knowledge that it will always use the proper scope. If you’re lazy (like me) take some time to research <a href="http://underscorejs.org/">Underscore.js</a> which provides both <a href="http://underscorejs.org/#bind">bind</a> and <a href="http://underscorejs.org/#bindAll">bindAll</a> functions to ease the process of connecting your methods to their parent objects.</p>
<p>I’ll save you the speech on treating JavaScript like other languages except to say anytime you’re writing code to make one language act like another you should obviously research whether that’s the best course of action or not. In my experience I’ve found that binding observers can make writing event listeners much cleaner but your mileage may vary and comments/feedback are always welcome :D</p>
<p>Also if you want to read more on <code>Function.bind</code> you can do so <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind">here on MDN.</a></p>
<h2>The Push and Pull Model</h2>
<p>Typically when you create a Subject/Observer relationship you’ll want the Subject to send along additional information during its event dispatch. The amount of information can vary widely. Sometimes you’ll want to send a lot of information and other times you’ll want the observers to receive the event and then query for more information. When you’re sending a lot of information it’s referred to as the <em>push model</em> and when the Observers should query for more information it’s referred to as the <em>pull model</em>. The Gang of Four describe the differences between the two:</p>
<blockquote>
<p>The pull model emphasizes the subject’s ignorance of its observers, whereas the push model assumes subjects know something about their observers’ needs. The push model might make observers less reusable, because Subject classes make assumptions about Observer classes that might not always be true. On the other hand, the pull model may be inefficient, because Observer classes must ascertain what changed without help from the Subject.</p>
</blockquote>
<p>There’s no right or wrong approach but it is good to understand the differences between the two.</p>
<h2>PubSub and Observer mixins</h2>
<p>If you want a quick, easy to use event dispatcher the <a href="https://github.com/mroderick/PubSubJS">PubSubJS</a> library does a wonderful job of providing an easy to use event dispatcher. It also includes a jQuery plugin variant if that’s more your style. If you’re looking for something a little less global and a bit more OO checkout this utility function from <a href="https://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752">JavaScript Patterns</a> which mixes-in the <code>publisher</code> to other objects.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">makePublisher</span><span class="token punctuation">(</span><span class="token parameter">o</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> i<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> publisher<span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>publisher<span class="token punctuation">.</span><span class="token function">hasOwnProperty</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token keyword">typeof</span> publisher<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">===</span> <span class="token string">'function'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      o<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> publisher<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line">  o<span class="token punctuation">.</span>subscribers <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    any<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<h2><a href="https://github.com/robdodson/JavaScript-Design-Patterns/tree/master/observer/">Grab the Example Source</a></h2>
<h2>Related Patterns</h2>
<ul>
<li>Promise: A Promise is an observable token given from one object to another. Promises wrap an operation and notify their observers when the operation either succeeds or fails.</li>
</ul>
<p>Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994-10-31). Design Patterns: Elements of Reusable Object-Oriented Software. Pearson Education (USA).</p>
<hr>
<h4><a href="/javascript-design-patterns/">Table of Contents</a></h4>
<p>Thanks for reading! If you have questions or feedback please leave a comment below. - Rob</p>
<p>You should follow me on Twitter <a href="https://twitter.com/rob_dodson">here.</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>JavaScript Design Patterns: Iterator</title>
    <link href="https://robdodson.me/posts/javascript-design-patterns-iterator/"/>
    <updated>2012-08-10T22:45:00+00:00</updated>
    <id>https://robdodson.me/posts/javascript-design-patterns-iterator/</id>
    <content type="html"><![CDATA[
      <h4><a href="/javascript-design-patterns/">Table of Contents</a></h4>
<p>If you’re coming from Ruby or Java you probably think of an Iterator as an object which gives you a consistent interface for traversing a collection of some kind. If you’re coming from JavaScript or Actionscript you probably just think of an iterator as the <code>i</code> value in a <code>for</code> loop. The term has mixed meanings but in this case we’re refering to the former, an object which gives us a consistent interface for iterating over a collection of some kind. If you’ve never used them before that might seem kind of silly. “If I need to loop over something I’m just going to loop over it!” For many use cases that’s totally fine. Where Iterator objects are useful is in situations where you might need to loop in an async fashion (stopping and restarting) or if you want to preclude an object from knowing too much about the inner workings of a collection.</p>
<h2>Formal Definition</h2>
<blockquote>
<p>Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.</p>
</blockquote>
<h3>Also Known As</h3>
<ul>
<li>Cursor</li>
</ul>
<h2>Example Time</h2>
<p>The code for an Iterator should be pretty easy to grok if you’ve worked with loops before. Here is a simple example which returns an Iterator for looping over an Array by every third value.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> iterator <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">	<span class="token keyword">var</span> index <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span></span><br><span class="highlight-line">		data <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">]</span><span class="token punctuation">,</span></span><br><span class="highlight-line">		length <span class="token operator">=</span> data<span class="token punctuation">.</span>length<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">	<span class="token keyword">return</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token function-variable function">next</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">			<span class="token keyword">var</span> element<span class="token punctuation">;</span></span><br><span class="highlight-line">			<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">hasNext</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">				<span class="token keyword">return</span> <span class="token keyword">null</span><span class="token punctuation">;</span></span><br><span class="highlight-line">			<span class="token punctuation">}</span></span><br><span class="highlight-line">			element <span class="token operator">=</span> data<span class="token punctuation">[</span>index<span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">			index <span class="token operator">+=</span> <span class="token number">3</span><span class="token punctuation">;</span></span><br><span class="highlight-line">			<span class="token keyword">return</span> element<span class="token punctuation">;</span></span><br><span class="highlight-line">		<span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">		<span class="token function-variable function">hasNext</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">			<span class="token keyword">return</span> index <span class="token operator">&lt;</span> length<span class="token punctuation">;</span></span><br><span class="highlight-line">		<span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">		<span class="token function-variable function">rewind</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">			index <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></span><br><span class="highlight-line">			<span class="token keyword">return</span> data<span class="token punctuation">[</span>index<span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">		<span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">		<span class="token function-variable function">current</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">			<span class="token keyword">return</span> data<span class="token punctuation">[</span>index<span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">		<span class="token punctuation">}</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Our iterator has a handful of useful operations including <code>next</code>, <code>hasNext</code>, <code>rewind</code> and <code>current</code>.</p>
<p><code>next</code> will return the next value and advance the index by 3.</p>
<p><code>hasNext</code> will check to see if calling <code>next</code> will actually return an item. Good for indicating when we’ve reached the end of a collection.</p>
<p><code>rewind</code> will reset the index to zero so we can loop over the collection again.</p>
<p><code>current</code> will return the current item at the index without advancing the index.</p>
<p>Let’s put these into play to see how it works:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">while</span><span class="token punctuation">(</span>iterator<span class="token punctuation">.</span><span class="token function">hasNext</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>iterator<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">iterator<span class="token punctuation">.</span><span class="token function">rewind</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>iterator<span class="token punctuation">.</span><span class="token function">current</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>If we ran the above we’d see the following output in the console.</p>
<pre><code>1
4
7
10
1
</code></pre>
<p>Since the iterator is mainting its own state if we need to stop iteration at any point we just don’t call <code>next</code>. Using exclusively <code>for</code> loops we’d have to check against a flag of some kind, store our current position and then rebuild the loop starting from that point.</p>
<h2>Not just for Arrays</h2>
<p>As I mentioned before the Iterator gives us a consistent interface for traversing a collection, which means it can iterate over <em>any</em> object. Calendar Dates, Linked Lists, Node Graphs, whatever! Here’s an example of an iterator that traverses a simple Hash.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> iterator <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">var</span> data <span class="token operator">=</span> <span class="token punctuation">{</span> foo<span class="token punctuation">:</span> <span class="token string">'foo'</span><span class="token punctuation">,</span> bar<span class="token punctuation">:</span> <span class="token string">'bar'</span><span class="token punctuation">,</span> baz<span class="token punctuation">:</span> <span class="token string">'baz'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">		keys <span class="token operator">=</span> Object<span class="token punctuation">.</span><span class="token function">keys</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">		index <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span></span><br><span class="highlight-line">		length <span class="token operator">=</span> keys<span class="token punctuation">.</span>length<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">	<span class="token keyword">return</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token function-variable function">next</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">			<span class="token keyword">var</span> element<span class="token punctuation">;</span></span><br><span class="highlight-line">			<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">hasNext</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">				<span class="token keyword">return</span> <span class="token keyword">null</span><span class="token punctuation">;</span></span><br><span class="highlight-line">			<span class="token punctuation">}</span></span><br><span class="highlight-line">			element <span class="token operator">=</span> data<span class="token punctuation">[</span>keys<span class="token punctuation">[</span>index<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">			index<span class="token operator">++</span><span class="token punctuation">;</span></span><br><span class="highlight-line">			<span class="token keyword">return</span> element<span class="token punctuation">;</span></span><br><span class="highlight-line">		<span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">		<span class="token function-variable function">hasNext</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">			<span class="token keyword">return</span> index <span class="token operator">&lt;</span> length<span class="token punctuation">;</span></span><br><span class="highlight-line">		<span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">		<span class="token function-variable function">rewind</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">			index <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></span><br><span class="highlight-line">			<span class="token keyword">return</span> data<span class="token punctuation">[</span>keys<span class="token punctuation">[</span>index<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">		<span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">		<span class="token function-variable function">current</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">			<span class="token keyword">return</span> data<span class="token punctuation">[</span>keys<span class="token punctuation">[</span>index<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">		<span class="token punctuation">}</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Notice how the interface is identical to our previous Iterator? That’s one of the key aspects to this pattern: Regardless of the <em>type</em> of collection, we can define a consistent interface to loop through it. It also means that the client doesn’t need to know anything about the implementation of the actual collection, and by wrapping it in a closure we can prevent the client from <em>editing</em> the collection. Personally I like the idea of certain services handing out iterators rather than a wholesale dump of all the data. As always use whichever tool is appropriate for the context.</p>
<p>One quick note regarding Hashes. Previous versions of the ECMA spec did not require that Hash keys be kept in order. While most modern browsers <em>do</em> keep them in order there are some funky inconsistencies. For instance, if you write out the following Hash:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> hash <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token string">'foo'</span><span class="token punctuation">:</span> <span class="token string">'foo'</span><span class="token punctuation">,</span> <span class="token string">'bar'</span><span class="token punctuation">:</span> <span class="token string">'bar'</span><span class="token punctuation">,</span> <span class="token string">'1'</span><span class="token punctuation">:</span> <span class="token string">'hello'</span><span class="token punctuation">,</span> <span class="token string">'2'</span><span class="token punctuation">:</span> <span class="token string">'world'</span> <span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>Google Chrome will swap the order of the keys such that they appear like this:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token punctuation">{</span> <span class="token string">'1'</span><span class="token punctuation">:</span> <span class="token string">'hello'</span><span class="token punctuation">,</span> <span class="token string">'2'</span><span class="token punctuation">:</span> <span class="token string">'world'</span><span class="token punctuation">,</span> <span class="token string">'foo'</span><span class="token punctuation">:</span> <span class="token string">'foo'</span><span class="token punctuation">,</span> <span class="token string">'bar'</span><span class="token punctuation">:</span> <span class="token string">'bar'</span> <span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>There are some interesting discussions on StackOverflow which cover this topic but it’s a bit outside the scope of this article. If you’re interested you can find them here:</p>
<ul>
<li><a href="https://stackoverflow.com/questions/5773950/how-to-keep-an-javascript-object-array-ordered-while-also-maintaining-key-lookup">How to keep an Javascript object/array ordered while also maintaining key lookups?</a></li>
<li><a href="https://stackoverflow.com/questions/3549894/javascript-data-structure-for-fast-lookup-and-ordered-looping">Javascript data structure for fast lookup and ordered looping?</a></li>
</ul>
<h2>JavaScript 1.7</h2>
<p>Although not widely supported yet, JavaScript 1.7 includes a built in Iterator object which can be used to wrap an Array or Hash with just a single line of code.</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>application/javascript;version=1.7<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">	<span class="token keyword">var</span> lang <span class="token operator">=</span> <span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">'JavaScript'</span><span class="token punctuation">,</span> birthYear<span class="token punctuation">:</span> <span class="token number">1995</span> <span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token keyword">var</span> it <span class="token operator">=</span> <span class="token function">Iterator</span><span class="token punctuation">(</span>lang<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre>
<p>The above script block will not work in Chrome but it should work in the latest version of Firefox. Note the <code>type</code> attribute of the script tag which instructs the interpreter to handle the code as JS 1.7.</p>
<p>For some further reading on the topic checkout the MDN article which covers <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Iterators_and_Generators">Iterators in JavaScript 1.7</a></p>
<h2><a href="https://github.com/robdodson/JavaScript-Design-Patterns/tree/master/iterator/">Grab the Example Source</a></h2>
<h2>Related Patterns</h2>
<ul>
<li>Composite: Iterators are often applied to recursive structures such as Composites.</li>
<li>Factory Method: Polymorphic iterators rely on factory methods to instantiate the appropriate Iterator subclass.</li>
<li>Memento: Often used in conjunction with the Iterator pattern. An iterator can use a memento to capture the state of an iteration. The iterator stores the memento internally.</li>
</ul>
<p>Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994-10-31). Design Patterns: Elements of Reusable Object-Oriented Software. Pearson Education (USA).</p>
<hr>
<h4><a href="/javascript-design-patterns/">Table of Contents</a></h4>
<p>Thanks for reading!</p>
<p>You should follow me on Twitter <a href="https://twitter.com/rob_dodson">here.</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>JavaScript Design Patterns: Singleton</title>
    <link href="https://robdodson.me/posts/javascript-design-patterns-singleton/"/>
    <updated>2012-08-09T02:52:00+00:00</updated>
    <id>https://robdodson.me/posts/javascript-design-patterns-singleton/</id>
    <content type="html"><![CDATA[
      <h4><a href="/javascript-design-patterns/">Table of Contents</a></h4>
<p>Ah yes the Singleton, a pattern whose name lives in infamy. For the uninitiated a little explanation is in order. A Singleton is an object which can only be instantiated one time. Repeated calls to its constructor return the same instance and in this way one can ensure that they don’t accidentally create, say, two Users in a single User application. Doesn’t sound too bad, right? Well, if you’re responsible then it arguably <em>is</em> OK but there are many caveats. Before I get into those though, let’s throw in the formal definition <em>a la</em> the Gang of Four.</p>
<h2>Formal Definition</h2>
<blockquote>
<p>Ensure a class only has one instance, and provide a global point of access to it.</p>
</blockquote>
<h2>The icky bits</h2>
<p>So I’m sure some of you are already a little anxious because I used the phrase “global point of access” and rightfully you should be. In OO software design <em>global</em> variables and objects are often frowned upon. They break encapsulation and more often than not cause more harm than good. You don’t want the far flung bits of your app to be able to reach all the way up to the very top and fiddle around with stuff. When that starts to happen, and other objects also rely on those global variables, then any piece of code, anywhere in the project can change something which can in turn break a totally unrelated bit of functionality. Debugging becomes a nightmare because you’re constantly moving from deeply nested object graphs up to the global scope and then back down again. I one time worked on a <em>major</em> application which I inherited from another developer. It was so riddled with Singletons that any change became a sisyphean ordeal of unintended consiquences and time lost debugging. Needless to say I want to put this warning front and center or else the programming gods would surely smite me.</p>
<h2>So, why would I want to use one of these?</h2>
<p>Before you start running for the hills I want to point out the ways in which Singletons can be useful and then you can make up your mind if they’re right for you.</p>
<p>Let’s start with the most obvious one: You’re probably already using Singletons!</p>
<p>Ever written any code that looks like this?</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> user <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	firstName<span class="token punctuation">:</span> <span class="token string">'John'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">	lastName<span class="token punctuation">:</span> <span class="token string">'Doe'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">	<span class="token function-variable function">sayName</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>firstName <span class="token operator">+</span> <span class="token string">' '</span> <span class="token operator">+</span> <span class="token keyword">this</span><span class="token punctuation">.</span>lastName<span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>Yep, that’s a Singleton. Once you create an object literal in JavaScript you’ve reserved a little piece of memory and no other object will ever be just like that one. Now, depending on the scope you might have only created a local variable but if that <code>user</code> is sitting outside a function then it’s globally available to anyone who wants to fiddle with it. I guess the most famous Singleton probably looks like this: <code>$</code>. To put it another way, ever notice how you can use jQuery anywhere in your app after you’ve included it on the page…? Boom! Singleton!</p>
<p><em>mind blown</em> … <em>face off</em> …</p>
<h2>OK, So they have their uses I guess</h2>
<p>Yes as much as some are probably loathe to admit it, Singletons are quite useful in JavaScript. And as jQuery demonstrates their primary use is to namespace your code.<br>
While other languages like Java or C# have namespaces built in, JavaScript has to emulate them using simple objects.</p>
<p>Consider the following scenario: You have a series of functions hanging out on the page that you frequently use in your program.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">login</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token comment">// do some login shtuffs</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">logout</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token comment">// do some logout shtuffs</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">addToCart</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token comment">// blah, blah blah...</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>A few things are going on here…</p>
<p><em>1. Our functions are polluting the global space.</em><br>
Since they are just floating around on the page they have to attach to something. With no explicitely declared parent object they get hooked on to the globally available <code>window</code> object.</p>
<p><em>2. They’re in danger of being overwritten</em><br>
If we were to accidentally define another global <code>addToCart</code> function or if we brought in a library whose author did the same, it would overwrite the original leading to a really gnarly debugging situation.</p>
<p>Let’s revise this by creating one (and only one) global object which our code can branch off of.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> <span class="token constant">NAMESPACE</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token constant">NAMESPACE</span><span class="token punctuation">.</span><span class="token function-variable function">login</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token comment">// do some login shtuffs</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token constant">NAMESPACE</span><span class="token punctuation">.</span><span class="token function-variable function">logout</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token comment">// do some logout shtuffs</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token constant">NAMESPACE</span><span class="token punctuation">.</span><span class="token function-variable function">addToCart</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token comment">// blah, blah blah...</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>Now so long as no one creates an object which also has the name <code>NAMESPACE</code> our code should be safe. From here we can do all sorts of things. We can nest more object literals or we can create constructor functions:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> <span class="token constant">NAMESPACE</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token constant">NAMESPACE</span><span class="token punctuation">.</span><span class="token function-variable function">Widget</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">foo<span class="token punctuation">,</span> bar</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token comment">// Some awesome widget code</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token constant">NAMESPACE</span><span class="token punctuation">.</span><span class="token class-name">Widget</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">doSomethingAwesome</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token comment">// do something awesome!!!</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> myWidget <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">NAMESPACE<span class="token punctuation">.</span>Widget</span><span class="token punctuation">(</span><span class="token string">'hello'</span><span class="token punctuation">,</span> <span class="token string">'world'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Take a look at <a href="https://github.com/mrdoob/three.js/">the Three.js library which</a> relies heavily on this pattern to structure its code.</p>
<h2>But I like constructors!</h2>
<p>OK so maybe object literals aren’t your thing. That’s understandable so let me show you a few other ways of writing Singletons.</p>
<p>These first few come from Stoyan Stefanov’s excellent book <a href="https://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752">JavaScript Patterns.</a></p>
<p><strong>Singleton with a cached static property</strong></p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">User</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token comment">// do we have an existing instance?</span></span><br><span class="highlight-line">	<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> User<span class="token punctuation">.</span>instance <span class="token operator">===</span> <span class="token string">'object'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token keyword">return</span> User<span class="token punctuation">.</span>instance<span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span></span><br><span class="highlight-line">	</span><br><span class="highlight-line">	<span class="token comment">// proceed as normal</span></span><br><span class="highlight-line">	<span class="token keyword">this</span><span class="token punctuation">.</span>firstName <span class="token operator">=</span> <span class="token string">'John'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token keyword">this</span><span class="token punctuation">.</span>lastName <span class="token operator">=</span> <span class="token string">'Doe'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	</span><br><span class="highlight-line">	<span class="token comment">// cache</span></span><br><span class="highlight-line">	User<span class="token punctuation">.</span>instance <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	</span><br><span class="highlight-line">	<span class="token comment">// implicit return</span></span><br><span class="highlight-line">	<span class="token comment">// return this;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>The cached static property is publicly available which adds a little danger (someone could say <code>Universe.instance = foo</code>) but this version is very straightforward and doesn’t require closures and funky prototype work. If you’re lazy this might be a good approach.</p>
<p><strong>Singleton with a closure</strong></p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">User</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token comment">// the cached instance</span></span><br><span class="highlight-line">	<span class="token keyword">var</span> instance<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">	<span class="token comment">// rewrite the constructor</span></span><br><span class="highlight-line">	<span class="token function-variable function">User</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token keyword">return</span> instance<span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">	<span class="token comment">// carry over the prototype</span></span><br><span class="highlight-line">	<span class="token class-name">User</span><span class="token punctuation">.</span>prototype <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">	<span class="token comment">// the instance</span></span><br><span class="highlight-line">	instance <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">	<span class="token comment">// reset the constructor pointer</span></span><br><span class="highlight-line">	instance<span class="token punctuation">.</span>constructor <span class="token operator">=</span> User<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">	<span class="token comment">// all the functionality</span></span><br><span class="highlight-line">	instance<span class="token punctuation">.</span>firstName <span class="token operator">=</span> <span class="token string">'John'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">	instance<span class="token punctuation">.</span>lastName <span class="token operator">=</span> <span class="token string">'Doe'</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">	<span class="token keyword">return</span> instance<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>This version takes a bit of fiddling to get the prototype to work as expected because we rewrite the constructor. The upshot is that <code>instance</code> is now private (being contained within the closure).</p>
<p><strong>Singleton with a self executing function</strong></p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> User<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">var</span> instance<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">	<span class="token function-variable function">User</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token function">User</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token keyword">if</span> <span class="token punctuation">(</span>instance<span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">			<span class="token keyword">return</span> instance<span class="token punctuation">;</span></span><br><span class="highlight-line">		<span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">		instance <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">		<span class="token comment">// all the functionality</span></span><br><span class="highlight-line">		<span class="token keyword">this</span><span class="token punctuation">.</span>firstName <span class="token operator">=</span> <span class="token string">'John'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">		<span class="token keyword">this</span><span class="token punctuation">.</span>lastName <span class="token operator">=</span> <span class="token string">'Doe'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        </span><br><span class="highlight-line">        <span class="token keyword">return</span> instance<span class="token punctuation">;</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>By wrapping the instance variable in a self executing function we make it private. This version doesn’t require any prototype or constructor reassignment but it may potentially confuse people who aren’t comfortable with self executing functions.</p>
<p>Addy Osmani also defines a Singleton pattern in his book <a href="http://addyosmani.com/resources/essentialjsdesignpatterns/book/#singletonpatternjavascript">Essential JavaScript Design Patterns.</a></p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> mySingleton <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Instance stores a reference to the Singleton</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> instance<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">function</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Singleton</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Private methods and variables</span></span><br><span class="highlight-line">    <span class="token keyword">function</span> <span class="token function">privateMethod</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></span><br><span class="highlight-line">        console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span> <span class="token string">"I am private"</span> <span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token keyword">var</span> privateVariable <span class="token operator">=</span> <span class="token string">"Im also private"</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token punctuation">{</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token comment">// Public methods and variables</span></span><br><span class="highlight-line">      <span class="token function-variable function">publicMethod</span><span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span> <span class="token string">"The public can see me!"</span> <span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      publicProperty<span class="token punctuation">:</span> <span class="token string">"I am also public"</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">return</span> <span class="token punctuation">{</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Get the Singleton instance if one exists</span></span><br><span class="highlight-line">    <span class="token comment">// or create one if it doesn't</span></span><br><span class="highlight-line">    <span class="token function-variable function">getInstance</span><span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span>instance <span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        instance <span class="token operator">=</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token keyword">return</span> instance<span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// Usage:</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> singleA <span class="token operator">=</span> mySingleton<span class="token punctuation">.</span><span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token keyword">var</span> singleB <span class="token operator">=</span> mySingleton<span class="token punctuation">.</span><span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span> singleA <span class="token operator">===</span> singleB <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// true</span></span></code></pre>
<p>This much more elaborate example allows us to define both private and public methods of our Singleton object at the cost of being a bit more complex than all the others.</p>
<p>As Addy is quick to point out:</p>
<blockquote>
<p>Whilst the Singleton has valid uses, often when we find ourselves needing it in JavaScript it’s a sign that we may need to re-evaluate our design.</p>
</blockquote>
<blockquote>
<p>They’re often an indication that modules in a system are either tightly coupled or that logic is overly spread across multiple parts of a codebase. Singletons can be more difficult to test due to issues ranging from hidden dependencies, the difficulty in creating multiple instances, difficulty in stubbing dependencies and so on.</p>
</blockquote>
<p>Definitely read <a href="http://addyosmani.com/resources/essentialjsdesignpatterns/book/#singletonpatternjavascript">his full article</a> on the subject since it contains a handful of links to interesting side topics.</p>
<h2><a href="https://github.com/robdodson/JavaScript-Design-Patterns/tree/master/singleton/">Grab the Example Source</a></h2>
<h2>Related Patterns</h2>
<p>Many patterns can be implemented using the Singleton pattern. See Abstract Factory, Builder, and Prototype.</p>
<p>Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994-10-31). Design Patterns: Elements of Reusable Object-Oriented Software. Pearson Education (USA).</p>
<hr>
<h4><a href="/javascript-design-patterns/">Table of Contents</a></h4>
<p>Thanks for reading!</p>
<p>You should follow me on Twitter <a href="https://twitter.com/rob_dodson">here.</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>JavaScript Design Patterns: Strategy</title>
    <link href="https://robdodson.me/posts/javascript-design-patterns-strategy/"/>
    <updated>2012-08-03T22:12:00+00:00</updated>
    <id>https://robdodson.me/posts/javascript-design-patterns-strategy/</id>
    <content type="html"><![CDATA[
      <h4><a href="/javascript-design-patterns/">Table of Contents</a></h4>
<p>The Strategy pattern is one of my personal favorites and you’ve probably seen or used it in some fashion without even knowing it. Its primary purpose is to help you separate the parts of an object which are subject to change from the rest of the static bits. Using Strategy objects versus subclasses can often result in much more flexible code since you’re creating a suite of easily swappable algorithms.</p>
<h2>Formal Definition</h2>
<blockquote>
<p>Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.</p>
</blockquote>
<h3>Also Known As</h3>
<ul>
<li>Policy</li>
</ul>
<h2>Contrived Example Time!</h2>
<p>Let’s say you’re making a game and you have a Character class. This game has all sorts of different terrain types so your character can run through open fields, walk slowly through swamps or swim under the ocean. Since you don’t know what kind of other terrains the game designer is going to think up you decide that it would be a bad idea to give each character <code>run</code>, <code>walk</code>, and <code>swim</code> methods. After all, what if suddenly the character needs to <code>fly</code> or <code>crawl</code>? What if they’re wounded and they need to <code>limp</code>? This situation could potentially get out of hand very fast…</p>
<p>There’s a good chance you’ve seen or written code like this before:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">move</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">if</span> <span class="token punctuation">(</span>state <span class="token operator">===</span> <span class="token string">'walking'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token comment">// do some walk animation</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>state <span class="token operator">===</span> <span class="token string">'running'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token comment">// do some running animation</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>state <span class="token operator">===</span> <span class="token string">'swimming'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">		<span class="token comment">// do some swimming animation</span></span><br><span class="highlight-line">	<span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>When you see a big conditional like that or a switch statement it’s time to stop and wonder if there’s a better way. For instance if we need to subclass our Character we’re going to have to override that big conditional. What if we only want to replace the <code>swimming</code> bit? We’ll have to copy and paste the code from the super class for <code>walking</code> and <code>running</code> and then write new code specifically for <code>swimming</code>. And of course if <code>walking</code> and <code>running</code> ever change we’re totally screwed.</p>
<h3>We need a Strategy to deal with this</h3>
<p>Ok so we know that our character is going to be a real contortionist and need to run and jump and crab-walk all over the place. What if we took the code that made her run and we put it in its own object? How about we just define a Class for movements and we do this for all the different kinds of motion? Then when we need to move our Character we’ll just tell it to defer to one of these Movement objects.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> <span class="token function-variable function">Movement</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">func</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">this</span><span class="token punctuation">.</span>move <span class="token operator">=</span> func<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Movement</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">execute</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">move</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> running <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Movement</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"Hey I'm running!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> walking <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Movement</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"Just walking along..."</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Now when we want to tell our character to move in a different way we’ll just update which Movement object its currently referencing.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">changeMovementType</span><span class="token punctuation">(</span><span class="token parameter">movement</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">this</span><span class="token punctuation">.</span>movement <span class="token operator">=</span> movement<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">move</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	<span class="token keyword">this</span><span class="token punctuation">.</span>movement<span class="token punctuation">.</span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>In practice you might have something that looks like this:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> running <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Movement</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"Hey I'm running!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> walking <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Movement</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"Just walking along..."</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// Create a hero and walk through a peaceful forest...</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> hero <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Character</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">hero<span class="token punctuation">.</span><span class="token function">changeMovementType</span><span class="token punctuation">(</span>walking<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">hero<span class="token punctuation">.</span><span class="token function">move</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// ... OH NO MOTHERFUCKIN' DINOSAURS!!!</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">hero<span class="token punctuation">.</span><span class="token function">changeMovementType</span><span class="token punctuation">(</span>running<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">hero<span class="token punctuation">.</span><span class="token function">move</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Now it’s easy for us to add as many different kinds of motion as our little game designer can dream up. Want to give the character gas-powered robotic legs? No problem!</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> robotlegs <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Movement</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">	console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"Cruisin for oil...Look out humans!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">hero<span class="token punctuation">.</span><span class="token function">changeMovementType</span><span class="token punctuation">(</span>robotlegs<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">hero<span class="token punctuation">.</span><span class="token function">move</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<h2>When to use it</h2>
<p>When you have a part of your Class that’s subject to change frequently or perhaps you have many related subclasses which only differ in behavior it’s often a good time to consider using a Strategy pattern.</p>
<p>Another benefit of the Strategy pattern is that it can hide complex logic or data that the client doesn’t need to know about.</p>
<h2>The Painting App</h2>
<p>For a real world example of when to use Strategy objects consider your typical painting program. Often times you will offer a variety of different brush types to your user but you don’t want to have to change the fundamentals of how a mark shows up on screen every time the user decides to switch from a round to a square brush. Why not wrap those specific implementations in their own brush objects and later on when the user clicks to draw something to screen we’ll just defer to one of those brushes.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// Grab a reference to the canvas and the drawing context</span></span><br><span class="highlight-line">$canvas <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#painter'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">context <span class="token operator">=</span> $canvas<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">getContext</span><span class="token punctuation">(</span><span class="token string">'2d'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// Define our brush strategy objects</span></span><br><span class="highlight-line">brushes <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  outline<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token function-variable function">draw</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">e<span class="token punctuation">,</span> context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">          context<span class="token punctuation">.</span><span class="token function">strokeRect</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>pageX <span class="token operator">-</span> offsetLeft<span class="token punctuation">,</span> e<span class="token punctuation">.</span>pageY <span class="token operator">-</span> offsetTop<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  square<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token function-variable function">draw</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">e<span class="token punctuation">,</span> context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">          context<span class="token punctuation">.</span><span class="token function">fillRect</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>pageX <span class="token operator">-</span> offsetLeft<span class="token punctuation">,</span> e<span class="token punctuation">.</span>pageY <span class="token operator">-</span> offsetTop<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  circle<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token function-variable function">draw</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">e<span class="token punctuation">,</span> context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">          context<span class="token punctuation">.</span><span class="token function">arc</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>pageX <span class="token operator">-</span> offsetLeft<span class="token punctuation">,</span> e<span class="token punctuation">.</span>pageY <span class="token operator">-</span> offsetTop<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> Math<span class="token punctuation">.</span><span class="token constant">PI</span> <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">          context<span class="token punctuation">.</span><span class="token function">fill</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token operator">...</span> <span class="token punctuation">.</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">brush <span class="token operator">=</span> brushes<span class="token punctuation">.</span>square<span class="token punctuation">;</span></span></code></pre>
<p>Here we see that <code>brushes.outline</code>, <code>brushes.square</code>, and <code>brushes.circle</code> each implement a consistent interface for the <code>draw</code> call. However their exact implementation changes from one brush to the next. <code>brushes.outline</code> will only draw the stroke of a rectangle, whereas <code>brushes.square</code> and <code>brushes.circle</code> will fill their respective shapes in. Elsewhere in the program we set our initial brush to a default of brushes.square. When the users presses their mouse and moves it around screen we can defer to whichever Strategy the brush object is currently referencing:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// Listen for mouse events on the canvas</span></span><br><span class="highlight-line">$canvas</span><br><span class="highlight-line">  <span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'mousedown'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      isDrawing <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span></span><br><span class="highlight-line">  <span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'mouseup mouseleave'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      isDrawing <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span></span><br><span class="highlight-line">  <span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'mousemove'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">if</span> <span class="token punctuation">(</span>isDrawing<span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">          <span class="token comment">// Defer drawing to a Strategy object</span></span><br><span class="highlight-line">          brush<span class="token punctuation">.</span><span class="token function">draw</span><span class="token punctuation">(</span>e<span class="token punctuation">,</span> context<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Again notice that <code>.on('mousemove')</code> we first check to see if it’s ok to draw something and then defer to whichever Strategy is currently being referenced. Using this approach we can add limitless new brush types to the <code>brushes</code> object and easily change how our program performs at runtime. Be sure to check out the live example and the source for the full application.</p>
<h3><a href="https://robdodson.s3.amazonaws.com/javascript-design-patterns/strategy/painter/index.html">Live Example</a></h3>
<h2><a href="https://github.com/robdodson/JavaScript-Design-Patterns/tree/master/strategy/">Grab the Example Source</a></h2>
<h2>Related Patterns</h2>
<ul>
<li>Flyweight: Strategy objects often make good flyweights.</li>
</ul>
<p>Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994-10-31). Design Patterns: Elements of Reusable Object-Oriented Software. Pearson Education (USA).</p>
<hr>
<h4><a href="/javascript-design-patterns/">Table of Contents</a></h4>
<p>You should follow me on Twitter <a href="https://twitter.com/rob_dodson">here.</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>JavaScript Design Patterns: Table of Contents</title>
    <link href="https://robdodson.me/posts/javascript-design-patterns/"/>
    <updated>2012-08-03T16:39:00+00:00</updated>
    <id>https://robdodson.me/posts/javascript-design-patterns/</id>
    <content type="html"><![CDATA[
      <h3>Creational</h3>
<ul>
<li>Abstract Factory</li>
<li>Builder</li>
<li>Factory Method</li>
<li>Object Pool</li>
<li>Prototype</li>
<li><a href="/posts/javascript-design-patterns-singleton/">Singleton</a></li>
</ul>
<h3>Structural</h3>
<ul>
<li>Adapter</li>
<li>Bridge</li>
<li>Composite</li>
<li><a href="/posts/javascript-design-patterns-decorator/">Decorator</a></li>
<li>Facade</li>
<li>Flyweight</li>
<li>Private Class Data</li>
<li>Proxy</li>
</ul>
<h3>Behavioral</h3>
<ul>
<li>Chain of Responsibility</li>
<li>Command</li>
<li>Interpreter</li>
<li><a href="/posts/javascript-design-patterns-iterator/">Iterator</a></li>
<li>Mediator</li>
<li>Memento</li>
<li>Null Object</li>
<li><a href="/posts/javascript-design-patterns-observer/">Observer</a></li>
<li>State</li>
<li><a href="/posts/javascript-design-patterns-strategy/">Strategy</a></li>
<li>Template Method</li>
<li>Visitor</li>
<li>Monad Pattern / Promises</li>
</ul>
<p>I’ve been trying to think up <a href="/ending-my-first-chain/">a new chain</a> since coming back from Europe but nothing was enticing me. Then a few days ago I had a conversation with one of my friends in which we discussed using Promises in JavaScript. And later on we discussed Builders. I was doing my best to explain the two but really wished that I had a resource where I could just show some simple code examples. It occurred to me that I’ve always wanted to go through the <a href="https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/ref=sr_1_1?ie=UTF8&amp;qid=1344014497&amp;sr=8-1&amp;keywords=design+patterns">Gang of Four book</a> and just write my own interpretation of each pattern. Since I’m currently working primarily in JavaScript I thought it might be an interesting challenge to convert their examples, often in strongly typed languages, to something as dynamic and loosey-goosey as JS.</p>
<p>I know there are a lot of people out there who aren’t too keen on design patterns but that’s not to say that they shouldn’t be used or studied.</p>
<p>Patterns should be used with caution as not everything fits so neatly into their paradigms. It’s often said that a beginner never met a pattern they didn’t like. In my experiences I’ve been burned by pattern overuse and at other times they’ve really helped me solve a novel problem.</p>
<p>It’s also true that many patterns don’t really work or aren’t appropriate for particular languages. For instance, the GoF book was written primarily for languages which shared features of C++ and SmallTalk. My hope is that along the way we’ll discover what does and doesn’t make sense in a dynamic language like JS. Already to the list I’ve added Promises which I use quite frequently and find to be a wonderful alternative to JavaScript’s oft seen pyramid of callbacks.</p>
<p>Again, this is all about learning and experimenting. I’m committed to doing this twice a week for the next several weeks so hopefully by the end of it we’ll have a useful resource that others can benefit from. Stay tuned!</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Ending My First Chain</title>
    <link href="https://robdodson.me/posts/ending-my-first-chain/"/>
    <updated>2012-06-26T05:58:00+00:00</updated>
    <id>https://robdodson.me/posts/ending-my-first-chain/</id>
    <content type="html"><![CDATA[
      <p><em>Note to readers: Since writing this post I’ve gone back and hidden a bunch of the posts that I created during this chain because they were bitrotting. Their URLs will still work but they now have a big warning at the top.</em></p>
<p>Why did I do it?</p>
<p>Everything started because of a <a href="http://japhr.blogspot.com/2012/04/366-or-how-i-tricked-myself-into-being.html">blog post written by a fellow named Chris Strom.</a> Chris wrote every single day, for a year, and in that time he managed to self publish 3 books. I think many people would be happy to publish a book in like a couple years. At Chris’ rate he was cranking one out nearly every 3-4 months. Amazing.</p>
<p>I started thinking… this whole writing thing has got to be like exercise. If you just will yourself to do it, it’ll be hard at first but after a while <em>surely</em> it becomes a habit. And who doesn’t want to be in the habit of exercising more?</p>
<p>Writing, self-reflection, discovery… these are <em>really</em> important. I get by in my career by reading the stuff that other people have been generous enough to put down on the page (or blog, as the case may be). If I have a problem I just type it into the little magical Google box and out pops an answer.</p>
<h2>That’s incredible!</h2>
<p>But that system doesn’t exist unless some of us pay back into it. None of this information that we take for granted is being churned out by some machine. It’s churned out by people!</p>
<h2>It’s hard!</h2>
<p>And because it’s hard, like exercise, most of us don’t do it. We can all be better at what we do, especially if it’s going to be our life’s work. For me that means setting aside some time to work a little extra and write about my successes and failures. It means willing myself to push beyond what I normally think I can do and hoping that if I stick with it, eventually pieces will fall into place, and doors will unlock.</p>
<h2>What did I learn?</h2>
<p>I learned a ton writing every day for 60 days. My posts were at times very scattershot, Ruby one day, D3.js the next; random Sublime tips after that, etc etc etc. I get frustrated and I needed to switch gears.</p>
<p>There was a part of me that didn’t think I would be able to go all 60 days. I have been a total quitter more times than I’d like to admit and the older I get the more I realize what a massive disservice that is to one’s self. Finishing isn’t the most important thing, it’s the <em>only</em> thing. It doesn’t matter if you finish covered in sinew and tree branches… just finish!</p>
<h2>What’s next?</h2>
<p>I’ve got two ideas kicking around. One is to keep following in Chris’ steps and to self publish a book. I was dead set on this until a very fateful evening when I watched <a href="http://buy.indiegamethemovie.com/">Indie Game: The Movie.</a> Now I can’t get the idea of self-publishing a <em>very</em> tiny game out of my mind… Thankfully I have 3 weeks in Europe to think it over.</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Sublime Snippet Basics</title>
    <link href="https://robdodson.me/posts/sublime-snippet-basics/"/>
    <updated>2012-06-25T05:48:00+00:00</updated>
    <id>https://robdodson.me/posts/sublime-snippet-basics/</id>
    <content type="html"><![CDATA[
      <p><a href="http://robdodson.me/blog/2012/06/23/sublime-text-2-tips-and-shortcuts/">Yesterday I covered some tips and tricks</a> I’ve learned over the past few months of using Sublime. Something I didn’t touch on is Sublime’s Snippet architecture.</p>
<p>Essentially a snippet is a little piece of code that gets executed when you type some characters and hit the <code>tab</code> key. For instance I have a snippet that spits out <code>console.log()</code> whenever I type <code>lg</code> and press <code>tab</code>. One clever feature of snippets is that they can be bound to a keyboard shortcut if the key binding calls the <code>insert_snippet</code> command and passes the path to the snippet file as an argument. For example:</p>
<pre class="language-json"><code class="language-json"><span class="highlight-line"><span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">"keys"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"super+shift+r"</span><span class="token punctuation">]</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"command"</span><span class="token operator">:</span> <span class="token string">"insert_snippet"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"args"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"Packages/XML/long-tag.sublime-snippet"</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>That will tell Sublime that when I press <code>cmd+shift+r</code> it should act as if I triggered the long-tag snippet for XML files. Basically that will let me highlight some text, hit <code>cmd+shift+r</code> and then I can type some HTML or XML tags to wrap my text. Cool. So let’s go about writing our own snippet to learn a bit more about this process.</p>
<h2>Getting Started</h2>
<p>The previously mentioned snippet is great for wrapping an item in HTML/XML tags but it totally breaks if we need to wrap our selection in anything not existing within brackets: <code>&lt;/&gt;</code>. Since I write a lot of Markdown I’m always wrapping text in some kind of markdown syntax, <code>*like this*</code>, but there’s no easy way to do this. The aforementioned snippet is close so we’re going to copy it and tweak it to do what we need.</p>
<p><a href="http://docs.sublimetext.info/en/latest/reference/snippets.html">The documentation on snippets for Sublime is short and full of good information. I suggest you read it before continuing on.</a></p>
<p>We’re going to copy the file located at <code>/Library/Application\ Support/Sublime\ Text\ 2/Packages/XML</code> and move it into our <code>/Packages/User</code> directory. I chose to rename the file to <code>wrap-anything.sublime-snippet</code>. The original snippet looks like this:</p>
<pre><code>&lt;snippet&gt;
    &lt;content&gt;&lt;![CDATA[&lt;${1:p}&gt;${2:$SELECTION}&lt;/${1/([^ ]+).*/$1/}&gt;]]&gt;&lt;/content&gt;
    &lt;tabTrigger&gt;&amp;lt;&lt;/tabTrigger&gt;
    &lt;scope&gt;text.xml&lt;/scope&gt;
    &lt;description&gt;Long Tag&lt;/description&gt;
&lt;/snippet&gt;
</code></pre>
<p><code>&lt;content&gt;</code> is where we put everything that’s going to be spit out by our snippet when it’s executed. Items are wrapped in a <code>CDATA</code> tag so they don’t interfere with the rest of the XML.</p>
<p>The first part <code>&lt;${1:p}&gt;</code> outputs a <code>&lt;</code> followed by a variable, <code>$1</code> which has a default value of the letter “p” and it closes with a <code>&gt;</code>. If our snippet only contained this bit of code then when we ran it the output would be <code>&lt;p&gt;</code>.</p>
<p>The second part uses one of the environment variables <a href="http://docs.sublimetext.info/en/latest/reference/snippets.html">talked about in the snippet documentation.</a><code>$SELECTION</code> will take whatever we’ve highlighted and make it part of the snippet output. You’ll notice this variable is prefixed with a <code>2:</code> meaning it’s our second variable and it’s default output is going to be whatever was highlighted. The 2 also indicates that if the user hits <code>tab</code> this is the second place they’ll go.</p>
<p>The third part contains a block of regex which, I think, just matches whatever the user types after the snippet has executed. My regex sucks so correct me if I’m wrong.</p>
<p><code>&lt;tabTrigger&gt;</code> indicates what character should be typed before hitting <code>tab</code> to fire off the snippet. In this case it’s a <code>&lt;</code></p>
<p><code>&lt;scope&gt;</code> defines where the snippet should run I believe… But I’m not entirely sure. The documentation just says “Scope selector to activate this snippet.” I didn’t see a text.xml file anywhere in the <code>Packages/XML/</code> folder and I know this snippet works in non-xml files so…yeah…<em>shrug</em></p>
<p><code>&lt;description&gt;</code> lets you describe the thing. duh.</p>
<p>OK let’s make our own simplified snippet:</p>
<pre><code>    &lt;snippet&gt;
        &lt;content&gt;&lt;![CDATA[${1:`}${2:$SELECTION}${1}]]&gt;&lt;/content&gt;
        &lt;tabTrigger&gt;&lt;/tabTrigger&gt;
        &lt;scope&gt;&lt;/scope&gt;
        &lt;description&gt;Wrap any block of text&lt;/description&gt;
    &lt;/snippet&gt;
</code></pre>
<p>Our snippet is less sophisticated than the previous one since we’ve excluded the regex. With the above snippet located in our <code>Packages/User/</code> folder we can tie it to a keyboard shortcut like so:</p>
<pre class="language-json"><code class="language-json"><span class="highlight-line"><span class="token punctuation">{</span> <span class="token property">"keys"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"super+r"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token property">"command"</span><span class="token operator">:</span> <span class="token string">"insert_snippet"</span><span class="token punctuation">,</span> <span class="token property">"args"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"Packages/User/wrap-anything.sublime-snippet"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span></span></code></pre>
<p>Now when we hit <code>cmd+r</code> it will let us wrap our current selection in whatever we want :)</p>
<p>For good measure here’s a really useful console.log snippet that’s triggered by typing <code>lg</code> and then pressing <code>tab</code>.</p>
<pre><code>&lt;snippet&gt;
    &lt;content&gt;&lt;![CDATA[console.log(${1});]]&gt;&lt;/content&gt;
    &lt;tabTrigger&gt;lg&lt;/tabTrigger&gt;
    &lt;scope&gt;source.js&lt;/scope&gt;
    &lt;description&gt;console.log()&lt;/description&gt;
&lt;/snippet&gt;
</code></pre>
<p>No need to bind this to a keyboard shortcut (unless you want to) because it defines a tab trigger. I know this wasn’t super in-depth but hopefully it gives you a little bit of a start. <a href="http://docs.sublimetext.info/en/latest/reference/snippets.html">Read the documentation on snippets</a> and tighten up your regex! - Rob</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Tired, Lazy</li>
<li>Sleep: 5</li>
<li>Hunger: 0</li>
<li>Coffee: 1</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Sublime Text 2 Tips and Shortcuts</title>
    <link href="https://robdodson.me/posts/sublime-text-2-tips-and-shortcuts/"/>
    <updated>2012-06-24T05:28:00+00:00</updated>
    <id>https://robdodson.me/posts/sublime-text-2-tips-and-shortcuts/</id>
    <content type="html"><![CDATA[
      <p>I’ve been using Sublime Text 2 for probably two months now and in that time I’ve discovered tons of useful tricks. I figured I should start writing them down for anyone who might be interested. I’ll try to explain the bits that seem esoteric because there are a lot of cool commands which only work in certain contexts.</p>
<h2>Finding your preferences</h2>
<p>One of the first things you want to do with Sublime is to find your User key bindings. They’re located under <code>Sublime Text 2 &gt; Preferences &gt; Key Bindings - User</code></p>
<p>Sublime Text is very DIY so there isn’t a fancy GUI to help you change keyboard shortcuts. Instead you use the preference file to override the default shortcuts. Like a lot of things in Sublime, this can at first seem annoying and non-intuitive. That is, until you realize that by doing it this way Sublime has actually given you the power to make <em>extremely</em> awesome key bindings. Take some time to look around in this file. I still only understand a fraction of what all it does but the little bits I learn here and there give me all sorts of ideas for new shortcuts. Just remember, if you want to change a keyboard shortcut you should do it in the User’s key bindings and not the Default key bindings.</p>
<p><strong>Pro Tip:</strong> If you ever want to change a keyboard shortcut but can’t figure out what command is currently running open up Sublime’s built in terminal with <code>ctrl+`` then type</code>sublime.log_commands(True)`. Now when you execute your command from the menu you should see its name show up in the console. Just remember to turn logging off when you’re done :)</p>
<h2>Sublime Package Control</h2>
<p>If you only follow one piece of my advice make it this: <a href="http://wbond.net/sublime_packages/package_control">Install Sublime Package Control.</a></p>
<p>Package Control makes it extremely easy to manage your Sublime plugins. It also helps with discovering new ones, which is nice. Just install it if you haven’t already, it’s impossible to live without.</p>
<h2>Setting up a command line shortcut</h2>
<p>I highly recommend setting up a symlink so you can easily open things with Sublime. <a href="http://www.sublimetext.com/docs/2/osx_command_line.html">This article details how to go about it on OSX.</a></p>
<p>CLI FTW!</p>
<h2>The Command Palette</h2>
<p>OK, so hopefully you’ve setup Sublime Package Control. Maybe you’ve even installed some plugins. It’s time for you to meet the Command Palette then. <code>cmd+shift+p</code> will open up the window and from here you can execute just about any command either native to Sublime or part of a plugin. It is super useful for all those things you don’t run often enough to turn into full blown keyboard shortcuts. It’s also useful if you know the name of a command but can’t remember what section of the menu it lives under.</p>
<h2>Goto Anything…</h2>
<p>So you want to fly around your project like a ninja on methamphetamines, eh? Then the shortcut you want is <code>cmd+p</code>. Once you’ve opened the dialog try typing a filename. Useful right? But wait, there’s more…</p>
<p>If you preface what you’re typing with a <code>@</code> it will look for “symbols” in the current file. Ex: <code>@foobar</code>. But just typing <code>@</code> will give you a nice file outline. The definition of what a symbol is depends on the file-type. In a Markdown file, for instance, it will list every header. In a JavaScript or Ruby file it will list every method of an object.</p>
<p>One last trick. If instead of an <code>@</code> you preface things with an <code>:</code> you can type a line number instead and hit enter to jump to that point. Ex: <code>:415</code></p>
<p>There are other keyboard shortcuts for jumping to a line and going to a symbol but why bother when you can just use <code>cmd+p</code> and some easy prefixing.</p>
<h2>Splitting the editor windows</h2>
<p>OK this one is also important and I can’t recommend it enough. <strong>Learn to split your editor windows.</strong> I never used this feature in previous IDEs and now I wonder how I ever lived without it. Whether you have a unit test in one window and an implementation in the other, or some HTML and CSS, this feature is just always handy.</p>
<p><img src="/images/2014/12/sublime-split-panes.png" alt="Split panes in Sublime"></p>
<p>I <em>live</em> in split panes. They’ve changed my workflow significantly for the better. Less time switching between files and finding your place is an incredible advantage. You can access them through <code>View &gt; Layouts</code>. It will behoove you to learn these keyboard shortcuts. Also learn the shortcuts for <code>View &gt; Focus Group</code> and <code>View &gt; Move File to Group</code>.</p>
<h2>Selections</h2>
<p>There are some neat selections which come in handy depending on your context. Personally I use Expand Selection to Tag, <code>cmd+shift+a</code> quite frequently when writing HTML. I also use Expand Selection to Line, <code>cmd+L</code> and Expand Selection to Word, <code>cmd+D</code> a lot.</p>
<h2>Selections with Multiple Cursors</h2>
<p>Multiple cursors… It’s one of those things you didn’t realize you needed until suddenly you had it and you were all like “WHAAAAAAAAT!”</p>
<p>There are a handful of ways to activate multiple cursors in Sublime. Hitting <code>cmd+D</code> to select multiples of the same word will put us into a multi-cursor context.</p>
<p>Another way to go about it is to highlight a block of text and hit <code>cmd+shift+L</code> which will split each line into its own selection. This is extremely useful when editing HTML where often times you have repeating elements and you want to tweak a class name on all of them.</p>
<p>You can also just hold <code>cmd</code> and click around your file to add more cursors. Or you can hold <code>ctrl+shift</code> and tap either the up or down arrows to add a new cursor in that direction.</p>
<h2>Moving Lines</h2>
<p><code>Edit &gt; Line &gt; Swap Line Up</code></p>
<p><code>Edit &gt; Line &gt; Swap Line Down</code></p>
<p><code>Edit &gt; Line &gt; Duplicate Line</code></p>
<p>Learn em. Love em. I changed my keyboard shortcut for these so I can’t recall what it is by default. Regardless I think I use these three commands more than any other so I would say if you only learn three shortcuts, make it these three.</p>
<p><strong>Pro Tip:</strong> If you want to duplicate a block of code highlight it and hit <code>cmd+L</code> to select the new line before you hit <code>cmd+shift+D</code>. This way your duplicated block will appear on a new line, rather than next to the previous block of code.</p>
<h2>Wrap your lines</h2>
<p>If you’ve installed the <a href="https://github.com/SublimeText/Tag">Tag plugin</a> you should have some extra line wrapping methods. I would also recommend you install <a href="https://bitbucket.org/sublimator/sublime-2-zencoding">ZenCoding</a>. I’m suggesting this for two reasons:</p>
<ol>
<li>You get awesome new features…</li>
<li>I can’t remember if what I’m about to say is native to Sublime or part of a plugin.</li>
</ol>
<p>OK with that out of the way…</p>
<p>Let’s say you’re working on some HTML and you have a block of text that you’d like to wrap in a <code>p</code> tag. No problemo! Highlight the text and hit <code>ctrl+shift+w</code> or <code>Edit &gt; Tag &gt; Wrap Selection in Tag</code>. There’s a more advanced versions that comes with the ZenCoding plugin which lets you do really elaborate wrappings. I believe the keyboard shortcut for that is <code>ctrl+alt+w</code>. Personally I dislike using the <code>ctrl</code> key on my Mac laptop so I changed both of those keyboard shortcuts to the following:</p>
<pre class="language-json"><code class="language-json"><span class="highlight-line">(<span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">"keys"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"super+shift+r"</span><span class="token punctuation">]</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"command"</span><span class="token operator">:</span> <span class="token string">"insert_snippet"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"args"</span><span class="token operator">:</span> <span class="token punctuation">{</span><span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"Packages/XML/long-tag.sublime-snippet"</span><span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"><span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">"keys"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"alt+shift+r"</span><span class="token punctuation">]</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"command"</span><span class="token operator">:</span> <span class="token string">"wrap_zen_as_you_type"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"context"</span><span class="token operator">:</span> <span class="token punctuation">[</span></span><br><span class="highlight-line">    <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token property">"operand"</span><span class="token operator">:</span> <span class="token string">"text.html, text.xml"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token property">"operator"</span><span class="token operator">:</span> <span class="token string">"equal"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token property">"match_all"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token property">"key"</span><span class="token operator">:</span> <span class="token string">"selector"</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">]</span></span><br><span class="highlight-line"><span class="token punctuation">}</span>)</span></code></pre>
<p>You’ll notice that instead of just using a <code>wrap_in_tag</code> command name the first entry actually calls another command, <code>insert_snippet</code> and passes it an argument: <code>Packages/XML/long-tag.sublime.snippet</code> which is the location of a snippet file. Pretty cool trick!</p>
<p>Also note that Sublime uses the term “super” to refer to the command key</p>
<h2>Bookmarks!</h2>
<p>If you’re like me then you lose your place in large files. That’s where bookmarks can be a big help. <code>cmd+F2</code> will add a new bookmark on the page. The bookmark is tied to the line so if you use the move line up/down commands it will move the bookmark as well (nice). To cycle through your bookmarks just hit F2. The rest of the bookmark commands are located in <code>Goto &gt; Bookmarks</code>. Take note of the one that says <code>Select All Bookmarks</code> which will basically let you do a multi-selection on all of the lines you’ve already bookmarked.</p>
<h2>Marks</h2>
<p>Marks are very similar to bookmarks but they serve a different purpose. They’re located in <code>Edit &gt; Mark</code> and their keyboard shortcuts are a little weird because you need to hit <code>cmd+K</code> and then a secondary shortcut like <code>cmd+space</code>. I find myself using Marks a few times a day to do large selections. For instance if you have a big block of HTML it can be very tricky to stay inside the proper scope if you’re trying to delete all the contents of a very high level container. With Marks you can just put a mark on the opening line of the container, hit <code>cmd+shift+a</code> to select down to the bottom of the tag, and then hit <code>cmd+K, cmd+a</code> to select everything back to your previous mark. Marks can also be used to swap lines of text but I’ve never needed to do that in practice.</p>
<h2>Hide the Sidebar</h2>
<p>To hide the sidebar hit <code>cmd+K, cmd+B</code>. Since I work on a laptop I often hide the sidebar to give myself that extra 100px of reading space.</p>
<h2>Turn off Minimap</h2>
<p>Do you guys use that minimap thing in the top corner of the editor windows? I find it <em>incredibly</em> distracting and it also takes up screen space. To disable it go to <code>View &gt; Hide Minimap</code>.</p>
<h2>Saving a project</h2>
<p>This one might be obvious for many of you but it wasn’t something I was really taking advantage of until recently. Once you have a folder open it can be beneficial to save it as a project via the <code>Project &gt; Save Project As...</code> command. Save the project files in the root of your app and then whenever you do <code>Project &gt; Recent Projects...</code> it will open everything up with all your windows just as you left them.</p>
<p>To switch between projects use <code>ctrl+cmd+p</code>.</p>
<h2>Some awesome plugins</h2>
<p>Sublime is all about plugins so here’s a list of some of my favorites. Once you have Package Control installed you can just hit <code>cmd+shift+p</code> and type <code>discover</code>, then hit enter which will take you to a page listing tons of plugins. Try out some (or all) of the ones below. They’re great :D</p>
<ul>
<li>AdvancedNewFile</li>
<li>HtmlTidy</li>
<li>Nettuts+ Fetch</li>
<li>Prefixr</li>
<li>RubyTest</li>
<li>Shell Turtlestein</li>
<li>SideBarEnhancements</li>
<li>sublime-github</li>
<li>Sublime-JSHint</li>
<li>SublimeCodeIntel</li>
<li>Tag</li>
<li>ZenCoding</li>
</ul>
<h2>Convert Case</h2>
<p>If you highlight some text you can use <code>cmd+K, cmd+U</code> to uppercase it. Likewise you can use <code>cmd+K, cmd+L</code> to lowercase it.</p>
<h2>Spell Check :)</h2>
<p>Finally I wouldn’t be much of a blogger if I didn’t point out the spell check feature. Hit <code>F6</code> to check your current file. Once you’ve turned it on the spell checker will stay on until you hit <code>F6</code> again.</p>
<h2>Hack the Planet!</h2>
<p>We’ve only really scratched the surface of what Sublime is capable of. In the future I’d like to write more about its awesome Macros, Snippets and Plugin architecture. Till then, have fun hacking. - Rob</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Tired, Lazy</li>
<li>Sleep: 5</li>
<li>Hunger: 5</li>
<li>Coffee: 1</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Publish your Node library to npm</title>
    <link href="https://robdodson.me/posts/publish-your-node-library-to-npm/"/>
    <updated>2012-06-17T06:06:00+00:00</updated>
    <id>https://robdodson.me/posts/publish-your-node-library-to-npm/</id>
    <content type="html"><![CDATA[
      <p>Alright, <a href="http://robdodson.me/blog/2012/06/15/how-to-run-a-node-script-from-the-command-line/">contuing from yesterday</a> we want to take our little Node module and make it available to the world as a really awesome command line tool.</p>
<p>The first thing we need to do is register an NPM account.</p>
<p><code>npm adduser</code></p>
<p>Fill in your credentials and it should be ready to go.</p>
<p>If we have any dependencies they should be added to our <code>package.json</code> file. Our simple <code>compliment</code> program doesn’t need any extra libraries but we’ll add <code>xml2json</code> just to demonstrate how it’s done.</p>
<pre class="language-json"><code class="language-json"><span class="highlight-line"><span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"compliment"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"version"</span><span class="token operator">:</span> <span class="token string">"0.0.1"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"description"</span><span class="token operator">:</span> <span class="token string">"Tell us how awesome we are."</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"preferGlobal"</span><span class="token operator">:</span> <span class="token string">"true"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"bin"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"compliment"</span><span class="token operator">:</span> <span class="token string">"compliment.js"</span> <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"author"</span><span class="token operator">:</span> <span class="token string">"Rob Dodson"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"dependencies"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token property">"xml2json"</span><span class="token operator">:</span> <span class="token string">"0.2.4"</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"engines"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"node"</span><span class="token operator">:</span> <span class="token string">"*"</span> <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>Since we’ve changed our <code>package.json</code> we need to run <code>npm link</code> again to install the dependency. After that you should have a <code>node_modules/</code> folder in your project root.</p>
<p>Let’s put this baby under version control!</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token function">git</span> init</span><br><span class="highlight-line"><span class="token keyword">echo</span> node_modules/ <span class="token operator">>></span> .gitignore <span class="token comment"># node_modules should be installed by npm</span></span><br><span class="highlight-line"><span class="token function">git</span> <span class="token function">add</span> <span class="token keyword">.</span></span><br><span class="highlight-line"><span class="token function">git</span> commit -am <span class="token string">'Initial commit'</span></span></code></pre>
<p>Final step:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token function">npm</span> publish</span></code></pre>
<h1>BOOMJAMS! We have us an npm module! - Rob</h1>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Hyper</li>
<li>Sleep: 5</li>
<li>Hunger: 1</li>
<li>Coffee: 1</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>How to Run a Node Script from the Command Line</title>
    <link href="https://robdodson.me/posts/how-to-run-a-node-script-from-the-command-line/"/>
    <updated>2012-06-16T02:46:00+00:00</updated>
    <id>https://robdodson.me/posts/how-to-run-a-node-script-from-the-command-line/</id>
    <content type="html"><![CDATA[
      <h2>First write some code</h2>
<p>Make a new directory called <code>compliment</code> and create two files inside of it: <code>comliment.js</code> and <code>package.json</code>.</p>
<p>In <code>compliment.js</code> we’re just going to print out some kind words.</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment">#! /usr/bin/env node</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">console.log<span class="token punctuation">(</span><span class="token string">'you. are. AWESOME!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Simple enough right? Just make sure you include that shebang up at the top which directs the system to use Node to execute our script.</p>
<h2>Package it up</h2>
<p>Ok now that we have our little script we’ll give its <code>package.json</code> some love.</p>
<pre class="language-json"><code class="language-json"><span class="highlight-line"><span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"compliment"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"version"</span><span class="token operator">:</span> <span class="token string">"0.0.1"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"description"</span><span class="token operator">:</span> <span class="token string">"Tell us how awesome we are."</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"bin"</span><span class="token operator">:</span> <span class="token punctuation">{</span><span class="token property">"compliment"</span><span class="token operator">:</span> <span class="token string">"compliment.js"</span><span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"author"</span><span class="token operator">:</span> <span class="token string">"Rob Dodson"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"engines"</span><span class="token operator">:</span> <span class="token punctuation">{</span><span class="token property">"node"</span><span class="token operator">:</span> <span class="token string">"*"</span><span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>Most of that should be self explanatory. The key aspect is the <code>bin</code> section where you tell it to translate <code>compliment</code> into <code>compliment.js</code>. To install it all we have to do is run <code>npm link</code>. After you’ve done that you should be able to type <code>compliment</code> and hear how awesome you are!</p>
<h2>Publish it</h2>
<p>When you’re ready to distribute your binary to the world you can run:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token function">npm</span> publish</span></code></pre>
<p>You’ll be prompted to sign in to npm if you haven’t already. After that you should see output confirming
that your package has been published.</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>How To Write a Command Line Ruby Gem</title>
    <link href="https://robdodson.me/posts/how-to-write-a-command-line-ruby-gem/"/>
    <updated>2012-06-14T15:17:00+00:00</updated>
    <id>https://robdodson.me/posts/how-to-write-a-command-line-ruby-gem/</id>
    <content type="html"><![CDATA[
      <p>So <a href="http://robdodson.me/blog/2012/06/13/writing-a-command-line-tool-in-ruby/">yesterday we saw how to setup and run ruby scripts as executables from the command line.</a> While this is pretty rad, it definitely has its limitations. For one, it’s not very portable and secondly it just isn’t very flexible or powerful. If we stuck with this approach we’d need to write our own semantic versioning, we’d have to setup a way to make sure that all of our required 3rd party gems get installed properly… really it’ll just be a big mess if we try to hand-roll it.</p>
<p>Instead we’re going to turn to Bundler to help us manage our files and turn our command line tool into a ruby gem. I’m going to start fresh and create a totally new tool, called <code>zerp</code>. I don’t know what <code>zerp</code>’s purpose will be in the long run, but today we’re going to make it print some text to verify everything is working.</p>
<h2>New RVM Gemset</h2>
<p>Before I do anything with gems I want to make sure I have a cleanroom of sorts. So if anything goes horribly wrong I can just throw everything away and start over. To do this we’ll use RVM to create a new gemset.</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">rvm gemset create zerp</span><br><span class="highlight-line">rvm gemset use zerp</span></code></pre>
<p>If you run <code>rvm current</code> you should see something like this: <code>ruby-1.9.3-p125@zerp</code></p>
<p>Now that we have our cleanroom we can template out a new gem.</p>
<h2>Bundle Gem</h2>
<p>If bundler is not one of our global gems we can go ahead and install it with <code>gem install bundler</code>. You can do <code>gem list</code> to see what gems are in your global set.</p>
<p>With Bundler in hand we will generate the boilerplate for our new gem:</p>
<p><code>bundle gem zerp</code></p>
<p>This will create a new folder called <code>zerp/</code> and fill it with several files. <code>cd</code> into <code>zerp/</code> and take a look around.</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">drwxr-xr-x  10 Rob  staff   340B Jun 14 08:38 <span class="token keyword">.</span></span><br><span class="highlight-line">drwxr-xr-x  21 Rob  staff   714B Jun 14 08:38 <span class="token punctuation">..</span></span><br><span class="highlight-line">drwxr-xr-x  11 Rob  staff   374B Jun 14 08:38 .git</span><br><span class="highlight-line">-rw-r--r--   1 Rob  staff   154B Jun 14 08:38 .gitignore</span><br><span class="highlight-line">-rw-r--r--   1 Rob  staff    89B Jun 14 08:38 Gemfile</span><br><span class="highlight-line">-rw-r--r--   1 Rob  staff   1.0K Jun 14 08:38 LICENSE</span><br><span class="highlight-line">-rw-r--r--   1 Rob  staff   490B Jun 14 08:38 README.md</span><br><span class="highlight-line">-rw-r--r--   1 Rob  staff    48B Jun 14 08:38 Rakefile</span><br><span class="highlight-line">drwxr-xr-x   4 Rob  staff   136B Jun 14 08:38 lib</span><br><span class="highlight-line">-rw-r--r--   1 Rob  staff   626B Jun 14 08:38 zerp.gemspec</span></code></pre>
<p>Bundler has already setup a git project for us, as well as including a folder structure for our library. <a href="http://rails-bestpractices.com/blog/posts/8-using-bundler-and-rvm-to-build-a-rubygem">This article from rails-bestpractices.com does a great job of explaining what everything in the boilerplate is.</a></p>
<h2>Zee Codez!</h2>
<p>Our project contains a folder called <code>lib</code> which is where we’ll store our Ruby code. Open up <code>lib/zerp.rb</code>. We’ll populate it with an example class called <code>Chatter</code> which’ll spit out our version of Hello World.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token keyword">require</span> <span class="token string">"zerp/version"</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">module</span> <span class="token constant">Zerp</span></span><br><span class="highlight-line">  <span class="token keyword">class</span> <span class="token class-name">Chatter</span></span><br><span class="highlight-line">    <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">say_hello</span></span></span><br><span class="highlight-line">      puts <span class="token string">'This is zerp. Coming in loud and clear. Over.'</span></span><br><span class="highlight-line">    <span class="token keyword">end</span></span><br><span class="highlight-line">  <span class="token keyword">end</span></span><br><span class="highlight-line"><span class="token keyword">end</span></span></code></pre>
<h2>Executable</h2>
<p>It wouldn’t be much of a CLI without an executable. For that we’ll need to create a folder called <code>bin</code> in the root of our project. Next create a file called <code>zerp</code> without any kind of file extension. We’re going to require our <code>Chatter</code> class and tell it to <code>say_hello</code>.</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment">#!/usr/bin/env ruby</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">require <span class="token string">'zerp'</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">chatter <span class="token operator">=</span> Zerp::Chatter.new</span><br><span class="highlight-line">chatter.say_hello</span></code></pre>
<p>The shebang <code>#!/usr/bin/env ruby</code> tells the system that it should use Ruby to execute our code. After that we require our ‘zerp’ module defined previously. Finally we instantiate <code>Zerp::Chatter</code> and tell it to <code>say_hello</code>. If all goes well it should respond with</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">This is zerp. Coming <span class="token keyword">in</span> loud and clear. Over.</span></code></pre>
<p>Let’s see if we can make that happen.</p>
<h2>Gemspec</h2>
<p>We’re going to open the <code>zerp.gemspec</code> and make it look like so:</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token comment"># -*- encoding: utf-8 -*-</span></span><br><span class="highlight-line"><span class="token keyword">require</span> <span class="token builtin">File</span><span class="token punctuation">.</span>expand_path<span class="token punctuation">(</span><span class="token string">'../lib/zerp/version'</span><span class="token punctuation">,</span> __FILE__<span class="token punctuation">)</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token constant">Gem</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Specification</span><span class="token punctuation">.</span><span class="token keyword">new</span> <span class="token class-name">do</span> <span class="token operator">|</span>gem<span class="token operator">|</span></span><br><span class="highlight-line">  gem<span class="token punctuation">.</span>authors       <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"Rob Dodson"</span><span class="token punctuation">]</span></span><br><span class="highlight-line">  gem<span class="token punctuation">.</span>email         <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"lets.email.rob@theawesomegmails.com"</span><span class="token punctuation">]</span></span><br><span class="highlight-line">  gem<span class="token punctuation">.</span>description   <span class="token operator">=</span> <span class="token string">%q{When a problem comes along..You must zerp it}</span></span><br><span class="highlight-line">  gem<span class="token punctuation">.</span>summary       <span class="token operator">=</span> <span class="token string">%q{Now zerp it..Into shape}</span></span><br><span class="highlight-line">  gem<span class="token punctuation">.</span>homepage      <span class="token operator">=</span> <span class="token string">"http://robdodson.me"</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  gem<span class="token punctuation">.</span>files         <span class="token operator">=</span> `git ls<span class="token operator">-</span>files`<span class="token punctuation">.</span>split<span class="token punctuation">(</span>$\<span class="token punctuation">)</span></span><br><span class="highlight-line">  gem<span class="token punctuation">.</span>executables   <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"zerp"</span><span class="token punctuation">]</span></span><br><span class="highlight-line">  gem<span class="token punctuation">.</span>test_files    <span class="token operator">=</span> gem<span class="token punctuation">.</span>files<span class="token punctuation">.</span>grep<span class="token punctuation">(</span><span class="token regex">%r{^(test|spec|features)/}</span><span class="token punctuation">)</span></span><br><span class="highlight-line">  gem<span class="token punctuation">.</span>name          <span class="token operator">=</span> <span class="token string">"zerp"</span></span><br><span class="highlight-line">  gem<span class="token punctuation">.</span>require_paths <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"lib"</span><span class="token punctuation">]</span></span><br><span class="highlight-line">  gem<span class="token punctuation">.</span>version       <span class="token operator">=</span> <span class="token constant">Zerp</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">VERSION</span></span><br><span class="highlight-line"><span class="token keyword">end</span></span></code></pre>
<p>The main thing I did was to correct the two ‘TODO’ entries, and to change the <code>gem.executables</code> line from</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line">gem<span class="token punctuation">.</span>files<span class="token punctuation">.</span>grep<span class="token punctuation">(</span><span class="token regex">%r{^bin/}</span><span class="token punctuation">)</span><span class="token punctuation">.</span>map<span class="token punctuation">{</span> <span class="token operator">|</span>f<span class="token operator">|</span> <span class="token builtin">File</span><span class="token punctuation">.</span>basename<span class="token punctuation">(</span>f<span class="token punctuation">)</span> <span class="token punctuation">}</span></span></code></pre>
<p>to</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line">gem<span class="token punctuation">.</span>executables   <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"zerp"</span><span class="token punctuation">]</span></span></code></pre>
<p>For reaons unknown to me the previous code wasn’t picking up my executable properly so I replaced it with <code>[&quot;zerp&quot;]</code>. I got the idea from <a href="https://github.com/lukebayes/project-sprouts/blob/master/sprout.gemspec">Project Sprouts which also uses this technique and seems to work fine on my system.</a></p>
<p>Alright we’re done! Let’s test this thing!</p>
<h2>Cross your fingers</h2>
<p>To install the Gem we’ll use Rake’s <code>install</code> task. Go ahead and run <code>rake install</code> from the root of the project. It should create a <code>pkg</code> directory and notify us via the terminal that our gem was installed succesfully. Moment of truth time…type <code>zerp</code> into the terminal. If you see <code>This is zerp. Coming in loud and clear. Over.</code> then you’re good to go. After you’ve committed everything to Github and setup a RubyGems account you should be able to run <code>rake release</code> to send your gem out into the world where it can wow the jaded masses and delight with all its wonders. Good Luck! - Rob</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Writing a Command Line Tool in Ruby</title>
    <link href="https://robdodson.me/posts/writing-a-command-line-tool-in-ruby/"/>
    <updated>2012-06-13T14:29:00+00:00</updated>
    <id>https://robdodson.me/posts/writing-a-command-line-tool-in-ruby/</id>
    <content type="html"><![CDATA[
      <p>Yesterday I tried to do a post on creating your first Ruby Gem as a command line tool. <a href="http://robdodson.me/blog/2012/06/12/messing-around-with-gems/">It didn’t go very well.</a> In an effort to better understand what goes on with command line tools I’m going to start from the most basic, a ruby script that is in our <code>PATH</code>.</p>
<p>I’ve previously added the folder <code>~/bin</code> to my PATH so I know that if I drop an executable script in there I should be able to run it by just typing its name. Let’s give that a shot. First we’ll make a new file just called <code>sherp</code> without any file extension. Make sure to <code>chmod 755 sherpa</code> so that it’s executable. Then we’ll add the following:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment">#!/usr/bin/env ruby</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">puts <span class="token string">'I am the sherpa!!!'</span></span></code></pre>
<p>If I now type <code>sherpa</code> into the command line, it should fire back <code>I am the sherpa!!!</code></p>
<p>Ok cool so we’ve got that part working. Now let’s see if we can get some arguments in there. We’ll iterate the <code>ARGV</code> object to see what comes in.</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment">#!/usr/bin/env ruby</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">ARGV.each <span class="token keyword">do</span> <span class="token operator">|</span>arg<span class="token operator">|</span></span><br><span class="highlight-line">    puts arg</span><br><span class="highlight-line">end</span></code></pre>
<p>With that little bit of code we should be able to pass just about anything to our command and have it echoed back.</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">sherpa foo bar baz</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> foo</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> bar</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> baz</span></code></pre>
<p>Ok cool. Now let’s step this up a notch or two. Let’s say we want to send in commands and options. For that we’ll use the built-in <a href="http://ruby-doc.org/stdlib-1.9.3/libdoc/optparse/rdoc/OptionParser.html">OptionParser</a>. Here’s <a href="http://rubylearning.com/blog/2011/01/03/how-do-i-make-a-command-line-tool-in-ruby/">a link to the article I’ve been following which details how to use the OptionParser.</a> In my case, I’m going to tell <code>sherpa</code> to either <code>say_hello</code> or <code>say_goodbye</code>. When I pass in the <code>-n</code> flag it should accept a name, otherwise it will use the name ‘Master’. So the line <code>sherpa say_hello -n Rob</code> should produce <code>Hello Rob</code> and likewise if I left off the option and just used <code>sherpa say_hello</code> it should produce <code>Hello Master</code>.</p>
<p>Here’s the code to accomplish this:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">    <span class="token comment">#!/usr/bin/env ruby</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    require <span class="token string">'optparse'</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    options <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    opt_parser <span class="token operator">=</span> OptionParser.new <span class="token keyword">do</span> <span class="token operator">|</span>opt<span class="token operator">|</span></span><br><span class="highlight-line">      opt.banner <span class="token operator">=</span> <span class="token string">"Usage: opt_parser COMMAND [OPTIONS]"</span></span><br><span class="highlight-line">      opt.separator  <span class="token string">""</span></span><br><span class="highlight-line">      opt.separator  <span class="token string">"Commands"</span></span><br><span class="highlight-line">      opt.separator  <span class="token string">"     name: the name the sherpa should use when addressing you"</span></span><br><span class="highlight-line">      opt.separator  <span class="token string">""</span></span><br><span class="highlight-line">      opt.separator  <span class="token string">"Options"</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      opt.on<span class="token punctuation">(</span><span class="token string">"-n"</span>,<span class="token string">"--name NAME"</span>,<span class="token string">"tell the sherpa what to call you"</span><span class="token punctuation">)</span> <span class="token keyword">do</span> <span class="token operator">|</span>name<span class="token operator">|</span></span><br><span class="highlight-line">        options<span class="token punctuation">[</span>:name<span class="token punctuation">]</span> <span class="token operator">=</span> name</span><br><span class="highlight-line">      end</span><br><span class="highlight-line"></span><br><span class="highlight-line">      opt.on<span class="token punctuation">(</span><span class="token string">"-h"</span>,<span class="token string">"--help"</span>,<span class="token string">"help"</span><span class="token punctuation">)</span> <span class="token keyword">do</span></span><br><span class="highlight-line">        puts opt_parser</span><br><span class="highlight-line">      end</span><br><span class="highlight-line">    end</span><br><span class="highlight-line"></span><br><span class="highlight-line">    opt_parser.parse<span class="token operator">!</span></span><br><span class="highlight-line">    name <span class="token operator">=</span> options<span class="token punctuation">[</span>:name<span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token string">'Master'</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token keyword">case</span> ARGV<span class="token punctuation">[</span>0<span class="token punctuation">]</span></span><br><span class="highlight-line">    when <span class="token string">"say_hello"</span></span><br><span class="highlight-line">      puts <span class="token string">"Hello #{name}"</span></span><br><span class="highlight-line">    when <span class="token string">"say_goodbye"</span></span><br><span class="highlight-line">      puts <span class="token string">"Goodbye #{name}"</span></span><br><span class="highlight-line">    <span class="token keyword">else</span></span><br><span class="highlight-line">      puts opt_parser</span><br><span class="highlight-line">    end</span></code></pre>
<p>And there we go, our first command line Ruby tool. I’ll pick it up tomorrow to try to improve upon it. We’re starting small but at least we have something that works!</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Tired, Patient</li>
<li>Sleep: 6</li>
<li>Hunger: 1</li>
<li>Coffee: 0</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Let&#39;s Talk SMACSS</title>
    <link href="https://robdodson.me/posts/lets-talk-smacss/"/>
    <updated>2012-06-10T04:03:00+00:00</updated>
    <id>https://robdodson.me/posts/lets-talk-smacss/</id>
    <content type="html"><![CDATA[
      <p>In an effort to further my understanding of CSS best practices I’ve ended up with two sort of looming frameworks: <a href="http://oocss.org/">OOCSS</a> and <a href="http://smacss.com/">SMACSS.</a> After reading up on both I feel more drawn toward SMACSS, most likely because it features a lumberjack on its site. I want to give a quick summary of what SMACSS has to offer. In so doing I’m going to borrow liberally from the documentation and then explain my thinking as it relates to certain passages. Cool? OK.</p>
<h2>The Skinny</h2>
<p>The ideas behind SMACSS were fostered over time by its creator, Jonathan Snook, who has worked on tons of sites, most notably YAHOO! Mail’s latest redesign. SMACSS is not a library of ready-made code that you can just download like <a href="http://twitter.github.com/bootstrap/">Twitter’s Bootstrap</a> or <a href="http://foundation.zurb.com/">ZURB’s Foundation.</a> Instead it is a collection of design ideas and suggestions codefied in an easy to read ebook. Think of it as a tool to help you decide <em>how</em> you’re going to write your CSS, rather than something which will write your CSS for you.</p>
<p>The Core of the book, which is what I’m going to focus on today, is separated by stylesheet: Base Rules, Layout Rules, Module Rules, State Rules, and Theme Rules.</p>
<h2>Base Rules</h2>
<blockquote>
<p>Base rules are the defaults. They are almost exclusively single element selectors but it could include attribute selectors, pseudo-class selectors, child selectors or sibling selectors. Essentially, a base style says that wherever this element is on the page, it should look like this. – SMACSS, Categorizing CSS Rules</p>
</blockquote>
<p><a href="http://www.stubbornella.org/content/">Nicole Sullivan</a>, creator of OOCSS, suggests that we start with the smallest possible elements of our site and design up from there. In the SMACSS philosophy this process would start with our <code>base.css</code> file. Think of it as the place where we define the absolute most basic styles any element on our site can have.</p>
<pre class="language-css"><code class="language-css"><span class="token selector">body,<br>form</span> <span class="token punctuation">{</span><br><span class="highlight-line">  <span class="token property">margin</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">padding</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">a</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">color</span><span class="token punctuation">:</span> #039<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">a:hover</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">color</span><span class="token punctuation">:</span> #03f<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>The idea is to give us a decent, even playing field where all of our core pieces are ready to be used in whatever fashion we see fit. You might find that you enjoy adding your css reset or normalization to a base.css file but personally I like to keep my reset separate to reduce clutter.</p>
<h2>Layout Rules</h2>
<blockquote>
<p>Layout rules divide the page into sections. Layouts hold one or more modules together. – SMACSS, Categorizing CSS Rules</p>
</blockquote>
<p>Your layout rules are where prototypes start to come to life. Every site can be broken down into two very broad layers. The first is the scaffolding of the page and the second is the modules which live in the scaffolding.</p>
<p>To understand scaffolding, try looking at a website like <a href="http://www.cnn.com/">CNN</a> and unfocusing your eyes. Once you’re ignoring the words and pictures you should be able to easily describe the major areas of content: the header, the primary content, sidebars, etc. The rules which govern the positioning of those elements should live in <code>layout.css</code>.</p>
<pre class="language-css"><code class="language-css"><span class="token selector">#header,<br><span class="highlight-line">#article,</span><br>#footer</span> <span class="token punctuation">{</span><br><span class="highlight-line">  <span class="token property">width</span><span class="token punctuation">:</span> 960px<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">margin</span><span class="token punctuation">:</span> auto<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">#article</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">border</span><span class="token punctuation">:</span> solid #ccc<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">border-width</span><span class="token punctuation">:</span> 1px 0 0<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>It’s also a good place to put other generalized layout styles which might be used elsewhere in your site. For instance, a horizontal list for menu items or breadcrumbs:</p>
<pre class="language-css"><code class="language-css"><span class="highlight-line"><span class="token selector">.h-list</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">margin</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">padding</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">list-style-type</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token selector">.h-list > li</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">display</span><span class="token punctuation">:</span> inline-block<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">margin</span><span class="token punctuation">:</span> 0 10px 0 0<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">/* IE7 hack to mimic inline-block on block elements */</span></span><br><span class="highlight-line">  *<span class="token property">display</span><span class="token punctuation">:</span> inline<span class="token punctuation">;</span></span><br><span class="highlight-line">  *<span class="token property">zoom</span><span class="token punctuation">:</span> 1<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>These styles don’t care about the color or background or any other specifics of their elements. They only care about how those elements will be layed out in space.</p>
<h2>Module Rules</h2>
<blockquote>
<p>Modules are the reusable, modular parts of our design. They are the callouts, the sidebar sections, the product lists and so on. – SMACSS, Categorizing CSS Rules</p>
</blockquote>
<p>The module rules are where the majority of your site code will go, as this sheet defines all the little inhabitants of that second layer I mentioned, the modules <em>inside</em> the scaffolding. Each module should be able to stand on its own, and as such, it might be a good idea to design them first in a separate file so there is no temptation to leverage styles already on the page. Once your module is complete you can drop it into your document and it <em>should</em> play nice with everyone else.</p>
<p>Each module will typically start with a class name, and all subsequent selectors should work from this point down. Or if our module is going to be rather complex we can namespace our selectors. For instance:</p>
<pre class="language-css"><code class="language-css"><span class="highlight-line"><span class="token selector">.pod</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">width</span><span class="token punctuation">:</span> 100%<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">.pod > h3</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">color</span><span class="token punctuation">:</span> #f00<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">/* Or... */</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">.pod-title</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">color</span><span class="token punctuation">:</span> #f00<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>Whether you use descendant selectors or namespaced clases is really up to you and how complex your modules get. You definitely don’t want to end up with classitis. The advantage to using <code>.pod-title</code> is that it doesn’t tie us to an <code>h3</code>, however your markup might become a total mess if every single element requires its own class. Balance is key.</p>
<h3>Subclassing Modules</h3>
<p>One very important concept to keep in mind is that of subclassing modules. Imagine a scenario where you have a widget which exists in your primary content area. One day your boss tells you to move it into the sidebar, and once it’s there 99% of the styles should look the same, except the widget will now be about 3/4ths of its normal width and its text should be red instead of blue. Your first inclination might be to move the code for the widget into the sidebar and then to do something like this:</p>
<pre class="language-css"><code class="language-css"><span class="highlight-line"><span class="token comment">/* DON'T DO THIS! */</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">.widget</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">width</span><span class="token punctuation">:</span> 100px<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">.widget .widget-title</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">color</span><span class="token punctuation">:</span> #00f<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">#sidebar .widget</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">width</span><span class="token punctuation">:</span> 75px<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">#sidebar .widget .widget-title</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">width</span><span class="token punctuation">:</span> 75px<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>By leveraging the parent context we’ve now locked ourselves into a specificity war. Any change to our second widget requires the <code>#sidebar</code> id, which also means that this second widget cannot live anywhere else. Rather than using the parent we should consider the widget that lives in the sidebar as an <em>extension</em> of our original object.</p>
<pre class="language-css"><code class="language-css"><span class="highlight-line"><span class="token selector">.widget</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">width</span><span class="token punctuation">:</span> 100px<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">.widget .widget-title</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">color</span><span class="token punctuation">:</span> #00f<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">/* Our Subclass */</span></span><br><span class="highlight-line"><span class="token selector">.widget-constrained</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">width</span><span class="token punctuation">:</span> 75px<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">.widget-constrained .widget-title</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">color</span><span class="token punctuation">:</span> #f00<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>To use a subclass we should apply both the original and the subclass styles to our element:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>widget widget-constrained<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>...<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span></code></pre>
<p>The benefit of doing it this way is that the styles are easier to read and also more flexible. Since there’s no parent coupling our <code>widget-constrained</code> can be used in the sidebar, footer, modals, or anywhere else you’d like.</p>
<h2>State Rules</h2>
<blockquote>
<p>State rules are ways to describe how our modules or layouts will look when in a particular state. Is it hidden or expanded? Is it active or inactive? They are about describing how a module or layout looks on screens that are smaller or bigger. They are also about describing how a module might look in different views like the home page or the inside page. – SMACSS, Categorizing CSS Rules</p>
</blockquote>
<p>The best example of what should go into a <code>states.css</code> is the classic error state.</p>
<pre class="language-css"><code class="language-css"><span class="highlight-line"><span class="token selector">.is-error</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">border</span><span class="token punctuation">:</span> 1px solid red<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>Really anything that would potentially be added with JavaScript to illustrate a change in a module’s state would be a good candidate. Some other ones that come to mind are <code>is-hidden</code> or <code>is-pressed</code>.</p>
<p>One rather sticky point to the whole idea of a <code>states.css</code> is that most of the states would need to either rely on being loaded after all your other stylesheets or have an <code>!important</code> added to them. I think for a lot of folks that is a dealbreaker, although in my opinion, if used properly, those few !importants can be very useful. For instance, if we add an <code>is-hidden</code> state to one of our elements I think it’s perfectly ok to <code>!important</code> the <code>display: none</code>.</p>
<h3>Module States</h3>
<p>An alternative to using <code>!important</code> all over the place is the idea of module states. So rather than <code>.is-pressed</code> in our <code>states.css</code> we would have <code>.is-btn-pressed</code> next to our <code>.btn</code> module in <code>modules.css</code>. I like this approach a lot and think it solves many of the places where <code>states.css</code> feels too general.</p>
<h2>Theme Rules</h2>
<blockquote>
<p>Theme rules are similar to state rules in that they describe how modules or layouts might look. Most sites don’t require a layer of theming but it is good to be aware of it.</p>
</blockquote>
<p>The primary consideration for theme rules are when your site is able to be reskinned and also if the typography can be changed.</p>
<p>Skinning a new module with a <code>theme.css</code> might look something like this:</p>
<pre class="language-css"><code class="language-css"><span class="highlight-line"><span class="token comment">/* in modules.css */</span></span><br><span class="highlight-line"><span class="token selector">.mod</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">border</span><span class="token punctuation">:</span> 1px solid<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">/* in theme.css */</span></span><br><span class="highlight-line"><span class="token selector">.mod</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">border-color</span><span class="token punctuation">:</span> blue<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>Likewise if you need to switch to a different font or size, here is where you would do that. To be honest I don’t currently need to make any of my projects skinnable so I haven’t explored the ideas around <code>theme.css</code> all that much, but I do think it’s a good idea to keep in the back of your hat.</p>
<h2>Wrap it up!</h2>
<p>That does it for tonight. Hopefully you’re a little more enlightened with regards to SMACSS. Definitely <a href="http://smacss.com/">checkout the SMACSS site</a> and grab the book. And as always please feel free to <a href="https://twitter.com/rob_dodson">send me feedback on Twitter</a>.</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>CSS Semantics: Best Practices</title>
    <link href="https://robdodson.me/posts/css-semantics/"/>
    <updated>2012-06-09T14:19:00+00:00</updated>
    <id>https://robdodson.me/posts/css-semantics/</id>
    <content type="html"><![CDATA[
      <p>CSS is, for me, one of the most challenging and nerve wracking aspects of my job. With most programming languages there are frameworks and guides and heuristics that all make up a suite of best practices. CSS doesn’t <em>really</em> have anything like this and as a result it’s kind of a mish-mash of good rules to follow, definite don’ts, and lots and lots of grey area. Since I’m starting a new CSS heavy project, and because I want to further my own understanding in this realm, I’m going to spend a few posts exploring the topic of what makes good, maintainable CSS. Along the way I’m also going to point out a few frameworks that I’ve been looking at, in particular <a href="http://oocss.org/">OOCSS</a> and <a href="http://smacss.com/">SMACSS.</a> But lets kick things off with a discussion of what it means to write good, semantic CSS selectors and we’ll follow up with frameworks in our next post.</p>
<h2>Define Semantic</h2>
<p>When I was trolling the interwebs for talks on writing large-scale maintainable CSS I somehow managed to come across <a href="http://css-tricks.com/semantic-class-names/">this article on css-tricks comparing the semantics of various css selectors.</a> After reading it I had this weird feeling like maybe I haven’t been putting as much thought into my css selectors as I should. My selectors need to be highly semantic, but what does that really <em>mean?</em></p>
<p>Trying to look up the definition of “semantic” is kind of a fun, albeit a slightly annoying task since most definitions look like this:</p>
<p><em>Of, relating to, or according to the science of semantics.</em></p>
<p>Well…thanks. <a href="http://www.wordnik.com/words/semantic">The wonderful Wordnik site has a great list of definitions</a> the most useful of which is probably this:</p>
<p><em>Reflecting intended structure and meaning.</em></p>
<p>So a semantic CSS selector should reflect the intended structure or meaning of the element it is applied to. Hmm…that’s still a rather broad definition but at least we have a starting point. If I have a <code>div</code> that holds a bunch of news articles there’s probably a gradient of increasingly more semantic names I could use for it.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>container<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>article-box<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>newsstand<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span></code></pre>
<p>On the far end of the spectrum, <code>container</code> is about as generic as you can get and basically restates that something is a <code>div</code>. While I’ve been guilty of doing this in the past, if you’re saying a containing HTML Element is a ‘container’ you’re restating the obvious and should probably work on improving the name.</p>
<p><code>article-box</code> is much more descriptive than just <code>container</code> so I’d say it has a higher semantic “score”. But there is the potential for some semantic weirdness here, for instance, if we decide at a later date that we want our articles to be contained in a horizontal list it might make less sense to call it an “article-<em>box</em>”. So maybe <code>article-container</code> is semantically similar but also a bit more flexible?</p>
<p>Finally we have <code>newsstand</code> which is highly semantic and probably my favorite of the bunch. <code>newsstand</code> describes what our element <em>is</em> but it doesn’t bother delving into how our element works. As a result <code>newsstand</code> can work however we want, it can be list like, or grid like, tabular, etc and it won’t matter. You might argue that this would be a good place to use an ID instead of a class but that decision should be weighed carefully. You have to make sure that 3 months or a year from now there isn’t the potential of having two newsstands on the same page.</p>
<h3>If we only worked on contrived examples…</h3>
<p>Of course there’s a litany of cases where highly semantic naming just doesn’t quite cut it. Often times we’re given a layout which has a few primary areas (columns, headers, footer) and the designer is putting all sorts of content into those divisions. On one page it could be news articles, then a list of search results, then a directory of users, and so on. I would argue that for major layout elements it’s ok to use less semantic names, and in fact this is probably a good idea. So things like <code>column_1</code>, <code>flex-box</code>, <code>constrained-container</code>, are all specifying, at varying degrees, what the element is doing. They are less semantically rich than, say, <code>rolodex</code> or <code>id-badge</code>, but that’s because their very intention is to be generic.</p>
<h3>What about helpers?</h3>
<p><em>Preface: I know about SASS and LESS. Let’s pretend they don’t exist for a moment :D</em></p>
<p>Here is an area where I recently got very tripped up and I’m still not entirely sure what the best approach might be. Let’s say you have a brand color, something like Facebook’s blue, and you need to apply it to all sorts of different and unrelated elements. If you’re like me then your brain starts thinking, “Well, that blue value is essentially a variable that I’d like to reuse. Maybe I should just make a helper style for it…” and so you produce something like this in a helpers.css file:</p>
<pre class="language-css"><code class="language-css"><span class="highlight-line"><span class="token selector">.light-blue</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    #00C</span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>Now our HTML has little <code>light-blue</code>s sprinkled on top of it and we don’t have to worry about declaring that same blue value over and over again in our styles. But what happens when our company decides to rebrand and now our primary color is a bright red? Uh oh…You definitely don’t want to have to change HTML <em>and</em> CSS just to update a color.</p>
<p><a href="http://css-tricks.com/semantic-class-names/#comment-102571">Neal G on CSS-Tricks made a very good comment regarding this scenario:</a></p>
<blockquote>
<p>Perhaps an easier way to explain semantic CSS is simply, don’t name your classes or ids anything related to a CSS property. A property could be color, font-family, float, border, background etc.</p>
</blockquote>
<p><a href="http://www.webdesignerdepot.com/2009/05/10-best-css-practices-to-improve-your-code/">Also from the Web Designer Depot</a></p>
<blockquote>
<p>Name your elements based on what they are, not what they look like. For example, .comment-blue is much less versatile than .comment-beta, and .post-largefont is more limiting than .post-title.</p>
</blockquote>
<p>Perhaps a better helper would have been <code>.brand-color</code> but again this is a contrived example. What about all the <em>other</em> colors on the site. And what about helpers that wrap commonly used styles like <code>float: left</code> and <code>clear: both</code>?</p>
<p>The debate is pretty hot and heavy <a href="http://css-tricks.com/semantic-class-names">on the css-tricks article.</a> Just seach for the word ‘float’ and you’ll see some pretty interesting discussions on it. My opinion is that you probably don’t want to tack a bunch of <code>.bright-red</code> or <code>.larger</code> classes everywhere but at the same time something like <code>.float-right</code> can be extremely useful and <a href="http://css-tricks.com/semantic-class-names/#comment-102906">in some cases forcing semantics into a design can actually make things worse</a> especially for <a href="http://css-tricks.com/semantic-class-names/#comment-103076">less technically inclined clients.</a></p>
<p>As a bit of a homework assignment I would recommend looking into a few of the resources I’m posting below. Obviouslyl take everything with a grain of salt, there isn’t any true gospel for CSS so do what works best for you. I’ll cover OOCSS and SMACSS in my next post, till then, thanks for reading! - Rob</p>
<p><a href="http://css-tricks.com/semantic-class-names/">What Makes For a Semantic Class Name?</a></p>
<p><a href="http://www.stubbornella.org/content/2011/04/28/our-best-practices-are-killing-us/">Our Best Practices Are Killing Us</a></p>
<p><a href="https://github.com/styleguide/css">Github CSS Style Guide</a></p>
<p><a href="https://github.com/csswizardry/CSS-Guidelines/blob/master/CSS%20Guidelines.md">CSS Wizardry: CSS Guidelines</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Building a Countdown Timer with Socket.io pt. 3</title>
    <link href="https://robdodson.me/posts/building-a-countdown-timer-with-socket-dot-io-pt-3/"/>
    <updated>2012-06-08T02:41:00+00:00</updated>
    <id>https://robdodson.me/posts/building-a-countdown-timer-with-socket-dot-io-pt-3/</id>
    <content type="html"><![CDATA[
      <p>Today’s the day we wrap up our countdown timer and deploy it to Heroku. But before we launch this puppy we need to clean house a little and spice up the visual appeal.</p>
<ul>
<li><a href="http://robdodson.me/blog/2012/06/04/deploying-your-first-node-dot-js-and-socket-dot-io-app-to-heroku/">Getting Started</a></li>
<li><a href="http://robdodson.me/blog/2012/06/05/building-a-countdown-timer-with-socket-dot-io/">Click here for part 1.</a></li>
<li><a href="http://robdodson.me/blog/2012/06/06/building-a-countdown-timer-with-socket-dot-io-pt-2/">Click here for part 2.</a></li>
</ul>
<h3>Refactoring the Stopwatch</h3>
<p>While the Stopwatch from our last post worked OK there are a spots that can be improved. For starters I’d like to separate the formatting of the time from the <code>onTick</code> method. Mainly because I want to be able to pull the current time out whenever someone hits reset or a new connection is made. Here’s how I updated Stopwatch to accomodate these changes:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> util <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'util'</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  events <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'events'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">_ <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'underscore'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// ---------------------------------------------</span></span><br><span class="highlight-line"><span class="token comment">// Constructor</span></span><br><span class="highlight-line"><span class="token comment">// ---------------------------------------------</span></span><br><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">Stopwatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token boolean">false</span> <span class="token operator">===</span> <span class="token keyword">this</span> <span class="token keyword">instanceof</span> <span class="token class-name">Stopwatch</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Stopwatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>hour <span class="token operator">=</span> <span class="token number">3600000</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>minute <span class="token operator">=</span> <span class="token number">60000</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>second <span class="token operator">=</span> <span class="token number">1000</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>time <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>hour<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>interval <span class="token operator">=</span> <span class="token keyword">undefined</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  events<span class="token punctuation">.</span><span class="token function">EventEmitter</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Use Underscore to bind all of our methods</span></span><br><span class="highlight-line">  <span class="token comment">// to the proper context</span></span><br><span class="highlight-line">  _<span class="token punctuation">.</span><span class="token function">bindAll</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// ---------------------------------------------</span></span><br><span class="highlight-line"><span class="token comment">// Inherit from EventEmitter</span></span><br><span class="highlight-line"><span class="token comment">// ---------------------------------------------</span></span><br><span class="highlight-line">util<span class="token punctuation">.</span><span class="token function">inherits</span><span class="token punctuation">(</span>Stopwatch<span class="token punctuation">,</span> events<span class="token punctuation">.</span>EventEmitter<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// ---------------------------------------------</span></span><br><span class="highlight-line"><span class="token comment">// Methods</span></span><br><span class="highlight-line"><span class="token comment">// ---------------------------------------------</span></span><br><span class="highlight-line"><span class="token class-name">Stopwatch</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">start</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>interval<span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Starting Stopwatch!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token comment">// note the use of _.bindAll in the constructor</span></span><br><span class="highlight-line">  <span class="token comment">// with bindAll we can pass one of our methods to</span></span><br><span class="highlight-line">  <span class="token comment">// setInterval and have it called with the proper 'this' value</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>interval <span class="token operator">=</span> <span class="token function">setInterval</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>onTick<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>second<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'start:stopwatch'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Stopwatch</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">stop</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Stopping Stopwatch!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>interval<span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token function">clearInterval</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>interval<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>interval <span class="token operator">=</span> <span class="token keyword">undefined</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'stop:stopwatch'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Stopwatch</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">reset</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Resetting Stopwatch!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>time <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>hour<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'reset:stopwatch'</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">formatTime</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>time<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Stopwatch</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">onTick</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>time <span class="token operator">-=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>second<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">var</span> formattedTime <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">formatTime</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>time<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'tick:stopwatch'</span><span class="token punctuation">,</span> formattedTime<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>time <span class="token operator">===</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Stopwatch</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">formatTime</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">time</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> remainder <span class="token operator">=</span> time<span class="token punctuation">,</span></span><br><span class="highlight-line">    numHours<span class="token punctuation">,</span></span><br><span class="highlight-line">    numMinutes<span class="token punctuation">,</span></span><br><span class="highlight-line">    numSeconds<span class="token punctuation">,</span></span><br><span class="highlight-line">    output <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  numHours <span class="token operator">=</span> <span class="token function">String</span><span class="token punctuation">(</span><span class="token function">parseInt</span><span class="token punctuation">(</span>remainder <span class="token operator">/</span> <span class="token keyword">this</span><span class="token punctuation">.</span>hour<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  remainder <span class="token operator">-=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>hour <span class="token operator">*</span> numHours<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  numMinutes <span class="token operator">=</span> <span class="token function">String</span><span class="token punctuation">(</span><span class="token function">parseInt</span><span class="token punctuation">(</span>remainder <span class="token operator">/</span> <span class="token keyword">this</span><span class="token punctuation">.</span>minute<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  remainder <span class="token operator">-=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>minute <span class="token operator">*</span> numMinutes<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  numSeconds <span class="token operator">=</span> <span class="token function">String</span><span class="token punctuation">(</span><span class="token function">parseInt</span><span class="token punctuation">(</span>remainder <span class="token operator">/</span> <span class="token keyword">this</span><span class="token punctuation">.</span>second<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  output <span class="token operator">=</span> _<span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token punctuation">[</span>numHours<span class="token punctuation">,</span> numMinutes<span class="token punctuation">,</span> numSeconds<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">str</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>str<span class="token punctuation">.</span>length <span class="token operator">===</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      str <span class="token operator">=</span> <span class="token string">'0'</span> <span class="token operator">+</span> str<span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> str<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token string">':'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">return</span> output<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Stopwatch</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">getTime</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">formatTime</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>time<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// ---------------------------------------------</span></span><br><span class="highlight-line"><span class="token comment">// Export</span></span><br><span class="highlight-line"><span class="token comment">// ---------------------------------------------</span></span><br><span class="highlight-line">module<span class="token punctuation">.</span>exports <span class="token operator">=</span> Stopwatch<span class="token punctuation">;</span></span></code></pre>
<p>I also namespaced the events so they would be easier to read when mixed in with the socket.io events. During the refactoring I noticed there were a lot of actors listening to, emitting or calling something like <code>start</code>. I’m not sure if there are common socket.io namespacing patterns but I based what I did on Backbone events and I think it works out well enough.</p>
<h3>Cleaning up app.js</h3>
<p>These changes to <code>Stopwatch</code> also require us to update the <code>app.js</code> that uses it.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> stopwatch <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Stopwatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">stopwatch<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'tick:stopwatch'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">time</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  io<span class="token punctuation">.</span>sockets<span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'time'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>time<span class="token punctuation">:</span> time<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">stopwatch<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'reset:stopwatch'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">time</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  io<span class="token punctuation">.</span>sockets<span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'time'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>time<span class="token punctuation">:</span> time<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">stopwatch<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">io<span class="token punctuation">.</span>sockets<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'connection'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">socket</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  io<span class="token punctuation">.</span>sockets<span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'time'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>time<span class="token punctuation">:</span> stopwatch<span class="token punctuation">.</span><span class="token function">getTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  socket<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'click:start'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    stopwatch<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  socket<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'click:stop'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    stopwatch<span class="token punctuation">.</span><span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  socket<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'click:reset'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    stopwatch<span class="token punctuation">.</span><span class="token function">reset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>I’ve made it so whenever a user resets or connects to the page they get the latest time. And of course whenever the stopwatch ticks they’ll get an update as well. I think it might also be nice if pressing start dispatched the latest time, I should probably add that… ;)</p>
<h3>Tweaking the views</h3>
<p>Lastly I’ve updated the view by adding some more buttons to correspond to the start/stop and reset methods. I’ve also wrapped everything in a container to make it easier to position:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>wrapper<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>countdown<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>start<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>thoughtbot<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Start<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stop<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>thoughtbot<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Stop<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>reset<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>thoughtbot<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Reset<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span></code></pre>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> socket <span class="token operator">=</span> io<span class="token punctuation">.</span><span class="token function">connect</span><span class="token punctuation">(</span>window<span class="token punctuation">.</span>location<span class="token punctuation">.</span>hostname<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">socket<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'time'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#countdown'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">html</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>time<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#start'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">click</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  socket<span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'click:start'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#stop'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">click</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  socket<span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'click:stop'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#reset'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">click</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  socket<span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'click:reset'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Also notice that the socket events coming from the view have been namespaced as well.</p>
<h3>Improving the type</h3>
<p>Next up I want to enhance the type using <a href="http://www.google.com/webfonts">one of Google’s webfonts.</a> I chose a font called <code>Black Ops One</code> which seemed appropriately militaristic. Setting it up was as easy as adding one line to my <code>layout.ejs</code></p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span><br><span class="highlight-line">  <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://fonts.googleapis.com/css?family=Black+Ops+One<span class="token punctuation">"</span></span></span><br><span class="highlight-line">  <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span></span><br><span class="highlight-line">  <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>text/css<span class="token punctuation">"</span></span></span><br><span class="token punctuation">/></span></span></code></pre>
<p>and my <code>main.css</code> file:</p>
<pre class="language-css"><code class="language-css"><span class="highlight-line"><span class="token selector">#countdown</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">font-family</span><span class="token punctuation">:</span> <span class="token string">'Black Ops One'</span><span class="token punctuation">,</span> cursive<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">font-size</span><span class="token punctuation">:</span> 90px<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>Finally I chose to use some funky buttons from <a href="https://github.com/ubuwaits/css3-buttons">Chad Mazzola’s CSS3 Buttons project.</a> I went with the Thoughtbot buttons since they were red and awesome. The styles are pretty long so I’m just going to post my entire <code>main.css</code> for you to see:</p>
<pre class="language-css"><code class="language-css"><span class="highlight-line"><span class="token selector">#wrapper</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">width</span><span class="token punctuation">:</span> 475px<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">height</span><span class="token punctuation">:</span> 171px<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">margin</span><span class="token punctuation">:</span> 100px auto<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">#countdown</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">font-family</span><span class="token punctuation">:</span> <span class="token string">'Black Ops One'</span><span class="token punctuation">,</span> cursive<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">font-size</span><span class="token punctuation">:</span> 90px<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">button.thoughtbot</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">background-color</span><span class="token punctuation">:</span> #ee432e<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">-webkit-gradient</span><span class="token punctuation">(</span></span><br><span class="highlight-line">    linear<span class="token punctuation">,</span></span><br><span class="highlight-line">    left top<span class="token punctuation">,</span></span><br><span class="highlight-line">    left bottom<span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function">color-stop</span><span class="token punctuation">(</span>0%<span class="token punctuation">,</span> #ee432e<span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function">color-stop</span><span class="token punctuation">(</span>50%<span class="token punctuation">,</span> #c63929<span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function">color-stop</span><span class="token punctuation">(</span>50%<span class="token punctuation">,</span> #b51700<span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function">color-stop</span><span class="token punctuation">(</span>100%<span class="token punctuation">,</span> #891100<span class="token punctuation">)</span></span><br><span class="highlight-line">  <span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">-webkit-linear-gradient</span><span class="token punctuation">(</span></span><br><span class="highlight-line">    top<span class="token punctuation">,</span></span><br><span class="highlight-line">    #ee432e 0%<span class="token punctuation">,</span></span><br><span class="highlight-line">    #c63929 50%<span class="token punctuation">,</span></span><br><span class="highlight-line">    #b51700 50%<span class="token punctuation">,</span></span><br><span class="highlight-line">    #891100 100%</span><br><span class="highlight-line">  <span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">-moz-linear-gradient</span><span class="token punctuation">(</span>top<span class="token punctuation">,</span> #ee432e 0%<span class="token punctuation">,</span> #c63929 50%<span class="token punctuation">,</span> #b51700 50%<span class="token punctuation">,</span> #891100 100%<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">-ms-linear-gradient</span><span class="token punctuation">(</span>top<span class="token punctuation">,</span> #ee432e 0%<span class="token punctuation">,</span> #c63929 50%<span class="token punctuation">,</span> #b51700 50%<span class="token punctuation">,</span> #891100 100%<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">-o-linear-gradient</span><span class="token punctuation">(</span>top<span class="token punctuation">,</span> #ee432e 0%<span class="token punctuation">,</span> #c63929 50%<span class="token punctuation">,</span> #b51700 50%<span class="token punctuation">,</span> #891100 100%<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">linear-gradient</span><span class="token punctuation">(</span>top<span class="token punctuation">,</span> #ee432e 0%<span class="token punctuation">,</span> #c63929 50%<span class="token punctuation">,</span> #b51700 50%<span class="token punctuation">,</span> #891100 100%<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">border</span><span class="token punctuation">:</span> 1px solid #951100<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">-webkit-border-radius</span><span class="token punctuation">:</span> 5px<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">-moz-border-radius</span><span class="token punctuation">:</span> 5px<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">border-radius</span><span class="token punctuation">:</span> 5px<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">-webkit-box-shadow</span><span class="token punctuation">:</span> inset 0px 0px 0px 1px <span class="token function">rgba</span><span class="token punctuation">(</span>255<span class="token punctuation">,</span> 115<span class="token punctuation">,</span> 100<span class="token punctuation">,</span> 0.4<span class="token punctuation">)</span><span class="token punctuation">,</span> 0 1px 3px #333333<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">-moz-box-shadow</span><span class="token punctuation">:</span> inset 0px 0px 0px 1px <span class="token function">rgba</span><span class="token punctuation">(</span>255<span class="token punctuation">,</span> 115<span class="token punctuation">,</span> 100<span class="token punctuation">,</span> 0.4<span class="token punctuation">)</span><span class="token punctuation">,</span> 0 1px 3px #333333<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">box-shadow</span><span class="token punctuation">:</span> inset 0px 0px 0px 1px <span class="token function">rgba</span><span class="token punctuation">(</span>255<span class="token punctuation">,</span> 115<span class="token punctuation">,</span> 100<span class="token punctuation">,</span> 0.4<span class="token punctuation">)</span><span class="token punctuation">,</span> 0 1px 3px #333333<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">color</span><span class="token punctuation">:</span> #fff<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">font</span><span class="token punctuation">:</span> bold 20px <span class="token string">'helvetica neue'</span><span class="token punctuation">,</span> helvetica<span class="token punctuation">,</span> arial<span class="token punctuation">,</span> sans-serif<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">line-height</span><span class="token punctuation">:</span> 1<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">padding</span><span class="token punctuation">:</span> 12px 0 14px 0<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">text-align</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">text-shadow</span><span class="token punctuation">:</span> 0px -1px 1px <span class="token function">rgba</span><span class="token punctuation">(</span>0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0.8<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">width</span><span class="token punctuation">:</span> 150px<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">button.thoughtbot:hover</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">background-color</span><span class="token punctuation">:</span> #f37873<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">-webkit-gradient</span><span class="token punctuation">(</span></span><br><span class="highlight-line">    linear<span class="token punctuation">,</span></span><br><span class="highlight-line">    left top<span class="token punctuation">,</span></span><br><span class="highlight-line">    left bottom<span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function">color-stop</span><span class="token punctuation">(</span>0%<span class="token punctuation">,</span> #f37873<span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function">color-stop</span><span class="token punctuation">(</span>50%<span class="token punctuation">,</span> #db504d<span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function">color-stop</span><span class="token punctuation">(</span>50%<span class="token punctuation">,</span> #cb0500<span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function">color-stop</span><span class="token punctuation">(</span>100%<span class="token punctuation">,</span> #a20601<span class="token punctuation">)</span></span><br><span class="highlight-line">  <span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">-webkit-linear-gradient</span><span class="token punctuation">(</span></span><br><span class="highlight-line">    top<span class="token punctuation">,</span></span><br><span class="highlight-line">    #f37873 0%<span class="token punctuation">,</span></span><br><span class="highlight-line">    #db504d 50%<span class="token punctuation">,</span></span><br><span class="highlight-line">    #cb0500 50%<span class="token punctuation">,</span></span><br><span class="highlight-line">    #a20601 100%</span><br><span class="highlight-line">  <span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">-moz-linear-gradient</span><span class="token punctuation">(</span>top<span class="token punctuation">,</span> #f37873 0%<span class="token punctuation">,</span> #db504d 50%<span class="token punctuation">,</span> #cb0500 50%<span class="token punctuation">,</span> #a20601 100%<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">-ms-linear-gradient</span><span class="token punctuation">(</span>top<span class="token punctuation">,</span> #f37873 0%<span class="token punctuation">,</span> #db504d 50%<span class="token punctuation">,</span> #cb0500 50%<span class="token punctuation">,</span> #a20601 100%<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">-o-linear-gradient</span><span class="token punctuation">(</span>top<span class="token punctuation">,</span> #f37873 0%<span class="token punctuation">,</span> #db504d 50%<span class="token punctuation">,</span> #cb0500 50%<span class="token punctuation">,</span> #a20601 100%<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">linear-gradient</span><span class="token punctuation">(</span>top<span class="token punctuation">,</span> #f37873 0%<span class="token punctuation">,</span> #db504d 50%<span class="token punctuation">,</span> #cb0500 50%<span class="token punctuation">,</span> #a20601 100%<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">cursor</span><span class="token punctuation">:</span> pointer<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">button.thoughtbot:active</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">background-color</span><span class="token punctuation">:</span> #d43c28<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">-webkit-gradient</span><span class="token punctuation">(</span></span><br><span class="highlight-line">    linear<span class="token punctuation">,</span></span><br><span class="highlight-line">    left top<span class="token punctuation">,</span></span><br><span class="highlight-line">    left bottom<span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function">color-stop</span><span class="token punctuation">(</span>0%<span class="token punctuation">,</span> #d43c28<span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function">color-stop</span><span class="token punctuation">(</span>50%<span class="token punctuation">,</span> #ad3224<span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function">color-stop</span><span class="token punctuation">(</span>50%<span class="token punctuation">,</span> #9c1500<span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function">color-stop</span><span class="token punctuation">(</span>100%<span class="token punctuation">,</span> #700d00<span class="token punctuation">)</span></span><br><span class="highlight-line">  <span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">-webkit-linear-gradient</span><span class="token punctuation">(</span></span><br><span class="highlight-line">    top<span class="token punctuation">,</span></span><br><span class="highlight-line">    #d43c28 0%<span class="token punctuation">,</span></span><br><span class="highlight-line">    #ad3224 50%<span class="token punctuation">,</span></span><br><span class="highlight-line">    #9c1500 50%<span class="token punctuation">,</span></span><br><span class="highlight-line">    #700d00 100%</span><br><span class="highlight-line">  <span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">-moz-linear-gradient</span><span class="token punctuation">(</span>top<span class="token punctuation">,</span> #d43c28 0%<span class="token punctuation">,</span> #ad3224 50%<span class="token punctuation">,</span> #9c1500 50%<span class="token punctuation">,</span> #700d00 100%<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">-ms-linear-gradient</span><span class="token punctuation">(</span>top<span class="token punctuation">,</span> #d43c28 0%<span class="token punctuation">,</span> #ad3224 50%<span class="token punctuation">,</span> #9c1500 50%<span class="token punctuation">,</span> #700d00 100%<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">-o-linear-gradient</span><span class="token punctuation">(</span>top<span class="token punctuation">,</span> #d43c28 0%<span class="token punctuation">,</span> #ad3224 50%<span class="token punctuation">,</span> #9c1500 50%<span class="token punctuation">,</span> #700d00 100%<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">linear-gradient</span><span class="token punctuation">(</span>top<span class="token punctuation">,</span> #d43c28 0%<span class="token punctuation">,</span> #ad3224 50%<span class="token punctuation">,</span> #9c1500 50%<span class="token punctuation">,</span> #700d00 100%<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">-webkit-box-shadow</span><span class="token punctuation">:</span> inset 0px 0px 0px 1px <span class="token function">rgba</span><span class="token punctuation">(</span>255<span class="token punctuation">,</span> 115<span class="token punctuation">,</span> 100<span class="token punctuation">,</span> 0.4<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">-moz-box-shadow</span><span class="token punctuation">:</span> inset 0px 0px 0px 1px <span class="token function">rgba</span><span class="token punctuation">(</span>255<span class="token punctuation">,</span> 115<span class="token punctuation">,</span> 100<span class="token punctuation">,</span> 0.4<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">box-shadow</span><span class="token punctuation">:</span> inset 0px 0px 0px 1px <span class="token function">rgba</span><span class="token punctuation">(</span>255<span class="token punctuation">,</span> 115<span class="token punctuation">,</span> 100<span class="token punctuation">,</span> 0.4<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p><img src="/images/2014/12/defcon_final.png" alt="Defcon final"></p>
<p>SWEEEEEEET! I’ll go ahead and host it on Heroku but first I have to find out what the cost of leaving Node.js/Socket.io running indefinitely would be. Till then you should be able to get a local version of all this working or <a href="https://github.com/robdodson/defcon">just clone the Github repo</a> and now you too can have your very own Defcon stopwatch. enjoy! - Rob</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Tired, Lazy</li>
<li>Sleep: 6</li>
<li>Hunger: 3</li>
<li>Coffee: 1</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Building a Countdown Timer with Socket.io pt. 2</title>
    <link href="https://robdodson.me/posts/building-a-countdown-timer-with-socket-dot-io-pt-2/"/>
    <updated>2012-06-06T14:47:00+00:00</updated>
    <id>https://robdodson.me/posts/building-a-countdown-timer-with-socket-dot-io-pt-2/</id>
    <content type="html"><![CDATA[
      <p><a href="http://robdodson.me/blog/2012/06/05/building-a-countdown-timer-with-socket-dot-io/">Continuing from yesterday’s post</a> we started out with a rather crude timer and today I want to upgrade it to a full fledged model, <code>Stopwatch</code>, which dispatches events for the view to hook on to.</p>
<ul>
<li><a href="http://robdodson.me/blog/2012/06/04/deploying-your-first-node-dot-js-and-socket-dot-io-app-to-heroku/">Getting Started</a></li>
<li><a href="http://robdodson.me/blog/2012/06/05/building-a-countdown-timer-with-socket-dot-io/">Click here for part 1.</a></li>
<li><a href="http://robdodson.me/blog/2012/06/07/building-a-countdown-timer-with-socket-dot-io-pt-3/">Click here for part 3.</a></li>
</ul>
<h3>Extend Node’s EventEmitter</h3>
<p>We want to extend Node’s EventEmitter object in order for our Stopwatch to dispatch its tick events. <a href="http://elegantcode.com/2011/02/21/taking-baby-steps-with-node-js-implementing-events/">Following this great article by Jan Van Ryswyck</a> I’ve arrived at something that looks like this:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> util <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'util'</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  events <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'events'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">Stopwatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token boolean">false</span> <span class="token operator">===</span> <span class="token keyword">this</span> <span class="token keyword">instanceof</span> <span class="token class-name">Stopwatch</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Stopwatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  events<span class="token punctuation">.</span><span class="token function">EventEmitter</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">var</span> self <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token function">setInterval</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    self<span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'tick'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">1000</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">util<span class="token punctuation">.</span><span class="token function">inherits</span><span class="token punctuation">(</span>Stopwatch<span class="token punctuation">,</span> events<span class="token punctuation">.</span>EventEmitter<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">module<span class="token punctuation">.</span>exports <span class="token operator">=</span> Stopwatch<span class="token punctuation">;</span></span></code></pre>
<p>In our app.js we’ll need to <code>require</code> our new Stopwatch module, create an instance of it, and add a listener for the tick event. Here’s the abbreviated version:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> Stopwatch <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'./models/stopwatch'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token operator">...</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> stopwatch <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Stopwatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">stopwatch<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'tick'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'stopwatch tick!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>If all goes well when you restart your server you should see ‘stopwatch tick!’ arriving every second.</p>
<h3>Add to the prototype the RIGHT way</h3>
<p>This next part is what tripped me up the other night and since it was rather late in the evening I was too out of it to figure out what was going wrong.</p>
<p>To recap, we’ve created a model called <code>Stopwatch</code>, we gave it a constructor function and we told it to extend <code>events.EventEmitter</code>.</p>
<p>Now I want to add a new method to my stopwatch but here’s where you might run into a real gotcha. If you’re like me you’d probably add it like this:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> util <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'util'</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  events <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'events'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">Stopwatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token boolean">false</span> <span class="token operator">===</span> <span class="token keyword">this</span> <span class="token keyword">instanceof</span> <span class="token class-name">Stopwatch</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Stopwatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  events<span class="token punctuation">.</span><span class="token function">EventEmitter</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Stopwatch</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">foobar</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'foobar!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">util<span class="token punctuation">.</span><span class="token function">inherits</span><span class="token punctuation">(</span>Stopwatch<span class="token punctuation">,</span> events<span class="token punctuation">.</span>EventEmitter<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">module<span class="token punctuation">.</span>exports <span class="token operator">=</span> Stopwatch<span class="token punctuation">;</span></span></code></pre>
<p>Aaaand your app would explode like this:</p>
<pre><code>[ERROR] TypeError
TypeError: Object #&lt;Stopwatch&gt; has no method 'foobar'
</code></pre>
<p>That’s because we can only add new methods <strong>after calling <code>util.inherits</code>.</strong> The proper way would look like this:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> util <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'util'</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  events <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'events'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">Stopwatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token boolean">false</span> <span class="token operator">===</span> <span class="token keyword">this</span> <span class="token keyword">instanceof</span> <span class="token class-name">Stopwatch</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Stopwatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  events<span class="token punctuation">.</span><span class="token function">EventEmitter</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">util<span class="token punctuation">.</span><span class="token function">inherits</span><span class="token punctuation">(</span>Stopwatch<span class="token punctuation">,</span> events<span class="token punctuation">.</span>EventEmitter<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Stopwatch</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">foobar</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'foobar!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">module<span class="token punctuation">.</span>exports <span class="token operator">=</span> Stopwatch<span class="token punctuation">;</span></span></code></pre>
<p>This is also the approach <a href="http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor">taken in the documentation.</a> Guess it pays to rtfm :D</p>
<p>Here’s what my final <code>Stopwatch</code> looks like:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> util <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'util'</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  events <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'events'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">_ <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'underscore'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// ---------------------------------------------</span></span><br><span class="highlight-line"><span class="token comment">// Constructor</span></span><br><span class="highlight-line"><span class="token comment">// ---------------------------------------------</span></span><br><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">Stopwatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token boolean">false</span> <span class="token operator">===</span> <span class="token keyword">this</span> <span class="token keyword">instanceof</span> <span class="token class-name">Stopwatch</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Stopwatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>hour <span class="token operator">=</span> <span class="token number">3600000</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>minute <span class="token operator">=</span> <span class="token number">60000</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>second <span class="token operator">=</span> <span class="token number">1000</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>time <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>hour<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>interval <span class="token operator">=</span> <span class="token keyword">undefined</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  events<span class="token punctuation">.</span><span class="token function">EventEmitter</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Use Underscore to bind all of our methods</span></span><br><span class="highlight-line">  <span class="token comment">// to the proper context</span></span><br><span class="highlight-line">  _<span class="token punctuation">.</span><span class="token function">bindAll</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">,</span> <span class="token string">'start'</span><span class="token punctuation">,</span> <span class="token string">'stop'</span><span class="token punctuation">,</span> <span class="token string">'reset'</span><span class="token punctuation">,</span> <span class="token string">'onTick'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// ---------------------------------------------</span></span><br><span class="highlight-line"><span class="token comment">// Inherit from EventEmitter</span></span><br><span class="highlight-line"><span class="token comment">// ---------------------------------------------</span></span><br><span class="highlight-line">util<span class="token punctuation">.</span><span class="token function">inherits</span><span class="token punctuation">(</span>Stopwatch<span class="token punctuation">,</span> events<span class="token punctuation">.</span>EventEmitter<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// ---------------------------------------------</span></span><br><span class="highlight-line"><span class="token comment">// Methods</span></span><br><span class="highlight-line"><span class="token comment">// ---------------------------------------------</span></span><br><span class="highlight-line"><span class="token class-name">Stopwatch</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">start</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Starting Stopwatch!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token comment">// note the use of _.bindAll in the constructor</span></span><br><span class="highlight-line">  <span class="token comment">// with bindAll we can pass one of our methods to</span></span><br><span class="highlight-line">  <span class="token comment">// setInterval and have it called with the proper 'this' value</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>interval <span class="token operator">=</span> <span class="token function">setInterval</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>onTick<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>second<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'start'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Stopwatch</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">stop</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Stopping Stopwatch!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>interval<span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token function">clearInterval</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>interval<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'stop'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Stopwatch</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">reset</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Resetting Stopwatch!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>time <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>hour<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'reset'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token class-name">Stopwatch</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">onTick</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> remainder <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>time<span class="token punctuation">,</span></span><br><span class="highlight-line">    numHours<span class="token punctuation">,</span></span><br><span class="highlight-line">    numMinutes<span class="token punctuation">,</span></span><br><span class="highlight-line">    numSeconds<span class="token punctuation">,</span></span><br><span class="highlight-line">    output <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>time <span class="token operator">===</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">return</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  numHours <span class="token operator">=</span> <span class="token function">String</span><span class="token punctuation">(</span><span class="token function">parseInt</span><span class="token punctuation">(</span>remainder <span class="token operator">/</span> <span class="token keyword">this</span><span class="token punctuation">.</span>hour<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  remainder <span class="token operator">-=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>hour <span class="token operator">*</span> numHours<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  numMinutes <span class="token operator">=</span> <span class="token function">String</span><span class="token punctuation">(</span><span class="token function">parseInt</span><span class="token punctuation">(</span>remainder <span class="token operator">/</span> <span class="token keyword">this</span><span class="token punctuation">.</span>minute<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  remainder <span class="token operator">-=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>minute <span class="token operator">*</span> numMinutes<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  numSeconds <span class="token operator">=</span> <span class="token function">String</span><span class="token punctuation">(</span><span class="token function">parseInt</span><span class="token punctuation">(</span>remainder <span class="token operator">/</span> <span class="token keyword">this</span><span class="token punctuation">.</span>second<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  output <span class="token operator">=</span> _<span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token punctuation">[</span>numHours<span class="token punctuation">,</span> numMinutes<span class="token punctuation">,</span> numSeconds<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">str</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>str<span class="token punctuation">.</span>length <span class="token operator">===</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      str <span class="token operator">=</span> <span class="token string">'0'</span> <span class="token operator">+</span> str<span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> str<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token string">':'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'tick'</span><span class="token punctuation">,</span> output<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>time <span class="token operator">-=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>second<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// ---------------------------------------------</span></span><br><span class="highlight-line"><span class="token comment">// Export</span></span><br><span class="highlight-line"><span class="token comment">// ---------------------------------------------</span></span><br><span class="highlight-line">module<span class="token punctuation">.</span>exports <span class="token operator">=</span> Stopwatch<span class="token punctuation">;</span></span></code></pre>
<p>And here’s how I’m using it in <code>app.js</code></p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> Stopwatch <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'./models/stopwatch'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token operator">...</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> stopwatch <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Stopwatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">stopwatch<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'tick'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">time</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'tick: '</span> <span class="token operator">+</span> time<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">stopwatch<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Running the above should give you something like this in your console:</p>
<pre><code>tick: 01:00:00
tick: 00:59:59
tick: 00:59:58
tick: 00:59:57
</code></pre>
<p>Ok that’s it for today. Tomorrow we’ll connect all this goodness to a View. If you have questions or feedback feel free to leave a comment. Thanks! - Rob</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Tired</li>
<li>Sleep: 6</li>
<li>Hunger: 4</li>
<li>Coffee: 0</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Building a Countdown Timer with Socket.io</title>
    <link href="https://robdodson.me/posts/building-a-countdown-timer-with-socket-dot-io/"/>
    <updated>2012-06-05T15:07:00+00:00</updated>
    <id>https://robdodson.me/posts/building-a-countdown-timer-with-socket-dot-io/</id>
    <content type="html"><![CDATA[
      <p>Yesterday I put together a very simple Node/Socket.io application and showed how to deploy it to Heroku. Today I’m going to keep going with that app to see if I can get the functionality that I want. The app is a basic stopwatch so that shouldn’t be too hard. If you want to catch up <a href="http://robdodson.me/blog/2012/06/04/deploying-your-first-node-dot-js-and-socket-dot-io-app-to-heroku/">checkout yesterday’s article</a> which explains setting everything up.</p>
<ul>
<li><a href="http://robdodson.me/blog/2012/06/04/deploying-your-first-node-dot-js-and-socket-dot-io-app-to-heroku/">Getting Started</a></li>
<li><a href="http://robdodson.me/blog/2012/06/06/building-a-countdown-timer-with-socket-dot-io-pt-2/">Click here for part 2.</a></li>
<li><a href="http://robdodson.me/blog/2012/06/07/building-a-countdown-timer-with-socket-dot-io-pt-3/">Click here for part 3.</a></li>
</ul>
<h3>Countdown</h3>
<p>Just to get the ball rolling I’m going to write a little code in my <code>app.js</code> file right at the bottom to setup a very crude counter.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> countdown <span class="token operator">=</span> <span class="token number">1000</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token function">setInterval</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  countdown<span class="token operator">--</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  io<span class="token punctuation">.</span>sockets<span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'timer'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>countdown<span class="token punctuation">:</span> countdown<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">1000</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">io<span class="token punctuation">.</span>sockets<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'connection'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">socket</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  socket<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'reset'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    countdown <span class="token operator">=</span> <span class="token number">1000</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    io<span class="token punctuation">.</span>sockets<span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'timer'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>countdown<span class="token punctuation">:</span> countdown<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Elsewhere in my client-side js I’m going to listen for the <code>timer</code> event and update my DOM elements.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> socket <span class="token operator">=</span> io<span class="token punctuation">.</span><span class="token function">connect</span><span class="token punctuation">(</span>window<span class="token punctuation">.</span>location<span class="token punctuation">.</span>hostname<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">socket<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'timer'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#counter'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">html</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>countdown<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#reset'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">click</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  socket<span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'reset'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>You’ll also need to update your index.ejs file so it reads like this:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>counter<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>reset<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Reset!<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">></span></span></span></code></pre>
<p>Every second we’ll decrement our countdown variable and broadcast its new value. If a client sends us a <code>reset</code> event we’ll restart the timer and immediately broadcast the update to anyone connected. I noticed that since I’m using <code>xhr-polling</code> it can sometimes take a while for the timer to show up in my browser so keep that in mind.</p>
<p>While this implementation isn’t pretty it does get us a little bit further down the road. Unfortunately I’ve been tripped up by a bunch of Node’s module issues so I have to cut tonight’s post short :\</p>
<p>Hopefully better luck tomorrow. - Rob</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Sedate, Sleepy</li>
<li>Sleep: 5</li>
<li>Hunger: 4</li>
<li>Coffee: 0</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Make Your Own jQuery Deferreds and Promises</title>
    <link href="https://robdodson.me/posts/make-your-own-jquery-deferreds-and-promises/"/>
    <updated>2012-06-04T03:33:00+00:00</updated>
    <id>https://robdodson.me/posts/make-your-own-jquery-deferreds-and-promises/</id>
    <content type="html"><![CDATA[
      <p>Last week <a href="http://robdodson.me/blog/2012/05/30/using-jquery-deferred-to-load-an-underscore-template/">I did a post on how to load an Underscore template using jQuery’s Deferred method</a>. I got some great feedback from folks and decided I should do a follow up showing how to create your own Deferreds.</p>
<h3>What’s a Deferred again…?</h3>
<p>So, quick summary time. jQuery has a neat little Object called a <code>Deferred</code> which is basically a wrapper around a function or a group of functions. Let’s say that you want to load 3 different json files via ajax and when all that’s done you want to let the rest of the world know. Using jQuery’s <code>Deferred</code> Object we can actually put a wrapper around those 3 ajax functions and fire off a callback when they’ve all finished. <a href="http://robdodson.me/blog/2012/05/30/using-jquery-deferred-to-load-an-underscore-template/">Refer back to my previous post (toward the bottom) where I explain some of these callbacks.</a></p>
<p><code>Deferred</code> isn’t limited to ajax calls, it can work in just about any environment. Let’s do an example using jQuery’s animate function. We’ll fade an item and when it’s finished animating we’ll resolve our <code>Deferred</code> object.</p>
<h3>Our First Deferred</h3>
<p>Here’s the code we’ll be using in our index.html file:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token doctype">&lt;!DOCTYPE html></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Deferred Sandbox<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>text/css<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"><br><span class="highlight-line">      <span class="token selector">#container</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token property">width</span><span class="token punctuation">:</span> 100px<span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token property">height</span><span class="token punctuation">:</span> 100px<span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token property">background</span><span class="token punctuation">:</span> #ccc<span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br>    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>jquery.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>main.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>main<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>container<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>Take note of the fact that I’ve included jquery.js and main.js in the same folder as index.html. If you run the above you should get a simple little grey square in the top left of your screen. Now let’s dive into the JavaScript.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> container <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function-variable function">initialize</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">$el</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">// Store a reference to our element</span></span><br><span class="highlight-line">    <span class="token comment">// on the page</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>$el <span class="token operator">=</span> $el<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">fadeOut</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">// Create a new Deferred.</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> dfd <span class="token operator">=</span> <span class="token keyword">new</span> $<span class="token punctuation">.</span><span class="token function">Deferred</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">animate</span><span class="token punctuation">(</span></span><br><span class="highlight-line">      <span class="token punctuation">{</span></span><br><span class="highlight-line">        opacity<span class="token punctuation">:</span> <span class="token number">0</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token number">2000</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token comment">// When we're done animating</span></span><br><span class="highlight-line">        <span class="token comment">// we'll resolve our Deferred.</span></span><br><span class="highlight-line">        <span class="token comment">// This will call any done() callbacks</span></span><br><span class="highlight-line">        <span class="token comment">// attached to either our Deferred or</span></span><br><span class="highlight-line">        <span class="token comment">// one of its promises.</span></span><br><span class="highlight-line">        dfd<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token string">'Finished fading out!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Return an immutable promise object.</span></span><br><span class="highlight-line">    <span class="token comment">// Clients can listen for its done or fail</span></span><br><span class="highlight-line">    <span class="token comment">// callbacks but they can't resolve it themselves</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> dfd<span class="token punctuation">.</span><span class="token function">promise</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token comment">// Hook the container object up to the #container div</span></span><br><span class="highlight-line">  container<span class="token punctuation">.</span><span class="token function">initialize</span><span class="token punctuation">(</span><span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#container'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Instruct the container to fade out. When we call</span></span><br><span class="highlight-line">  <span class="token comment">// fadeOut we should get a promise back as a return value</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> promise <span class="token operator">=</span> container<span class="token punctuation">.</span><span class="token function">fadeOut</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Now that we have a promise we can hook a done callback</span></span><br><span class="highlight-line">  <span class="token comment">// onto it. The done() method will fire once the promise</span></span><br><span class="highlight-line">  <span class="token comment">// is resolved.</span></span><br><span class="highlight-line">  promise<span class="token punctuation">.</span><span class="token function">done</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">message</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>That’s a fair bit of code so let’s walk through it bit by bit. We start off by creating an object called <code>container</code> which is going to wrap the <code>#container</code> div already on the page. The real guts of container happens in the <code>fadeOut</code> method:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function-variable function">fadeOut</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">// Create a new Deferred.</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> dfd <span class="token operator">=</span> <span class="token keyword">new</span> $<span class="token punctuation">.</span><span class="token function">Deferred</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">animate</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">        opacity<span class="token punctuation">:</span> <span class="token number">0</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">2000</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token comment">// When we're done animating</span></span><br><span class="highlight-line">        <span class="token comment">// we'll resolve our Deferred.</span></span><br><span class="highlight-line">        <span class="token comment">// This will call any done() callbacks</span></span><br><span class="highlight-line">        <span class="token comment">// attached to either our Deferred or</span></span><br><span class="highlight-line">        <span class="token comment">// one of its promises.</span></span><br><span class="highlight-line">        dfd<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token string">"Finished fading out!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Return an immutable promise object.</span></span><br><span class="highlight-line">    <span class="token comment">// Clients can listen for its done or fail</span></span><br><span class="highlight-line">    <span class="token comment">// callbacks but they can't resolve it themselves</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> dfd<span class="token punctuation">.</span><span class="token function">promise</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>The first thing we do is to create a new <code>Deferred</code> using jQuery’s Deferred constructor. Ignore the animation function for a moment and look at the bottom of this method. See how we’re returning <code>dfd.promise()</code>? A promise is a dynamically generated object which lets clients hook onto our <code>done</code> and <code>fail</code> callbacks but it doesn’t let them do anything to change our original <code>Deferred</code> object. A promise is an <code>immutable</code> object, meaning clients can listen to it but they can’t really do anything to change it. We want this functionality because we don’t want someone else to come along and accidentally resolve our <code>Deferred</code>. So instead of returning the <code>Deferred</code> we just created, we only return its <code>promise</code>.</p>
<p>OK back to the animation function:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">animate</span><span class="token punctuation">(</span></span><br><span class="highlight-line">  <span class="token punctuation">{</span></span><br><span class="highlight-line">    opacity<span class="token punctuation">:</span> <span class="token number">0</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token number">2000</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">// When we're done animating</span></span><br><span class="highlight-line">    <span class="token comment">// we'll resolve our Deferred.</span></span><br><span class="highlight-line">    <span class="token comment">// This will call any done() callbacks</span></span><br><span class="highlight-line">    <span class="token comment">// attached to either our Deferred or</span></span><br><span class="highlight-line">    <span class="token comment">// one of its promises.</span></span><br><span class="highlight-line">    dfd<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token string">'Finished fading out!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>If you’ve used <code>jQuery.animate</code> before this should look pretty straightforward to you. At the end of our animation we pass in an anonymouse function which will be run when the animation completes. In this function we tell our <code>Deferred</code> to resolve. Resolving the <code>Deferred</code> causes any <code>done</code> callbacks to fire. In this case we’re also passing along a little snippet of text. When you resolve a <code>Deferred</code> you can give it an optional payload object which will be passed to all the <code>done</code> callbacks. This is extremely useful if you’re using ajax to pass along the final data value. In this case we’re just going to log the message into the console:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">promise<span class="token punctuation">.</span><span class="token function">done</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">message</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>There are more cool things you can do with <code>Deferreds</code> I highly recommend you <a href="http://api.jquery.com/category/deferred-object/">spend some time with the documentation</a> and trying out some of the other methods like <code>pipe</code> or <code>resolveWith</code>. Also as a side note <a href="http://api.jquery.com/promise/">checkout this page</a> which shows how to extract a <code>promise</code> by type. It will actually let you do everything we’ve done in our animation example but with fewer lines of code.</p>
<p>Let me know if this is helpful or if you have any questions. Till tomorrow! - Rob</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Silly, Lazy</li>
<li>Sleep: 7</li>
<li>Hunger: 5</li>
<li>Coffee: 0</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>How to use EJS in Express</title>
    <link href="https://robdodson.me/posts/how-to-use-ejs-in-express/"/>
    <updated>2012-05-31T18:34:00+00:00</updated>
    <id>https://robdodson.me/posts/how-to-use-ejs-in-express/</id>
    <content type="html"><![CDATA[
      <p><em>Update: If you’re starting a fresh project with Express it’s much easier to just run <code>express --ejs</code>. That will scaffold out an Express app for you with EJS ready to go!</em></p>
<p>Here’s a quick explanation of how to use EJS instead of Jade in your Express projects. This is super easy and covered well in the documentation but I wanted to put it here since that’s what I worked on today :)</p>
<p>To start I’ll create a new project from the command line:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">express foobar</span><br><span class="highlight-line"><span class="token function">cd</span> foobar</span><br><span class="highlight-line"><span class="token function">npm</span> <span class="token function">install</span></span></code></pre>
<p>Now that I have my foobar project created I need to install <code>ejs</code>.</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token function">npm</span> <span class="token function">install</span> ejs --save</span></code></pre>
<p>If you’re within your project directory this will place ejs in the <code>node_modules</code> dir. Let’s also add it to our package.json.</p>
<pre class="language-json"><code class="language-json"><span class="highlight-line"><span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"foobar"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"version"</span><span class="token operator">:</span> <span class="token string">"0.0.1"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"private"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token property">"dependencies"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token property">"express"</span><span class="token operator">:</span> <span class="token string">"~2.5.8"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token property">"ejs"</span><span class="token operator">:</span> <span class="token string">"~0.7.1"</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>The tilde operator means that we require ejs verion 0.7.1 or greater but only up to the next major release. So the following are equivalent: <code>&quot;~1.2&quot; = &quot;&gt;=1.2.0 &lt;2.0.0&quot;</code>. For a deeper explanation of package.json and NPM in general <a href="http://howtonode.org/introduction-to-npm">checkout this great post</a>.</p>
<h3>Leaving Jade for EJS</h3>
<p>If you’re using the boilerplate that Express generates then it should be setup to use Jade as the rendering engine for its views. I think that Jade is cool but I need to baby step into Node/Express and make sure I understand everything that’s going on instead of trying to consume so many different tools at once. With this in mind I decided to switch from Jade to EJS at least in the beginning because the syntax has no learning curve. To change your rendering engine you’ll need to either add or edit the following call:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">app<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">'view engine'</span><span class="token punctuation">,</span> <span class="token string">'ejs'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>The boilerplate should have this set to <code>jade</code> inside of a configuration block. Once we’ve changed that line to read <code>ejs</code> we’re ready to start writing some views.</p>
<h3>Setting up your layout</h3>
<p>By default Express’ boilerplate will look for a file named layout in our views directory. Let’s write one called <code>layout.ejs</code>:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token doctype">&lt;!DOCTYPE html></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Pivotal Search<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>description<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>author<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- HTML5 shim, for IE6-8 support of HTML elements --></span></span><br>    <span class="token comment">&lt;!--[if lt IE 9]><br><span class="highlight-line">      &lt;script src="http://html5shim.googlecode.com/svn/trunk/html5.js">&lt;/script></span><br>    &lt;![endif]--></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- styles --></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stylesheets/style.css<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    &lt;%- body %></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>This is all really straightforward with the exception of the <code>&lt;%- body %&gt;</code> line which basically works like a <code>yield</code> in erb. Whatever template we pass to Express’ <code>response.render()</code> function will fill this dependency, here’s an example:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">app<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  res<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token string">'index'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>title<span class="token punctuation">:</span> <span class="token string">'The index page!'</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>title<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>&lt;%= title %><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span></code></pre>
<p><img src="/images/2014/12/rendering_the_index_template.png" alt="Rendering the index template"></p>
<p>Furthermore we can use partials with Express and EJS like so:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token doctype">&lt;!DOCTYPE html></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Pivotal Search<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>description<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>author<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- HTML5 shim, for IE6-8 support of HTML elements --></span></span><br>    <span class="token comment">&lt;!--[if lt IE 9]><br><span class="highlight-line">      &lt;script src="http://html5shim.googlecode.com/svn/trunk/html5.js">&lt;/script></span><br>    &lt;![endif]--></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- styles --></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stylesheets/style.css<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    &lt;%- partial('header.ejs') %> &lt;%- body %></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>header</span><span class="token punctuation">></span></span>My awesome header!<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>header</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>hr</span> <span class="token punctuation">/></span></span></span></code></pre>
<p><img src="/images/2014/12/rendering_the_header_partial.png" alt="Rendering the header partial"></p>
<p>And there ya go! Simple but hopefully useful if you’re just getting started like I am :) - Rob</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Eager, Alert</li>
<li>Sleep: 7</li>
<li>Hunger: 7</li>
<li>Coffee: 0</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Using jQuery Deferred to Load an Underscore Template</title>
    <link href="https://robdodson.me/posts/using-jquery-deferred-to-load-an-underscore-template/"/>
    <updated>2012-05-30T15:53:00+00:00</updated>
    <id>https://robdodson.me/posts/using-jquery-deferred-to-load-an-underscore-template/</id>
    <content type="html"><![CDATA[
      <p>Today’s post is meant to scratch an itch I had the other day regarding templates. My friend wanted to load an underscore template along with some JSON data but wasn’t sure what the best approach would be.</p>
<p>Since I’m using Backbone Boilerplate I’ve gotten used to having my template loading method already stubbed out for me. Here’s the one they use:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function-variable function">fetchTemplate</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">path<span class="token punctuation">,</span> done</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> <span class="token constant">JST</span> <span class="token operator">=</span> window<span class="token punctuation">.</span><span class="token constant">JST</span> <span class="token operator">=</span> window<span class="token punctuation">.</span><span class="token constant">JST</span> <span class="token operator">||</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> def <span class="token operator">=</span> <span class="token keyword">new</span> $<span class="token punctuation">.</span><span class="token function">Deferred</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Should be an instant synchronous way of getting the template, if it</span></span><br><span class="highlight-line">  <span class="token comment">// exists in the JST object.</span></span><br><span class="highlight-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">JST</span><span class="token punctuation">[</span>path<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>_<span class="token punctuation">.</span><span class="token function">isFunction</span><span class="token punctuation">(</span>done<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token function">done</span><span class="token punctuation">(</span><span class="token constant">JST</span><span class="token punctuation">[</span>path<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token keyword">return</span> def<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token constant">JST</span><span class="token punctuation">[</span>path<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Fetch it asynchronously if not available from JST, ensure that</span></span><br><span class="highlight-line">  <span class="token comment">// template requests are never cached and prevent global ajax event</span></span><br><span class="highlight-line">  <span class="token comment">// handlers from firing.</span></span><br><span class="highlight-line">  $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    url<span class="token punctuation">:</span> path<span class="token punctuation">,</span></span><br><span class="highlight-line">    type<span class="token punctuation">:</span> <span class="token string">"get"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    dataType<span class="token punctuation">:</span> <span class="token string">"text"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    cache<span class="token punctuation">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    global<span class="token punctuation">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token function-variable function">success</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">contents</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token constant">JST</span><span class="token punctuation">[</span>path<span class="token punctuation">]</span> <span class="token operator">=</span> _<span class="token punctuation">.</span><span class="token function">template</span><span class="token punctuation">(</span>contents<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token comment">// Set the global JST cache and return the template</span></span><br><span class="highlight-line">      <span class="token keyword">if</span> <span class="token punctuation">(</span>_<span class="token punctuation">.</span><span class="token function">isFunction</span><span class="token punctuation">(</span>done<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token function">done</span><span class="token punctuation">(</span><span class="token constant">JST</span><span class="token punctuation">[</span>path<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token comment">// Resolve the template deferred</span></span><br><span class="highlight-line">      def<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token constant">JST</span><span class="token punctuation">[</span>path<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Ensure a normalized return value (Promise)</span></span><br><span class="highlight-line">  <span class="token keyword">return</span> def<span class="token punctuation">.</span><span class="token function">promise</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>Not having previous experience working with <a href="http://api.jquery.com/category/deferred-object/">jQuery.Deferred</a> I was initially put-off by the idea of just copy/pasting this function over to him, especially since I couldn’t explain what was going on. I knew that I probably wanted to use Deferreds and Promises but I wasn’t sure how best to explain the concepts nor did this method seem to do much in the way of loading JSON, it was just for loading templates. Since my friend only wanted to load 1 template and 1 JSON file I thought it best for us to start small, and to write something that we could easily debug. Knowing I wanted to use Deferreds I found <a href="http://msdn.microsoft.com/en-us/magazine/gg723713.aspx">this wonderful article by Addy Osmani and Julian Aubourg</a> detailing how Deferreds work. It is VERY comprehensive and for our purposes I only needed to read the first few paragraphs before I had enough to start.</p>
<p>In a nutshell deferreds are objects which contain promises (also objects). Promises can be in various states, <code>pending</code>, <code>resolved</code> or <code>rejected</code>. Once you have a deferred (or it’s promise) you can hook functions on to it so when it changes from a <code>pending</code> to <code>resolved</code> state all those functions fire. It’s actually the promise that changes state but you can use the deferred like a promise because in most cases it will just proxy the calls to its promise object. Using deferreds can be nice for several reasons. For starters, you can avoid the jQuery <em>pyramid of doom</em></p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// NOOOOOOoooooooooo</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">$<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  url<span class="token punctuation">:</span> <span class="token string">'foo.php'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">success</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">      url<span class="token punctuation">:</span> <span class="token string">'bar.php'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token function-variable function">success</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">          url<span class="token punctuation">:</span> <span class="token string">'baz.php'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">          <span class="token function-variable function">success</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">            <span class="token operator">...</span></span><br><span class="highlight-line">          <span class="token punctuation">}</span></span><br><span class="highlight-line">        <span class="token punctuation">}</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span></span></code></pre>
<p>Secondly your deferreds/promises are little tokens that you can hand out from your services so other actors don’t have to get all up in your ajax guts. Someone makes an API request, you give em a token, when it resolves they play with the data.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">doSomethingWithHugeData</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"man, look at all these 1's and 0's!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> dfd <span class="token operator">=</span> myService<span class="token punctuation">.</span><span class="token function">getSomeHugeData</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">dfd<span class="token punctuation">.</span><span class="token function">done</span><span class="token punctuation">(</span>doSomethingWithHugeData<span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>This is a much nicer approach than passing in a callback that your service will need to execute whenever it finishes getting its data. Your service shouldn’t care about your callbacks. It should care about getting data and letting people know when that data’s been got! :D</p>
<h3>But I digress…</h3>
<p>We were <em>trying</em> to load some JSON and a template, so let’s get back to the task at hand. Since we know that we have two ajax calls, one for the JSON and one for the template, and we know that we don’t really want to do anything till both of these calls have completed we’ve got a perfect use case for <a href="http://api.jquery.com/jQuery.when/">$.when</a>. <code>when</code> accepts a list of deferreds/promises and acts as one big deferred, waiting for all of its children to resolve before it resolves. This is a nice way to build a sequencer. In our case we’re going to take two ajax calls and toss them into <code>$.when</code>. When it resolves we’ll use <code>$.then</code> to tell it what our success and failure callbacks should be.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token doctype">&lt;!DOCTYPE html></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Deferred Sandbox<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>jquery.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>underscore.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>main<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">      <span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token keyword">function</span> <span class="token function">successFunc</span><span class="token punctuation">(</span><span class="token parameter">jsonRes<span class="token punctuation">,</span> templateRes</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">          <span class="token keyword">var</span> json <span class="token operator">=</span> _<span class="token punctuation">.</span><span class="token function">first</span><span class="token punctuation">(</span>jsonRes<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">          <span class="token keyword">var</span> template <span class="token operator">=</span> _<span class="token punctuation">.</span><span class="token function">first</span><span class="token punctuation">(</span>templateRes<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">          <span class="token keyword">var</span> compiled <span class="token operator">=</span> _<span class="token punctuation">.</span><span class="token function">template</span><span class="token punctuation">(</span>template<span class="token punctuation">,</span> json<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">          <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#main'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">html</span><span class="token punctuation">(</span>compiled<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">        <span class="token keyword">function</span> <span class="token function">failureFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">          console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'fail whale!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">        $<span class="token punctuation">.</span><span class="token function">when</span><span class="token punctuation">(</span>$<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token string">'person.json'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token string">'person.template.html'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span></span><br><span class="highlight-line">          successFunc<span class="token punctuation">,</span></span><br><span class="highlight-line">          failureFunc</span><br><span class="highlight-line">        <span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br>    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>In our case everything is in the same folder as index.html so there’s no need for any paths. Keep in mind that in most (all?) browsers you’ll need to be running a local server for the above code to actually work. In Chrome, at least, you can’t run an html file from file:// and have it load external resources, it’ll complain that the access-origin is not allowed.</p>
<p>Let me take a moment to explain <code>$.then</code> a little bit. We know that <code>$.ajax</code> returns a deferred, and that the deferred’s promise can be in three states: <code>pending</code>, <code>resolved</code>, <code>rejected</code>. So if we did something like this:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> dfd <span class="token operator">=</span> $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token string">'foobar.php'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p><code>dfd</code> would be a deferred object with a <code>pending</code> promise. Deferred’s let us link methods up to them for when their state changes. These methods are: <code>done()</code>, <code>fail()</code>, <code>always()</code>, <code>progress()</code>, and <code>then()</code>. There are more but <a href="http://api.jquery.com/category/deferred-object/">I’ll let the documentation explain them.</a><code>done()</code> and <code>fail()</code> each accept either a single callback or an array of callbacks to be fired when the deferred changes to either the <code>resolved</code> or <code>rejected</code> state.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">successFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'success! do stuff with data!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">function</span> <span class="token function">failureFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'failure! um...give up!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> service <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function-variable function">getJSON</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token string">'person.json'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">service</span><br><span class="highlight-line">  <span class="token punctuation">.</span><span class="token function">getJSON</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><br><span class="highlight-line">  <span class="token punctuation">.</span><span class="token function">done</span><span class="token punctuation">(</span>successFunc<span class="token punctuation">)</span></span><br><span class="highlight-line">  <span class="token punctuation">.</span><span class="token function">fail</span><span class="token punctuation">(</span>failureFunc<span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p><code>always()</code> fires its callbacks regardless of whether the deferred was <code>resolved</code> or <code>rejected</code>. This might be a good place to put any cleanup code. <code>progress()</code> is fired during any progress events that the process might emit. Finally there’s <code>then()</code> which is what we’re using in our template example. <code>then()</code> is essentially shorthand for <code>done()</code> and <code>fail()</code> so you can pass it two callbacks or two arrays of success/fail callbacks.</p>
<p>Hopefully that’s helpful for you all and you can go back and clean up some of those pyramids that might be lingering in your code. Till tomorrow! - Rob</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Reserved, Sedate</li>
<li>Sleep: 7</li>
<li>Hunger: 4</li>
<li>Coffee: 0</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Testing AMD Backbone Modules</title>
    <link href="https://robdodson.me/posts/testing-backbone-modules/"/>
    <updated>2012-05-29T15:03:00+00:00</updated>
    <id>https://robdodson.me/posts/testing-backbone-modules/</id>
    <content type="html"><![CDATA[
      <p>Continuing from <a href="http://robdodson.me/blog/2012/05/28/mocking-requests-with-mocha-chai-and-sinon/">yesterday’s post</a> I’m going to start to incorporate Backbone into my BDD setup. I’m going to use the <a href="https://github.com/tbranyen/backbone-boilerplate">Backbone Boilerplate</a> and <a href="https://github.com/backbone-boilerplate/grunt-bbb">grunt-bbb</a> to setup a new project. If you’re new to the boilerplate or grunt-bbb <a href="http://robdodson.me/blog/2012/05/17/getting-familiar-with-backbone-boilerplate/">checkout my previous post on getting started.</a></p>
<h3>Shiny and new</h3>
<p>I’ve created a new directory called <code>amd-tests</code> and once I <code>cd</code> inside I run <code>bbb init</code> to template out a new project. By default the boilerplate uses Require.js and AMD modules and we have a little example one already created for us. It’s called, well, Example :) We’ll use this to create our model for testing since I know that everyone should be on the same page with this module.</p>
<p>I’m going to change our model’s name from Example.Model to Example.Photo so our terminalogy won’t get muddy. We’ll give it some default properties for <code>src</code> and <code>caption</code>. Later on we’ll test that a freshly created model has these same defaults. When we’re done setting up our <code>/app/example.js</code> file should look like this. Keep in mind that the boilerplate adds a lot of stuff to get us started so you can ignore everything that isn’t Example.Photo</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">define</span><span class="token punctuation">(</span><span class="token punctuation">[</span></span><br><span class="highlight-line">  <span class="token string">'namespace'</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Libs</span></span><br><span class="highlight-line">  <span class="token string">'use!backbone'</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Modules</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Plugins</span></span><br><span class="highlight-line"><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">namespace<span class="token punctuation">,</span> Backbone</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token comment">// Create a new module</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> Example <span class="token operator">=</span> namespace<span class="token punctuation">.</span><span class="token function">module</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// !!! Our awesome new model !!!</span></span><br><span class="highlight-line">  Example<span class="token punctuation">.</span>Photo <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>Model<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    defaults<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      src<span class="token punctuation">:</span> <span class="token string">'/images/placeholder.jpg'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      caption<span class="token punctuation">:</span> <span class="token string">'Waiting for content...'</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  Example<span class="token punctuation">.</span>Collection <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>Collection<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">/* ... */</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  Example<span class="token punctuation">.</span>Router <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>Router<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">/* ... */</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// This will fetch the tutorial template and render it.</span></span><br><span class="highlight-line">  Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Tutorial <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>View<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    template<span class="token punctuation">:</span> <span class="token string">'app/templates/example.html'</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token function-variable function">render</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">done</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">var</span> view <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token comment">// Fetch the template, render it to the View element and call done.</span></span><br><span class="highlight-line">      namespace<span class="token punctuation">.</span><span class="token function">fetchTemplate</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>template<span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">tmpl</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        view<span class="token punctuation">.</span>el<span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> <span class="token function">tmpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">        <span class="token comment">// If a done function is passed, call it with the element</span></span><br><span class="highlight-line">        <span class="token keyword">if</span> <span class="token punctuation">(</span>_<span class="token punctuation">.</span><span class="token function">isFunction</span><span class="token punctuation">(</span>done<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">          <span class="token function">done</span><span class="token punctuation">(</span>view<span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token punctuation">}</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Required, return the module for AMD compliance</span></span><br><span class="highlight-line">  <span class="token keyword">return</span> Example<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Now comes the rather tricky part. We need to create a test runner HTML file that can incorporate mocha, chai and sinon. It also has to load our Example module and maintain all of that module’s dependencies. I spent a <em>ton</em> of time on IRC today sorting this out so here is my current best stab at things based on some <a href="https://gist.github.com/2655876">VERY generous gists</a> from <a href="https://github.com/kmiyashiro">Kelly Miyashiro.</a></p>
<p>Let’s start with the index.html file that’ll be our test runner:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Mocha Tests<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>mocha/mocha.css<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>../assets/js/libs/require.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>mocha/mocha.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>sinon/sinon.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>config.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">      <span class="token function">require</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'../test/test.example'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> runMocha<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br>    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>mocha<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>The first thing we do is add require.js, then mocha and sinon. Why no Chai? Good question. Kelly didn’t do it so I didn’t do it. If anyone wants to cite the pros and cons of this approach I’m all ears. Next we add our own config.js that is specific to our tests. We might have a config.js somewhere else that runs our main app but we’ll also need this one to run our tests. Finally we have a script block sitting on top of our <code>#mocha</code> div. The script block loads in our specs (in this case I’ve only written one but you can do multiple specs here). A final argument to the require call is <code>runMocha</code>. Essentially this is the function that is executed <em>AFTER</em> the modules have finished loading. In our case runMocha is located inside the new config.js we’ve defined just for our tests. Let’s take a look at it now.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">require<span class="token punctuation">.</span><span class="token function">config</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token comment">// Base URL relative to the test runner</span></span><br><span class="highlight-line">  <span class="token comment">// Paths are relative to this</span></span><br><span class="highlight-line">  baseUrl<span class="token punctuation">:</span> <span class="token string">'../app'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  paths<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">// Testing libs</span></span><br><span class="highlight-line">    chai<span class="token punctuation">:</span> <span class="token string">'../test/chai/chai'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    common<span class="token punctuation">:</span> <span class="token string">'../test/common'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    jquery<span class="token punctuation">:</span> <span class="token string">'../assets/js/libs/jquery'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    underscore<span class="token punctuation">:</span> <span class="token string">'../assets/js/libs/underscore'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    backbone<span class="token punctuation">:</span> <span class="token string">'../assets/js/libs/backbone'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    use<span class="token punctuation">:</span> <span class="token string">'../assets/js/plugins/use'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  use<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    backbone<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      deps<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'use!underscore'</span><span class="token punctuation">,</span> <span class="token string">'jquery'</span><span class="token punctuation">]</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      attach<span class="token punctuation">:</span> <span class="token string">'Backbone'</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    underscore<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      attach<span class="token punctuation">:</span> <span class="token string">'_'</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    mocha<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      attach<span class="token punctuation">:</span> <span class="token string">'mocha'</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  priority<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'jquery'</span><span class="token punctuation">,</span> <span class="token string">'underscore'</span><span class="token punctuation">,</span> <span class="token string">'common'</span><span class="token punctuation">]</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">mocha<span class="token punctuation">.</span><span class="token function">setup</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  ui<span class="token punctuation">:</span> <span class="token string">'bdd'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  ignoreLeaks<span class="token punctuation">:</span> <span class="token boolean">true</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// Protect from barfs</span></span><br><span class="highlight-line">console <span class="token operator">=</span> window<span class="token punctuation">.</span>console <span class="token operator">||</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> <span class="token function-variable function">runMocha</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  mocha<span class="token punctuation">.</span><span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>Lots of stuff here but nothing to get alarmed about. <a href="http://robdodson.me/blog/2012/05/17/getting-familiar-with-backbone-boilerplate/">If you’ve read my previous getting started post you’ll know all about the config.js file.</a> Go back and read the previous post if none of this makes sense to you. The thing to take note of is the <code>priority</code> array and the <code>runMocha</code> function at the bottom of the page. I don’t have much experience with the priority array and I didn’t find much documentation on it but Kelly uses it <a href="https://gist.github.com/2655876">in the gists</a> to make sure that jQuery, chai and any chai plugins are properly setup on the page.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// Include and setup all the stuff for testing</span></span><br><span class="highlight-line"><span class="token function">define</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">require</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  window<span class="token punctuation">.</span>$ <span class="token operator">=</span> window<span class="token punctuation">.</span>jQuery <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'jquery'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  window<span class="token punctuation">.</span>chai <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'chai'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  window<span class="token punctuation">.</span>expect <span class="token operator">=</span> chai<span class="token punctuation">.</span>expect<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Good practice? Bad practice? I’m not sure and I would love comments if anyone has a take on things. Underneath the priority array is a setup function which sends some configuration parameters to mocha. <code>ignoreLeaks</code> is useful because it’s easy for mocha to see jQuery or any other global variable as a good reason to abort a test. IMO that’s what JSLint/Hint is for, and bailing everytime you see a global is going to make testing 3rd party code especially difficult. My advice, leave it off. Finally we call <code>mocha.run()</code> via the <code>runMocha</code> function. Remember that this function is executed inside our test runner after all the specs are loaded, like so:</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">  <span class="token function">require</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'../test/test.example'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> runMocha<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre>
<p>Doing it this way guarantees that all the dependencies our module needs will be loaded before we start running our tests.</p>
<h3>Oh right, the tests!</h3>
<p>Wow! OK so hopefully you’re still with me because after all of that we <em>still</em> need to generate some tests. Since it’s getting late I’m just going to put together a really simple spec to make sure our default values are being set on the model.</p>
<p>I’ve created a file called <code>test.example.js</code> which will test our <code>Example</code> module.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">define</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">require</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> Example <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'modules/example'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'Example'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'Photo'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">var</span> photo <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Photo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should have proper defaults'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">done</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token function">expect</span><span class="token punctuation">(</span>photo<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'src'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span><span class="token function">equal</span><span class="token punctuation">(</span><span class="token string">'/images/placeholder.jpg'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token function">expect</span><span class="token punctuation">(</span>photo<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'caption'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span><span class="token function">equal</span><span class="token punctuation">(</span><span class="token string">'Waiting for content...'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>It isn’t amazing but it gets us started testing our module. I’m explicitly calling <code>done()</code> at the end of our test because I saw mention on StackOverflow that you should do this when testing AMD modules in the browser with mocha otherwise you can get false passing tests. Not sure if it’s absolutely necessary but I guess better safe than sorry!</p>
<p>At this point I’m exhausted and hopefully you have a decent head start on your tests. I know that this post jumps around a lot so please take a moment <a href="https://github.com/robdodson/backbone-boilerplate-mocha">to grab the repo I’ve posted which contains all the source code.</a> Again. Caveat. I’m learning along with you so there are lots of newbie mistakes being made, I’m sure. I really want to hear your feedback if you have any. Good luck!</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here</a></p>
<ul>
<li>Mood: Awake, Antsy</li>
<li>Sleep: 6</li>
<li>Hunger: 3</li>
<li>Coffee: 0</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Mocking Requests with Mocha, Chai and Sinon</title>
    <link href="https://robdodson.me/posts/mocking-requests-with-mocha-chai-and-sinon/"/>
    <updated>2012-05-28T18:20:00+00:00</updated>
    <id>https://robdodson.me/posts/mocking-requests-with-mocha-chai-and-sinon/</id>
    <content type="html"><![CDATA[
      <p><a href="http://robdodson.me/blog/2012/05/27/testing-backbone-boilerplate-with-mocha-and-chai/">After a bit of a rocky start yesterday</a> I’ve finally got Mocha and Chai running in the browser which is great. Today I’d like to test out some of the async functionality of Mocha. This seems to be the big selling point for most people so we’ll kick the tires a bit.</p>
<h3>Basic Async Tests with Mocha and Chai</h3>
<p>I wrote a little Node service that we’ll consume for testing purposes. This is my first <a href="http://nodejs.org/">Node</a> and <a href="http://expressjs.com/">Express</a> app so apologies if it’s lamesauce. I used the <code>express</code> command to boilerplate a project called <code>pickles</code> with some very basic routes:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// Routes</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> count <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">app<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string">'Welcome to the Pickle Store!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">app<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/pickles'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  res<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    count<span class="token punctuation">:</span> count<span class="token punctuation">,</span></span><br><span class="highlight-line">    message<span class="token punctuation">:</span> <span class="token string">'oh boy, '</span> <span class="token operator">+</span> count <span class="token operator">+</span> <span class="token string">' pickles!'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">app<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/pickles/add/:num'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  count <span class="token operator">+=</span> <span class="token function">parseInt</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>params<span class="token punctuation">.</span>num<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  res<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    add<span class="token punctuation">:</span> req<span class="token punctuation">.</span>params<span class="token punctuation">.</span>num<span class="token punctuation">,</span></span><br><span class="highlight-line">    message<span class="token punctuation">:</span> <span class="token string">'you added '</span> <span class="token operator">+</span> req<span class="token punctuation">.</span>params<span class="token punctuation">.</span>num <span class="token operator">+</span> <span class="token string">' pickles to the pickle barrel!'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">app<span class="token punctuation">.</span><span class="token function">listen</span><span class="token punctuation">(</span><span class="token number">3000</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span></span><br><span class="highlight-line">    <span class="token string">'Express server listening on port %d in %s mode'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    app<span class="token punctuation">.</span><span class="token function">address</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>port<span class="token punctuation">,</span></span><br><span class="highlight-line">    app<span class="token punctuation">.</span>settings<span class="token punctuation">.</span>env</span><br><span class="highlight-line">  <span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>We’ll need to make sure our node service is running for our tests to work and all of our URLs will point at localhost:3000. Obviously you wouldn’t want this for a production setting but it’ll be fine for demonstration purposes.</p>
<p>Here is our really simple Mocha spec. We’re actually creating a <code>pickelStore</code> object in the spec file itself so we can test against it.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> expect <span class="token operator">=</span> chai<span class="token punctuation">.</span>expect<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> pickleStore <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function-variable function">pickles</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">      url<span class="token punctuation">:</span> <span class="token string">'http://localhost:3000/pickles'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      dataType<span class="token punctuation">:</span> <span class="token string">'json'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token function-variable function">success</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">add</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">num</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">      url<span class="token punctuation">:</span> <span class="token string">'http://localhost:3000/pickles/add/'</span> <span class="token operator">+</span> num<span class="token punctuation">,</span></span><br><span class="highlight-line">      dataType<span class="token punctuation">:</span> <span class="token string">'json'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token function-variable function">success</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'Pickle Store'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'#pickles'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    pickleStore<span class="token punctuation">.</span><span class="token function">pickles</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>I just want to see if the ajax methods will run and hit our Node service but I’m running into the following issue in Chrome:</p>
<pre><code>XMLHttpRequest cannot load http://localhost:3000/pickles. Origin null is not allowed by Access-Control-Allow-Origin.
</code></pre>
<p>Bummer… :(</p>
<p>OK, what’s going on here… To StackOverflow! <a href="http://stackoverflow.com/questions/8456538/origin-null-is-not-allowed-by-access-control-allow-origin/8456586#8456586">Aaaand we have our response.</a> After a bit of googling I came across <a href="http://www.stoimen.com/blog/2010/11/19/diving-into-node-js-very-first-app/">this post</a> which mentions adding <code>res.header('Access-Control-Allow-Origin', '*');</code> to my Node responses. That does the trick. I also found <a href="http://www.stoimen.com/blog/2010/11/19/diving-into-node-js-very-first-app/">this post</a> which describes setting up <a href="https://developer.mozilla.org/en/http_access_control">CORS</a> with Express.</p>
<p>OK hopefully we’re done with Node for now. I don’t want this to turn into a node tutorial… Let’s see if we can get the tests to perform using Mocha. We’ll need some way to mock and spy on the ajax because I don’t want to test the data coming from the actual service. I’ve realized I want to <em>simulate</em> the service for client-side Mocha tests. In a future tutorial I’ll test the service itself using the Node aspect of Mocha. Kind of silly to lead off this way but whatever, moving on!</p>
<h3>Enter Sinon.js</h3>
<p>I’m going to use <a href="http://sinonjs.org/">Sinon.js</a> to help me mock, stub, fake, spy and do whatever the heck else I need to make sure my client code is solid. After downloading the js file for Sinon you can just add it to our test/index.html under the line where we added mocha.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Mocha Tests<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>mocha/mocha.css<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>../assets/js/libs/jquery.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>chai/chai.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>mocha/mocha.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>sinon/sinon.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">      mocha<span class="token punctuation">.</span><span class="token function">setup</span><span class="token punctuation">(</span><span class="token string">'bdd'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br>    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>test.pickles.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">      <span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        mocha<span class="token punctuation">.</span><span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br>    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>mocha<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>Now we can use Sinon in our <code>test.pickles.js</code> file to get a handled on our ajax. Let’s first test that an ajax call is made when we run the <code>pickles()</code> method of the <code>pickleStore</code> object. We’ll make sure this first test fails, then we’ll change the spec to make it pass.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> expect <span class="token operator">=</span> chai<span class="token punctuation">.</span>expect<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> pickleStore <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function-variable function">pickles</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">      url<span class="token punctuation">:</span> <span class="token string">'http://localhost:3000/pickles'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      dataType<span class="token punctuation">:</span> <span class="token string">'json'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token function-variable function">success</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">add</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">num</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">      url<span class="token punctuation">:</span> <span class="token string">'http://localhost:3000/pickles/add/'</span> <span class="token operator">+</span> num<span class="token punctuation">,</span></span><br><span class="highlight-line">      dataType<span class="token punctuation">:</span> <span class="token string">'json'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token function-variable function">success</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'Pickle Store'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'#pickles'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">// Use Sinon to replace jQuery's ajax method</span></span><br><span class="highlight-line">    <span class="token comment">// with a spy.</span></span><br><span class="highlight-line">    <span class="token function">beforeEach</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      sinon<span class="token punctuation">.</span><span class="token function">spy</span><span class="token punctuation">(</span>$<span class="token punctuation">,</span> <span class="token string">'ajax'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Restor jQuery's ajax method to its</span></span><br><span class="highlight-line">    <span class="token comment">// original state</span></span><br><span class="highlight-line">    <span class="token function">afterEach</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      $<span class="token punctuation">.</span>ajax<span class="token punctuation">.</span><span class="token function">restore</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should make an ajax call'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">done</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      pickleStore<span class="token punctuation">.</span><span class="token function">pickles</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token function">expect</span><span class="token punctuation">(</span>$<span class="token punctuation">.</span>ajax<span class="token punctuation">.</span>calledOnce<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span>be<span class="token punctuation">.</span><span class="token boolean">false</span><span class="token punctuation">;</span> <span class="token comment">// see if the spy WASN'T called</span></span><br><span class="highlight-line">      <span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// let Mocha know we're done async testing</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p><img src="/images/2014/12/first_failing_ajax_test.png" alt="Our first failing test with Mocha, Chai and Sinon. Yay!"></p>
<p>Changing this line <code>expect($.ajax.calledOnce).to.be.false;</code> from <code>false</code> to <code>true</code> should make our test pass. Yay, first async test in the bag! Next let’s try to fake a response from the server. But I’m realizing that the succesful server response should <em>do</em> something to my pickleStore object, otherwise why do I care about the data? So I’m going to update pickelStore with the following success callback on its pickles method:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> pickleStore <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  count<span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  status<span class="token punctuation">:</span> <span class="token string">''</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">pickles</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> self <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">      url<span class="token punctuation">:</span> <span class="token string">'http://localhost:3000/pickles'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      dataType<span class="token punctuation">:</span> <span class="token string">'json'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token function-variable function">success</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        self<span class="token punctuation">.</span>count <span class="token operator">=</span> <span class="token function">parseInt</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>count<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        self<span class="token punctuation">.</span>status <span class="token operator">=</span> data<span class="token punctuation">.</span>status<span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">add</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">num</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">      url<span class="token punctuation">:</span> <span class="token string">'http://localhost:3000/pickles/add/'</span> <span class="token operator">+</span> num<span class="token punctuation">,</span></span><br><span class="highlight-line">      dataType<span class="token punctuation">:</span> <span class="token string">'json'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token function-variable function">success</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>Now we can test what happens after the server sends a succesful response. But how do we get that response and how do we force the success callback? For that we’ll need to use Sinon’s <code>stub.yieldsTo</code> method. It’s mentioned in <a href="http://sinonjs.org/docs/#stubs">the docs on this page</a> if you scroll down. <code>yieldsTo</code> lets us direct the path of our spy so it will not only pretend to be jQuery’s <code>ajax</code> method, but it will also force itself into the <code>success</code> callback with an optional hash of parameters which simulate our service response. Sweet! We’ll have to revise the <code>beforeEach</code> in our spec though otherwise Sinon will complain that we’re wrapping <code>ajax</code> twice. The updated spec should look like this. Again, take note that we’re going to make it fail first by expecting a count of 99 pickles instead of 100.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'Pickle Store'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'#pickles'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">// Use Sinon to replace jQuery's ajax method</span></span><br><span class="highlight-line">    <span class="token comment">// with a spy. This spy will also come with</span></span><br><span class="highlight-line">    <span class="token comment">// some success data.</span></span><br><span class="highlight-line">    <span class="token function">beforeEach</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      sinon<span class="token punctuation">.</span><span class="token function">stub</span><span class="token punctuation">(</span>$<span class="token punctuation">,</span> <span class="token string">'ajax'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">yieldsTo</span><span class="token punctuation">(</span><span class="token string">'success'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        count<span class="token punctuation">:</span> <span class="token string">'100'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">        message<span class="token punctuation">:</span> <span class="token string">'oh boy, 100 pickles!'</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Restor jQuery's ajax method to its</span></span><br><span class="highlight-line">    <span class="token comment">// original state</span></span><br><span class="highlight-line">    <span class="token function">afterEach</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      $<span class="token punctuation">.</span>ajax<span class="token punctuation">.</span><span class="token function">restore</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should make an ajax call'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">done</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      pickleStore<span class="token punctuation">.</span><span class="token function">pickles</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token function">expect</span><span class="token punctuation">(</span>$<span class="token punctuation">.</span>ajax<span class="token punctuation">.</span>calledOnce<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span>be<span class="token punctuation">.</span><span class="token boolean">true</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should update the count'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">done</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      pickleStore<span class="token punctuation">.</span><span class="token function">pickles</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token function">expect</span><span class="token punctuation">(</span>pickleStore<span class="token punctuation">.</span>count<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span><span class="token function">equal</span><span class="token punctuation">(</span><span class="token number">99</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Failing as expected. Aaaaand we change the expected count to 100, voila! Passing tests again!</p>
<p><img src="/images/2014/12/passing_yield_test.png" alt="Passing test with Sinon's yieldTo"></p>
<p>I’m adding the test for the status update as well so our final <code>#pickles</code> spec should look like this:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'Pickle Store'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'#pickles'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">// Use Sinon to replace jQuery's ajax method</span></span><br><span class="highlight-line">    <span class="token comment">// with a spy. This spy will also come with</span></span><br><span class="highlight-line">    <span class="token comment">// some success data.</span></span><br><span class="highlight-line">    <span class="token function">beforeEach</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      sinon<span class="token punctuation">.</span><span class="token function">stub</span><span class="token punctuation">(</span>$<span class="token punctuation">,</span> <span class="token string">'ajax'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">yieldsTo</span><span class="token punctuation">(</span><span class="token string">'success'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        count<span class="token punctuation">:</span> <span class="token string">'100'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">        message<span class="token punctuation">:</span> <span class="token string">'oh boy, 100 pickles!'</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Restor jQuery's ajax method to its</span></span><br><span class="highlight-line">    <span class="token comment">// original state</span></span><br><span class="highlight-line">    <span class="token function">afterEach</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      $<span class="token punctuation">.</span>ajax<span class="token punctuation">.</span><span class="token function">restore</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should make an ajax call'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">done</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      pickleStore<span class="token punctuation">.</span><span class="token function">pickles</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token function">expect</span><span class="token punctuation">(</span>$<span class="token punctuation">.</span>ajax<span class="token punctuation">.</span>calledOnce<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span>be<span class="token punctuation">.</span><span class="token boolean">true</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should update the count'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">done</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      pickleStore<span class="token punctuation">.</span><span class="token function">pickles</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token function">expect</span><span class="token punctuation">(</span>pickleStore<span class="token punctuation">.</span>count<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span><span class="token function">equal</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should update the status'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">done</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      pickleStore<span class="token punctuation">.</span><span class="token function">pickles</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token function">expect</span><span class="token punctuation">(</span>pickleStore<span class="token punctuation">.</span>status<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span><span class="token function">equal</span><span class="token punctuation">(</span><span class="token string">'oh boy, 100 pickles!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Now let’s test the <code>#add</code> method before calling it a day. This method is interesting because all it can really do is update our status message. However, once it’s called the value returned by <code>pickles()</code> should have incremented by whatever amount was passed to <code>add()</code>. Let’s start by updating our <code>pickleStore</code> so it properly updates the status message after we’ve called add.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> pickleStore <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  count<span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  status<span class="token punctuation">:</span> <span class="token string">''</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">pickles</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> self <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">      url<span class="token punctuation">:</span> <span class="token string">'http://localhost:3000/pickles'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      dataType<span class="token punctuation">:</span> <span class="token string">'json'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token function-variable function">success</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        self<span class="token punctuation">.</span>count <span class="token operator">=</span> <span class="token function">parseInt</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>count<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        self<span class="token punctuation">.</span>status <span class="token operator">=</span> data<span class="token punctuation">.</span>message<span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">add</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">num</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> self <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">      url<span class="token punctuation">:</span> <span class="token string">'http://localhost:3000/pickles/add/'</span> <span class="token operator">+</span> num<span class="token punctuation">,</span></span><br><span class="highlight-line">      dataType<span class="token punctuation">:</span> <span class="token string">'json'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      <span class="token function-variable function">success</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        self<span class="token punctuation">.</span>status <span class="token operator">=</span> data<span class="token punctuation">.</span>message<span class="token punctuation">;</span> <span class="token comment">// &lt;-- update the status message!</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span></code></pre>
<p>Now that that’s in there we’ll write a failing spec.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'#add'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> amount <span class="token operator">=</span> <span class="token number">11</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token function">beforeEach</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    sinon<span class="token punctuation">.</span><span class="token function">stub</span><span class="token punctuation">(</span>$<span class="token punctuation">,</span> <span class="token string">'ajax'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">yieldsTo</span><span class="token punctuation">(</span><span class="token string">'success'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      add<span class="token punctuation">:</span> amount<span class="token punctuation">,</span></span><br><span class="highlight-line">      message<span class="token punctuation">:</span> <span class="token string">'you added '</span> <span class="token operator">+</span> amount <span class="token operator">+</span> <span class="token string">' pickles to the pickle barrel!'</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token function">afterEach</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    $<span class="token punctuation">.</span>ajax<span class="token punctuation">.</span><span class="token function">restore</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should update the status with the correct amount'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">done</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    pickleStore<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>amount<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token function">expect</span><span class="token punctuation">(</span>pickleStore<span class="token punctuation">.</span>status<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span><span class="token function">equal</span><span class="token punctuation">(</span><span class="token string">'you added '</span> <span class="token operator">+</span> <span class="token number">99</span> <span class="token operator">+</span> <span class="token string">' pickles to the pickle barrel!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>This is not unlike our previous spec, in fact it does even less since we’re not checking count.</p>
<p><img src="/images/2014/12/failing_add_test.png" alt="Another failing test."></p>
<p>To make the test pass we change the 99 to <code>amount</code>. I originally wrote the add method thinking I would go back and check the total number of pickles but I’ve realized now that really that’s more of a test for the service and not the front end. The front end shouldn’t care if that arithmetic is happening properly, it should just consume data and update its UI. For tomorrow’s post I’ll try to get an AMD module in here so we can start playing with Backbone again. Thanks!</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Irritated, Antsy</li>
<li>Sleep: 8</li>
<li>Hunger: 5</li>
<li>Coffee: 0</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Getting started with Mocha and Chai</title>
    <link href="https://robdodson.me/posts/testing-backbone-boilerplate-with-mocha-and-chai/"/>
    <updated>2012-05-27T21:08:00+00:00</updated>
    <id>https://robdodson.me/posts/testing-backbone-boilerplate-with-mocha-and-chai/</id>
    <content type="html"><![CDATA[
      <p>Since I was previously doing so much RSpec I want to try to bring some of that over to my JavaScript work. Lately I’ve been working with the Backbone Boilerplate which is a wonderful jump-start for folks who want to get up and running with AMD and Backbone. Today I’m going to see if I can get a working BDD setup going which will run some very basic tests. In a future post I’ll use this new setup to do some BDD with Backbone Boilerplate.</p>
<h3>Setting up Mocha and Chai</h3>
<p>I chose Mocha over Jasmine because I’ve already worked with Jasmine so there wasn’t much mystery there and also because I’ve heard really good things about Mocha. I think it’s cool that if I choose to do a Node.js project Mocha will be able to test both my server and client code.</p>
<p>Unfortunately the documentation for both Mocha and Chai is rather terse when it comes to actually explaining how to get either library working for client side testing. I guess that’s understandable since their primary focus is Node but after over an hour of poking around both sites I still don’t have anything that functions…</p>
<p>Copying over both the mocha and chai directories into my project I’ve noticed that each one has a test/browser folder which is refered to in the documentation. Seems like this is how I run my specs. Mocha has a failing set of specs on its opts.html file but otherwise everything seems to pass. Chai has failures in its spec regarding its deep equals operations… Let’s see if we can forge ahead and write a test in just mocha.</p>
<p>Here’s my html runner setup:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Mocha Tests<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>mocha/mocha.css<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>../assets/js/libs/jquery.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>mocha/mocha.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">      mocha<span class="token punctuation">.</span><span class="token function">setup</span><span class="token punctuation">(</span><span class="token string">'bdd'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br>    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>test.foobar.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">      <span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        mocha<span class="token punctuation">.</span><span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br>    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>mocha<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>And here’s my first failing test:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'Foobar'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'#sayHello()'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should return some text'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">var</span> foobar <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token function-variable function">sayHello</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">          <span class="token keyword">return</span> <span class="token string">'Hello World!'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token punctuation">}</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token function">assert</span><span class="token punctuation">(</span>foobar<span class="token punctuation">.</span><span class="token function">sayHello</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token string">'funky chicken'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Using just the above I see the mocha runner fire up but then it immediately breaks saying that <code>assert</code> is not defined. Well…great. <a href="http://visionmedia.github.com/mocha/#browser-support">I’m basing my work on this example</a> but I realize now that I removed the line which included <code>expect.js</code>. Without expect.js we don’t have anything to do exceptions for us because Mocha doesn’t include any by default.</p>
<p><img src="/images/2014/12/no_assert.png" alt="Assert is not defined"></p>
<p>Looking at some other Mocha examples in the github repo I noticed that they explicitly define the <code>assert</code> method inside the runner. We’ll do the same to get things working. Here’s my updated runner which now functions as expected. Note the addition of <code>assert</code> after we call <code>mocha.setup('bdd')</code>.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Mocha Tests<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>mocha/mocha.css<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>../assets/js/libs/jquery.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>mocha/mocha.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">      mocha<span class="token punctuation">.</span><span class="token function">setup</span><span class="token punctuation">(</span><span class="token string">'bdd'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br>    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span><br>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">      <span class="token keyword">function</span> <span class="token function">assert</span><span class="token punctuation">(</span><span class="token parameter">expr<span class="token punctuation">,</span> msg</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>expr<span class="token punctuation">)</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span>msg <span class="token operator">||</span> <span class="token string">'failed'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br>    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>test.foobar.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">      <span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        mocha<span class="token punctuation">.</span><span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br>    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>mocha<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>Since our <code>assert</code> method takes a <code>msg</code> param we can add that to our test so we get some useful feedback when it fails. Here’s the updated spec.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'Foobar'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'#sayHello()'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should return some text'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">var</span> foobar <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token function-variable function">sayHello</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">          <span class="token keyword">return</span> <span class="token string">'Hello World!'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token punctuation">}</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token function">assert</span><span class="token punctuation">(</span>foobar<span class="token punctuation">.</span><span class="token function">sayHello</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token string">'funky chicken'</span><span class="token punctuation">,</span> <span class="token string">'Was expecting "Hello World!"'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>That should fail and give us the appropriate message. Changing ‘funky chicken’ to ‘Hello World!’ will make the test pass. Yay that only took a few hours…</p>
<p>OK, let’s forge ahead and see if we can get chai working so we can use some nicer expectations than our weak <code>assert</code>. I’m including chai.js in place of our <code>assert</code> function.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Mocha Tests<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>mocha/mocha.css<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>../assets/js/libs/jquery.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>chai/chai.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- added chai.js instead of assert --></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>mocha/mocha.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">      mocha<span class="token punctuation">.</span><span class="token function">setup</span><span class="token punctuation">(</span><span class="token string">'bdd'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br>    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>test.foobar.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">      <span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        mocha<span class="token punctuation">.</span><span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br>    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>mocha<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>Next we need to update our spec. Chai has 3 different styles of assertions: <code>assert</code>, <code>expect</code> and <code>should</code>. I’ll show you how to use each in our foobar spec:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> assert <span class="token operator">=</span> chai<span class="token punctuation">.</span>assert<span class="token punctuation">,</span></span><br><span class="highlight-line">  expect <span class="token operator">=</span> chai<span class="token punctuation">.</span>expect<span class="token punctuation">,</span></span><br><span class="highlight-line">  should <span class="token operator">=</span> chai<span class="token punctuation">.</span><span class="token function">should</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Note that should has to be executed</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> foobar <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function-variable function">sayHello</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token string">'Hello World!'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'Foobar'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'#sayHello()'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should work with assert'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      assert<span class="token punctuation">.</span><span class="token function">equal</span><span class="token punctuation">(</span>foobar<span class="token punctuation">.</span><span class="token function">sayHello</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'funky chicken!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should work with expect'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token function">expect</span><span class="token punctuation">(</span>foobar<span class="token punctuation">.</span><span class="token function">sayHello</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span><span class="token function">equal</span><span class="token punctuation">(</span><span class="token string">'funky chicken!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should work with should'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      foobar<span class="token punctuation">.</span><span class="token function">sayHello</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>should<span class="token punctuation">.</span><span class="token function">equal</span><span class="token punctuation">(</span><span class="token string">'funky chicken!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p><img src="/images/2014/12/failing_chai_tests.png" alt="Our failing Chai tests"></p>
<p>Changing all those funky chickens to ‘Hello World!’ should get the tests passing again and now we can use any syntax we like.</p>
<p><img src="/images/2014/12/passing_chai_tests.png" alt="Finally some passing Chai tests!"></p>
<p>Now all is well and good except the tests that come with Chai are failing in a few places. It looks like some of Chai’s methods are borked on my system.</p>
<p><img src="/images/2014/12/broken_chai_tests.png" alt="Chai failing its own tests"></p>
<p>That does <em>not</em> fill me with confidence. I think there’s a very high probability that being a newbie I’m doing something wrong so <a href="https://twitter.com/rob_dodson/status/206893206435151872/photo/1">I’ve tweeted to Jake Luer, the author of Chai, to figure out if perhaps I’m missing something or if the tools are actually broken.</a> In the meantime I’m not comfortable using a testing framework that’s broken.</p>
<p>Sigh… well tomorrow I’ll try to import some modules and if Jake hasn’t gotten back to me by then I’ll use Jasmine to do those tests. Till then!</p>
<ul>
<li>Update: Looks like I managed to clone Chai right as they were updating the repo. Pulling the latest fixed everything. See the comment thread below*</li>
</ul>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Awake, Caffeinated, Curious</li>
<li>Sleep: 7</li>
<li>Hunger: 0</li>
<li>Coffee: 1</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Backbone Events: Framework Communication</title>
    <link href="https://robdodson.me/posts/backbone-events-framework-communication/"/>
    <updated>2012-05-25T15:01:00+00:00</updated>
    <id>https://robdodson.me/posts/backbone-events-framework-communication/</id>
    <content type="html"><![CDATA[
      <p>I want to figure out how to communicate on a framework level within Backbone. Coming from Flash and <a href="http://www.robotlegs.org/">RobotLegs</a> I’m used to a few MVC conventions that work very well as far as event dispatching goes. In RobotLegs you typically have a framework wide eventDispatcher that anyone can tune into. In a nutshell your View will trigger an event, for instance a user clicking a button, and that will get dispatched to interested framework actors. These can be other Views or, more likely, they can be Commands. The Commands are like single use actions tied directly to events. Think of it like binding every public method of your controller to an event. The Commands will typically effect models, changing them in some way, and the Models will dispatch an event that the Views listen for to update themselves.</p>
<p>Backbone works differently in that Views are often tied directly to their models like so:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// This is a Model object</span></span><br><span class="highlight-line"><span class="token keyword">var</span> doc <span class="token operator">=</span> Documents<span class="token punctuation">.</span><span class="token function">first</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// This is a View object with model reference</span></span><br><span class="highlight-line"><span class="token keyword">new</span> <span class="token class-name">DocumentRow</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  model<span class="token punctuation">:</span> doc<span class="token punctuation">,</span></span><br><span class="highlight-line">  id<span class="token punctuation">:</span> <span class="token string">'document-row-'</span> <span class="token operator">+</span> doc<span class="token punctuation">.</span>id</span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>When you use this approach it’s trivial to tell the view to listen to the model’s change event and then call <code>view.render()</code>. Essentially you are munging some of a Controller’s responsibilities into the View. That’s all well and good but let’s say we want to dispatch an event from one view which will affect other views and actors. This event has nothing to do with a model, maybe it’s just an animation of some kind that others need to know about. So how do we go about this?</p>
<h3>Communicating between Views in Backbone</h3>
<p>To facilitate this communication we’re going to use the <code>app</code> object that <a href="https://github.com/tbranyen/backbone-boilerplate">Backbone Boilerplate</a> creates for us. If you look in the <code>namespace.js</code> file that comes with the boilerplate you should see a line like this way down at the bottom:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">app<span class="token punctuation">:</span> _<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span> Backbone<span class="token punctuation">.</span>Events<span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>If you’re not familiar with <a href="http://underscorejs.org/#extend">Underscore.js’s extend method</a> it basically takes all of the properties and functions of one object and copies them onto another. If you’re coming from a language that supports classical inheritence this should feel familiar. In the above example it’s creating a new empty object (app), and extending/inheriting from the Backbone.Events object. This means that the <code>app</code> property of the <code>namespace</code> module is basically one big event dispatcher.</p>
<p>So let’s create two very simple views in a module called <code>Chatty</code>. One will be <code>Subject</code> and the other <code>Observer</code>. When we click the Subject we want it to dispatch an event that any framework actor can tune into. We’ll call this event <code>clicked:subject</code>. When the Observer hears the <code>clicked:subject</code> event we want it to replace its html content with whatever message is sent along.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">define</span><span class="token punctuation">(</span><span class="token punctuation">[</span></span><br><span class="highlight-line">  <span class="token string">"namespace"</span><span class="token punctuation">,</span> <span class="token comment">// &lt;-- see I'm bringing in the namespace module</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Libs</span></span><br><span class="highlight-line">  <span class="token string">"use!backbone"</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Modules</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Plugins</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token punctuation">]</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">namespace<span class="token punctuation">,</span> Backbone</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// &lt;-- make sure to pass namespace as an argument</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Create a new module</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> Chatty <span class="token operator">=</span> namespace<span class="token punctuation">.</span><span class="token function">module</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  Chatty<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Subject <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>View<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    tagName<span class="token punctuation">:</span> <span class="token string">'div'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    className<span class="token punctuation">:</span> <span class="token string">'subject'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    events<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token string">'click'</span><span class="token punctuation">:</span> <span class="token string">'onClick'</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function-variable function">initialize</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">html</span><span class="token punctuation">(</span><span class="token string">"I'm the Subject. Everyone listen up!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function-variable function">onClick</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      namespace<span class="token punctuation">.</span>app<span class="token punctuation">.</span><span class="token function">trigger</span><span class="token punctuation">(</span><span class="token string">'clicked:subject'</span><span class="token punctuation">,</span> <span class="token string">'watch it, buster!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// &lt;-- trigger a framework event</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  Chatty<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Observer <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>View<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    tagName<span class="token punctuation">:</span> <span class="token string">'div'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    className<span class="token punctuation">:</span> <span class="token string">'observer'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function-variable function">initialize</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">html</span><span class="token punctuation">(</span><span class="token string">"I'm the Observer. Quietly waiting..."</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      namespace<span class="token punctuation">.</span>app<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'clicked:subject'</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>onSubjectClicked<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">&lt;</span><span class="token operator">--</span> listen <span class="token keyword">for</span> framework events</span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function-variable function">onSubjectClicked</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">message</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">html</span><span class="token punctuation">(</span><span class="token string">"I heard the Subject say... "</span> <span class="token operator">+</span> message<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Required, return the module for AMD compliance</span></span><br><span class="highlight-line">  <span class="token keyword">return</span> Chatty<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>In our main.js file we’re just going to append those two views to the DOM whenever someone hits our route:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">require</span><span class="token punctuation">(</span><span class="token punctuation">[</span></span><br><span class="highlight-line">  <span class="token string">"namespace"</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Libs</span></span><br><span class="highlight-line">  <span class="token string">"jquery"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token string">"use!backbone"</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Modules</span></span><br><span class="highlight-line">  <span class="token string">"modules/chatty"</span></span><br><span class="highlight-line"><span class="token punctuation">]</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">namespace<span class="token punctuation">,</span> $<span class="token punctuation">,</span> Backbone<span class="token punctuation">,</span> Chatty</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token comment">// Defining the application router, you can attach sub routers here.</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> Router <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>Router<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    routes<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token string">"chatty"</span><span class="token punctuation">:</span> <span class="token string">"chatty"</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token function-variable function">chatty</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">var</span> subject <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Chatty<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Subject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token keyword">var</span> observer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Chatty<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Observer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">"#main"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span>subject<span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">"#main"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span>observer<span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token operator">...</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>And there you have it. When we click on <code>Subject</code> it should replace the content in <code>Observer</code> like so:
<img src="/images/2014/12/subject_observer.png" alt="The Observer hears the Subject"></p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Excited, Rested</li>
<li>Sleep: 6</li>
<li>Hunger: 4</li>
<li>Coffee: 0</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Backbone Events: Adding Views to the DOM</title>
    <link href="https://robdodson.me/posts/backbone-events-between-views/"/>
    <updated>2012-05-24T14:23:00+00:00</updated>
    <id>https://robdodson.me/posts/backbone-events-between-views/</id>
    <content type="html"><![CDATA[
      <p>Today I want to figure out what kind of events to use when one of my views is added to the DOM. This can have a lot of ramifications for positioning elements around the view and setting up properties on the view itself.</p>
<h3>View Events and the DOM</h3>
<p>After looking around for a bit I’ve found this <a href="http://documentcloud.github.com/backbone/#FAQ-events">list of the events that Backbone can dispatch.</a> Nothing in there about render or adding elements to the DOM :(</p>
<p>More searching reveals that almost everyone points to the <a href="http://docs.jquery.com/Plugins/livequery">livequery plugin for jQuery.</a> Livequery seems like a mostly deprecated plugin since jQuery has both <code>.live()</code> and <code>.delegate()</code> methods now. The one exception is that livequery will fire a callback when an element is created.</p>
<p>Another alternative is to fire a custom event from my View’s render method. While this does seem cleaner than using a plugin unfortunately we might call render over and over again. A middle of the road solution would be to use <code>.one()</code> to bind to the first render event.</p>
<p>In my mind I would like every Backbone View to extend a base class which dispatches a custom <code>addedToDOM</code> event and <code>removedFromDOM</code> event. I’m not sure what the performance cost of using livequery to do this is but let’s write it up and maybe we can do a jsPerf later.</p>
<h3>Load a jQuery plugin with AMD</h3>
<p>Let’s download livequery <a href="https://github.com/brandonaaron/livequery">from the git repo.</a> Now that we have it we’re in another little dilemma. The boilerplate loads jQuery like an AMD module…so how do you use a jQuery plugin with AMD?</p>
<p>It’s very possible this is not the intended method but here’s how I’ve gone about solving the problem. Since require.js is only going to load stuff if we specify it as a dependency then we’ll need to request the plugin just like any other module. If we put the plugin in our <code>assets/js/plugins</code> folder then we’ll already have a path to <code>plugins</code> provided by <code>config.js</code>.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">require<span class="token punctuation">.</span><span class="token function">config</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token comment">// Initialize the application with the main application file</span></span><br><span class="highlight-line">  deps<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'main'</span><span class="token punctuation">]</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  paths<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">// JavaScript folders</span></span><br><span class="highlight-line">    libs<span class="token punctuation">:</span> <span class="token string">'../assets/js/libs'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    plugins<span class="token punctuation">:</span> <span class="token string">'../assets/js/plugins'</span><span class="token punctuation">,</span> <span class="token comment">// &lt;---- !!! look here!</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Libraries</span></span><br><span class="highlight-line">    jquery<span class="token punctuation">:</span> <span class="token string">'../assets/js/libs/jquery'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    underscore<span class="token punctuation">:</span> <span class="token string">'../assets/js/libs/underscore'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    backbone<span class="token punctuation">:</span> <span class="token string">'../assets/js/libs/backbone'</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Shim Plugin</span></span><br><span class="highlight-line">    use<span class="token punctuation">:</span> <span class="token string">'../assets/js/plugins/use'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  use<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    backbone<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      deps<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'use!underscore'</span><span class="token punctuation">,</span> <span class="token string">'jquery'</span><span class="token punctuation">]</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      attach<span class="token punctuation">:</span> <span class="token string">'Backbone'</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    underscore<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      attach<span class="token punctuation">:</span> <span class="token string">'_'</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Then we can load livequery as if it were any other module. This might seem odd because a dependency gets passed to our pseudo-constructor as an argument:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">define</span><span class="token punctuation">(</span><span class="token punctuation">[</span></span><br><span class="highlight-line">  <span class="token string">"namespace"</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Libs</span></span><br><span class="highlight-line">  <span class="token string">"use!backbone"</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Modules</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Plugins</span></span><br><span class="highlight-line">  <span class="token string">"plugins/jquery.livequery"</span></span><br><span class="highlight-line"><span class="token punctuation">]</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">namespace<span class="token punctuation">,</span> Backbone<span class="token punctuation">,</span> livequery</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// &lt;-- see how livequery is passed</span></span><br><span class="highlight-line">  <span class="token operator">...</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>But we’re not going to use that argument. It’s just there to make sure that <code>jquery.livequery.js</code> gets added to the page. We’ll ignore it and use livequery via jquery instead, like so:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#sections'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">livequery</span><span class="token punctuation">(</span></span><br><span class="highlight-line">  <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'sections added to DOM!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'sections removed from DOM!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Keep in mind that require.js and AMD are just tacking the script elements onto the page. Requiring our plugin in this fashion is no different than tacking a <code>script</code> onto the HTML at runtime.</p>
<p>Here’s my example.js file <a href="http://robdodson.me/blog/2012/05/23/how-do-you-switch-between-views-in-backbone/">from the last post</a>, now using livequery to listen for when the element is added to and removed from the DOM.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">define</span><span class="token punctuation">(</span><span class="token punctuation">[</span></span><br><span class="highlight-line">  <span class="token string">'namespace'</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Libs</span></span><br><span class="highlight-line">  <span class="token string">'use!backbone'</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Modules</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Plugins</span></span><br><span class="highlight-line">  <span class="token string">'plugins/jquery.livequery'</span></span><br><span class="highlight-line"><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">namespace<span class="token punctuation">,</span> Backbone<span class="token punctuation">,</span> livequery</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token comment">// Create a new module</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> Example <span class="token operator">=</span> namespace<span class="token punctuation">.</span><span class="token function">module</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Example extendings</span></span><br><span class="highlight-line">  Example<span class="token punctuation">.</span>Model <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>Model<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">/* ... */</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  Example<span class="token punctuation">.</span>Collection <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>Collection<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">/* ... */</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  Example<span class="token punctuation">.</span>Router <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>Router<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">/* ... */</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// This will fetch the tutorial template and render it.</span></span><br><span class="highlight-line">  Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Tutorial <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>View<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    template<span class="token punctuation">:</span> <span class="token string">'app/templates/example.html'</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token function-variable function">render</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">done</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">var</span> view <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token comment">// Fetch the template, render it to the View element and call done.</span></span><br><span class="highlight-line">      namespace<span class="token punctuation">.</span><span class="token function">fetchTemplate</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>template<span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">tmpl</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        view<span class="token punctuation">.</span>el<span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> <span class="token function">tmpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">        <span class="token comment">// If a done function is passed, call it with the element</span></span><br><span class="highlight-line">        <span class="token keyword">if</span> <span class="token punctuation">(</span>_<span class="token punctuation">.</span><span class="token function">isFunction</span><span class="token punctuation">(</span>done<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">          <span class="token function">done</span><span class="token punctuation">(</span>view<span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token punctuation">}</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Left <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>View<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    tagName<span class="token punctuation">:</span> <span class="token string">'div'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    id<span class="token punctuation">:</span> <span class="token string">'left-container'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    className<span class="token punctuation">:</span> <span class="token string">'container'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Middle <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>View<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    tagName<span class="token punctuation">:</span> <span class="token string">'div'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    id<span class="token punctuation">:</span> <span class="token string">'middle-container'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    className<span class="token punctuation">:</span> <span class="token string">'container'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Right <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>View<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    tagName<span class="token punctuation">:</span> <span class="token string">'div'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    id<span class="token punctuation">:</span> <span class="token string">'right-container'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    className<span class="token punctuation">:</span> <span class="token string">'container'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Sections <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>View<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">    tagName<span class="token punctuation">:</span> <span class="token string">'div'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    id<span class="token punctuation">:</span> <span class="token string">'sections'</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    leftView<span class="token punctuation">:</span> <span class="token keyword">undefined</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    middleView<span class="token punctuation">:</span> <span class="token keyword">undefined</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    rightView<span class="token punctuation">:</span> <span class="token keyword">undefined</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    events<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token string">'click .container'</span><span class="token punctuation">:</span> <span class="token string">'onChildClicked'</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token function-variable function">initialize</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">this</span><span class="token punctuation">.</span>leftView <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Left</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token keyword">this</span><span class="token punctuation">.</span>middleView <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Middle</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token keyword">this</span><span class="token punctuation">.</span>rightView <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Right</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>leftView<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>middleView<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>rightView<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#sections'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">livequery</span><span class="token punctuation">(</span></span><br><span class="highlight-line">        <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">          console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'sections added to DOM!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">        <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">          console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'sections removed from DOM!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token punctuation">}</span></span><br><span class="highlight-line">      <span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// We should do this work with events instead of methods</span></span><br><span class="highlight-line">    <span class="token function-variable function">setInitialPosition</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">css</span><span class="token punctuation">(</span><span class="token punctuation">{</span>left<span class="token punctuation">:</span> <span class="token function">$</span><span class="token punctuation">(</span>window<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token function-variable function">onChildClicked</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">var</span> $target <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span>$e<span class="token punctuation">.</span>target<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token keyword">switch</span> <span class="token punctuation">(</span>$e<span class="token punctuation">.</span>target<span class="token punctuation">.</span>id<span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token keyword">case</span> <span class="token string">'left-container'</span><span class="token punctuation">:</span></span><br><span class="highlight-line">          <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">animate</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">            left<span class="token punctuation">:</span> <span class="token function">$</span><span class="token punctuation">(</span>window<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">-</span> $target<span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span></span><br><span class="highlight-line">          <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">          <span class="token keyword">break</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">        <span class="token keyword">case</span> <span class="token string">'middle-container'</span><span class="token punctuation">:</span></span><br><span class="highlight-line">          <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">animate</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">            left<span class="token punctuation">:</span> <span class="token function">$</span><span class="token punctuation">(</span>window<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span></span><br><span class="highlight-line">          <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">          <span class="token keyword">break</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">        <span class="token keyword">case</span> <span class="token string">'right-container'</span><span class="token punctuation">:</span></span><br><span class="highlight-line">          <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">animate</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">            left<span class="token punctuation">:</span> <span class="token function">$</span><span class="token punctuation">(</span>window<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> $target<span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span></span><br><span class="highlight-line">          <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">          <span class="token keyword">break</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Required, return the module for AMD compliance</span></span><br><span class="highlight-line">  <span class="token keyword">return</span> Example<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>I tried this out by adding and removing the <code>Example.Sections</code> view from the DOM and both console logs fired, so yeah, awesome! In lieu of creating a base class and adding an addedToDOM and removedFromDOM event we can do something like this to achieve that effect:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function-variable function">initialize</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>leftView <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Left</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>middleView <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Middle</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>rightView <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Right</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>leftView<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>middleView<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>rightView<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  _<span class="token punctuation">.</span><span class="token function">bindAll</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// make sure all the methods of our object have the right 'this'</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#sections'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">livequery</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>onAddedToDOM<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>onRemovedFromDOM<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function-variable function">onAddedToDOM</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'added to DOM!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function-variable function">onRemovedFromDOM</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'removed from DOM!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">,</span></span></code></pre>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Awake, Hot</li>
<li>Sleep: 5</li>
<li>Hunger: 5</li>
<li>Coffee: 0</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>How do you switch between views in Backbone</title>
    <link href="https://robdodson.me/posts/how-do-you-switch-between-views-in-backbone/"/>
    <updated>2012-05-23T14:56:00+00:00</updated>
    <id>https://robdodson.me/posts/how-do-you-switch-between-views-in-backbone/</id>
    <content type="html"><![CDATA[
      <p>I’m going to try to approach some of my future articles as more of a question/answer setup so they don’t turn into these sprawling tutorials. Today I want to focus on moving between views in Backbone.js. I’m starting with some very simple templates and three views: LeftView, MiddleView, RightView. To do this quickly we’ll make it so each view is essentially a big button which, when clicked on, should animate to the middle of the screen.</p>
<p>Here’s what one of my templates looks like:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>right-container<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>container<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Everyone knows I'm right.<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span></code></pre>
<p>One of the first thing I’m noticing is that all of my templates seem to be wrapped in an extra div. Since this extra div is block displayed I can’t get my items to line up next to each other… Oh! T<a href="http://stackoverflow.com/questions/7894253/backbone-js-turning-off-wrap-by-div-in-render">he problem is because I haven’t specified a tagName for my views.</a> I think I can actually do everything in the View declaration without needing a template.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Right <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>View<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  tagName<span class="token punctuation">:</span> <span class="token string">'div'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  id<span class="token punctuation">:</span> <span class="token string">'right-container'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  className<span class="token punctuation">:</span> <span class="token string">'container'</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>That should create our view for us with the proper tag, class and id attributes. My containers are just colored squares so I don’t need to populate them with any content. If I did want to use this approach I could add more content like this:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Right <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>View<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  tagName<span class="token punctuation">:</span> <span class="token string">'div'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  id<span class="token punctuation">:</span> <span class="token string">'right-container'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  className<span class="token punctuation">:</span> <span class="token string">'container'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">initialize</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>el<span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> <span class="token string">'Hello World!'</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Or I could render a template. Again for our purposes we just want to move some colored blocks around so the first approach is sufficient.</p>
<p>Here is our most basic <code>Router</code> showing how to add the views to stage. Since we aren’t using a template we can just call the regular render function and append the returned element to the DOM.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> Router <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>Router<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  routes<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token string">''</span><span class="token punctuation">:</span> <span class="token string">'index'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token function-variable function">index</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> leftView <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Left</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> middleView <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Middle</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> rightView <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Right</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Attach the views to the DOM</span></span><br><span class="highlight-line">    <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#main'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span>leftView<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#main'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span>middleView<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#main'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span>rightView<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Here are my very simple styles:</p>
<pre class="language-css"><code class="language-css"><span class="highlight-line"><span class="token selector">.container</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">width</span><span class="token punctuation">:</span> 300px<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">height</span><span class="token punctuation">:</span> 300px<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">display</span><span class="token punctuation">:</span> inline-block<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">margin-right</span><span class="token punctuation">:</span> 50px<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">#left-container</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">background</span><span class="token punctuation">:</span> #f00<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">#middle-container</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">background</span><span class="token punctuation">:</span> #0f0<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">#right-container</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">background</span><span class="token punctuation">:</span> #00f<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>We should now have a very simple horizontal layout.</p>
<h3>Composite Views</h3>
<p>Well I’d like to center my views in the middle of the screen but moving each item individually is going to be pretty challenging. I think the better idea would be to wrap my views in a containing view which can then be easily centered on screen.</p>
<p>Here’s what that looks like:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Sections <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>View<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  tagName<span class="token punctuation">:</span> <span class="token string">'div'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  id<span class="token punctuation">:</span> <span class="token string">'sections'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  leftView<span class="token punctuation">:</span> <span class="token keyword">undefined</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  middleView<span class="token punctuation">:</span> <span class="token keyword">undefined</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  rightView<span class="token punctuation">:</span> <span class="token keyword">undefined</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token function-variable function">initialize</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>leftView <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Left</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>middleView <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Middle</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>rightView <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Right</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>leftView<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>middleView<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>rightView<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// We should do this work with events instead of methods</span></span><br><span class="highlight-line">  <span class="token function-variable function">setInitialPosition</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">css</span><span class="token punctuation">(</span><span class="token punctuation">{</span>left<span class="token punctuation">:</span> <span class="token function">$</span><span class="token punctuation">(</span>window<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Our Sections view is going to contain our 3 subordinate views. When it gets added to the DOM, <code>initialize</code> will run and create our subviews. I’ve also defined a method <code>setInitialPosition</code> which centers our view on screen. Tomorrow I’ll replace this with an event handler that fires whenever our element is added to the DOM. For now I’m too lazy to look up the supported events :D</p>
<p>The sections view is absolutely positioned and it’s width and height are explicitly defined in the css. In the short term here’s how we’ve updated things:</p>
<pre class="language-css"><code class="language-css"><span class="highlight-line"><span class="token selector">#sections</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">display</span><span class="token punctuation">:</span> inline-block<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">position</span><span class="token punctuation">:</span> absolute<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">width</span><span class="token punctuation">:</span> 1000px<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">height</span><span class="token punctuation">:</span> 300px<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">top</span><span class="token punctuation">:</span> 50px<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">left</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">.container</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">width</span><span class="token punctuation">:</span> 300px<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">height</span><span class="token punctuation">:</span> 300px<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">#left-container</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">background</span><span class="token punctuation">:</span> #f00<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">position</span><span class="token punctuation">:</span> absolute<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">top</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">left</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">#middle-container</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">background</span><span class="token punctuation">:</span> #0f0<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">position</span><span class="token punctuation">:</span> absolute<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">top</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">left</span><span class="token punctuation">:</span> 350px<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">#right-container</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">background</span><span class="token punctuation">:</span> #00f<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">position</span><span class="token punctuation">:</span> absolute<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">top</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">left</span><span class="token punctuation">:</span> 700px<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>I wanted to give each view a 50px margin on each side so in the short term all these values are hard coded. I’ll think about how to make things more dynamic.</p>
<p>Let’s listen to when the user clicks on a view. When we hear that we’ll animate the whole sections container over so that view is centered on screen.</p>
<p>We’ll need to add an events hash to our Sections view. Since all of our children implement the same <code>.container</code> class we may as well listen for a click on that.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">events<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token string">"click .container"</span><span class="token punctuation">:</span> <span class="token string">"onChildClicked"</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>In our handler, <code>onChildClicked</code>, we’ll figure out which child was actually clicked and then animate ourselves accordingly. Here’s the entire object for your reference with the handler at the bottom.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Sections <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>View<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  tagName<span class="token punctuation">:</span> <span class="token string">'div'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  id<span class="token punctuation">:</span> <span class="token string">'sections'</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  leftView<span class="token punctuation">:</span> <span class="token keyword">undefined</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  middleView<span class="token punctuation">:</span> <span class="token keyword">undefined</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  rightView<span class="token punctuation">:</span> <span class="token keyword">undefined</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  events<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token string">'click .container'</span><span class="token punctuation">:</span> <span class="token string">'onChildClicked'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token function-variable function">initialize</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>leftView <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Left</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>middleView <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Middle</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>rightView <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Right</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>leftView<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>middleView<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>rightView<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// We should do this work with events instead of methods</span></span><br><span class="highlight-line">  <span class="token function-variable function">setInitialPosition</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">css</span><span class="token punctuation">(</span><span class="token punctuation">{</span>left<span class="token punctuation">:</span> <span class="token function">$</span><span class="token punctuation">(</span>window<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Whenever a child is clicked let's animate so it is</span></span><br><span class="highlight-line">  <span class="token comment">// centered on screen</span></span><br><span class="highlight-line">  <span class="token function-variable function">onChildClicked</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> $target <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span>$e<span class="token punctuation">.</span>target<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token keyword">switch</span> <span class="token punctuation">(</span>$e<span class="token punctuation">.</span>target<span class="token punctuation">.</span>id<span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">case</span> <span class="token string">'left-container'</span><span class="token punctuation">:</span></span><br><span class="highlight-line">        <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">animate</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">          left<span class="token punctuation">:</span> <span class="token function">$</span><span class="token punctuation">(</span>window<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">-</span> $target<span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span></span><br><span class="highlight-line">        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token keyword">break</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token keyword">case</span> <span class="token string">'middle-container'</span><span class="token punctuation">:</span></span><br><span class="highlight-line">        <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">animate</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">          left<span class="token punctuation">:</span> <span class="token function">$</span><span class="token punctuation">(</span>window<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span></span><br><span class="highlight-line">        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token keyword">break</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token keyword">case</span> <span class="token string">'right-container'</span><span class="token punctuation">:</span></span><br><span class="highlight-line">        <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">animate</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">          left<span class="token punctuation">:</span> <span class="token function">$</span><span class="token punctuation">(</span>window<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> $target<span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span></span><br><span class="highlight-line">        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token keyword">break</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Laggy, Pensive</li>
<li>Sleep: 5</li>
<li>Hunger: 0</li>
<li>Coffee: 0</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Exploring the Backbone Router and History API</title>
    <link href="https://robdodson.me/posts/exploring-the-backbone-router-and-history-api/"/>
    <updated>2012-05-21T14:59:00+00:00</updated>
    <id>https://robdodson.me/posts/exploring-the-backbone-router-and-history-api/</id>
    <content type="html"><![CDATA[
      <p>I want to talk a bit more about the Backbone Router because I think it’s one of the first pieces of the framework that people run up against that deviates from the standard MVC setup.</p>
<p>If you’ve used Rails before you’re used to the idea of <code>routes</code> which pick apart a url and figure out which controller to run. CodeIgniter uses the same paradigm but I’m not sure if they also call them routes or use a different term. Contrary to this, in Backbone the Router is like a controller for the entire application. This makes it similar to Sinatra. Creating two different routes which replace the content of the page each time would look like this:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> Router <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>Router<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  routes<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token string">''</span><span class="token punctuation">:</span> <span class="token string">'index'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    search<span class="token punctuation">:</span> <span class="token string">'search'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token function-variable function">index</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> tutorial <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Tutorial</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Attach the tutorial page to the DOM</span></span><br><span class="highlight-line">    tutorial<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">el</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#main'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">html</span><span class="token punctuation">(</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token function-variable function">search</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> search <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Search</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Attach the search page to the DOM</span></span><br><span class="highlight-line">    search<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">el</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#main'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">html</span><span class="token punctuation">(</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>If you’re using the Backbone Boilerplate you won’t need to tell the Router to update every time someone clicks a link. The Boilerplate implements the following block of code at the very bottom of main.js</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// All navigation that is relative should be passed through the navigate</span></span><br><span class="highlight-line"><span class="token comment">// method, to be processed by the router.  If the link has a data-bypass</span></span><br><span class="highlight-line"><span class="token comment">// attribute, bypass the delegation completely.</span></span><br><span class="highlight-line"><span class="token function">$</span><span class="token punctuation">(</span>document<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'click'</span><span class="token punctuation">,</span> <span class="token string">'a:not([data-bypass])'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">evt</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token comment">// Get the anchor href and protcol</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> href <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'href'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> protocol <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>protocol <span class="token operator">+</span> <span class="token string">'//'</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Ensure the protocol is not part of URL, meaning its relative.</span></span><br><span class="highlight-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>href <span class="token operator">&amp;&amp;</span> href<span class="token punctuation">.</span><span class="token function">slice</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> protocol<span class="token punctuation">.</span>length<span class="token punctuation">)</span> <span class="token operator">!==</span> protocol <span class="token operator">&amp;&amp;</span> href<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">'javascript:'</span><span class="token punctuation">)</span> <span class="token operator">!==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">// Stop the default event to ensure the link will not cause a page</span></span><br><span class="highlight-line">    <span class="token comment">// refresh.</span></span><br><span class="highlight-line">    evt<span class="token punctuation">.</span><span class="token function">preventDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// `Backbone.history.navigate` is sufficient for all Routers and will</span></span><br><span class="highlight-line">    <span class="token comment">// trigger the correct events.  The Router's internal `navigate` method</span></span><br><span class="highlight-line">    <span class="token comment">// calls this anyways.</span></span><br><span class="highlight-line">    Backbone<span class="token punctuation">.</span>history<span class="token punctuation">.</span><span class="token function">navigate</span><span class="token punctuation">(</span>href<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>In short this is an application wide handler for any relative anchor that doesn’t have a <code>data-bypass</code> attribute. So something like <code>&lt;a href=&quot;search&quot;&gt;Search&lt;/a&gt;</code> would get passed through here.</p>
<p>The last few bits prevent the link from completely refreshing the page—<code>evt.preventDefault()</code>—and pipe the href through the router. Actually the href gets piped through <code>Backbone.history.navigate</code> which <code>Router.navigate</code> proxies. When you call <code>Router.navigate('foobar')</code> you’re supposed to pash a hash of <code>{trigger: true}</code> if you’d like the router to run the corresponding <code>foobar</code> method. If you dig into the source you can see that just passing true will also have the same effect and that’s what’s done here by the Boilerplate.</p>
<p>Originally I had written my View like this because I thought I had to use the Router explicitly.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// This will fetch the tutorial template and render it.</span></span><br><span class="highlight-line">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Tutorial <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>View<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  template<span class="token punctuation">:</span> <span class="token string">'app/templates/example.html'</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Listen for when the user clicks our anchor tag</span></span><br><span class="highlight-line">  events<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token string">'click .search'</span><span class="token punctuation">:</span> <span class="token string">'search'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Note: I'm stopping the event and explicitly telling the Router to</span></span><br><span class="highlight-line">  <span class="token comment">// update the history and trigger the corresponding search method.</span></span><br><span class="highlight-line">  <span class="token function-variable function">search</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    e<span class="token punctuation">.</span><span class="token function">preventDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    namespace<span class="token punctuation">.</span>app<span class="token punctuation">.</span>router<span class="token punctuation">.</span><span class="token function">navigate</span><span class="token punctuation">(</span><span class="token string">'search'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>trigger<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token comment">//...</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Notice that I’ve defined a <code>search</code> method which listens for a click on my anchor of class <code>.search</code>. This is inline with the vanilla Backbone.js documentation but since the Boilerplate has added that application wide handler for us, we don’t need this function unless there’s some additional work that search needs to do. By just letting that global handler do its thing our route will still be called and we can save a fair bit of boilerplate in our templates.</p>
<p>If you want to subvert the handler then you can just call <code>preventDefault</code> and <code>stopPropagation</code> on the click event like so:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Tutorial <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>View<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  template<span class="token punctuation">:</span> <span class="token string">'app/templates/example.html'</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  events<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token string">'click .search'</span><span class="token punctuation">:</span> <span class="token string">'search'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token function-variable function">search</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    e<span class="token punctuation">.</span><span class="token function">preventDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    e<span class="token punctuation">.</span><span class="token function">stopPropagation</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    namespace<span class="token punctuation">.</span>app<span class="token punctuation">.</span>router<span class="token punctuation">.</span><span class="token function">navigate</span><span class="token punctuation">(</span><span class="token string">'whatever'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">//...</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Something else to keep in mind is that the boilerplate comes with <code>History pushState</code> turned on by default.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// Trigger the initial route and enable HTML5 History API support</span></span><br><span class="highlight-line">Backbone<span class="token punctuation">.</span>history<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">{</span>pushState<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>This lets you create routes that look like this: <code>mysite.com/search/foobar</code> instead of using a hash <code>mysite.com/#search/foobar</code>. The only problem is that for HTML5 History pushState to work your server has to keep resolving to index.html. The boilerplate tutorial says to use <code>node build/server</code> to run your project server, even though elsewhere it says to use <code>bbb server</code>. Neither works so I’ve <a href="https://github.com/backbone-boilerplate/grunt-bbb/issues/21">logged an issue on Github.</a> Very possible I’m doing it wrong but we’ll see. For now I’m not using pushState so I changed the line in main.js to read <code>Backbone.history.start()</code> and instead I’m using the hash approach.</p>
<p><em>UPDATE: Turns out there was a bug in the Backbone Boilerplate, make sure in your index.html file that the data-main attribute starts from the root of the site, like so: <code>data-main=&quot;/app/config&quot;</code>. Also make sure to use bbb server as node build/server is deprecated.</em></p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Awake, Hurried, Focused</li>
<li>Sleep: 8</li>
<li>Hunger: 0</li>
<li>Coffee: 0</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Some More Backbone.js Basics</title>
    <link href="https://robdodson.me/posts/some-more-backbone-dot-js-basics/"/>
    <updated>2012-05-20T15:19:00+00:00</updated>
    <id>https://robdodson.me/posts/some-more-backbone-dot-js-basics/</id>
    <content type="html"><![CDATA[
      <p>Here are some quick Backbone snippets to help visualize concepts. I’ll move around fairly quickly so if you’re interested in going more in-depth then checkout the documentation.</p>
<h3>Events</h3>
<p>Backbone events are pretty straightforward. To create a pub/sub relationship you use the <code>on</code> and <code>off</code> methods of <code>Backbone.Events</code>:</p>
<p>In the above example you could make <code>dispatcher</code> into an AMD module and load the dependency with Require.js, something <a href="http://robdodson.me/blog/2012/05/18/backbone-boilerplate-playing-with-require-dot-js/">I’ve covered in a previous post.</a></p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> dispatcher <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line">_<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span>dispatcher<span class="token punctuation">,</span> Backbone<span class="token punctuation">.</span>Events<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> receiver <span class="token operator">=</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function-variable function">initialize</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">// Start listening for the 'hello' event from the dispatcher.</span></span><br><span class="highlight-line">    <span class="token comment">// When we hear the 'hello' event we'll run a function</span></span><br><span class="highlight-line">    dispatcher<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'hello'</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>sayHello<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">sayHello</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'hello!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token comment">// Kill the listener so we only get called once</span></span><br><span class="highlight-line">    dispatcher<span class="token punctuation">.</span><span class="token function">off</span><span class="token punctuation">(</span><span class="token string">'hello'</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>sayHello<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">receiver<span class="token punctuation">.</span><span class="token function">initialize</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">dispatcher<span class="token punctuation">.</span><span class="token function">trigger</span><span class="token punctuation">(</span><span class="token string">'hello'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">dispatcher<span class="token punctuation">.</span><span class="token function">trigger</span><span class="token punctuation">(</span><span class="token string">'hello'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<h3>Models</h3>
<p>Backbone models are interesting because they implement explicit <code>get</code> and <code>set</code> methods. When you change a property with the get and set methods it will fire off an event. Here’s a fiddle showing how to model a <code>Book</code>. We’ll change the author and the DOM will reflect this update.</p>
<p>If your model implements an <code>initialize</code> function it will be called as soon as the object is created. In other words, its a constructor. If you pass a hash to the model’s constructor it will set those attributes on itself. The hash and any additional arguments will also be passed to <code>initialize</code>.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// Define an initialize function for our book</span></span><br><span class="highlight-line"><span class="token comment">// Initialize will be called anytime we say new Book()</span></span><br><span class="highlight-line"><span class="token keyword">var</span> Book <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>Model<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function-variable function">initialize</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">foo<span class="token punctuation">,</span> bar</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>foo<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>bar<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// You can pass in a hash to set initial values on the model</span></span><br><span class="highlight-line"><span class="token comment">// The hash and any additional arguments will also be passed</span></span><br><span class="highlight-line"><span class="token comment">// to the initialize function</span></span><br><span class="highlight-line">book <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Book</span><span class="token punctuation">(</span></span><br><span class="highlight-line">  <span class="token punctuation">{</span></span><br><span class="highlight-line">    author<span class="token punctuation">:</span> <span class="token string">'Hunter S. Thompson'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    title<span class="token punctuation">:</span> <span class="token string">'Fear and Loating in Las Vegas'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token string">'hello world!'</span></span><br><span class="highlight-line"><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>book<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'author'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<h4>Poor man’s data-binding</h4>
<p>Now that we have a basic understanding of models we can write our own simple binding setup. This example presumes we have an <code>#author</code> and a <code>#title</code> element somewhere on our page.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> Book <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>Model<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">book <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Book</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  author<span class="token punctuation">:</span> <span class="token string">'Hunter S. Thompson'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  title<span class="token punctuation">:</span> <span class="token string">'Fear and Loating in Las Vegas'</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">// Listen for any change event coming from the model.</span></span><br><span class="highlight-line"><span class="token comment">// When any attribute changes we'll tell our elements to</span></span><br><span class="highlight-line"><span class="token comment">// automatically update.</span></span><br><span class="highlight-line">book<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'change'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#author'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">html</span><span class="token punctuation">(</span>book<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'author'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#title'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">html</span><span class="token punctuation">(</span>book<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'title'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">book<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">'author'</span><span class="token punctuation">,</span> <span class="token string">'Mickey Mouse'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">book<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">'title'</span><span class="token punctuation">,</span> <span class="token string">'Everyone Poops'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<h4>Backbone.sync</h4>
<p>To mess around with saving data we’ll need to alter <code>Backbone.sync</code>.</p>
<blockquote>
<p>Backbone.sync is the function that Backbone calls every time it attempts to read or save a model to the server. By default, it uses (jQuery/Zepto).ajax to make a RESTful JSON request and returns a jqXHR. You can override it in order to use a different persistence strategy, such as WebSockets, XML transport, or Local Storage.</p>
</blockquote>
<p>Backbone will decide whether a save call should perform a create with <code>HTTP POST</code> or an update <code>HTTP PUT</code> based on whether or not our model has an id attribute already.</p>
<p>Here’s an example from the Backbone docs which overrides the sync functionality and fakes a request to a server.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">Backbone<span class="token punctuation">.</span><span class="token function-variable function">sync</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">method<span class="token punctuation">,</span> model</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>method <span class="token operator">+</span> <span class="token string">': '</span> <span class="token operator">+</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>model<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  model<span class="token punctuation">.</span>id <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment">// This line is crucial!</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> book <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Backbone<span class="token punctuation">.</span>Model</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  title<span class="token punctuation">:</span> <span class="token string">'The Rough Riders'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  author<span class="token punctuation">:</span> <span class="token string">'Theodore Roosevelt'</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">book<span class="token punctuation">.</span><span class="token function">save</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token comment">// create: {"title":"The Rough Riders","author":"Theodore Roosevelt"}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">book<span class="token punctuation">.</span><span class="token function">save</span><span class="token punctuation">(</span><span class="token punctuation">{</span>author<span class="token punctuation">:</span> <span class="token string">'Teddy'</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token comment">// update: {"title":"The Rough Riders","author":"Teddy"}</span></span></code></pre>
<p>​If we don’t give our model an <code>id</code> on line 3 then Backbone has no way of knowing if the model has been previously saved or not. It will keep doing create/POST until it receives that id.</p>
<h3>Collections</h3>
<p>If you don’t want to setup a server but you do want to play around with saving models and collections you can use <a href="https://github.com/jeromegn/Backbone.localStorage">the Backbone LocalStorage adapter written by Jerome Gravel-Niquet</a>. After you’ve included the js file in your code somewhere you can use it like so:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> Book <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>Model<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> Books <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>Collection<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  model<span class="token punctuation">:</span> Book<span class="token punctuation">,</span></span><br><span class="highlight-line">  localStorage<span class="token punctuation">:</span> <span class="token keyword">new</span> <span class="token class-name">Backbone<span class="token punctuation">.</span>LocalStorage</span><span class="token punctuation">(</span><span class="token string">'Books'</span><span class="token punctuation">)</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> library <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Books</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">library<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'sync'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'sync succesful!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> othello <span class="token operator">=</span> library<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  title<span class="token punctuation">:</span> <span class="token string">'Othello'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  author<span class="token punctuation">:</span> <span class="token string">'William Shakespeare'</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>To <code>fetch</code> the models in the collection at a later point you can do the following:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> Book <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>Model<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> Books <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>Collection<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  model<span class="token punctuation">:</span> Book<span class="token punctuation">,</span></span><br><span class="highlight-line">  localStorage<span class="token punctuation">:</span> <span class="token keyword">new</span> <span class="token class-name">Backbone<span class="token punctuation">.</span>LocalStorage</span><span class="token punctuation">(</span><span class="token string">'Books'</span><span class="token punctuation">)</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> library <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Books</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">library<span class="token punctuation">.</span><span class="token function">fetch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>library<span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>The docs mention that you shouldn’t use this to initialize your collections. Instead you should <a href="http://documentcloud.github.com/backbone/#FAQ-bootstrap">bootstrap your app</a> at page load. Here’s the passage:</p>
<blockquote>
<p>Note that fetch should not be used to populate collections on page load — all models needed at load time should already be bootstrapped in to place. fetch is intended for lazily-loading models for interfaces that are not needed immediately: for example, documents with collections of notes that may be toggled open and closed.</p>
</blockquote>
<h3>Routers</h3>
<p>Routers are used to map URLs to actions. If you’re using the Backbone Boilerplate you should see this block of code in your main.js.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// Defining the application router, you can attach sub routers here.</span></span><br><span class="highlight-line"><span class="token keyword">var</span> Router <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>Router<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  routes<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token string">''</span><span class="token punctuation">:</span> <span class="token string">'index'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token string">':hash'</span><span class="token punctuation">:</span> <span class="token string">'index'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token function-variable function">index</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">hash</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> route <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">var</span> tutorial <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Example<span class="token punctuation">.</span>Views<span class="token punctuation">.</span>Tutorial</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Attach the tutorial to the DOM</span></span><br><span class="highlight-line">    tutorial<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">el</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#main'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">html</span><span class="token punctuation">(</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token comment">// Fix for hashes in pushState and hash fragment</span></span><br><span class="highlight-line">      <span class="token keyword">if</span> <span class="token punctuation">(</span>hash <span class="token operator">&amp;&amp;</span> <span class="token operator">!</span>route<span class="token punctuation">.</span>_alreadyTriggered<span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token comment">// Reset to home, pushState support automatically converts hashes</span></span><br><span class="highlight-line">        Backbone<span class="token punctuation">.</span>history<span class="token punctuation">.</span><span class="token function">navigate</span><span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">        <span class="token comment">// Trigger the default browser behavior</span></span><br><span class="highlight-line">        location<span class="token punctuation">.</span>hash <span class="token operator">=</span> hash<span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">        <span class="token comment">// Set an internal flag to stop recursive looping</span></span><br><span class="highlight-line">        route<span class="token punctuation">.</span>_alreadyTriggered <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>One gotcha is that the definition of <code>&quot;:hash&quot;: &quot;index&quot;</code> will send any route that follows the base domain to the index function. For instance if you did the following:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">routes<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token string">""</span><span class="token punctuation">:</span> <span class="token string">"index"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token string">":hash"</span><span class="token punctuation">:</span> <span class="token string">"index"</span></span><br><span class="highlight-line">    <span class="token string">"search"</span><span class="token punctuation">:</span> <span class="token string">"search"</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">//...</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function-variable function">search</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'time to search!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>Instead of the search function running what will actually happen is mysite.com/search will be converted into mysite.com/#search and the word <code>search</code> will be sent to the index function to supply the <code>hash</code> argument. To fix this you’ll need to remove the <code>&quot;:hash&quot;: &quot;index&quot;</code> route.</p>
<h3>Views</h3>
<p>Views can either work with existing DOM elements or create new ones. Here’s a very basic fiddle in which a BodyView is created to wrap our <code>body</code> tag and BoxView is appended to it. We add a little jQuery animation to show the process in action.</p>
<p>You’ll often want to link a view’s render method up to a model’s change event so the two will stay in sync. Here’s a quick and dirty example showing how to bind in this fashion.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> Book <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>Model<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> BookView <span class="token operator">=</span> Backbone<span class="token punctuation">.</span>View<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  className<span class="token punctuation">:</span> <span class="token string">'book-view'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">initialize</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>model<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'change'</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>render<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  <span class="token function-variable function">render</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">this</span><span class="token punctuation">.</span>$el<span class="token punctuation">.</span><span class="token function">html</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>model<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'title'</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">' by '</span> <span class="token operator">+</span> <span class="token keyword">this</span><span class="token punctuation">.</span>model<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'author'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> outliers <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Book</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  author<span class="token punctuation">:</span> <span class="token string">'Malcolm Gladwell'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  title<span class="token punctuation">:</span> <span class="token string">'Outliers'</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> bookView <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BookView</span><span class="token punctuation">(</span><span class="token punctuation">{</span>model<span class="token punctuation">:</span> outliers<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'body'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span>bookView<span class="token punctuation">.</span>el<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">outliers<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">'author'</span><span class="token punctuation">,</span> <span class="token string">'Mickey Mouse'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Instead of throwing your HTML into the render method as a String it’s advised that you use some kind of templating library. Underscore templates seem like a good place to start but Backbone is designed to be template agnostic so you could easily switch to Mustache/Handelbars or HAML if you want. Tomorrow I’ll look into displaying some content using an Underscore template linked up to a model. Till then… :D</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>My First Chain</title>
    <link href="https://robdodson.me/posts/my-first-chain/"/>
    <updated>2012-05-20T05:53:00+00:00</updated>
    <id>https://robdodson.me/posts/my-first-chain/</id>
    <content type="html"><![CDATA[
      <p>Back in April I was reading hacker news when I came across a blog posted titled <a href="http://japhr.blogspot.com/2012/04/366-or-how-i-tricked-myself-into-being.html">‘366 or How I Tricked Myself into Being Awesome’</a>. It was written by a fellow named Chris Strom. It was written on blogspot. It was mostly unstyled.</p>
<p>Chris wrote every single day for 366 days and in so doing self-published three books on programming languages that he knew nothing about. His post was to champion that milestone. At the time I read it and thought, “I can totally do this,” meaning if I follow the steps that Chris has outlined I can potentially trick myself into becoming a blogger.</p>
<p>That probably seems rather silly to say but it’s true. Every developer I know Googles for answers when they’re stuck or trying to learn something new. <a href="http://css-tricks.com/">And it seems like</a>, <a href="http://www.alistapart.com/">over and</a><a href="http://www.leebrimelow.com/">over again</a>, <a href="http://devblog.avdi.org/">we end up</a><a href="http://yehudakatz.com/">in the same places.</a> And if you’re a developer, or maybe if you’re just me, you totally revere these people. They are guides in what is a truly unfamiliar world and they do it without asking anything in return.</p>
<p>So I set out to try to do my own chain. I have to write until I go to Europe on June 27th. At this moment I have 22 blog posts that I’ve written as a result of the chain. Prior to that I’d written 3 in an entire year. At first I found the whole process exhilarating, until it started to get in the way of my personal activities. Now I have to figure out how to write something of substance while still balancing my job and my home life. This is not easy. It requires setting boundaries and self-discipline. I try to write in the mornings, usually between the hours of 7 to 9. Frequently I don’t finish and my posts have to be resumed in the evening. But working like this interferes with the time I can spend with my girlfriend and that breaks one of the unspoken rules I have which is that writing should not disturb my normal social life. Getting to the first 10 posts this was not a problem but now that I’m passing 20 it is. I’ve changed my writing style from full blown tutorials to more of a play-by-play as I code. I’m always striving to be more succinct in what I write but usually the challenge is disappearing down a rabbit hole while I research something new only to realize that I’ve blown half an hour of my writing time googling minutia. I’m going to try to associate googling minutia with some guy getting in between me and my girlfriend. As a result I will want to stab googling minutia.</p>
<p>Anyway, if you find this post and you are thinking about writing let me tell you that I <strong>highly</strong> recommend it. Here is some quick advice:</p>
<h3>Don’t worry about what your blog looks like.</h3>
<p><strong>I’m 100% serious on this point</strong>. If you spend any time designing your blog before you write your first 5 articles then you’re doing it wrong. I have fallen into this trap innumerable times. Just accept this challenge: Make it to 10 blog posts, then you can redesign the thing.</p>
<p>I think we fall in love with the idea of having a beautiful blog and get lost in design and programming how everything will look. This is a mistake. Blogging is supposed to just be a journal of what you’re currently working on and thinking. Assume no one will read it (this is probably true). After you have a few readers then work on the look and feel if you choose. Personally I’ve found that not worrying about the design at all has been incredibly freeing. Again, look at <a href="http://japhr.blogspot.com/2012/04/366-or-how-i-tricked-myself-into-being.html">Chris Strom’s blog</a>. He has a ton of readers, is a published author, and is running the default blogspot theme.</p>
<h3>Try to write at the same time every day</h3>
<p>I find it easiest to focus in the morning especially when everyone else is asleep. I think Chris works late at night. Figure out what times suits you and do your best to stick to it. When I finish a post in the morning I feel free for the whole rest of the day. It’s kind of cool to have that sense of accomplishment before arriving at work :D</p>
<h3>Use the best tools you can</h3>
<p>I tried writing in Wordpress on several different occasions. I’ve also tried Tumblr and Posterous. I find writing in shitty WYSIWYG editors drives me totally crazy. There are apps out there that let you write in more of a desktop setting but I’m not sure if they are still subject to Wordpress or Tumblr’s weird formatting. Basically if you’re writing a code blog it fucking sucks to use a WYSIWYG because they’ll try to wrap all of your funky syntax in weird markup. I found <a href="http://octopress.org/">Octopress</a> and it’s been the best tool I’ve ever used for writing. I also <a href="http://robdodson.me/blog/2012/04/30/custom-domain-with-octopress-and-github-pages/">wrote a little article</a> on it if you’re trying to get it setup for your personal domain. Octopress is great because it uses <a href="http://daringfireball.net/projects/markdown/">Markdown</a>, the same language that’s used to generate most of the pages on Github, there’s no database and you can write in any text editor. I do all of my blogging in <a href="http://www.sublimetext.com/2">Sublime Text 2</a>, often times with my blog in one cell with my code in the other. Here’s a screenshot of what this can look like.</p>
<p><img src="/images/2014/12/side_by_side_blogging.png" alt="Side-by-side blogging"></p>
<h3>Don’t worry when no one reads it</h3>
<p>Finally, don’t get too hung up on who is (or isn’t) reading your blog. I know that pretty much all of the visits I see in my google analytics are actually just me checking the site on my phone or laptop. Definitely <em>do</em> add analytics so you can see which parts are successful and which are not but don’t expect to be <a href="http://daringfireball.net/">Daring Fireball</a> overnight. In fact, don’t ever expect to be Daring Fireball. Keep in mind that what you’re doing is a personal journal. It may not seem like blogs are framed in that context but that’s what they’re best at. I often times find this really interesting flow where I write down what I think I should build before I build it, then I write a test, then I write the implementation. Often times I work out what I’m doing in the blog post well before I’ve even written the test. This is like a whole other kind of BDD, Blog Driven Development :) Use it for what it’s best at and you’ll find it rewarding.</p>
<p>Ok that’s it for now. Goodnight!</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Backbone Boilerplate: Playing with RequireJS</title>
    <link href="https://robdodson.me/posts/backbone-boilerplate-playing-with-require-dot-js/"/>
    <updated>2012-05-18T15:07:00+00:00</updated>
    <id>https://robdodson.me/posts/backbone-boilerplate-playing-with-require-dot-js/</id>
    <content type="html"><![CDATA[
      <p>I want to keep playing with require.js and AMD modules today so I can really internalize the concepts around them. I’m going to go through the examples in <a href="http://requirejs.org/docs/api.html#jsfiles">the require documentation</a> starting with loading regular scripts and then defining modules and loading those.</p>
<p>Here is our boilerplate HTML. It’s a standard HTML5 file which just includes require.js at the bottom of the page.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token doctype">&lt;!DOCTYPE html></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">http-equiv</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>X-UA-Compatible<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>IE=edge,chrome=1<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>viewport<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>width=device-width,initial-scale=1<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Require.js Sandbox<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- Application styles --></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/assets/css/index.css<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- Main container --></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">role</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>main<span class="token punctuation">"</span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>main<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- Application source --></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/assets/js/libs/require.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>I’m also going to define a file called foo.js which will just console log “Hello World!”. To update our HTML we’ll add the following script tag after the call to include require.js</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">  <span class="token function">require</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'foo'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre>
<p>And as expected the console outputs ‘Hello World!’. Let’s step it up a notch and define a module. Our first module will just return an object literal <a href="http://requirejs.org/docs/api.html#defsimple">like in this example.</a> It will be a <code>Person</code> module with our name and city. We’ll place it in an <code>app</code> folder in the root of our project. So our stucture looks like this:</p>
<pre><code>index.html
|
|_ app/
  |
  |_ person.js
|
|_ assets/
  |
  |_ js/
    |
    |_ libs/
      |
      |_ require.js
</code></pre>
<p>The <code>Person</code> module just needs to implement a define function which takes an object as an argument. It looks like this:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">define</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  name<span class="token punctuation">:</span> <span class="token string">'Rob Dodson'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  city<span class="token punctuation">:</span> <span class="token string">'San Francisco'</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>And in our updated index.html we’re going to require that module.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token doctype">&lt;!DOCTYPE html></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">http-equiv</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>X-UA-Compatible<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>IE=edge,chrome=1<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>viewport<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>width=device-width,initial-scale=1<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Require.js Sandbox<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- Application styles --></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/assets/css/index.css<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- Main container --></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">role</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>main<span class="token punctuation">"</span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>main<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- Application source --></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/assets/js/libs/require.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">      <span class="token function">require</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'app/person'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">person</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>person<span class="token punctuation">.</span>name<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>person<span class="token punctuation">.</span>city<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br>    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>Opening up that page in the browser should give us the proper output in the console.</p>
<h3>AMD modules for dummies</h3>
<p>Let’s stop here for a moment to understand what’s going on. In one file we implemented a <code>define</code> function and in another place we implemented a <code>require</code> function. In the most basic sense this is all we really need to do to start using AMD. I think the concept of javascript modules is really weird for most folks but if you’re coming from a language like Java or Flash just think of define and require as two different interfaces that have to be implemented in order to recreate the <code>import</code> functionality that you’re used to. Require.js is going to make sure everything loads properly so long as we stick to this convention.</p>
<p>If you’re coming from more of a design background and you’re used to having one big javascript file think of these modules as a way to break off pieces of code which you might otherwise put into separate script files. And I’m not talking one or two script files, I’m talking like 20 or 30. You could try to manage loading all of those dependencies yourself but that will be challenging. If you are building a blog then this probably isn’t a big deal for you. In that case a few included js files is fine. But if you’re trying to build a responsive web app for mobile then you’re going to want to only load the bits of code you absolutely need. If a page doesn’t require 90% of your JS then don’t waste the time downloading it over a shitty AT&amp;T connection.</p>
<p>Ok let’s write a module that’s a bit more realistic. We’ll use a function to return our object so it’s kind of like a constructor.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token string">'use strict'</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function">define</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> estimated_age <span class="token operator">=</span> <span class="token number">99</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> spookySaying <span class="token operator">=</span> <span class="token string">'I vant to suck your blooood!'</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">return</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    name<span class="token punctuation">:</span> <span class="token string">'Dracula'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    home<span class="token punctuation">:</span> <span class="token string">'Florida'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    age<span class="token punctuation">:</span> estimated_age<span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function-variable function">saySomethingSpooky</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>spookySaying<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>This is a simple monster object. Notice that we build a variable called <code>estimated_age</code> right before defining our object literal. We then return this variable. If we ask for the monster’s age it will return this value. It’s worth noting that this makes the <code>estimated_age</code> variable private since it only lives in the scope of the anonymous function returning our object literal. We’ve also got a method, <code>saySomethingSpooky</code> which will print out another private variable <code>spookySaying</code>. Wow it’s <em>almost</em> the JavaScript classes I’ve always dreamed of! Before you go thinking that remember that modules are not instanceable, meaning, when you load in a module it works like a <a href="http://en.wikipedia.org/wiki/Singleton_pattern">Singleton</a> almost. You can’t go monster.new() all over the place… it just doesn’t work that way. Don’t get disouraged though, this is still pretty cool so let’s continue…</p>
<p>Next up is a module with dependencies. We’ll make the monster depend on his coffin.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token string">'use strict'</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function">define</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> color <span class="token operator">=</span> <span class="token string">'Blackest black'</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">return</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    color<span class="token punctuation">:</span> color<span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function-variable function">open</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'*creeeeeek*'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token punctuation">(</span><span class="token string">'use strict'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function">define</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'./coffin'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">coffin</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> estimated_age <span class="token operator">=</span> <span class="token number">99</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> spookySaying <span class="token operator">=</span> <span class="token string">'I vant to suck your blooood!'</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">return</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    name<span class="token punctuation">:</span> <span class="token string">'Dracula'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    home<span class="token punctuation">:</span> <span class="token string">'Florida'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    age<span class="token punctuation">:</span> estimated_age<span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function-variable function">saySomethingSpooky</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>spookySaying<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    <span class="token function-variable function">goToSleep</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Time for bed!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      coffin<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">data-main</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/assets/js/libs/require.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">  <span class="token function">require</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'app/monster'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">monster</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    monster<span class="token punctuation">.</span><span class="token function">saySomethingSpooky</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    monster<span class="token punctuation">.</span><span class="token function">goToSleep</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre>
<p>You can see that we’ve created a dependency for our monster, it has to load the coffin module before it’s ready to be loaded itself. Otherwise it won’t be able to run <code>goToSleep()</code> properly. Require.js will sort all of this out so long as we declare our dependencies as the first argument to the <code>define</code> function.</p>
<p>We aren’t limited to objects though, we can also return functions (which are objects in their own right). For instance if we wanted to define a helper module that greets people we could do something like this:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token string">'use strict'</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function">define</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">return</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">name</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">return</span> <span class="token string">'Why hello, '</span> <span class="token operator">+</span> name<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>then in our index we’ll just use the <code>greet</code> function as if it were globally available.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">require</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'app/greet'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">greet</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token function">greet</span><span class="token punctuation">(</span><span class="token string">'Rob'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>bear in mind that each module requires an http request to load it so you don’t want to go overboard defining helper function modules. Note the extra http request in the profiler which loads greet.js.</p>
<p>Ok that’s it for today. I’ll try to continue on Saturday!</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Getting Familiar with Backbone Boilerplate</title>
    <link href="https://robdodson.me/posts/getting-familiar-with-backbone-boilerplate/"/>
    <updated>2012-05-17T14:47:00+00:00</updated>
    <id>https://robdodson.me/posts/getting-familiar-with-backbone-boilerplate/</id>
    <content type="html"><![CDATA[
      <p>I have an upcoming project which uses <a href="http://documentcloud.github.com/backbone/">Backbone</a> and <a href="http://nodejs.org/">Node.js</a> so I thought it would be good to blog about the topics (particularly Backbone) for a while to make sure I’m well up to speed.</p>
<p>We’re using the <a href="https://github.com/tbranyen/backbone-boilerplate">Backbone Boilerplate</a> to get us started since it includes a bit of file structure and a build process. As they mention in the docs you have to install <a href="https://github.com/cowboy/grunt">Grunt</a> if you want to use the build process they’ve stubbed out. Grunt is a javascript build tool which uses Node (think Rake in JS).</p>
<p>As a refresher course I’m going to dig into the open-source <a href="http://addyosmani.github.com/backbone-fundamentals/">Backbone Fundamentals book</a> by <a href="http://addyosmani.github.com/backbone-fundamentals/">Addy Osmani</a>.</p>
<p>First thing’s first though, after we have nodejs and grunt installed we need to also install the bbb (backbone boilerplate build, I guess?) tool. You can <a href="https://github.com/backbone-boilerplate/grunt-bbb">grab it here.</a></p>
<p>We’ll create a new folder for our project and run <code>bbb init</code>. If all goes well it should stub out some project directories and files for us.</p>
<h3>The Backbone Boilerplate templates</h3>
<p>I’ll start with the index.html file. It seems like your standard HTML5 doc with the noteable exception that it includes <a href="http://requirejs.org/">require.js</a> at the bottom of the page.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token doctype">&lt;!DOCTYPE html></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">http-equiv</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>X-UA-Compatible<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>IE=edge,chrome=1<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>viewport<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>width=device-width,initial-scale=1<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>Backbone Boilerplate<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- Application styles --></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/assets/css/index.css<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- Main container --></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">role</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>main<span class="token punctuation">"</span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>main<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">&lt;!-- Application source --></span></span><br><span class="highlight-line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">data-main</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>app/config<span class="token punctuation">"</span></span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/assets/js/libs/require.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span><br><span class="highlight-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></span></code></pre>
<p>Require.js is a module and file loader which will help us manage our AMD modules. AMD (which stands for Asynchronous Module Definition) is a specification which details how to break JS down into modules that are loaded in, as needed, at runtime. <a href="http://addyosmani.com/writing-modular-js/">Again we turn to Addy Osmani for a good explanation.</a></p>
<p>If you notice this block:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token comment">&lt;!-- Application source --></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">data-main</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>app/config<span class="token punctuation">"</span></span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/assets/js/libs/require.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span></code></pre>
<p>the <code>data-main</code> attribute in the script tag is telling require.js what to load first. In this case it’s the <code>app/config.js</code> file. If you omit the <code>js</code> require will add it for you. If you add the <code>.js</code> require will respect the path exactly as it was given. This distinction seems kind of trivial here but later on when you start configuring require with baseUrls and whatnot, it becomes more important.</p>
<p>Let’s look at that confg file, shall we?</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token comment">// Set the require.js configuration for your application.</span></span><br><span class="highlight-line">require<span class="token punctuation">.</span><span class="token function">config</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token comment">// Initialize the application with the main application file</span></span><br><span class="highlight-line">  deps<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'main'</span><span class="token punctuation">]</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  paths<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token comment">// JavaScript folders</span></span><br><span class="highlight-line">    libs<span class="token punctuation">:</span> <span class="token string">'../assets/js/libs'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    plugins<span class="token punctuation">:</span> <span class="token string">'../assets/js/plugins'</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Libraries</span></span><br><span class="highlight-line">    jquery<span class="token punctuation">:</span> <span class="token string">'../assets/js/libs/jquery'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    underscore<span class="token punctuation">:</span> <span class="token string">'../assets/js/libs/underscore'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    backbone<span class="token punctuation">:</span> <span class="token string">'../assets/js/libs/backbone'</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token comment">// Shim Plugin</span></span><br><span class="highlight-line">    use<span class="token punctuation">:</span> <span class="token string">'../assets/js/plugins/use'</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  use<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    backbone<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      deps<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'use!underscore'</span><span class="token punctuation">,</span> <span class="token string">'jquery'</span><span class="token punctuation">]</span><span class="token punctuation">,</span></span><br><span class="highlight-line">      attach<span class="token punctuation">:</span> <span class="token string">'Backbone'</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    underscore<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      attach<span class="token punctuation">:</span> <span class="token string">'_'</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>One of the first things you can do with Require is to pass it a configuration object. The config object <a href="http://requirejs.org/docs/api.html#config">can be used for a ton of bootstrap options</a> like setting paths, requiring other scripts, setting timeouts, etc. The first option we see here is <code>deps: [&quot;main&quot;]</code>. We can infer this is telling require to load our main.js file first. But how does it get the path to main.js? From the docs we see that since we haven’t defined a <code>baseUrl</code> property require is using the path from our <code>data-main</code> attribute.</p>
<blockquote>
<p>If no baseUrl is explicitly set in the configuration, the default value will be the location of the HTML page that loads require.js. If a data-main attribute is used, that path will become the baseUrl.</p>
</blockquote>
<p>So we know that our baseUrl is <code>app/</code> and anything we require will be relative to that.</p>
<p>Next up we have this block:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">paths<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token comment">// JavaScript folders</span></span><br><span class="highlight-line">  libs<span class="token punctuation">:</span> <span class="token string">"../assets/js/libs"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  plugins<span class="token punctuation">:</span> <span class="token string">"../assets/js/plugins"</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Libraries</span></span><br><span class="highlight-line">  jquery<span class="token punctuation">:</span> <span class="token string">"../assets/js/libs/jquery"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  underscore<span class="token punctuation">:</span> <span class="token string">"../assets/js/libs/underscore"</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  backbone<span class="token punctuation">:</span> <span class="token string">"../assets/js/libs/backbone"</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token comment">// Shim Plugin</span></span><br><span class="highlight-line">  use<span class="token punctuation">:</span> <span class="token string">"../assets/js/plugins/use"</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">,</span></span></code></pre>
<p>The paths property defines paths relative to <code>baseUrl</code>. If we say</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">require</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'libs/module'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>require.js will look for this <code>libs</code> path and find it in our config file. Most of these make sense till we hit the last line which creates a path for the <code>use</code> plugin.</p>
<p><a href="http://tbranyen.com/post/amdrequirejs-shim-plugin-for-loading-incompatible-javascript">It seems like <code>use</code> was created by Tim Branyen, the author of the Backbone Boilerplate, to help with loading libraries that are non-AMD compliant.</a> Most of the big libraries are currently not AMD compliant (underscore and backbone itself) so this makes sense. So instead of creating a shim for each of those libraries the <code>use</code> plugin <em>should</em> take care of things for us. We can see how it’s used further in the config file:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">use<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  backbone<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    deps<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">"use!underscore"</span><span class="token punctuation">,</span> <span class="token string">"jquery"</span><span class="token punctuation">]</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    attach<span class="token punctuation">:</span> <span class="token string">"Backbone"</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  underscore<span class="token punctuation">:</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    attach<span class="token punctuation">:</span> <span class="token string">"_"</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>Let’s start at the bottom so we can see that underscore is defined and mapped to “_”. <code>attach</code> is going to take whatever library we’re defining and attach it to <code>window</code>. So underscore will be attached as <code>window._</code>. Next we see that backbone is defined and depends on our version of underscore and jquery. Since jquery is AMD compliant we don’t need the call to<code>use!</code>but we will need it for underscore. Finally backbone is attached to the window as<code>window.Backbone</code>.</p>
<p>That covers the configuration file. I’ll move on to main.js in the next post.</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Awake, Tired, Lazy</li>
<li>Sleep: 7</li>
<li>Hunger: 4</li>
<li>Coffee: 0</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Hacking the PATH variable in Sublime Text</title>
    <link href="https://robdodson.me/posts/hacking-the-path-variable-in-sublime-text/"/>
    <updated>2012-05-15T03:26:00+00:00</updated>
    <id>https://robdodson.me/posts/hacking-the-path-variable-in-sublime-text/</id>
    <content type="html"><![CDATA[
      <p>This is going to be a bit of a lightning post but I wanted to quickly show off how to edit the PATH variable that Sublime text uses. I should warn you that that I am neither an expert in Python nor am I a very seasoned Sublime user. So having said that take all of this with a grain of salt and use at your own risk.</p>
<h3>Our first (crappy) plugin!</h3>
<p>Sublime has a great plugin architecture that makes it extremely easy to add to the platform. If you create a <code>.py</code> file in the <code>~/Library/Application Support/Sublime Text 2/Packages/User/</code> folder it will be loaded as soon as Sublime starts. Writing plugins seems to be actually quite easy based on their <a href="http://www.sublimetext.com/docs/plugin-basics">documentation and examples.</a> We won’t be following the typical plugin architecture since we’re just trying to hack a system variable and that doesn’t seem to necessitate the use of their built in modules.</p>
<p>Here’s a script I’m calling <code>Pathway</code> at the moment.</p>
<pre class="language-python"><code class="language-python"><span class="highlight-line"><span class="token keyword">import</span> os</span><br><span class="highlight-line"></span><br><span class="highlight-line">LOCAL <span class="token operator">=</span> <span class="token string">'/usr/local/bin:/usr/local/sbin:'</span></span><br><span class="highlight-line">HOME <span class="token operator">=</span> <span class="token string">'/Users/Rob'</span>  <span class="token comment">### !!! REPLACE WITH YOUR HOME PATH !!! ###</span></span><br><span class="highlight-line">RVM <span class="token operator">=</span> HOME <span class="token operator">+</span> <span class="token string">'/.rvm/bin:'</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Sublime's default path is</span></span><br><span class="highlight-line"><span class="token comment"># /usr/bin:/bin:/usr/sbin:/sbin</span></span><br><span class="highlight-line">os<span class="token punctuation">.</span>environ<span class="token punctuation">[</span><span class="token string">'PATH'</span><span class="token punctuation">]</span> <span class="token operator">+=</span> <span class="token string">':'</span></span><br><span class="highlight-line">os<span class="token punctuation">.</span>environ<span class="token punctuation">[</span><span class="token string">'PATH'</span><span class="token punctuation">]</span> <span class="token operator">+=</span> LOCAL</span><br><span class="highlight-line">os<span class="token punctuation">.</span>environ<span class="token punctuation">[</span><span class="token string">'PATH'</span><span class="token punctuation">]</span> <span class="token operator">+=</span> RVM</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">print</span> <span class="token string">'PATH = '</span> <span class="token operator">+</span> os<span class="token punctuation">.</span>environ<span class="token punctuation">[</span><span class="token string">'PATH'</span><span class="token punctuation">]</span></span></code></pre>
<p>If you add this file to the Sublime user’s directory outlined above you should be able to hit cmd + ` to fire up the Sublime console which will print out our new PATH variable.</p>
<p>I would also recommend adding a shell plugin to Sublime. At the moment I use <a href="https://github.com/misfo/Shell-Turtlestein">Shell Turtlestein.</a>.</p>
<p>Now that I have my hacked path variable and my shell plugin I can check to see if RVM works. Using Shell Turtlestein you can hit <code>cmd-shift-c</code> to open a little console prompt. Typing <code>rvm current</code> returns our ruby version number and gemset. Nice! What’s even nicer is this means I can now run Rake tasks from inside of Sublime!</p>
<p>I should point out if all you want to do is run Rake or Ant then there are already plugins for that sort of thing. My main effort in doing all this is to try to integrate the command line with Sublime a bit better. If <em>anyone</em> knows how to simply tell Sublime to use the path in my .bash_profile or .bashrc then I would gladly use that approach instead. But after crawling the forums for a while it looks like this is still a common problem with no good solution.</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Happy, Peaceful, Hurried</li>
<li>Sleep: 7</li>
<li>Hunger: 6</li>
<li>Coffee: 0</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Pangrams in Ruby</title>
    <link href="https://robdodson.me/posts/pangrams-in-ruby/"/>
    <updated>2012-05-10T06:15:00+00:00</updated>
    <id>https://robdodson.me/posts/pangrams-in-ruby/</id>
    <content type="html"><![CDATA[
      <p>I’m a big fan of sites like <a href="http://www.rubyquiz.com/">RubyQuiz</a> and <a href="http://www.codeeval.com/">CodeEval</a>. In my opinion doing short puzzles and brain-teasers is a great way to explore a language. Here’s one such puzzle taken from CodeEval which asks that you devise a program to read in a file, parse each line and decide if it is a pangram or not.</p>
<blockquote>
<p>The sentence ‘A quick brown fox jumps over the lazy dog’ contains every single letter in the alphabet. Such sentences are called pangrams. You are to write a program, which takes a sentence, and returns all the letters it is missing (which prevent it from being a pangram). You should ignore the case of the letters in sentence, and your return should be all lower case letters, in alphabetical order. You should also ignore all non US-ASCII characters.In case the input sentence is already a pangram, print out the string NULL</p>
</blockquote>
<p>Here’s my first attempt. Hopefully I can come back to this post in a few weeks and try it again in a bit more elegant fashion :)</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token builtin">File</span><span class="token punctuation">.</span>open<span class="token punctuation">(</span><span class="token constant">ARGV</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span>each_line <span class="token keyword">do</span> <span class="token operator">|</span>line<span class="token operator">|</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  missing_letters <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">unless</span> line<span class="token punctuation">.</span>chomp<span class="token punctuation">.</span>empty<span class="token operator">?</span></span><br><span class="highlight-line">    line<span class="token punctuation">.</span>chomp<span class="token operator">!</span></span><br><span class="highlight-line">    line<span class="token punctuation">.</span>downcase<span class="token operator">!</span></span><br><span class="highlight-line">    <span class="token punctuation">(</span><span class="token string">'a'</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token string">'z'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token keyword">each</span> <span class="token keyword">do</span> <span class="token operator">|</span>l<span class="token operator">|</span></span><br><span class="highlight-line">      <span class="token keyword">if</span> line<span class="token punctuation">.</span>index<span class="token punctuation">(</span>l<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token keyword">nil</span><span class="token operator">?</span></span><br><span class="highlight-line">        missing_letters <span class="token operator">&lt;</span><span class="token operator">&lt;</span> l</span><br><span class="highlight-line">      <span class="token keyword">end</span></span><br><span class="highlight-line">    <span class="token keyword">end</span></span><br><span class="highlight-line">  <span class="token keyword">end</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">if</span> missing_letters<span class="token punctuation">.</span>empty<span class="token operator">?</span></span><br><span class="highlight-line">    puts <span class="token string">"NULL"</span></span><br><span class="highlight-line">  <span class="token keyword">else</span></span><br><span class="highlight-line">    puts missing_letters<span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">)</span></span><br><span class="highlight-line">  <span class="token keyword">end</span></span><br><span class="highlight-line"><span class="token keyword">end</span></span></code></pre>
<p>And here’s some input:</p>
<pre><code>A quick brown fox jumps over the lazy dog
A slow yellow fox crawls under the proactive dog
AbC
</code></pre>
<p>To run it from the command line you’ll need to pass in the path to the sentece file as an argument. Here’s what it would look like if <code>pangrams.rb</code> and <code>sentences.txt</code> were in the same folder:</p>
<pre><code>ruby pangrams.rb sentences.txt

# outputs...
NULL
bjkmqz
defghijklmnopqrstuvwxyz
</code></pre>
<p>Play around with this, throw some different sentence combinations at it to see what it spits out. Then try to write your own implementation. A good next step would be to modify the script so it can support empty lines in the text file.</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Building a Simple Scraper with Nokogiri in Ruby</title>
    <link href="https://robdodson.me/posts/building-a-simple-scraper-with-nokogiri-in-ruby/"/>
    <updated>2012-05-06T04:08:00+00:00</updated>
    <id>https://robdodson.me/posts/building-a-simple-scraper-with-nokogiri-in-ruby/</id>
    <content type="html"><![CDATA[
      <p>Since I’ve been talking so much about <a href="http://d3js.org/">D3.js</a> lately I thought it might be fun to start a little project which combines D3 and Ruby. The idea is to build a very simple page scraper that counts how often certain words are used in each post. I’ve also decided to start adding a little block of metadata at the end of each post so I can graph that over time as well.</p>
<p>So how do we get started? Well first we’ll need to build a page scraper of some kind. This program will have to consume the contents of an HTML page, find the node that contains our blog post and count up how often each word reoccurs. For right now that should be more than enough to get us started. We’ll look at grabbing the metadata and drawing graphs in future posts. I should point out that this idea was inspired by the wonderful site <a href="http://smarterware.org/5359/taking-on-the-750-words-march-challenge">750words.com</a> which creates <a href="http://smarterware.org/5359/taking-on-the-750-words-march-challenge">a beautiful exploration section</a> any time you write a new journal entry. Definitely check out that site, it’s amazing.</p>
<h3>Hello Noko</h3>
<p>I decided early on that I wanted the scraper to use <a href="http://nokogiri.org/">Nokogiri</a> because I’ve heard so much about it. As the authors describe it:</p>
<blockquote>
<p>Nokogiri (鋸) is an HTML, XML, SAX, and Reader parser. Among Nokogiri’s many features is the ability to search documents via XPath or CSS3 selectors.</p>
</blockquote>
<p>Using CSS selectors means that working with Nokogiri is a lot like working with jQuery. Here’s a quick demonstration:</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token keyword">require</span> <span class="token string">'open-uri'</span></span><br><span class="highlight-line"><span class="token keyword">require</span> <span class="token string">'nokogiri'</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">doc <span class="token operator">=</span> <span class="token constant">Nokogiri</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">HTML</span><span class="token punctuation">(</span>open<span class="token punctuation">(</span><span class="token string">'https://www.google.com/search?q=unicorns'</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">doc<span class="token punctuation">.</span>css<span class="token punctuation">(</span><span class="token string">'h3.r a'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token keyword">each</span> <span class="token keyword">do</span> <span class="token operator">|</span>link<span class="token operator">|</span></span><br><span class="highlight-line">  puts link<span class="token punctuation">.</span>content</span><br><span class="highlight-line"><span class="token keyword">end</span></span></code></pre>
<p>Easy enough, right? Taking it a step further let’s iterate over each element on the page and place them into a <code>Hash</code>.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token keyword">require</span> <span class="token string">'open-uri'</span></span><br><span class="highlight-line"><span class="token keyword">require</span> <span class="token string">'nokogiri'</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token variable">@counts</span> <span class="token operator">=</span> <span class="token builtin">Hash</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">def</span> <span class="token method-definition"><span class="token function">words_from_string</span></span><span class="token punctuation">(</span>string<span class="token punctuation">)</span></span><br><span class="highlight-line">  string<span class="token punctuation">.</span>downcase<span class="token punctuation">.</span>scan<span class="token punctuation">(</span><span class="token regex">/[\w']+/</span><span class="token punctuation">)</span></span><br><span class="highlight-line"><span class="token keyword">end</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">def</span> <span class="token method-definition"><span class="token function">count_frequency</span></span><span class="token punctuation">(</span>word_list<span class="token punctuation">)</span></span><br><span class="highlight-line">  <span class="token keyword">for</span> word <span class="token keyword">in</span> word_list</span><br><span class="highlight-line">    <span class="token variable">@counts</span><span class="token punctuation">[</span>word<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> <span class="token number">1</span></span><br><span class="highlight-line">  <span class="token keyword">end</span></span><br><span class="highlight-line">  <span class="token variable">@counts</span></span><br><span class="highlight-line"><span class="token keyword">end</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">doc <span class="token operator">=</span> <span class="token constant">Nokogiri</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">HTML</span><span class="token punctuation">(</span>open<span class="token punctuation">(</span><span class="token string">'http://robdodson.me'</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment">####</span></span><br><span class="highlight-line"><span class="token comment"># Search for nodes by css</span></span><br><span class="highlight-line">entries <span class="token operator">=</span> doc<span class="token punctuation">.</span>css<span class="token punctuation">(</span><span class="token string">'div.entry-content'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">puts <span class="token string">"Parsing <span class="token interpolation"><span class="token delimiter tag">#{</span>entries<span class="token punctuation">.</span>length<span class="token delimiter tag">}</span></span> entries"</span></span><br><span class="highlight-line">entries<span class="token punctuation">.</span><span class="token keyword">each</span> <span class="token keyword">do</span> <span class="token operator">|</span>entry<span class="token operator">|</span></span><br><span class="highlight-line">  words <span class="token operator">=</span> words_from_string<span class="token punctuation">(</span>entry<span class="token punctuation">.</span>content<span class="token punctuation">)</span></span><br><span class="highlight-line">  count_frequency<span class="token punctuation">(</span>words<span class="token punctuation">)</span></span><br><span class="highlight-line"><span class="token keyword">end</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">sorted  <span class="token operator">=</span> <span class="token variable">@counts</span><span class="token punctuation">.</span>sort_by <span class="token punctuation">{</span> <span class="token operator">|</span>word<span class="token punctuation">,</span> count<span class="token operator">|</span> count <span class="token punctuation">}</span></span><br><span class="highlight-line">puts sorted<span class="token punctuation">.</span>map <span class="token punctuation">{</span> <span class="token operator">|</span>word<span class="token punctuation">,</span> count<span class="token operator">|</span> <span class="token string">"<span class="token interpolation"><span class="token delimiter tag">#{</span>word<span class="token delimiter tag">}</span></span>: <span class="token interpolation"><span class="token delimiter tag">#{</span>count<span class="token delimiter tag">}</span></span>"</span><span class="token punctuation">}</span></span></code></pre>
<p>The output from this script should look (kind of) like this:</p>
<pre><code>...
ruby: 66
rvm: 66
our: 68
can: 71
3: 75
if: 77
for: 82
your: 88
2: 88
is: 91
this: 91
s: 94
we: 95
that: 106
i: 118
in: 119
it: 125
1: 128
and: 149
of: 170
a: 231
you: 233
to: 342
the: 382
</code></pre>
<p>It looks like our regex could use a bit of work so it doesn’t grab singular letters like ‘s’ or numbers, but it’s definitely a good start. Tomorrow we’ll put everything into a <code>Module</code> and back it with tests.</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<ul>
<li>Mood: Relaxed, Tired</li>
<li>Sleep: 6.5</li>
<li>Hunger: 5</li>
<li>Coffee: 1</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>D3 Basics: The Linear Scale</title>
    <link href="https://robdodson.me/posts/d3-basics-the-linear-scale/"/>
    <updated>2012-05-04T14:21:00+00:00</updated>
    <id>https://robdodson.me/posts/d3-basics-the-linear-scale/</id>
    <content type="html"><![CDATA[
      <h2>Heads up!</h2>
<p>I wrote this post a few years ago when I was on Octopress. The code no longer works now that I’ve migrated to Ghost, but I’m keeping the post up in case any of it is useful for those who come along after – Rob</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token punctuation">.</span>chart <span class="token punctuation">{</span></span><br><span class="highlight-line">  font<span class="token operator">-</span>family<span class="token punctuation">:</span> Arial<span class="token punctuation">,</span> sans<span class="token operator">-</span>serif<span class="token punctuation">;</span></span><br><span class="highlight-line">  font<span class="token operator">-</span>size<span class="token punctuation">:</span> <span class="token number">10</span>px<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token punctuation">.</span>bar <span class="token punctuation">{</span></span><br><span class="highlight-line">  fill<span class="token punctuation">:</span> steelblue<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token punctuation">.</span>axis path<span class="token punctuation">,</span> <span class="token punctuation">.</span>axis line <span class="token punctuation">{</span></span><br><span class="highlight-line">  fill<span class="token punctuation">:</span> none<span class="token punctuation">;</span></span><br><span class="highlight-line">  stroke<span class="token punctuation">:</span> #<span class="token number">000</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  shape<span class="token operator">-</span>rendering<span class="token punctuation">:</span> crispEdges<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token punctuation">.</span>label <span class="token punctuation">{</span></span><br><span class="highlight-line">  font<span class="token operator">-</span>size<span class="token punctuation">:</span> <span class="token number">12</span> px<span class="token punctuation">;</span></span><br><span class="highlight-line">  fill<span class="token punctuation">:</span> #<span class="token constant">FFF</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token punctuation">.</span>point <span class="token punctuation">{</span></span><br><span class="highlight-line">  stroke<span class="token punctuation">:</span> #<span class="token number">666</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  fill<span class="token punctuation">:</span> red<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>In <a href="http://localhost:4000/blog/2012/05/03/d3-basics-an-introduction-to-scales/">the last post</a> we did a basic introduction to the concept of scales in <a href="http://d3js.org/">D3.js</a>. Today we’ll look at our first scale and write some code to visualize it.</p>
<h3>Linear Scales</h3>
<p>The most basic scale in D3 is the <code>linear scale</code> which maps a continous <code>domain</code> to an output range. To define a linear domain we’ll need to first come up with a data set. Fibonacci numbers work well, so let’s declare a variable <code>data</code> like so:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> data <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span></code></pre>
<p>The data set will represent our scale’s input domain. The next step is defining an output range. Since we’re going to be graphing these numbers we want our range to represent screen coordinates. Let’s go ahead and declare a <code>width</code> and a <code>height</code> variable and set them to 320 by 150.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> width <span class="token operator">=</span> <span class="token number">320</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  height <span class="token operator">=</span> <span class="token number">150</span><span class="token punctuation">;</span></span></code></pre>
<p>We now have everything we need to create our first scale.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> x <span class="token operator">=</span> d3<span class="token punctuation">.</span>scale</span><br><span class="highlight-line">  <span class="token punctuation">.</span><span class="token function">linear</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><br><span class="highlight-line">  <span class="token punctuation">.</span><span class="token function">domain</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> d3<span class="token punctuation">.</span><span class="token function">max</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span><br><span class="highlight-line">  <span class="token punctuation">.</span><span class="token function">range</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> width<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>D3 methods often return a value of <code>self</code> meaning you can chain method calls onto one another. If you’re used to jQuery this should be a common idiom for you. You’ll notice that both the domain and the range functions accept arrays as parameters. Typically the domain only receives two values, the minimum and maximum of our data set. Likewise the range will be given the minimum and maximum of our output space. You could pass in multiple values to create a polylinear scale but that’s outside the scope of our dicussion today.</p>
<p>In the domain function we’re using a helper called <code>d3.max</code>. Similar to <code>Math.max</code>, it looks at our data set and figures out what is the largest value. While <code>Math.max</code> only works on two numbers, <code>d3.max</code> will iterate over an entire <code>Array</code> for us.</p>
<p>If you’ve been following along in your own file you should be able to open your console and type <code>x(8)</code> to get 300.</p>
<p>With just this information alone we have enough to build our first graph.</p>
<p>Fibonacci Sequence Chart 1.0</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> data <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> width <span class="token operator">=</span> <span class="token number">320</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token keyword">var</span> height <span class="token operator">=</span> <span class="token number">150</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">var</span> x <span class="token operator">=</span> d3<span class="token punctuation">.</span>scale</span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">linear</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">domain</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> d3<span class="token punctuation">.</span><span class="token function">max</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">range</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> width<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">var</span> svg <span class="token operator">=</span> d3</span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token string">'#linear-scale-chart-1'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">'svg'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'width'</span><span class="token punctuation">,</span> width<span class="token punctuation">)</span></span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'height'</span><span class="token punctuation">,</span> height<span class="token punctuation">)</span></span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">,</span> <span class="token string">'chart'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  svg</span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">selectAll</span><span class="token punctuation">(</span><span class="token string">'.chart'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">data</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span></span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">enter</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">'rect'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">,</span> <span class="token string">'bar'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">    <span class="token comment">//.attr('y', function(d, i) { return i * 20 })</span></span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'y'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">d<span class="token punctuation">,</span> i</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">return</span> i <span class="token operator">*</span> <span class="token number">20</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span></span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'width'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">d</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token keyword">return</span> <span class="token function">x</span><span class="token punctuation">(</span>d<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span></span><br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'height'</span><span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> data <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token keyword">var</span> width <span class="token operator">=</span> <span class="token number">320</span></span><br><span class="highlight-line">    height <span class="token operator">=</span> <span class="token number">150</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> x <span class="token operator">=</span> d3<span class="token punctuation">.</span>scale<span class="token punctuation">.</span><span class="token function">linear</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">domain</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> d3<span class="token punctuation">.</span><span class="token function">max</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">range</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> width<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> svg <span class="token operator">=</span> d3<span class="token punctuation">.</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token string">'body'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">'svg'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'width'</span><span class="token punctuation">,</span> width<span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'height'</span><span class="token punctuation">,</span> height<span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">,</span> <span class="token string">'chart'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">svg<span class="token punctuation">.</span><span class="token function">selectAll</span><span class="token punctuation">(</span><span class="token string">'.chart'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">data</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">enter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">'rect'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">,</span> <span class="token string">'bar'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'y'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">d<span class="token punctuation">,</span> i</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> i <span class="token operator">*</span> <span class="token number">20</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'width'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">d</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">x</span><span class="token punctuation">(</span>d<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'height'</span><span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="token template-string"><span class="token string">``</span></span><span class="token template-string"><span class="token string">`<br><span class="highlight-line"></span><br>`</span></span><span class="token template-string"><span class="token string">``</span></span>css<br><span class="highlight-line"><span class="token punctuation">.</span>chart <span class="token punctuation">{</span></span><br><span class="highlight-line">  font<span class="token operator">-</span>family<span class="token punctuation">:</span> Arial<span class="token punctuation">,</span> sans<span class="token operator">-</span>serif<span class="token punctuation">;</span></span><br><span class="highlight-line">  font<span class="token operator">-</span>size<span class="token punctuation">:</span> <span class="token number">10</span>px<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token punctuation">.</span>bar <span class="token punctuation">{</span></span><br><span class="highlight-line">  fill<span class="token punctuation">:</span> steelblue<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="token template-string"><span class="token string">``</span></span><span class="token template-string"><span class="token string">`<br><span class="highlight-line"></span><br><span class="highlight-line">### Break It Down</span><br><span class="highlight-line"></span><br><span class="highlight-line">Let's go through the JavaScript piece by piece to outline what happened.</span><br><span class="highlight-line"></span><br>`</span></span><span class="token template-string"><span class="token string">``</span></span>js<br><span class="highlight-line"><span class="token keyword">var</span> data <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token keyword">var</span> width <span class="token operator">=</span> <span class="token number">320</span></span><br><span class="highlight-line">    height <span class="token operator">=</span> <span class="token number">150</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> x <span class="token operator">=</span> d3<span class="token punctuation">.</span>scale<span class="token punctuation">.</span><span class="token function">linear</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">domain</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> d3<span class="token punctuation">.</span><span class="token function">max</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">range</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> width<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="token template-string"><span class="token string">``</span></span><span class="token template-string"><span class="token string">`<br><span class="highlight-line"></span><br><span class="highlight-line">The first block should be pretty familar at this point. We've declared our Fibonacci data, our explicit width and height and defined our scale. Nothing new here.</span><br><span class="highlight-line"></span><br>`</span></span><span class="token template-string"><span class="token string">``</span></span>js<br><span class="highlight-line"><span class="token keyword">var</span> svg <span class="token operator">=</span> d3<span class="token punctuation">.</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token string">'body'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">'svg'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'width'</span><span class="token punctuation">,</span> width<span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'height'</span><span class="token punctuation">,</span> height<span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">,</span> <span class="token string">'chart'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="token template-string"><span class="token string">``</span></span><span class="token template-string"><span class="token string">`<br><span class="highlight-line"></span><br><span class="highlight-line">In the next section we're declaring our `</span></span><span class="token constant">SVG</span><span class="token template-string"><span class="token string">` element. We use a D3 selection to grab the `</span></span>body<span class="token template-string"><span class="token string">` tag and we append an `</span></span>svg<span class="token template-string"><span class="token string">` tag onto it. Since D3 uses method-chaining we can keep assigning attributes to our SVG element. We declare the width and the height to match the explicit values set earlier and finally we give it a class name of `</span></span>chart<span class="token template-string"><span class="token string">`.</span><br><span class="highlight-line"></span><br>`</span></span><span class="token template-string"><span class="token string">``</span></span>js<br><span class="highlight-line">svg<span class="token punctuation">.</span><span class="token function">selectAll</span><span class="token punctuation">(</span><span class="token string">'.chart'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">data</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">enter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">'rect'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">,</span> <span class="token string">'bar'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'y'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">d<span class="token punctuation">,</span> i</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> i <span class="token operator">*</span> <span class="token number">20</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'width'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">d</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">x</span><span class="token punctuation">(</span>d<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'height'</span><span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="token template-string"><span class="token string">``</span></span><span class="token template-string"><span class="token string">`<br><span class="highlight-line"></span><br><span class="highlight-line">This last section is where it all ties together. Since we stored our SVG element in a variable called `</span></span>svg<span class="token template-string"><span class="token string">` we're able to easily reference it again. We instruct D3 to create a `</span></span>join<span class="token template-string"><span class="token string">` by calling the `</span></span>data<span class="token template-string"><span class="token string">` method and passing in our `</span></span>Array<span class="token template-string"><span class="token string">` of values. When D3 performs a join it steps through each element in the array and attempts to match it to a figure that already exists on the page. If nothing exists it will call the `</span></span>enter<span class="token template-string"><span class="token string">` function. At this point it steps through the array again, passing the values to us so we can define new shapes. [For a much more in-depth explanation of joins refer back to this article.](http://bost.ocks.org/mike/join/)</span><br><span class="highlight-line"></span><br><span class="highlight-line">In our case we're appending SVG `</span></span>Rects<span class="token template-string"><span class="token string">` but it could just as easily be circles or other shapes. We give each rect a class of `</span></span>bar<span class="token template-string"><span class="token string">` so we can style it with CSS. When we declare the `</span></span>y<span class="token template-string"><span class="token string">` attribute instead of using an explicit value we create an `</span></span>accessor<span class="token template-string"><span class="token string">`, a little helper function which takes a piece of data and an optional index as its arguments. In this case `</span></span>d<span class="token template-string"><span class="token string">` will equal subsequent elements in our data array and `</span></span>i<span class="token template-string"><span class="token string">` will equal their indices. For a much clearer picture of what's happening you can change it to read:</span><br><span class="highlight-line"></span><br>`</span></span><span class="token template-string"><span class="token string">``</span></span>js<br><span class="highlight-line">    <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'y'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">d<span class="token punctuation">,</span> i</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'d = data['</span> <span class="token operator">+</span> i <span class="token operator">+</span> <span class="token string">'] = '</span><span class="token punctuation">,</span> d<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> i <span class="token operator">*</span> <span class="token number">20</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></span><br><span class="token template-string"><span class="token string">``</span></span><span class="token template-string"><span class="token string">`<br><span class="highlight-line"></span><br><span class="highlight-line">which will give you the following output.</span><br><span class="highlight-line"></span><br>`</span></span><span class="token template-string"><span class="token string">``</span></span>js<br><span class="highlight-line">d <span class="token operator">=</span> data<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span></span><br><span class="highlight-line">d <span class="token operator">=</span> data<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span></span><br><span class="highlight-line">d <span class="token operator">=</span> data<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">2</span></span><br><span class="highlight-line">d <span class="token operator">=</span> data<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">3</span></span><br><span class="highlight-line">d <span class="token operator">=</span> data<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">5</span></span><br><span class="highlight-line">d <span class="token operator">=</span> data<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">8</span></span><br><span class="token template-string"><span class="token string">``</span></span><span class="token template-string"><span class="token string">`<br><span class="highlight-line"></span><br><span class="highlight-line">Since we're just trying to space out our bars along the y-axis we don't really care about the value of `</span></span>d<span class="token template-string"><span class="token string">`. Instead we'll use the index, `</span></span>i<span class="token template-string"><span class="token string">`, to offset each bar by a value of i \* 20.</span><br><span class="highlight-line"></span><br><span class="highlight-line">In the last two lines we're going to finally use our linear scale to define our bar's width. Here they are again as a refresher.</span><br><span class="highlight-line"></span><br>`</span></span><span class="token template-string"><span class="token string">``</span></span>js<br><span class="highlight-line"><span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'width'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">d</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">x</span><span class="token punctuation">(</span>d<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></span><br><span class="highlight-line"><span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'height'</span><span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token template-string"><span class="token string">``</span></span>`</span><br><span class="highlight-line"></span><br><span class="highlight-line">As each element <span class="token keyword">of</span> the array is passed to our width accessor it's run through the scale and the output returned<span class="token punctuation">.</span> Since <span class="token number">8</span> is our maximum value it should extend all the way to the end <span class="token keyword">of</span> our range<span class="token punctuation">.</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">The final call is just an explicit height <span class="token keyword">for</span> each bar<span class="token punctuation">.</span> Depending on the scale <span class="token keyword">this</span> bit can be automated but <span class="token keyword">for</span> simplicity sake we'll just use a hard coded value so we can <span class="token keyword">get</span> something on screen<span class="token punctuation">.</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">### Conclusion</span><br><span class="highlight-line"></span><br><span class="highlight-line">Now that we<span class="token string">'ve got one scale under our belt the others should be pretty easy to digest. Over the next couple of posts we'</span>ll focus on ordinal scales followed by time scales<span class="token punctuation">.</span> Stay tuned and ping me <span class="token keyword">if</span> you have any questions<span class="token punctuation">.</span> Thanks<span class="token operator">!</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">You should follow me on Twitter <span class="token punctuation">[</span>here<span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">(</span>http<span class="token punctuation">:</span><span class="token operator">/</span><span class="token operator">/</span>twitter<span class="token punctuation">.</span>com<span class="token operator">/</span>rob_dodson<span class="token punctuation">)</span></span></code></pre>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>D3 Basics: An Introduction To Scales</title>
    <link href="https://robdodson.me/posts/d3-basics-an-introduction-to-scales/"/>
    <updated>2012-05-03T17:04:00+00:00</updated>
    <id>https://robdodson.me/posts/d3-basics-an-introduction-to-scales/</id>
    <content type="html"><![CDATA[
      <h2>Heads up!</h2>
<p>I wrote this post a few years ago when I was on Octopress. The code no longer works now that I’ve migrated to Ghost, but I’m keeping the post up in case any of it is useful for those who come along after – Rob</p>
<pre class="language-css"><code class="language-css"><span class="highlight-line"><span class="token selector">.chart</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">font-family</span><span class="token punctuation">:</span> Arial<span class="token punctuation">,</span> sans-serif<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">font-size</span><span class="token punctuation">:</span> 10px<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">.bar</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">fill</span><span class="token punctuation">:</span> steelblue<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="token selector">.axis path,<br>.axis line</span> <span class="token punctuation">{</span><br><span class="highlight-line">  <span class="token property">fill</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">stroke</span><span class="token punctuation">:</span> #000<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">shape-rendering</span><span class="token punctuation">:</span> crispEdges<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> data <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> margin <span class="token operator">=</span> <span class="token punctuation">{</span> top<span class="token punctuation">:</span> <span class="token number">40</span><span class="token punctuation">,</span> right<span class="token punctuation">:</span> <span class="token number">40</span><span class="token punctuation">,</span> bottom<span class="token punctuation">:</span> <span class="token number">40</span><span class="token punctuation">,</span> left<span class="token punctuation">:</span> <span class="token number">40</span> <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  width <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'.entry-content'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  height <span class="token operator">=</span> <span class="token number">300</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function">$</span><span class="token punctuation">(</span>window<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">resize</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  width <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'.entry-content'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>After selections, scales are probably the most frequently used element in D3 because they faciliate such great control over data and screen space. I want to spend several posts documenting how scales work to help out anyone who is struggling with the concept. We’ll start with a high level overview of what a scale is in D3 and then explore the individual objects to learn their nuances.</p>
<h3>What Are D3 Scales?</h3>
<p>Essentially a scale is a convenience function for mapping input data to an output range, typically x/y positions or width/height. Scales can also be used to link data to arbitrary values like categories or days of the week, or to quantize data into “buckets”.</p>
<p>There are two universal properties for any scale: the <code>domain</code> and the <code>range</code>. The <code>domain</code> serves as the input for your graph while the <code>range</code> represents the output.</p>
<h4>Domain</h4>
<p>Since the <code>domain</code> corresponds to our graph’s input it can be either <em>continuous</em> or <em>discrete</em>. You might think of a continous data set as any number from 1 to infinity while a discrete set would be every <code>Date</code> from January 1, 2012 to January 10, 2012. The takeaway is that continous data is essentially unbounded and discrete data is finite and easily quantified.</p>
<h4>Range</h4>
<p>The <code>range</code> defines the potential output that the scale can generate. Values from the domain are mapped to values in the range. Let’s look at two examples to help clarify.</p>
<p>Say you have an <em>identity scale</em>, meaning whatever value you use for input will also be returned as the output. We’ll call the scale <code>x</code>. If <code>x</code> has an input <code>domain</code> of 0 - 100 and an output <code>range</code> of 0 - 100, then your <code>scale of 1</code> will be 1. Your <code>scale of 50</code> will be 50. Here’s another way to write it:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">x</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// returns 50</span></span></code></pre>
<p>Now let’s change the scale a bit. Let’s say that <code>x</code> still has an input <code>domain</code> of 0 - 100 but now it has an output <code>range</code> of <code>0 - 10</code>. What do you think our <code>scale of 50</code> will return? … If you guessed 5 then you are the smart! Because we limited our potential output down to any number between 0 and 10 it narrowed the mapping from our <code>domain</code> to our <code>range</code>. Being able to expand or contract this mapping is the main value in using a D3 scale. If it’s still not quite sinking in check out this great visual from <a href="http://www.jeromecukier.net/">Jerome Cukier</a> (<a href="https://twitter.com/#!/jcukier">@jcukier</a>).</p>
<p><img src="/images/2014/12/d3scale1.png" alt="An example of how scales work"></p>
<p>Jerome has <a href="http://www.jeromecukier.net/blog/2011/08/11/d3-scales-and-color/">an excelent blog post</a> covering scales in D3 which inspired me to write my own post. Definitely read his as well! I feel like a great way to learn something is to not only read about it a bunch but to write about it. Hearing different views on the same topic often helps me solidify a concept.</p>
<h3>Class Work Time</h3>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> x <span class="token operator">=</span> d3<span class="token punctuation">.</span>scale<span class="token punctuation">.</span><span class="token function">linear</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">domain</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">range</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>I’ve included <code>d3</code> on the page so you can play around with it. Go ahead, bust open your developer tools or firebug and type <code>d3</code> into the console. It should return an Object full of methods.</p>
<p>Let’s do some experiments with our <code>x</code> scale from earlier. Type the following to see what you get.</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">x</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token function">x</span><span class="token punctuation">(</span><span class="token number">25</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token function">x</span><span class="token punctuation">(</span><span class="token number">99</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token function">x</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>In D3 a scale is both a <code>Function</code> and an <code>Object</code>. You can invoke a scale by using parenthesis: <code>x(100)</code> or you can set a property to change its behavior: <code>x.range([0, 1000])</code>. Let’s try that! In the console type:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line">x<span class="token punctuation">.</span><span class="token function">range</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1000</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Our scale’s range used to be 0 - 10. Now that we’ve changed it to 0 - 1000, what do you think <code>x(100)</code> will equal? Keep in mind that 100 is the highest value in our domain. If you’re not sure try it in the console. Actually try it in the console regardless of how sure you are! The console is cool as shit!</p>
<h3>To Be Continued…</h3>
<p>Scales are a huge topic so we’ll stop here for now. In the next post we’ll talk about <code>linear</code>, <code>time</code> and <code>ordinal</code> scales; once you’ve mastered them everything else becomes a lot easier. Stay tuned :)</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>D3.js and Octopress</title>
    <link href="https://robdodson.me/posts/d3-js-and-octopress/"/>
    <updated>2012-05-02T14:20:00+00:00</updated>
    <id>https://robdodson.me/posts/d3-js-and-octopress/</id>
    <content type="html"><![CDATA[
      <h2>Heads up!</h2>
<p>I wrote this post a few years ago when I was on Octopress. The code no longer works now that I’ve migrated to Ghost, but I’m keeping the post up in case any of it is useful for those who come along after – Rob</p>
<pre class="language-css"><code class="language-css"><span class="highlight-line"><span class="token selector">.chart</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">font-family</span><span class="token punctuation">:</span> Arial<span class="token punctuation">,</span> sans-serif<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">font-size</span><span class="token punctuation">:</span> 10px<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token selector">.bar</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token property">fill</span><span class="token punctuation">:</span> steelblue<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="token selector">.axis path,<br>.axis line</span> <span class="token punctuation">{</span><br><span class="highlight-line">  <span class="token property">fill</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">stroke</span><span class="token punctuation">:</span> #000<span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token property">shape-rendering</span><span class="token punctuation">:</span> crispEdges<span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> data <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token keyword">var</span> margin <span class="token operator">=</span> <span class="token punctuation">{</span> top<span class="token punctuation">:</span> <span class="token number">40</span><span class="token punctuation">,</span> right<span class="token punctuation">:</span> <span class="token number">40</span><span class="token punctuation">,</span> bottom<span class="token punctuation">:</span> <span class="token number">40</span><span class="token punctuation">,</span> left<span class="token punctuation">:</span> <span class="token number">40</span> <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  width <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'.entry-content'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">  height <span class="token operator">=</span> <span class="token number">300</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token function">$</span><span class="token punctuation">(</span>window<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">resize</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  width <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'.entry-content'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>This morning I was hoping to cover some of the basics of using D3.js. Along the way I realized I really wanted people to be able to see the graphs on the blog itself. I <em>could</em> have used JSFiddle, but I didn’t like all that chrome repeated across the page. So I came up with my own solution with a little bit of hacking :)</p>
<p>I’ll have to save the basics for tomorrow since I’ve already spent way too much time just getting this setup. But I will offer a brief explanation of D3 and how I got it working on Octopress.</p>
<h3>What is D3.js?</h3>
<p>D3 (formerly Protovis) is a library written by <a href="http://bost.ocks.org/mike/">Mike Bostock</a> (<a href="https://twitter.com/#!/mbostock">@mbostock</a>) which allows you to easily manipulate a DOM using data sets. While the implications of that statement are somewhat vague, D3 is generally used for doing data visualizations primarily in SVG. D3 can also work with regular DOM nodes however SVG is often the best tool to use if you’re trying to draw a graph of some kind.</p>
<p>As a quick demo, here’s a bar chart which visualizes an <code>Array</code> of Fibonacci numbers: <code>[1, 1, 2, 3, 5, 8]</code></p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  <span class="token keyword">function</span> <span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#chart-1'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token keyword">var</span> x <span class="token operator">=</span> d3<span class="token punctuation">.</span>scale</span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">linear</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">domain</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> d3<span class="token punctuation">.</span><span class="token function">max</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">range</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> width <span class="token operator">-</span> margin<span class="token punctuation">.</span>left <span class="token operator">-</span> margin<span class="token punctuation">.</span>right<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token keyword">var</span> y <span class="token operator">=</span> d3<span class="token punctuation">.</span>scale</span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">ordinal</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">domain</span><span class="token punctuation">(</span>d3<span class="token punctuation">.</span><span class="token function">range</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">rangeRoundBands</span><span class="token punctuation">(</span><span class="token punctuation">[</span>height <span class="token operator">-</span> margin<span class="token punctuation">.</span>top <span class="token operator">-</span> margin<span class="token punctuation">.</span>bottom<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">0.2</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token keyword">var</span> xAxis <span class="token operator">=</span> d3<span class="token punctuation">.</span>svg<span class="token punctuation">.</span><span class="token function">axis</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">scale</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">orient</span><span class="token punctuation">(</span><span class="token string">'bottom'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">tickPadding</span><span class="token punctuation">(</span><span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token keyword">var</span> yAxis <span class="token operator">=</span> d3<span class="token punctuation">.</span>svg</span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">axis</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">scale</span><span class="token punctuation">(</span>y<span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">orient</span><span class="token punctuation">(</span><span class="token string">'left'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">tickPadding</span><span class="token punctuation">(</span><span class="token number">8</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">tickSize</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token keyword">var</span> svg <span class="token operator">=</span> d3</span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token string">'#chart-1'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">'svg'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'width'</span><span class="token punctuation">,</span> width<span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'height'</span><span class="token punctuation">,</span> height<span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">,</span> <span class="token string">'chart'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">'g'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'transform'</span><span class="token punctuation">,</span> <span class="token string">'translate('</span> <span class="token operator">+</span> margin<span class="token punctuation">.</span>left <span class="token operator">+</span> <span class="token string">', '</span> <span class="token operator">+</span> margin<span class="token punctuation">.</span>top <span class="token operator">+</span> <span class="token string">')'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    svg</span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">selectAll</span><span class="token punctuation">(</span><span class="token string">'.chart'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">data</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">enter</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">'rect'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">,</span> <span class="token string">'bar'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'y'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">d<span class="token punctuation">,</span> i</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token keyword">return</span> <span class="token function">y</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'width'</span><span class="token punctuation">,</span> x<span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'height'</span><span class="token punctuation">,</span> y<span class="token punctuation">.</span><span class="token function">rangeBand</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    svg</span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">'g'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">,</span> <span class="token string">'x axis'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'transform'</span><span class="token punctuation">,</span> <span class="token string">'translate(0, '</span> <span class="token operator">+</span> y<span class="token punctuation">.</span><span class="token function">rangeExtent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token string">')'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>xAxis<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    svg</span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">'g'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">,</span> <span class="token string">'y axis'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>yAxis<span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">selectAll</span><span class="token punctuation">(</span><span class="token string">'text'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">      <span class="token punctuation">.</span><span class="token function">text</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">d</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">        <span class="token keyword">return</span> String<span class="token punctuation">.</span><span class="token function">fromCharCode</span><span class="token punctuation">(</span>d <span class="token operator">+</span> <span class="token number">65</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span></span><br><span class="highlight-line">  <span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token function">$</span><span class="token punctuation">(</span>window<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">resize</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Break open your developer tools and inspect the graph above. You’ll notice that it’s just SVG elements. For many the 2 best aspects of D3 are 1) That it works with regular SVG elements and 2) That it doesn’t wrap that functionality in arbitrary objects which require a lot of configuration. This second aspect is where many graphing libraries fall short. As Justin Palmer (<a href="https://twitter.com/#!/caged">@Caged</a>) <a href="http://dealloc.me/2011/06/24/d3-is-not-a-graphing-library.html">points out on his blog</a>:</p>
<blockquote>
<p>As long as you stay within the confines of the template, it’s simple, but, anytime you want customize a specific aspect of the original template, more configuration options are added to the library. You should avoid “design by configuration.”</p>
</blockquote>
<p>D3 handles this by dumping the idea of templated visuals. There is no <code>makeBarGraph()</code> function in D3; instead you work directly with your data and the SVG elements. Essentially what you see is what you get, which can make the initial learning curve pretty steep. But because it’s so non-prescriptive you can build just about anything with it.</p>
<h3>How do you integrate D3 and Octopress?</h3>
<p>Since I want to write several more posts on D3 I figured it’d be good if I setup my own little system to help me generate most of the boilerplate. If you’re lazy and want to skip to the end <a href="https://github.com/robdodson/octopress-templates">here’s a link to the template.</a></p>
<h4>Requiring D3</h4>
<p>If you inspect the page you’ll see that starting at the top of this post I’m requiring d3.js. There’s a good chance I’ll move that over into the site’s header so it isn’t required every time but if you’re just doing a one off then that should be fine. Normally it’s a good idea to require your javascript at the end of your page but I want to wrap all of my graphs in self-executing functions so they can seal their scope (and also because I’m lazy and want to use the same boilerplate stub code in each). As a result if you don’t require d3 before the functions execute it’ll throw an error.</p>
<p>I chose to put a copy of d3 into my Octopress <code>source/javascripts</code> so it would get compiled with the rest of my assets and deployed. If you’d prefer you can also grab D3 from the site.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://d3js.org/d3.v2.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></span></code></pre>
<h4>Adding the CSS</h4>
<p>The next step is to add some CSS. Getting a <code>style</code> tag into the post ended up being trickier than I had first thought because Markdown strips out <code>style</code> tags. As a result every time I generate the site the CSS dissapears. The work around is to wrap the <code>style</code> tag in a <code>div</code> and put that at the top of the post.</p>
<p>Here are the basic styles I’m using:</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">></span></span></span><br>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>text/css<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"><br><span class="highlight-line">    <span class="token selector">.chart</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token property">font-family</span><span class="token punctuation">:</span> Arial<span class="token punctuation">,</span> sans-serif<span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token property">font-size</span><span class="token punctuation">:</span> 10px<span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token property">margin-top</span><span class="token punctuation">:</span> -40px<span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token selector">.bar</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token property">fill</span><span class="token punctuation">:</span> steelblue<span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br>    <span class="token selector">.axis path,<br>    .axis line</span> <span class="token punctuation">{</span><br><span class="highlight-line">      <span class="token property">fill</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token property">stroke</span><span class="token punctuation">:</span> #000<span class="token punctuation">;</span></span><br><span class="highlight-line">      <span class="token property">shape-rendering</span><span class="token punctuation">:</span> crispEdges<span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br>  </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span></code></pre>
<h4>Margins and Resizing</h4>
<p>Now that we have D3 included on the page and our CSS styles are being respected it’s time to setup some useful defaults in another <code>script</code> tag. Typically I’ll define the dimensions of my graph area as well as any margins that I might want to use.</p>
<p>If I’m going to use the same data set throughout I might put that in as well so I don’t have to declare it over and over again. In our case the array of Fibonacci numbers is there.</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token comment">&lt;!-- Global Variables and Handlers: --></span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>text/javascript<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">  <span class="token keyword">var</span> data <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">var</span> margin <span class="token operator">=</span> <span class="token punctuation">{</span> top<span class="token punctuation">:</span> <span class="token number">40</span><span class="token punctuation">,</span> right<span class="token punctuation">:</span> <span class="token number">40</span><span class="token punctuation">,</span> bottom<span class="token punctuation">:</span> <span class="token number">40</span><span class="token punctuation">,</span> left<span class="token punctuation">:</span> <span class="token number">40</span> <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    width <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'.entry-content'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span><br><span class="highlight-line">    height <span class="token operator">=</span> <span class="token number">300</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token function">$</span><span class="token punctuation">(</span>window<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">resize</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    width <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'.entry-content'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre>
<p>The margin object can be really helpful when you’re trying to move things around. For instance, to send something to the bottom of your graph you can just say <code>height - margin.top - margin.bottom</code>.</p>
<p>You’ll notice that rather than giving it an explicit width I’m using jQuery to find our containing element’s width. I’m trying to keep in line with the responsiveness of the Octopress theme so setting the width to match our containing element prevents the graph from breaking out if the user starts off with a small window.</p>
<p>I’m also including a handler for the <code>window</code> resize event. Whenever the user changes the size of their browser we’ll update our global width variable and tell all of the dependent graphs to redraw themselves.</p>
<h4>Our First Graph!</h4>
<p>Finally I create a <code>div</code> to contain our visualization. Beneath the <code>div</code> I’ve included another script tag with a self-executing function. When run, the function will grab its sibling and populate it with an SVG element. Here’s the code (don’t freak out when you see it all, we’ll go over what everything does in a later post).</p>
<pre class="language-html"><code class="language-html"><span class="highlight-line"><span class="token comment">&lt;!-- D3.js Chart --></span></span><br><span class="highlight-line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>chart-1<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>text/javascript<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br><span class="highlight-line">  <span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">    <span class="token keyword">function</span> <span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#chart-1'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token keyword">var</span> x <span class="token operator">=</span> d3<span class="token punctuation">.</span>scale</span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">linear</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">domain</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> d3<span class="token punctuation">.</span><span class="token function">max</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">range</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> width <span class="token operator">-</span> margin<span class="token punctuation">.</span>left <span class="token operator">-</span> margin<span class="token punctuation">.</span>right<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token keyword">var</span> y <span class="token operator">=</span> d3<span class="token punctuation">.</span>scale</span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">ordinal</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">domain</span><span class="token punctuation">(</span>d3<span class="token punctuation">.</span><span class="token function">range</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">rangeRoundBands</span><span class="token punctuation">(</span><span class="token punctuation">[</span>height <span class="token operator">-</span> margin<span class="token punctuation">.</span>top <span class="token operator">-</span> margin<span class="token punctuation">.</span>bottom<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">0.2</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token keyword">var</span> xAxis <span class="token operator">=</span> d3<span class="token punctuation">.</span>svg<span class="token punctuation">.</span><span class="token function">axis</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">scale</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">orient</span><span class="token punctuation">(</span><span class="token string">'bottom'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">tickPadding</span><span class="token punctuation">(</span><span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token keyword">var</span> yAxis <span class="token operator">=</span> d3<span class="token punctuation">.</span>svg</span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">axis</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">scale</span><span class="token punctuation">(</span>y<span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">orient</span><span class="token punctuation">(</span><span class="token string">'left'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">tickPadding</span><span class="token punctuation">(</span><span class="token number">8</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">tickSize</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      <span class="token keyword">var</span> svg <span class="token operator">=</span> d3</span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token string">'#chart-1'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">'svg'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'width'</span><span class="token punctuation">,</span> width<span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'height'</span><span class="token punctuation">,</span> height<span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">,</span> <span class="token string">'chart'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">'g'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span></span><br><span class="highlight-line">          <span class="token string">'transform'</span><span class="token punctuation">,</span></span><br><span class="highlight-line">          <span class="token string">'translate('</span> <span class="token operator">+</span> margin<span class="token punctuation">.</span>left <span class="token operator">+</span> <span class="token string">', '</span> <span class="token operator">+</span> margin<span class="token punctuation">.</span>top <span class="token operator">+</span> <span class="token string">')'</span></span><br><span class="highlight-line">        <span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      svg</span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">selectAll</span><span class="token punctuation">(</span><span class="token string">'.chart'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">data</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">enter</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">'rect'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">,</span> <span class="token string">'bar'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'y'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">d<span class="token punctuation">,</span> i</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">          <span class="token keyword">return</span> <span class="token function">y</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token punctuation">}</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'width'</span><span class="token punctuation">,</span> x<span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'height'</span><span class="token punctuation">,</span> y<span class="token punctuation">.</span><span class="token function">rangeBand</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      svg</span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">'g'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">,</span> <span class="token string">'x axis'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'transform'</span><span class="token punctuation">,</span> <span class="token string">'translate(0, '</span> <span class="token operator">+</span> y<span class="token punctuation">.</span><span class="token function">rangeExtent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token string">')'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>xAxis<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">      svg</span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">'g'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">,</span> <span class="token string">'y axis'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>yAxis<span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">selectAll</span><span class="token punctuation">(</span><span class="token string">'text'</span><span class="token punctuation">)</span></span><br><span class="highlight-line">        <span class="token punctuation">.</span><span class="token function">text</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">d</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">          <span class="token keyword">return</span> String<span class="token punctuation">.</span><span class="token function">fromCharCode</span><span class="token punctuation">(</span>d <span class="token operator">+</span> <span class="token number">65</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">    <span class="token function">$</span><span class="token punctuation">(</span>window<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">resize</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">      <span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre>
<p>After we declare the self-executing function we include another function called <code>draw</code>. Using a separate function lets us later <em>redraw</em> the graph if the user resizes their browser. This also works on the iPhone when the user changes from portrait to landscape mode. Inside of <code>draw</code> we first make sure that the containing div is empty (otherwise we’d end up drawing graphs on top of one another). You can skip most of the D3 code—we’ll cover that over the next couple of days—but take a look at the last few lines where we call <code>draw()</code> and add another handler for <code>window.resize</code>. Whenever the user changes their browser size our global <code>width</code> value will be updated, then our graphs will redraw themselves using this new width.</p>
<p>At the moment you need to add this handler to each of your visualizations. Not terrible but not very DRY either. I think in a future iteration I’ll add a queue which holds a reference to each <code>draw</code> instance and calls them in sync. For now this is the quick and dirty way to get a graph up on Octopress. <a href="https://github.com/robdodson/octopress-templates">You can download the entire post template from Github.</a> Enjoy!</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Ruby Objects and Dot Syntax</title>
    <link href="https://robdodson.me/posts/ruby-objects-and-dot-syntax/"/>
    <updated>2012-05-01T14:37:00+00:00</updated>
    <id>https://robdodson.me/posts/ruby-objects-and-dot-syntax/</id>
    <content type="html"><![CDATA[
      <p>Coming from JavaScript I’m very accustomed to doing something like this:</p>
<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> person <span class="token operator">=</span> <span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">'Rob'</span><span class="token punctuation">,</span> city<span class="token punctuation">:</span> <span class="token string">'San Francisco'</span> <span class="token punctuation">}</span><span class="token punctuation">;</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>person<span class="token punctuation">.</span>city<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 'San Francisco'</span></span></code></pre>
<p>Using dot syntax to access a <code>Hash</code> is second nature to me. That’s why I was surprised when I ran into the following error yesterday while writing some Ruby.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line">person <span class="token operator">=</span> <span class="token punctuation">{</span>name<span class="token punctuation">:</span> <span class="token string">'Rob'</span><span class="token punctuation">,</span> city<span class="token punctuation">:</span> <span class="token string">'San Francisco'</span><span class="token punctuation">}</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span><span class="token symbol">:name</span><span class="token operator">=</span><span class="token operator">></span><span class="token string">"Rob"</span><span class="token punctuation">,</span> <span class="token symbol">:city</span><span class="token operator">=</span><span class="token operator">></span><span class="token string">"San Francisco"</span><span class="token punctuation">}</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">puts person<span class="token punctuation">.</span>city</span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token constant">NoMethodError</span><span class="token punctuation">:</span> undefined method `city' <span class="token keyword">for</span> <span class="token punctuation">{</span><span class="token symbol">:name</span><span class="token operator">=</span><span class="token operator">></span><span class="token string">"Rob"</span><span class="token punctuation">,</span> <span class="token symbol">:city</span><span class="token operator">=</span><span class="token operator">></span><span class="token string">"San Francisco"</span><span class="token punctuation">}</span><span class="token symbol">:Hash</span></span></code></pre>
<p>“Hmm, weird,” I thought. I know I’ve seen dot syntax used in Ruby before…what gives?</p>
<h3>Dot Syntax and the Ruby Hash Object</h3>
<p>As it turns out Ruby does not support dot syntax for the <code>Hash</code> object. If I had wanted to access the <code>city</code> property from my previous example I should have done it using the symbol key like so:</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line">person<span class="token punctuation">[</span><span class="token symbol">:city</span><span class="token punctuation">]</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token string">"San Francisco"</span></span></code></pre>
<p>There are a few data structures that are very similar to <code>Hashes</code> and seeing those used in the wild perhaps threw me off. So I figured I’d write a post about the do’s and dont’s of dot syntax and how different object types react to it.</p>
<h4>Class</h4>
<p>The first and most obvious one is the <code>Class</code> object. Really I’m talking about instances of a <code>Class</code> here, for example an instance of class <code>Person</code> might have a <code>city</code> attribute. Here’s what that would look like.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token keyword">class</span> <span class="token class-name">Person</span></span><br><span class="highlight-line">  <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">initialize</span></span><span class="token punctuation">(</span>name<span class="token punctuation">,</span> city<span class="token punctuation">)</span></span><br><span class="highlight-line">    <span class="token variable">@name</span> <span class="token operator">=</span> name</span><br><span class="highlight-line">    <span class="token variable">@city</span> <span class="token operator">=</span> city</span><br><span class="highlight-line">  <span class="token keyword">end</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">name</span></span></span><br><span class="highlight-line">    <span class="token variable">@name</span></span><br><span class="highlight-line">  <span class="token keyword">end</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">  <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">city</span></span></span><br><span class="highlight-line">    <span class="token variable">@city</span></span><br><span class="highlight-line">  <span class="token keyword">end</span></span><br><span class="highlight-line"><span class="token keyword">end</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">person <span class="token operator">=</span> <span class="token constant">Person</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">'Rob'</span><span class="token punctuation">,</span> <span class="token string">'San Francisco'</span><span class="token punctuation">)</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token comment">#&lt;Person:0x007ff15412a8c0 @name="Rob", @city="San Francisco"></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">person<span class="token punctuation">.</span>city</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token string">"San Francisco"</span></span></code></pre>
<p>Since I’ve defined methods for both <code>name</code> and <code>city</code>, using dot syntax to access those properties basically means we’re calling those methods. The methods just return the instance variables, acting as getters. You can shorten this by using <code>attr_reader</code> or <code>attr_accessor</code>.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token keyword">class</span> <span class="token class-name">Person</span></span><br><span class="highlight-line">  attr_accessor <span class="token symbol">:name</span><span class="token punctuation">,</span> <span class="token symbol">:city</span></span><br><span class="highlight-line">  <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">initialize</span></span><span class="token punctuation">(</span>name<span class="token punctuation">,</span> city<span class="token punctuation">)</span></span><br><span class="highlight-line">    <span class="token variable">@name</span> <span class="token operator">=</span> name</span><br><span class="highlight-line">    <span class="token variable">@city</span> <span class="token operator">=</span> city</span><br><span class="highlight-line">  <span class="token keyword">end</span></span><br><span class="highlight-line"><span class="token keyword">end</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">person <span class="token operator">=</span> <span class="token constant">Person</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">'Rob'</span><span class="token punctuation">,</span> <span class="token string">'San Francisco'</span><span class="token punctuation">)</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token comment">#&lt;Person:0x007ff15412a8c0 @name="Rob", @city="San Francisco"></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">person<span class="token punctuation">.</span>city</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token string">"San Francisco"</span></span></code></pre>
<h4>Struct</h4>
<p>The <code>Struct</code> object is another commonly used element which allows dot access to its attributes. Quoting from <a href="http://www.ruby-doc.org/core-1.9.3/Struct.html">the documentation</a>:</p>
<blockquote>
<p>A Struct is a convenient way to bundle a number of attributes together, using accessor methods, without having to write an explicit class.</p>
</blockquote>
<p>Examples speak louder than words so here’s our <code>Person</code> again.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token constant">Person</span> <span class="token operator">=</span> <span class="token builtin">Struct</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token symbol">:name</span><span class="token punctuation">,</span> <span class="token symbol">:city</span><span class="token punctuation">)</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token constant">Person</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">person <span class="token operator">=</span> <span class="token constant">Person</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">'Rob'</span><span class="token punctuation">,</span> <span class="token string">'San Francisco'</span><span class="token punctuation">)</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token comment">#&lt;struct Person name="Rob", city="San Francisco"></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">person<span class="token punctuation">.</span>city</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token string">"San Francisco"</span></span></code></pre>
<p>As I understand it a <code>Struct</code> is basically sealed after you’ve given it an initial definition. This means that you can’t keep tacking on properties like you can with a <code>Hash</code></p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token comment"># Continuing from above...</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">person<span class="token punctuation">.</span>age <span class="token operator">=</span> <span class="token number">28</span></span><br><span class="highlight-line"><span class="token constant">NoMethodError</span><span class="token punctuation">:</span> undefined method `age<span class="token operator">=</span>' <span class="token keyword">for</span> <span class="token comment">#&lt;struct Person name="Rob", city="San Francisco"></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">person<span class="token punctuation">[</span><span class="token symbol">:age</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">28</span></span><br><span class="highlight-line"><span class="token constant">NameError</span><span class="token punctuation">:</span> no member <span class="token string">'age'</span> <span class="token keyword">in</span> struct</span></code></pre>
<h4>OpenStruct</h4>
<p>Finally we come to the <code>OpenStruct</code> which has both dynamic attributes and dot syntax. <a href="http://ruby-doc.org/stdlib-1.9.3/libdoc/ostruct/rdoc/OpenStruct.html">The documentation describes it like so</a>:</p>
<blockquote>
<p>An OpenStruct is a data structure, similar to a Hash, that allows the definition of arbitrary attributes with their accompanying values.</p>
</blockquote>
<p>And again here is our <code>Person</code> from before. Note that <code>OpenStruct</code> needs you to <code>require</code> it.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token keyword">require</span> <span class="token string">'ostruct'</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">person <span class="token operator">=</span> <span class="token constant">OpenStruct</span><span class="token punctuation">.</span><span class="token keyword">new</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token comment">#&lt;OpenStruct></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">person<span class="token punctuation">.</span>name <span class="token operator">=</span> <span class="token string">'Rob'</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token string">"Rob"</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">person<span class="token punctuation">.</span>city <span class="token operator">=</span> <span class="token string">'San Francisco'</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token string">"San Francisco"</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">person<span class="token punctuation">.</span>city</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token string">"San Francisco"</span></span></code></pre>
<p>If you noticed, we didn’t need to define the attributes of our <code>Person</code> before creating an instance of it. This means we could keep adding attributes indefinitely. Want your person to respond to <code>age</code>? Just tack it on.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line">person<span class="token punctuation">.</span>age <span class="token operator">=</span> <span class="token number">28</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token number">28</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">person<span class="token punctuation">.</span>age</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token number">28</span></span></code></pre>
<p>For the sake of brevity you can pass in a <code>Hash</code> and <code>OpenStruct</code> will covert it for you.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token keyword">require</span> <span class="token string">'ostruct'</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">person <span class="token operator">=</span> <span class="token constant">OpenStruct</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span>name<span class="token punctuation">:</span> <span class="token string">'Rob'</span><span class="token punctuation">,</span> city<span class="token punctuation">:</span> <span class="token string">'San Francisco'</span><span class="token punctuation">)</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token comment">#&lt;OpenStruct name="Rob", city="San Francisco"></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">person<span class="token punctuation">.</span>city</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token string">"San Francisco"</span></span></code></pre>
<p>This all seems wonderful but there’s one huge caveat which comes from the way <code>OpenStruct</code> finds all of these dynamic attributes. As <a href="http://ruby-doc.org/stdlib-1.9.3/libdoc/ostruct/rdoc/OpenStruct.html">the documentation describes it</a>:</p>
<blockquote>
<p>An OpenStruct utilizes Ruby’s method lookup structure to and find and define the necessary methods for properties. This is accomplished through the method method_missing and define_method.</p>
</blockquote>
<blockquote>
<p>This should be a consideration if there is a concern about the performance of the objects that are created, as there is much more overhead in the setting of these properties compared to using a Hash or a Struct.</p>
</blockquote>
<p>Definitely keep that in mind if you’re writing time sensitive code. In those situations you’ll want to use a <code>Hash</code> or a <code>Struct</code> instead.</p>
<p>Source:</p>
<p><a href="http://www.ruby-doc.org/core-1.9.3/Class.html">http://www.ruby-doc.org/core-1.9.3/Class.html</a></p>
<p><a href="http://www.ruby-doc.org/core-1.9.3/Struct.html">http://www.ruby-doc.org/core-1.9.3/Struct.html</a></p>
<p><a href="http://ruby-doc.org/stdlib-1.9.3/libdoc/ostruct/rdoc/OpenStruct.html">http://ruby-doc.org/stdlib-1.9.3/libdoc/ostruct/rdoc/OpenStruct.html</a></p>
<p><a href="http://stackoverflow.com/questions/9356704/unable-to-use-dot-syntax-for-ruby-hash">http://stackoverflow.com/questions/9356704/unable-to-use-dot-syntax-for-ruby-hash</a></p>
<p><a href="http://www.rubyist.net/~slagell/ruby/accessors.html">http://www.rubyist.net/~slagell/ruby/accessors.html</a></p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Playing with Ruby Dates</title>
    <link href="https://robdodson.me/posts/playing-with-ruby-dates/"/>
    <updated>2012-04-28T14:30:00+00:00</updated>
    <id>https://robdodson.me/posts/playing-with-ruby-dates/</id>
    <content type="html"><![CDATA[
      <p>One of <a href="https://vimeo.com/40633070">my previous projects</a> involved a ton of work using Flash’s built in Date object. We ended up rolling our own Calendar library which was both tedious and time consuming to debug. Now that I’m digging into Ruby for my newest project, I wanted to see what features the language has to offer. So far I’m <em>really</em> impressed and that’s after only a few hours of exploration. I’ll detail some of the tricks I’ve learned along the way so hopefully other newcomers can benefit.</p>
<h3>Ruby Date Object Basics</h3>
<p>We can start off by firing up IRB and requiring the <code>date</code> class. Let’s do a really simple example first and just generate today.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token keyword">require</span> <span class="token string">'date'</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">today <span class="token operator">=</span> <span class="token constant">Date</span><span class="token punctuation">.</span>today</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token comment">#&lt;Date: 2012-04-28 ((2456046j,0s,0n),+0s,2299161j)></span></span></code></pre>
<p>Now lets try a bit of Ruby’s sugar to generate tomorrow’s date.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line">tomorrow <span class="token operator">=</span> today <span class="token operator">+</span> <span class="token number">1</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token comment">#&lt;Date: 2012-04-29 ((2456047j,0s,0n),+0s,2299161j)></span></span></code></pre>
<p>Pretty straightforward, right? Since there is usually more than one way to do something in Ruby we could have achieved the same results using any of the following.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line">today<span class="token punctuation">.</span>succ</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token comment">#&lt;Date: 2012-04-29 ((2456047j,0s,0n),+0s,2299161j)></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">today<span class="token punctuation">.</span><span class="token keyword">next</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token comment">#&lt;Date: 2012-04-29 ((2456047j,0s,0n),+0s,2299161j)></span></span><br><span class="highlight-line"></span><br><span class="highlight-line">today<span class="token punctuation">.</span>next_day</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token comment">#&lt;Date: 2012-04-29 ((2456047j,0s,0n),+0s,2299161j)></span></span></code></pre>
<p>As <a href="http://stackoverflow.com/questions/962544/one-line-hash-creation-in-ruby">someone on StackOverflow pointed out</a>: <code>Date</code> objects are also <code>Comparable</code>, so you can construct a <code>Range</code>. If you wanted to collect every day from the previous week into an array you could do the following:</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line">last_week <span class="token operator">=</span> today <span class="token operator">-</span> <span class="token number">7</span></span><br><span class="highlight-line">every_day_last_week <span class="token operator">=</span> <span class="token punctuation">(</span>last_week<span class="token punctuation">.</span><span class="token punctuation">.</span>today<span class="token punctuation">)</span><span class="token punctuation">.</span>to_a</span></code></pre>
<p>or…</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line">today<span class="token punctuation">.</span>downto<span class="token punctuation">(</span>today <span class="token operator">-</span> <span class="token number">7</span><span class="token punctuation">)</span><span class="token punctuation">.</span>to_a</span></code></pre>
<p>There are also some cute booleans tossed into the mix for figuring out the day of the week.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line">today<span class="token punctuation">.</span>friday<span class="token operator">?</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">false</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">today<span class="token punctuation">.</span>saturday<span class="token operator">?</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">true</span></span></code></pre>
<h3>How to Use Chronic</h3>
<p><a href="https://github.com/mojombo/chronic/">Chronic</a> is a Ruby natural language date/time parser written by <a href="http://tom.preston-werner.com/">Tom Preston-Werner</a> (<a href="https://twitter.com/#!/mojombo">@mojombo</a>) which takes surprisingly human readable text and converts it to dates.</p>
<p>Covering everything that Chronic supports could take a while so definitely go check out the docs. Below is just a quick example to demonstrate how cool it is.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token keyword">require</span> <span class="token string">'chronic'</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token constant">Chronic</span><span class="token punctuation">.</span>parse<span class="token punctuation">(</span><span class="token string">'yesterday'</span><span class="token punctuation">)</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token number">2012</span><span class="token operator">-</span><span class="token number">04</span><span class="token operator">-</span><span class="token number">27</span> <span class="token number">12</span><span class="token punctuation">:</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">00</span> <span class="token operator">-</span><span class="token number">0700</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token constant">Chronic</span><span class="token punctuation">.</span>parse<span class="token punctuation">(</span><span class="token string">'yesterday'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>to_date</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token comment">#&lt;Date: 2012-04-27 ((2456045j,0s,0n),+0s,2299161j)></span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token constant">Chronic</span><span class="token punctuation">.</span>parse<span class="token punctuation">(</span><span class="token string">'last monday'</span><span class="token punctuation">)</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token number">2012</span><span class="token operator">-</span><span class="token number">04</span><span class="token operator">-</span><span class="token number">23</span> <span class="token number">12</span><span class="token punctuation">:</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">00</span> <span class="token operator">-</span><span class="token number">0700</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token constant">Chronic</span><span class="token punctuation">.</span>parse<span class="token punctuation">(</span><span class="token string">'3 months ago this friday at 3:45pm'</span><span class="token punctuation">)</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token number">2012</span><span class="token operator">-</span><span class="token number">02</span><span class="token operator">-</span><span class="token number">04</span> <span class="token number">15</span><span class="token punctuation">:</span><span class="token number">45</span><span class="token punctuation">:</span><span class="token number">00</span> <span class="token operator">-</span><span class="token number">0800</span></span></code></pre>
<h3>How to Use Active Support for Dates</h3>
<p>Active Support is a library extracted from Rails which adds a ton of sugar to the Ruby language. As the author’s describe it:</p>
<blockquote>
<p>Active Support is a collection of various utility classes and standard library extensions that were found useful for Rails. All these additions have hence been collected in this bundle as a way to gather all that sugar that makes Ruby sweeter.</p>
</blockquote>
<p>It’s broken into several pieces so you can choose to load only the parts that you’ll actually be using. <em>I’m going to write an upcoming article on Active Support. For now we’ll just require it all.</em></p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token keyword">require</span> <span class="token string">'active_support/all'</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">t <span class="token operator">=</span> <span class="token constant">Date</span><span class="token punctuation">.</span>today</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token constant">Sat</span><span class="token punctuation">,</span> <span class="token number">28</span> <span class="token constant">Apr</span> <span class="token number">2012</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">t<span class="token punctuation">.</span><span class="token keyword">class</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token constant">Date</span></span></code></pre>
<p>You’ll notice that Active Support has changed the way our date’s <code>to_s</code> is formatted so it’s more human readable. It also added shortcuts for creating Dates on either side of today.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line">yesterday <span class="token operator">=</span> <span class="token constant">Date</span><span class="token punctuation">.</span>yesterday</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token constant">Fri</span><span class="token punctuation">,</span> <span class="token number">27</span> <span class="token constant">Apr</span> <span class="token number">2012</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">tomorrow <span class="token operator">=</span> <span class="token constant">Date</span><span class="token punctuation">.</span>tomorrow</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token constant">Sun</span><span class="token punctuation">,</span> <span class="token number">29</span> <span class="token constant">Apr</span> <span class="token number">2012</span></span></code></pre>
<p>Included as well are some nice convenience booleans: <code>past?</code>, <code>today?</code>, and <code>future?</code></p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line">tomorrow<span class="token punctuation">.</span>future<span class="token operator">?</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">true</span></span></code></pre>
<p>If you’ve ever had to write a Calendar that can support weeks, especially those that straddle two different months, you’ll appreciate the simplicity of the helpers Active Support adds.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line">today <span class="token operator">=</span> <span class="token constant">Date</span><span class="token punctuation">.</span>today</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token constant">Sat</span><span class="token punctuation">,</span> <span class="token number">28</span> <span class="token constant">Apr</span> <span class="token number">2012</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">today<span class="token punctuation">.</span>beginning_of_week</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token constant">Mon</span><span class="token punctuation">,</span> <span class="token number">23</span> <span class="token constant">Apr</span> <span class="token number">2012</span></span><br><span class="highlight-line"></span><br><span class="highlight-line">today<span class="token punctuation">.</span>next_week</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token constant">Mon</span><span class="token punctuation">,</span> <span class="token number">30</span> <span class="token constant">Apr</span> <span class="token number">2012</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># You can also choose to make the week start on an arbitrary day, like Sunday</span></span><br><span class="highlight-line">today<span class="token punctuation">.</span>beginning_of_week<span class="token punctuation">(</span><span class="token symbol">:sunday</span><span class="token punctuation">)</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token constant">Sun</span><span class="token punctuation">,</span> <span class="token number">22</span> <span class="token constant">Apr</span> <span class="token number">2012</span></span></code></pre>
<p>We aren’t limited to weeks though. Active Support adds methods for days, months and years. For example:</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line">today<span class="token punctuation">.</span>years_ago<span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span></span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token constant">Sun</span><span class="token punctuation">,</span> <span class="token number">28</span> <span class="token constant">Apr</span> <span class="token number">2002</span></span></code></pre>
<p>By extending <code>FixNum</code> to support additional Date methods certain operations become much more readable.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line">today <span class="token operator">+</span> <span class="token number">1.</span>year</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token constant">Sun</span><span class="token punctuation">,</span> <span class="token number">28</span> <span class="token constant">Apr</span> <span class="token number">2013</span></span></code></pre>
<p>These extensions are referred to as <code>durations</code><a href="http://guides.rubyonrails.org/active_support_core_extensions.html">in the documentation</a>.</p>
<p>Which brings us back to one of our first examples of finding the date 7 days ago. With Active Support it’s as easy as…</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token number">7.</span>days<span class="token punctuation">.</span>ago</span><br><span class="highlight-line"><span class="token operator">=</span><span class="token operator">></span> <span class="token number">2012</span><span class="token operator">-</span><span class="token number">04</span><span class="token operator">-</span><span class="token number">21</span> <span class="token number">08</span><span class="token punctuation">:</span><span class="token number">44</span><span class="token punctuation">:</span><span class="token number">02</span> <span class="token operator">-</span><span class="token number">0700</span></span></code></pre>
<p>Pretty cool! Active Support adds <em>A LOT</em> more than just Date helpers and I’ll try to cover it more in some future articles. Definitely <a href="http://guides.rubyonrails.org/active_support_core_extensions.html">check out the documentation</a> (you can <a href="http://guides.rubyonrails.org/active_support_core_extensions.html#extensions-to-date">skip to the Date section</a> since it’s pretty immense).</p>
<p>Source:</p>
<p><a href="http://stackoverflow.com/questions/962544/one-line-hash-creation-in-ruby">http://stackoverflow.com/questions/962544/one-line-hash-creation-in-ruby</a>
<a href="http://www.developer.com/open/article.php/3729206/Telling-Time-with-Ruby.htm">http://www.developer.com/open/article.php/3729206/Telling-Time-with-Ruby.htm</a>
<a href="http://guides.rubyonrails.org/active_support_core_extensions.html">http://guides.rubyonrails.org/active_support_core_extensions.html</a></p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
<p><a href="https://www.flickr.com/photos/125167502@N02/14363795854/in/set-72157645053557074">Photo credit</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>A Basic RVM Tutorial for Rails 3</title>
    <link href="https://robdodson.me/posts/how-to-use-rvm-for-rails3/"/>
    <updated>2011-09-23T14:33:00+00:00</updated>
    <id>https://robdodson.me/posts/how-to-use-rvm-for-rails3/</id>
    <content type="html"><![CDATA[
      <h3>What is RVM?</h3>
<p><a href="https://rvm.io//">RVM</a> is a great Ruby and gem management tool that should probably be the first thing you install if you’re learning Rails (or Ruby for that matter). The main benefit of RVM is that it helps to keep your rubies and your gems organized into discrete folders which can easily be thrown away and recreated. If you’ve ever had a gem explode on you, then you know how great a feature like this is. I’ll cover the basics of using RVM in this post to quickly get you up and running. This tutorial is written for the OSX terminal, if you’re on Windows…um…kill yourself.</p>
<h3>How to Install RVM</h3>
<p>First download and run the RVM installation script. Thankfully the authors have made this nice and easy for you. Just copy and paste the following into your command line:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token function">curl</span> -L get.rvm.io <span class="token operator">|</span> <span class="token function">bash</span> -s stable</span></code></pre>
<p>Next you’re going to want to make sure that RVM gets loaded into your shell sessions. The easiest way to do this is to open up your .bash_profile file located in your user’s home directory (that’s what the ~ stands for in your terminal) and add the following to the bottom:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token punctuation">[</span><span class="token punctuation">[</span> -s <span class="token string">"<span class="token variable">$HOME</span>/.rvm/scripts/rvm"</span> <span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">&amp;&amp;</span> <span class="token keyword">.</span> <span class="token string">"<span class="token variable">$HOME</span>/.rvm/scripts/rvm"</span> <span class="token comment"># This loads RVM into a shell session.</span></span></code></pre>
<p>Then quit your terminal window and open it up again. You should be able to type: <code>rvm -v</code> to verify that RVM is loaded and ready for use. If instead it just returns the prompt then you’ve probably missed a step along the way. Check out the <a href="https://rvm.io/rvm/install/">RVM installation page</a> and double check that you’ve done everything correctly.</p>
<h3>A Guided Tour of RVM’s Inner Workings</h3>
<p>To get us started lets look around inside the .rvm directory. Try the following:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token function">cd</span> ~/.rvm</span><br><span class="highlight-line"><span class="token function">ls</span></span></code></pre>
<p>When you list out the contents of rvm you’ll see several folders but the ones we’re most interested in are gems and rubies. The gems folder is going to hold all of our gems after we create a <em>gemset</em>. The rubies folder holds different versions of ruby for us to play with. The really cool thing about RVM is that it lets you swap versions of ruby and different gemsets around so you can test out new packages without blowing stuff up. Made a mistake and installed the wrong gems? Just blow away the gemset and start over, no need to track everything down and uninstall it. RVM also lets you ensure that you have the same gems running for your dev, test and production environments :)</p>
<p>Now that you have RVM installed, the next thing you’ll want to do is to install the latest version of Ruby. If you haven’t previously installed Ruby and you’re on OSX then typing <code>ruby -v</code> into the command line should produce something like this:</p>
<p><code>ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]</code></p>
<p>We’re going to leave the default version of Ruby installed on our machine, and instead install a new version using RVM. The current latest version of Ruby is 1.9.3, so try typing:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">rvm <span class="token function">install</span> 1.9.3</span></code></pre>
<p>It will take a little while to run but if all goes well we should have a brand new working copy of Ruby.</p>
<p>Now try:</p>
<pre><code>rvm use 1.9.3
ruby -v
# ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.2.0]
which ruby
# /Users/Rob/.rvm/rubies/ruby-1.9.3-p125/bin/ruby
</code></pre>
<p>We can see that not only are we running the latest version of ruby, but instead of being stashed in some random system folder somewhere, it’s being kept inside of a directory in RVM. To make sure that every time we open terminal we are using this new version of ruby we’ll simply say:</p>
<pre><code>rvm use 1.9.3 --default
</code></pre>
<p>That will tell RVM to use this version as its default Ruby any time we open a terminal session.</p>
<h3>What are RVM Gemsets?</h3>
<p>I have to admit that when I first started using Ruby I found the concept of gems really confusing. In Flash or JavaScript if you want to use some code you just download the folder from github and include it in your project. Ruby does something similar with gems except it tries to automate the process for you and often times this can lead to busted projects. Because some gems rely on other gems it isn’t unheard of to have two gems in conflict which means your project won’t run and if you’re new to ruby or rails this can be just enough to make you call it quits. Here is where RVM really shines because it makes it OK to screw up your gems by sequestering them into their own little packages which you can recreate and destroy at will.</p>
<p>Lets get started by typing:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">rvm gemset create my-new-gemset</span></code></pre>
<p>You should get a confirmation that a new gemset was created as well as a path to the new gemset. Let’s go take a look at that path.</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line"><span class="token comment"># Make sure to use the path RVM provided you.</span></span><br><span class="highlight-line"><span class="token function">cd</span> /Users/RobDodson/.rvm/gems/ruby-1.9.3-p125@my-new-gemset</span><br><span class="highlight-line"><span class="token function">ls</span></span></code></pre>
<p>Right now the folder is empty because we haven’t told RVM to install any gems into this gemset. Let’s change that by first assigning our current instance of ruby to this set.</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">rvm 1.9.3@my-new-gemset --default</span></code></pre>
<p>The @ character tells RVM that we want to assign this gemset to our current ruby instance. The default flag is just there since I tend to forget to make my gemsets defaults and RVM will reset to whatever the prior default was the last time the flag was set. Let’s verify that things worked by typing:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">rvm current</span></code></pre>
<p>Which should output: <code>ruby-1.9.3-p125@my-new-gemset</code>. Similarly you could type:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">rvm gemset list</span></code></pre>
<p>To see a list of all your gemsets with a hash rocket next to the one currently in use.</p>
<h3>How to Install Gems with RVM</h3>
<p>Ok, so lets install some gems then. We’ll start by installing the Nokogiri gem, just as a test. But before we do this let me give you a little warning. In a lot of documentation you’ll see people installing gems with the <code>sudo</code> keyword at the beginning of the commmand. If you’re not using RVM then doing it this way makes sense. However if you ARE using RVM then <em>you should never install a gem with <code>sudo</code>!</em> In short, RVM does command line wizardry and installing gems with <code>sudo</code> will place them outside of the .rvm directory. You’ll think you’ve installed a gem properly but really it’ll be somewhere in the system folder. To install a gem using RVM we simply leave off the <code>sudo</code> keyword. Let’s try one by typing:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">gem <span class="token function">install</span> nokogiri</span></code></pre>
<p>After the installation has finished we should be able to see our new gem. If you’re still inside of the gems directory from earlier you can do a <code>cd gems</code></p>
<p>otherwise you’ll need to dig into it with a path that looks like this</p>
<p><code>cd /Users/RobDodson/.rvm/gems/ruby-1.9.3-p125@my-new-gemset/gems</code></p>
<p>Now if you type <code>ls</code> you should see your version of nokogiri. Let’s pause for a moment and consider what just happened. If you use Ruby Gems without RVM then everything will be installed in the system folder. If we wanted to have 2 different versions of nokogiri we would need to make sure that there wasn’t any kind of conflict in our gems directory. Since we’re using RVM to manage our gems, we’re able to tell Ruby Gems to put one version of nokogiri in the ‘my-new-gemset’ directory and another version in the ‘some-other-gemset’ directory. This is a great feature, especially when you want to try out an upgrade or a different version of a particular library. Rather than having to uninstall your working gem, you can just create a new gemset. If things blow up then you can throw it away and revert back to the previous gemset.</p>
<p>Lets make another gemset and this time install a new instance of Rails.</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">rvm create gemset my-new-rails-setup</span><br><span class="highlight-line">rvm 1.9.3@my-new-rails-setup</span><br><span class="highlight-line">gem <span class="token function">install</span> rails</span></code></pre>
<p>Now lets go into the folder for that gemset. Again the path should look similar to this:</p>
<p><code>cd /Users/RobDodson/.rvm/gems/ruby-1.9.3-p125@my-new-rails-setup/gems</code></p>
<p>Type <code>ls</code> this time and you’ll see <em>WAY</em> more gems. Imagine that we wanted to test our application on a different version of Rails. Managing all those gems in one directory would be a huge pain but thankfully RVM is taking care of that for us. If we decide that this version of rails is not for us we can just delte the gemset with:</p>
<pre class="language-bash"><code class="language-bash"><span class="highlight-line">rvm gemset delete my-new-rails-setup</span></code></pre>
<p>And recreate it however we want :D</p>
<p>That wraps it up for today. If you have any questions you can post a comment or hit me up on twitter <a href="http://twitter.com/robdodson">@rob_dodson</a>.</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Syntax Error: Unexpected tIDENTIFIER in Rails 3</title>
    <link href="https://robdodson.me/posts/syntax-error-unexpected-tidentifier/"/>
    <updated>2011-09-21T14:33:00+00:00</updated>
    <id>https://robdodson.me/posts/syntax-error-unexpected-tidentifier/</id>
    <content type="html"><![CDATA[
      <p>Today we’re going to look at this little gem, which is really nothing more than a syntax error. If you’re not used to Ruby’s syntax, this can be a particularly easy stumbling block.</p>
<p>For starters here’s the image you see in Rails 3 when things go South:</p>
<p><img src="/images/2014/12/unexpected_tidentifier.jpg" alt="Syntax Error: Unexpected tIDENTIFIER"></p>
<p>Just to focus your attention, I’ll post the snippet of code that was causing the issue.</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token operator">&lt;</span><span class="token operator">%</span><span class="token operator">=</span> link_to <span class="token string">"Goodbye"</span> say_goodbye_path <span class="token operator">%</span><span class="token operator">></span></span></code></pre>
<p>Can you tell me what’s wrong with the code above? If you’re coming from a Ruby background it should be plainly obvious, but if you’re coming from more of an ECMAScript or Java/C/C++ background things might be a little more subtle. What if I rewrote it like this?</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line">linkTo<span class="token punctuation">(</span><span class="token string">"Goodbye"</span> sayGoodbyePath<span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>
<p>Did you notice I left out a comma when passing my function arguments? The proper code would look something like this:</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token comment"># note the comma between arguments</span></span><br><span class="highlight-line"><span class="token operator">&lt;</span><span class="token operator">%</span><span class="token operator">=</span> link_to <span class="token string">"Goodbye"</span><span class="token punctuation">,</span> say_goodbye_path <span class="token operator">%</span><span class="token operator">></span></span></code></pre>
<p>If you want to explore this a bit more (and if you’re new to Ruby—trust me—you do) then strap in for a brief tangent.</p>
<h3>Ruby Says Goodbye to Braces (sort of)</h3>
<p>One of Ruby’s double edged swords, especially if you’re coming from another language, is the exclusion of various syntactical elements to improve brevity and readability. In Actionscript 3 you might iterate over a list of items like this:</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token keyword">for</span> <span class="token keyword">each</span> <span class="token punctuation">(</span>var person<span class="token symbol">:Object</span> <span class="token keyword">in</span> people<span class="token punctuation">)</span> <span class="token punctuation">{</span></span><br><span class="highlight-line">  trace<span class="token punctuation">(</span>person<span class="token punctuation">.</span>name<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token punctuation">}</span></span></code></pre>
<p>However in Ruby you can write it much more succinctly:</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token keyword">for</span> person <span class="token keyword">in</span> <span class="token variable">@people</span></span><br><span class="highlight-line">  puts person<span class="token punctuation">.</span>name</span><br><span class="highlight-line"><span class="token keyword">end</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># or...</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token variable">@people</span><span class="token punctuation">.</span><span class="token keyword">each</span> <span class="token keyword">do</span> <span class="token operator">|</span>person<span class="token operator">|</span></span><br><span class="highlight-line">  puts person<span class="token punctuation">.</span>name</span><br><span class="highlight-line"><span class="token keyword">end</span></span></code></pre>
<p>Just that example alone doesn’t look so bad but where it gets tricky for a newcomer like myself is when the parenthesis wrapping a function’s arguments are excluded. This is the case in our original example and it can be pretty jarring for someone not used to that kind of shorthand. Suddenly I’m left wondering if I’m calling another function, or using a keyword, or some other idiom of the language that I don’t fully grasp.</p>
<p>It gets especially confusing when dealing with hashes as function arguments. Here’s a quote from <a href="http://pragprog.com/book/rails4/agile-web-development-with-rails">Agile Web Development with Rails, 4th Edition</a> with some emphasis added:</p>
<blockquote>
<p>You can pass hashes as parameters on method calls. <strong>Ruby allows you to omit the braces, but only if the hash is the last parameter of the call.</strong> Rails makes extensive use of this feature…In effect, though, you can ignore that it’s a hash and pretend that Ruby has keyword arguments.</p>
</blockquote>
<p>As you start to learn Rails you’ll see this kind of thing everywhere. At first I thought there was a special language construct that I was missing (similar to the ‘keyword’ referred to in the book) but in actuality it’s just hashes without the surrounding brackets. Common Rails practices take this to the extreme, mixing and omitting braces quite frequently. Take for example this validation:</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line">validates <span class="token symbol">:email</span><span class="token punctuation">,</span> presence<span class="token punctuation">:</span>   <span class="token keyword">true</span><span class="token punctuation">,</span></span><br><span class="highlight-line">                    format<span class="token punctuation">:</span>     <span class="token punctuation">{</span> with<span class="token punctuation">:</span> <span class="token constant">VALID_EMAIL_REGEX</span> <span class="token punctuation">}</span><span class="token punctuation">,</span></span><br><span class="highlight-line">                    uniqueness<span class="token punctuation">:</span> <span class="token punctuation">{</span> case_sensitive<span class="token punctuation">:</span> <span class="token keyword">false</span> <span class="token punctuation">}</span></span></code></pre>
<p>To confuse the issue even further, the hash syntax changed from Ruby 1.8.7 to 1.9 allowing you to swap the place of the colon on your symbols. This makes newer Rails examples seem like they’re using another part of the language that you might not be familiar with. Below is an example, note the position of the colons:</p>
<pre class="language-ruby"><code class="language-ruby"><span class="highlight-line"><span class="token comment"># Ruby 1.8.7 hash syntax</span></span><br><span class="highlight-line">say_hello <span class="token symbol">:name</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'Rob'</span><span class="token punctuation">,</span> <span class="token symbol">:age</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">27</span></span><br><span class="highlight-line">say_hello<span class="token punctuation">(</span><span class="token symbol">:name</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'Rob'</span><span class="token punctuation">,</span> <span class="token symbol">:age</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">27</span><span class="token punctuation">)</span></span><br><span class="highlight-line">say_hello<span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token symbol">:name</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'Rob'</span><span class="token punctuation">,</span> <span class="token symbol">:age</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">27</span><span class="token punctuation">}</span><span class="token punctuation">)</span></span><br><span class="highlight-line"></span><br><span class="highlight-line"><span class="token comment"># Ruby 1.9 hash syntax</span></span><br><span class="highlight-line">say_hello name<span class="token punctuation">:</span> <span class="token string">'Rob'</span><span class="token punctuation">,</span> age<span class="token punctuation">:</span> <span class="token number">27</span></span><br><span class="highlight-line">say_hello<span class="token punctuation">(</span>name<span class="token punctuation">:</span> <span class="token string">'Rob'</span><span class="token punctuation">,</span> age<span class="token punctuation">:</span> <span class="token number">27</span><span class="token punctuation">)</span></span><br><span class="highlight-line">say_hello<span class="token punctuation">(</span><span class="token punctuation">{</span>name<span class="token punctuation">:</span> <span class="token string">'Rob'</span><span class="token punctuation">,</span> age<span class="token punctuation">:</span> <span class="token number">27</span><span class="token punctuation">}</span><span class="token punctuation">)</span></span><br><span class="highlight-line">say_hello <span class="token symbol">:name</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'Rob'</span><span class="token punctuation">,</span> <span class="token symbol">:age</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">27</span></span><br><span class="highlight-line">say_hello<span class="token punctuation">(</span><span class="token symbol">:name</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'Rob'</span><span class="token punctuation">,</span> <span class="token symbol">:age</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">27</span><span class="token punctuation">)</span></span><br><span class="highlight-line">say_hello<span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token symbol">:name</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'Rob'</span><span class="token punctuation">,</span> <span class="token symbol">:age</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">27</span><span class="token punctuation">}</span><span class="token punctuation">)</span></span></code></pre>
<p>All of the above code evaluates to the same thing (give it a shot in IRB). At this point we’re way off topic but I wanted to put this out there in case anyone else is struggling with these concepts. After getting used to the syntax (or lack thereof) these kinds of mistakes are easily cleared up, but for now just be mindful of what version of Ruby your examples are written in.</p>
<h3>Resolution</h3>
<p>Check the syntax of your method call. Odds are you forgot a comma somewhere.</p>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>NoMethodError in Rails 3</title>
    <link href="https://robdodson.me/posts/nomethoderror-in-rails-3/"/>
    <updated>2011-09-20T14:33:00+00:00</updated>
    <id>https://robdodson.me/posts/nomethoderror-in-rails-3/</id>
    <content type="html"><![CDATA[
      <p>Coming from Actionscript 3 I’m pretty used to all of the different errors that the Flash compiler and runtime typically throw at me. But now that I’ve started teaching myself Ruby on Rails 3 I’m having to learn a whole new lexicon of messages which generally amount to “Something blow’d up…”</p>
<p>For my own benefit, and hopefully for the benefit of others, I’m going to post the errors and solutions that I come up with. Hopefully since I’m a total newbie, explaining things from my perspective will help other people who are new to the language as well.</p>
<p>To start of we have the <code>NoMethodError</code>.
<img src="/images/2014/12/no_method_error.jpg" alt="NoMethodError"></p>
<p>You get a <code>NoMethodError</code> when you try to call a method which either doesn’t exist on an Object, or the Object itself doesn’t exist. Since <code>Nil</code> is actually an object in Ruby (it’s an instance of <code>NilClass</code>) this error can sometimes be a bit misleading (especially if you come from a language where Nil or Null is represented by a primitive or a data type like in Actionscript 3).</p>
<p>The real reason this occurs is either because the Object itself is Nil (and you probably didn’t intend that) or you forgot to define the method on your Object. In Flash you would get an error saying you can’t call a method on a null object reference, since null is just a primitive data type. But in Ruby, it says that the method you wanted didn’t exist because you called it on an ACTUAL NilClass object and NilClass doesn’t define whatever method name you passed.</p>
<h3>Resolution</h3>
<ol>
<li>
<p>If your error says “undefined method ‘some_method_name’ for NilClass:Class” (like it does in the picture) then you’ve accidentally tried to call a method on an Object which doesn’t really exist. You probably just didn’t pass or instantiate the Object properly.</p>
</li>
<li>
<p>If you see the correct class type in the error then you’ve just failed to declare that method or perhaps mistyped its name. Verify that the method exists in the class and that you don’t have any spelling errors :)</p>
</li>
</ol>
<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here</a>.</p>

    ]]></content>
  </entry>
	
</feed>
