<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Posts on Rob Henley</title>
    <link>https://rhenley.com/posts/</link>
    <description>Recent content in Posts on Rob Henley</description>
    <image>
      <title>Rob Henley</title>
      <url>https://rhenley.com/papermod-cover.png</url>
      <link>https://rhenley.com/papermod-cover.png</link>
    </image>
    <generator>Hugo -- 0.150.0</generator>
    <language>en</language>
    <lastBuildDate>Mon, 23 Sep 2024 05:35:53 -0500</lastBuildDate>
    <atom:link href="https://rhenley.com/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Authorize Net in 2024</title>
      <link>https://rhenley.com/post/authorize-net-in-2024/</link>
      <pubDate>Mon, 23 Sep 2024 05:35:53 -0500</pubDate>
      <guid>https://rhenley.com/post/authorize-net-in-2024/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve integrated a few payment gateways over the years including
&lt;a href=&#34;https://www.authorize.net/&#34;&gt;Authorize.net&lt;/a&gt;, &lt;a href=&#34;https://go.wepay.com/&#34;&gt;WePay&lt;/a&gt;,
&lt;a href=&#34;https://www.spreedly.com/&#34;&gt;Spreedly&lt;/a&gt;, and &lt;a href=&#34;https://stripe.com/&#34;&gt;Stripe&lt;/a&gt; but
recently had the opportunity to integrate Authorize.net into our system. It&amp;rsquo;s
actually not the first time I&amp;rsquo;ve integrated Authorize.net as I did a server-side
implementation years ago when server-side implementations were still cool. I
mention this to show I&amp;rsquo;ve seen a couple of ways this can be implemented. Maybe
I&amp;rsquo;m missing something but the new
&lt;a href=&#34;https://developer.authorize.net/api/reference/features/acceptjs.html&#34;&gt;Accept.js&lt;/a&gt;
model seems to fall short in what seems like the most basic ways.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Static Site Generator Image Workflow</title>
      <link>https://rhenley.com/post/static-site-generator-image-workflow/</link>
      <pubDate>Sat, 25 May 2024 15:08:44 -0500</pubDate>
      <guid>https://rhenley.com/post/static-site-generator-image-workflow/</guid>
      <description>&lt;p&gt;I have yet to find the &amp;ldquo;perfect&amp;rdquo; workflow for images for any platform but
stumbled on one that could work at least for posts that tend to contain a lot of
screenshots.&lt;/p&gt;
&lt;p&gt;The thought occurred to me that I could just take the latest screenshot move it
to the current directory and rename it to its &lt;code&gt;md5&lt;/code&gt; sum.  So I added the following
function to my &lt;code&gt;~/.bashrc&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# MOVE MOST RECENT SCREENSHOT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Moves the most recent screenshot from the Screenshots directory into the current directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# An example output would be:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Screenshot 2024-05-25 at 9.40.31 AM.png =&amp;gt;  7be6a2f02ea74453d5e1912f32680795.jpg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mmrs&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nv&#34;&gt;EXT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;png
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nv&#34;&gt;SCREENSHOTS_DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;defaults &lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt; com.apple.screencapture location&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nv&#34;&gt;LATEST_SCREENSHOT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;ls -1t &lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;SCREENSHOTS_DIR&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; head -1&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nv&#34;&gt;MD5_SUM&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;md5 -q &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;SCREENSHOTS_DIR&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LATEST_SCREENSHOT&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	mv &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;SCREENSHOTS_DIR&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LATEST_SCREENSHOT&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;./&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;MD5_SUM&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# Convert, resize and reduce if imagemagick is present&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;command&lt;/span&gt; -v magick &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&amp;gt; /dev/null&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;c1&#34;&gt;# NOTE: This keeps the original png&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		magick &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;MD5_SUM&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;.png&amp;#34;&lt;/span&gt; -strip &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;			-resize 1920x &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;			-quality &lt;span class=&#34;m&#34;&gt;65&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;			-interlace JPEG &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;			-sampling-factor 4:2:0 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;			&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;MD5_SUM&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;.jpg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;nv&#34;&gt;EXT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;jpg
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;# Copy markdown to clipboard if `pbcopy` exists&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;command&lt;/span&gt; -v pbcopy &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&amp;gt; /dev/null&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;![alt](&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;MD5_SUM&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;EXT&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;)&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; pbcopy
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LATEST_SCREENSHOT&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; =&amp;gt;  &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;MD5_SUM&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;EXT&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then I can just take a screenshot normally with &lt;code&gt;CMD&lt;/code&gt;+&lt;code&gt;Shift&lt;/code&gt;+&lt;code&gt;4&lt;/code&gt; or
&lt;code&gt;CMD&lt;/code&gt;+&lt;code&gt;Shift&lt;/code&gt;+&lt;code&gt;5&lt;/code&gt; and run the bash function to move it into the folder for my
&lt;a href=&#34;https://gohugo.io/content-management/page-resources/&#34;&gt;page resource&lt;/a&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Borg Command Not Found</title>
      <link>https://rhenley.com/post/borg-command-not-found/</link>
      <pubDate>Fri, 24 May 2024 07:32:33 -0500</pubDate>
      <guid>https://rhenley.com/post/borg-command-not-found/</guid>
      <description>&lt;p&gt;When setting up &lt;a href=&#34;https://borgbackup.readthedocs.io/en/stable/index.html&#34;&gt;Borg&lt;/a&gt;
if you get the following error&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Remote: bash: line 1: borg: command not found&lt;br&gt;
Connection closed by remote host. Is borg working on the server?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This was because only the &lt;code&gt;.bashrc&lt;/code&gt; is executed for non-interactive sessions and
inside the &lt;code&gt;.bashrc&lt;/code&gt; of at least Ubuntu (24.04) is the following at the very top
of the file.  This meant that in my case I needed to put the path related
environment variables above the following lines so SSH could find the &lt;code&gt;borg&lt;/code&gt;
command.&lt;/p&gt;</description>
    </item>
    <item>
      <title>S3 ListObjectsV2 ListObjects Access Denied Issue</title>
      <link>https://rhenley.com/posts/s3-listobjectsv2-listobjects-access-denied-issue/</link>
      <pubDate>Sat, 04 Feb 2023 19:40:36 -0500</pubDate>
      <guid>https://rhenley.com/posts/s3-listobjectsv2-listobjects-access-denied-issue/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m trying to recursively download a S3 folder from an EC2 instance.  I have
role with a policy that includes: &lt;code&gt;s3:ListBucket&lt;/code&gt; among other things attached to
the EC2 instance and can download individual files but keep getting the
following error when trying to do so recursively:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The command being used that was erroring:&lt;br&gt;
&lt;code&gt;aws s3 cp s3://&amp;lt;bucket&amp;gt;/&amp;lt;path&amp;gt;/ ~/temp --recursive --debug&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>How To Test CORS</title>
      <link>https://rhenley.com/post/how-to-test-cors/</link>
      <pubDate>Mon, 12 Sep 2022 07:49:06 -0500</pubDate>
      <guid>https://rhenley.com/post/how-to-test-cors/</guid>
      <description>&lt;p&gt;This is mostly a note to myself because for some reason when testing
&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS&#34;&gt;CORS&lt;/a&gt; headers I nearly
always manage to forget to include the &lt;code&gt;Origin&lt;/code&gt; header.&lt;/p&gt;
&lt;p&gt;For completeness here&amp;rsquo;s an example using &lt;a href=&#34;https://curl.se/&#34;&gt;curl&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -v --request OPTIONS &lt;span class=&#34;s1&#34;&gt;&amp;#39;localhost:8080&amp;#39;&lt;/span&gt; --header &lt;span class=&#34;s1&#34;&gt;&amp;#39;Origin: http://example.com&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here&amp;rsquo;s an example of doing an &lt;code&gt;OPTIONS&lt;/code&gt; request to test authorization against AWS S3:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl --head --request OPTIONS &lt;span class=&#34;se&#34;&gt;\ &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    --header &lt;span class=&#34;s1&#34;&gt;&amp;#39;origin: https://www.example.com&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\ &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    --header &lt;span class=&#34;s1&#34;&gt;&amp;#39;Access-Control-Request-Method: GET&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\ &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    https://s3.amazonaws.com/example/path/to/object/my-image.jpg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: Probably more to the story but CORS seems very expensive! In my
completely non-scientific tests CORS added 3x cost to the speed of the request.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
