<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Amazon - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Amazon - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 30 May 2026 14:18:05 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/amazon/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ What is Amazon EC2 Auto Scaling? ]]>
                </title>
                <description>
                    <![CDATA[ Auto scaling is like having a smart system that keeps an eye on how many people are visiting your website. When you have a lot of people, it quickly adds more servers to handle the extra traffic. And when things quiet down, it scales back to save you... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-amazon-ec2-auto-scaling/</link>
                <guid isPermaLink="false">66b906c577c23fa04d7098f7</guid>
                
                    <category>
                        <![CDATA[ Amazon ]]>
                    </category>
                
                    <category>
                        <![CDATA[ ec2 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ scaling ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Destiny Erhabor ]]>
                </dc:creator>
                <pubDate>Mon, 06 May 2024 16:32:47 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2024/05/christophe-hautier-902vnYeoWS4-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Auto scaling is like having a smart system that keeps an eye on how many people are visiting your website. When you have a lot of people, it quickly adds more servers to handle the extra traffic. And when things quiet down, it scales back to save you money.</p>
<p>In AWS, there are two important services that help with this: Amazon EC2 Auto Scaling and AWS Auto Scaling. Amazon EC2 Auto Scaling is specifically for managing your EC2 servers, while AWS Auto Scaling can also handle other things like DynamoDB tables and Amazon Aurora databases.</p>
<p>In this article, we'll dive deeper into how Amazon EC2 Auto Scaling works and how you can use it to keep your website running smoothly without overspending on servers.</p>
<h2 id="heading-prerequisites">Prerequisites</h2>
<ul>
<li>Have an AWS account</li>
<li>Basic understanding of EC2 instance</li>
</ul>
<h2 id="heading-table-of-content">Table of Content</h2>
<ul>
<li><a class="post-section-overview" href="#heading-prerequisites">Prerequisites</a></li>
<li><a class="post-section-overview" href="#heading-example-use-case">Example Use case</a></li>
<li><a class="post-section-overview" href="#advantages-of-amazon-ec2-auto-scaling">Advantages of Amazon EC2 Auto Scaling</a></li>
<li><a class="post-section-overview" href="#heading-components-of-ec2-auto-scaling">Components of EC2 Auto Scaling</a></li>
<li><a class="post-section-overview" href="#what-is-launch-configurations-vs-launch-templates">What is Launch Configurations vs Launch Templates</a></li>
<li><a class="post-section-overview" href="#heading-how-to-create-a-launch-template">How to create a launch template</a></li>
<li><a class="post-section-overview" href="#heading-what-are-auto-scaling-groups-asgs">What are Auto Scaling Groups (ASGs)</a></li>
<li><a class="post-section-overview" href="#heading-how-to-create-an-auto-scaling-group">How to create an Auto Scaling Group</a></li>
<li><a class="post-section-overview" href="#heading-what-are-scaling-policies">What are Scaling Policies</a></li>
<li><a class="post-section-overview" href="#heading-conclusion">Conclusion</a></li>
</ul>
<h2 id="heading-example-use-case">Example Use Case</h2>
<h3 id="heading-scenario">Scenario:</h3>
<p>Imagine running a website that sells trendy clothes. Sometimes, lots of people visit your site at once, especially during lunch breaks or evenings. Other times, it's pretty quiet.</p>
<h3 id="heading-problem">Problem:</h3>
<p>You need enough servers to handle busy times, but you don't want to waste money on too many servers when it's quiet.</p>
<h3 id="heading-solution-with-amazon-ec2-auto-scaling">Solution with Amazon EC2 Auto Scaling:</h3>
<p><strong>Traffic Analysis</strong>: Look at when people visit your site the most. This helps you understand when you need more servers.</p>
<p><strong>Set Rules</strong>: Decide when to add or remove servers automatically. For example, you might say, "If more than 70% of our servers are busy for more than 5 minutes, add one more server."</p>
<p><strong>Adjust Server Numbers</strong>: Tell Amazon the smallest and biggest number of servers you need. You can also say how many you'd like on average. For instance, you might say, "Keep at least 2 servers running all the time. But if it's busy, go up to 10 servers. And usually, we need around 4."</p>
<p><strong>Load Balancing</strong>: Make sure all servers get some work. Use a load balancer to send visitors to the least busy server. This keeps everything running smoothly even if you have many servers.</p>
<p><strong>Test and Watch</strong>: Before trusting everything, test to see if it works as planned. Keep an eye on it afterward to make sure it's doing its job right.</p>
<p><strong>Save Money</strong>: With auto scaling, you don't pay for servers you're not using. When traffic is low, it reduces the number of servers, saving you money. When traffic picks up, it adds more servers, so your site stays fast.</p>
<h2 id="heading-advantages-of-using-amazon-ec2-auto-scaling">Advantages of Using Amazon EC2 Auto Scaling</h2>
<p><strong>Cost Optimization</strong>: EC2 Auto Scaling helps optimize costs by automatically adjusting the number of EC2 instances based on demand. During periods of low traffic, it reduces the number of instances, saving on operational costs. Conversely, during high traffic, it scales up to ensure optimal performance without over-provisioning resources.</p>
<p><strong>Improved Availability</strong>: By automatically distributing incoming traffic across multiple instances and fault tolerance of your application. If any instance fails/is unhealthy, the Auto Scaling group replaces it with a new one, ensuring minimal disruption to your services.</p>
<p><strong>Scalability</strong>: EC2 Auto Scaling allows your application to handle sudden spikes in traffic or increased workload without manual intervention. </p>
<p><strong>Enhanced Performance</strong>: With EC2 Auto Scaling, you can maintain consistent performance levels even during peak usage periods. By automatically adding more instances when traffic increases, it prevents performance degradation and ensures a smooth user experience.</p>
<p><strong>Ease of Management</strong>: EC2 Auto Scaling simplifies the management of your EC2 fleet by automating instance provisioning, scaling, and monitoring.</p>
<p><strong>Integration with AWS Services</strong>: EC2 Auto Scaling integrates seamlessly with other AWS services such as Elastic Load Balancing (ELB) and Amazon CloudWatch.</p>
<p><strong>Highly Customizable</strong>: EC2 Auto Scaling offers flexibility and customization options to meet the specific needs of your application.</p>
<h2 id="heading-components-of-ec2-auto-scaling">Components of EC2 Auto Scaling</h2>
<p>Let's get a better understanding on how the Auto Scaling works through its different components. </p>
<p>There are two distinct steps to configuration. The first step is the creation of a launch configuration or launch template. The second is the creation of an Auto Scaling group.</p>
<h2 id="heading-launch-configurations-and-launch-templates">Launch Configurations and Launch Templates</h2>
<p>Launch configurations or launch templates define the configuration settings for the EC2 instances that will be launched by the Auto Scaling group. </p>
<p>These settings include the AMI (Amazon Machine Image), instance type, security groups, key pair, and user data. </p>
<p>Launch configurations are older and being phased out in favor of launch templates, which offer more features and flexibility.</p>
<h3 id="heading-how-to-create-a-launch-template">How to Create a Launch Template</h3>
<p>First, navigate to EC2 Instance page</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/05/launch-template-1.png" alt="AWS instance page" width="600" height="400" loading="lazy">
<em>AWS instance page</em></p>
<p>Select the Launch Templates under the instances and click the create button.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/05/launch-template-2.png" alt="AWS launch templates" width="600" height="400" loading="lazy">
<em>AWS launch templates</em></p>
<p>The following screen should show up, almost similar to launching an <code>EC2 instance</code>. You can fill the required information accordingly.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/05/screencapture-us-east-1-console-aws-amazon-ec2-home-2024-05-03-22_52_38-1.png" alt="Create AWS launch templates" width="600" height="400" loading="lazy">
<em>Create AWS launch templates</em></p>
<p>After configuration, click the "Create Launch" template button and allow it to create, then view your newly created launch template with default and latest version as 1. You can use this launch template to create another launch template and specify a different version for it.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/05/launch-template-3-1.png" alt="View AWS launch templates" width="600" height="400" loading="lazy">
<em>View AWS launch templates</em></p>
<p>Auto scaling requires either a launch template or launch configuration to identify the instance it's launching and its configurations.</p>
<h2 id="heading-what-are-auto-scaling-groups-asgs">What are Auto Scaling Groups (ASGs)</h2>
<p>Auto Scaling groups are the core component of EC2 Auto Scaling. They define the group of EC2 instances that are managed together and share the same scaling policies. ASGs ensure that your application can automatically scale out (add instances) or scale in (remove instances) based on demand.</p>
<h3 id="heading-how-to-create-an-auto-scaling-group">How to create an Auto Scaling Group</h3>
<p>First, navigate to EC2 Instance page and under the Auto Scaling group, select and click the create button.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/05/asg-1.png" alt="Image" width="600" height="400" loading="lazy">
<em>creating an Auto Scaling group</em></p>
<p>On the create screen, the first step is to give your ASG a <code>Name</code> and then select your <code>launch template</code> created from the steps above. </p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/05/asg-2.png" alt="Image" width="600" height="400" loading="lazy">
<em>creating a launch template</em></p>
<p>The next step requires you to select or override an instance launch template. You also select a VPC and subnet.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/05/asg-3.png" alt="Image" width="600" height="400" loading="lazy">
<em>selecting instance launch template</em></p>
<p>The next step is to configure advanced options such as adding a load balancer and monitoring. You can attach or add a new load balancer but for this article we will skip this part.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/05/asg-4.png" alt="Image" width="600" height="400" loading="lazy">
<em>configuring advanced options</em></p>
<p>Next, configure the group size and scaling. Here, we want to configure the scale between minimum of 2 and maximum of 5. Also, set the metrics type to track the CPU utilization (set to 50 – you can increase to 70 or more) for scaling.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/05/screencapture-us-east-1-console-aws-amazon-ec2-home-2024-05-03-23_41_58.png" alt="Image" width="600" height="400" loading="lazy">
<em>configuring group size and scaling</em></p>
<p>Next two steps are for adding notifications (you will need to create an SNS service for this) and tags. In this article, we are going to skip these and create our ASG.</p>
<p>Create and view the ASG created. From its <strong>activity</strong> folder, you can see those two instances launched. Also, from the instances page, you should see two EC2 instances. This is because we set our desired state to 2.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/05/asg-5.png" alt="Image" width="600" height="400" loading="lazy">
<em>Auto Scaling groups</em></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/05/asg-6.png" alt="Image" width="600" height="400" loading="lazy">
<em>Auto Scaling groups</em></p>
<h2 id="heading-what-are-scaling-policies">What are Scaling Policies?</h2>
<p>Scaling policies define the rules that govern how the Auto Scaling group scales in or out in response to changing demand. There are four types of scaling policies:</p>
<p>Let's break down each type of scaling with examples:</p>
<h3 id="heading-manual-scaling">Manual Scaling</h3>
<p>Manual scaling involves adjusting the number of EC2 instances in your Auto Scaling group manually, without relying on automated triggers or policies. This type of scaling is typically done in response to predictable events or planned changes in demand.</p>
<p><strong>Example</strong>: Assuming you run an e-commerce website, and you know that there will be a flash sale event that will attract a large number of visitors. To handle the expected surge in traffic, you can manually increase the desired capacity of your Auto Scaling group before the event, adding more EC2 instances in advance of the anticipated demand spike. After the event is over, you can manually reduce the desired capacity back to its normal level.</p>
<h5 id="heading-pros">Pros:</h5>
<ul>
<li><strong>Control</strong>: Offers direct control over the number of EC2 instances in the Auto Scaling group.</li>
<li><strong>Flexibility</strong>: Allows for immediate adjustments based on specific requirements or events.</li>
</ul>
<h5 id="heading-cons">Cons:</h5>
<ul>
<li><strong>Manual Intervention</strong>: Relies on human intervention, which can be time-consuming and prone to errors.</li>
<li><strong>Lack of Automation</strong>: Not suitable for handling dynamic or unpredictable fluctuations in demand efficiently.</li>
</ul>
<h3 id="heading-schedule-scaling">Schedule Scaling</h3>
<p>Schedule scaling involves defining predefined schedules to adjust the number of EC2 instances in your Auto Scaling group automatically. This type of scaling is useful for applications with predictable traffic patterns, such as daily or weekly fluctuations in demand.</p>
<p><strong>Example</strong>: Consider a video streaming service that experiences peak traffic during evenings and weekends. You can set up a schedule scaling policy to increase the desired capacity of your Auto Scaling group every evening at 6 PM and decrease it every morning at 6 AM. This ensures that you have enough capacity to handle peak demand periods without overspending on resources during off-peak hours.</p>
<h5 id="heading-pros-1">Pros:</h5>
<ul>
<li><strong>Predictability</strong>: Well-suited for applications with predictable traffic patterns, such as daily or weekly fluctuations.</li>
<li><strong>Cost Optimization</strong>: Helps optimize costs by aligning resources with expected demand patterns.</li>
</ul>
<h5 id="heading-cons-1">Cons:</h5>
<ul>
<li><strong>Limited Adaptability</strong>: May not be responsive to sudden changes in demand or unexpected traffic spikes.</li>
<li><strong>Requires Planning</strong>: Requires upfront planning and configuration of schedules based on historical data or business insights.</li>
</ul>
<h3 id="heading-dynamic-scaling">Dynamic Scaling</h3>
<p>Dynamic scaling adjusts the number of EC2 instances in your Auto Scaling group automatically based on real-time metrics, such as CPU utilization, network traffic, or other application-specific metrics. This type of scaling is responsive to fluctuations in demand and helps ensure optimal performance and cost-effectiveness.</p>
<h5 id="heading-types">Types:</h5>
<ul>
<li><strong>Step Scaling</strong>: This policy scales the number of instances based on a series of scaling adjustments defined by step adjustments and associated metrics thresholds. </li>
<li><strong>Target Tracking</strong>: This policy automatically adjusts the number of instances to maintain a specified target metric, such as average CPU utilization or network traffic.</li>
</ul>
<p>When adding instances to the ASG, it will take a few minutes for them to come online and handle load. This is why a cooldown policy has to be set.</p>
<p><strong>Scaling Cooldowns:</strong> Scaling cooldowns help prevent rapid fluctuations in the number of instances by imposing a cooldown period after a scaling activity is triggered. During this cooldown period, EC2 Auto Scaling will not launch or terminate additional instances, allowing time for the newly launched instances to stabilize or for the impact of terminated instances to be observed.</p>
<p><strong>Example</strong>: Let's say you operate a ride-sharing platform where demand can vary unpredictably throughout the day. With dynamic scaling, you can configure Auto Scaling policies to add more EC2 instances when the number of ride requests exceeds a certain threshold, and remove instances when demand decreases. This allows you to dynamically adapt to changing traffic patterns in real-time, ensuring a seamless experience for both drivers and passengers.</p>
<h5 id="heading-pros-2">Pros:</h5>
<ul>
<li><strong>Real-Time Responsiveness</strong>: Adjusts resource allocation dynamically in response to actual demand, ensuring optimal performance.</li>
<li><strong>Cost Efficiency</strong>: Automatically scales resources up or down, helping to optimize costs by only using what is needed.</li>
</ul>
<h5 id="heading-cons-2">Cons:</h5>
<ul>
<li><strong>Potential Over-Provisioning</strong>: May lead to over-provisioning during sudden spikes in demand if scaling policies are not properly configured.</li>
<li><strong>Complexity</strong>: Requires careful configuration of scaling policies and monitoring of metrics to ensure effective scaling behavior.</li>
</ul>
<h3 id="heading-predictive-scaling">Predictive Scaling</h3>
<p>Predictive scaling uses machine learning algorithms and historical data to forecast future demand and proactively adjust the number of EC2 instances in your Auto Scaling group. This type of scaling helps prevent under-provisioning or over-provisioning of resources by anticipating changes in demand before they occur.</p>
<p><strong>Example</strong>: Suppose you operate a weather forecasting application that experiences increased demand during severe weather events. By analyzing historical data on weather patterns and user behavior, predictive scaling can predict when a surge in traffic is likely to occur and automatically scale up the capacity of your Auto Scaling group ahead of time. This ensures that your application remains responsive and available during peak usage periods without unnecessary resource waste.</p>
<h5 id="heading-pros-3">Pros:</h5>
<ul>
<li><strong>Proactive Optimization</strong>: Anticipates future demand based on historical data, ensuring resources are provisioned ahead of time.</li>
<li><strong>Improved Cost Management</strong>: Helps prevent under-provisioning and over-provisioning, optimizing resource usage and costs.</li>
</ul>
<h4 id="heading-cons-3">Cons:</h4>
<ul>
<li><strong>Data Dependence</strong>: Relies on accurate historical data and effective machine learning models for accurate predictions.</li>
<li><strong>Initial Setup</strong>: Requires initial setup and configuration of predictive scaling models, which can be complex and resource-intensive.</li>
</ul>
<h2 id="heading-conclusion">Conclusion</h2>
<p>In conclusion, Amazon EC2 Auto Scaling offers a range of strategies to effectively manage and optimize the performance of applications running on EC2 instances.</p>
<p>Whether it's through manual adjustments, scheduled scaling, dynamic responses to real-time metrics, or proactive measures based on predictive analytics, EC2 Auto Scaling provides the flexibility and automation needed to ensure that resources are aligned with demand. </p>
<p>By leveraging these scaling capabilities, businesses can enhance availability, improve cost efficiency, and deliver a seamless user experience, ultimately driving better outcomes for their applications and customers on the AWS platform.</p>
<p>As always, I hope you enjoyed the article and learned something new. If you want, you can also follow me on <a target="_blank" href="https://www.linkedin.com/in/destiny-erhabor">LinkedIn</a> or <a target="_blank" href="https://twitter.com/caesar_sage">Twitter</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Introducing the freeCodeCamp Coding Trivia Quiz on Amazon Alexa ]]>
                </title>
                <description>
                    <![CDATA[ Now you can learn coding concepts hands-free using an Amazon Echo. freeCodeCamp.org contributor David Jolliffe created a quiz game with questions on JavaScript, CSS, networking, and computer science. If you have an Amazon Echo nearby, you can play th... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/amazon-alexa-javascript-css-programming-quiz/</link>
                <guid isPermaLink="false">66b8d22bf8e5d39507c4c0d1</guid>
                
                    <category>
                        <![CDATA[ Amazon ]]>
                    </category>
                
                    <category>
                        <![CDATA[ পিএইচপি ভেরিয়েবল Echo এবং প্রিন্ট স্ট্যাটমেন্ট ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Quincy Larson ]]>
                </dc:creator>
                <pubDate>Thu, 13 Sep 2018 20:25:46 +0000</pubDate>
                <media:content url="https://img.youtube.com/vi/IFAmuQgjMK0/maxresdefault.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Now you can learn coding concepts hands-free using an Amazon Echo.</p>
<p>freeCodeCamp.org contributor <a target="_blank" href="https://github.com/OcelotDive">David Jolliffe</a> created a quiz game with questions on JavaScript, CSS, networking, and computer science.</p>
<p>If you have an Amazon Echo nearby, you can play the game right now by saying: "Alexa, start the free code camp quiz."</p>
<p>The entire project, along with it's ~100 questions, is <a target="_blank" href="https://github.com/freeCodeCamp/FreeCodeCampTriviaQuiz">open source and on GitHub</a>. We would welcome additional questions. Open a pull request adding your new question to the codebase, or just open a GitHub issue with the question if you're in a hurry.</p>
<p>Here's a video of me and my 11-month-old son Quentin demonstrating the Alexa skill. You can watch the video on <a target="_blank" href="https://www.youtube.com/watch?v=IFAmuQgjMK0">the freeCodeCamp.org YouTube channel</a> (3 minute watch).‌</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Integrate DynamoDB into your API using AWS Lambda ]]>
                </title>
                <description>
                    <![CDATA[ By Sam Williams In the first part of this tutorial, we created an API which passed requests through to a Lambda which returned the top tv show or movie for that genre. Now we’re going to use DynamoDB to allow users to vote for their favourite genre. ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/building-an-api-with-lambdas-and-api-gateway-part-2-7c674a0eb121/</link>
                <guid isPermaLink="false">66c346c7160da468ed76f174</guid>
                
                    <category>
                        <![CDATA[ Amazon ]]>
                    </category>
                
                    <category>
                        <![CDATA[ AWS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ lambda ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 25 Jul 2018 20:38:49 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*DpwCOdwJh84BzmZCuJPLmA.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Sam Williams</p>
<p>In the <a target="_blank" href="https://medium.freecodecamp.org/building-an-api-with-lambdas-and-api-gateway-11254e23b703">first part of this tutorial</a>, we created an API which passed requests through to a Lambda which returned the top tv show or movie for that genre. Now we’re going to use DynamoDB to allow users to vote for their favourite genre.</p>
<p>If you’ve not read the first part of this series, then <a target="_blank" href="https://medium.freecodecamp.org/building-an-api-with-lambdas-and-api-gateway-11254e23b703">check it out here</a>!</p>
<h3 id="heading-dynamodb">DynamoDB</h3>
<p>DynamoDB is a non-relational database created by Amazon that we can use to store the users’ votes. It’s also great, because we can access it easily using the <strong>aws-sdk</strong> which Lambdas have preinstalled.</p>
<p>The first thing we need to do is to create a table to store the movie votes. Navigate to DynamoDB in AWS and click “Create table”.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/gw6O3QWWUiAy784JH5lWIm1K2SVgfq7dNFT9" alt="Image" width="800" height="410" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/HyNfOnvaam0CEq7vhE-YBZZ9lWcdHDBtJEZT" alt="Image" width="800" height="382" loading="lazy"></p>
<p>On the next page, we will name our table and provide a primary key. The primary key needs to be unique so we don’t have two records with the same key. We can call the table “movie-api” and set the primary key to “movie-genre”, as each movie should only appear once in each genre.</p>
<p>We’ve now set up all that we need to set up in DynamoDB so we can go back into our code.</p>
<h3 id="heading-adding-a-dynamo-handler">Adding a Dynamo handler</h3>
<p>Getting and putting data into a Dynamo table is done using the <code>documentClient</code> on <strong>aws-sdk</strong>, but the structure of the requests is very specific. To make our lives easier, we can make a Dynamo handler to do all of the formatting.</p>
<p>Start by creating a new file called “dynamo.js” in the “movieAPI” Lambda. In this file we start by requiring <strong>aws-sdk</strong> and creating our <code>documentClient</code>.</p>
<pre><code><span class="hljs-keyword">const</span> AWS = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aws-sdk'</span>);
</code></pre><pre><code><span class="hljs-keyword">let</span> documentClient = <span class="hljs-keyword">new</span> AWS.DynamoDB.DocumentClient({    <span class="hljs-string">'region'</span>: <span class="hljs-string">'eu-west-1'</span>});
</code></pre><p>We now want to create and export a class that has three methods on it: a <code>get</code>, a <code>write</code>, and an <code>update</code>.</p>
<pre><code><span class="hljs-built_in">module</span>.exports = <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DB</span> </span>{    get(key, value, table) {}    write(ID, data, table) {}    <span class="hljs-keyword">async</span> increment(ID, table) {}}
</code></pre><p>We’ll start by creating our <code>get</code> method. The first thing we need to do is to check that we have a valid <code>key</code><em>,</em> <code>value</code>, and <code>table</code>.</p>
<pre><code><span class="hljs-keyword">if</span> (!table) <span class="hljs-keyword">throw</span> <span class="hljs-string">'table needed'</span>;<span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> key !== <span class="hljs-string">'string'</span>) <span class="hljs-keyword">throw</span> <span class="hljs-string">`key was not string and was <span class="hljs-subst">${<span class="hljs-built_in">JSON</span>.stringify(key)}</span> on table <span class="hljs-subst">${table}</span>`</span>;<span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> value !== <span class="hljs-string">'string'</span>) <span class="hljs-keyword">throw</span> <span class="hljs-string">`value was not string and was <span class="hljs-subst">${<span class="hljs-built_in">JSON</span>.stringify(value)}</span> on table <span class="hljs-subst">${table}</span>`</span>;
</code></pre><p>Because we want this method to be promise-based, we need to return a <code>new Promise</code>.</p>
<pre><code><span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> {})
</code></pre><p>To get data from Dynamo, we need to pass a set of parameters to the document client. These params need to include <code>TableName</code> and <code>Key</code><em>.</em></p>
<pre><code><span class="hljs-keyword">let</span> params = {    <span class="hljs-attr">TableName</span>: table,    <span class="hljs-attr">Key</span>: {[key]: value}};
</code></pre><p>We pass these <strong>params</strong> to <code>documentClient</code> and then <code>reject</code> if there is an error or <code>resolve</code> if there isn’t.</p>
<pre><code>documentClient.get(params, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">err, data</span>) </span>{    <span class="hljs-keyword">if</span> (err) {        <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`There was an error fetching the data for <span class="hljs-subst">${key}</span> <span class="hljs-subst">${value}</span> on table <span class="hljs-subst">${table}</span>`</span>, err);        <span class="hljs-keyword">return</span> reject(err);    }    <span class="hljs-keyword">return</span> resolve(data.Item);});
</code></pre><p>A similar process is done for the <code>write</code> method. We check that the <strong>parameters</strong> are valid, create the <strong>parameters</strong>, and pass them to <code>documentClient</code><em>.</em></p>
<pre><code><span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> {    <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> ID !== <span class="hljs-string">'string'</span>) <span class="hljs-keyword">throw</span> <span class="hljs-string">`the id must be a string and not <span class="hljs-subst">${ID}</span>`</span>;    <span class="hljs-keyword">if</span> (!data) <span class="hljs-keyword">throw</span> <span class="hljs-string">"data is needed"</span>;    <span class="hljs-keyword">if</span> (!table) <span class="hljs-keyword">throw</span> <span class="hljs-string">'table name is needed'</span>;
</code></pre><pre><code>    <span class="hljs-keyword">let</span> params = {        <span class="hljs-attr">TableName</span>: table,        <span class="hljs-attr">Item</span>: { ...data, <span class="hljs-attr">ID</span>: ID }    };
</code></pre><pre><code>    documentClient.put(params, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">err, result</span>) </span>{        <span class="hljs-keyword">if</span> (err) {            <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Err in writeForCall writing messages to dynamo:"</span>, err);            <span class="hljs-built_in">console</span>.log(params);            <span class="hljs-keyword">return</span> reject(err);        }        <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'wrote data to table '</span>, table)        <span class="hljs-keyword">return</span> resolve({ ...result.Attributes, ...params.Item });    });});
</code></pre><p>The <code>increment</code> method is a lot easier. To increment, we try getting the data for that key, increase the count by one, and then write it back to the database. If we can’t get the data, or if there is no count on the data, then we assume that we need to set the count to 0.</p>
<pre><code><span class="hljs-keyword">async</span> increment(ID, table) {    <span class="hljs-keyword">if</span> (!table) <span class="hljs-keyword">throw</span> <span class="hljs-string">'table needed'</span>;    <span class="hljs-keyword">if</span> (!ID) <span class="hljs-keyword">throw</span> <span class="hljs-string">'ID needed'</span>;    <span class="hljs-keyword">let</span> data;    <span class="hljs-keyword">try</span> {        data = <span class="hljs-keyword">await</span> <span class="hljs-built_in">this</span>.get(<span class="hljs-string">'movie-genre'</span>, ID, table);        <span class="hljs-keyword">if</span> (!data.count) <span class="hljs-keyword">throw</span> <span class="hljs-string">'no count in data'</span>    } <span class="hljs-keyword">catch</span> (err) {            data = { <span class="hljs-string">"movie-genre"</span>: ID, <span class="hljs-attr">count</span>: <span class="hljs-number">0</span> };    };    <span class="hljs-keyword">let</span> newData = { ...data, <span class="hljs-attr">count</span>: data.count + <span class="hljs-number">1</span> };    <span class="hljs-keyword">return</span> <span class="hljs-built_in">this</span>.write(ID, newData, table);}
</code></pre><h3 id="heading-modifying-our-lambda">Modifying our Lambda</h3>
<p>Now we have an easy way to get, write, and update our Dynamo table. We can use this to allow our users to vote. Inside “index.js”, we first need to import our new Dynamo class and create an instance of it.</p>
<pre><code><span class="hljs-keyword">const</span> DB = <span class="hljs-built_in">require</span>(<span class="hljs-string">'./dynamo'</span>);<span class="hljs-keyword">const</span> Dynamo = <span class="hljs-keyword">new</span> DB();
</code></pre><p>Now, inside of our <code>putMovie</code> we can add the logic to allow users to vote. The two things we need to get are <code>movie</code> from the body and <code>genre</code> from the path parameters. We then combine these to create our <code>movie-genre</code> ID. This then gets passed into <code>Dynamo.increment</code> with a table name of <code>movie-api</code> and our <code>putMovie</code> is complete.</p>
<pre><code><span class="hljs-keyword">const</span> putMovie = <span class="hljs-keyword">async</span> event =&gt; {    <span class="hljs-keyword">let</span> { movie } = <span class="hljs-built_in">JSON</span>.parse(event.body);    <span class="hljs-keyword">let</span> genre = event.pathParameters.genre;    <span class="hljs-keyword">let</span> ID = <span class="hljs-string">`<span class="hljs-subst">${movie}</span>-<span class="hljs-subst">${genre}</span>`</span>;    <span class="hljs-keyword">return</span> Dynamo.increment(ID, <span class="hljs-string">'movie-api'</span>)}
</code></pre><p>To get this to work when we receive the <code>Put</code> request, we need to slightly modify our base handler function.</p>
<pre><code><span class="hljs-keyword">if</span> (event.httpMethod === <span class="hljs-string">'PUT'</span>) {    <span class="hljs-keyword">let</span> response = <span class="hljs-keyword">await</span> putMovie(event)    <span class="hljs-keyword">return</span> done(response);}
</code></pre><p>Because we’ve added <strong>AWS</strong> to our Lambda, we need to run <code>npm init</code> and then <code>npm install — save aws-sdk</code> while in the Lambda folder. This can be done locally and uploaded, or done using Cloud9.</p>
<h3 id="heading-adding-the-api-gateway-method">Adding the API Gateway method</h3>
<p>With the new function, we can add a new method to our API. In API Gateway, we can select our “movieAPI” and then select “/movies/{genre}”<em>.</em> Click “Actions” -&gt; “Create Meth_o_d” and choose to add a “PUT” method.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/nkKXDo9fZIwCBmib5CuBVhOuPYgt5kCxuF7b" alt="Image" width="800" height="453" loading="lazy"></p>
<p>This “PUT” can be directed at our “movieAPI”<em>,</em> and tick “Use Lambda Proxy Integration”. Once saved we can test it out. On the method we can click “TEST” and enter a genre and a body containing a movie. When we click “TEST” we get a response containing the movie and new count. As this is the first vote, the count will be 1.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/22fOgFeE-f4fu84NrhXqW3NDtfYjCpiDfMCO" alt="Image" width="624" height="244" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Z6vdhExeuNJFJQCoAZZcHdndLzjRy3hmxu0I" alt="Image" width="774" height="270" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/mLrC1ijul84nx3VvTJsjo6RFIZCjQqHIHQ7e" alt="Image" width="800" height="296" loading="lazy"></p>
<p>Running the test a second time will now increment the votes for this movie by one.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/ZriL39b1A9v2MyEFt4Zlk7oat5jHGVrT6DZj" alt="Image" width="800" height="283" loading="lazy"></p>
<h3 id="heading-modifying-the-get-method">Modifying the <em>GET</em> method</h3>
<p>Now that we have a new voting system, we can update our “GET” to use this new data. We need to get all of the movies that are in the requested genre and list them in order of votes.</p>
<p>We first need to make a new dynamo method. This method will scan each of the entries and pick out the ones that match our criteria.</p>
<pre><code>scan(key, value, table) {    <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> {        <span class="hljs-keyword">let</span> params = {             <span class="hljs-attr">TableName</span>: table,             <span class="hljs-attr">FilterExpression</span>: <span class="hljs-string">`<span class="hljs-subst">${key}</span> = :value`</span>,             <span class="hljs-attr">ExpressionAttributeValues</span>: { <span class="hljs-string">':value'</span>: value }         };         documentClient.scan(params, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">err, data</span>) </span>{             <span class="hljs-keyword">if</span> (err) reject(err);             resolve(data);         });    });}
</code></pre><p>We can now modify our <code>getMovie</code> function to use this new Dynamo method. We need to pass the genre, selected movie, and current count.</p>
<pre><code><span class="hljs-keyword">const</span> getMovie = <span class="hljs-keyword">async</span> event =&gt; {    <span class="hljs-keyword">let</span> genre = event.pathParameters.genre;    <span class="hljs-keyword">let</span> data = <span class="hljs-keyword">await</span> Dynamo.scan(<span class="hljs-string">'genre'</span>, genre, <span class="hljs-string">'movie-api'</span>);    <span class="hljs-keyword">let</span> result = data.Items.sort(<span class="hljs-function">(<span class="hljs-params">a,b</span>) =&gt;</span> b.count - a.count);    result = result.map(<span class="hljs-function">(<span class="hljs-params">{count, ID, genre}</span>)=&gt;</span> { <span class="hljs-keyword">return</span> {count, ID, genre}});    <span class="hljs-keyword">return</span> data;}
</code></pre><p>The last thing to do is to add an <code>await</code> before out <code>getMovie</code> function so that it handles the async database scan.</p>
<pre><code><span class="hljs-keyword">let</span> response = <span class="hljs-keyword">await</span> getMovie(event);
</code></pre><h4 id="heading-testing">Testing</h4>
<p>When we hit this new “GET” endpoint we receive an ordered list of all of the movies in the database.</p>
<pre><code>[  {    <span class="hljs-string">"count"</span>: <span class="hljs-number">2</span>,    <span class="hljs-string">"ID"</span>: <span class="hljs-string">"Desperado (1995)-action"</span>,    <span class="hljs-string">"genre"</span>: <span class="hljs-string">"action"</span>  },  {    <span class="hljs-string">"count"</span>: <span class="hljs-number">1</span>,    <span class="hljs-string">"ID"</span>: <span class="hljs-string">"Team America (2004)-action"</span>,    <span class="hljs-string">"genre"</span>: <span class="hljs-string">"action"</span>  }]
</code></pre><h3 id="heading-summary">Summary</h3>
<p>We’ve now built an API that can handle “GET” and “PUT” requests, storing and retrieving data from a Dynamo database. You can also reuse a lot of the Dynamo class code for other APIs that work with Dynamo.</p>
<h3 id="heading-want-some-practice">Want some practice?</h3>
<p>If you’ve enjoyed this, then why not try to implement a similar setup for tv shows? If you do, then let me know how it goes!</p>
<p>You can also improve this API by making sure that <code>Desperado (1995)</code> and <code>desperado (1995)</code> both count towards the same movie, or only allow a certain format of movie title.</p>
<p>If you’ve liked this, then make sure to give it a clap and subscribe for more Amazon tutorials and guides. <strong>See you in the next article and Keep Coding!</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/SClwEaQxE4CUJ6oJviWTugWNaGOAH4Xxqohh" alt="Image" width="800" height="288" loading="lazy"></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to create an Alexa skill that manages to-do lists ]]>
                </title>
                <description>
                    <![CDATA[ By Terren Peterson I’m recognized as an Amazon Alexa Champion and have published more than twenty custom skills on the platform. I continue to look for new ways to stretch this technology, and one recent area I’ve been exploring is using Alexa to hel... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-create-an-alexa-skill-that-manages-to-do-lists-11c4bab29ea5/</link>
                <guid isPermaLink="false">66c351205a4b1b0639bef281</guid>
                
                    <category>
                        <![CDATA[ Amazon ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Node.js ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Thu, 31 May 2018 22:03:26 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*ct9YdVEA2z92Z8CGLWz2Zg.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Terren Peterson</p>
<p>I’m recognized as an Amazon <a target="_blank" href="https://developer.amazon.com/alexa/champions/terren-peterson">Alexa Champion</a> and have published more than twenty custom skills on the platform. I continue to look for new ways to stretch this technology, and one recent area I’ve been exploring is using Alexa to help organize everyday tasks. One of the underused features on the platform is the ability to create custom lists. <a target="_blank" href="https://www.amazon.com/gp/help/customer/display.html/ref=cssoc_TW_HP_201549900?nodeId=201549900">Here</a> is a brief review on how you can take advantage of this feature, and please feel free to test out the <a target="_blank" href="https://www.amazon.com/Drawrz-com-Workout-Planner/dp/B07CLY496R/">Workout Planner Skill</a> — it’s free!</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/-c8VTjSI7FO9iKgSF0uJGSgM79Z3uAin9Yqp" alt="Image" width="800" height="236" loading="lazy">
<em>Alexa Workout Planner Skill</em></p>
<h3 id="heading-background">Background</h3>
<p>Hands-free devices like an Alexa open up the possibilities of building handy digital assistants. One of the first features that was enabled with the native device was the ability to create shopping lists. Given the retail heritage of Amazon, it’s not surprising that this came early. Saying phrases like “add shampoo to my shopping list” adds it to the user’s Amazon account. It also renders the data on other applications that the user is signed in on.</p>
<h3 id="heading-dont-bring-alexa-to-the-gym-bring-a-list">Don’t Bring Alexa to the Gym, Bring a List</h3>
<p>After using the shopping list feature for a while, I started to think of other types of lists that I could create. The device has the ability to create custom lists, and I thought it might be helpful in organizing my workouts. Rather than bring a handwritten workout list, I could make one using my voice.</p>
<p>I wrote a custom Alexa Skill called Workout Planner that asked questions about what types of exercises to do. It then created a list for me to track. Here’s a screenshot of what the skill creates on my phone.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/vXvBbsfZotdq7rK2QmR4HgQVo5XnN05li9jE" alt="Image" width="750" height="1290" loading="lazy"></p>
<h3 id="heading-architecture-to-use-the-alexa-lists">Architecture to use the Alexa Lists</h3>
<p>The core functionality around lists is enabled through an <a target="_blank" href="https://api.amazonalexa.com/v2/householdlists/">Alexa API</a> that manages the entities that are rendered on the Alexa companion app.</p>
<p>In a typical Alexa skill architecture, the API gets invoked from the Lambda function that contains the functionality of the skill. Data passed into the API call indicates if a new list should be created, what item should be added, if an item can be crossed off the list, and so on. The companion app handles all of the user interaction with the data on the list, with no additional effort by the skill developer. The user then has the ability to manage this list through the companion app, including marking items off as complete.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/874aizqiQKmCFc2G1-LqjQRYyBW8YRvVb1TR" alt="Image" width="736" height="511" loading="lazy"></p>
<p>The voice interface is the same as any Alexa skill. Authoring a custom skill includes setup of sample utterances, intents, and so on based on the functionality being provided to the user.</p>
<h3 id="heading-enabling-permissions-to-use-the-lists">Enabling Permissions to use the Lists</h3>
<p>When creating an advanced skill like this, the skill will need to request additional permissions. There are multiple levels of permissions and security, which all need to be in place for the skill to fully function.</p>
<p>First, the skill developer will need to acknowledge to the Alexa platform that the skill will make use of the lists. You can do this within the setup of the skill in the Developer console. The screenshot below is from the Permissions tab in the console. The sliders for both list attributes must be set.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/crX24atn1zXmoeXyKHF25te6VHPTqLbPVjBO" alt="Image" width="800" height="339" loading="lazy">
<em>Identifying additional permissions needed by this custom skill in the Alexa Developer console</em></p>
<p>As the skill goes through certification, Amazon validates that the permissions are required for the skill to work. This helps manage access to the user’s data that will be gained by the developer.</p>
<p>Second, when a user enables the skill on their device, they will need to grant consent for the skill to be able to read and write their data for their account. This is enabled through the companion app, and follows an “opt-in” model to access the escalated privileges. Below is a screenshot of the sliders that need to be adjusted in the settings.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/lJTQ0BACYmViOPhC0Vlfn4BpV0LjT9vUYTOG" alt="Image" width="750" height="1020" loading="lazy">
<em>Each user will need to grant permissions to access their list data.</em></p>
<p>Finally, at runtime, a consent token is created for each session that uses the skill. This token needs to be saved by the Lambda function, then passed in the header of the API call to Alexa.</p>
<h3 id="heading-example-api-call">Example API Call</h3>
<p>As highlighted in the architecture, the household API contains the core functionality required to manage the lists. There are multiple operations available within the API, and here is the documentation from Amazon. Using Node.js, here is the code used to invoke the API using the POST operation that creates a new list called “Workout Tracker”.</p>
<pre><code><span class="hljs-keyword">var</span> path = <span class="hljs-string">"/v2/householdlists/"</span>;     <span class="hljs-keyword">var</span> postData = {        <span class="hljs-string">"name"</span>: <span class="hljs-string">"Workout Tracker"</span>, <span class="hljs-comment">//item value, with a string description up to 256 characters         "state": "active" // item status (Enum: "active" only)    };            var consent_token = session.user.permissions.consentToken;</span>
</code></pre><pre><code><span class="hljs-keyword">var</span> options = {        <span class="hljs-attr">host</span>: api_url,        <span class="hljs-attr">port</span>: api_port,        <span class="hljs-attr">path</span>: path,        <span class="hljs-attr">method</span>: <span class="hljs-string">'POST'</span>,        <span class="hljs-attr">headers</span>: {            <span class="hljs-string">'Authorization'</span>: <span class="hljs-string">'Bearer '</span> + consent_token,            <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'application/json'</span>        }    };
</code></pre><pre><code><span class="hljs-keyword">var</span> req = https.request(options, <span class="hljs-function">(<span class="hljs-params">res</span>) =&gt;</span> {    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'statusCode:'</span>, res.statusCode);    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'headers:'</span>, res.headers);    <span class="hljs-keyword">var</span> data = <span class="hljs-string">""</span>;
</code></pre><pre><code>    res.on(<span class="hljs-string">'data'</span>, <span class="hljs-function">(<span class="hljs-params">d</span>) =&gt;</span> {         <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"data received:"</span> + d);         data += d;    });    res.on(<span class="hljs-string">'error'</span>, <span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> {         <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"error received"</span>);         <span class="hljs-built_in">console</span>.error(e);    });    res.on(<span class="hljs-string">'end'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{         <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"ending post request"</span>);        <span class="hljs-keyword">if</span> (res.statusCode === <span class="hljs-number">201</span>) {             <span class="hljs-keyword">var</span> responseMsg = <span class="hljs-built_in">eval</span>(<span class="hljs-string">'('</span> + data + <span class="hljs-string">')'</span>);             <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"new list id:"</span> + responseMsg.listId);             callback(res.statusCode, responseMsg.listId);        } <span class="hljs-keyword">else</span> {             callback(res.statusCode, <span class="hljs-number">0</span>);        }    });});    req.end(<span class="hljs-built_in">JSON</span>.stringify(postData));
</code></pre><p>The API returns a JSON object that includes the ListIdentifier used in subsequent calls to add items to the list.</p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>This is an easy way to leverage the voice user interface of Alexa with the ubiquity of the Alexa Companion App. <a target="_blank" href="https://github.com/terrenjpeterson/workout-planner">Here is a link</a> to the full repo of the skill, and if you have any ideas on how to improve — please let me know!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ A beginner’s guide to Amazon’s Elastic Container Service ]]>
                </title>
                <description>
                    <![CDATA[ By Dominic Fraser This article is a beginner’s high level look at Amazon ECS. We’ll cover core concepts, terms, simple architecture diagrams, and abstracted examples. So let’s get started! Docker To appreciate Amazon ECS, you first have to understand... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/amazon-ecs-terms-and-architecture-807d8c4960fd/</link>
                <guid isPermaLink="false">66d45e3e8812486a37369c99</guid>
                
                    <category>
                        <![CDATA[ Amazon ]]>
                    </category>
                
                    <category>
                        <![CDATA[ AWS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ containers ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Docker ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Sun, 20 May 2018 17:25:22 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*F_Av332fsAf6RJ97gM2h8w.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Dominic Fraser</p>
<p>This article is a beginner’s high level look at Amazon ECS. We’ll cover core concepts, terms, simple architecture diagrams, and abstracted examples. So let’s get started!</p>
<h3 id="heading-docker">Docker</h3>
<p>To appreciate Amazon ECS, you first have to understand Docker.</p>
<p>Docker is a client-server application that can be installed on Linux, Windows, and MacOS and that allows you to run Docker <a target="_blank" href="https://en.wikipedia.org/wiki/Operating-system-level_virtualization">containers</a>. Containers are lightweight environments containing everything needed to run a specific application or part of an application. Multiple different containers can be run on one machine, so long as it has the Docker software installed.</p>
<p>If you’re interested in <strong>how</strong> they work, and how Docker is different from a virtual machine, then this <a target="_blank" href="https://medium.com/pintail-labs/docker-series-what-is-docker-9eddca88f434">intro to Docker</a> is a great place to start.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/N-3HpONvjcv4ZhAeMBN43aO1XfLfwDcOL2oe" alt="Image" width="580" height="328" loading="lazy">
_Adapted from Docker’s ‘[bins/libs](https://docs.docker.com/get-started/#container-diagram" rel="noopener" target="_blank" title=""&gt;get started’, see here for ‘&lt;a href="https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard" rel="noopener" target="<em>blank" title=")’</em></p>
<p>Using Docker containers allows teams to have a consistent development environment by abstracting away the software, operating system, and hardware configuration into a standard building block that can be run on any machine.</p>
<p>Each container has exactly what it needs — for example, certain versions of a language or library — and no more than it needs. Multiple containers can be used for different parts of your application if you want, and they can be set up to communicate with each other when needed.</p>
<p>By using specified Docker containers to run your production code, you can be sure that your development environment is exactly the same as your production environment.</p>
<p>As your application grows, managing the deployment, structure, scheduling, and scaling of these containers rapidly becomes very complicated. This is where a “container management service” comes in. It aims to allow simple configuration options and handles the heavy lifting while you go back to writing the app.</p>
<h3 id="heading-an-intro-to-amazon-ecs">An intro to Amazon ECS</h3>
<p>Amazon <a target="_blank" href="https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html">Elastic Container Service</a> (ECS) is, according to Amazon,</p>
<blockquote>
<p><em>…a highly scalable, fast, container management service that makes it easy to run, stop, and manage Docker containers on a cluster.</em></p>
</blockquote>
<p>It is comparable to <a target="_blank" href="https://kubernetes.io/">Kubernetes</a>, <a target="_blank" href="https://docs.docker.com/swarm/overview/">Docker Swarm</a>, and <a target="_blank" href="https://azuremarketplace.microsoft.com/en-us/marketplace/apps/microsoft.acs">Azure Container Service</a>.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/4wqn-TABgSmokYgU0tGgbvk8kTng0ibENfLX" alt="Image" width="800" height="395" loading="lazy"></p>
<p>ECS runs your containers on a cluster of <a target="_blank" href="https://aws.amazon.com/ec2/">Amazon EC2</a> (Elastic Compute Cloud) <a target="_blank" href="https://www.youtube.com/watch?v=TsRBftzZsQo">virtual machine instances</a> pre-installed with Docker. It handles installing containers, scaling, monitoring, and managing these instances through both an API and the AWS Management Console. It allows you to simplify your view of EC2 instances to a pool of resources, such as CPU and memory. The specific instance a container runs on, and maintenance of all instances, is handled by the platform. You don’t have to think about it.</p>
<p>It’s worth noting that it is tied into the Amazon infrastructure, unlike some other providers that allow more flexibility. However, that means it comes with excellent integration with other AWS services.</p>
<h3 id="heading-terms-and-architecture">Terms and architecture</h3>
<p>Let’s give some imaginary context for the definitions we are about to look at. Say you are building an application that runs on two Docker containers, perhaps one for the main application, and one for managing metrics. Both are needed for the application to run as intended. If you had large amounts of traffic, you might need to run several pairs of containers.</p>
<p>Here we come to two sets of new terms:</p>
<ul>
<li>a <strong>Task Definition</strong>, <strong>Task</strong>, and <strong>Service</strong>, and</li>
<li>a <strong>Cluster</strong>, <strong>ECS Container Instance</strong>, and <strong>ECS Container Agent</strong>.</li>
</ul>
<h4 id="heading-task-definition">Task Definition</h4>
<p>This is the blueprint describing which Docker containers to run and represents your application. In our example, it would be two containers. would detail the images to use, the CPU and memory to allocate, environment variables, ports to expose, and how the containers interact.</p>
<h4 id="heading-task">Task</h4>
<p>An instance of a Task Definition, running the containers detailed within it. Multiple Tasks can be created by one Task Definition, as demand requires.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/eL718lUcFCktxO96DKpdAIu1uBguoNqOKHRF" alt="Image" width="800" height="480" loading="lazy">
<em>One Task Definition creates several identical Tasks</em></p>
<h4 id="heading-service">Service</h4>
<p>Defines the minimum and maximum Tasks from one Task Definition run at any given time, autoscaling, and load balancing. In our example, if the CPU was maxed out from the single task we had running, we may want it to add an additional Task.</p>
<p>We may, however, want to limit the maximum number of Tasks it can run, since we know that running extra Tasks uses additional resources that cost money.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Ff1BK5c7YRL7KAv71Hu7ZSwByYpeJPTaolzT" alt="Image" width="800" height="271" loading="lazy">
<em>Service definition defining alarms of when to scale capacity</em></p>
<p>Now that we have our Service, its Tasks need to be run somewhere in order to be accessible. It needs to be put on a <strong>Cluster,</strong> and the container management service will handle it running across one or more <strong>ECS Container Instance(s)</strong>.</p>
<h4 id="heading-ecs-container-instances-and-ecs-container-agentshttpsgithubcomawsamazon-ecs-agent">ECS Container Instances and ECS Container <a target="_blank" href="https://github.com/aws/amazon-ecs-agent">Agents</a></h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1NSrmTZQxI3ErrpE9qMvTZkjYIZ9zS9BLZrJ" alt="Image" width="800" height="529" loading="lazy">
<em>One ECS Container Instance running 8 Tasks from multiple different Services</em></p>
<p>This is an [EC2 instance](http://AWS EC2 for Beginners) that has Docker and an ECS Container Agent running on it. A Container Instance can run many Tasks, from the same or different Services.</p>
<p>The Agent takes care of the communication between ECS and the instance, providing the status of running containers and managing running new ones.</p>
<h4 id="heading-cluster">Cluster</h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/scH1QJHgrQ6NgA1jQo9ITuCiQGkAawRHmzSc" alt="Image" width="800" height="348" loading="lazy">
<em>An example ECS cluster, with one Service running four Tasks across two ECS Container Instances</em></p>
<p>As seen above, a Cluster is a group of ECS Container Instances. Amazon ECS handles the logic of scheduling, maintaining, and handling scaling requests to these instances. It also takes away the work of finding the optimal placement of each Task based on your CPU and memory needs.</p>
<p>A Cluster can run many Services. If you have multiple applications as part of your product, you may wish to put several of them on one Cluster. This makes more efficient use of the resources available and minimizes setup time.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/W3Xl8d3AHiLkuxV4ZdmvrqtPoFplOtp3hmcY" alt="Image" width="800" height="233" loading="lazy">
<em>Multiple Services allocated across multiple ECS Container Instances running on one Cluster</em></p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>We have seen how a Dockerized application can be represented by a <strong>Task</strong> <strong>Definition</strong> that has a one-to-one relationship with a <strong>Service</strong> which in turn uses it to create many different <strong>Task</strong> instances.</p>
<p>This <strong>Service</strong> is deployed to a <strong>Cluster</strong> of <strong>ECS Container Instances</strong> that provide the pool of resources needed to run and scale your application. Additional Services can be deployed to the same Cluster.</p>
<p>Amazon ECS, or any container management service, aims to make this as simple as possible, abstracting away many complexities of running infrastructure at scale.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/wRtGhAtM8NLLnpTkp4PAUc80YHObxKVnFFhM" alt="Image" width="628" height="552" loading="lazy">
<em>A Cluster running 3 Services, each running a different amount of Tasks, across two ECS Container Instances</em></p>
<p>As your needs become more complex, the container management service ensures this remains manageable. Using its API or Management Console, you can put definitions in place to add new Container Instances as you need them. This makes sure that there are always a healthy number of Tasks running, and intelligently allocates resources across Services.</p>
<p>Thanks for reading!</p>
<h4 id="heading-resources">Resources</h4>
<ul>
<li><a target="_blank" href="https://medium.com/boltops/gentle-introduction-to-how-aws-ecs-works-with-example-tutorial-cea3d27ce63d">Gentle Introduction to How AWS ECS Works with Example Tutorial</a></li>
<li><a target="_blank" href="https://medium.com/@ukayani/deploying-clustered-akka-applications-on-amazon-ecs-fbcca762a44c">Deploying Clustered Akka Applications on Amazon ECS</a></li>
<li><a target="_blank" href="https://medium.com/containers-on-aws/building-blocks-of-amazon-ecs-db7fdfeeaa6f">Building Blocks of Amazon ECS</a></li>
<li><a target="_blank" href="https://www.youtube.com/watch?v=zBqjh61QcB4">Introduction to Amazon EC2 Container Service (ECS) — Docker Management on AWS</a></li>
<li><a target="_blank" href="https://www.youtube.com/watch?v=eq4wL2MiNqo">Amazon ECS: Core Concepts</a></li>
<li><a target="_blank" href="https://hackernoon.com/aws-ec2-for-beginners-56df2e820d7f">AWS EC2 for Beginners</a></li>
<li><a target="_blank" href="https://medium.com/aws-activate-startup-blog/a-better-dev-test-experience-docker-and-aws-291da5ab1238">A Better Dev/Test Experience: Docker and AWS</a></li>
<li><a target="_blank" href="https://medium.com/aws-activate-startup-blog/cluster-based-architectures-using-docker-and-amazon-ec2-container-service-f74fa86254bf">Cluster-Based Architectures Using Docker and Amazon EC2 Container Service</a></li>
</ul>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Why the future is bright for Virtual Assistants ]]>
                </title>
                <description>
                    <![CDATA[ By Steve I purchased my first mobile phone in the summer of 1999. I was 17 years old, growing up in a nondescript town in the Midlands of the United Kingdom. The population was less than 50,000. For those of you wondering, it was a Sagem RC 922. It b... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/the-number-1-reason-virtual-assistants-will-go-completely-viral-c4a8bb20e262/</link>
                <guid isPermaLink="false">66c361ebe4cb1ff6521c8287</guid>
                
                    <category>
                        <![CDATA[ Amazon ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Artificial Intelligence ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Google ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Tue, 31 Oct 2017 15:29:42 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*VLJnt-QX-4sbrJ8IyF9iDw.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Steve</p>
<p>I purchased my first mobile phone in the summer of 1999. I was 17 years old, growing up in a nondescript town in the Midlands of the United Kingdom. The population was less than 50,000.</p>
<p>For those of you wondering, it was a Sagem RC 922. It boasted enough memory for a whopping 100-contacts address book. It also had an external antenna. This phone would go on to be crushed by the juggernaut of Nokia.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/ubL2l862-HWb3aj9LSF1tgfiA6mRA0gzz7dM" alt="Image" width="139" height="184" loading="lazy"></p>
<p>My phone had no GPS. No colour screen. No <a target="_blank" href="https://en.wikipedia.org/wiki/Wireless_Application_Protocol">WAP</a>. No headphone jack.</p>
<p>It offered text messages, voice calls, and a calculator.</p>
<p>However, it came with a nice plastic card which promised £10 credit — if you scratched off the silver foil and input the numbers into the phone.</p>
<p>It cost me just shy of £100. I had saved this up by working part-time in a factory during evenings while I studied at college.</p>
<h3 id="heading-beyond-the-nostalgia">Beyond the nostalgia</h3>
<p>My cousin Thomas, a few years older than me; and my father were with me when I purchased the phone. We sat down in a coffee shop and unwrapped my new purchase. I powered it on and started inputting the code for the free credit.</p>
<p>“What is <em>that</em>?” they asked.</p>
<p>“My new mobile phone,” I replied.</p>
<p>My Dad simply looked baffled. “But… why have you bought a mobile phone?”</p>
<p>I shrugged.</p>
<p>Then, quick as a flash, my cousin Thomas said: “I want one. Where did you get it?”</p>
<p>He marched off to the local store and came back two minutes later, triumphantly clutching his prize. My Dad, a blue-collar truck driver, was bewildered. <em>Why had his son and nephew invested so much in something new?</em></p>
<h3 id="heading-what-this-means-for-virtual-assistants">What this means for Virtual Assistants</h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/h41PumG9aBQfcRJlCex0taq2T40RjKxCCU9k" alt="Image" width="642" height="415" loading="lazy"></p>
<p>6 months ago my wife purchased me a gift. It was an Amazon Echo Dot. As someone who works all day in tech, she considered it a winner as a birthday gift.</p>
<p>However, it remained boxed for nearly six months. Two weeks ago she became exasperated, and set it up in the kitchen. It was a novelty at first.</p>
<ul>
<li>“Alexa, why is Siri better?” [snark]</li>
<li>“Alexa, do you have a boyfriend?” [British taboo humour]</li>
</ul>
<p>Eventually, it was used for the same purpose every Echo Dot is used for:</p>
<ul>
<li>“Alexa, set a reminder for 10 minutes when the oven fries are done”</li>
</ul>
<p>Yesterday, I came downstairs and saw my four year-old son sitting in the kitchen. He often uses a stool to help himself to bowls of cereal from the cupboard.</p>
<p>This morning, he had served himself a bowl of chocolately goodness and milk, and was listening to a song on the radio. Or so I thought. The song was <em>Way Out</em> by Beau Black. You might otherwise know it as the <a target="_blank" href="https://www.google.co.uk/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwjsg5S60JrXAhUJDMAKHULKA0wQyCkIKDAA&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DSxnsOI0RHkQ&amp;usg=AOvVaw02i5Ga35C77q7b6DfSTiny">Miles from Tomorrow theme tune</a>.</p>
<blockquote>
<p>“I’ m a hero to the core. And I’ m going to explore. Way out!”</p>
</blockquote>
<p>I grabbed a bowl of cereal and sat next to him.</p>
<p>“How did you turn the radio on?”</p>
<p>He munched thoughtfully.</p>
<p>“I didn’t. It plays me songs.”</p>
<p>I looked over. Sure enough, the Echo dot was the source of the Disney pop extravaganza.</p>
<blockquote>
<p>“It plays me songs”</p>
</blockquote>
<p>Of course it plays songs. It is right there on the marketing literature. I knew it connects to dozens of services. It was supposed to work seamlessly.</p>
<p>However, as an adult I found it frustrating. Possibly because I was trying to frustrate it. For example:</p>
<p>“Alexa, turn on Spotify and play the Coding and Crushing It playlist and select Time by Hans Zimmer.”</p>
<p>Hah! Look. It can’t. First gen product. Pfft.</p>
<p>But to my son — who only started school 4 weeks ago — Alexa was his <em>friend</em>. Alexa played <em>his</em> songs. He continued to talk about Alexa glowingly over breakfast. I realised he had anthropomorphized it. Alexa was the equivalent of a pet. It was part of the home.</p>
<p>And no one had shown him how to use it. He just shouted commands.</p>
<p>Still eating, he said: “Alexa, please you play PJ Masks now!”</p>
<p>Sure enough, Alexa popped the PJ Masks theme tune onto Spotify. He was, in consumer terms, completely satisfied.</p>
<p>All of this complemented the behaviours I’d previously seen in my daughters, Darcey (7) and Holly (5).</p>
<p>Neither of them type search queries into Google. They default to voice-search for almost everything. Such as recently:</p>
<p>“Google, when is Descendants 2 released?”</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/-YcC6GMIwgUMoyDzk2XAl1FIAAhryNJV40iZ" alt="Image" width="800" height="420" loading="lazy"></p>
<p>Children don’t display the preconceptions that adults have when interacting with Virtual Digital Assistants or A.I. bots.</p>
<p>They rarely get mad or blame the technology. It is <em>just there</em>. They have adopted voice-control in the same casual manner that I adopted mobile phone technology in the 1999.</p>
<p>That is, they have no real sense of requirement. I never got mad that my phone was lacking features. I was just super-satisfied to be communicating. My use case for a phone was limited to calling and texting. My children have a similar limited use case for Alexa.</p>
<p>It is the norm. In their life, technology exists to serve content they request. That content may be a joke, or a song, a movie, a change in lighting, or the answer to a question.</p>
<p>Alexa and Google Assistant offer frictionless access to the content they want. They respond to an immediate thought — far quicker than typing.</p>
<p>As an adult, I am still conscious of saying “OK Google” in public to trigger the Assistant.</p>
<p>I own a pair of Bose QC-35 wireless headphones with the Google Assistant button, but I am loathe to use it. It does not feel normal in public. I feel like I am showing off.</p>
<p>However, my daughters have no problem shouting “OK Google, show me the nearest toy shop” into their phones anywhere they might be.</p>
<h3 id="heading-why-do-my-children-get-better-responses-from-alexa">Why do my children get better responses from Alexa?</h3>
<p>While adults may often attempt to trick the algorithm, children already speak in simple sentence structures. These lend themselves well to the user input required for an A.I.</p>
<p>It is frictionless because they are pure in their intentions and simple in their requests. The barrier to satisfaction is far lower for a child using voice activation. Their expectation of Alexa is zero — other than the exception that it is always available. Children are the best demographic for proving the voice-controlled home.</p>
<p>The true test of home automation is not: “Will the temperature go up 10 minutes before I get home?” That’s not too difficult to program using a combination of a smartphone, compatible hubs and <a target="_blank" href="https://ifttt.com/">IFTTT</a>.</p>
<p>The true test is “Can a child dim their Hue lightbulbs to reflect bed time? Can a child request a Winnie the Pooh book-on-tape via a smart speaker?”</p>
<p>I believe we have passed that point in 2017. Children are the future consumers of this technology. For this reason, I believe the market valuations are pessimistic.</p>
<p>The target demographic for the widespread adoption of voice-control is not the Millennial generation. Instead, it is those born between 2010–2020. They are the ones growing up in a voice-controlled home, and will expect this technology as a standard.</p>
<p>Voice A.I. will be ubiquitous in the next two decades. I have no doubt.</p>
<h3 id="heading-what-does-the-future-hold">What does the future hold?</h3>
<p>I am all-in on Amazon winning this race. This is because vendor lock-in is crucial. If the barrier to switching is high, then once you have bought a home speaker or Hub, you are extremely unlikely to switch platforms.</p>
<p>At the beginning of 2016, there were <a target="_blank" href="https://techcrunch.com/2016/01/04/amazons-other-app-store-alexas-skills-section-has-quietly-grown-to-over-130-apps/">just over 130 Alexa apps</a>, or “skills”. By year-end, that number had grown <a target="_blank" href="https://developer.amazon.com/blogs/post/Tx3PW7BACQVE53B/introducing-the-alexa-skills-kit-built-in-library-offering-developers-hundreds-of-new-voice-interactions-developer-preview">to over 5,000</a>. Today, there are over 7,000. Application growth was over 500% during the second half of 2016.</p>
<p>For anyone trailing Google, Apple and Amazon, the future looks bleak in terms of native adoption.</p>
<p>The best chance for rival voice assistant providers may be to provide a display/voice interface layer on top of a shared processing layer. However, the strength of an A.I. service lies in superior data processing ability. This means it is unlikely that such a collaborative development will happen.</p>
<p>Instead, we will see a fragmented marketplace emerge. It will be a market where you are forced into using default A.I. providers depending on the hardware purchase. This will lead to consumer friction and third party solutions to “remove” incumbent solutions.</p>
<p>Personally, I feel that Amazon benefit from being a commerce company while Google still suffers a ‘Big Brother’ reputation.</p>
<p>That branding hurdle is one that Google required Amazon to break down. If Google were first to market, I am certain voice-controlled home automation would have died on launch. Amazon were the route-provers, or the minesweepers.</p>
<h3 id="heading-mobile-reversal">Mobile reversal</h3>
<p>Curiously, this branding issue is reversed on mobile devices. Google Assistant is crushing Android competitors such as Alexa and Bixby. According to Ovum Marketing Research:</p>
<blockquote>
<p><a target="_blank" href="http://www.ioti.com/engineering-and-development/google-woos-developers-catch-amazon-digital-assistant-race">Google Assistant</a> will dominate the <a target="_blank" href="http://www.ioti.com/engineering-and-development/race-ai-enabled-natural-language-and-voice-interface-platforms">voice artificial intelligence (AI)-capable device market</a> with 23.3% market share, followed by Samsung’s Bixby (at 14.5%), <a target="_blank" href="http://www.ioti.com/iot-trends-and-analysis/fastest-growing-skills-topped-engineering-build-next-siri">Apple’s Siri</a> (13.1%), <a target="_blank" href="http://www.ioti.com/iot-trends-and-analysis/amazon-wants-put-alexa-just-about-everything">Amazon’s Alexa</a> (3.9%) and Microsoft’s Cortana (2.3%)</p>
</blockquote>
<p><a target="_blank" href="https://techcrunch.com/2017/01/24/24-5m-voice-first-devices-expected-to-ship-this-year-but-apps-struggle-to-retain-users/">TechCrunch recently reported</a> on a VoiceLabs report:</p>
<blockquote>
<p>“‘Therefore, while not a winner-take-all market, in 2017 VoiceLabs predicts it will be a winner-take-entire-household market,’ the report states. ‘This puts pressure on the hardware providers to distribute devices quickly.’”</p>
</blockquote>
<p>Amazon is undoubtedly supported by its vast experience in selling consumer electronics. This gives it an edge in distribution channels.</p>
<p>Meanwhile, it has also made it easy for developers to build Alexa voice applications for its Echo family of devices. It has invested in tools for application development.</p>
<p>However, my last thought is that Amazon has made significant progress in capturing younger content consumers into the Amazon ecosystem. This is through the use of the Kindle Fire Kids, which seems ripe for an Alexa-inspired revolution.</p>
<p>“Alexa, help me understand long multiplication.”</p>
<p><em>“Opening Khan Academy, long multiplication, video playing in 3, 2, 1…”</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ After months of preparing for the Google interview, I got hired by Amazon ]]>
                </title>
                <description>
                    <![CDATA[ By Googley as Heck As you may know, the last 11 months have been very difficult for me. As a self-taught web developer of 15 years, my computer science study plan took me months to get through, and the main motivator was to start a new career as a so... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/ive-been-hired-by-amazon-8b21f7c27de5/</link>
                <guid isPermaLink="false">66c358b00cede4e9b1329ca7</guid>
                
                    <category>
                        <![CDATA[ Amazon ]]>
                    </category>
                
                    <category>
                        <![CDATA[ AWS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Career ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Cloud Computing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Tue, 07 Mar 2017 00:22:41 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*nIAP8roP7XjajSY5VNe6gA.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Googley as Heck</p>
<p>As you may know, the last 11 months have been very difficult for me. As a self-taught web developer of 15 years, my computer science study plan took me months to get through, and the main motivator was to <strong>start a new career as a software engineer, tackling large problems at a large tech company</strong>.</p>
<p>Google was the company I had audaciously set my sights on, but in the end that <a target="_blank" href="https://medium.com/@googleyasheck/i-didnt-get-hired-here-s-why-21f26d4784d5">turned into disappointment</a>. If you haven’t read about my story, you’re missing out. Go ahead and <a target="_blank" href="https://medium.freecodecamp.com/why-i-studied-full-time-for-8-months-for-a-google-interview-cc662ce9bb13">read it first</a>.</p>
<p>Well, I reached out to my network, and made a lot of new friends. I got connected with every tech giant in the Pacific northwest. Of all of them, Amazon had always stood out — even more than Google — as the most innovative company over the last 10 years. I applied via a referral, whom I had met at a startup event in 2013, and got the process rolling.</p>
<p>After so many months of non-stop effort, sacrifice, and worry, I’m pleased to announce that I finally made it!</p>
<p><strong>Today I accepted an offer to be a Software Development Engineer at Amazon.com.</strong></p>
<p>Working at Amazon is a dream come true, and I’ll be working on the <a target="_blank" href="https://aws.amazon.com/config/">Amazon Web Services Config</a> team. <strong>I’ve wanted to work on AWS for years, but was never qualified, until now.</strong> I’ve been using AWS since 2012, when I got started using CloudFormation to automate infrastructure build-out and scaling.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*aEFyFuu0hHdS2P2tRZXdiw.png" alt="Image" width="500" height="188" loading="lazy"></p>
<p><a target="_blank" href="https://aws.amazon.com/config/">AWS Config</a> is a fully managed service that provides operations teams with AWS resource inventory, configuration history, and configuration change notifications to enable security and governance. Config Rules enables administrators to create rules that automatically check the configuration of AWS resources recorded by AWS Config, as well as define actions AWS can take to fix issues automatically.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*_5LxU4OVQmMRn4dKPooiMA.png" alt="Image" width="170" height="205" loading="lazy"></p>
<p>Here’s a video with some cool automation tricks you can do with AWS Config Rules, CloudTrail, and Lambda:</p>
<p>Thanks to everyone for your support!</p>
<h3 id="heading-where-to-find-me">Where to Find Me</h3>
<p>Since I won’t be posting on this “Googley” account any more, feel free to follow my adventures at <a target="_blank" href="https://startupnextdoor.com/?src=gah">Startup Next Door</a>, <a target="_blank" href="https://www.linkedin.com/in/johnawasham/">LinkedIn</a>, and <a target="_blank" href="https://twitter.com/StartupNextDoor">Twitter</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
