<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>jayhall.dev</title>
  <subtitle></subtitle>
  <link href="https://jayhall.dev/feed.xml" rel="self"/>
  <link href="https://jayhall.dev/"/>
  
    <updated>2025-11-24T00:00:00Z</updated>
  
  <id>https://jayhall.dev</id>
  <author>
    <name>Jason Hall</name>
    <email>jdhall75@zohomail.com</email>
  </author>
  
    
    <entry>
      <title>Autostarting applications in Xorg</title>
      <link href="https://jayhall.dev/posts/autostarting-applications-in-xorg/"/>
      <updated>2023-01-01T00:00:00Z</updated>
      <id>https://jayhall.dev/posts/autostarting-applications-in-xorg/</id>
      <content type="html">
        <![CDATA[
      <p>I recently had an issue figuring out how to get picom start while booting into
Awesomewm. After doing much research I found that I should be able to handle
this with the initialization files for Xorg.  All the files that are involved
in setting up your X session are simply shell scripts.  This means that I can
just run commands from them like I normally would.</p>
<p>Anyway, here's the solution to getting picom running on login.  Not much here,
but it works.</p>
<h2>.xsession</h2>
<pre class="language-sh"><code class="language-sh"><span class="token shebang important">#!/bin/sh</span><br><br><span class="token comment"># Make sure this is before the 'exec' command or it won't be sourced.</span><br><span class="token punctuation">[</span> <span class="token parameter variable">-f</span> /etc/xprofile <span class="token punctuation">]</span> <span class="token operator">&amp;&amp;</span> <span class="token builtin class-name">.</span> /etc/xprofile<br><span class="token punctuation">[</span> <span class="token parameter variable">-f</span> ~/.xprofile <span class="token punctuation">]</span> <span class="token operator">&amp;&amp;</span> <span class="token builtin class-name">.</span> ~/.xprofile<br><br><span class="token builtin class-name">exec</span> awesome<br></code></pre>
<h2>.xprofile</h2>
<pre class="language-sh"><code class="language-sh"><span class="token shebang important">#!/bin/sh</span><br><br><br><span class="token comment"># turn the bell off -- annoying</span><br>xset <span class="token parameter variable">-b</span> b off<br><br><span class="token comment"># start picom</span><br>picom <span class="token parameter variable">-b</span></code></pre>

    ]]>
      </content>
    </entry>
  
    
    <entry>
      <title>Pythons dict.setdefault method</title>
      <link href="https://jayhall.dev/posts/pythons-dict.setdefault-method/"/>
      <updated>2023-11-29T00:00:00Z</updated>
      <id>https://jayhall.dev/posts/pythons-dict.setdefault-method/</id>
      <content type="html">
        <![CDATA[
      <p>I was this days old when I learned about the setdefault method in the dict data type.  This method keeps you from overwriting values in a dictionary if they have already been set. I can see instant use for this.  You could implement read only keys or have a primary key like in a database.</p>
<p>The syntax for this is very similar to the <code>update</code> method, but only updates the dictionary if the key doesnt exist.</p>
<p>The help tells us:</p>
<pre><code>dict.setdefault = setdefault(self, key, default=None, /)
    Insert key with a value of default if key is not in the dictionary.
    
    Return the value for key if key is in the dictionary, else default.
</code></pre>
<p>In practice it looks like.</p>
<pre class="language-python"><code class="language-python">mydict <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><br>mydict<span class="token punctuation">.</span>setdefault<span class="token punctuation">(</span><span class="token string">'first'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>     <span class="token comment"># mydict == {'first': 1}</span><br>mydict<span class="token punctuation">.</span>setdefault<span class="token punctuation">(</span><span class="token string">'first'</span><span class="token punctuation">,</span> <span class="token string">'1st'</span><span class="token punctuation">)</span> <span class="token comment"># mydict == {'first': 1}</span></code></pre>

    ]]>
      </content>
    </entry>
  
    
    <entry>
      <title>Ansible Jinja2 Template Layouts</title>
      <link href="https://jayhall.dev/posts/ansible-jinja2-template-layouts/"/>
      <updated>2023-12-07T00:00:00Z</updated>
      <id>https://jayhall.dev/posts/ansible-jinja2-template-layouts/</id>
      <content type="html">
        <![CDATA[
      <h2>Problem</h2>
<p>At work we have circled the wagons on Ansible for network automation.  When it
comes to automation the team that I am on is relatively inexperienced. Having a system
that generates relatively familiar information is a definately in the plus
column.  Where it gets tricky is we are a service provider and our configs are
long... I have been formulating a solution that should bring us home.</p>
<h2>Solution</h2>
<p>The configuration are broken out at first by &quot;top level&quot; configuration
stanzas(groups, system, protocols, etc).  For every one of the top level
configuration files there is a &quot;.d&quot; directory created for smaller configuration
pieces.</p>
<p>The result looks something similar to this:</p>
<pre><code>.
└── templates
    ├── groups.d
    │   ├── groups-header.j2
    │   └── tacplus-servers.j2
    ├── groups.j2
    ├── system.d
    │   ├── system-header.j2
    │   └── tacplus-servers.j2
    └── system.j2

3 directories, 6 files
</code></pre>
<p>The <code>tacplus-server.j2</code> template extends the <code>groups-header.j2</code> file.  This
contains the outside block <code>groups {}</code> block in which we will be inserting
configuration inside of for each group configuration that we generate.</p>
<pre><code># templates/groups.d/groups-header.j2

groups {
    {% block group_content %}{% endblock %}
}

</code></pre>
<p>As you can see I have defined a Jinja content block to to place the user
defined groups configuration in.</p>
<p>Then in the tacplus configuration below we are extending group config and
defining the content block.</p>
<pre><code># templates/groups.d/tacplus-server.j2

{% extends 'groups-header.j2' %}
{% block group_content %}
    replace:
    tacplus-servers {
        system {
            tacplus-server {
                &lt;*&gt; {
                    source-address {{ mgmt_ip }}
                    secret {{ vaulted_tacacs_secret }}
                    port 49
                }
            }
        }
    }
{% endblock %}

</code></pre>
<p>In the main <code>groups.j2</code> template all we have to do is include any number of
groups that we are defining.</p>
<pre><code># templates/groups.j2

{% include 'groups.d/tacplus-servers.j2' %}

</code></pre>
<p>The drawback to this approach is when you have more than one group defined. You
will end up rendering configuration with multiple <code>group {}</code> blocks with one
user defined groups configuration in it.</p>
<p>It will look funky, but Junos can figure it out.</p>
<p>The benfit from this methodology is we can define configuration in a service
oriented fashion and do targeted changes to that service.</p>
<p>Lets fill out the rest of the templates so you can see what I mean.  We will
take the same approach on the system configurations.</p>
<pre><code># templates/system.d/system-header.j2

{% block system_content %}{% endblock %}

}
</code></pre>
<pre><code># templates/system.d/tacplus-servers.j2

{% block system_content %}
    tacplus-server {
{% for server in tacplus_servers %}
        {{ server }};
{% endfor %}
    }
{% endblock %}

</code></pre>
<pre><code># templates/system.j2

{% include 'system.d/tacplus-servers.j2' %}

</code></pre>
<p>So now lets define just the tacacs service in a file.</p>
<pre><code># /templates/service-tacacs.j2

{% include 'groups.d/tacplus-servers.j2' %}
{% include 'system.d/tacplus-servers.j2 %}

</code></pre>
<p>I know we can send the entire configuration to the router and Junos will decide
what has changed and what hasn't, but we are still in a brown field environment
and I would like to stay very tactical with our configuration changes.  If we
are not careful and we have a &quot;cowboy config&quot; out in the network we could end
up isolting a router or not being able to manage it.</p>
<p>I hope this helps someone.  I am currently restructuring our templates to implement these patterns.</p>

    ]]>
      </content>
    </entry>
  
    
    <entry>
      <title>Managing virtual environments with Bash</title>
      <link href="https://jayhall.dev/posts/managing-virtual-environments-with-bash/"/>
      <updated>2024-08-23T00:00:00Z</updated>
      <id>https://jayhall.dev/posts/managing-virtual-environments-with-bash/</id>
      <content type="html">
        <![CDATA[
      <p>I guess there are two methodologies out there to managing your virtual environments for Python.  The first is to add it in the .venv directory in the root of your project.  That way when you manuver into your project you can simply execute <code>. .venv/bin/activate</code> and get started.  The other is to manage them in a central location. In the base of your $HOME directory somewhere like .virtualenvs.  These are great, but they both have their pro's and con's.  Did I create a virtual environment for this project? If its buried in a directory outside your project it's hard to tell.  If you placed your .venv in the root of your project and forgot to add it to the <code>.gitignore</code>(Your using version control, right?).  You could end up with more in your repo that you wanted. These are things that have happend and still happen to me.</p>
<p>You could employ a manager like Pyenv, Hatch, Pipenv, or Pyflow to take care of the heavy lifting, but that's another tool to learn and I a trying to simplify my worflow.  What if we had management of the environments built right in our shell.  That is when I ended up writing my own set of bash functions to manage my virtual environments. I am no bash guru, but they do work pretty nicely if I do say so myself.</p>
<p>I've had some thoughts on this since I started writing.  Like using the projects directory name for the virtualenv name.  This could save some typing.  Maybe setting up PROMPT_COMMAND to point to a function that checks the <code>$PYENV_HOME</code> for an existing virtual environment and activates it automatically.</p>
<pre class="language-bash"><code class="language-bash"><span class="token assign-left variable">PYENV_HOME</span><span class="token operator">=</span><span class="token environment constant">$HOME</span>/.venvs<br><br><span class="token comment"># Init python venvs created in the .local/venvs dir</span><br><span class="token comment"># activate &lt;venv_name></span><br><span class="token keyword">function</span> <span class="token function-name function">chkarg</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token parameter variable">-z</span> <span class="token string">"<span class="token variable">$@</span>"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">${FUNCNAME<span class="token punctuation">[</span>-1<span class="token punctuation">]</span>}</span> requires an venv name"</span><span class="token punctuation">;</span> <span class="token builtin class-name">exit</span> -1<span class="token punctuation">;</span> <span class="token keyword">else</span> <span class="token builtin class-name">exit</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">fi</span> <span class="token punctuation">}</span><br><span class="token keyword">function</span> <span class="token function-name function">activate</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br>    <span class="token punctuation">(</span>chkarg <span class="token variable">$@</span><span class="token punctuation">)</span><br>    <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token parameter variable">-n</span> <span class="token string">"<span class="token variable">$VIRTUAL_ENV</span>"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span><br>        deactivate<br>    <span class="token keyword">fi</span><br>    <span class="token builtin class-name">source</span> <span class="token variable">$PYENV_HOME</span>/<span class="token variable">$@</span>/bin/activate <span class="token punctuation">;</span><br><span class="token punctuation">}</span><br><span class="token keyword">function</span> <span class="token function-name function">mkenv</span> <span class="token punctuation">{</span> <span class="token punctuation">(</span>chkarg <span class="token variable">$@</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token variable"><span class="token variable">$(</span><span class="token function">which</span> python3<span class="token variable">)</span></span> <span class="token parameter variable">-m</span> venv <span class="token variable">$PYENV_HOME</span>/<span class="token variable">$@</span> <span class="token punctuation">;</span><span class="token punctuation">}</span><br><span class="token keyword">function</span> <span class="token function-name function">rmenv</span> <span class="token punctuation">{</span><br>    <span class="token punctuation">(</span>chkarg <span class="token variable">$@</span><span class="token punctuation">)</span><br>    <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$?</span>"</span> <span class="token parameter variable">-ne</span> <span class="token number">0</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span><br>        <span class="token builtin class-name">return</span> <span class="token parameter variable">-1</span><br>    <span class="token keyword">fi</span><br>    <span class="token assign-left variable">ACTIVE</span><span class="token operator">=</span><span class="token string">""</span><br>    <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token string">"<span class="token variable"><span class="token variable">$(</span> <span class="token function">basename</span> $VIRTUAL_ENV<span class="token variable">)</span></span>"</span> <span class="token operator">==</span> <span class="token string">"<span class="token variable">$@</span>"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span><br>        deactivate<br>    <span class="token keyword">fi</span><br>    <span class="token builtin class-name">echo</span> <span class="token string">"removing <span class="token variable">$@</span>"</span><br>    <span class="token variable"><span class="token variable">$(</span><span class="token function">which</span> <span class="token function">rm</span><span class="token variable">)</span></span> <span class="token parameter variable">-fr</span> <span class="token variable">$PYENV_HOME</span>/<span class="token variable">$@</span> <span class="token punctuation">;</span><br><span class="token punctuation">}</span><br><br><span class="token comment">#function rmenv { (chkarg $@) &amp;&amp; echo "removing $@";}</span><br><span class="token keyword">function</span> <span class="token function-name function">lsenv</span> <span class="token punctuation">{</span><br>    <span class="token assign-left variable">ACTIVE</span><span class="token operator">=</span><span class="token string">""</span><br>    <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token parameter variable">-n</span> <span class="token string">"<span class="token variable">$VIRTUAL_ENV</span>"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span><br>        <span class="token assign-left variable">ACTIVE</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token function">basename</span> $VIRTUAL_ENV<span class="token variable">)</span></span><br>    <span class="token keyword">fi</span><br>    <span class="token keyword">for</span> <span class="token for-or-select variable">d</span> <span class="token keyword">in</span> <span class="token variable"><span class="token variable">$(</span><span class="token function">ls</span> <span class="token parameter variable">-d</span> $PYENV_HOME/* <span class="token operator"><span class="token file-descriptor important">2</span>></span> /dev/null<span class="token variable">)</span></span><span class="token punctuation">;</span> <span class="token keyword">do</span><br>        <span class="token assign-left variable">VENV_NAME</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token function">basename</span> $d<span class="token variable">)</span></span><br>        <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$VENV_NAME</span>"</span> <span class="token operator">=</span> <span class="token string">"<span class="token variable">$ACTIVE</span>"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span><br>            <span class="token builtin class-name">echo</span> <span class="token string">"* <span class="token variable">$VENV_NAME</span>"</span><span class="token punctuation">;</span><br>        <span class="token keyword">else</span><br>            <span class="token builtin class-name">echo</span> <span class="token string">"  <span class="token variable">$VENV_NAME</span>"</span><br>        <span class="token keyword">fi</span><br>    <span class="token keyword">done</span> <span class="token punctuation">;</span><br><span class="token punctuation">}</span></code></pre>

    ]]>
      </content>
    </entry>
  
    
    <entry>
      <title>Where Am I</title>
      <link href="https://jayhall.dev/posts/where-am-i/"/>
      <updated>2025-04-16T00:00:00Z</updated>
      <id>https://jayhall.dev/posts/where-am-i/</id>
      <content type="html">
        <![CDATA[
      <h2>Modules</h2>
<p><code>os</code>
<code>pathlib</code></p>
<h2>Finding The Path Of Your Script</h2>
<h3>os module</h3>
<pre class="language-python"><code class="language-python">base_dir <span class="token operator">=</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>dirname<span class="token punctuation">(</span>__file__<span class="token punctuation">)</span></code></pre>
<h3>pathlib</h3>
<pre class="language-python"><code class="language-python">base_dir <span class="token operator">=</span> pathlib<span class="token punctuation">.</span>Path<span class="token punctuation">(</span>__file__<span class="token punctuation">)</span><span class="token punctuation">.</span>parent</code></pre>
<h2>The Users Director</h2>
<h3>os module</h3>
<pre class="language-python"><code class="language-python"><span class="token comment"># this can change if you change directories in the script</span><br>user_dir <span class="token operator">=</span> os<span class="token punctuation">.</span>getcwd<span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre>
<h3>pathlib module</h3>
<pre class="language-python"><code class="language-python"><span class="token comment"># this can change if you change directories in the script</span><br>user_dir <span class="token operator">=</span> pathlib<span class="token punctuation">.</span>Path<span class="token punctuation">.</span>cwd<span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre>

    ]]>
      </content>
    </entry>
  
    
    <entry>
      <title>PCAP Study notes - Exceptions</title>
      <link href="https://jayhall.dev/posts/pcap-study-notes-exceptions/"/>
      <updated>2025-06-10T00:00:00Z</updated>
      <id>https://jayhall.dev/posts/pcap-study-notes-exceptions/</id>
      <content type="html">
        <![CDATA[
      <h2>Exceptions</h2>
<p>All Exceptions are derived from <code>BaseException</code></p>
<h3>Concrete Exceptions</h3>
<p>In Python, &quot;concrete exceptions&quot; refer to specific, built-in exception types that are raised by the interpreter or standard library functions in response to various error conditions. These contrast with more general exception types (like Exception itself) or user-defined exceptions.</p>
<h4>Examples:</h4>
<ul>
<li>TypeError
<ul>
<li>Class methods or functions will raise a <code>TypeError</code> when called without the correct amount of positional arguments.</li>
</ul>
</li>
</ul>
<pre class="language-python"><code class="language-python"><span class="token string">"hello"</span> <span class="token operator">+</span> <span class="token number">5</span> <span class="token comment"># Raises TypeError; string and int types cannot be added</span><br><br><span class="token keyword">import</span> math<br>math<span class="token punctuation">.</span><span class="token builtin">pow</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token comment"># Raises TypeError</span></code></pre>
<ul>
<li>ValueError</li>
</ul>
<pre class="language-python"><code class="language-python"><span class="token builtin">int</span><span class="token punctuation">(</span><span class="token string">"abc"</span><span class="token punctuation">)</span> <span class="token comment"># Raises ValueError for incompatible value being passed to int()</span></code></pre>
<ul>
<li>IndexError</li>
</ul>
<pre class="language-python"><code class="language-python">my_list <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">]</span><br>my_list<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span> <span class="token comment"># Raises IndexError</span></code></pre>
<ul>
<li>KeyError</li>
</ul>
<pre class="language-python"><code class="language-python">my_dict <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">'a'</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">}</span><br>my_dict<span class="token punctuation">[</span><span class="token string">'b'</span><span class="token punctuation">]</span> <span class="token comment"># Raises KeyError</span></code></pre>
<ul>
<li>NameError</li>
</ul>
<pre class="language-python"><code class="language-python"><span class="token keyword">print</span><span class="token punctuation">(</span>not_defined_variable<span class="token punctuation">)</span> <span class="token comment"># Raises NameError</span></code></pre>
<ul>
<li>ZeroDivisionError</li>
</ul>
<pre class="language-python"><code class="language-python"><span class="token number">10</span> <span class="token operator">/</span> <span class="token number">0</span> <span class="token comment"># Raises ZeroDivisionError</span></code></pre>
<ul>
<li>FileNotFoundError</li>
</ul>
<pre class="language-python"><code class="language-python"><span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">'non_existent_file.txt'</span><span class="token punctuation">,</span> <span class="token string">'r'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> fp<span class="token punctuation">:</span> <span class="token comment"># Raises FileNotFoundError</span><br>    <span class="token keyword">pass</span></code></pre>
<ul>
<li>AttributeError</li>
</ul>
<pre class="language-python"><code class="language-python">my_str <span class="token operator">=</span> <span class="token string">"this is some text"</span><br>my_str<span class="token punctuation">.</span>non_existent_method<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># Raises AttributeError</span></code></pre>
<ul>
<li>ImportError</li>
</ul>
<pre class="language-python"><code class="language-python"><span class="token keyword">import</span> non_existent_module <span class="token comment"># Raises ImportError</span></code></pre>

    ]]>
      </content>
    </entry>
  
    
    <entry>
      <title>Setup Shopify Domain On Third-party DNS</title>
      <link href="https://jayhall.dev/posts/setup-shopify-domain-on-third-party-dns/"/>
      <updated>2025-11-24T00:00:00Z</updated>
      <id>https://jayhall.dev/posts/setup-shopify-domain-on-third-party-dns/</id>
      <content type="html">
        <![CDATA[
      <h2>DNS Zone configuration</h2>
<p>If you are just running an online store and the site is going to host your cool shop then set up an
A record like this.</p>
<ul>
<li>Type: A</li>
<li>Name: @</li>
<li>Data / IP: 23.227.38.65</li>
<li>TTL: 1 hour / 3600 seconds</li>
</ul>
<p>If you have a site and you just want a small store to sell a cool widget you started making then you
will need to set up a CNAME record for a sub-domain. eg. mycoolsite.com -&gt; shop.mycoolsite.com</p>
<ul>
<li>Type: CNAME</li>
<li>Name: shop / store / dealers choice</li>
<li>Data: shops.myshopify.com</li>
<li>TTL: 1 hour / 3600 seconds</li>
</ul>
<p><a href="https://help.shopify.com/en/manual/domains/add-a-domain/connecting-domains/connecting-to-godaddy">Shopify domain setup</a></p>
<h2>E-mail Setup</h2>
<p>The sender email address is the one that will show up in the From field of the recipients email.</p>
<p>Steps:</p>
<ol>
<li>From your Shopify admin, go to Settings &gt; Notifications</li>
<li>In the Sender email section, enter your email address.</li>
<li>Click Save.</li>
</ol>
<p>Add CNAME records to your third-party domain</p>
<p>You can help to ensure that your email messages reach your customers by adding CNAME records to your
third-party domain to connect it to the Shopify SPF and DKIM records. You don't need to add any IP
addresses to your domain - the CNAME records are sufficient for authentication.</p>
<p>To add CNAME records to your domain, you need to have the following information:</p>
<p>your login information for your third-party domain provider account associated with your sender email
your sender email, which is the email address that you use to communicate with your customers</p>
<p>Steps:</p>
<ol>
<li>From your Shopify admin, go to Settings &gt; Notifications.</li>
<li>In the Sender email section, click authenticate your domain.</li>
<li>Follow the instructions to enter the new CNAME records into your third-party domain manager.</li>
</ol>
<p>Changes can take up to 48 hours to complete. If the domain verification fails, then verify that the
DNS records that you entered into your third-party domain provider match the records that were
provided in your Shopify admin.</p>
<p>If you need help to add a CNAME to your domain, then contact your domain provider.</p>
<p><a href="https://help.shopify.com/en/manual/intro-to-shopify/initial-setup/setup-your-email#change-your-sender-email-address">Shopify email setup</a></p>

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