<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="https://chrislagasse.com/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Chris Lagasse - Posts</title>
    <link>https://chrislagasse.com/</link>
    <atom:link href="https://chrislagasse.com/feed.xml" rel="self" type="application/rss+xml" />
    <description>Posts about life and programming.</description>
    <language>en</language>
    <item>
      <title>Rediscovering Habits</title>
      <link>https://chrislagasse.com/posts/rediscovering-habits/</link>
      <description>&lt;p&gt;Recently I got LASIK on both of my eyes, and I noticed something interesting: A lot of the habits that I&#39;ve formed over the past decades were suddenly in turmoil. I had created a pretty solid morning routine that included things such as face cream, weighing myself, brushing my teeth. I&#39;ve always struggled with forming good habits, and worked hard over the past 2 decades to fix that, with around 10 &amp;quot;steps&amp;quot; depending on how you slice it.&lt;/p&gt;
&lt;p&gt;Regularly over the past month and a half I&#39;ve noticed that I keep missing certain things during my morning routine that had been effectively second nature, that I barely had to think about.&lt;/p&gt;
&lt;p&gt;The more I thought about it, the more I noticed this coincides, in part, with the fact that putting in/taking out contacts are no longer part of that routine. That seemed weird to me; why would one habit formed affect other (unrelated) habits?&lt;/p&gt;
&lt;p&gt;I&#39;ve concluded that while forming my habits over the years, that many of them were &#39;tied&#39; to my existing routines, to help me form them.&lt;/p&gt;
&lt;p&gt;Putting on my contacts in the morning was necessary before moving on to some other step. For instance, I don&#39;t want to get face cream on my hands before touching my contact lenses and eyes. It was an action that I wired myself to recognize before moving on to the next habit. Taking away putting my contacts in have thrown the timing of the rest of the routine into chaos.&lt;/p&gt;
&lt;p&gt;I&#39;ll probably spend some time researching this from a scientific perspective, as I&#39;m sure this isn&#39;t uncommon when broken down to reasoning and logic in how our brains and habits function.&lt;/p&gt;
&lt;p&gt;Just an interesting revelation I wanted to share.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I&#39;m currently reconsidering the purpose of my blog and website. I&#39;ll touch on things around my life, I think, but I&#39;ll still write primarily about things I&#39;ve learned as a programmer that might help others. Let me know what you think by sending me a message on &lt;a href=&quot;https://suncoast.dev/@chris&quot;&gt;Mastodon&lt;/a&gt; or any other medium you find me.&lt;/p&gt;
</description>
      <pubDate>Wed, 30 Apr 2025 00:00:00 +0000</pubDate>
      <dc:creator>Chris Lagasse</dc:creator>
      <guid>https://chrislagasse.com/posts/rediscovering-habits/</guid>
    </item>
    <item>
      <title>Downgrading/Upgrading Home Assistant via CLI.</title>
      <link>https://chrislagasse.com/posts/downgrading-upgrading-home-assistant-cli/</link>
      <description>&lt;p&gt;Alternative title for this post was &amp;quot;Remove MyQ from &lt;a href=&quot;https://www.home-assistant.io/&quot;&gt;Home Assistant&lt;/a&gt; post-2023.12.0 upgrade&amp;quot;, but this applies to any time you might need to downgrade your version of Home Assistant due to a local issue that you need to roll back.&lt;/p&gt;
&lt;h2 id=&quot;the-problem&quot; tabindex=&quot;-1&quot;&gt;The Problem &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/downgrading-upgrading-home-assistant-cli/#the-problem&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Back when &lt;code&gt;2023.12.0&lt;/code&gt; came out, Home Assistant finally relented that Chamberlain&#39;s &lt;a href=&quot;https://www.myq.com/&quot;&gt;MyQ&lt;/a&gt; service was not going to be cooperative with third party tools, and decided to &lt;a href=&quot;https://www.home-assistant.io/blog/2023/11/06/removal-of-myq-integration/&quot;&gt;fully drop the integration&lt;/a&gt;. I knew that the MyQ integration was &amp;quot;borked&amp;quot;, but I wasn&#39;t prepared for Home Assistant to remove the integration.&lt;/p&gt;
&lt;p&gt;After updating to &lt;code&gt;2023.12.0&lt;/code&gt;, Home Assistant would show warnings about the MyQ integration&#39;s devices&#39;, but wouldn&#39;t let me actually clear it out because the Integration was no longer visible. I would have a bunch of entities and other references that were lingering, but uneditable. While they (likely) didn&#39;t affect functionality, they annoyed me. So I had to do what I could to remove them.&lt;/p&gt;
&lt;h2 id=&quot;the-solution&quot; tabindex=&quot;-1&quot;&gt;The Solution &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/downgrading-upgrading-home-assistant-cli/#the-solution&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;These steps assume you&#39;re familiar with, and have access to, your Home Assistant devices&#39; terminal interface via SSH or similar. The commands below are what worked for me. You may need to add &lt;code&gt;hassio&lt;/code&gt; in front of it, or connect via Docker. Your Mileage May Vary (YMMV) based on your individual configurations. In my case I&#39;m running Home Assistant OS on a Raspberry Pi 4.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Connect to your Home Assistant terminal.&lt;/li&gt;
&lt;li&gt;Downgrade to before the removal of myQ (takes a while, completed in 5+ minutes for me)&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ ha core update &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2023.11&lt;/span&gt;.3&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Go to Settings &amp;gt; Devices &amp;amp; Services &amp;gt; Integrations, and find MyQ.&lt;/li&gt;
&lt;li&gt;Click the integration to view the full list of myQ integrations&lt;/li&gt;
&lt;li&gt;Click the three vertical dots for each integration, and click &#39;delete&#39;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chrislagasse.com/images/homeassistant-myq-1-600w.webp 600w, https://chrislagasse.com/images/homeassistant-myq-1-900w.webp 900w, https://chrislagasse.com/images/homeassistant-myq-1-1500w.webp 1500w&quot; sizes=&quot;(min-width: 1024px) 100vw, 50vw&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chrislagasse.com/images/homeassistant-myq-1-600w.jpeg 600w, https://chrislagasse.com/images/homeassistant-myq-1-900w.jpeg 900w, https://chrislagasse.com/images/homeassistant-myq-1-1500w.jpeg 1500w&quot; sizes=&quot;(min-width: 1024px) 100vw, 50vw&quot; /&gt;&lt;img alt=&quot;Partial screenshot of the Home Assistant MyQ integration in 2023.11.3, with a warning on the Chamberlain device and the sub-menu for the three vertical dots showing how to &#39;delete&#39; the device from the Home Assistant install.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chrislagasse.com/images/homeassistant-myq-1-600w.jpeg&quot; width=&quot;1500&quot; height=&quot;779&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;Follow updates steps via the UX as usual, to go back to 2023.12.x (or newer), or run the update via CLI.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ ha core update&lt;/code&gt;&lt;/pre&gt;
</description>
      <pubDate>Sun, 07 Apr 2024 00:00:00 +0000</pubDate>
      <dc:creator>Chris Lagasse</dc:creator>
      <guid>https://chrislagasse.com/posts/downgrading-upgrading-home-assistant-cli/</guid>
    </item>
    <item>
      <title>Troubleshooting Lemmy Upgrades</title>
      <link>https://chrislagasse.com/posts/lemmy-upgrade-troubleshooting/</link>
      <description>&lt;p&gt;My friend &lt;a href=&quot;https://daryn.codes/&quot;&gt;Daryn&lt;/a&gt; and I both host &lt;a href=&quot;https://join-lemmy.org/&quot;&gt;Lemmy&lt;/a&gt; instances on &lt;a href=&quot;https://digitalocean.com/&quot;&gt;Digital Ocean&lt;/a&gt; droplets, implemented via the &lt;a href=&quot;https://github.com/ubergeek77/Lemmy-Easy-Deploy&quot;&gt;Lemmy Easy Deploy&lt;/a&gt; script. We&#39;ve gone through the update processes a few times recently and encountered the same issues.&lt;/p&gt;
&lt;p&gt;Here are some comment problems and what we had to do to resolve. These issues were caused by updating &lt;strong&gt;up&lt;/strong&gt; to &lt;code&gt;0.18.3&lt;/code&gt; unless otherwise mentioned.&lt;/p&gt;
&lt;h2 id=&quot;white-screen-of-death-(wsod)&quot; tabindex=&quot;-1&quot;&gt;White Screen of Death (WSOD) &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/lemmy-upgrade-troubleshooting/#white-screen-of-death-(wsod)&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After completing an update via the &lt;code&gt;./deploy.sh&lt;/code&gt; script, visiting the website triggered a WSOD. Reviewing the logs only showed an issue with pictrs tied to the logo and nothing else. The solution ended up being that somehow the firewall on the server was no longer sufficient and we had to re-open the 443 (SSL) port. This is accomplished by logging into the server and running&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; ufw allow &lt;span class=&quot;token number&quot;&gt;443&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;emails-not-sending-(even-though-previously-working)&quot; tabindex=&quot;-1&quot;&gt;Emails not sending (even though previously working) &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/lemmy-upgrade-troubleshooting/#emails-not-sending-(even-though-previously-working)&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The most recent update (&lt;code&gt;0.18.3&lt;/code&gt;) caused user registrations to break. As we enforced email verification, registration would fail (as it could not send an email, but create the account), and the forgot password flow was also broken.&lt;/p&gt;
&lt;p&gt;We eventually discovered that our custom SMTP settings were missing from the &lt;code&gt;./live/lemmy.hjson&lt;/code&gt; file, even though they were there initially. Not 100% sure as to what is causing it, but we&#39;ve taken several cautionary measures to resolve.&lt;/p&gt;
&lt;h3 id=&quot;1.-re-add-the-email-block-to-lemmy.hjson&quot; tabindex=&quot;-1&quot;&gt;1. re-add the &lt;code&gt;email&lt;/code&gt; block to &lt;code&gt;lemmy.hjson&lt;/code&gt; &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/lemmy-upgrade-troubleshooting/#1.-re-add-the-email-block-to-lemmy.hjson&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;the block looks something like this, and is on the same level as the &lt;code&gt;database&lt;/code&gt; block.&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;  email&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    smtp_server&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;host:port&quot;&lt;/span&gt;
    smtp_login&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;email@example.com&quot;&lt;/span&gt;
    smtp_password&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;password&quot;&lt;/span&gt;
    smtp_from_address&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;noreply@example.com&quot;&lt;/span&gt;
    tls_type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tls&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2.-update-the-.%2Fconfig.env-to-set-our-defaults%2C-just-in-case-this-is-where-content-is-replacing-from.&quot; tabindex=&quot;-1&quot;&gt;2. update the &lt;code&gt;./config.env&lt;/code&gt; to set our defaults, just in case this is where content is replacing from. &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/lemmy-upgrade-troubleshooting/#2.-update-the-.%2Fconfig.env-to-set-our-defaults%2C-just-in-case-this-is-where-content-is-replacing-from.&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The fields disappearing from &lt;code&gt;lemmy.hjson&lt;/code&gt; points to the content being regenerated, so we&#39;ve updated our &lt;code&gt;config.env&lt;/code&gt; in the project root to be up to date with the content we&#39;ve entered into &lt;code&gt;./live/lemmy.hjson&lt;/code&gt; file -- hopefully this will solve this issue in the long term.&lt;/p&gt;
&lt;h3 id=&quot;3.-back-up&quot; tabindex=&quot;-1&quot;&gt;3. back up &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/lemmy-upgrade-troubleshooting/#3.-back-up&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Duplicate your current &lt;code&gt;live/lemmy.json&lt;/code&gt;, &lt;code&gt;live/docker-compose.yml&lt;/code&gt; and &lt;code&gt;config.env&lt;/code&gt; files, and move them outside of your Lemmy project, so you have something to reference when verifying configuration is still accurate.&lt;/p&gt;
&lt;h2 id=&quot;how-to-troubleshoot&quot; tabindex=&quot;-1&quot;&gt;How to Troubleshoot &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/lemmy-upgrade-troubleshooting/#how-to-troubleshoot&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While on the server, you can explore the logs in docker. For the problems above, they&#39;re mostly noticeable by looking at the backend logs&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; logs lemmy-easy-deploy-lemmy-1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you add the &lt;code&gt;-f&lt;/code&gt; argument, you can get a live stream of the logs as you explore the site. The name (&lt;code&gt;lemmy-easy-deploy-lemmy-1&lt;/code&gt;) is found by running &lt;code&gt;docker ps&lt;/code&gt; and reviewing the available containers.&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;root@dis:~&lt;span class=&quot;token comment&quot;&gt;# docker ps&lt;/span&gt;
CONTAINER ID   IMAGE                                STATUS       NAMES
0123456789ab   caddy:latest                         Up &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt; hours   lemmy-easy-deploy-proxy-1
abcdef012345   ghcr.io/ubergeek77/lemmy-ui:0.18.3   Up &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt; hours   lemmy-easy-deploy-lemmy-ui-1
456789abcdef   ghcr.io/ubergeek77/lemmy:0.18.3      Up &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt; hours   lemmy-easy-deploy-lemmy-1
ef0123456789   postgres:15-alpine                   Up &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt; hours   lemmy-easy-deploy-postgres-1
89abcdef0123   asonix/pictrs:0.4.0                  Up &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt; hours   lemmy-easy-deploy-pictrs-1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(some columns removed for brevity)&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The Lemmy Easy Deploy helper script is not perfect, and is still way easier than trying to navigate through implementation from scratch. Hopefully these quirks will resolve in time.&lt;/p&gt;
</description>
      <pubDate>Tue, 01 Aug 2023 00:00:00 +0000</pubDate>
      <dc:creator>Chris Lagasse</dc:creator>
      <guid>https://chrislagasse.com/posts/lemmy-upgrade-troubleshooting/</guid>
    </item>
    <item>
      <title>Connecting to a remote Postgres Docker container</title>
      <link>https://chrislagasse.com/posts/connecting-to-postgres-docker-remotely/</link>
      <description>&lt;p&gt;Recently I decided to start hosting a &lt;a href=&quot;https://join-lemmy.org/&quot;&gt;Lemmy&lt;/a&gt; instance. I am hosting it on a &lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker&lt;/a&gt; server on &lt;a href=&quot;https://digitalocean.com/&quot;&gt;Digital Ocean&lt;/a&gt;, following the very easy-to-use &lt;a href=&quot;https://github.com/ubergeek77/Lemmy-Easy-Deploy&quot;&gt;Lemmy Easy Deploy&lt;/a&gt; instructions.&lt;/p&gt;
&lt;p&gt;Naturally, I needed to explore the &lt;a href=&quot;https://www.postgresql.org/&quot;&gt;Postgres&lt;/a&gt; database to make minor changes and create backups, so I set forward on discovering how to connect to and access it locally.&lt;/p&gt;
&lt;p&gt;These instructions should be the same for any remote host, so you should be able to follow this for any service that provides SSH tunnel access.&lt;/p&gt;
&lt;h2 id=&quot;what-you&#39;ll-need&quot; tabindex=&quot;-1&quot;&gt;What you&#39;ll need &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/connecting-to-postgres-docker-remotely/#what-you&#39;ll-need&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pgadmin.org/&quot;&gt;pgAdmin&lt;/a&gt; or similar Postgres GUI interface&lt;/li&gt;
&lt;li&gt;All necessary credentials, which include
&lt;ul&gt;
&lt;li&gt;Postgres username and password&lt;/li&gt;
&lt;li&gt;SSH username and password/ssh key.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;instructions&quot; tabindex=&quot;-1&quot;&gt;Instructions &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/connecting-to-postgres-docker-remotely/#instructions&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;1.-find-out-your-docker-container&#39;s-ip.&quot; tabindex=&quot;-1&quot;&gt;1. Find out your Docker container&#39;s IP. &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/connecting-to-postgres-docker-remotely/#1.-find-out-your-docker-container&#39;s-ip.&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;SSH into your remote container and run &lt;code&gt;docker ps&lt;/code&gt; -- This will provide you information regarding any running docker images, with their unique ids, the image powering them, any ports in use, when the image was created, how long its been running, and their indentifying names.&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ps&lt;/span&gt;
CONTAINER ID   IMAGE
0123456789ab   caddy:latest
abcdef019234   ghcr.io/ubergeek77/lemmy-ui:0.18.3
3456789abcde   ghcr.io/ubergeek77/lemmy:0.18.3
def012345678   postgres:15-alpine
789abcdef012   asonix/pictrs:0.4.0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you&#39;ve also changed the port, make note of that column (my example above is missing several columns as it is an example). Grab the &#39;Container ID&#39; for the &#39;postgres&#39; image and find out the IP by running the following command, where &lt;code&gt;{container_id}&lt;/code&gt; is the result from your &lt;code&gt;docker ps&lt;/code&gt; call above (for instance &lt;code&gt;def012345678&lt;/code&gt;)&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; inspect &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;container_id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; IPAddress
  &lt;span class=&quot;token string&quot;&gt;&quot;SecondaryIPAddresses&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; null,
  &lt;span class=&quot;token string&quot;&gt;&quot;IPAddress&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;IPAddress&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;666.13.0.1&quot;&lt;/span&gt;,&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Make a note of this IP address, we&#39;ll need it to connect to the Host after tunneling.&lt;/p&gt;
&lt;h3 id=&quot;2.-create-a-new-connection-in-the-pgadmin-app&quot; tabindex=&quot;-1&quot;&gt;2. Create a new connection in the pgAdmin app &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/connecting-to-postgres-docker-remotely/#2.-create-a-new-connection-in-the-pgadmin-app&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Load up your local copy of pgAdmin and either click &#39;Object&#39; in the toolbar, or right click &#39;Servers&#39;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chrislagasse.com/images/docker-postgres-1-600w.webp 600w, https://chrislagasse.com/images/docker-postgres-1-900w.webp 900w&quot; sizes=&quot;(min-width: 1024px) 100vw, 50vw&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chrislagasse.com/images/docker-postgres-1-600w.jpeg 600w, https://chrislagasse.com/images/docker-postgres-1-900w.jpeg 900w&quot; sizes=&quot;(min-width: 1024px) 100vw, 50vw&quot; /&gt;&lt;img alt=&quot;Example of dropdown menu for pgAdmin on OSX, showing how to create a new Server by clicking Object &gt; Register &gt; Server...&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chrislagasse.com/images/docker-postgres-1-600w.jpeg&quot; width=&quot;900&quot; height=&quot;372&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Provide it with a name for easy reference.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chrislagasse.com/images/docker-postgres-3-600w.webp 600w, https://chrislagasse.com/images/docker-postgres-3-900w.webp 900w&quot; sizes=&quot;(min-width: 1024px) 100vw, 50vw&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chrislagasse.com/images/docker-postgres-3-600w.jpeg 600w, https://chrislagasse.com/images/docker-postgres-3-900w.jpeg 900w&quot; sizes=&quot;(min-width: 1024px) 100vw, 50vw&quot; /&gt;&lt;img alt=&quot;The &#39;General&#39; tab of registering a postgres server, with fields such as the requied &#39;Name&#39;, options to select colors for easy reference, and what group the new server belongs to.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chrislagasse.com/images/docker-postgres-3-600w.jpeg&quot; width=&quot;900&quot; height=&quot;703&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Under the &amp;quot;Connection&amp;quot; tab, provide the IP address discovered above for the Hostname, and replace the port if it is different than what Docker says. Then update the Username and Password fields with correct values.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chrislagasse.com/images/docker-postgres-4-600w.webp 600w, https://chrislagasse.com/images/docker-postgres-4-900w.webp 900w&quot; sizes=&quot;(min-width: 1024px) 100vw, 50vw&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chrislagasse.com/images/docker-postgres-4-600w.jpeg 600w, https://chrislagasse.com/images/docker-postgres-4-900w.jpeg 900w&quot; sizes=&quot;(min-width: 1024px) 100vw, 50vw&quot; /&gt;&lt;img alt=&quot;The &#39;Connections&#39; tab of registering a postgres server. The hostname set to the docker container&#39;s IP (in this case 666.13.0.1), the port (default of 5432), and other common fields tied to connecting to a database&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chrislagasse.com/images/docker-postgres-4-600w.jpeg&quot; width=&quot;900&quot; height=&quot;705&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;After these changes, head over to the &amp;quot;SSH Tunnel&amp;quot; tab and provide your details there for connecting to your server. In the case of Digital Ocean (the majority of the time), you&#39;ll want to select &amp;quot;Indentity File&amp;quot; for the Authentication method and select the file on your system.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chrislagasse.com/images/docker-postgres-5-600w.webp 600w, https://chrislagasse.com/images/docker-postgres-5-900w.webp 900w&quot; sizes=&quot;(min-width: 1024px) 100vw, 50vw&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chrislagasse.com/images/docker-postgres-5-600w.jpeg 600w, https://chrislagasse.com/images/docker-postgres-5-900w.jpeg 900w&quot; sizes=&quot;(min-width: 1024px) 100vw, 50vw&quot; /&gt;&lt;img alt=&quot;The &#39;SSH Tunnel&#39; tab of registering a postgres server. Provide your server&#39;s hostname (commonly an ip), port, and username. We chose the Authentication method of &#39;identity file&#39; and selected our local ssh private key&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chrislagasse.com/images/docker-postgres-5-600w.jpeg&quot; width=&quot;900&quot; height=&quot;702&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;After all of this, select &amp;quot;Save&amp;quot; at the bottom and you should successfully connect!&lt;/p&gt;
&lt;h3 id=&quot;3.-success!&quot; tabindex=&quot;-1&quot;&gt;3. Success! &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/connecting-to-postgres-docker-remotely/#3.-success!&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You should have successfully managed to connect to your database. If you&#39;re having an issue and it&#39;s something I may be able to help with, send me a message over on &lt;a href=&quot;https://suncoast.dev/@chris&quot;&gt;Mastodon&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what&#39;s-next&quot; tabindex=&quot;-1&quot;&gt;What&#39;s next &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/connecting-to-postgres-docker-remotely/#what&#39;s-next&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The tables are several nested layers down by going to Database &amp;gt; {name} &amp;gt; Schemas &amp;gt; Public &amp;gt; Tables&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chrislagasse.com/images/docker-postgres-6-586w.webp 586w&quot; sizes=&quot;(min-width: 1024px) 100vw, 50vw&quot; /&gt;&lt;img alt=&quot;An example of the server&#39;s tree in the sidebar after successfully connecting, showing the path, and other options, leading to the &#39;Tables&#39; list.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chrislagasse.com/images/docker-postgres-6-586w.jpeg&quot; width=&quot;586&quot; height=&quot;1318&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;But you can start navigating the content early by right-clicking the database and selecting one of the Tools listed, such as &#39;Query Tool&#39;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chrislagasse.com/images/docker-postgres-7-600w.webp 600w&quot; sizes=&quot;(min-width: 1024px) 100vw, 50vw&quot; /&gt;&lt;img alt=&quot;The secondary menu triggered by a right click of the &#39;server&#39; in the sidebar, showcasing the options available, including &#39;Query Tool&#39;, which allows you to enter your SQL queries to call against the database.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chrislagasse.com/images/docker-postgres-7-600w.jpeg&quot; width=&quot;600&quot; height=&quot;920&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/connecting-to-postgres-docker-remotely/#conclusion&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This process was a little difficult to discover, and for me to navigate (first time working with Postgres this closely), so I hope these steps help you spin up and test faster than it took me :)&lt;/p&gt;
</description>
      <pubDate>Mon, 31 Jul 2023 00:00:00 +0000</pubDate>
      <dc:creator>Chris Lagasse</dc:creator>
      <guid>https://chrislagasse.com/posts/connecting-to-postgres-docker-remotely/</guid>
    </item>
    <item>
      <title>Using SlimPHP on Fly.io</title>
      <link>https://chrislagasse.com/posts/fly-io-with-php-apache/</link>
      <description>&lt;p&gt;I&#39;ve built a new project recently on SlimPHP and it was time to find hosting. I had a strong desire to stick with serverless-esque hosting, such as Vercel (my current provider of choice), but their third-party PHP support was... lacking.&lt;/p&gt;
&lt;p&gt;That&#39;s when I discovered &lt;a href=&quot;https://fly.io/&quot;&gt;fly.io&lt;/a&gt;. My hopes were initially dashed as it seemed that I needed to use Docker. Locally I was sufficient with &#39;just&#39; using &lt;code&gt;php --serve&lt;/code&gt;, and I wanted to keep my requirements as minimal as possible.&lt;/p&gt;
&lt;p&gt;However, I stuck with it, and found an effective solution as a middle ground.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; This build/project requires zero write ability in &lt;a href=&quot;http://fly.io/&quot;&gt;Fly.io&lt;/a&gt;, which is good for serverless, and accomplished my needs.&lt;/p&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; php:8.2-apache&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; apt update &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    &amp;amp;&amp;amp; apt install -y zip libzip-dev &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    &amp;amp;&amp;amp; docker-php-ext-configure zip &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    &amp;amp;&amp;amp; docker-php-ext-install zip&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; a2enmod rewrite&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; sed -ri -e &lt;span class=&quot;token string&quot;&gt;&#39;s!:80&gt;!:8080&gt;!g&#39;&lt;/span&gt; /etc/apache2/sites-available/*.conf&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; sed -ri -e &lt;span class=&quot;token string&quot;&gt;&#39;s!Listen 80!Listen 8080!g&#39;&lt;/span&gt; /etc/apache2/ports.conf&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; &lt;span class=&quot;token options&quot;&gt;&lt;span class=&quot;token property&quot;&gt;--chown&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;www-data&lt;/span&gt;&lt;/span&gt; . /var/www/html&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; composer install --no-dev --optimize-autoloader&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; sed -ri -e &lt;span class=&quot;token string&quot;&gt;&#39;s!/var/www/html!/var/www/html/public!g&#39;&lt;/span&gt; /etc/apache2/sites-available/*.conf&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; sed -ri -e &lt;span class=&quot;token string&quot;&gt;&#39;s!/var/www/html!/var/www/html/public!g&#39;&lt;/span&gt; /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;WORKDIR&lt;/span&gt; /var/www/html&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;EXPOSE&lt;/span&gt; 8080&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;let&#39;s-break-it-down!&quot; tabindex=&quot;-1&quot;&gt;Let&#39;s break it down! &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/fly-io-with-php-apache/#let&#39;s-break-it-down!&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; php:8.2-apache&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We&#39;re including the apache variant of Docker&#39;s native &lt;code&gt;PHP&lt;/code&gt; container, running PHP 8.2&lt;/p&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; apt update &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    &amp;amp;&amp;amp; apt install -y zip libzip-dev &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    &amp;amp;&amp;amp; docker-php-ext-configure zip &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    &amp;amp;&amp;amp; docker-php-ext-install zip&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;zip&lt;/code&gt; was required for composer. This tells the container to install and configure &lt;code&gt;zip&lt;/code&gt; as a PHP extension.&lt;/p&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; a2enmod rewrite&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I use an &lt;code&gt;.htaccess&lt;/code&gt; file in my &lt;code&gt;/public&lt;/code&gt; folder, and this tells apache to pay attention to it. Apache already has &lt;code&gt;AllowOverride All&lt;/code&gt; for the appropriate folders, but it still needs the rewrite module enabled.&lt;/p&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; sed -ri -e &lt;span class=&quot;token string&quot;&gt;&#39;s!:80&gt;!:8080&gt;!g&#39;&lt;/span&gt; /etc/apache2/sites-available/*.conf&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; sed -ri -e &lt;span class=&quot;token string&quot;&gt;&#39;s!Listen 80!Listen 8080!g&#39;&lt;/span&gt; /etc/apache2/ports.conf&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Fly.io&lt;/code&gt; has an &#39;internal&#39; port that defaults to &lt;code&gt;:8080&lt;/code&gt; that it plans to use to communicate with the container. This can be any port, but I stuck with the default for ease of setup.&lt;/p&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; &lt;span class=&quot;token options&quot;&gt;&lt;span class=&quot;token property&quot;&gt;--chown&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;www-data&lt;/span&gt;&lt;/span&gt; . /var/www/html&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This copies over your files from your local into the container, and makes sure they have the right &#39;public-facing&#39; permissions.&lt;/p&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; composer install --no-dev --optimize-autoloader&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Install composer, and install the necessary packages for production (will not install composer plugins as &lt;code&gt;--optimize-autoloader&lt;/code&gt; is enabled. Composer throws warnings and ends build prematurely)&lt;/p&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; sed -ri -e &lt;span class=&quot;token string&quot;&gt;&#39;s!/var/www/html!/var/www/html/public!g&#39;&lt;/span&gt; /etc/apache2/sites-available/*.conf&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; sed -ri -e &lt;span class=&quot;token string&quot;&gt;&#39;s!/var/www/html!/var/www/html/public!g&#39;&lt;/span&gt; /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These two lines are regex and it tells Apache to use the &lt;code&gt;/public&lt;/code&gt; folder as the site root instead of &lt;code&gt;/html&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;WORKDIR&lt;/span&gt; /var/www/html&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A helpful configuration that has your &#39;root&#39; working directory in the same directory as your project.&lt;/p&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;EXPOSE&lt;/span&gt; 8080&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Since we&#39;re not using &lt;code&gt;:80&lt;/code&gt; for our working port, we need to tell the container to make &lt;code&gt;:8080&lt;/code&gt; available.&lt;/p&gt;
&lt;h2 id=&quot;conclusions&quot; tabindex=&quot;-1&quot;&gt;Conclusions &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/fly-io-with-php-apache/#conclusions&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We&#39;ll see. I don&#39;t know how the site will perform on &lt;a href=&quot;http://fly.io/&quot;&gt;Fly.io&lt;/a&gt; yet, or what the costs will be for continued hosting, but it&#39;s successfully hosted and rendering on &lt;a href=&quot;http://fly.io/&quot;&gt;Fly.io&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I had the added benefit of not needing any write ability on this project. I&#39;m using SQLite, but in a read-only capacity. The database is compiled separately and stored statically in the database.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hope this helps you&lt;/strong&gt;. It was quite difficult to find sufficient resources regarding PHP and these serverless environments, especially from a more barebones approach like I wanted.&lt;/p&gt;
</description>
      <pubDate>Sun, 26 Feb 2023 00:00:00 +0000</pubDate>
      <dc:creator>Chris Lagasse</dc:creator>
      <guid>https://chrislagasse.com/posts/fly-io-with-php-apache/</guid>
    </item>
    <item>
      <title>Post-read thoughts about Larry Niven&#39;s Ringworld</title>
      <link>https://chrislagasse.com/posts/thoughts-about-ringworld/</link>
      <description>&lt;p&gt;In the hours after finishing &lt;a href=&quot;https://www.goodreads.com/book/show/61179.Ringworld&quot;&gt;Ringworld&lt;/a&gt;, I kept coming back to the book, wondering what I liked about it, and what I didn&#39;t. Many times I&#39;ll finish a book and immediately move on without a second thought, even the ones I loved. But this one has captivated me on several levels.&lt;/p&gt;
&lt;p&gt;When it comes to Ringworld I&#39;m left with questions, and curiousity: About the Ringworld, about the Engineers who built it, but also what the characters will actually do next. However, the book ends in a very anti-climatic fashion.&lt;/p&gt;
&lt;p&gt;I&#39;ve also found myself reminded about the spots in the book that I struggled with, conceptually. &lt;em&gt;spoilers ahead&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;do-not-read-past-this-point-if-you-want-to-avoid-spoilers&quot; tabindex=&quot;-1&quot;&gt;Do not read past this point if you want to avoid spoilers &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/thoughts-about-ringworld/#do-not-read-past-this-point-if-you-want-to-avoid-spoilers&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;the-characters&quot; tabindex=&quot;-1&quot;&gt;The Characters &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/thoughts-about-ringworld/#the-characters&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I&#39;ve had a hard time with the women Niven wrote about.&lt;/p&gt;
&lt;p&gt;Niven cast Teela Brown has young, pure, and so naive to the world around her. Yes, this is the work of the Puppeteer race breeding &#39;Luck&#39; in humans, but it falls flat. She immediately, for no (initially apparent) reason, falls for the only male human in the room: Louis. She&#39;s so innocent and &amp;quot;dumb&amp;quot; that the first thing she does on Ringworld is step onto molten hot metal.&lt;/p&gt;
&lt;p&gt;Character development is no better for Prill, the female Engineer we encounter. While she&#39;s intelligent, her previous job before landing on Ringworld was one of prostitution. And she immediately uses her abilities on the only male human.&lt;/p&gt;
&lt;p&gt;Typing these two character descriptions out, I&#39;m realizing that in a way, Niven might&#39;ve wrote Louis Wu as a &lt;a href=&quot;https://en.wikipedia.org/wiki/Mary_Sue&quot;&gt;Mary Sue&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;a character archetype in fiction[...] who is often portrayed as inexplicably competent across all domains, gifted with unique talents or powers, liked or respected by most other characters, unrealistically free of weaknesses, extremely attractive, innately virtuous, and/or generally lacking meaningful character flaws. Usually female and almost always the main character, a Mary Sue is often an author&#39;s idealized self-insertion, and may serve as a form of wish-fulfillment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Louis Wu seemed to have no flaws. He&#39;s likely to live forever. At nearly 200 years old, he&#39;s still &amp;quot;spry&amp;quot; (I saw zero reason to believe he couldn&#39;t run a marathon), attractive, and very sexually active. He has an absurd level of knowledge and experience (he is 200 years old, afterall), wise and clever. He got to be privy to behaviors and historical moments that basically no one else alive could dream of: One of the few who saw a Puppeteer before they vanished, and seeing the true nature of a Puppeteer&#39;s &amp;quot;turn around and flee&amp;quot; survival tactic.&lt;/p&gt;
&lt;p&gt;I believe that either Niven wrote Teela Brown and Prill this way because he believes women are subservient in society (born in 1938 and ~32 at the time of this book being published, it wouldn&#39;t surprise me), or in typical Mary Sue fashion, wrote them to be extremely &#39;easy to get&#39;. Combined with perhaps feeling the need for freedom (and wanting to &#39;explore&#39;), he threw his fantasies into Louis.&lt;/p&gt;
&lt;h3 id=&quot;breeding-&#39;luck&#39;&quot; tabindex=&quot;-1&quot;&gt;Breeding &#39;Luck&#39; &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/thoughts-about-ringworld/#breeding-&#39;luck&#39;&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I liked this part, though you have to absolutely let it slide. You have to ignore that &amp;quot;luck&amp;quot; is playing the odds, but Teela&#39;s version of &amp;quot;Luck&amp;quot; that the Pierson&#39;s Puppeteers have bred in Humans is more of a &amp;quot;I can bend the rules of the galaxy to lead myself down, unconciously, to exactly what I need at all times.&lt;/p&gt;
&lt;p&gt;It was interesting to see how Louis could postulate the way that Teela&#39;s luck worked, but Nessus and Speaker-to-Animals could not grasp it due to their lack of understanding of human nuance.&lt;/p&gt;
&lt;h3 id=&quot;the-galaxy-at-large&quot; tabindex=&quot;-1&quot;&gt;The Galaxy-at-large &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/thoughts-about-ringworld/#the-galaxy-at-large&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &amp;quot;Outsiders&amp;quot; are so mysterious, I really need more information on them. I had a couple other thoughts here (like how lucky Humans are to only find &#39;friendlies&#39; in the Galaxy), but the book answered these in a decent way (Puppeteer manipulation at-scale). But still, the fact that Outsiders just... show up, and sell extremely futuristic tech, is weird, and I&#39;m very curious about that civilization in general. What are their objectives? Why give away &#39;state secrets&#39;? They feel like a &lt;a href=&quot;https://en.wikipedia.org/wiki/Deus_ex_machina&quot;&gt;deus ex machina&lt;/a&gt; for whenever Niven needed a way out of explaining how humans survived.&lt;/p&gt;
&lt;h3 id=&quot;the-location&quot; tabindex=&quot;-1&quot;&gt;The Location &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/thoughts-about-ringworld/#the-location&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is where I wish the book took the approach of being less speculative in the eyes of unaware visitors. I would&#39;ve loved some more insight as to the science behind the Ringworld, about the society that built it. What the actual scenarios were that led to their downfall. Was it always inevitable? If a society could suddenly become so spread out in which they&#39;d never encounter each other again, even on the same &amp;quot;planet,&amp;quot; how easy would it be to become &amp;quot;barbarian&amp;quot; again, even without the accidental introduction of dangerous bacterium?&lt;/p&gt;
&lt;p&gt;What about the theory that Earth and its nearby systems being &amp;quot;Seeded&amp;quot; by Ringworld Engineers? How, if the Engineers were so human-like in appearance, that Humans on Earth had to &amp;quot;evolve&amp;quot; from Apes? It seems it&#39;d be more likely that they too were also former Engineers turned barbarian and then become modern humans, but not only Louis, and also Nessus, seem to have concluded otherwise.&lt;/p&gt;
&lt;p&gt;I&#39;m hopeful the next books in the series would cover some of these questions, but if the books stay in the perspective of a single individual, and not enough time passes... I doubt that will be the case. The next book is &#39;The Ringworld Engineers&#39; so perhaps it&#39;s more of a prequel?&lt;/p&gt;
&lt;h3 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/thoughts-about-ringworld/#conclusion&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Even with all of these flaws, I loved the book. I do get the feeling that my wife would have a harder time with the female characters, to the point where I am not sure I would recommend it to her.&lt;/p&gt;
&lt;p&gt;I will definitely add the next books to my &#39;To Read&#39; list, and I&#39;m curious where Niven takes the story next.&lt;/p&gt;
&lt;p&gt;This review is part of my goal of reading every Hugo Award-winning novel, which I&#39;m tracking my progress over at &lt;a href=&quot;https://hugo.chrislagasse.com/&quot;&gt;https://hugo.chrislagasse.com&lt;/a&gt;&lt;/p&gt;
</description>
      <pubDate>Sun, 19 Feb 2023 00:00:00 +0000</pubDate>
      <dc:creator>Chris Lagasse</dc:creator>
      <guid>https://chrislagasse.com/posts/thoughts-about-ringworld/</guid>
    </item>
    <item>
      <title>My Memere&#39;s Tourtière</title>
      <link>https://chrislagasse.com/posts/memere-tourtiere/</link>
      <description>&lt;p&gt;My Memere (term for a French Canadian grandmother) always made meat pie (&lt;a href=&quot;https://en.wikipedia.org/wiki/Tourti%C3%A8re&quot;&gt;tourtière&lt;/a&gt;) for the holidays. It was one of the most sought after courses by my relatives. Tourtière is a québécois recipe that definitely varies from family to family, and they all use different types of meats, fillings, and preparation methods.&lt;/p&gt;
&lt;p&gt;I was lucky enough to learn this recipe while my grandmother was still alive, and I still had to figure out my own path for it. Family recipes are always very touch and go: &amp;quot;just add some cinnamon&amp;quot; vs &amp;quot;add 1 teaspoon&amp;quot; -- and I think I&#39;ve figured it out in a way that I can replicate consistently year over year.&lt;/p&gt;
&lt;p&gt;Over time, family and friends have asked me for Memere&#39;s recipe, so I figured it&#39;s time to put it on here for the world to see.&lt;/p&gt;
&lt;h2 id=&quot;ingredients&quot; tabindex=&quot;-1&quot;&gt;Ingredients &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/memere-tourtiere/#ingredients&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Makes 4&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dough
&lt;ul&gt;
&lt;li&gt;I use Pre-made pie crusts from &lt;a href=&quot;https://www.publix.com/pd/pillsbury-pie-crusts/RIO-PCI-112875&quot;&gt;Pillsbury&lt;/a&gt;, or Publix equivalent (4 packages)&lt;/li&gt;
&lt;li&gt;Enough dough for top and bottom crusts for 4 pies.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4 cups water (roughly)&lt;/li&gt;
&lt;li&gt;1 pound hamburger&lt;/li&gt;
&lt;li&gt;1 pound ground pork&lt;/li&gt;
&lt;li&gt;3 medium potatoes&lt;/li&gt;
&lt;li&gt;1.75 tsp Salt&lt;/li&gt;
&lt;li&gt;1 tsp ground cloves&lt;/li&gt;
&lt;li&gt;1 tsp ground cinnamon&lt;/li&gt;
&lt;li&gt;1 large yellow onion&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;instructions&quot; tabindex=&quot;-1&quot;&gt;Instructions &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/memere-tourtiere/#instructions&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;round-1&quot; tabindex=&quot;-1&quot;&gt;Round 1 &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/memere-tourtiere/#round-1&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Chop onions small&lt;/li&gt;
&lt;li&gt;Add meat, spices and onions to pot, with just enough water to almost entirely cover ingredients (~4 cups). Cook for 20-25 minutes on high.
&lt;ul&gt;
&lt;li&gt;Water should be salty light-ish brown.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;While boiling, chop up potatoes to &amp;quot;home fry&amp;quot; size /(1 inch max?)/&lt;/li&gt;
&lt;li&gt;Once meat is boiled, add potatoes to pot. Cook until potatoes are very soft.&lt;/li&gt;
&lt;li&gt;Turn off stove, mash heavily, and &lt;em&gt;cool down&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;round-2&quot; tabindex=&quot;-1&quot;&gt;Round 2 &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/memere-tourtiere/#round-2&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Preheat oven to 425ºF&lt;/li&gt;
&lt;li&gt;Make pies.&lt;/li&gt;
&lt;li&gt;Cut top dough to let air escape&lt;/li&gt;
&lt;li&gt;Place in oven and cook until top is flaky brown. (~35 min for 2 pies)&lt;/li&gt;
&lt;/ol&gt;
</description>
      <pubDate>Sun, 03 Jan 2021 00:00:00 +0000</pubDate>
      <dc:creator>Chris Lagasse</dc:creator>
      <guid>https://chrislagasse.com/posts/memere-tourtiere/</guid>
    </item>
    <item>
      <title>Face Masks &amp; Health</title>
      <link>https://chrislagasse.com/posts/covid-19-mask-thoughts/</link>
      <description>&lt;p&gt;&lt;strong&gt;Last Updated July 17th 2020&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As the global COVID-19 pandemic continues to rage across the world, especially across the United States (and my home state of Florida), I regularly see articles about anti-mask activists, like &lt;a href=&quot;https://www.sltrib.com/news/education/2020/07/15/packed-meeting-utah/&quot;&gt;the ones recently dominating a county meeting in Utah&lt;/a&gt;. I&#39;ve been thinking about what wearing a mask (or the mandates requiring masks) means to these individuals, and what we can do to encourage mask usage.&lt;/p&gt;
&lt;p&gt;The science has shown that wearing a cloth mask, combined with social distancing, sanitizing, disinfecting, and washing your hands regularly, can help reduce the risk and spread of disease and sickness, not just COVID-19. Even the &lt;a href=&quot;https://www.cdc.gov/coronavirus/2019-ncov/prevent-getting-sick/index.html&quot;&gt;Centers for Disease Control&lt;/a&gt; recommends all of these. Countries like Japan, which have strong social constructs, already have plenty of citizens who wear masks when they&#39;re sick, or trying to prevent getting sick, when they&#39;re in public. Doctors and nurses wear masks to prevent getting sick, or getting their patients sick, when performing surgeries.&lt;/p&gt;
&lt;p&gt;I feel like we&#39;ve missed something obvious here: Regardless of COVID, for the good of our whole world... When you&#39;re sick, you should be staying home, and if you have to be going out, &lt;strong&gt;wear a mask&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;wear-a-mask&quot; tabindex=&quot;-1&quot;&gt;Wear a Mask &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/covid-19-mask-thoughts/#wear-a-mask&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I get it, you don&#39;t want to be &lt;strong&gt;forced&lt;/strong&gt; to wear a mask. But when you&#39;re sick, you already consider the well-being of your family, your grandparents, your friends. You cancel plans because you&#39;re sick, or you don&#39;t go visit your grandmother because you don&#39;t want to get them sick. Your uncle may be really sick so you&#39;re required to wear a mask when visiting them in the hospital, in order to prevent catching and spreading it.&lt;/p&gt;
&lt;p&gt;This is what is so particularly damning about COVID, and why the mandates have been so important. As many of those who catch COVID-19 are asymptomatic (showing no outwards symptoms), it is difficult to figure out who are carriers and who aren&#39;t. And those who do get really sick can have lungs that are essentially permanently damaged for the rest of their lives, if they even survive it.&lt;/p&gt;
&lt;p&gt;As such, for the benefit of everyone... everyone should be wearing masks until the risk is contained.&lt;/p&gt;
&lt;p&gt;Wearing a mask is the next logical step that honestly, we should&#39;ve been doing all along. I will be wearing a mask in public every time that I am sick, moving forward, well after COVID-19 has (hopefully) faded away.&lt;/p&gt;
&lt;h2 id=&quot;challenges&quot; tabindex=&quot;-1&quot;&gt;Challenges &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/covid-19-mask-thoughts/#challenges&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;But I also get it. American individualism is a powerful ideal. We don&#39;t want to be told what to do. Unfortunately, it has become a massive political dividing line. And now, it essentially comes down to those who care about other people and want to keep everyone safe... and those who don&#39;t. It sounds harsh, but the excuses against wearing a mask all fall due to faux science, pundit fearmongering, or the idea that COVID-19 is a hoax (&lt;a href=&quot;https://www.chicagotribune.com/entertainment/ny-coronavirus-chuck-woolery-20200717-gohmcyb7czhxtkbgvumsmh7an4-story.html&quot;&gt;until someone you personally know gets infected&lt;/a&gt;).&lt;/p&gt;
&lt;h3 id=&quot;%22it&#39;s-just-a-flu%22&quot; tabindex=&quot;-1&quot;&gt;&amp;quot;It&#39;s just a flu&amp;quot; &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/covid-19-mask-thoughts/#%22it&#39;s-just-a-flu%22&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For a lot of people, it is similar to the flu, but so was the Spanish Flu. So was H1N1. There&#39;s a higher risk factor, and a higher death rate with these strains of viruses. Over 135 thousand people have died of COVID-19 in the United States alone. And this number is &lt;a href=&quot;https://www.forbes.com/sites/joshuacohen/2020/04/14/underreporting-of-covid-19-deaths-in-the-us-and-europe/#27a1f97582d7&quot;&gt;very likely under-reported&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;%22i-don&#39;t-want-to-be-required-to-wear-a-mask%22&quot; tabindex=&quot;-1&quot;&gt;&amp;quot;I don&#39;t want to be required to wear a mask&amp;quot; &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/covid-19-mask-thoughts/#%22i-don&#39;t-want-to-be-required-to-wear-a-mask%22&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Then wear one for the good of society. If you just did this to begin with, a mandate wouldn&#39;t be needed.&lt;/p&gt;
&lt;h3 id=&quot;%22it&#39;s-a-hoax%22&quot; tabindex=&quot;-1&quot;&gt;&amp;quot;It&#39;s a hoax&amp;quot; &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/covid-19-mask-thoughts/#%22it&#39;s-a-hoax%22&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If anything, its dangers might&#39;ve been exaggerated. But we have enough dangerous diseases, and if we don&#39;t contain them early on, they&#39;ll become permanent fixtures in our society, forever causing harm to our survival and life expectancy. The problem with advanced notice is that if we do our job and contain it early, it comes across as over-exaggerating and fearmongering.&lt;/p&gt;
&lt;p&gt;We see this in Florida every year with hurricanes. They can cause a LOT Of damage and kill a lot of people. We should be prepared, maybe even evacuate. But if that storm goes a different way, makes landfall sooner/later than expected, it was &amp;quot;fake news&amp;quot; or a &amp;quot;hoax&amp;quot;... We don&#39;t take steps to be prepared unless we&#39;re afraid. Media and our politicians tap into that, to force us into action. But that doesn&#39;t mean we shouldn&#39;t be prepared. We must be.&lt;/p&gt;
&lt;p&gt;The same applies to COVID-19 or the next pandemic. Or tornadoes, hurricanes, or a &lt;a href=&quot;https://www.cdc.gov/cpr/zombie/index.htm&quot;&gt;zombie outbreak&lt;/a&gt;. We need to be prepared to do what we can to keep them under control. To be safe, and healthy. If we did this of our own volition, we wouldn&#39;t need the fear.&lt;/p&gt;
&lt;h3 id=&quot;%22a-mask-is-blocking-oxygen%22-or-%22increases-carbon-dioxide%22&quot; tabindex=&quot;-1&quot;&gt;&amp;quot;A mask is blocking oxygen&amp;quot; or &amp;quot;increases carbon dioxide&amp;quot; &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/covid-19-mask-thoughts/#%22a-mask-is-blocking-oxygen%22-or-%22increases-carbon-dioxide%22&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.usatoday.com/story/news/factcheck/2020/05/30/fact-check-wearing-face-mask-not-cause-hypoxia-hypercapnia/5260106002/&quot;&gt;No, It isn&#39;t, and no, it doesn&#39;t&lt;/a&gt;. Nurses and doctors wear masks for much longer periods of times than you need to, and they&#39;re ok.&lt;/p&gt;
&lt;h2 id=&quot;a-quick-anecdote&quot; tabindex=&quot;-1&quot;&gt;A Quick Anecdote &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/covid-19-mask-thoughts/#a-quick-anecdote&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&#39;m hard of hearing. It&#39;s absolutely frustrating that everyone is wearing a mask, as I am seriously struggling more than usual to hear. I read lips to know what is being said, so masks have drastically inhibited my ability to understand. But I still wear a mask, and I&#39;d rather you wear a mask than risk spreading COVID-19.&lt;/p&gt;
&lt;h2 id=&quot;be-prepared&quot; tabindex=&quot;-1&quot;&gt;Be Prepared &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/covid-19-mask-thoughts/#be-prepared&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We should always be doing more to prevent getting sick and prevent others from getting sick, regardless of COVID-19. Consider buying a mask. Consider wearing one when you&#39;re not feeling well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This isn&#39;t forever. Please just wear a mask, practice social distancing, stay home if possible, and help bring this pandemic under control.&lt;/strong&gt;&lt;/p&gt;
</description>
      <pubDate>Fri, 17 Jul 2020 00:00:00 +0000</pubDate>
      <dc:creator>Chris Lagasse</dc:creator>
      <guid>https://chrislagasse.com/posts/covid-19-mask-thoughts/</guid>
    </item>
    <item>
      <title>How to make the perfect Caipirinha</title>
      <link>https://chrislagasse.com/posts/perfect-caipirinha/</link>
      <description>&lt;p&gt;My wife first tried a caipirinha at Disney&#39;s Coronado Springs resort when we first got married, and immediately fell in love (with the caipirinha). Naturally, we had to figure out how to make the cocktail at home.&lt;/p&gt;
&lt;p&gt;It&#39;s now a tradition of ours to make this cocktail for our Dungeons &amp;amp; Dragons nights, which is following the theme &lt;em&gt;so well&lt;/em&gt;, don&#39;t you think?&lt;/p&gt;
&lt;h2 id=&quot;what-is-a-caipirinha%3F&quot; tabindex=&quot;-1&quot;&gt;What is a Caipirinha? &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/perfect-caipirinha/#what-is-a-caipirinha%3F&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://en.wikipedia.org/wiki/Caipirinha&quot;&gt;Caipirinha&lt;/a&gt; is Brazil&#39;s national cocktail. It&#39;s made with Cachaça, a rum-like liquor made with sugarcane, as well as sugar and lime.&lt;/p&gt;
&lt;p&gt;It&#39;s a very simple recipe of essentially pure liquor, so we sought to &amp;quot;mellow&amp;quot; it out and added seltzer water.&lt;/p&gt;
&lt;h2 id=&quot;ingredients&quot; tabindex=&quot;-1&quot;&gt;Ingredients &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/perfect-caipirinha/#ingredients&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Makes 2 cocktails&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Turbinado/Raw Sugar&lt;/li&gt;
&lt;li&gt;1 lime&lt;/li&gt;
&lt;li&gt;Cachaça&lt;/li&gt;
&lt;li&gt;Seltzer Water (we buy cans)&lt;/li&gt;
&lt;li&gt;Ice&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;recipe&quot; tabindex=&quot;-1&quot;&gt;Recipe &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/perfect-caipirinha/#recipe&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Cut lime in quarters, add two slices to each glass&lt;/li&gt;
&lt;li&gt;Add 1 teaspoon of sugar to glasses&lt;/li&gt;
&lt;li&gt;Muddle&lt;/li&gt;
&lt;li&gt;Add 2 ounces Cachaça to each glass&lt;/li&gt;
&lt;li&gt;Add 5 ounces of Seltzer Water&lt;/li&gt;
&lt;li&gt;Stir and add ice&lt;/li&gt;
&lt;/ol&gt;
</description>
      <pubDate>Fri, 22 May 2020 00:00:00 +0000</pubDate>
      <dc:creator>Chris Lagasse</dc:creator>
      <guid>https://chrislagasse.com/posts/perfect-caipirinha/</guid>
    </item>
    <item>
      <title>Opinions of a Hearing Impaired Remote Worker</title>
      <link>https://chrislagasse.com/posts/deaf-remote-worker/</link>
      <description>&lt;p&gt;In the span of a couple weeks, I had a few moments that sparked thoughts on what it&#39;s like being a hard of hearing remote worker.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A manager friend of mine hired a remote worker who has a hearing impairment and wanted thoughts on what he can do to be accommodating&lt;/li&gt;
&lt;li&gt;A tweet was shared with me that was asking for ways to get into the coding world that is accessible. &lt;a href=&quot;https://twitter.com/spenwall/status/1156960282222010368?s=20&quot;&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ensuing discussions among a couple of coworkers, and friends, who also have hearing impairments of various levels.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you have someone under you who is hard of hearing, or you even work with someone who is, here are some things I shared that might benefit:&lt;/p&gt;
&lt;h2 id=&quot;follow-up-actively-during-phone-conversations-with-groups.&quot; tabindex=&quot;-1&quot;&gt;Follow-up actively during phone conversations with groups. &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/deaf-remote-worker/#follow-up-actively-during-phone-conversations-with-groups.&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While on conference calls with your team, especially with clients or with a lot of cross-talk, I&#39;ve found it extremely helpful to have my managers keep me in the loop during conversations.&lt;/p&gt;
&lt;p&gt;This can be with a quick Slack message of &amp;quot;We&#39;re now talking about X.&amp;quot; This helps me switch my thoughts over and stay involved. I could&#39;ve missed a key word or phrase and I&#39;m struggling to play catch-up on what exactly we&#39;re talking about, and this side note is vital.&lt;/p&gt;
&lt;h2 id=&quot;accents-and-sentence-structures-are-always-problematic&quot; tabindex=&quot;-1&quot;&gt;Accents and sentence structures are ALWAYS problematic &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/deaf-remote-worker/#accents-and-sentence-structures-are-always-problematic&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you&#39;re asked to repeat, try rephrasing the sentence.&lt;/p&gt;
&lt;p&gt;Regularly, I will miss a single word, likely due to where it is in the sentence. When asked to repeat, people commonly recite the exact phrase again... and again. But that word doesn&#39;t become any more clear due to where it is in the sentence. Rephrasing can help this, otherwise I have to recite the entire sentence back, with a spot where the &amp;quot;blank&amp;quot; is, and then ask for that blank.&lt;/p&gt;
&lt;p&gt;However, sometimes it&#39;s the accent that is causing trouble more than the sentence structure. At which point, someone else saying the question might help. If all that fails, revert to the previous bullet point (message them).&lt;/p&gt;
&lt;p&gt;If you&#39;re asking a question, or have something directed towards them, say their name FIRST&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It causes us to focus on the next few words (after being lost in the noise)&lt;/li&gt;
&lt;li&gt;It&#39;s a good idea to confirm that they heard their name first, make sure they&#39;re aware and ready for what&#39;s next.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the difference between &amp;quot;Hey, John, got a question for you&amp;quot; or &amp;quot;John, I was wondering...&amp;quot; vs &amp;quot;{5 minute description of an issue}... any thoughts, John?&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;avoid-speakerphones&quot; tabindex=&quot;-1&quot;&gt;Avoid Speakerphones &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/deaf-remote-worker/#avoid-speakerphones&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Optimally there wouldn&#39;t be a speakerphone at all (everyone on their own mic), but as that&#39;s unlikely, especially in an office, when you do use a speakerphone:&lt;/p&gt;
&lt;p&gt;Make a concerted effort to be close to it and try to point conversations with others in the room towards it, even if the conversation doesn&#39;t directly involve the person(s) on the other end of the line.&lt;/p&gt;
&lt;h2 id=&quot;encourage-and%2For-pay-for-good-audio&quot; tabindex=&quot;-1&quot;&gt;Encourage and/or pay for good audio &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/deaf-remote-worker/#encourage-and%2For-pay-for-good-audio&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Help the employee get a good pair of headphones. I&#39;ve benefited from my &lt;a href=&quot;https://www.akg.com/Headphones/Professional%20Headphones/K361-.html&quot;&gt;AKG 361&#39;s&lt;/a&gt;, but it should be noted that everyone has different levels of deafness and hearing, and not everyone will benefit from the same brand or model.&lt;/p&gt;
&lt;p&gt;Also, a good speakerphone system in rooms that are properly sound dampened. Due to feedback from remote workers, and continued issues with sound quality, we&#39;re overhauling our conference room audio at my current employment.&lt;/p&gt;
&lt;h2 id=&quot;video-is-always-better-than-audio-only&quot; tabindex=&quot;-1&quot;&gt;Video is always better than audio-only &lt;a class=&quot;direct-link&quot; href=&quot;https://chrislagasse.com/posts/deaf-remote-worker/#video-is-always-better-than-audio-only&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Whenever possible, be on camera. I always take the initiative and turn on my camera, which usually entices the rest of the team to turn theirs on as well.&lt;/p&gt;
&lt;p&gt;Being on camera lets us see your face, which means we can gain more insight as to the tone and intention of your words. Not to mention the ability to read your lips.&lt;/p&gt;
</description>
      <pubDate>Mon, 24 Jun 2019 00:00:00 +0000</pubDate>
      <dc:creator>Chris Lagasse</dc:creator>
      <guid>https://chrislagasse.com/posts/deaf-remote-worker/</guid>
    </item>
  </channel>
</rss>