<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="https://reuben.honigwachs.de/xml/base.min.xml" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Reuben&#39;s personal website</title>
    <link>https://reuben.honigwachs.de/</link>
    <description>Recent content on Reuben&#39;s personal website</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 07 May 2020 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://reuben.honigwachs.de/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>tmux in GCP Cloud Shell</title>
      <link>https://reuben.honigwachs.de/post/tmux-cloudshell/</link>
      <pubDate>Thu, 07 May 2020 00:00:00 +0000</pubDate>
      <guid>https://reuben.honigwachs.de/post/tmux-cloudshell/</guid>
      <description>&lt;p&gt;&lt;em&gt;GCP Cloud Shell&lt;/em&gt; runs &lt;em&gt;tmux&lt;/em&gt;. And if you&amp;rsquo;re a regular user of both then &lt;a href=&#34;https://www.youtube.com/watch?v=2BFxM-bkLiA&#34;&gt;this
video&lt;/a&gt; I made a while ago in
January might be of interest to you.&lt;/p&gt;

&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/2BFxM-bkLiA&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;YouTube Video&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Side note&lt;/strong&gt;: I&amp;rsquo;ve come to like instructional videos as documentation. Many
don&amp;rsquo;t have the patience and energy to read lengthy written documentation. For
some aspects short videos work better and engage your fellow project members.
But I haven&amp;rsquo;t found a routine, quite yet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Background&lt;/strong&gt;: &lt;em&gt;&lt;a href=&#34;https://cloud.google.com/shell&#34;&gt;GCP Cloud Shell&lt;/a&gt;&lt;/em&gt; has many use
cases. For me it&amp;rsquo;s often ETL-ing a lot of data from cloud to cloud, long batch
processing, suffering from unreliable mobile connectivity, or simply not
having the &lt;em&gt;Google Cloud SDK&lt;/em&gt; readily available in my current environment.
&lt;em&gt;&lt;a href=&#34;https://www.hamvocke.com/blog/a-quick-and-easy-guide-to-tmux/&#34;&gt;tmux&lt;/a&gt;&lt;/em&gt; for me
personally provides a reliable and consistent tiling experience throughout
different environments.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Conferencing advice</title>
      <link>https://reuben.honigwachs.de/post/video-conferencing/</link>
      <pubDate>Sun, 22 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://reuben.honigwachs.de/post/video-conferencing/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been involved with A/V conferencing for the majority of my career. As a
user, systems integrator, and developer. With COVID-19 I&amp;rsquo;ve often been asked for input. This is my subjective take on the most important aspects.&lt;/p&gt;
&lt;h1 id=&#34;practice&#34;&gt;Practice&lt;/h1&gt;
&lt;p&gt;Don&amp;rsquo;t embarrass yourself in front of 15 colleagues and waste their time.
Especially as a host. Practice extensively beforehand. Don&amp;rsquo;t make any assumptions
about network, sound quality, desktop sharing, interactive collaboration
and &lt;strong&gt;test what you intend to do in advance&lt;/strong&gt;. Start your client a couple of minutes early to check that
everything is working.&lt;/p&gt;
&lt;h1 id=&#34;hardware&#34;&gt;Hardware&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cable over wireless,&lt;/strong&gt; Battery will fail. Bluetooth will fail. You&amp;rsquo;re dongle
will go missing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;USB over analogue.&lt;/strong&gt; Avoid bad audio jacks and missing ground. USB variants have a convenient mute button, instead of finding the app and using your mouse.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Headset with boom mic.&lt;/strong&gt; Avoid using your webcam, laptop, or earpiece
microphone. See sports commentators. Get it near to your mouth, but not directly
under your nose.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use a dedicated webcam.&lt;/strong&gt; Using additional screens, your laptop will always
be placed awkwardly. And dedicated webcams still provide a better picture
quality.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Light source from the front&lt;/strong&gt;. Try and have your face flooded with natural
light from the front. All cameras work better with more light. Avoid bright
lights and windows in the background.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Experimenting is fine, but these brands will deliver. Preference based on compatibility, affordability, build quality:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Headsets&lt;/strong&gt;: 1. Logitech, 2. Plantronics (now Poly), 3.  Jabra&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Webcams&lt;/strong&gt;: 1. Logitech, 2. Microsoft&lt;/p&gt;
&lt;h1 id=&#34;advanced&#34;&gt;Advanced&lt;/h1&gt;
&lt;p&gt;If you don&amp;rsquo;t want to go the simple route of investing in a $40 USB headset, there is &lt;a href=&#34;https://www.hanselman.com/blog/CategoryView.aspx?category=Remote+Work&#34;&gt;plenty&lt;/a&gt; &lt;a href=&#34;https://medium.com/javascript-scene/gear-up-for-remote-work-d93cf61300f&#34;&gt;of&lt;/a&gt; &lt;a href=&#34;https://mattstauffer.com/blog/setting-up-your-webcam-lights-and-audio-for-remote-work-podcasting-videos-and-streaming/&#34;&gt;advice&lt;/a&gt; out there. It can become a
time sink as well as a source of frustration and joy.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>HopeRF RFM95 breakout pinout</title>
      <link>https://reuben.honigwachs.de/post/rfm95-breakout-board/</link>
      <pubDate>Fri, 28 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://reuben.honigwachs.de/post/rfm95-breakout-board/</guid>
      <description>&lt;p&gt;The breakout board for the RFM95 (and RFM92) chip from HopeRF is not well documented. And if
you&amp;rsquo;re stuck without a multimeter, like one of our local fellow &lt;a href=&#34;https://www.onisa.org.za/&#34;&gt;TTN
community&lt;/a&gt; members was, this can be frustrating.&lt;/p&gt;
&lt;p&gt;Rather than it&amp;rsquo;s technical complexity, the uncertainty of not having official
documentation will be nagging your conscience. So hopefully the
&lt;a href=&#34;https://reuben.honigwachs.de/img/hoperf-rfm95-breakout.webp&#34;&gt;PNG&lt;/a&gt; or
&lt;a href=&#34;https://reuben.honigwachs.de/img/hoperf-rfm95-breakout.svg&#34;&gt;SVG&lt;/a&gt; can help.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://reuben.honigwachs.de/img/hoperf-rfm95-breakout.webp&#34; alt=&#34;RFM95 Breakout Board&#34;&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>PSA: I quit Twitter</title>
      <link>https://reuben.honigwachs.de/post/quit-twitter/</link>
      <pubDate>Tue, 17 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://reuben.honigwachs.de/post/quit-twitter/</guid>
      <description>&lt;p&gt;Yeah, I don&amp;rsquo;t think I have to elaborate on the pros and cons of Twitter.
The internet has better places to offer.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>DNS, the DevOps way</title>
      <link>https://reuben.honigwachs.de/post/devops-dns/</link>
      <pubDate>Sun, 03 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://reuben.honigwachs.de/post/devops-dns/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://twitter.com/sixhobbits&#34;&gt;Gareth Dwyer&lt;/a&gt; delivers entertaining talks one could describe as &lt;em&gt;tech talk standup&lt;/em&gt;. I very much enjoy them. He&amp;rsquo;s a brilliant software engineer and reignited my respect for technical writing. At a recent &lt;a href=&#34;https://devops.capetown/&#34;&gt;DevOps Cape Town&lt;/a&gt; meetup he presented a simple set of tasks and their realisation. In the end sparking a discussion with the question: &lt;em&gt;&amp;ldquo;Is this the DevOps way?&amp;rdquo;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;As it is typical for backoffice applications, email plays a central role, which in turn means dealing with dangerously unusable web UI of rent-seeking local registrars. Uncertainty starts creeping up and how to get some DevOps in the mix.&lt;/p&gt;
&lt;p&gt;Instead of &lt;a href=&#34;https://www.youtube.com/watch?v=uTEL8Ff1Zvk&#34;&gt;defining DevOps culture and practices&lt;/a&gt;, let me set out two personal objectives I&amp;rsquo;d see for this case:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Transparency.&lt;/strong&gt; Avoid not knowing who changed what when.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reliability.&lt;/strong&gt; Automate tests and deployments.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;m a fan of &amp;ldquo;infrastructure as code&amp;rdquo; where you have everything originate from a git repo and let automation take care of the deployment. On the &lt;em&gt;code&lt;/em&gt; side you reap the benefits in regards to permissions, review, change log, documentation. On the &lt;em&gt;automation&lt;/em&gt; side one enjoys determinism and repeatability.&lt;/p&gt;
&lt;p&gt;How could this look like for DNS?&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://reuben.honigwachs.de/img/dns-cicd.webp&#34; alt=&#34;CICD with DNS&#34;&gt;&lt;/p&gt;
&lt;p&gt;In order to automate things you&amp;rsquo;ll need DNS with an API. Next to running your own &lt;em&gt;BIND&lt;/em&gt; or &lt;em&gt;djbdns&lt;/em&gt;, examples are: &lt;a href=&#34;https://docs.aws.amazon.com/Route53/latest/APIReference/Welcome.html&#34;&gt;Amazon Route 53&lt;/a&gt;, &lt;a href=&#34;https://api.cloudflare.com/#dns-records-for-a-zone-import-dns-records&#34;&gt;Cloudflare&lt;/a&gt;, &lt;a href=&#34;https://help.dyn.com/dns-api-knowledge-base/&#34;&gt;Dyn&lt;/a&gt; &amp;hellip; or &lt;strong&gt;GCP Cloud DNS&lt;/strong&gt;. With all GCP services, including Cloud DNS, you get the holy trinity of &lt;a href=&#34;https://cloud.google.com/dns/docs/reference/v1/&#34;&gt;API&lt;/a&gt;, &lt;a href=&#34;https://cloud.google.com/sdk/gcloud/reference/dns/&#34;&gt;command line&lt;/a&gt;, and Web UI.&lt;/p&gt;
&lt;p&gt;Here &lt;em&gt;&amp;ldquo;DNS&amp;rdquo;&lt;/em&gt; is not &lt;em&gt;&amp;ldquo;registrar&amp;rdquo;&lt;/em&gt;. You&amp;rsquo;d have your registrar point to a DNS service of choice.&lt;/p&gt;
&lt;p&gt;In terms of CI/CD tooling everything is possible with GCP. I like &lt;a href=&#34;https://about.gitlab.com/solutions/google-cloud-platform/&#34;&gt;GitLab&lt;/a&gt; and &lt;a href=&#34;https://travis-ci.org/&#34;&gt;Travis&lt;/a&gt; very much and tend to opt for &lt;a href=&#34;https://cloud.google.com/cloud-build/&#34;&gt;Cloud Build&lt;/a&gt; which naturally works well with &lt;a href=&#34;https://cloud.google.com/source-repositories/&#34;&gt;GCP Cloud Source Repos&lt;/a&gt; where we will store the zone file for this example.&lt;/p&gt;
&lt;p&gt;For simplest implementation we assign the &lt;em&gt;DNS Administrator&lt;/em&gt; role to the &lt;a href=&#34;https://cloud.google.com/cloud-build/docs/securing-builds/configure-access-control#service_account&#34;&gt;Cloud Build service account&lt;/a&gt; within the project. Then we define a trigger for any push of the zone file to the master branch in the repo as follows:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://reuben.honigwachs.de/img/dns-build-trigger-conf.webp&#34; alt=&#34;Screenshot of triger configuration&#34;&gt;&lt;/p&gt;
&lt;p&gt;The above referenced &lt;em&gt;cloudbuild.yaml&lt;/em&gt; looks as follows. Instead of assembling our own image we use the readily available &lt;em&gt;gcloud&lt;/em&gt; &lt;a href=&#34;https://github.com/GoogleCloudPlatform/cloud-builders&#34;&gt;cloud builder&lt;/a&gt; to clone the repo and import the zone file:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;steps:
- name: gcr.io/cloud-builders/gcloud
  args: [&amp;#39;source&amp;#39;, &amp;#39;repos&amp;#39;, &amp;#39;clone&amp;#39;, &amp;#39;honigwachs-info-zone&amp;#39;]
- name: gcr.io/cloud-builders/gcloud
  args: [&amp;#39;dns&amp;#39;, &amp;#39;record-sets&amp;#39;, &amp;#39;import&amp;#39;, &amp;#39;honigwachs.info&amp;#39;, &amp;#39;--zone=honigwachs-info&amp;#39;, &amp;#39;--zone-file-format&amp;#39;, &amp;#39;--delete-all-existing&amp;#39;]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The tool &lt;code&gt;gcloud dns record-sets&lt;/code&gt; is quite nifty and validates your input files at execution. Dependent on your testing strategy, this already might be sufficient. With &lt;code&gt;--zone-file-format&lt;/code&gt; we can use the BIND format instead of yaml and make use of &lt;em&gt;bind9utils&lt;/em&gt; such as &lt;code&gt;named-checkzone&lt;/code&gt; to test zone files. But &lt;em&gt;do&lt;/em&gt; note that in this example the &lt;code&gt;--delete-all-existing&lt;/code&gt; flag is set to include SOA info and allow for a &amp;ldquo;pure&amp;rdquo; BIND experience when dealing with the zone file.&lt;/p&gt;
&lt;p&gt;Cloud Build publishes update messages to a &lt;a href=&#34;https://cloud.google.com/pubsub/&#34;&gt;Cloud Pub/Sub&lt;/a&gt; topic called &lt;code&gt;cloud-builds&lt;/code&gt; which is automatically created when enabling the Cloud Build API. From there other actions such as notifications can be triggered. In general we&amp;rsquo;re talking about a very low deploy time and once it&amp;rsquo;s in GCP Cloud DNS we enjoy an astonishing propagation time we&amp;rsquo;re used to from Google ;-).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://reuben.honigwachs.de/img/dns-build-time.webp&#34; alt=&#34;Screenshot of cloud builder build time&#34;&gt;&lt;/p&gt;
&lt;p&gt;Oh, yes, this is what a BIND zone file looks like:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ cat honigwachs.info 
honigwachs.info. 21600 IN NS ns-cloud-b1.googledomains.com.
honigwachs.info. 21600 IN NS ns-cloud-b2.googledomains.com.
honigwachs.info. 21600 IN NS ns-cloud-b3.googledomains.com.
honigwachs.info. 21600 IN NS ns-cloud-b4.googledomains.com.
honigwachs.info. 21600 IN SOA ns-cloud-b1.googledomains.com. cloud-dns-hostmaster.google.com. 1 21600 3600 259200 300

www.honigwachs.info. 300 IN A 151.101.1.195
www.honigwachs.info. 300 IN A 151.101.65.195

yetanother.honigwachs.info. 300 IN A 151.101.1.195
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;!-- raw HTML omitted --&gt;©2018 Google LLC, used with permission. Google and the Google logo are registered trademarks of Google LLC.&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
</description>
    </item>
  </channel>
</rss>
