<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Posts on Phill&#39;s Blog
</title>
		<link>http://phillvanhoven.com/posts/</link>
		<description>Recent content in Posts on Phill&#39;s Blog
</description>
		<generator>Hugo</generator>
		<language>en-US</language>
		
		
		
		
			<lastBuildDate>Sat, 04 Jul 2026 05:26:26 -0600</lastBuildDate>
		
			<atom:link href="http://phillvanhoven.com/posts/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Zsh Getting Started in WSL</title>
				<link>http://phillvanhoven.com/posts/20260704_zsh-getting-started/</link>
				<pubDate>Sat, 04 Jul 2026 05:26:26 -0600</pubDate>
				<guid>http://phillvanhoven.com/posts/20260704_zsh-getting-started/</guid>
				<description>&lt;p&gt;Windows Subsystem for Linux (WSL) is a simple way to run Linux without running it natively, managing virtualization or dual booting. It opens a whole world of development tools and is an onboarding ramp to vibrant Linux ecosystem for developers familiar with Windows. Not only is installation and setup easy but integration with Windows is seamless enabling networking, file transfer and many applications. Visual Studio Code can run in Windows and read/write files to Linux without any special configuration and includes running extensions and tooling like Github Copilot CLI and Claude Code. Although once you start using Zsh, the CLI versions of Copilot and Claude become very compelling!&lt;/p&gt;</description>
			</item>
			<item>
				<title>DynamoDB Single Table Design</title>
				<link>http://phillvanhoven.com/posts/20260703_ddb-single-table-design/</link>
				<pubDate>Fri, 03 Jul 2026 20:56:15 -0600</pubDate>
				<guid>http://phillvanhoven.com/posts/20260703_ddb-single-table-design/</guid>
				<description>&lt;p&gt;DynamoDB is a fully managed database in AWS that is incredibly scalable, highly available with simple support for encryption and cross-region replication. In addition it has many quality of life features&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Time-to-live support to remove old data when it&amp;rsquo;s no longer needed&lt;/li&gt;&#xA;&lt;li&gt;Streams and event-driven integration with lambda&lt;/li&gt;&#xA;&lt;li&gt;Point-in-time-recovery (PITR) with per-second granularity to restore the database to a specific time&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;While dynamo db has many great features it comes with many tradeoffs to consider before choosing to use it over alternative options.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Hugo Cloudfront</title>
				<link>http://phillvanhoven.com/posts/20260628_hugo-cloudfront/</link>
				<pubDate>Sun, 28 Jun 2026 19:34:58 -0600</pubDate>
				<guid>http://phillvanhoven.com/posts/20260628_hugo-cloudfront/</guid>
				<description>&lt;p&gt;CloudFront is a great option to host Hugo websites. Previously I showed how to host a hugo blog in &lt;a href=&#34;http://phillvanhoven.com/posts/20250621_hugo-app-runner/&#34;&gt;AWS App Runner&lt;/a&gt; but App Runner is &lt;a href=&#34;https://docs.aws.amazon.com/apprunner/latest/dg/apprunner-availability-change.html&#34;&gt;shutting down&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;CloudFront is a great option and provides a few benefits over App Runner&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;More performant leveraging CDN&lt;/li&gt;&#xA;&lt;li&gt;Cheaper for serving static context&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Here are steps we&amp;rsquo;ll go through&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Create S3 bucket to store Hugo static files&lt;/li&gt;&#xA;&lt;li&gt;Create CloudFront disribution&lt;/li&gt;&#xA;&lt;li&gt;CloudFront function to rewrite URLs&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The CloudFormation template creates an S3 bucket and assoicated policy for a CloudFront distribution to access it (see further below for the CloudFront distribution).&lt;/p&gt;</description>
			</item>
			<item>
				<title>Bedrock for .NET</title>
				<link>http://phillvanhoven.com/posts/20260102_bedrock_dotnet_api/</link>
				<pubDate>Fri, 02 Jan 2026 04:56:30 -0700</pubDate>
				<guid>http://phillvanhoven.com/posts/20260102_bedrock_dotnet_api/</guid>
				<description>&lt;p&gt;AWS Bedrock is a managed service for programmatic access to generative AI and large language models. The service supports many &lt;a href=&#34;%22https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html%22&#34;&gt;models&lt;/a&gt; from numerous providers. &lt;a href=&#34;%22https://docs.aws.amazon.com/bedrock/latest/userguide/sdk-general-information-section.html%22&#34;&gt;SDKs&lt;/a&gt; exist for almost all major platforms.&lt;/p&gt;&#xA;&lt;h1 id=&#34;enabling-access&#34;&gt;Enabling Access&lt;/h1&gt;&#xA;&lt;p&gt;The below IAM policy allows invoking the AWS model &amp;ldquo;nova-micro-v1&amp;rdquo;. This policy is attached to a role used by an AWS AppRunner service.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#0550ae&#34;&gt;&amp;#34;Version&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;2012-10-17&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#0550ae&#34;&gt;&amp;#34;Statement&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#1f2328&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#0550ae&#34;&gt;&amp;#34;Sid&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;VisualEditor0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#0550ae&#34;&gt;&amp;#34;Effect&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;Allow&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#0550ae&#34;&gt;&amp;#34;Action&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&lt;/span&gt;&lt;span&gt;                &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;bedrock:InvokeModel&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&lt;/span&gt;&lt;span&gt;                &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;bedrock:InvokeModelWithResponseStream&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#1f2328&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#0550ae&#34;&gt;&amp;#34;Resource&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;arn:aws:bedrock:*::foundation-model/amazon.nova-micro-v1:0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#1f2328&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#1f2328&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;c-sample&#34;&gt;C# Sample&lt;/h1&gt;&#xA;&lt;h2 id=&#34;step-1-create-a-native-request&#34;&gt;Step 1: Create a native request&lt;/h2&gt;&#xA;&lt;p&gt;The Bedrock SDK supports multiple models which each have their own parameters. The first step is to create a &amp;ldquo;native request&amp;rdquo; specific to the model being invoked. This request is for the AWS model &lt;code&gt;Nova&lt;/code&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Hugo App Runner</title>
				<link>http://phillvanhoven.com/posts/20250621_hugo-app-runner/</link>
				<pubDate>Sat, 21 Jun 2025 10:21:01 -0600</pubDate>
				<guid>http://phillvanhoven.com/posts/20250621_hugo-app-runner/</guid>
				<description>&lt;h1 id=&#34;hosting-a-hugo-blog-in-aws-app-runner&#34;&gt;Hosting a Hugo Blog in AWS App Runner&lt;/h1&gt;&#xA;&lt;p&gt;Hugo is great option to host a blog/static content site. Combining Hugo and AWS App Runner is a simple and straightforward approach to hosting your own blog at a reasonable cost. Few items this blog will walk through&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#create-a-hugo-site&#34;&gt;Create a basic hugo site&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#create-an-nginx-configuration-file&#34;&gt;Create an nginx Configuration File&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#create-an-ecr-registry&#34;&gt;Create an ECR Registry&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#create-a-docker-container&#34;&gt;Create a Docker Container&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#building-a-docker-image-for-hugo--nginx&#34;&gt;Building a Docker image for Hugo + NGINX&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#deploying-to-aws-app-runner&#34;&gt;Deploying to AWS App Runner&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#request-a-domain-in-aws&#34;&gt;Request a domain in AWS&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#create-a-hosted-zone-tied-to-your-new-domain-in-route-53&#34;&gt;Create a hosted zone tied to your new domain in Route 53&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#request-a-public-certificate-to-use-with-your-app-runner-custom-domain&#34;&gt;Request a public certificate to use with your App Runner custom domain&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#update-app-runner-with-custom-domains&#34;&gt;Update App Runner with custom domains&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;prerequisits&#34;&gt;Prerequisits&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Install &lt;a href=&#34;https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html&#34;&gt;AWS CLI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Install &lt;a href=&#34;https://gohugo.io/installation/&#34;&gt;Hugo&lt;/a&gt; (or see the quick start guide linked below)&lt;/li&gt;&#xA;&lt;li&gt;Install &lt;a href=&#34;https://docs.docker.com/get-started/&#34;&gt;Docker&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;create-a-hugo-site&#34;&gt;Create a Hugo Site&lt;/h2&gt;&#xA;&lt;p&gt;Follow the Hugo &lt;a href=&#34;https://gohugo.io/getting-started/quick-start/&#34;&gt;Quick Start&lt;/a&gt; guide. A basic Hugo site is sufficient for this guide.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Blog Introduction</title>
				<link>http://phillvanhoven.com/posts/blog-intro/</link>
				<pubDate>Sun, 15 Jun 2025 20:43:12 -0600</pubDate>
				<guid>http://phillvanhoven.com/posts/blog-intro/</guid>
				<description>&lt;h1 id=&#34;welcome-to-my-blog&#34;&gt;Welcome to My Blog&lt;/h1&gt;&#xA;&lt;p&gt;This is the introduction post for my new blog. In this blog I&amp;rsquo;ll discuss learning to develop with AI, building applications using AWS, Angular, .Net, Javascript/Typescript, building this blog and other topics.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
