Jekyll2024-03-17T12:38:21-07:00https://top-frog.com/feed.xmlThe Gippy PagesThe Gippy Pages is the brain dump of Shawn Parker on the internet. Covering topics ranging from how my butt itches to software development. Your mileage may vary. Not suitable for all ages. This site contains content known by the State of California to cause cancer.Shawn ParkerExploring Vancouver, Washington2023-03-14T14:47:51-07:002023-03-14T14:47:51-07:00https://top-frog.com/2023/03/14/exploring-vancouver-washington<p>The parts near where we live, that is.</p>
<p>Sadly, all these photos are with an iPhone. I haven’t pulled out my main camera with intent in a very long time.</p>
<h2 id="round-lake-lacamas-regional-park">Round Lake, Lacamas Regional Park</h2>
<div role="figure">
<a href="https://www.flickr.com/photos/tehgipster/52188579292/" class="thickbox frame ">
<img src="https://live.staticflickr.com/65535/52188579292_0739e8a93b_m.jpg" alt="Photograph: Round Lake, Camas, WA" srcset="https://live.staticflickr.com/65535/52188579292_0739e8a93b_m.jpg 240w, https://live.staticflickr.com/65535/52188579292_0739e8a93b_n.jpg 320w, https://live.staticflickr.com/65535/52188579292_0739e8a93b.jpg 500w, https://live.staticflickr.com/65535/52188579292_0739e8a93b_z.jpg 640w, https://live.staticflickr.com/65535/52188579292_0739e8a93b_b.jpg 1024w, https://live.staticflickr.com/65535/52188579292_403d586af6_o.jpg 4032w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="500" height="333" data-lg-img="{"id":"52188579292","src":"https://live.staticflickr.com/65535/52188579292_0739e8a93b_b.jpg","width":1024,"height":683,"title":"Round Lake, Camas, WA","caption":"Round Lake, Camas, WA<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/52188579292/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>
<h2 id="moulton-falls-state-park">Moulton Falls State Park</h2>
<div role="figure">
<a href="https://www.flickr.com/photos/tehgipster/52431375637/" class="thickbox frame ">
<img src="https://live.staticflickr.com/65535/52431375637_4291500845_m.jpg" alt="Photograph: " srcset="https://live.staticflickr.com/65535/52431375637_4291500845_m.jpg 240w, https://live.staticflickr.com/65535/52431375637_4291500845_n.jpg 320w, https://live.staticflickr.com/65535/52431375637_4291500845.jpg 500w, https://live.staticflickr.com/65535/52431375637_4291500845_z.jpg 640w, https://live.staticflickr.com/65535/52431375637_4291500845_b.jpg 1024w, https://live.staticflickr.com/65535/52431375637_d6b9d4bcc9_o.jpg 4032w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="500" height="375" data-lg-img="{"id":"52431375637","src":"https://live.staticflickr.com/65535/52431375637_4291500845_b.jpg","width":1024,"height":768,"title":"","caption":"<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/52431375637/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>
<h2 id="cape-horn-scenic-overlook">Cape Horn scenic overlook</h2>
<div role="figure">
<a href="https://www.flickr.com/photos/tehgipster/52465710356/" class="thickbox frame ">
<img src="https://live.staticflickr.com/65535/52465710356_b1778d0106_m.jpg" alt="Photograph: Side of the highway scenic overlook" srcset="https://live.staticflickr.com/65535/52465710356_b1778d0106_m.jpg 240w, https://live.staticflickr.com/65535/52465710356_b1778d0106_n.jpg 320w, https://live.staticflickr.com/65535/52465710356_b1778d0106.jpg 500w, https://live.staticflickr.com/65535/52465710356_b1778d0106_z.jpg 640w, https://live.staticflickr.com/65535/52465710356_b1778d0106_b.jpg 1024w, https://live.staticflickr.com/65535/52465710356_94976aeb76_o.jpg 4032w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="500" height="375" data-lg-img="{"id":"52465710356","src":"https://live.staticflickr.com/65535/52465710356_b1778d0106_b.jpg","width":1024,"height":768,"title":"Side of the highway scenic overlook","caption":"Side of the highway scenic overlook<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/52465710356/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>
<h2 id="salmon-creek-walking-trail">Salmon Creek walking trail</h2>
<div role="figure" class="center">
<a href="https://www.flickr.com/photos/tehgipster/52732451441/" class="thickbox frame ">
<img src="https://live.staticflickr.com/65535/52732451441_dfd12cccda_m.jpg" alt="Photograph: Overcast morning walk" srcset="https://live.staticflickr.com/65535/52732451441_dfd12cccda_m.jpg 219w, https://live.staticflickr.com/65535/52732451441_dfd12cccda_n.jpg 292w, https://live.staticflickr.com/65535/52732451441_dfd12cccda.jpg 457w, https://live.staticflickr.com/65535/52732451441_dfd12cccda_z.jpg 585w, https://live.staticflickr.com/65535/52732451441_dfd12cccda_b.jpg 935w, https://live.staticflickr.com/65535/52732451441_a32c01f76a_o.jpg 2928w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="457" height="500" data-lg-img="{"id":"52732451441","src":"https://live.staticflickr.com/65535/52732451441_dfd12cccda_b.jpg","width":935,"height":1024,"title":"Overcast morning walk","caption":"Overcast morning walk<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/52732451441/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>
<h2 id="dougan-falls">Dougan Falls</h2>
<div role="figure">
<a href="https://www.flickr.com/photos/tehgipster/52740949021/" class="thickbox frame ">
<img src="https://live.staticflickr.com/65535/52740949021_c22a48d35e_m.jpg" alt="Photograph: Dougan Falls" srcset="https://live.staticflickr.com/65535/52740949021_c22a48d35e_m.jpg 240w, https://live.staticflickr.com/65535/52740949021_c22a48d35e_n.jpg 320w, https://live.staticflickr.com/65535/52740949021_c22a48d35e.jpg 500w, https://live.staticflickr.com/65535/52740949021_c22a48d35e_z.jpg 640w, https://live.staticflickr.com/65535/52740949021_c22a48d35e_b.jpg 1024w, https://live.staticflickr.com/65535/52740949021_c2ef4721c8_o.jpg 4032w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="500" height="375" data-lg-img="{"id":"52740949021","src":"https://live.staticflickr.com/65535/52740949021_c22a48d35e_b.jpg","width":1024,"height":768,"title":"Dougan Falls","caption":"Dougan Falls<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/52740949021/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>
<div role="figure" class="center">
<a href="https://www.flickr.com/photos/tehgipster/52741203144/" class="thickbox frame ">
<img src="https://live.staticflickr.com/65535/52741203144_f03622e8ca_m.jpg" alt="Photograph: Dougan Falls" srcset="https://live.staticflickr.com/65535/52741203144_f03622e8ca_m.jpg 180w, https://live.staticflickr.com/65535/52741203144_f03622e8ca_n.jpg 240w, https://live.staticflickr.com/65535/52741203144_f03622e8ca.jpg 375w, https://live.staticflickr.com/65535/52741203144_f03622e8ca_z.jpg 480w, https://live.staticflickr.com/65535/52741203144_f03622e8ca_b.jpg 768w, https://live.staticflickr.com/65535/52741203144_46c0b92098_o.jpg 3024w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="375" height="500" data-lg-img="{"id":"52741203144","src":"https://live.staticflickr.com/65535/52741203144_f03622e8ca_b.jpg","width":768,"height":1024,"title":"Dougan Falls","caption":"Dougan Falls<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/52741203144/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>
<div role="figure" class="center">
<a href="https://www.flickr.com/photos/tehgipster/52741360560/" class="thickbox frame ">
<img src="https://live.staticflickr.com/65535/52741360560_a87f7e70de_m.jpg" alt="Photograph: Dougan Falls" srcset="https://live.staticflickr.com/65535/52741360560_a87f7e70de_m.jpg 180w, https://live.staticflickr.com/65535/52741360560_a87f7e70de_n.jpg 240w, https://live.staticflickr.com/65535/52741360560_a87f7e70de.jpg 375w, https://live.staticflickr.com/65535/52741360560_a87f7e70de_z.jpg 480w, https://live.staticflickr.com/65535/52741360560_a87f7e70de_b.jpg 768w, https://live.staticflickr.com/65535/52741360560_b46b6edef3_o.jpg 3024w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="375" height="500" data-lg-img="{"id":"52741360560","src":"https://live.staticflickr.com/65535/52741360560_a87f7e70de_b.jpg","width":768,"height":1024,"title":"Dougan Falls","caption":"Dougan Falls<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/52741360560/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>
<h2 id="lauretta-norene-forest-preserve">Lauretta Norene Forest Preserve</h2>
<div role="figure">
<a href="https://www.flickr.com/photos/tehgipster/52381157820/" class="thickbox frame ">
<img src="https://live.staticflickr.com/65535/52381157820_920b644da3_m.jpg" alt="Photograph: Friday evening dog walk in Lauretta Norene Forest Preserve" srcset="https://live.staticflickr.com/65535/52381157820_920b644da3_m.jpg 240w, https://live.staticflickr.com/65535/52381157820_920b644da3_n.jpg 320w, https://live.staticflickr.com/65535/52381157820_920b644da3.jpg 500w, https://live.staticflickr.com/65535/52381157820_920b644da3_z.jpg 640w, https://live.staticflickr.com/65535/52381157820_920b644da3_b.jpg 1024w, https://live.staticflickr.com/65535/52381157820_57b7bfaf17_o.jpg 4032w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="500" height="375" data-lg-img="{"id":"52381157820","src":"https://live.staticflickr.com/65535/52381157820_920b644da3_b.jpg","width":1024,"height":768,"title":"Friday evening dog walk in Lauretta Norene Forest Preserve","caption":"Friday evening dog walk in Lauretta Norene Forest Preserve<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/52381157820/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>Shawn ParkerThe parts near where we live, that is. Sadly, all these photos are with an iPhone. I haven’t pulled out my main camera with intent in a very long time. Round Lake, Lacamas Regional Park Moulton Falls State Park Cape Horn scenic overlook Salmon Creek walking trail Dougan Falls Lauretta Norene Forest PreserveIPv6 with Ubiquiti Edgerouter ER8 on AT&T2020-07-05T16:28:42-07:002020-07-05T16:28:42-07:00https://top-frog.com/2020/07/05/ipv6-with-ubiquiti-edgerouter-er8-on-att<p>This isn’t the first blog post on how to do this, and it probably won’t be the last, but since IPv6, even within AT&T, seems to vary, and the quality of the blog posts out there vaires, this is also so that I have record of what I did for my actual needs.</p>
<p>I’m not a network engineer. So this was mostly just piecing together bits of information that I could find posted by others, and then correcting it for my needs, mostly through trial and error.</p>
<p><strong>This will all assume that you</strong>:</p>
<ul>
<li>are working on an EdgeRouter <em>without</em> a built in switch</li>
<li>are working with EdgeOS 2+ (this was done on 2.0.8)</li>
<li>have the internet coming in on the <code class="language-plaintext highlighter-rouge">eth0</code> and aren’t some kind of monster that uses another port for your WAN. If you are, then adjust the interfaces below accordingly</li>
</ul>
<p>Since the only part of the interface that knows how to manage IPv6 in EdgeOS is the config tree, and the config tree isn’t the easiest to work with, we’ll just work on the command line.</p>
<h4 id="modem-configuration">Modem Configuration</h4>
<p>My modem is NVG599. I had to enable IPv6 and its settings. I won’t go in to detail here, but I had to ensure that the IPv6 was turned on under <em>Home Network</em> > <em>IPv6</em>. That then allowed me to enable DHCPv6 and DHCPv6 Prefix Delegation. Once that was enabled I could see in the main <em>Home Network</em> tab that the modem had received an IPv6 address and that prefix delegation was enabled.</p>
<p>The modem is operating in bridge mode, but I believe that has no effect on this setup information.</p>
<p>Once enabled, take note of the <strong>IPv6 Delegated Prefix Subnet</strong> in the <em>Home Network</em> tab. The number after the slash if your prefix length. In my case I saw <code class="language-plaintext highlighter-rouge">::/64</code>.</p>
<h4 id="edgeos-command-line-basics">EdgeOS Command Line Basics</h4>
<p>Hopefully you’re comfortable with making changes to your router over SSH. If not, here’s a quick primer to editing the configuration.</p>
<p>Once logged in to the router, you can check your current configuration:</p>
<div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># To see the entire configuration tree
</span><span class="n">show</span> <span class="n">configuration</span>
<span class="c"># To see neatly formatted interface information
</span><span class="n">show</span> <span class="n">interfaces</span>
<span class="c"># To see neatly formatted firewall configuration
</span><span class="n">show</span> <span class="n">firewall</span>
</code></pre></div></div>
<p>You can use those commands later on to confirm your changes.</p>
<p>To actually edit the configuration:</p>
<div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># enter configuration mode
</span><span class="n">configure</span>
<span class="c"># … make changes as outlined below
</span>
<span class="c"># commit the changes for them to take effect, changes are
# not permanent until they're saved
</span><span class="n">commit</span>
<span class="c"># save so that changes are persisted in the config file.
# this makes the changes permanent.
</span><span class="n">save</span>
<span class="c"># get out
</span><span class="n">exit</span>
</code></pre></div></div>
<p>If at any time you’re not comfortable with the changes you’ve made, you can always bail out with:</p>
<div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">exit</span> <span class="n">discard</span>
</code></pre></div></div>
<h4 id="interface-configuration">Interface Configuration</h4>
<p>Now, we need to setup the WAN interface on the router to enable IPv6 to use slaac and to accept an address range as specified by the service. This is commonly <code class="language-plaintext highlighter-rouge">/48</code>, <code class="language-plaintext highlighter-rouge">/56</code> and <code class="language-plaintext highlighter-rouge">/64</code>. Your modem should tell you what you’re dealing with. Despite most advice I found for AT&T saying it would be <code class="language-plaintext highlighter-rouge">/56</code>, as noted in the previous section, for me it was <code class="language-plaintext highlighter-rouge">/64</code>.</p>
<p>Most articles out there will have you set the <code class="language-plaintext highlighter-rouge">host-address</code> and <code class="language-plaintext highlighter-rouge">prefix-id</code> configuration options. I found these aren’t necessary unless you know your specific needs. Most likely if you’re reading <em>this</em>, you don’t have specific needs, you’re just wanting it to work.</p>
<div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">edit</span> <span class="n">interfaces</span> <span class="n">ethernet</span> <span class="n">eth0</span>
<span class="n">set</span> <span class="n">ipv6</span> <span class="n">address</span> <span class="n">autoconf</span>
<span class="n">set</span> <span class="n">dhcpv6</span>-<span class="n">pd</span> <span class="n">pd</span> <span class="m">0</span> <span class="n">prefix</span>-<span class="n">length</span> /<span class="m">64</span>
<span class="n">set</span> <span class="n">dhcpv6</span>-<span class="n">pd</span> <span class="n">pd</span> <span class="m">0</span> <span class="n">interface</span> <span class="n">eth1</span> <span class="n">service</span> <span class="n">slaac</span>
<span class="n">top</span>
</code></pre></div></div>
<p>Some information out there says that this isn’t needed on newer versions of EdgeOS, but I had to set up router advertisement for this to work.</p>
<div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">edit</span> <span class="n">interfaces</span> <span class="n">ethernet</span> <span class="n">eth1</span>
<span class="n">set</span> <span class="n">ipv6</span> <span class="n">router</span>-<span class="n">advert</span> <span class="n">prefix</span> ::/<span class="m">64</span>
<span class="n">set</span> <span class="n">ipv6</span> <span class="n">router</span>-<span class="n">advert</span> <span class="n">radvd</span>-<span class="n">options</span> <span class="s2">"RDNSS DNS-SERVER-IPV6-ADDRESS {};"</span>
<span class="n">top</span>
</code></pre></div></div>
<p><strong>Important:</strong> The <code class="language-plaintext highlighter-rouge">radvd-options</code> entry above is optional if you’re OK with getting DNS from your ISP. I’m using a Pi-hole internally so I’ve set it up so that I can get ad blocking across my entire network. I replaced <code class="language-plaintext highlighter-rouge">DNS-SERVER-IPV6-ADDRESS</code> with the <strong>local-only</strong> IPv6 address of my Pi-hole server (the address that starts with <code class="language-plaintext highlighter-rouge">fe</code>). Raspbian OS generates these link-local addresses from the MAC address on the device, so it can be considered a predictable/static self assigned address.</p>
<p>Save it all</p>
<div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">commit</span>
<span class="n">save</span>
</code></pre></div></div>
<h4 id="firewall-configuration">Firewall Configuration</h4>
<p>For IPv6 to work properly we need to let those ICMPv6 control messages through. I’m not entirely sure about the internal specifics of the firewall rule as it is applied, but these ICMPv6 packets should only be considered valid by the router if they meet the hop limit, which helps ensure the integrity and authenticity of the request.</p>
<div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">edit</span> <span class="n">firewall</span> <span class="n">ipv6</span>-<span class="n">name</span> <span class="n">WANv6_IN</span>
<span class="n">set</span> <span class="n">default</span>-<span class="n">action</span> <span class="n">dropset</span> <span class="n">rule</span> <span class="m">10</span> <span class="n">action</span> <span class="n">accept</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">10</span> <span class="n">description</span> <span class="s2">"allow established"</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">10</span> <span class="n">protocol</span> <span class="n">all</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">10</span> <span class="n">state</span> <span class="n">established</span> <span class="n">enable</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">10</span> <span class="n">state</span> <span class="n">related</span> <span class="n">enableset</span> <span class="n">rule</span> <span class="m">20</span> <span class="n">action</span> <span class="n">drop</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">20</span> <span class="n">description</span> <span class="s2">"drop invalid packets"</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">20</span> <span class="n">protocol</span> <span class="n">all</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">20</span> <span class="n">state</span> <span class="n">invalid</span> <span class="n">enableset</span> <span class="n">rule</span> <span class="m">30</span> <span class="n">action</span> <span class="n">accept</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">30</span> <span class="n">description</span> <span class="s2">"allow ICMPv6"</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">30</span> <span class="n">protocol</span> <span class="n">icmpv6</span>
<span class="n">top</span>
</code></pre></div></div>
<p>Since DHCP is done via SLAAC, which is managed by AT&T, we have to also allow the internal network to properly relay the DHCP packets to flow over UDP.</p>
<div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">edit</span> <span class="n">firewall</span> <span class="n">ipv6</span>-<span class="n">name</span> <span class="n">WANv6_LOCAL</span>
<span class="n">set</span> <span class="n">default</span>-<span class="n">action</span> <span class="n">dropset</span> <span class="n">rule</span> <span class="m">10</span> <span class="n">action</span> <span class="n">accept</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">10</span> <span class="n">description</span> <span class="s2">"allow established"</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">10</span> <span class="n">protocol</span> <span class="n">all</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">10</span> <span class="n">state</span> <span class="n">established</span> <span class="n">enable</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">10</span> <span class="n">state</span> <span class="n">related</span> <span class="n">enableset</span> <span class="n">rule</span> <span class="m">20</span> <span class="n">action</span> <span class="n">drop</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">20</span> <span class="n">description</span> <span class="s2">"drop invalid packets"</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">20</span> <span class="n">protocol</span> <span class="n">all</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">20</span> <span class="n">state</span> <span class="n">invalid</span> <span class="n">enableset</span> <span class="n">rule</span> <span class="m">30</span> <span class="n">action</span> <span class="n">accept</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">30</span> <span class="n">description</span> <span class="s2">"allow ICMPv6"</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">30</span> <span class="n">protocol</span> <span class="n">icmpv6set</span> <span class="n">rule</span> <span class="m">40</span> <span class="n">action</span> <span class="n">accept</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">40</span> <span class="n">description</span> <span class="s2">"allow DHCPv6 client/server"</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">40</span> <span class="n">destination</span> <span class="n">port</span> <span class="m">546</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">40</span> <span class="n">source</span> <span class="n">port</span> <span class="m">547</span>
<span class="n">set</span> <span class="n">rule</span> <span class="m">40</span> <span class="n">protocol</span> <span class="n">udp</span>
<span class="n">top</span>
</code></pre></div></div>
<p>Apply the rules to the LAN interface(s) as required. Repeat for any and all active interfaces on the router.</p>
<div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">set</span> <span class="n">interfaces</span> <span class="n">ethernet</span> <span class="n">eth1</span> <span class="n">firewall</span> <span class="n">in</span> <span class="n">ipv6</span>-<span class="n">name</span> <span class="n">WANv6_IN</span>
<span class="n">set</span> <span class="n">interfaces</span> <span class="n">ethernet</span> <span class="n">eth1</span> <span class="n">firewall</span> <span class="n">local</span> <span class="n">ipv6</span>-<span class="n">name</span> <span class="n">WANv6_LOCAL</span>
</code></pre></div></div>
<p>And, again, save it all</p>
<div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">commit</span>
<span class="n">save</span>
</code></pre></div></div>
<h4 id="special-case-for-ubuntu">Special Case for Ubuntu</h4>
<p>For my Ubuntu client I needed to enable an IPv6 security feature. Normally an IP address is derived based on the network adapter’s MAC address to make it predictable, or static. If the computer is not a server and doesn’t need a static address it is better to occasionally roll that public ip address to maintain a bit of anonymity. This is done automatically in almost every other OS, including Android, so I was surprised to find out that I had to enable it in Ubuntu.</p>
<p>This can be enabled via <code class="language-plaintext highlighter-rouge">sysctl</code>. Replace <code class="language-plaintext highlighter-rouge">enp7s0</code> with your primary network interface address. Mostly this is <code class="language-plaintext highlighter-rouge">eth0</code>, but in my case, and becoming more common, is a different scheme that is derived from the network interface’s MAC address to make internal interface naming more consistent and predictable when multiple network interfaces are present.</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>sysctl net.ipv6.conf.enp7s0.use_tempaddr<span class="o">=</span>2
<span class="nb">sudo</span> /etc/init.d/networking restart
</code></pre></div></div>
<p>I’ve seen recommendations to set <code class="language-plaintext highlighter-rouge">net.ipv6.conf.all.use_tempaddr = 2</code> and <code class="language-plaintext highlighter-rouge">net.ipv6.conf.default.use_tempaddr = 2</code> but I’ve also read that those are applied AFTER the initial boot sequence, after the interfaces have already initialized, but that when naming the interface it happens prior to the interface coming online. I’m not sure which is true, but with one network interface in the system naming it in the config is hardly a burden.</p>
<p><strong>2022-07-05 - Distribution Upgrade Note:</strong> The <code class="language-plaintext highlighter-rouge">use_tempaddr</code> setting, for me at least, we reset when performing a dist-upgrade in ubuntu. So it is probably best to put these in a configuration file in <code class="language-plaintext highlighter-rouge">/etc/sysctl.d</code>.</p>
<h4 id="voila">Voila</h4>
<p>With that I have functioning IPv6 addresses and traffic. Head on over to <a href="https://ipv6-test.com/">https://ipv6-test.com/</a> to validate your configuration. It was a bit of a ride to get there and I’m sure this article will be confusing to someone else in the future as the configuration options change and are renamed in EdgeOS, but maybe this’ll help me reconfigure everything in the future when I eventually upgrade my network to get 10GB internal networking :D</p>Shawn ParkerThis isn’t the first blog post on how to do this, and it probably won’t be the last, but since IPv6, even within AT&T, seems to vary, and the quality of the blog posts out there vaires, this is also so that I have record of what I did for my actual needs. I’m not a network engineer. So this was mostly just piecing together bits of information that I could find posted by others, and then correcting it for my needs, mostly through trial and error. This will all assume that you: are working on an EdgeRouter without a built in switch are working with EdgeOS 2+ (this was done on 2.0.8) have the internet coming in on the eth0 and aren’t some kind of monster that uses another port for your WAN. If you are, then adjust the interfaces below accordingly Since the only part of the interface that knows how to manage IPv6 in EdgeOS is the config tree, and the config tree isn’t the easiest to work with, we’ll just work on the command line. Modem Configuration My modem is NVG599. I had to enable IPv6 and its settings. I won’t go in to detail here, but I had to ensure that the IPv6 was turned on under Home Network > IPv6. That then allowed me to enable DHCPv6 and DHCPv6 Prefix Delegation. Once that was enabled I could see in the main Home Network tab that the modem had received an IPv6 address and that prefix delegation was enabled. The modem is operating in bridge mode, but I believe that has no effect on this setup information. Once enabled, take note of the IPv6 Delegated Prefix Subnet in the Home Network tab. The number after the slash if your prefix length. In my case I saw ::/64. EdgeOS Command Line Basics Hopefully you’re comfortable with making changes to your router over SSH. If not, here’s a quick primer to editing the configuration. Once logged in to the router, you can check your current configuration: # To see the entire configuration tree show configuration # To see neatly formatted interface information show interfaces # To see neatly formatted firewall configuration show firewall You can use those commands later on to confirm your changes. To actually edit the configuration: # enter configuration mode configure # … make changes as outlined below # commit the changes for them to take effect, changes are # not permanent until they're saved commit # save so that changes are persisted in the config file. # this makes the changes permanent. save # get out exit If at any time you’re not comfortable with the changes you’ve made, you can always bail out with: exit discard Interface Configuration Now, we need to setup the WAN interface on the router to enable IPv6 to use slaac and to accept an address range as specified by the service. This is commonly /48, /56 and /64. Your modem should tell you what you’re dealing with. Despite most advice I found for AT&T saying it would be /56, as noted in the previous section, for me it was /64. Most articles out there will have you set the host-address and prefix-id configuration options. I found these aren’t necessary unless you know your specific needs. Most likely if you’re reading this, you don’t have specific needs, you’re just wanting it to work. edit interfaces ethernet eth0 set ipv6 address autoconf set dhcpv6-pd pd 0 prefix-length /64 set dhcpv6-pd pd 0 interface eth1 service slaac top Some information out there says that this isn’t needed on newer versions of EdgeOS, but I had to set up router advertisement for this to work. edit interfaces ethernet eth1 set ipv6 router-advert prefix ::/64 set ipv6 router-advert radvd-options "RDNSS DNS-SERVER-IPV6-ADDRESS {};" top Important: The radvd-options entry above is optional if you’re OK with getting DNS from your ISP. I’m using a Pi-hole internally so I’ve set it up so that I can get ad blocking across my entire network. I replaced DNS-SERVER-IPV6-ADDRESS with the local-only IPv6 address of my Pi-hole server (the address that starts with fe). Raspbian OS generates these link-local addresses from the MAC address on the device, so it can be considered a predictable/static self assigned address. Save it all commit save Firewall Configuration For IPv6 to work properly we need to let those ICMPv6 control messages through. I’m not entirely sure about the internal specifics of the firewall rule as it is applied, but these ICMPv6 packets should only be considered valid by the router if they meet the hop limit, which helps ensure the integrity and authenticity of the request. edit firewall ipv6-name WANv6_IN set default-action dropset rule 10 action accept set rule 10 description "allow established" set rule 10 protocol all set rule 10 state established enable set rule 10 state related enableset rule 20 action drop set rule 20 description "drop invalid packets" set rule 20 protocol all set rule 20 state invalid enableset rule 30 action accept set rule 30 description "allow ICMPv6" set rule 30 protocol icmpv6 top Since DHCP is done via SLAAC, which is managed by AT&T, we have to also allow the internal network to properly relay the DHCP packets to flow over UDP. edit firewall ipv6-name WANv6_LOCAL set default-action dropset rule 10 action accept set rule 10 description "allow established" set rule 10 protocol all set rule 10 state established enable set rule 10 state related enableset rule 20 action drop set rule 20 description "drop invalid packets" set rule 20 protocol all set rule 20 state invalid enableset rule 30 action accept set rule 30 description "allow ICMPv6" set rule 30 protocol icmpv6set rule 40 action accept set rule 40 description "allow DHCPv6 client/server" set rule 40 destination port 546 set rule 40 source port 547 set rule 40 protocol udp top Apply the rules to the LAN interface(s) as required. Repeat for any and all active interfaces on the router. set interfaces ethernet eth1 firewall in ipv6-name WANv6_IN set interfaces ethernet eth1 firewall local ipv6-name WANv6_LOCAL And, again, save it all commit save Special Case for Ubuntu For my Ubuntu client I needed to enable an IPv6 security feature. Normally an IP address is derived based on the network adapter’s MAC address to make it predictable, or static. If the computer is not a server and doesn’t need a static address it is better to occasionally roll that public ip address to maintain a bit of anonymity. This is done automatically in almost every other OS, including Android, so I was surprised to find out that I had to enable it in Ubuntu. This can be enabled via sysctl. Replace enp7s0 with your primary network interface address. Mostly this is eth0, but in my case, and becoming more common, is a different scheme that is derived from the network interface’s MAC address to make internal interface naming more consistent and predictable when multiple network interfaces are present. sudo sysctl net.ipv6.conf.enp7s0.use_tempaddr=2 sudo /etc/init.d/networking restart I’ve seen recommendations to set net.ipv6.conf.all.use_tempaddr = 2 and net.ipv6.conf.default.use_tempaddr = 2 but I’ve also read that those are applied AFTER the initial boot sequence, after the interfaces have already initialized, but that when naming the interface it happens prior to the interface coming online. I’m not sure which is true, but with one network interface in the system naming it in the config is hardly a burden. 2022-07-05 - Distribution Upgrade Note: The use_tempaddr setting, for me at least, we reset when performing a dist-upgrade in ubuntu. So it is probably best to put these in a configuration file in /etc/sysctl.d. Voila With that I have functioning IPv6 addresses and traffic. Head on over to https://ipv6-test.com/ to validate your configuration. It was a bit of a ride to get there and I’m sure this article will be confusing to someone else in the future as the configuration options change and are renamed in EdgeOS, but maybe this’ll help me reconfigure everything in the future when I eventually upgrade my network to get 10GB internal networking :DOS X Samba with a Linux Server2020-07-03T14:01:42-07:002020-07-03T14:01:42-07:00https://top-frog.com/2020/07/03/osx-samba-with-linux-server<p>Since migrating my iTu~ err… Music library to a Linux server to save space on my MacBook Pro I’ve been lamenting the move. Accessing my library via SMB was incurring the slowest speeds known to man, as well as was what seemed to be file writing issues. I was also continually having issues with artwork going missing or Music not being able to find the library at all.</p>
<p>Today I finally dug in to see what I was doing wrong. That turned out to be not having read any docs.</p>
<h4 id="it-is-already-a-solved-problem">It is Already a Solved Problem</h4>
<p>I don’t know much about samba, can’t say that I want to either. So I was pleased to find out that I had simply been missing a page in the Samba Wiki that was specifically to show morons like me how to <a href="https://wiki.samba.org/index.php/Configure_Samba_to_Work_Better_with_Mac_OS_X">Configure Samba to Work Better with Mac OS X</a>.</p>
<h4 id="even-apple-has-documentation">Even Apple has Documentation</h4>
<p>I also found advice that disabling signing can reduce overhead, so I implemented that as well. And as it turns out there’s a support document from apple on how to <a href="https://support.apple.com/en-us/HT205926">Turn off package signing for SMB2 and SMB3 connections</a>. Apple’s reasoning isn’t speed or stability, but compatibilty, but it helps me out.</p>
<h4 id="other-additions">Other Additions</h4>
<p>There’s also common configuration recommendations on how to speed up Samba connections by modifying socket options, raw read/writes, and directory path caching.</p>
<h4 id="the-change-set">The Change Set</h4>
<p>After all was said and done I ended up much happier than I’d been before, and now Music is much, much happier with the setup.</p>
<p>So, enough blabbing, what you’re actually interested in is what you have to do, right?</p>
<p><strong>On the Linux server side</strong> (for me that’s Ubuntu 20.04 with Samba 4.11.6) I added this to my <code class="language-plaintext highlighter-rouge">/etc/samba/smb.conf</code> file:</p>
<div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">server</span> <span class="n">signing</span> = <span class="n">no</span>
<span class="c"># This has no effect if connections are signed
</span><span class="n">min</span> <span class="n">receivefile</span> <span class="n">size</span> = <span class="m">16384</span>
<span class="n">socket</span> <span class="n">options</span> = <span class="n">TCP_NODELAY</span> <span class="n">IPTOS_LOWDELAY</span>
<span class="n">read</span> <span class="n">raw</span> = <span class="n">yes</span>
<span class="n">write</span> <span class="n">raw</span> = <span class="n">yes</span>
<span class="n">strict</span> <span class="n">locking</span> = <span class="n">auto</span>
<span class="n">getwd</span> <span class="n">cache</span> = <span class="n">yes</span>
<span class="n">min</span> <span class="n">protocol</span> = <span class="n">SMB2</span>
<span class="n">ea</span> <span class="n">support</span> = <span class="n">yes</span>
<span class="c"># VFS enablement, order on this next line is important
</span><span class="n">vfs</span> <span class="n">objects</span> = <span class="n">catia</span> <span class="n">fruit</span> <span class="n">streams_xattr</span>
<span class="n">fruit</span>:<span class="n">metadata</span> = <span class="n">stream</span>
<span class="n">fruit</span>:<span class="n">model</span> = <span class="n">MacSamba</span>
<span class="n">fruit</span>:<span class="n">veto_appledouble</span> = <span class="n">no</span>
<span class="n">fruit</span>:<span class="n">posix_rename</span> = <span class="n">yes</span>
<span class="n">fruit</span>:<span class="n">zero_file_id</span> = <span class="n">yes</span>
<span class="n">fruit</span>:<span class="n">wipe_intentionally_left_blank_rfork</span> = <span class="n">yes</span>
<span class="n">fruit</span>:<span class="n">delete_empty_adfiles</span> = <span class="n">yes</span>
</code></pre></div></div>
<p>This relies on the install of Samba to include virtual file system modules. I didn’t install samba myself on my Linux server, I enabled file sharing via the system preferences. This gave me a pretty full featured Samba install and included the vfs modules I needed. The default modules all appear to get added via a single <code class="language-plaintext highlighter-rouge">samba-vfs-modules</code> package. Your mileage may vary here.</p>
<p>Verify the config with <code class="language-plaintext highlighter-rouge">testparm</code>. Then if you’re good restart the Samba service with <code class="language-plaintext highlighter-rouge">sudo service smbd restart</code>.</p>
<p><strong>On the OS X side</strong> (for me that is, unfortunately, Catalina) I had to create a new file named <code class="language-plaintext highlighter-rouge">/etc/nsmb.conf</code> and add this to disable it wanting to use packet signing:</p>
<div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[<span class="n">default</span>]
<span class="n">signing_required</span>=<span class="n">no</span>
</code></pre></div></div>
<p>No restart required, just reconnect to the server.</p>
<h4 id="and-thats-it">And that’s it</h4>
<p>I have no benchmarks or timings to show before and after results. I can only convey that I now have less aggravation when loading my Music library, which resided in a directory with ~1300 entries. An initial hit can still be felt when that directory is first traversed, but it is much better than it was before, and the system runs much smoother overall.</p>Shawn ParkerSince migrating my iTu~ err… Music library to a Linux server to save space on my MacBook Pro I’ve been lamenting the move. Accessing my library via SMB was incurring the slowest speeds known to man, as well as was what seemed to be file writing issues. I was also continually having issues with artwork going missing or Music not being able to find the library at all. Today I finally dug in to see what I was doing wrong. That turned out to be not having read any docs. It is Already a Solved Problem I don’t know much about samba, can’t say that I want to either. So I was pleased to find out that I had simply been missing a page in the Samba Wiki that was specifically to show morons like me how to Configure Samba to Work Better with Mac OS X. Even Apple has Documentation I also found advice that disabling signing can reduce overhead, so I implemented that as well. And as it turns out there’s a support document from apple on how to Turn off package signing for SMB2 and SMB3 connections. Apple’s reasoning isn’t speed or stability, but compatibilty, but it helps me out. Other Additions There’s also common configuration recommendations on how to speed up Samba connections by modifying socket options, raw read/writes, and directory path caching. The Change Set After all was said and done I ended up much happier than I’d been before, and now Music is much, much happier with the setup. So, enough blabbing, what you’re actually interested in is what you have to do, right? On the Linux server side (for me that’s Ubuntu 20.04 with Samba 4.11.6) I added this to my /etc/samba/smb.conf file: server signing = no # This has no effect if connections are signed min receivefile size = 16384 socket options = TCP_NODELAY IPTOS_LOWDELAY read raw = yes write raw = yes strict locking = auto getwd cache = yes min protocol = SMB2 ea support = yes # VFS enablement, order on this next line is important vfs objects = catia fruit streams_xattr fruit:metadata = stream fruit:model = MacSamba fruit:veto_appledouble = no fruit:posix_rename = yes fruit:zero_file_id = yes fruit:wipe_intentionally_left_blank_rfork = yes fruit:delete_empty_adfiles = yes This relies on the install of Samba to include virtual file system modules. I didn’t install samba myself on my Linux server, I enabled file sharing via the system preferences. This gave me a pretty full featured Samba install and included the vfs modules I needed. The default modules all appear to get added via a single samba-vfs-modules package. Your mileage may vary here. Verify the config with testparm. Then if you’re good restart the Samba service with sudo service smbd restart. On the OS X side (for me that is, unfortunately, Catalina) I had to create a new file named /etc/nsmb.conf and add this to disable it wanting to use packet signing: [default] signing_required=no No restart required, just reconnect to the server. And that’s it I have no benchmarks or timings to show before and after results. I can only convey that I now have less aggravation when loading my Music library, which resided in a directory with ~1300 entries. An initial hit can still be felt when that directory is first traversed, but it is much better than it was before, and the system runs much smoother overall.New Arrival: Stella2020-04-05T06:28:00-07:002020-04-05T06:28:00-07:00https://top-frog.com/2020/04/05/new-arrival-stella<p>Seeing as how we’re gonna be a lockdown for a while we considered this a good time to bring on a new addition to the family.</p>
<p><strong>Meet Stella.</strong></p>
<div role="figure">
<a href="https://www.flickr.com/photos/tehgipster/49736209052/" class="thickbox frame ">
<img src="https://live.staticflickr.com/65535/49736209052_f0269a1a36_m.jpg" alt="Photograph: Stella" srcset="https://live.staticflickr.com/65535/49736209052_f0269a1a36_m.jpg 240w, https://live.staticflickr.com/65535/49736209052_f0269a1a36_n.jpg 320w, https://live.staticflickr.com/65535/49736209052_f0269a1a36.jpg 500w, https://live.staticflickr.com/65535/49736209052_f0269a1a36_z.jpg 640w, https://live.staticflickr.com/65535/49736209052_f0269a1a36_b.jpg 1024w, https://live.staticflickr.com/65535/49736209052_2e2f1bb38f_o.jpg 2880w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="500" height="375" data-lg-img="{"id":"49736209052","src":"https://live.staticflickr.com/65535/49736209052_f0269a1a36_b.jpg","width":1024,"height":768,"title":"Stella","caption":"Stella<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/49736209052/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>
<p>Stella is a 15 year old Pit Bull. She’s a total sweetheart. We were looking for older pitties, around 8+ years old. However when inquiring about another dog we liked, who was unavailable, we mentioned that we’re looking for older dogs and the gal at the agency got excited.</p>
<p>As it turns out they had a foster person who has unfortunately met with some mental decline and they were scrambling to find the dogs a new home. The foster was forgetting to feed the dogs and overall just not able to function any more. So upon seeing a video of Stella we agreed to take her in for however long she has left.</p>
<div role="figure">
<a href="https://www.flickr.com/photos/tehgipster/49739778918/" class="thickbox frame ">
<img src="https://live.staticflickr.com/65535/49739778918_5f1383a73c_m.jpg" alt="Photograph: Stella" srcset="https://live.staticflickr.com/65535/49739778918_5f1383a73c_m.jpg 240w, https://live.staticflickr.com/65535/49739778918_5f1383a73c_n.jpg 320w, https://live.staticflickr.com/65535/49739778918_5f1383a73c.jpg 500w, https://live.staticflickr.com/65535/49739778918_5f1383a73c_z.jpg 640w, https://live.staticflickr.com/65535/49739778918_5f1383a73c_b.jpg 1024w, https://live.staticflickr.com/65535/49739778918_4bd0a11346_o.jpg 2880w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="500" height="375" data-lg-img="{"id":"49739778918","src":"https://live.staticflickr.com/65535/49739778918_5f1383a73c_b.jpg","width":1024,"height":768,"title":"Stella","caption":"Stella<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/49739778918/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>
<p>She’s old and slow. Can’t really get up and down the stairs by herself. But she’s a happy, gentle, sweet and loving little cuddle bunny. She just wants to hang out and go for a walk once in a while. Kinda like us.</p>
<div role="figure">
<a href="https://www.flickr.com/photos/tehgipster/49735339168/" class="thickbox frame ">
<img src="https://live.staticflickr.com/65535/49735339168_f72aa5f99a_m.jpg" alt="Photograph: Stella" srcset="https://live.staticflickr.com/65535/49735339168_f72aa5f99a_m.jpg 240w, https://live.staticflickr.com/65535/49735339168_f72aa5f99a_n.jpg 320w, https://live.staticflickr.com/65535/49735339168_f72aa5f99a.jpg 500w, https://live.staticflickr.com/65535/49735339168_f72aa5f99a_z.jpg 640w, https://live.staticflickr.com/65535/49735339168_f72aa5f99a_b.jpg 1024w, https://live.staticflickr.com/65535/49735339168_c77ab32327_o.jpg 2880w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="500" height="375" data-lg-img="{"id":"49735339168","src":"https://live.staticflickr.com/65535/49735339168_f72aa5f99a_b.jpg","width":1024,"height":768,"title":"Stella","caption":"Stella<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/49735339168/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>Shawn ParkerSeeing as how we’re gonna be a lockdown for a while we considered this a good time to bring on a new addition to the family. Meet Stella. Stella is a 15 year old Pit Bull. She’s a total sweetheart. We were looking for older pitties, around 8+ years old. However when inquiring about another dog we liked, who was unavailable, we mentioned that we’re looking for older dogs and the gal at the agency got excited. As it turns out they had a foster person who has unfortunately met with some mental decline and they were scrambling to find the dogs a new home. The foster was forgetting to feed the dogs and overall just not able to function any more. So upon seeing a video of Stella we agreed to take her in for however long she has left. She’s old and slow. Can’t really get up and down the stairs by herself. But she’s a happy, gentle, sweet and loving little cuddle bunny. She just wants to hang out and go for a walk once in a while. Kinda like us.The Dumbest Zoom Mute Button In The World2020-04-01T06:28:00-07:002020-04-01T06:28:00-07:00https://top-frog.com/2020/04/01/the-dumbest-zoom-mute-button<p>Now that we’re all stuck at home and working more and more on video conferencing, and most of us on Zoom as they appear to have won the video conferencing war (despite their privacy bungles). On top of that, I’m often not totally paying attention all the time (I’m writing this during an engineering wide ops meeting), so I’m noticing that despite the various shortcuts available in Zoom my ability to quickly mute and unmute is severly lacking.</p>
<p>While clearing out my desk space and making room to effectively work I noticed this old usb Big Red Button from Dream Cheeky. It was purchased many years ago by a co-worker so that we could make fun of a different co-worker, but that time is now long gone.</p>
<p>I remembered that there was a Ruby library for interfacing with the button, which is a simple USB HID device. So with a little bit of quick googling on Applescipt libraries in Ruby I was able to crap out a bare bones event listener. Here’s the crappy code:</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">require</span> <span class="s1">'rubygems'</span>
<span class="nb">require</span> <span class="s1">'dream_cheeky'</span>
<span class="nb">require</span> <span class="s1">'applescript'</span>
<span class="no">DreamCheeky</span><span class="o">::</span><span class="no">BigRedButton</span><span class="p">.</span><span class="nf">run</span> <span class="k">do</span>
<span class="n">push</span> <span class="k">do</span>
<span class="n">script</span> <span class="o">=</span> <span class="o"><<-</span><span class="no">KEYPRESS</span><span class="sh">
tell application "zoom.us"
activate
tell application "System Events"
keystroke "a" using {shift down, command down}
end tell
end tell
</span><span class="no">KEYPRESS</span>
<span class="no">AppleScript</span><span class="p">.</span><span class="nf">execute</span><span class="p">(</span><span class="n">script</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>
<p>Its not even a managed application, I just launch it with <code class="language-plaintext highlighter-rouge">ruby mute-button.rb</code> and let it run in a terminal window that gets minimized in to my dock.</p>
<p><span class="frame">
<img class="frame" src="/assets/articles/mute-button-large.gif" alt="Mute!" role="presentation" />
</span></p>
<p>It will run amok if I unplug and go to work downstairs, but the laptop’s fans kindly remind me when I’ve done this.</p>
<p>I know this can be better, but for just pulling something out of a drawer and banging out a little bit of code I’m quite happy and it means that I can continue to divert my attention during meetings and push down the MTTR on my attention span.</p>Shawn ParkerNow that we’re all stuck at home and working more and more on video conferencing, and most of us on Zoom as they appear to have won the video conferencing war (despite their privacy bungles). On top of that, I’m often not totally paying attention all the time (I’m writing this during an engineering wide ops meeting), so I’m noticing that despite the various shortcuts available in Zoom my ability to quickly mute and unmute is severly lacking. While clearing out my desk space and making room to effectively work I noticed this old usb Big Red Button from Dream Cheeky. It was purchased many years ago by a co-worker so that we could make fun of a different co-worker, but that time is now long gone. I remembered that there was a Ruby library for interfacing with the button, which is a simple USB HID device. So with a little bit of quick googling on Applescipt libraries in Ruby I was able to crap out a bare bones event listener. Here’s the crappy code: require 'rubygems' require 'dream_cheeky' require 'applescript' DreamCheeky::BigRedButton.run do push do script = <<-KEYPRESS tell application "zoom.us" activate tell application "System Events" keystroke "a" using {shift down, command down} end tell end tell KEYPRESS AppleScript.execute(script) end end Its not even a managed application, I just launch it with ruby mute-button.rb and let it run in a terminal window that gets minimized in to my dock. It will run amok if I unplug and go to work downstairs, but the laptop’s fans kindly remind me when I’ve done this. I know this can be better, but for just pulling something out of a drawer and banging out a little bit of code I’m quite happy and it means that I can continue to divert my attention during meetings and push down the MTTR on my attention span.Our Step Dog Cody2020-02-03T05:28:00-08:002020-02-03T05:28:00-08:00https://top-frog.com/2020/02/03/step-dog-cody<p>We’ve not been ready to get new dogs after our little turds died. But we certainly do enjoy just having a step dog come and visit once in a while.</p>
<p>Meet Cody.</p>
<div role="figure" class="center">
<a href="https://www.flickr.com/photos/tehgipster/48970790358/" class="thickbox frame ">
<img src="https://live.staticflickr.com/65535/48970790358_f6e805ff7a_m.jpg" alt="Photograph: Cody" srcset="https://live.staticflickr.com/65535/48970790358_f6e805ff7a_m.jpg 221w, https://live.staticflickr.com/65535/48970790358_f6e805ff7a_n.jpg 294w, https://live.staticflickr.com/65535/48970790358_f6e805ff7a.jpg 460w, https://live.staticflickr.com/65535/48970790358_f6e805ff7a_z.jpg 588w, https://live.staticflickr.com/65535/48970790358_f6e805ff7a_b.jpg 941w, https://live.staticflickr.com/65535/48970790358_a952a312c8_o.jpg 3024w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="460" height="500" data-lg-img="{"id":"48970790358","src":"https://live.staticflickr.com/65535/48970790358_f6e805ff7a_b.jpg","width":941,"height":1024,"title":"Cody","caption":"Cody<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/48970790358/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>
<p>Cody likes to sit on the bed and stare out the window all day.</p>
<div role="figure">
<a href="https://www.flickr.com/photos/tehgipster/48970790378/" class="thickbox frame ">
<img src="https://live.staticflickr.com/65535/48970790378_c444371717_m.jpg" alt="Photograph: Cody" srcset="https://live.staticflickr.com/65535/48970790378_c444371717_m.jpg 240w, https://live.staticflickr.com/65535/48970790378_c444371717_n.jpg 320w, https://live.staticflickr.com/65535/48970790378_c444371717.jpg 500w, https://live.staticflickr.com/65535/48970790378_c444371717_z.jpg 640w, https://live.staticflickr.com/65535/48970790378_c444371717_b.jpg 1024w, https://live.staticflickr.com/65535/48970790378_f4eec2d7ee_o.jpg 4032w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="500" height="375" data-lg-img="{"id":"48970790378","src":"https://live.staticflickr.com/65535/48970790378_c444371717_b.jpg","width":1024,"height":768,"title":"Cody","caption":"Cody<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/48970790378/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>
<p>When he’s not surveying the neighborhood, he enjoys the couch.</p>
<div role="figure">
<a href="https://www.flickr.com/photos/tehgipster/48971342966/" class="thickbox frame ">
<img src="https://live.staticflickr.com/65535/48971342966_4945b5a0ca_m.jpg" alt="Photograph: Cody" srcset="https://live.staticflickr.com/65535/48971342966_4945b5a0ca_m.jpg 240w, https://live.staticflickr.com/65535/48971342966_4945b5a0ca_n.jpg 320w, https://live.staticflickr.com/65535/48971342966_4945b5a0ca.jpg 500w, https://live.staticflickr.com/65535/48971342966_4945b5a0ca_z.jpg 640w, https://live.staticflickr.com/65535/48971342966_4945b5a0ca_b.jpg 1024w, https://live.staticflickr.com/65535/48971342966_555642e839_o.jpg 3587w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="500" height="420" data-lg-img="{"id":"48971342966","src":"https://live.staticflickr.com/65535/48971342966_4945b5a0ca_b.jpg","width":1024,"height":860,"title":"Cody","caption":"Cody<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/48971342966/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>Shawn ParkerWe’ve not been ready to get new dogs after our little turds died. But we certainly do enjoy just having a step dog come and visit once in a while. Meet Cody. Cody likes to sit on the bed and stare out the window all day. When he’s not surveying the neighborhood, he enjoys the couch.A rant about Cardo Packtalk Slim2019-09-28T06:28:00-07:002019-09-28T06:28:00-07:00https://top-frog.com/2019/09/28/a_rant_about_cardo_packtalk_slim<p>Four-ish days on the road with new Cardo Packtalk Slim headsets and I’m left wondering how people rave about Cardo. Installation was easy, the units are light, and battery life was impressive, but that’s where the highlights end. The software leaves A LOT to be desired.</p>
<ul>
<li>I have “Hey Siri” turned off on my phone. I don’t want her listening in on me, yet twice I still found myself wondering why Siri has been invoked at all.</li>
<li>“Hey Cardo” is supposed to work. I could never get it to respond.</li>
<li>The radio (seriously, why can’t I disable this feature?) just turns on randomly. And since I never planned on using this functionality, I got to fumble around for a while on how to turn it off since I never looked up how to use the functionality in the first place.</li>
<li>My music just starts playing randomly. Same gripe on turning it off.</li>
</ul>
<p>That’s a lot of failures in the tertiary features, but what about the core functionality? The intercom. Well, its ok. The range is at least good.</p>
<ul>
<li>I’m guessing the headsets save on power by not transmitting 100% of the time, but what that means is that it misses the beginning syllables of your sentence. When giving terse responses this means that it may not even transmit your response.</li>
<li>Randomly I would just get unintelligible garbled junk when my wife is trying to talk to me. And from short distances at that.</li>
<li>I have to speak up and enunciate a lot or else my wife doesn’t hear or cannot understand me.</li>
<li>Don’t try to use the auto volume adjustment feature. You just won’t hear anything. Even when the feature is off it will still somehow try to modulate the volume of the transmission. I don’t get it at all.</li>
<li>Getting turn by turn directions and talking to someone is a nice feature, unless the person sighs or there’s wind over the mic and then your directions get faded way back and you don’t get to hear it. According to the manual it is supposed to favor turn by turn directions over rider to rider communication.</li>
<li>The units do come pre-paired from the factory. That’s good. But they also just randomly don’t pair with each other. That’s bad.</li>
</ul>
<p>All in all I’m sad one of the old Sena 10s headsets died. While I didn’t get to listen to directions while also talking, at least they got the core functionality right: I could talk to my wife reliably within reasonable distances.</p>
<p>Last, but not least, the PDF manual found online links out to non-existent FAQs for solving problems. That’s a problem.</p>
<h3 id="update-2019-10-08">Update 2019-10-08</h3>
<p>A few more days in and I’ve turned off all voice commands and so far no more unwanted invocations of my phone or the radio. But still some issues:</p>
<ul>
<li>Another case of the two paired headsets not connecting to each other. Had to restart each one a few times to get them to sync up. Pretty frustrating.</li>
<li>My headset decided that 1/4 - 1/3 power was enough to warrant immediate shutdown. The first time we stretched the batteries they were fine. We got plenty of battery warnings before anything happened. Today I just got shutdowns. Just “goodbye” and its gone. Charged back up and so far so good. We’ll see what happens when it gets back down under half battery.</li>
<li>Strange garblings again.</li>
</ul>
<h3 id="update-2019-10-20">Update 2019-10-20</h3>
<p>The wife’s USB charging port broke. These units are headed back to Amazon for a refund.
Looks like we’re headed back to Sena.</p>Shawn ParkerFour-ish days on the road with new Cardo Packtalk Slim headsets and I’m left wondering how people rave about Cardo. Installation was easy, the units are light, and battery life was impressive, but that’s where the highlights end. The software leaves A LOT to be desired. I have “Hey Siri” turned off on my phone. I don’t want her listening in on me, yet twice I still found myself wondering why Siri has been invoked at all. “Hey Cardo” is supposed to work. I could never get it to respond. The radio (seriously, why can’t I disable this feature?) just turns on randomly. And since I never planned on using this functionality, I got to fumble around for a while on how to turn it off since I never looked up how to use the functionality in the first place. My music just starts playing randomly. Same gripe on turning it off. That’s a lot of failures in the tertiary features, but what about the core functionality? The intercom. Well, its ok. The range is at least good. I’m guessing the headsets save on power by not transmitting 100% of the time, but what that means is that it misses the beginning syllables of your sentence. When giving terse responses this means that it may not even transmit your response. Randomly I would just get unintelligible garbled junk when my wife is trying to talk to me. And from short distances at that. I have to speak up and enunciate a lot or else my wife doesn’t hear or cannot understand me. Don’t try to use the auto volume adjustment feature. You just won’t hear anything. Even when the feature is off it will still somehow try to modulate the volume of the transmission. I don’t get it at all. Getting turn by turn directions and talking to someone is a nice feature, unless the person sighs or there’s wind over the mic and then your directions get faded way back and you don’t get to hear it. According to the manual it is supposed to favor turn by turn directions over rider to rider communication. The units do come pre-paired from the factory. That’s good. But they also just randomly don’t pair with each other. That’s bad. All in all I’m sad one of the old Sena 10s headsets died. While I didn’t get to listen to directions while also talking, at least they got the core functionality right: I could talk to my wife reliably within reasonable distances. Last, but not least, the PDF manual found online links out to non-existent FAQs for solving problems. That’s a problem. Update 2019-10-08 A few more days in and I’ve turned off all voice commands and so far no more unwanted invocations of my phone or the radio. But still some issues: Another case of the two paired headsets not connecting to each other. Had to restart each one a few times to get them to sync up. Pretty frustrating. My headset decided that 1/4 - 1/3 power was enough to warrant immediate shutdown. The first time we stretched the batteries they were fine. We got plenty of battery warnings before anything happened. Today I just got shutdowns. Just “goodbye” and its gone. Charged back up and so far so good. We’ll see what happens when it gets back down under half battery. Strange garblings again. Update 2019-10-20 The wife’s USB charging port broke. These units are headed back to Amazon for a refund. Looks like we’re headed back to Sena.Year of the Linux Desktop, Part 12019-06-12T15:03:00-07:002019-06-12T15:03:00-07:00https://top-frog.com/2019/06/12/year_of_the_linux_desktop_part_1<p>Over the years I’ve had a fleeting relationship with Linux. I use it every day, but mostly on remote servers. But I’ve never committed to actually <em>using</em> linux.</p>
<p>Until today. Well, last month, really.</p>
<h4 id="enter-the-penguin">Enter the Penguin</h4>
<p>I did some research, ordered some parts off of Amazon, and put together a computer. I made a couple of bad decisions on timing<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup> and the Video Card<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>, but overall its good. Really good. I got a plenty fast CPU in the Ryzen 7 2700X. The RX580 is overall a solid performer. Gobs of RAM and fast hard drives help a lot too. I loaded up the case with fans and the largest CPU cooler known to man and it runs cool and quiet. Overall I’m digging it a lot.</p>
<p>For the OS I decided that mainstream was the best place to start. So Ubuntu it was. I reinstalled a few times to check out XUbuntu and to try different versions to see what felt right. In the end I chose 19.04 solely because I didn’t see much use in an LTS system at this point. I’m gonna fuck it up to the point of needing a reinstall anyway, so why not try the latest and see how it goes.</p>
<h4 id="the-warm-glow-of-television">The warm glow of Television</h4>
<p>One criteria that I did have for this machine is that it should be able to run Plex Media Server and do it while running happily in the background. I already had the docker setup from using an older MacBook Pro as a media server. I pulled the mdadm raid array straight over, started the docker containers and had my media center back. Now I don’t care if I get video from the right source. Transcoding on this machine is a non-issue. In fact, I need to do it for larger files because my network goes over MoCA (coax) to get to the living room and that leaves a bit to be desired. Limiting the bandwidth doesn’t sacrifice quality on 1080p content and keeps the network overhead in check. The hard drives also get to hook up to a real SATA 6Gbps bus, so they’re no longer strangled by an older Firewire 800 Connection. All in all, huge win here.</p>
<p>Most of my dot-file configs came right over. I installed ZSH, all my favorite helpers and I get the same terminal experience that I had on my MacBook Pro, and that I get on my work MacBook Pro. So that’s pretty nice. I’m still working on small little things, but they’re mainly pathing differences between systems. Another huge win.</p>
<h4 id="whats-next">What’s next?</h4>
<p>That leaves a few topics for the future:</p>
<p><strong>Every Day Usefulness</strong>: There’s a lot of little things that I’ve learned to lean on with OSX. Spotlight/Launchbar. Quicklook. iCloud. iMessage. There’s a lot of functionality there that as of yet just doesn’t have a full featured equivalent on Linux.</p>
<p><strong>Creative Apps</strong>: I’ve gotten used to Pixelmator, Affinity Designer and Lightroom on the Mac (but I long for the return of Aperture). Good apps (mostly<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup>) with hardware acceleration support (because, lets face it, they get it for free if they’re using OSX to its fullest). Hardware accelerated anything on Linux seems to be… missing? Unless you’re mining Bitcoin, that is, and we’ll be having none of that pre-pubescent bullshit here.</p>
<p><strong>Development</strong>: Most of my common tools are available on Ubuntu. JetBrains software for the heavy lifting as well as Visual Studio Pro for the rest of it. Everything that I lean on the command line for, mostly the software stacks themselves, are fast, but no less a slog to configure. Linux is great, but far from magic. So far so good. There’s enough here for its own post.</p>
<p><strong>Gaming</strong>: I’m not a hard core gamer, but pulling out that really old copy of Half Life 2<sup id="fnref:4" role="doc-noteref"><a href="#fn:4" class="footnote" rel="footnote">4</a></sup> and getting 300 FPS is pretty cool. Now I need to find some game to keep my occupied. I don’t think Kerbel Space Program is gonna hold my interest for that long, but only time will tell there.</p>
<h4 id="onward">Onward</h4>
<p>In time I’ll have a better picture and understanding of wether Linux is where its at. If this experiment fails it’ll be unfortunate because I don’t see myself ever accepting Windows in to my house. The computer might be a freebie to my parents if that happens. But so far it feels like the worst case scenario is useful, but disappointing. But that’s jumping the gun. I’ll probably brick the OS a few more times before I make that determination ;)</p>
<p><strong>Postscript</strong>: In case anyone is interested, this is the parts list - <a href="https://pcpartpicker.com/list/VcZjmq">https://pcpartpicker.com/list/VcZjmq</a></p>
<hr />
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>I knew that Ryzen 9 CPUs were coming this year, but I didn’t want to wait long. Well… the day I first booted this Ryzen 7 system AMD releases ship dates for the new Ryzen 9 line. Dammit. At least, though, I bought an up to date motherboard so forward compatability with the 9 series should be OK if I feel that the benchmarks look droolworthy. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>I thought that I could get away with an Amd RX580 and be happy. Apple has been on Nvidia for a while and I never quite was happy with what I got when I did load Linux on my MacBook Pro. So I thought I’d give AMD a shot. Everything was good, it performs really well, gaming is solid, but then I got to OpenCL hardware acceleration for photo editing. It just isn’t there on the AMD drivers. In fact, the AMD drivers for Linux are quite puzzling in that they don’t appear to be fully maintained by AMD. They feel like a side project that never quite gets done. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p>I’m looking at you, Lightroom. What gives? <a href="#fnref:3" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:4" role="doc-endnote">
<p>15 years old and still awesome. <a href="#fnref:4" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>Shawn ParkerOver the years I’ve had a fleeting relationship with Linux. I use it every day, but mostly on remote servers. But I’ve never committed to actually using linux. Until today. Well, last month, really. Enter the Penguin I did some research, ordered some parts off of Amazon, and put together a computer. I made a couple of bad decisions on timing1 and the Video Card2, but overall its good. Really good. I got a plenty fast CPU in the Ryzen 7 2700X. The RX580 is overall a solid performer. Gobs of RAM and fast hard drives help a lot too. I loaded up the case with fans and the largest CPU cooler known to man and it runs cool and quiet. Overall I’m digging it a lot. For the OS I decided that mainstream was the best place to start. So Ubuntu it was. I reinstalled a few times to check out XUbuntu and to try different versions to see what felt right. In the end I chose 19.04 solely because I didn’t see much use in an LTS system at this point. I’m gonna fuck it up to the point of needing a reinstall anyway, so why not try the latest and see how it goes. The warm glow of Television One criteria that I did have for this machine is that it should be able to run Plex Media Server and do it while running happily in the background. I already had the docker setup from using an older MacBook Pro as a media server. I pulled the mdadm raid array straight over, started the docker containers and had my media center back. Now I don’t care if I get video from the right source. Transcoding on this machine is a non-issue. In fact, I need to do it for larger files because my network goes over MoCA (coax) to get to the living room and that leaves a bit to be desired. Limiting the bandwidth doesn’t sacrifice quality on 1080p content and keeps the network overhead in check. The hard drives also get to hook up to a real SATA 6Gbps bus, so they’re no longer strangled by an older Firewire 800 Connection. All in all, huge win here. Most of my dot-file configs came right over. I installed ZSH, all my favorite helpers and I get the same terminal experience that I had on my MacBook Pro, and that I get on my work MacBook Pro. So that’s pretty nice. I’m still working on small little things, but they’re mainly pathing differences between systems. Another huge win. What’s next? That leaves a few topics for the future: Every Day Usefulness: There’s a lot of little things that I’ve learned to lean on with OSX. Spotlight/Launchbar. Quicklook. iCloud. iMessage. There’s a lot of functionality there that as of yet just doesn’t have a full featured equivalent on Linux. Creative Apps: I’ve gotten used to Pixelmator, Affinity Designer and Lightroom on the Mac (but I long for the return of Aperture). Good apps (mostly3) with hardware acceleration support (because, lets face it, they get it for free if they’re using OSX to its fullest). Hardware accelerated anything on Linux seems to be… missing? Unless you’re mining Bitcoin, that is, and we’ll be having none of that pre-pubescent bullshit here. Development: Most of my common tools are available on Ubuntu. JetBrains software for the heavy lifting as well as Visual Studio Pro for the rest of it. Everything that I lean on the command line for, mostly the software stacks themselves, are fast, but no less a slog to configure. Linux is great, but far from magic. So far so good. There’s enough here for its own post. Gaming: I’m not a hard core gamer, but pulling out that really old copy of Half Life 24 and getting 300 FPS is pretty cool. Now I need to find some game to keep my occupied. I don’t think Kerbel Space Program is gonna hold my interest for that long, but only time will tell there. Onward In time I’ll have a better picture and understanding of wether Linux is where its at. If this experiment fails it’ll be unfortunate because I don’t see myself ever accepting Windows in to my house. The computer might be a freebie to my parents if that happens. But so far it feels like the worst case scenario is useful, but disappointing. But that’s jumping the gun. I’ll probably brick the OS a few more times before I make that determination ;) Postscript: In case anyone is interested, this is the parts list - https://pcpartpicker.com/list/VcZjmq I knew that Ryzen 9 CPUs were coming this year, but I didn’t want to wait long. Well… the day I first booted this Ryzen 7 system AMD releases ship dates for the new Ryzen 9 line. Dammit. At least, though, I bought an up to date motherboard so forward compatability with the 9 series should be OK if I feel that the benchmarks look droolworthy. ↩ I thought that I could get away with an Amd RX580 and be happy. Apple has been on Nvidia for a while and I never quite was happy with what I got when I did load Linux on my MacBook Pro. So I thought I’d give AMD a shot. Everything was good, it performs really well, gaming is solid, but then I got to OpenCL hardware acceleration for photo editing. It just isn’t there on the AMD drivers. In fact, the AMD drivers for Linux are quite puzzling in that they don’t appear to be fully maintained by AMD. They feel like a side project that never quite gets done. ↩ I’m looking at you, Lightroom. What gives? ↩ 15 years old and still awesome. ↩This Dog was a Jerk2017-09-03T02:00:38-07:002017-09-03T02:00:38-07:00https://top-frog.com/2017/09/03/this-dog-was-a-jerk<p>But he was our jerk. Our cute, loving, man-eating jerk.</p>
<div role="figure">
<a href="https://www.flickr.com/photos/tehgipster/8276656884/" class="thickbox frame ">
<img src="https://live.staticflickr.com/8068/8276656884_b831251923_m.jpg" alt="Photograph: Bear. Perched." srcset="https://live.staticflickr.com/8068/8276656884_b831251923_m.jpg 240w, https://live.staticflickr.com/8068/8276656884_b831251923_n.jpg 320w, https://live.staticflickr.com/8068/8276656884_b831251923.jpg 500w, https://live.staticflickr.com/8068/8276656884_b831251923_z.jpg 640w, https://live.staticflickr.com/8068/8276656884_b831251923_b.jpg 1024w, https://live.staticflickr.com/8068/8276656884_5ac83dc75e_o.jpg 1650w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="500" height="333" data-lg-img="{"id":"8276656884","src":"https://live.staticflickr.com/8068/8276656884_b831251923_b.jpg","width":"1024","height":"683","title":"Bear. Perched.","caption":"Bear. Perched.<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/8276656884/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>
<p>He didn’t like other people. He didn’t get along with other dogs. He had food aggression. He and his brother constantly fought. He wouldn’t keep on up walks, he kept his own pace, stopping to sniff and pee on everything. He wouldn’t cuddle any more in his old age, just sit across the room from us, wherever we were. He would tear this house apart, from end to end, in the pursuit of a fly. I’m pretty sure his life long dream was to eat a skateboarder.</p>
<p>He even bit the neighbor.</p>
<div role="figure" class="center">
<a href="https://www.flickr.com/photos/tehgipster/6161169845/" class="thickbox frame ">
<img src="https://live.staticflickr.com/6068/6161169845_79b8f05614_m.jpg" alt="Photograph: Funny little toad" srcset="https://live.staticflickr.com/6068/6161169845_79b8f05614_m.jpg 160w, https://live.staticflickr.com/6068/6161169845_79b8f05614_n.jpg 213w, https://live.staticflickr.com/6068/6161169845_79b8f05614.jpg 333w, https://live.staticflickr.com/6068/6161169845_79b8f05614_z.jpg 426w, https://live.staticflickr.com/6068/6161169845_79b8f05614_b.jpg 681w, https://live.staticflickr.com/6068/6161169845_1265d0ab40_o.jpg 1662w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="333" height="500" data-lg-img="{"id":"6161169845","src":"https://live.staticflickr.com/6068/6161169845_79b8f05614_b.jpg","width":"681","height":"1024","title":"Funny little toad","caption":"Funny little toad<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/6161169845/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>
<p>But he loved his food. Treats were like gold.</p>
<p>Any toy with a squeaker a conquest to silence that squeal from within. We still have a bin full the remains of his conquests. We’d buy him the strongest toys we could find and he’d have the squeaker out before we knew it. Even now, after he’s gone, I’m waiting to clean up the remains of his last toy so that I can take it in a bit longer. Relish the high pitched screams of the poor lobster who was sacrificed for the happiness of this pooch.</p>
<div role="figure">
<a href="https://www.flickr.com/photos/tehgipster/4637460659/" class="thickbox frame ">
<img src="https://live.staticflickr.com/4041/4637460659_fd71da85fd_m.jpg" alt="Photograph: Uh-huh.. whatever" srcset="https://live.staticflickr.com/4041/4637460659_fd71da85fd_m.jpg 240w, https://live.staticflickr.com/4041/4637460659_fd71da85fd_n.jpg 320w, https://live.staticflickr.com/4041/4637460659_fd71da85fd.jpg 500w, https://live.staticflickr.com/4041/4637460659_fd71da85fd_z.jpg 640w, https://live.staticflickr.com/4041/4637460659_fd71da85fd_b.jpg 1024w, https://live.staticflickr.com/4041/4637460659_266dc0899c_o.jpg 1650w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="500" height="333" data-lg-img="{"id":"4637460659","src":"https://live.staticflickr.com/4041/4637460659_fd71da85fd_b.jpg","width":"1024","height":"683","title":"Uh-huh.. whatever","caption":"Uh-huh.. whatever<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/4637460659/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>
<p>He was adorable. Our typical routine was to feed him and then finish up making our dinner. After he would finish his dinner he’d save his cookie so that he could eat it while we ate.</p>
<p>Protecting our house against the mailman was his self anointed duty. He knew what time of day it was. He’d growl as the mailman walked up. Watching dutifully through the window. He knew that he could also watch the mailman deliver next door. He’d watch carefully, constantly growling to fend off the evil package delivery. He’d also calmly wait for the return trip, on the far side of the street, to growl once more. Just to be sure. He always won that fight. The mailman would try, but every day be driven back away.</p>
<div role="figure">
<a href="https://www.flickr.com/photos/tehgipster/16992471000/" class="thickbox frame ">
<img src="https://live.staticflickr.com/7702/16992471000_e4f2c70137_m.jpg" alt="Photograph: Comfy" srcset="https://live.staticflickr.com/7702/16992471000_e4f2c70137_m.jpg 240w, https://live.staticflickr.com/7702/16992471000_e4f2c70137_n.jpg 320w, https://live.staticflickr.com/7702/16992471000_e4f2c70137.jpg 500w, https://live.staticflickr.com/7702/16992471000_e4f2c70137_z.jpg 640w, https://live.staticflickr.com/7702/16992471000_e4f2c70137_b.jpg 1024w, https://live.staticflickr.com/7702/16992471000_17dc496e7e_o.jpg 3264w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="500" height="375" data-lg-img="{"id":"16992471000","src":"https://live.staticflickr.com/7702/16992471000_e4f2c70137_b.jpg","width":"1024","height":"768","title":"Comfy","caption":"Comfy<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/16992471000/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>
<p>We knew this day was coming. Bear had been slowing down for a while. He was slow to stand up. He was always running hot. Drinking a lot. Sometimes his back legs couldn’t keep up with the rest of him. We knew it was getting bad when he’d refuse walks. But his personality never seemed to waver. He was our Bear.</p>
<p>Finally yesterday he had trouble getting up in the morning. Later in the day he just stopped, gave us a really sad look, and laid down. We knew it was time. We took him to the vet to find out that the immediate problem was a fluid build-up around his heart. Making it hard to get the necessary blood around his system. His breathing was now labored. He was not happy. He didn’t much like to cuddle but he’d been lying down, resting his head on my wife’s lap. A normally feisty dog was accepting of the doctors being in the room and taking him away to do tests.</p>
<p>We came home alone.</p>
<div role="figure">
<a href="https://www.flickr.com/photos/tehgipster/2206082061/" class="thickbox frame ">
<img src="https://live.staticflickr.com/2062/2206082061_1b2dd5f504_m.jpg" alt="Photograph: Just so damn cute" srcset="https://live.staticflickr.com/2062/2206082061_1b2dd5f504_m.jpg 240w, https://live.staticflickr.com/2062/2206082061_1b2dd5f504_n.jpg 320w, https://live.staticflickr.com/2062/2206082061_1b2dd5f504.jpg 500w, https://live.staticflickr.com/2062/2206082061_1b2dd5f504_z.jpg 640w, https://live.staticflickr.com/2062/2206082061_1b2dd5f504_b.jpg 1024w, https://live.staticflickr.com/2062/2206082061_d3b9d68be4_o.jpg 3504w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="500" height="333" data-lg-img="{"id":"2206082061","src":"https://live.staticflickr.com/2062/2206082061_1b2dd5f504_b.jpg","width":"1024","height":"681","title":"Just so damn cute","caption":"Just so damn cute<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/2206082061/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>
<p>I think Bear was happy to be an only dog after his brother died. They constantly fought. Bear’s obsession with toys and food meant he was always hoarding. His brother would always be growling at him while my wife and I were around because he wanted to be the one between us. I want to think that he and his brother are back together now. Having fun. Hunting squirrels and pigeons.</p>
<p>But they’re probably fighting with each other over something…</p>
<p>I’m gonna miss that little shit. ❤️</p>
<div role="figure">
<a href="https://www.flickr.com/photos/tehgipster/6662415909/" class="thickbox frame ">
<img src="https://live.staticflickr.com/7026/6662415909_c5b98b3775_m.jpg" alt="Photograph: Enjoying the view" srcset="https://live.staticflickr.com/7026/6662415909_c5b98b3775_m.jpg 240w, https://live.staticflickr.com/7026/6662415909_c5b98b3775_n.jpg 320w, https://live.staticflickr.com/7026/6662415909_c5b98b3775.jpg 500w, https://live.staticflickr.com/7026/6662415909_c5b98b3775_z.jpg 640w, https://live.staticflickr.com/7026/6662415909_c5b98b3775_b.jpg 1024w, https://live.staticflickr.com/7026/6662415909_8c76910aab_o.jpg 2441w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 870px) 1024px, 500px" width="500" height="293" data-lg-img="{"id":"6662415909","src":"https://live.staticflickr.com/7026/6662415909_c5b98b3775_b.jpg","width":"1024","height":"600","title":"Enjoying the view","caption":"Enjoying the view<br />\n<a href=\"https://www.flickr.com/photos/tehgipster/6662415909/\" rel=\"external\" target=\"_blank\" rel=\"noopener\">View on Flickr.</a>"}" />
</a>
</div>Shawn ParkerBut he was our jerk. Our cute, loving, man-eating jerk. He didn’t like other people. He didn’t get along with other dogs. He had food aggression. He and his brother constantly fought. He wouldn’t keep on up walks, he kept his own pace, stopping to sniff and pee on everything. He wouldn’t cuddle any more in his old age, just sit across the room from us, wherever we were. He would tear this house apart, from end to end, in the pursuit of a fly. I’m pretty sure his life long dream was to eat a skateboarder. He even bit the neighbor. But he loved his food. Treats were like gold. Any toy with a squeaker a conquest to silence that squeal from within. We still have a bin full the remains of his conquests. We’d buy him the strongest toys we could find and he’d have the squeaker out before we knew it. Even now, after he’s gone, I’m waiting to clean up the remains of his last toy so that I can take it in a bit longer. Relish the high pitched screams of the poor lobster who was sacrificed for the happiness of this pooch. He was adorable. Our typical routine was to feed him and then finish up making our dinner. After he would finish his dinner he’d save his cookie so that he could eat it while we ate. Protecting our house against the mailman was his self anointed duty. He knew what time of day it was. He’d growl as the mailman walked up. Watching dutifully through the window. He knew that he could also watch the mailman deliver next door. He’d watch carefully, constantly growling to fend off the evil package delivery. He’d also calmly wait for the return trip, on the far side of the street, to growl once more. Just to be sure. He always won that fight. The mailman would try, but every day be driven back away. We knew this day was coming. Bear had been slowing down for a while. He was slow to stand up. He was always running hot. Drinking a lot. Sometimes his back legs couldn’t keep up with the rest of him. We knew it was getting bad when he’d refuse walks. But his personality never seemed to waver. He was our Bear. Finally yesterday he had trouble getting up in the morning. Later in the day he just stopped, gave us a really sad look, and laid down. We knew it was time. We took him to the vet to find out that the immediate problem was a fluid build-up around his heart. Making it hard to get the necessary blood around his system. His breathing was now labored. He was not happy. He didn’t much like to cuddle but he’d been lying down, resting his head on my wife’s lap. A normally feisty dog was accepting of the doctors being in the room and taking him away to do tests. We came home alone. I think Bear was happy to be an only dog after his brother died. They constantly fought. Bear’s obsession with toys and food meant he was always hoarding. His brother would always be growling at him while my wife and I were around because he wanted to be the one between us. I want to think that he and his brother are back together now. Having fun. Hunting squirrels and pigeons. But they’re probably fighting with each other over something… I’m gonna miss that little shit. ❤️Chemo by the numbers2017-03-29T13:58:52-07:002017-03-29T13:58:52-07:00https://top-frog.com/2017/03/29/chemo-by-the-numbers<p>I was going over my time spent dealing with the chemo and was able to figure out some interesting numbers. Okay, maybe interesting to just me, but here goes:</p>
<ul>
<li><strong>117 days</strong> from beginning chemo ‘till returning to work.</li>
<li><strong>20 days</strong> of chemo treatments.</li>
<li><strong>3 days</strong> spent overnight in the hospital.</li>
<li><strong>2 visits</strong> to the hospital ER.</li>
<li>More than <strong>100 hours</strong> spent in the oncology ward.</li>
<li>More than <strong>70 liters</strong> of fluid pumped in to my body.</li>
<li>More than <strong>50 pokes</strong> with a needle.</li>
<li>More than <strong>15 vomit sessions</strong>.</li>
<li>More than <strong>12 days</strong> spent sleeping all day.</li>
<li>More than <strong>8 doses</strong> of morphine.</li>
<li>Up to <strong>5 days</strong> between significant meals.</li>
<li>Up to <strong>5 days</strong> between poops. But also…</li>
<li>… <strong>2 episodes</strong> of shitting my pants.</li>
</ul>
<p>The most important number of all, though, is the <strong>2808 hours</strong> of unconditional love from the wife.</p>Shawn ParkerI was going over my time spent dealing with the chemo and was able to figure out some interesting numbers. Okay, maybe interesting to just me, but here goes: 117 days from beginning chemo ‘till returning to work. 20 days of chemo treatments. 3 days spent overnight in the hospital. 2 visits to the hospital ER. More than 100 hours spent in the oncology ward. More than 70 liters of fluid pumped in to my body. More than 50 pokes with a needle. More than 15 vomit sessions. More than 12 days spent sleeping all day. More than 8 doses of morphine. Up to 5 days between significant meals. Up to 5 days between poops. But also… … 2 episodes of shitting my pants. The most important number of all, though, is the 2808 hours of unconditional love from the wife.