<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Taylor D Jones</title>
    <description>The latest articles on Forem by Taylor D Jones (@onetayjones).</description>
    <link>https://forem.com/onetayjones</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F903887%2F8fd7902f-16d4-4e6f-a8e2-84d78a143e32.png</url>
      <title>Forem: Taylor D Jones</title>
      <link>https://forem.com/onetayjones</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/onetayjones"/>
    <language>en</language>
    <item>
      <title>Tackling the Cloud ☁️ Building a Containerized Sports API with AWS ECS and API Gateway</title>
      <dc:creator>Taylor D Jones</dc:creator>
      <pubDate>Sun, 02 Feb 2025 20:17:09 +0000</pubDate>
      <link>https://forem.com/onetayjones/tackling-the-cloud-building-a-containerized-sports-api-with-aws-ecs-and-api-gateway-57c6</link>
      <guid>https://forem.com/onetayjones/tackling-the-cloud-building-a-containerized-sports-api-with-aws-ecs-and-api-gateway-57c6</guid>
      <description>&lt;p&gt;This was one of the most challenging projects I've ever worked on. When I started to build the containerized API management system for sports data, I thought, &lt;em&gt;"How hard could it be?"&lt;/em&gt; &lt;strong&gt;Spoiler alert:&lt;/strong&gt; It was like trying to win the Super Bowl without knowing the playbook. But guess what? After fumbling through tasks, battling circuit breakers, and chasing down rogue environment variables, I emerged victorious. Here’s the play-by-play of my adventure with Amazon ECS (Fargate), API Gateway, and a sprinkle of Docker magic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏈 Kickoff: The Game Plan&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The goal was simple: &lt;strong&gt;create a REST API&lt;/strong&gt; that pulls real-time sports data, containerize it with Docker, deploy it on AWS ECS with Fargate, and expose it through API Gateway. Sounds easy, right? Like a rookie quarterback, I had no idea the defense (aka AWS errors) I was about to face.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚙️ The Tech Stack Draft&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Services:&lt;/strong&gt; ECS (Fargate), API Gateway, CloudWatch&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Programming Language:&lt;/strong&gt; Python 3.x with Flask&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Containerization:&lt;/strong&gt; Docker&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;External Data:&lt;/strong&gt; SerpAPI for sports data&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚀 First Quarter: Building the API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Writing the Flask API was the easy part. I whipped up an endpoint /sports to fetch NFL schedules from SerpAPI. It worked perfectly on my local machine. I felt like an MVP.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@app.route('/sports', methods=['GET'])
def get_nfl_schedule():
    # Fetches the NFL schedule from SerpAPI
    try:
        params = {
            "engine": "google",
            "q": "nfl schedule",
            "api_key": SERP_API_KEY
        }
        response = requests.get(SERP_API_URL, params=params)
        data = response.json()
        return jsonify(data), 200
    except Exception as e:
        return jsonify({"error": str(e)}),
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;.... but then came the deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💥 Second Quarter: The Fargate Fumble&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Deploying to ECS was like facing the 1985 Chicago Bears defense. My containers wouldn't start, tasks kept stopping, and AWS threw errors like confetti:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exit Code 137:&lt;/strong&gt; "Out of memory? But I gave you 2GB, why are you still hungry?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Circuit Breaker Thresholds:&lt;/strong&gt; ECS decided, "You’re done here, buddy," and kept rolling back my services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Image Pull Errors:&lt;/strong&gt; "CannotPullContainerError: manifest does not contain descriptor matching platform 'linux/amd64'."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏃‍♂️ Halftime Adjustments: Learning from the Fumbles&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Memory Issues?&lt;/em&gt; Increased the task memory to 4GB. Boom. No more out-of-memory errors.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Circuit Breaker Drama?&lt;/em&gt; Disabled it temporarily to figure out the root issues.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Docker Image Errors?&lt;/em&gt; Rebuilt the Docker image with the --platform linux/amd64 flag. ECS finally stopped being picky.&lt;/p&gt;

&lt;p&gt;🏆 Third Quarter: API Gateway Gets in the Game&lt;/p&gt;

&lt;p&gt;Setting up API Gateway was smoother than a perfect touchdown pass:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Created a new REST API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Linked it to the Application Load Balancer (ALB) from ECS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deployed to the prod stage&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BUT... hitting the endpoint returned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "games": [],
  "message": "No NFL schedule available."
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Cue dramatic music.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;😤 Fourth Quarter: The Debugging Blitz&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Turns out, the API key I set as an environment variable was misnamed. I had SPORTS_API_KEY in ECS but SERP_API_KEY in my code. Rookie mistake. I updated the task definition, redeployed the service, and...&lt;/p&gt;

&lt;p&gt;TOUCHDOWN! 🏈&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "message": "NFL schedule fetched successfully.",
  "games": [
    {
      "away_team": "Kansas City Chiefs",
      "home_team": "Philadelphia Eagles",
      "venue": "Caesars Superdome",
      "date": "Sun, Feb 9, 6:30 PM",
      "time": "6:30 PM ET"
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;📚 Overtime: Lessons Learned&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Memory Matters: Don’t underestimate resource allocation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Naming Conventions Save Lives: Consistency with environment variables is key.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Logs Are Your Best Friend: CloudWatch helped me track down every sneaky error.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Docker Platforms: Specify the platform when building for ECS to avoid compatibility headaches.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;💡 Final Thoughts: From Rookie to Pro&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What started as a simple API project turned into a cloud computing masterclass. I battled ECS tasks, tamed API Gateway, and came out with a fully containerized, scalable sports API. So, if you’re diving into AWS, just remember:&lt;/p&gt;

&lt;p&gt;It’s okay to fumble, as long as you recover the ball. 🙌&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ready to deploy your own sports API?&lt;/em&gt; &lt;a href="https://github.com/TaylorDJones11/GameDayAPI" rel="noopener noreferrer"&gt;Check out the project on GitHub!&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>DevOps Challenge: Day 2 – Building an Automated NBA Score Alert System with AWS</title>
      <dc:creator>Taylor D Jones</dc:creator>
      <pubDate>Tue, 07 Jan 2025 19:21:28 +0000</pubDate>
      <link>https://forem.com/onetayjones/devops-challenge-day-2-building-an-automated-nba-score-alert-system-with-aws-3i6j</link>
      <guid>https://forem.com/onetayjones/devops-challenge-day-2-building-an-automated-nba-score-alert-system-with-aws-3i6j</guid>
      <description>&lt;p&gt;Welcome to Day 2 of my DevOps Challenge! Today, I focused on implementing an automated NBA score alert system using AWS services like SNS, Lambda, and EventBridge. This project is a great hands-on way to explore cloud automation, event-driven workflows, and security best practices in AWS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fghp1pnkegvhigtjp28jw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fghp1pnkegvhigtjp28jw.png" alt="AWS Architecture" width="800" height="715"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🏀 &lt;strong&gt;The Goal: Real-Time NBA Alerts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The goal is simple: fetch live NBA game scores from an external API and send real-time notifications via SMS or email to subscribed users. To achieve this, I leveraged:&lt;br&gt;
• Amazon SNS for sending notifications&lt;br&gt;
• AWS Lambda for processing game data&lt;br&gt;
• Amazon EventBridge for scheduling updates&lt;br&gt;
• IAM Security following least privilege principles&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;What I Did Today&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1️⃣ &lt;em&gt;Setting Up Amazon SNS for Notifications&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I started by creating an SNS topic to handle message distribution. Subscribers (either via email or SMS) will receive updates as new scores come in. One key step was confirming email subscriptions to ensure proper delivery.&lt;/p&gt;

&lt;p&gt;2️⃣ &lt;em&gt;Deploying the Lambda Function&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Next, I created an AWS Lambda function in Python, which fetches live NBA scores from SportsData.io and formats them for delivery. The Lambda function also uses environment variables to securely store the API key and SNS topic ARN.&lt;/p&gt;

&lt;p&gt;3️⃣ &lt;em&gt;Automating with Amazon EventBridge&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To keep notifications timely, I scheduled the function using EventBridge Rules. I set up a cron job that triggers the Lambda function at specific intervals, ensuring fans receive the latest game updates without manual intervention.&lt;/p&gt;

&lt;p&gt;4️⃣ &lt;em&gt;Implementing IAM Security Best Practices&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Security is crucial in any cloud deployment. I followed least privilege access by creating IAM roles that grant only the necessary permissions for Lambda, SNS, and EventBridge. This reduces the risk of unauthorized access or misconfiguration.&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;Lessons Learned&lt;/strong&gt;&lt;br&gt;
• Event-driven automation is powerful – With just a few AWS services, I automated a notification system that runs on its own.&lt;br&gt;
• IAM security should never be an afterthought – Applying least privilege policies ensures services have just the right level of access.&lt;br&gt;
• Lambda functions are great for lightweight tasks – Fetching, processing, and sending notifications with Lambda made the system both scalable and cost-efficient.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Have you built a similar notification system? What use case would you automate with AWS? Let’s discuss!&lt;/strong&gt; 👇&lt;/p&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>cloud</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>Day 1 of My 30-Day DevOps Challenge: Building a Cloud-Powered Weather Dashboard ☁️🌍</title>
      <dc:creator>Taylor D Jones</dc:creator>
      <pubDate>Mon, 06 Jan 2025 18:40:45 +0000</pubDate>
      <link>https://forem.com/onetayjones/day-1-of-my-30-day-devops-challenge-building-a-cloud-powered-weather-dashboard-3h55</link>
      <guid>https://forem.com/onetayjones/day-1-of-my-30-day-devops-challenge-building-a-cloud-powered-weather-dashboard-3h55</guid>
      <description>&lt;p&gt;Kicking Off the DevOps Journey 🚀&lt;/p&gt;

&lt;p&gt;I’m officially diving into a 30-Day DevOps Challenge, and I couldn’t be more excited! The goal? Build hands-on cloud skills while tackling real-world projects. And what better way to start than by creating something practical—a serverless weather dashboard that fetches live weather data and stores it in AWS S3?&lt;/p&gt;

&lt;p&gt;The idea sounded simple at first:&lt;br&gt;
👉 Fetch weather data from an API&lt;br&gt;
👉 Store it somewhere&lt;br&gt;
👉 Retrieve and display it later&lt;/p&gt;

&lt;p&gt;But as I quickly learned, cloud projects always involve more than you expect—and that’s part of the fun. 😆&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Fetching Weather Data Like a Pro&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since I wanted to pull real-time weather updates, I decided to use the OpenWeather API. It’s a free (and super easy-to-use) service that provides weather details like temperature, humidity, and conditions for any city.&lt;/p&gt;

&lt;p&gt;I grabbed my API key, made a request, and boom—instant weather data! 🌤️&lt;/p&gt;

&lt;p&gt;At this point, I was feeling good. Step 1? Done. ✅&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Where Do I Store This Data?&lt;/strong&gt; 🤔&lt;/p&gt;

&lt;p&gt;Here’s where AWS comes in. Instead of saving data to a local file, I wanted to store it in Amazon S3 (Simple Storage Service)—a scalable, cloud-based storage solution. This meant I could keep weather records over time and access them from anywhere.&lt;/p&gt;

&lt;p&gt;But… AWS always has a way of humbling you.&lt;/p&gt;

&lt;p&gt;🙃 Reality Check #1: Just uploading data to S3 wasn’t enough—I had to make sure my bucket was configured correctly to allow access.&lt;br&gt;
🙃 Reality Check #2: AWS has strict security settings (which is good, but also frustrating when you just want something to work).&lt;/p&gt;

&lt;p&gt;After some troubleshooting (and a few Google searches), I got my S3 bucket set up and successfully stored my first weather data file. Step 2? Done. ✅&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: The Unexpected Challenge—S3 Permissions&lt;/strong&gt; 🔐&lt;/p&gt;

&lt;p&gt;This is where I hit my first real DevOps problem. Even though my data was in S3, I kept getting 403 Forbidden errors when trying to access it. Turns out, S3 buckets are private by default, and I needed to update my bucket policy to allow public read access.&lt;/p&gt;

&lt;p&gt;I went into the AWS console, tweaked my settings, and… still got the same error. 😅&lt;/p&gt;

&lt;p&gt;Cue troubleshooting mode:&lt;br&gt;
✔️ Checked bucket policies&lt;br&gt;
✔️ Disabled “Block Public Access” (the sneaky culprit)&lt;br&gt;
✔️ Updated my object permissions&lt;/p&gt;

&lt;p&gt;After a lot of trial and error, I finally got my data to be publicly accessible. Lesson learned: Security is a key part of cloud computing, and AWS doesn’t mess around.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What I Learned on Day 1&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;🎯 Cloud services are powerful, but security is always a factor&lt;br&gt;
🎯 Permissions &amp;amp; access control take time to get right&lt;br&gt;
🎯 DevOps is all about learning through problem-solving&lt;/p&gt;

&lt;p&gt;By the end of Day 1, I had a working cloud setup—weather data being pulled from an API and stored in AWS S3. &lt;/p&gt;

&lt;p&gt;This was just the beginning, but I already feel like I’m leveling up. 💪&lt;/p&gt;

&lt;p&gt;See you on Day 2! 🚀&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cloud</category>
      <category>python</category>
      <category>aws</category>
    </item>
    <item>
      <title>How I Turned My Resume Website into a Cloud-Powered Project</title>
      <dc:creator>Taylor D Jones</dc:creator>
      <pubDate>Mon, 06 Jan 2025 15:29:20 +0000</pubDate>
      <link>https://forem.com/onetayjones/how-i-turned-my-resume-website-into-a-cloud-powered-project-2427</link>
      <guid>https://forem.com/onetayjones/how-i-turned-my-resume-website-into-a-cloud-powered-project-2427</guid>
      <description>&lt;p&gt;When I first started this project, my resume was just a simple HTML and CSS page sitting in an S3 bucket. But what’s a website without some dynamic elements? I wanted to track how many people visit my site—not just for fun, but as a way to explore AWS serverless technologies. This led me to build a serverless visitor counter using JavaScript, DynamoDB, API Gateway, and AWS Lambda.&lt;/p&gt;

&lt;p&gt;Here’s a breakdown of how I did it and what I learned along the way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Adding JavaScript for the Visitor Counter&lt;/strong&gt; 🖥️&lt;/p&gt;

&lt;p&gt;Since my website is static, I needed JavaScript to fetch and display the visitor count. The idea was simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When someone loads the page, JavaScript requests an API.&lt;/li&gt;
&lt;li&gt;The API retrieves the current visitor count from a database.&lt;/li&gt;
&lt;li&gt;The page updates to show the new count.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Storing Visitor Count in DynamoDB&lt;/strong&gt; 📊&lt;/p&gt;

&lt;p&gt;I needed a database to store the number of visitors, and Amazon DynamoDB was the perfect choice. It’s serverless, scalable, and free for small projects.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Setting Up DynamoDB&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I created a DynamoDB table with:&lt;br&gt;
• Partition Key: id (set to a fixed value like "visitorCounter")&lt;br&gt;
• Attribute: count (integer storing the visitor count)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Building an API with API Gateway &amp;amp; AWS Lambda ⚡&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of letting my JavaScript communicate directly with DynamoDB (which would be a security risk), I built an API using:&lt;br&gt;
•AWS API Gateway (to handle HTTP requests)&lt;br&gt;
•AWS Lambda (Python) (to interact with DynamoDB)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Writing the Lambda Function&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I wrote a Python function that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Retrieves the current visitor count from DynamoDB&lt;/li&gt;
&lt;li&gt;Increments the count&lt;/li&gt;
&lt;li&gt;Updates the database with the new value&lt;/li&gt;
&lt;li&gt;Returns the updated count as a JSON response&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Connecting API Gateway to Lambda&lt;/strong&gt; 🌐&lt;/p&gt;

&lt;p&gt;Next, I needed to create an API Gateway to expose this Lambda function as a REST API.&lt;/p&gt;

&lt;p&gt;API Gateway Setup&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new API Gateway (REST API).&lt;/li&gt;
&lt;li&gt;Create a GET endpoint (e.g., /visitor-count).&lt;/li&gt;
&lt;li&gt;Connect it to the Lambda function.&lt;/li&gt;
&lt;li&gt;Enable CORS so my JavaScript can make requests from the browser.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Automating Deployments with AWS SAM&lt;/strong&gt; ⚙️&lt;/p&gt;

&lt;p&gt;Instead of manually setting up DynamoDB, API Gateway, and Lambda every time, I used AWS Serverless Application Model (SAM) to define everything as code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Automating CI/CD with GitHub Actions&lt;/strong&gt; 🚀&lt;/p&gt;

&lt;p&gt;To make my project automatically update whenever I push changes, I set up GitHub Actions:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;CI/CD for Backend&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When I push changes to my Lambda function or API, GitHub Actions runs my Python tests.&lt;/li&gt;
&lt;li&gt;If the tests pass, the SAM application automatically deploys to AWS.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;CI/CD for Frontend&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When I update index.html, styles.css, or script.js, GitHub Actions uploads the new files to my S3 bucket.&lt;/li&gt;
&lt;li&gt;It then invalidates the CloudFront cache, so visitors see the latest version instantly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Final Thoughts: What I Learned&lt;/strong&gt; 🎓&lt;/p&gt;

&lt;p&gt;This project provided great hands-on experience in serverless development. Some key takeaways:&lt;/p&gt;

&lt;p&gt;✅ JavaScript is powerful—even on a static site, you can create dynamic elements with APIs.&lt;br&gt;
✅ DynamoDB is an easy-to-use NoSQL database, perfect for lightweight projects.&lt;br&gt;
✅ AWS Lambda + API Gateway makes it simple to build serverless APIs.&lt;br&gt;
✅ Infrastructure as Code (AWS SAM) is a game-changer—no more manual setup!&lt;br&gt;
✅ CI/CD with GitHub Actions ensures my site stays up-to-date automatically.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>Cloud-Ready Resume: HTML to AWS ☁️</title>
      <dc:creator>Taylor D Jones</dc:creator>
      <pubDate>Thu, 19 Dec 2024 18:38:44 +0000</pubDate>
      <link>https://forem.com/onetayjones/cloud-ready-resume-html-to-aws-4e9f</link>
      <guid>https://forem.com/onetayjones/cloud-ready-resume-html-to-aws-4e9f</guid>
      <description>&lt;p&gt;If you’ve ever even thought about dabbling in the world of cloud, you’ve probably heard of the &lt;a href="https://cloudresumechallenge.dev/" rel="noopener noreferrer"&gt;Cloud Resume Challenge&lt;/a&gt;. It’s like this rite of passage for anyone wanting to level up their cloud skills—and honestly, I couldn’t resist giving it a try. Spoiler alert: it was as challenging as it was rewarding!&lt;/p&gt;

&lt;p&gt;At this point in my cloud career I have two AWS certifications under my belt BUT getting your hands dirty is much different than answering exam questions correctly. &lt;/p&gt;

&lt;p&gt;Here's what I did on day one of building my resume on the cloud:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Crafting the Resume in HTML&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first task was straightforward: ditch the Word docs and PDFs and embrace HTML. I broke my resume into clean, semantic HTML sections—header, main content, and footer. Each section represented an essential part of my professional journey, from my work experience to my education and skills.&lt;/p&gt;

&lt;p&gt;What stood out? Writing a resume in HTML reminded me of how structure matters. I had to think about not just what I wanted to say but how to present it logically for both users and browsers. Simplicity, meet power.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Adding Style with CSS&lt;/strong&gt;&lt;br&gt;
Next up was CSS—basically the magic that turns plain functionality into something beautiful. I had so much fun with this part! I kept the design simple but polished, focusing on clean typography, a pop of color for the headings, and nice, even spacing to keep everything looking organized.&lt;/p&gt;

&lt;p&gt;I’ve always loved designing, so it was exciting to play around with styles and see how small changes could completely transform the page. Even a little CSS goes a long way to take raw HTML from “meh” to something that feels professional and put together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Deploying a Static Website with S3&lt;/strong&gt;&lt;br&gt;
Here’s where things started to get real. I uploaded my HTML and CSS files to an Amazon S3 bucket and set it up as a static website. Sure, I could’ve gone the easy route with GitHub Pages or Netlify, but the whole point was to dive into AWS and really learn how it all works.&lt;/p&gt;

&lt;p&gt;Seeing my work go live was such a cool moment—knowing it’s running on the same infrastructure that powers massive companies. Plus, I got to dig into how AWS S3 operates behind the scenes, which was both challenging and super rewarding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Securing with HTTPS via CloudFront&lt;/strong&gt;&lt;br&gt;
Security is non-negotiable, so I set up Amazon CloudFront to serve my static site over HTTPS. It was my first time working with a CDN (Content Delivery Network) to distribute content securely and quickly.&lt;/p&gt;

&lt;p&gt;There was a learning curve here, especially configuring the SSL certificate and linking everything correctly. But seeing that padlock icon in the browser? Totally worth it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Custom Domain with DNS&lt;/strong&gt;To give my resume a professional edge, I registered a custom domain and pointed it to my CloudFront distribution using Route 53. Setting up DNS records was a bit like solving a puzzle, but the satisfaction of accessing my resume at _techwithtay.click _made it all worthwhile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters?&lt;/strong&gt;&lt;br&gt;
This project wasn’t just about writing a resume—it was about showcasing technical skills in a practical way. It tested my understanding of front-end development, cloud deployment, and web security. Plus, it felt amazing to see a tangible result after a full day of learning.&lt;/p&gt;

&lt;p&gt;If you’re thinking of taking on a similar challenge, go for it! You’ll come away with more than a resume—you’ll have a project that proves your ability to learn, build, and execute.&lt;/p&gt;

&lt;p&gt;Have you ever built your resume in the cloud? Let’s talk tech! 🌐&lt;/p&gt;

</description>
      <category>cloudresumechallenge</category>
      <category>aws</category>
      <category>learning</category>
      <category>cloud</category>
    </item>
    <item>
      <title>AWS Lex: Building a Language Translation Bot</title>
      <dc:creator>Taylor D Jones</dc:creator>
      <pubDate>Thu, 14 Nov 2024 22:20:25 +0000</pubDate>
      <link>https://forem.com/onetayjones/aws-lex-building-a-language-translation-bot-4plm</link>
      <guid>https://forem.com/onetayjones/aws-lex-building-a-language-translation-bot-4plm</guid>
      <description>&lt;p&gt;Overview of the Project ☁️&lt;br&gt;
If you've ever needed a quick translation while chatting with someone, then a language translation chatbot might be just the thing! In this project, I decided to build a bot with Amazon Lex that can translate phrases on the fly. It’s a relatively simple concept—type in a word or sentence, select the language you want it translated to, and voilà! The bot responds with the translated phrase. While working on it, I encountered a few challenges (spoiler alert: slots and intents can be tricky!), but the learning experience was well worth it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps to Building the Translation Bot&lt;/strong&gt; 👩🏽‍💻&lt;br&gt;
Here's a breakdown of the steps, along with a few notes on what I struggled with:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creating an Empty Chatbot&lt;/strong&gt;&lt;br&gt;
I started with a clean slate in Amazon Lex by creating a new bot. The setup felt straightforward, though I knew this was just the beginning!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specifying Intents and Slots&lt;/strong&gt;&lt;br&gt;
This was where things got interesting. The intent is basically the action the bot should take (in this case, translating text). Slots are like the pieces of information needed to complete that action—like the phrase to translate and the target language. Getting the slot configurations to work just right was more challenging than I expected. I had to be precise with formatting; if anything was off, Lex wouldn’t understand what I wanted, and I'd get error messages or unexpected behaviors.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tip:&lt;/em&gt; Make sure the slot types and the order align with what Lex expects. Sometimes, I’d double-check, only to realize one small formatting error was causing issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specify Fulfillment&lt;/strong&gt;&lt;br&gt;
This step defines what happens once the user has provided all the necessary information. In this case, the bot needed to call AWS Lambda to handle the translation request by interfacing with Amazon Translate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create an IAM Role&lt;/strong&gt;&lt;br&gt;
To allow the bot to securely interact with Lambda and Translate, I created an IAM role. This part was more technical, but it’s a vital step to keep everything secure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a Lambda Function&lt;/strong&gt;&lt;br&gt;
Now came the actual coding part! I wrote a Lambda function that takes the user’s phrase and the desired language and sends a request to Amazon Translate. Lambda returns the translated result, which the bot then outputs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test the Lambda Function&lt;/strong&gt;&lt;br&gt;
I wanted to make sure the function worked correctly on its own before testing it with Lex. Running a few test cases, I realized I needed to debug and fine-tune the code to ensure the translations were accurate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing the Chatbot&lt;/strong&gt;&lt;br&gt;
Finally, I integrated everything in the Lex console and tested the bot. This was the most exciting part because it meant seeing the bot in action! Testing revealed a few things I needed to fix, but seeing it work was rewarding.&lt;/p&gt;

&lt;p&gt;AWS Services Used 🛠&lt;br&gt;
Here’s a quick rundown of the AWS services I used:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Amazon Lex&lt;/strong&gt;&lt;/em&gt;: The platform for building and configuring the chatbot and defining the conversation flow.&lt;br&gt;
&lt;strong&gt;&lt;em&gt;AWS Lambda&lt;/em&gt;&lt;/strong&gt;: Handles the translation request by communicating with Amazon Translate.&lt;br&gt;
&lt;em&gt;&lt;strong&gt;AWS IAM&lt;/strong&gt;&lt;/em&gt;: Manages permissions for secure service interaction.&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Amazon Translate&lt;/em&gt;&lt;/strong&gt;: Performs the actual translation of phrases.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Reflections on the Process&lt;/em&gt;&lt;br&gt;
I didn’t expect formatting slots with intents to be as challenging as it was, but I learned a lot about the precision Lex requires. It's these little details that ultimately make the bot work smoothly. Overall, building this bot helped me understand more about how different AWS services can work together to create functional, interactive applications. If you’re considering a project like this, don’t be discouraged if you hit a few bumps—each step is a learning experience.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Final Thoughts&lt;/em&gt;&lt;br&gt;
Building a language translation bot with Amazon Lex was both rewarding and educational. It’s an amazing introduction to natural language processing, serverless functions, and the AWS ecosystem. If you're curious about cloud-based chatbots, give it a try—you might surprise yourself with what you can build!&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ai</category>
      <category>cloudcomputing</category>
      <category>cloudskills</category>
    </item>
    <item>
      <title>Baddie's Hackathon</title>
      <dc:creator>Taylor D Jones</dc:creator>
      <pubDate>Sun, 25 Feb 2024 01:54:16 +0000</pubDate>
      <link>https://forem.com/onetayjones/baddies-hackathon-5g3</link>
      <guid>https://forem.com/onetayjones/baddies-hackathon-5g3</guid>
      <description>&lt;p&gt;I'm thrilled to dive into my 3rd hackathon adventure, and this time it's all about those Baddie Buildathon vibes! But hey, this isn't your average hackathon – we're on a mission to tackle some serious global issues faced by women, from gender-based violence to fair pay and healthcare access. And guess what? We're pulling out all the stops, delving into the realms of AI, Blockchain, and 5G networks to cook up some seriously innovative solutions.&lt;/p&gt;

&lt;p&gt;Teaming up with a crew of awesome women from Texas, Cali, and India, I'm taking on the roles of UX/UI magician and frontend wiz for the next couple of weeks. This week's been all about jazzing up our project with color schemes and whipping up wireframes. And tomorrow, it's full speed ahead with mockups, aiming to have our prototype ready to roll by Tuesday. &lt;/p&gt;

&lt;p&gt;I can't wait to see where this wild ride takes us. Let's hack for a change! ✨👩🏽‍💻&lt;/p&gt;

</description>
      <category>hackathon</category>
      <category>beginners</category>
      <category>react</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Ruby Array Methods</title>
      <dc:creator>Taylor D Jones</dc:creator>
      <pubDate>Thu, 22 Feb 2024 00:40:05 +0000</pubDate>
      <link>https://forem.com/onetayjones/ruby-array-methods-5e2m</link>
      <guid>https://forem.com/onetayjones/ruby-array-methods-5e2m</guid>
      <description>&lt;p&gt;Let's talk about Ruby's array methods... but first, what is an array?&lt;/p&gt;

&lt;p&gt;Arrays are dynamic collections of elements, capable of storing any data type and adjusting in size as needed. With built-in methods for sorting, iteration, and transformation, arrays in Ruby offer flexibility and efficiency for managing collections of data.&lt;/p&gt;

&lt;p&gt;Here are some methods demonstrating some of Ruby array's versatility:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.sample&lt;/strong&gt;&lt;br&gt;
This method returns a random element (or elements) from the array. Here are some examples: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fde98qh2p1lazb1rgpd9b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fde98qh2p1lazb1rgpd9b.png" alt=".sample code sample" width="800" height="115"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we want multiple elements:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbayiu2vdy5x3cf74iesv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbayiu2vdy5x3cf74iesv.png" alt=".sample code sample with multiple elements" width="800" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.sort&lt;/strong&gt;&lt;br&gt;
This method returns a new array with the elements of the original array but it sorts the elements of the array in ascending order. Let's see this method in action:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv5jdzweo3xvet3qusft9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv5jdzweo3xvet3qusft9.png" alt=".sort code sample" width="800" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.count&lt;/strong&gt;&lt;br&gt;
Ruby's .count returns the number of elements in the array that meet certain conditions. It also returns the number of elements in a list, when given no arguments. If given an argument, returns the number of times that argument occurs in the array. In these instances, this method returns an &lt;strong&gt;Integer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpuyo8e0nndi552tgd5s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpuyo8e0nndi552tgd5s.png" alt="simple .count code sample" width="778" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fng2rnqsg0yvsdnm899q1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fng2rnqsg0yvsdnm899q1.png" alt="complex .count code sample" width="414" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.push&lt;/strong&gt;&lt;br&gt;
This method adds one or more elements to the end of any Array and returns a modified array. For example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fejooyj72c5xu17otzl06.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fejooyj72c5xu17otzl06.png" alt=".push code sample" width="800" height="110"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.at&lt;/strong&gt;&lt;br&gt;
This method takes in an Integer argument and returns the element in the specified index of an Array. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkjostkx0j10zj90wdane.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkjostkx0j10zj90wdane.png" alt=".at code sample" width="652" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.join&lt;/strong&gt;&lt;br&gt;
You can think of this method as the inverse of String's .split method. It combines the elements of the array into a single string, separated by a specified delimiter. Here are some examples of using these different delimiters:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3mgh5yxct5brf3oqvzx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3mgh5yxct5brf3oqvzx.png" alt=".join code samples" width="768" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, there are other array methods such as .sum, .min &amp;amp; .max, and .include. I hope these have been helpful for your Ruby learning journey.&lt;/p&gt;

&lt;p&gt;Until next time, Happy Coding!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>ruby</category>
    </item>
    <item>
      <title>Ruby String Methods</title>
      <dc:creator>Taylor D Jones</dc:creator>
      <pubDate>Wed, 14 Feb 2024 20:18:58 +0000</pubDate>
      <link>https://forem.com/onetayjones/ruby-string-methods-4p49</link>
      <guid>https://forem.com/onetayjones/ruby-string-methods-4p49</guid>
      <description>&lt;p&gt;Today I was working mainly with Ruby strings. It still surprises me how many of these methods cross over into Javascript, although they have different names. Let's explore some of the essentials Ruby string methods and what they do:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.reverse&lt;/strong&gt;&lt;br&gt;
This method returns a new string with the characters in reverse order. For example: &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkrp0gnuiltuxhgg301dj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkrp0gnuiltuxhgg301dj.png" alt="Ruby's .reverse method example" width="616" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.upcase&lt;/strong&gt;&lt;br&gt;
returns a new string with all characters converted to uppercase. Example:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm51t788xr6hnkokoketi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm51t788xr6hnkokoketi.png" alt=".upcase method example" width="596" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.downcase&lt;/strong&gt;&lt;br&gt;
returns a new string with all characters converted to lowercase. Example:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjyfexvar0shbyy2edfhn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjyfexvar0shbyy2edfhn.png" alt=".downcase method example" width="626" height="148"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.swapcase&lt;/strong&gt;&lt;br&gt;
returns a new string with uppercase characters converted to lowercase and vice versa. Example:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F95txpgybncxlbi9izkjp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F95txpgybncxlbi9izkjp.png" alt="I.swapcase method example" width="790" height="148"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.capitalize&lt;/strong&gt;&lt;br&gt;
This method returns a new string with the first character converted to uppercase and the rest to lowercase. Example:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frhwgbngse2z1tfxtbyn8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frhwgbngse2z1tfxtbyn8.png" alt=".capitalize method example" width="774" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.strip&lt;/strong&gt;&lt;br&gt;
returns a new string with leading and trailing whitespace removed. For example:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flpdtqxzsy2gqn2fs432e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flpdtqxzsy2gqn2fs432e.png" alt=".strip method example" width="622" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.gsub&lt;/strong&gt;&lt;br&gt;
returns used for global substitution, replacing all occurrences of a pattern in a string with another string. For example:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr3gir1fd98wb4gk7hku9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr3gir1fd98wb4gk7hku9.png" alt=".gsub method example" width="698" height="140"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Until next time, happy coding!&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rubymethods</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Ruby Revelations: A beginner's journey</title>
      <dc:creator>Taylor D Jones</dc:creator>
      <pubDate>Tue, 13 Feb 2024 23:17:03 +0000</pubDate>
      <link>https://forem.com/onetayjones/ruby-revelations-a-beginners-journey-64a</link>
      <guid>https://forem.com/onetayjones/ruby-revelations-a-beginners-journey-64a</guid>
      <description>&lt;p&gt;I've been learning Ruby fundamentals for about a week or so. While I was nervous about taking on a new programming language, I found this one to be easier and more readable than Javascript.&lt;/p&gt;

&lt;p&gt;In other words, I'm enjoying learning this language! &lt;/p&gt;

&lt;p&gt;Today my learning was all about strings in Ruby, it was quite an enlightening day for several reasons. One, the methods used are similar to Javascript, so I don't feel like I'm learning something entirely new. And two, seeing the differences between the two languages.&lt;/p&gt;

&lt;p&gt;So here's some things I learned:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strings are objects.&lt;/strong&gt; This means they come with a plethora of built-in methods and functionalities that can be very useful. From simple manipulations to complex transformations, Ruby offers a lot of tools to work with. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;String interpolation&lt;/strong&gt; It's a feature that allows me to embed Ruby code within a string, making it convenient to insert variables and expressions directly into the text. This not only streamlines my code but also makes it more readable and expressive.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, using the '#{}' syntax seamlessly integrates variables into my strings. This adds flexibility to the code but also opens up possibilities for creating dynamic, data-driven applications.&lt;/p&gt;

&lt;p&gt;3.&lt;strong&gt;String manipulation&lt;/strong&gt; Whether it's through concatenation, slicing, or using various built-in methods like 'upcase', 'downcase', or 'reverse', there are many ways to manipulate a string. Each of these methods serves a unique purpose, allowing me to tailor my string manipulations to suit my specific needs.&lt;/p&gt;

&lt;p&gt;As I continue to explore Ruby, I'm excited to see how I can leverage these new skills to build even more robust and dynamic applications in the future.&lt;/p&gt;

&lt;p&gt;Until next time, happy coding!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
