<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xml:lang="en" xml:base="https://fallenstedt.com/">
    <title>Alex Fallenstedt</title>
    <subtitle type="html"><![CDATA[Alex Fallenstedt is a Senior software engineer at New Relic. He also does photography and enjoys gardening too.]]></subtitle>
    <link href="/" rel="alternate" type="text/html" title="html" />
    <link href="/feeds/feed.atom.xml" rel="self" type="text/xml" title="atom" />
    <link href="/feeds/feed.rss.xml" rel="alternate" type="text/xml" title="feed" />
    <link href="/feeds/feed.json" rel="alternate" type="application/feed+json" title="jsonfeed" />
    <link href="/index.json" rel="alternate" type="application/json" title="json" />
    <link href="/manifest.webmanifest" rel="alternate" type="application/manifest+json" title="manifest" />
    <link href="/humans.txt" rel="alternate" type="text/plain" title="humanstxt" />
    <icon>https://fallenstedt.com/img/open-graph-logo_hu_1978870e36bf97f6.png</icon>
    <logo>https://fallenstedt.com/img/open-graph-logo_hu_1978870e36bf97f6.png</logo>
    <rights>Copyright &copy; 2019-{year} Alex Fallenstedt</rights>
    <generator uri="https://gohugo.io" version="0.152.2">Hugo</generator>
    <updated>2025-04-01T12:00:00-08:00</updated>
    <id>urn:uuid:da43ca2a-20b9-5e41-5949-2a4a8a912b5f</id>
    <entry>
        
        <category term="blog" />
        
        <link rel="alternate" type="type/html" href="https://fallenstedt.com/blog/mp3_player/?utm_source=atom_feed" />
        <title type="html"><![CDATA[Mp3 Player]]></title>
        
        
        
        <published>2025-04-01T12:00:00-08:00</published>
        <updated>2025-04-01T12:00:00-08:00</updated>
        <id>urn:uuid:2cb10bcb-0a9e-57a8-09ad-ae66b738fa3d</id>
        
                <author>
                    <name>Alex Fallenstedt</name>
                </author>
        
        <summary type="html"><![CDATA[<p>I remember being a kid with an iPod filled with music. It had music which I owned which I could listen to without an internet connection or using data from my phone plan. I missed that feeling and decided to build my own mp3 player as an Android app. I wanted to get more familiar with Kotlin, Android app development, and build something that could help people own their own data. The app is free, open source, and there are zero advertisements. <a href="https://github.com/Fallenstedt/mp3_player">You can download it here</a> and start building your own music library&hellip;again.</p>]]></summary>
    </entry>
    <entry>
        
        <category term="blog" />
        
        <link rel="alternate" type="type/html" href="https://fallenstedt.com/blog/mocking-http-requests-in-go/?utm_source=atom_feed" />
        <title type="html"><![CDATA[Mocking http requests with Go]]></title>
        
        
        
        <published>2023-12-21T12:36:41-08:00</published>
        <updated>2023-12-21T12:36:41-08:00</updated>
        <id>urn:uuid:660c0cf7-78ed-5462-b9d2-a2d893813c36</id>
        
                <author>
                    <name>Alex Fallenstedt</name>
                </author>
        
        <summary type="html"><![CDATA[<p>I used to rely on dependency injection and interfaces to mock my http clients. This worked, but was very burdensome. I learned about the <a href="https://pkg.go.dev/net/http/httptest"><code>httptest</code></a> package which provides utilities for HTTP testing. I&rsquo;ll walk through an example test I made in my <a href="https://github.com/Fallenstedt/go-weather">weather CLI</a></p>
<h1 id="the-code-which-makes-a-network-request">The code which makes a network request</h1>
<p>I ping NOAA for a weather forecast using the following code. I have a <code>FetchForecast</code> method which invokes <code>fetch</code> to perform the network request at a specific URL.</p>]]></summary>
    </entry>
    <entry>
        
        <category term="blog" />
        
        <link rel="alternate" type="type/html" href="https://fallenstedt.com/blog/frig-off-chatgpt/?utm_source=atom_feed" />
        <title type="html"><![CDATA[Frig off chat gpt]]></title>
        
        
        
        <published>2023-08-19T12:36:41-08:00</published>
        <updated>2023-08-19T12:36:41-08:00</updated>
        <id>urn:uuid:e089dcfb-019b-5eb4-b9f7-9ff032dd73af</id>
        
                <author>
                    <name>Alex Fallenstedt</name>
                </author>
        
        <summary type="html"><![CDATA[<p>I like chatgpt, but I don&rsquo;t like it crawling my site. That&rsquo;s why I told ChatGPT to frig off.</p>
<p>These two lines will make that happen</p>
<pre tabindex="0"><code>User-agent: GPTBot
Disallow: /
</code></pre><p>You can check out an example on this site by visiting <a href="https://www.fallenstedt.com/robots.txt">its robots.txt file</a>.</p>
<p>More information about <a href="https://platform.openai.com/docs/gptbot">ChatGPT&rsquo;s crawler</a> can be found here</p>]]></summary>
    </entry>
    <entry>
        
        <category term="blog" />
        
        <link rel="alternate" type="type/html" href="https://fallenstedt.com/blog/web-vitals/?utm_source=atom_feed" />
        <title type="html"><![CDATA[Recording Web Vitals with New Relic]]></title>
        
        
        
        <published>2023-08-06T12:36:41-08:00</published>
        <updated>2023-08-06T12:36:41-08:00</updated>
        <id>urn:uuid:4b9aedc2-1cf7-594f-893c-e298e5d7ce54</id>
        
                <author>
                    <name>Alex Fallenstedt</name>
                </author>
        
        <summary type="html"><![CDATA[<p>How do you measure the performance and user experience of your website? Every change made can affect page loading speed, interactivity and visual stability. Together, these contribute to your product’s performance, search engine ranking, and advertisement performance. With New Relic, you can monitor these web vitals and be notified of user experience regressions.</p>
<h2 id="which-main-web-vitals-i-should-monitor">Which main web vitals I should monitor?</h2>
<p><a href="https://web.dev/vitals/">From Google</a>, their are several main web vitals you should focus on monitoring to evaluate how well users are experiencing your application.</p>]]></summary>
    </entry>
    <entry>
        
        <category term="blog" />
        
        <link rel="alternate" type="type/html" href="https://fallenstedt.com/blog/terraform-api-gateway-stages/?utm_source=atom_feed" />
        <title type="html"><![CDATA[Managing API Gateway Deployments with Terraform: Achieving Full Stage Isolation]]></title>
        
        
        
        <published>2023-02-20T12:36:41-08:00</published>
        <updated>2023-02-20T12:36:41-08:00</updated>
        <id>urn:uuid:40e29b90-e3b2-592c-89a7-7ba97ba30e2a</id>
        
                <author>
                    <name>Alex Fallenstedt</name>
                </author>
        
        <summary type="html"><![CDATA[<h2 id="the-problem">The Problem</h2>
<p>API Gateway allows you to assocate deployments with stages, each stage representing a logical reference of your api. For example, my gardentour API project needs a <code>dev</code> and a <code>prod</code> stage to represent my environments.</p>
<p>I manage infrastructure with terraform, and I needed to achieve full isolation of my stages. It would be impracticable to manage deploys of many API Gateway stages with a single Terraform environment like so:</p>]]></summary>
    </entry>
    <entry>
        
        <category term="blog" />
        
        <link rel="alternate" type="type/html" href="https://fallenstedt.com/blog/powerbox/?utm_source=atom_feed" />
        <title type="html"><![CDATA[How I built a Powerbox]]></title>
        
        
        
        <published>2023-01-19T12:36:41-08:00</published>
        <updated>2023-01-19T12:36:41-08:00</updated>
        <id>urn:uuid:8f8b3b79-08fa-577b-69ab-54b2fefd09ee</id>
        
                <author>
                    <name>Alex Fallenstedt</name>
                </author>
        
        <summary type="html"><![CDATA[<p>I recently had a power outage which lasted 10 hours here at home. It was not pleasant sitting the dark with just a flashlight. I knew I had to build a power box, a device which provides a variety of input leads from a battery. This article details what how I designed and built a power box for simple applications such as powering lamps, charging phones, laptops, and powering my ham radio.</p>]]></summary>
    </entry>
    <entry>
        
        <category term="blog" />
        
        <link rel="alternate" type="type/html" href="https://fallenstedt.com/blog/terraform-cognito/?utm_source=atom_feed" />
        <title type="html"><![CDATA[Terraform Cognito With Lambda Triggers]]></title>
        
        
        
        <published>2022-07-18T12:36:41-08:00</published>
        <updated>2022-07-18T12:36:41-08:00</updated>
        <id>urn:uuid:0ea6014a-632f-55c1-7978-50d44d3f1d9e</id>
        
                <author>
                    <name>Alex Fallenstedt</name>
                </author>
        
        <summary type="html"><![CDATA[<h2 id="the-problem">The Problem</h2>
<p>I have been building a side project with AWS Cognito and Terraform. I wanted a custom message lambda trigger to be invoked anytime the user signed up for my app, however I kept getting permission errors. This blog shows you the terraform configuration you need to to let cognito invoke lambda triggers with Terrafrom.</p>
<h2 id="terraform-config">Terraform config</h2>
<h3 id="awc-cognito">AWC Cognito</h3>
<p>For AWS Cognito, I have a simple user pool that allows users to sign up with their email and a passowrd, and a single user pool client to hold users for my development environment.</p>]]></summary>
    </entry>
    <entry>
        
        <category term="blog" />
        
        <link rel="alternate" type="type/html" href="https://fallenstedt.com/blog/twitter-stream/?utm_source=atom_feed" />
        <title type="html"><![CDATA[Streaming Tweets With Go]]></title>
        
        
        
        <published>2021-12-29T12:36:41-08:00</published>
        <updated>2022-11-07T12:36:41-08:00</updated>
        <id>urn:uuid:08de06f2-7b18-529d-7923-98decb3ddd69</id>
        
                <author>
                    <name>Alex Fallenstedt</name>
                </author>
        
        <summary type="html"><![CDATA[<h2 id="update">Update</h2>
<blockquote>
<p>This repo is read-only and is no longer worked on. Twitter was a wonderful platform, built by a wonderful team. With its recent changes, its time to re-evaluate what we invest in and the world we want to build. To the projects using this library, I&rsquo;ll leave the repo read-only so you can migrate on your own time</p>
</blockquote>
<p>Building with free APIs is a great way to teach yourself new skills in languages you like. I’ve always found APIs as an underrated way to learn something new. Building with APIs brings challenges that force you to learn new parts of programming that video tutorials can not do.</p>]]></summary>
    </entry>
    <entry>
        
        <category term="blog" />
        
        <link rel="alternate" type="type/html" href="https://fallenstedt.com/blog/three-steps-job/?utm_source=atom_feed" />
        <title type="html"><![CDATA[Three Steps I Took to Get a Job Offer From Amazon]]></title>
        
        
        
        <published>2021-07-12T12:36:41-08:00</published>
        <updated>2021-07-12T12:36:41-08:00</updated>
        <id>urn:uuid:406ce88e-fa74-5f8c-19d6-0c23c2cff83b</id>
        
                <author>
                    <name>Alex Fallenstedt</name>
                </author>
        
        <summary type="html"><![CDATA[<p>Last year, I took the plunge and applied for a Frontend Engineering Position at Amazon. I knew little about the interview process and I had just one month to prepare for it. The result? I got an offer. In fact, the use of the interview techniques below granted me the opportunity to choose between two competing job offers. In this guide I will reveal the steps I took in order to become a competitive candidate.</p>]]></summary>
    </entry>
    <entry>
        
        <category term="blog" />
        
        <link rel="alternate" type="type/html" href="https://fallenstedt.com/blog/processing-pixels/?utm_source=atom_feed" />
        <title type="html"><![CDATA[Using Rust and WebAssembly to Process Pixels from a Video Feed]]></title>
        
        
        
        <published>2021-05-10T12:36:41-08:00</published>
        <updated>2021-05-10T12:36:41-08:00</updated>
        <id>urn:uuid:5c7b92a1-562e-5e36-59c2-e293bbebee80</id>
        
                <author>
                    <name>Alex Fallenstedt</name>
                </author>
        
        <summary type="html"><![CDATA[<p>At <a href="https://streem.pro/">Streem</a> we are on a mission to make the world&rsquo;s expertise more accessible. We create guidance tools to steer the discussion and ensure accurate understanding the first time. One of the guidance tools we are developing for web is a 3d cursor that can be positioned in a remote video. To accomplish this, we need to process a lot of raw pixel data and AR data per frame.</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/i/ope5jwb2vuse082qezju.png" alt="High Level diagram of what we need to do"></p>]]></summary>
    </entry>
</feed>
