<?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>DEV Community: timDeHof</title>
    <description>The latest articles on DEV Community by timDeHof (@timdehof).</description>
    <link>https://dev.to/timdehof</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%2F618460%2F1a68cb07-128f-4458-a8dc-5ae18ccd71de.png</url>
      <title>DEV Community: timDeHof</title>
      <link>https://dev.to/timdehof</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/timdehof"/>
    <language>en</language>
    <item>
      <title>ReelWatch - Movie Watchlist</title>
      <dc:creator>timDeHof</dc:creator>
      <pubDate>Mon, 12 Jun 2023 01:55:51 +0000</pubDate>
      <link>https://dev.to/timdehof/reelwatchmovie-watchlist-3o1n</link>
      <guid>https://dev.to/timdehof/reelwatchmovie-watchlist-3o1n</guid>
      <description>&lt;h1&gt;
  
  
  ReelWatch: &lt;a href="https://appwrite.io/"&gt;Appwrite&lt;/a&gt; &lt;a href="https://hashnode.com/"&gt;Hashnode&lt;/a&gt; Hackathon
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Team Details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://blog.timdehof.dev/"&gt;Tim&lt;/a&gt;: That's me. I built this all by myself.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About This Project
&lt;/h2&gt;

&lt;p&gt;As an avid movie enthusiast, I have always been captivated by the enchanting world of cinema and the art of storytelling. I take great pleasure in exploring diverse genres, discovering emerging directors, and relishing the excitement of watching my beloved actors on the grand screen. Despite my passion for movies, the vast array of options often leaves me feeling overwhelmed and struggling to keep track of all the films that intrigue me. Therefore, I created a meticulously curated movie watchlist, featuring all the movies that have caught my eye, piqued my curiosity, or stirred my emotions.&lt;/p&gt;

&lt;p&gt;The version I'm submitting for the Appwrite Hackathon is a work in progress and not the final version. My aim with this watchlist was to create a simple and efficient tool to keep track of my movie choices, create shareable viewing schedules, and ensure that I never forget a great film suggestion from my friends.&lt;/p&gt;

&lt;p&gt;To facilitate a public demo, some features such as a shared viewing schedule are currently unavailable. However, I have implemented user authorization, which allows friends and family to access my watchlist and add their movie recommendations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://nextjs.org/"&gt;Next.js&lt;/a&gt; - The main framework used to build the web app, including the client-side and server-side logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://react.dev/"&gt;React&lt;/a&gt; - The main library used to build the UI components of the web app, including the search bar, movie cards, and watchlist.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://tailwindcss.com/"&gt;Tailwind CSS&lt;/a&gt; - The main CSS framework used to style the UI components of the web app, providing a consistent style and layout.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://axios-http.com/docs/intro"&gt;Axios&lt;/a&gt; - The main HTTP client used to make API requests to the TMDB API, providing movie data to update the UI components with the movie information.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://appwrite.io/"&gt;Appwrite Cloud&lt;/a&gt; - The main backend as a service platform used to store user watchlists, providing authentication, storage, and retrieval of watchlists.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.typescriptlang.org/"&gt;TypeScript&lt;/a&gt; - a superset of JavaScript that adds static typing to the language. It was used to add type annotations to the codebase and catch type-related errors during development.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.npmjs.com/package/uuid"&gt;UUID&lt;/a&gt; - a library used to generate unique identifiers. It was used to generate unique IDs for each movie in the watchlist.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://eslint.org/"&gt;ESLint&lt;/a&gt; - a linter used to enforce coding standards and catch syntax errors. It was used to maintain code quality and consistency throughout the project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://prettier.io/"&gt;Prettier&lt;/a&gt; - a code formatter used to enforce a consistent code style. It was used to format the codebase according to a predefined set of rules.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://vercel.com/home"&gt;Vercel&lt;/a&gt; - for automatic deployment from GitHub repo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Challenges I Faced
&lt;/h2&gt;

&lt;p&gt;One of the exciting challenges I encountered while working on this project was designing the database schema. Although I typically work with relational databases like Postgres, I had the opportunity to explore a new approach because Appwrite Cloud did not yet support relations at the time. This presented an opportunity to think creatively and design a general watchlist table that allowed all logged-in users to add movies to the watchlist. By embracing this challenge, I was able to expand my skills and learn new ways of approaching database design. I was able to come up with the following attributes&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---EsgfkGO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1686535529970/efb2d802-c9df-4f93-8d37-25dae1aae93b.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---EsgfkGO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1686535529970/efb2d802-c9df-4f93-8d37-25dae1aae93b.jpeg" width="800" height="691"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another exciting challenge I encountered while working on this project was implementing pagination for the TMDB API to fetch movie data for the keyword search. Although both the TMDB API and Appwrite's databases use page-based pagination to retrieve results, I had the opportunity to explore the different approaches and determine the best option for this project. With the TMDB API, the client must make additional API requests to retrieve additional pages of the results, which can be time-consuming and inefficient. However, with Appwrite databases, the client can use offset pagination or cursor pagination to divide data into discrete pages, which can be more efficient and user-friendly. After careful consideration, I decided to use offset pagination with Appwrite &lt;code&gt;Query.limit()&lt;/code&gt; and &lt;code&gt;Query.offset()&lt;/code&gt; functions, which allowed me to easily paginate the watchlist and present the data to the user in a user-friendly way. By embracing this challenge, I was able to expand my skills and learn new ways of approaching pagination in web development.&lt;/p&gt;

&lt;p&gt;In conclusion, using Appwrite Cloud for your backend as a service needs can provide numerous benefits, such as easy user authentication, secure storage of user data, and efficient pagination of large datasets. With Appwrite's powerful API, you can easily integrate backend functionality into your web app, allowing you to focus on building a great user experience. By embracing the challenges of this project and using Appwrite Cloud, I was able to learn new approaches to database design and pagination that expanded my skills and improved the overall functionality of the web app. If you're interested in learning more about Appwrite Cloud and how it can benefit your project, I highly encourage you to visit their website and sign up for a free account today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Public Code Repo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/timDeHof/movie-nextjs-app"&gt;https://github.com/timDeHof/movie-nextjs-app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to poke around! This project was a learning experience, especially with typescript and next.js. By all means, submit a PR if you see something you think can be improved upon. I am never too afraid to learn something new.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo Link
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://reelwatch.vercel.app/"&gt;https://reelwatch.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To access the movie database, users need to log in with their credentials. Upon successful login, a JWT token is generated and stored in the local storage, which initiates a session. To end the session, users can log out, which removes the token from the local storage. Adding movies to the watchlist is a breeze. Users can enter a search phrase in the search field to get a list of search results. After selecting a movie from the list, users can visit the movie's page, where they can add the movie to their watchlist or visit the movie's homepage. Once the process is complete, users are redirected back to the search page to continue searching. Please note that only 25 users are allowed to authenticate for this open-source demo. However, I have pre-populated the database with some of my favorite movies, so feel free to explore and enjoy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Actionshots of the Reelwatch application
&lt;/h2&gt;

&lt;h3&gt;
  
  
  User Authorization:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xwDKOZnl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1686532401247/9eb66508-52f3-4e8b-8a42-425d89c9ada8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xwDKOZnl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1686532401247/9eb66508-52f3-4e8b-8a42-425d89c9ada8.gif" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0K0lnUOV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1686532452743/f2d7b8aa-b56b-42da-8d4c-95d7e7833a45.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0K0lnUOV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1686532452743/f2d7b8aa-b56b-42da-8d4c-95d7e7833a45.gif" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---YQYL_gM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1686532494367/d09e48f2-4028-4ca9-849d-89e00edfa175.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---YQYL_gM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1686532494367/d09e48f2-4028-4ca9-849d-89e00edfa175.gif" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Search for movies:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/lMjZFyX1cdpISnFMhn/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/lMjZFyX1cdpISnFMhn/giphy.gif" width="480" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Add a movie to your watchlist:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xGb40Uj8thK1dgPuOA/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xGb40Uj8thK1dgPuOA/giphy.gif" width="480" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Find it in the Watchlist:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/7R5KQpK7ijulQePE15/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/7R5KQpK7ijulQePE15/giphy.gif" width="480" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion:
&lt;/h2&gt;

&lt;p&gt;As the developer of ReelWatch, I'm thrilled to share this meticulously curated movie watchlist with fellow movie enthusiasts. The app provides a simple and efficient tool for tracking movie choices, creating shareable viewing schedules, and ensuring that great film suggestions are never forgotten. While the app is still a work in progress and needs some refinement, I'm excited to continue improving it. Currently, some features such as a shared viewing schedule are unavailable, but user authorization has been implemented, allowing friends and family to access the watchlist and add their movie recommendations. The app's tech stack includes Next.js, React, Tailwind CSS, Axios, Appwrite Cloud, TypeScript, UUID, ESLint, Prettier, and Vercel. Throughout the development process, I faced challenges such as designing the database schema and implementing pagination for the TMDB API. However, I embraced these challenges and used Appwrite Cloud to expand my skills and improve the app's overall functionality. ReelWatch is a great example of how Appwrite Cloud can benefit your backend as a service needs, providing easy user authentication, secure storage of user data, and efficient pagination of large datasets. I'm excited to continue working on ReelWatch and improving it for movie enthusiasts everywhere.&lt;/p&gt;

</description>
      <category>react</category>
      <category>appwriteio</category>
    </item>
    <item>
      <title>Unraveling the Mystery of an Empty API Response in Axios - A Debugging Adventure</title>
      <dc:creator>timDeHof</dc:creator>
      <pubDate>Wed, 08 Mar 2023 03:26:38 +0000</pubDate>
      <link>https://dev.to/timdehof/unraveling-the-mystery-of-an-empty-api-response-in-axios-a-debugging-adventure-3k70</link>
      <guid>https://dev.to/timdehof/unraveling-the-mystery-of-an-empty-api-response-in-axios-a-debugging-adventure-3k70</guid>
      <description>&lt;p&gt;React Query is a popular library for fetching and caching data in React applications. It's designed to work with APIs and handle network requests in a way that makes it easy for developers to build scalable and fast web applications. But sometimes things don't go as planned, and unexpected bugs can arise. In this post, we'll take a look at a common issue that can occur when using React Query and show you how to debug and solve it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Imagine you have a React component that uses React Query to fetch data from an API and display it. You're getting the data for page 2 of the API, but for page 3, the data is missing. In the network tab of your browser's dev tools, you see that the response for page 3 is an empty array, but the response for page 2 is correct. This is a common issue that can occur when using React Query, and it can be difficult to determine the root cause.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debugging the Issue
&lt;/h2&gt;

&lt;p&gt;The first step in debugging this issue is to take a look at the code that's making the API call. In our case, it's the &lt;code&gt;getIssues&lt;/code&gt; function. This function is using the &lt;code&gt;axios&lt;/code&gt; library to make the API request and pass the response to React Query.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export async function getIssues(
  page: number,
  projectId?: string | undefined,
  options?: { signal?: AbortSignal }
) {
  const { data } = await axios.get&amp;lt;Page&amp;lt;Issue&amp;gt;&amp;gt;(ENDPOINT, {
    params: projectId ? { page, projectId } : { page },
    signal: options?.signal,
  });

  if (projectId === undefined) {
    return data;
  } else {
    data.items = data.items.filter((item) =&amp;gt; item.projectId === projectId);
  }
  return data;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see from the code above, the function is using the &lt;code&gt;projectId&lt;/code&gt; parameter to filter the results. If the projectId is not specified, the function returns the raw data with no filtering. However, if the projectId is specified, the function filters the data to only include objects with a matching projectId. There are several approaches that you can use to troubleshoot this issue:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Verify the API request: Ensure that the API endpoint URL and the request parameters are correct. You can use tools such as Postman to make API requests and check the response.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inspect API response: Use the browser's DevTools to inspect the API response and check if it contains the expected data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Debug the API call: You can add logging statements or breakpoints in your code to track the API request and response.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check API status: Verify that the API is up and running and that you have the necessary permissions to access the data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Try a different API endpoint: If the API request returns an unexpected result, try a different endpoint or API to get the data.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's also important to keep in mind that the API response might be correct, and the issue could be with the way the data is processed or displayed in the frontend. In this case, you might need to debug the front-end code or check the data structures and types in your code.&lt;/p&gt;

&lt;p&gt;Anyway, I chose to add logging statements to the code to track the API request and response. Here are some logging statements that I added to help debug my &lt;code&gt;getIssues&lt;/code&gt; function:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Logging the URL and the parameters being passed to &lt;code&gt;axios.get&lt;/code&gt; to make sure that the correct URL and parameters are being used.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(`URL: ${ENDPOINT}`);
console.log(`Params: ${JSON.stringify(projectId ? { page, projectId } : { page })}`);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Logging the response object and the error object to see if the API call is returning the expected data or if there are any errors.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(`Response: ${JSON.stringify(data)}`);
console.log(`Error: ${JSON.stringify(error)}`);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Logging the value of &lt;code&gt;projectId&lt;/code&gt; to make sure it is the value I expected.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(`projectId: ${projectId}`);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These statements will give me more information about what is happening in the function and hopefully help me to identify the issue.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export async function getIssues(
  page: number,
  projectId?: string | undefined,
  options?: { signal?: AbortSignal }
) {
  const { data } = await axios.get&amp;lt;Page&amp;lt;Issue&amp;gt;&amp;gt;(ENDPOINT, {
    params: projectId ? { page, projectId } : { page },
    signal: options?.signal,
  });
  console.log(`URL: ${ENDPOINT}`);
  console.log(`projectId: ${projectId}`);
  console.log(`Params: ${JSON.stringify(projectId ? { page, projectId } : { page })}`);
  console.log(`Response: ${JSON.stringify(data.items)}`);
  console.error(`Error: ${JSON.stringify(Error)}`);

  if (projectId === undefined) {
    console.log('items: ', data.items)
    return data;
  } else {
    data.items = data.items.filter((item) =&amp;gt; item.projectId === projectId);
    console.log("filtered items: ", data.items)
  }
  return data;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By examining the console in the dev tools, I discovered that &lt;code&gt;projectId&lt;/code&gt; for page 2 is undefined, whereas &lt;code&gt;projectId&lt;/code&gt; for page 3 is blank or an empty string.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;After examining the code, it's clear that the issue is related to the &lt;code&gt;if (projectId === undefined) { return data; }&lt;/code&gt; statement. This statement only returns the data if the &lt;code&gt;projectId&lt;/code&gt; is undefined, but what if it's an empty string? In this case, it would be handled by the &lt;code&gt;else { data.items = data.items.filter((item) =&amp;gt; item.projectId === projectId); }&lt;/code&gt; statement, which made the empty string go through the filtering step and setting the &lt;code&gt;data.items&lt;/code&gt; response to an empty array for page 3.&lt;/p&gt;

&lt;p&gt;To fix this issue, I needed to update the &lt;code&gt;if&lt;/code&gt; statement to return the data if the &lt;code&gt;projectId&lt;/code&gt; value is either undefined or an empty string.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (projectId === undefined || projectId === '') { return data; }

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this change, the &lt;code&gt;getIssues&lt;/code&gt; function will now return the data in both cases, even if the &lt;code&gt;projectId&lt;/code&gt; is an empty string. In addition, I was able to render the data on the website and pass the end-2-end testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In conclusion, debugging an issue with an empty response from an API call can be a challenging task, especially when the issue is in the data retrieval function. However, by using the appropriate logging statements and carefully examining the logs, we were able to identify the root cause of the issue and resolve it by updating our code.&lt;/p&gt;

&lt;p&gt;As a self-learner, this experience has taught me the importance of being able to effectively debug issues and the value of having a systematic approach when solving problems. I hope this post has been helpful to those who are also looking to improve their debugging skills and that it has inspired you to continue learning and growing as a developer.Happy coding!&lt;/p&gt;

&lt;p&gt;If you found this post helpful, I would love to hear from you! Feel free to share your thoughts and feedback in the comments section below. Let's continue to learn and grow together as a community of self-learners!&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>react</category>
      <category>axios</category>
      <category>api</category>
    </item>
    <item>
      <title>Unleash the Power of Java - A JavaScript Developer's Guide to Best Practices in Java Development</title>
      <dc:creator>timDeHof</dc:creator>
      <pubDate>Sun, 05 Feb 2023 15:51:29 +0000</pubDate>
      <link>https://dev.to/timdehof/unleash-the-power-of-java-a-javascript-developers-guide-to-best-practices-in-java-development-37dm</link>
      <guid>https://dev.to/timdehof/unleash-the-power-of-java-a-javascript-developers-guide-to-best-practices-in-java-development-37dm</guid>
      <description>&lt;p&gt;As a JavaScript developer diving into the world of Java, I've observed several keys differences in best practices and conventions. In this post, I'll share my insights on object-oriented programming, code style and formatting, and exception handling in Java.&lt;/p&gt;

&lt;h2&gt;
  
  
  Object-Oriented Programming
&lt;/h2&gt;

&lt;p&gt;Java is an object-oriented language, where entities and their properties are represented as objects. It also follows the SOLID principles, a set of five guidelines for creating maintainable and scalable software. In contrast, JavaScript is a prototype-based language that uses objects as blueprints for creating new objects.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;getAge&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;getAge&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  A few key differences between Java and JavaScript include:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Class Declaration:&lt;/strong&gt; Java classes are declared with the &lt;code&gt;class&lt;/code&gt; keyword, while JavaScript classes use the &lt;code&gt;class&lt;/code&gt; keyword from ECMAScript 2015 (ES6).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Constructors:&lt;/strong&gt; Java constructors are declared with the &lt;code&gt;public&lt;/code&gt; keyword, followed by the class name and constructor arguments. In JavaScript, constructors are declared with the &lt;code&gt;constructor&lt;/code&gt; keyword and constructor arguments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Access Modifiers:&lt;/strong&gt; Java has access modifiers, such as &lt;code&gt;private&lt;/code&gt;, to control the visibility of class members. JavaScript doesn't have access modifiers, but the &lt;code&gt;_&lt;/code&gt; (underscore) prefix is often used to indicate private properties.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Methods:&lt;/strong&gt; Both Java and JavaScript use the &lt;code&gt;function&lt;/code&gt; keyword to declare methods. In Java, methods are declared inside the class, while in JavaScript, methods are declared inside the class using the &lt;code&gt;methodName()&lt;/code&gt; syntax.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's essential for a JavaScript developer transitioning to Java to understand these differences in class declaration, constructors, access modifiers, and method declaration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Style and Formatting
&lt;/h2&gt;

&lt;p&gt;The Java Community Process defines a well-established coding standard for Java, which includes format, naming conventions, and other coding principles. Adhering to this standard ensures readable, manageable, and consistent code. Java also requires Javadoc comments, concise documentation for classes, methods, and variable definitions.&lt;/p&gt;

&lt;p&gt;In comparison, JavaScript doesn't have a strict coding standard, although it does have widely accepted code style guides like the &lt;a href="https://github.com/airbnb/javascript"&gt;Airbnb JavaScript Style Guide&lt;/a&gt; and the &lt;a href="https://standardjs.com/"&gt;JavaScript Standard Style&lt;/a&gt;. These guides provide recommendations for code formatting and naming conventions, but they are not as strictly enforced as the Java coding standard.&lt;/p&gt;

&lt;p&gt;By following a strict coding standard and focusing on code readability and maintainability, Java development prioritizes high-quality, well-organized code. This is especially important for large projects where code maintenance and updates are crucial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exception Handling
&lt;/h2&gt;

&lt;p&gt;Java has a robust exception handling mechanism to handle errors and exceptions in a program. In contrast, JavaScript relies on try-catch blocks or custom error objects to handle errors, which can become complex in larger projects with multiple errors. Java provides a range of built-in exceptions and encourages developers to catch and handle exceptions as early as possible.&lt;/p&gt;

&lt;p&gt;Here's an example of Java's built-in exceptions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExceptionExample&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;divide&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
      &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ArithmeticException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cannot divide by zero!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, the &lt;code&gt;divide&lt;/code&gt; method checks if the denominator &lt;code&gt;b&lt;/code&gt; is equal to zero, and if so, it throws an &lt;code&gt;ArithmeticException&lt;/code&gt; when the divisor &lt;code&gt;b&lt;/code&gt; is zero. The exception is then caught in the &lt;code&gt;main&lt;/code&gt; method using a &lt;code&gt;try-catch&lt;/code&gt; block. The catch block handles the exception by printing a user-friendly error message, that includes the exception message that was thrown in the &lt;code&gt;divide&lt;/code&gt; method.&lt;/p&gt;

&lt;p&gt;And here's an example of error handling in JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cannot divide by zero!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, the divide() function will throw a custom error when the divisor &lt;code&gt;b&lt;/code&gt; is zero. The &lt;code&gt;try-catch&lt;/code&gt; block will catch this error and print the error message.&lt;/p&gt;

&lt;p&gt;I hope these examples give you a better understanding of the differences between Java and JavaScript's exception handling mechanisms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning Resources
&lt;/h2&gt;

&lt;p&gt;Learning a new programming language can be an exciting, but challenging experience. Here are a few resources that can help you on your journey to learning Java:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.oracle.com/en/java/"&gt;Official Java Documentation&lt;/a&gt;: The official Java documentation is a comprehensive resource that covers all aspects of the language, from the basics to advanced topics. It's a great place to start for anyone new to Java.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Online Courses: Online platforms such as Udemy, Coursera, and edX offer a wide range of Java courses, both paid and free, that can help you get up to speed quickly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Books: There are many excellent books available on Java, ranging from beginner-friendly introductions to more advanced topics. Some popular options include "&lt;a href="https://amzn.to/3kPDTiP"&gt;Head First Java&lt;/a&gt;" and "&lt;a href="https://amzn.to/3Hr6Ycf"&gt;Effective Java&lt;/a&gt;", Which can be found on Amazon.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Java Community: The Java community is large and vibrant, with many forums and resources available to help you learn and troubleshoot. Consider joining online communities, such as Stack Overflow, for additional support.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These resources can help you get started on your journey to learning Java, but the most important thing is to keep practicing and building your skills. Good luck!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;To summarize, Java and JavaScript are both influential and commonly utilized programming languages, yet they possess significant distinctions in terms of programming methods, code style and formatting, exception handling and type systems. Java boasts a strong and standardized development environment that prioritizes code comprehensibility, upkeep and stability, while JavaScript affords a more adaptable and dynamic ecosystem that enables more imaginative and pioneering development. As a JavaScript developer moving to Java, it is crucial to comprehend these differences and familiarize oneself with the standard practices and conventions applied in Java development.&lt;/p&gt;

&lt;p&gt;In conclusion, embrace the learning process of transitioning from JavaScript to Java and experience the benefits of Java's robust and standardized development environment. Start your journey today!"&lt;/p&gt;

</description>
      <category>java</category>
      <category>javascript</category>
      <category>learning</category>
    </item>
    <item>
      <title>From Mechanical Design Engineer to Fullstack Developer - My Journey and Lessons Learned</title>
      <dc:creator>timDeHof</dc:creator>
      <pubDate>Thu, 22 Dec 2022 19:43:40 +0000</pubDate>
      <link>https://dev.to/timdehof/from-mechanical-design-engineer-to-fullstack-developer-my-journey-and-lessons-learned-2556</link>
      <guid>https://dev.to/timdehof/from-mechanical-design-engineer-to-fullstack-developer-my-journey-and-lessons-learned-2556</guid>
      <description>&lt;h2&gt;
  
  
  From the Halls of Mechanical Design to the Fields of Full-stack Development
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/smW5FBep69d3q/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/smW5FBep69d3q/giphy.gif" width="500" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I spent many years in the halls of mechanical design, learning the ins and outs of 3D modeling, 3D printing, and product development. But when I decided to make a career change and become a full-stack developer, I faced a whole new set of challenges and opportunities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seeking the One True Coding Bootcamp
&lt;/h2&gt;

&lt;p&gt;I set out on a quest to find the one true coding bootcamp that would guide me on my journey to becoming a full-stack developer. I spent many long hours scouring the land, researching different options and seeking the counsel of wise mentors. Finally, I found the path that seemed right for me and I enrolled in the program, determined to master the skills and technologies I needed to succeed. The road ahead was steep and challenging, but I was resolute in my purpose and I threw myself into the program with all my might. Through hard work and determination, I began to develop the skills I needed to embark on my new career.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mastering the Technologies of Web Development
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/ZQCRCYU6t8HmM/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/ZQCRCYU6t8HmM/giphy.gif" width="485" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During my time at the coding bootcamp, I set out on a quest to master the various languages and technologies involved in full-stack development. Through diligent study and practice, I was able to quickly get up to speed on HTML, CSS, and JavaScript, the essential front-end technologies that are used to build the user interface of a web application.&lt;/p&gt;

&lt;p&gt;But my journey did not end there. I also delved into the deeper mysteries of server-side development, learning about powerful technologies such as Express.js and Node.js. These languages required a deeper understanding of concepts such as databases and APIs, but with the guidance of my instructors and the aid of my fellow travelers, I was able to master them as well.&lt;/p&gt;

&lt;p&gt;Along the way, I encountered many useful tools and frameworks that helped me on my journey. One such tool was React.js, a powerful library for building user interfaces. With its help, I was able to create dynamic and interactive web applications that truly impressed my peers.&lt;/p&gt;

&lt;p&gt;Overall, I feel that the coding bootcamp was a great adventure that helped me master the technologies and skills needed to be a successful full-stack developer. I am confident that the knowledge and experience I gained will serve me well as I continue my journey through the tech industry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Work in the Coding Bootcamp
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/RlZO2mKipB3u8/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/RlZO2mKipB3u8/giphy.gif" width="500" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During the coding bootcamp, I had the opportunity to undertake a great quest: the creation of a full-stack e-commerce website project, which we called Galactic Pawn. This project was a group capstone, designed to test our skills and simulate a remote team environment. We used the web development and full-stack technologies we had learned in the program to build the website, wielding powerful tools such as React, NodeJS, Express, and PostgreSQL. Later, I successfully deployed the website to &lt;a href="http://Render.com" rel="noopener noreferrer"&gt;Render.com&lt;/a&gt; and the database to &lt;a href="http://Bit.io" rel="noopener noreferrer"&gt;Bit.io&lt;/a&gt;, using the magic of Prisma and JWT.&lt;/p&gt;

&lt;p&gt;The website included a login and registration page, as well as a main store page that allowed users to create an account and add items to their cart. One of the challenges of the project was integrating all of the different routes and technologies to create a cohesive and functional website. However, with the help of our wise instructors and by working effectively as a team, we were able to overcome this challenge and complete the project to the satisfaction of all.&lt;/p&gt;

&lt;p&gt;If you'd like to see the results of our labors, you can check out the live demo &lt;a href="https://capstone-galactic-pawn.onrender.com/" rel="noopener noreferrer"&gt;here&lt;/a&gt; or view the Git repo &lt;a href="https://github.com/PawnShop-at-the-end-of-the-galaxy/PawnShop-Galaxy" rel="noopener noreferrer"&gt;here&lt;/a&gt;. This group capstone project was a great opportunity for us to apply the skills and knowledge we had gained during the coding bootcamp and work collaboratively with our fellow classmates. I am proud of what we were able to accomplish together and grateful for the experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Search for the Full-Stack Developer Role
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/HVr4gFHYIqeti/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/HVr4gFHYIqeti/giphy.gif" width="500" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Upon graduating from the coding bootcamp, I set out on a quest to find a full-stack developer role. I knew this would be no easy feat, as I was new to the field and would face many challenges along the way.&lt;/p&gt;

&lt;p&gt;I began by updating my resume and LinkedIn profile, polishing them like a shining sword for the battles ahead. I also reached out to my connections in the tech industry, seeking any leads or guidance that might aid me on my journey.&lt;/p&gt;

&lt;p&gt;I applied for a variety of roles, from entry-level positions to more experienced developer roles. The job search process can be a treacherous path, but I was determined to find the right opportunity.&lt;/p&gt;

&lt;p&gt;One thing that helped me stand out to potential employers was my background as a mechanical design engineer. Many companies are seeking developers with a diverse skill set, and my experience in product development and 3D modeling was a unique selling point for me.&lt;/p&gt;

&lt;p&gt;I also made sure to highlight the skills I learned at the coding bootcamp, including my proficiency in front-end and server-side technologies, as well as my ability to work effectively in a team. I included specific examples of projects I worked on and problems I solved during the program, which helped to demonstrate my abilities and potential value to a company.&lt;/p&gt;

&lt;p&gt;Despite my efforts, I have yet to find a full-stack developer role. But I remain persistent and proactive in my search, continuing to network and build connections in the tech industry. I believe the right opportunity will come to me in due time. I encourage other aspiring full-stack developers to stay the course and make the most of any networking opportunities that come their way. The journey may be long and arduous, but the reward will be worth it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sharpening Valuable Soft Skills
&lt;/h2&gt;

&lt;p&gt;As I journeyed from the halls of mechanical design to the fields of full-stack development, I sharpened a number of valuable soft skills that are essential for success in the tech industry. These include effective communication, collaboration, and problem-solving abilities. With these skills honed to a fine edge, combined with my expertise in 3D modeling and product development, I am confident that I will be a valuable asset to any team.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/AnTdtqwJSzW5W/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/AnTdtqwJSzW5W/giphy.gif" width="500" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looking back on my journey, I have learned a few key lessons. First, it is important to be proactive and seek out opportunities to learn and grow, like a warrior seeking to hone their skills. Second, networking and building connections are essential, like forging alliances with powerful allies. And finally, it is important to stay positive and persistent, even when the job search is challenging, like a steadfast hero on a quest.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Road Ahead
&lt;/h2&gt;

&lt;p&gt;As we gaze into the horizon and plan our next journey, it is clear that transitioning from a mechanical design engineer to a full-stack developer is no simple task. However, with the right skills, connections, and knowledge of industry trends, we can conquer this challenge and reap the rewards of a successful career in the tech industry.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/2XflxzGoMXkpe9bvyk8/giphy-downsized-large.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/2XflxzGoMXkpe9bvyk8/giphy-downsized-large.gif" width="480" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let us embrace the road ahead, stay vigilant and sharp, and never lose sight of our goals. For it is through hard work, determination, and the forging of new connections that we will find our path to victory in this brave new world of full-stack development.&lt;/p&gt;

</description>
      <category>careerchange</category>
      <category>fullstack</category>
      <category>react</category>
      <category>learning</category>
    </item>
    <item>
      <title>How to deploy the Face Recognition API for free with Render - Alternative To Heroku</title>
      <dc:creator>timDeHof</dc:creator>
      <pubDate>Tue, 20 Dec 2022 15:39:08 +0000</pubDate>
      <link>https://dev.to/timdehof/how-to-deploy-the-face-recognition-api-for-free-with-render-alternative-to-heroku-4m3o</link>
      <guid>https://dev.to/timdehof/how-to-deploy-the-face-recognition-api-for-free-with-render-alternative-to-heroku-4m3o</guid>
      <description>&lt;p&gt;This would benefit people doing ZTM Academy's "Complete Web Developer in 2023: Zero to Mastery" course. If you are interested in this project and the course, then become a &lt;a href="https://zerotomastery.io/" rel="noopener noreferrer"&gt;member of Zero To Mastery.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This article focuses on ZTM Academy's "The Complete Web Developer in 2023" course. Following up on the Face Recognition Project, the course demonstrates how to upload to Heroku. Due to the company's generous free tier expired on November 28, 2022, consumers must now buy a subscription plan from Heroku. This article teaches how to deploy the server API onto &lt;a href="https://render.com/" rel="noopener noreferrer"&gt;Render&lt;/a&gt;. It's a free alternative to Heroku with a similar easy deployment process.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So, let's get started.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Do Before Deploying
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Sign into your render account &lt;a href="https://dashboard.render.com/register?next=/" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Copy or generate your &lt;strong&gt;authorization/personal access token&lt;/strong&gt; from Clarifai API&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Create a render database
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Click the "New PostgreSQL" button on the PostgreSQL card in the dashboard or the "New +" button in the header next to your profile image after logging in. &lt;br&gt;
On click, you will see the following screen: &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%2Fgteddqajgl8yg83ivwfc.jpg" 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%2Fgteddqajgl8yg83ivwfc.jpg" alt="New PostgreSQL" width="800" height="842"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can give your database a memorable name.&lt;br&gt;
The database name and user name cannot be changed after creation. If you omit them, Render will generate random values for them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the &lt;code&gt;Create Database&lt;/code&gt; button and you will be presented with the following screen:&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%2F2lm3lpsouznl41vwo5p8.jpg" 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%2F2lm3lpsouznl41vwo5p8.jpg" alt="Connections" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copy/Write down your database's &lt;strong&gt;hostname, port, username, database&lt;/strong&gt; from the database page. We will need to enter this into our &lt;code&gt;server.js&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Setup for connecting to the database in the API
&lt;/h2&gt;

&lt;p&gt;For security reasons, I installed the &lt;a href="https://www.npmjs.com/package/dotenv" rel="noopener noreferrer"&gt;dotenv&lt;/a&gt; npm package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install dotenv --save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, in the root, create a file called '.env' that will need to be added to the '.gitignore' file before committing to your git repo.&lt;/p&gt;

&lt;p&gt;In the &lt;code&gt;.env&lt;/code&gt; file, input the &lt;strong&gt;Clarifai api key&lt;/strong&gt; and &lt;strong&gt;your database password&lt;/strong&gt; like shown:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;your&lt;/span&gt; &lt;span class="nx"&gt;database&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="nx"&gt;API_CLARIFAI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;your&lt;/span&gt; &lt;span class="nx"&gt;clarifai&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In your &lt;code&gt;server.js&lt;/code&gt;, add to the top:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, you need to change the &lt;code&gt;connection:&lt;/code&gt; options in the &lt;code&gt;knex&lt;/code&gt; module to your database's &lt;strong&gt;hostname, port, username, database&lt;/strong&gt; like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;knex&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;{your database hostname}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;{your database username}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;{your database database}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5432&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;process.env.DB_PASSWORD&lt;/code&gt; would come from your &lt;code&gt;.env&lt;/code&gt; file&lt;/p&gt;

&lt;p&gt;If you did the optional gRPC Clarifai API, you can change the&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;authorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Key {YOUR_CLARIFAI_API_KEY}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;authorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`Key &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;API_CLARIFAI&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Connect to the database
&lt;/h2&gt;

&lt;p&gt;In the course, you learn how to use PSequel to connect to the  database. But I like to use Postico which is similar, here are the steps I follow.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;First, open Postico and click on the &lt;code&gt;New Favorite&lt;/code&gt; button in the bottom left corner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the &lt;code&gt;New Favorite&lt;/code&gt; window, enter the connection details for your database. This includes the host, port, user, password, and database name. Check the &lt;code&gt;Save in Keychain&lt;/code&gt; box.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once you have entered the connection details, click on the "Connect" button to establish a connection to the database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the connection is successful, you will see a list of your databases in the left-hand panel. Click the database you want to connect to, which should appear to the right.&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%2Fbmtrrolv894c4maoi25n.jpg" 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%2Fbmtrrolv894c4maoi25n.jpg" alt="Screen showing connected database in Postico" width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once you are connected to the database, you can explore the tables and data within it using the tabs below the main window. You can also run SQL queries using the query editor located above your database in the left panel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To disconnect from the database, simply click on the &lt;code&gt;X&lt;/code&gt; button in the top left corner.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Overall, Connecting to a database using Postico is a simple process. By following these steps, you can easily access and manipulate your database data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy the API as a Web Service
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Select &lt;code&gt;Web Service&lt;/code&gt; from the &lt;code&gt;New +&lt;/code&gt; dropdown in the Render Dashboard.&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%2F023z9wz7rkt70fmx8mj0.jpg" 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%2F023z9wz7rkt70fmx8mj0.jpg" alt="render dashboard with web service in dropdown" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the API github repository to deploy from. You'll need to connect your Github account to Render if you haven't already. Public and private repositories are also supported.&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%2F2ihifmo0lbs4mgluetha.jpg" 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%2F2ihifmo0lbs4mgluetha.jpg" alt="Select the API github repository" width="800" height="784"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Specify the following. Render will auto populate some values with the best guess on your code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Name&lt;/code&gt;: A name for your Web Service&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Environment&lt;/code&gt;: Node&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Region&lt;/code&gt;: This needs to be the same region as your 
render database&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Branch&lt;/code&gt;: The git branch to build&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Build Command&lt;/code&gt;: npm i or npm install&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Start Command&lt;/code&gt;: node server.js&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Plan&lt;/code&gt;: Choose from the available plans.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Advanced&lt;/code&gt;: you can specify environment variables here&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;code&gt;Create Web Service&lt;/code&gt;. Once the build completes, your service starts, and it is listening on a port, you can connect to the service. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;By default, Render uses Nodes version &lt;code&gt;14.17.0&lt;/code&gt;. &lt;br&gt;
Follow the procedures in this &lt;a href="https://render.com/docs/node-version" rel="noopener noreferrer"&gt;link&lt;/a&gt; to customize it for your app.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's been a long road, but you've finally made it to the end of this article. Now go ahead and finish up that project you've been working on. And don't forget to host it using Render, the free and easy-to-use alternative to Heroku.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and happy coding!&lt;/p&gt;

</description>
      <category>emptystring</category>
    </item>
    <item>
      <title>The Power of a Growth Mindset in Software Development - How to Embrace Challenges and Advance Your Career</title>
      <dc:creator>timDeHof</dc:creator>
      <pubDate>Tue, 13 Dec 2022 02:53:49 +0000</pubDate>
      <link>https://dev.to/timdehof/the-power-of-a-growth-mindset-in-software-development-how-to-embrace-challenges-and-advance-your-career-122b</link>
      <guid>https://dev.to/timdehof/the-power-of-a-growth-mindset-in-software-development-how-to-embrace-challenges-and-advance-your-career-122b</guid>
      <description>&lt;p&gt;In today's fast-paced world of technology, having a growth mindset is a crucial aspect of success in the field of software development. A growth mindset focuses on the belief that intelligence and abilities can be developed through effort and learning, allowing individuals to embrace challenges and continuously improve their skills. In this blog post, we will explore the benefits of having a growth mindset for learning and career advancement in software development, and provide tips for developing and maintaining this mindset.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a growth mindset?
&lt;/h2&gt;

&lt;p&gt;A growth mindset is the belief that intelligence and abilities can be developed through effort and learning. This mindset focuses on growth and improvement, rather than viewing challenges and failures as setbacks. In contrast, a fixed mindset sees intelligence and abilities as fixed and unchangeable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZaznuBap--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1670890520645/ElQ0xSRxV.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZaznuBap--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1670890520645/ElQ0xSRxV.jpg" alt="a photo of displaying what a growth mindset looks like created by Paula Piccard" width="640" height="576"&gt;&lt;/a&gt;&lt;em&gt;"A growth mindset is needed for #4IR Shift the negative to positive 💡 #entrepreneur #DigitalTransformation #startup #innovation #fintech #insurtech #thinkbigsundaywithmarsha Cc @Clagett @SpirosMargaris @kimgarst @psb_dc @leimer @Paula_Piccard @" by Paula Piccard is marked with CC0 1.0.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How a growth mindset can improve learning and career advancement in software development
&lt;/h2&gt;

&lt;p&gt;Having a growth mindset is a powerful tool for learning and success in the field of software development. It allows individuals to embrace challenges and failures as opportunities for growth and learning, rather than viewing them as setbacks. This mindset also encourages seeking out new knowledge and skills in order to improve and advance in the field. Additionally, having a growth mindset fosters a collaborative and supportive learning environment within a team, allowing team members to support and encourage each other in their growth and success. Overall, a growth mindset is a crucial tool for success in the ever-changing world of software development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Developing and maintaining a growth mindset
&lt;/h2&gt;

&lt;p&gt;Developing and maintaining a growth mindset takes time and effort, but it is a crucial aspect of success in the field of software development. Here are some strategies for cultivating a growth mindset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Practice self-reflection and self-assessment to identify areas for growth and improvement&lt;/li&gt;
&lt;li&gt;Seek out feedback from others and use it to guide your learning and development&lt;/li&gt;
&lt;li&gt;Take on challenges and new experiences, even if they may be difficult or uncomfortable&lt;/li&gt;
&lt;li&gt;Surround yourself with supportive and growth-minded individuals who can inspire and motivate you&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z9u7ndJv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1670891239075/Pb64QutWn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z9u7ndJv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1670891239075/Pb64QutWn.jpg" alt="a photo of a business workshop taken by Sebastiaan ter Burg" width="640" height="427"&gt;&lt;/a&gt;&lt;em&gt;"Design A Better Business Workshop @ Zoku Amsterdam" by Sebastiaan ter Burg is licensed under CC BY 2.0.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Maintaining a growth mindset can also be challenging, especially when faced with setbacks and failures. Here are some tips for maintaining a growth mindset in the face of challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reframe failures as opportunities for growth and learning&lt;/li&gt;
&lt;li&gt;Celebrate small victories and progress along the way&lt;/li&gt;
&lt;li&gt;Keep a positive attitude and stay motivated by setting goals and tracking your progress&lt;/li&gt;
&lt;li&gt;Seek support and guidance from others who can help you stay on track and maintain a growth mindset.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In conclusion, having a growth mindset is a crucial aspect of success in the field of software development. It allows individuals to embrace challenges and continuously improve their skills, leading to success and career advancement. By developing and maintaining a growth mindset, individuals can foster a collaborative and supportive learning environment and achieve their full potential in the field of software development.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hxLOaSBK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1670891597897/mu5-vQrpj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hxLOaSBK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1670891597897/mu5-vQrpj.jpg" alt="30849315227_aa1a127376_z.jpg" width="640" height="427"&gt;&lt;/a&gt;&lt;em&gt;"Successful and happy business team" by Rawpixel Ltd is licensed under CC BY 2.0.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To start cultivating a growth mindset and advance your career in software development, try implementing the strategies and tips outlined in this post. Surround yourself with supportive and growth-minded individuals, take on new challenges, and practice self-reflection and self-assessment. With a growth mindset, you can unlock your full potential and succeed in the exciting world of software development.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>growthmindset</category>
      <category>personalgrowth</category>
      <category>beginners</category>
    </item>
    <item>
      <title>A Roadmap for Transferring Skills from Mechanical Design Engineering to Fullstack Development</title>
      <dc:creator>timDeHof</dc:creator>
      <pubDate>Mon, 12 Dec 2022 00:29:22 +0000</pubDate>
      <link>https://dev.to/timdehof/a-roadmap-for-transferring-skills-from-mechanical-design-engineering-to-fullstack-development-5fbg</link>
      <guid>https://dev.to/timdehof/a-roadmap-for-transferring-skills-from-mechanical-design-engineering-to-fullstack-development-5fbg</guid>
      <description>&lt;p&gt;As a mechanical design engineer, you have developed a wealth of knowledge and expertise that can be applied to a career in fullstack development. By following this roadmap, you can successfully transfer your skills and achieve success in this exciting and rapidly-growing field.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt; : Analyze your existing skills and knowledge, and identify which ones are most relevant to fullstack development. Some transferable skills include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Problem-solving and critical thinking&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Technical skills, such as proficiency in CAD software&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Attention to detail and accuracy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ability to work independently and as part of a team&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Strong communication and collaboration skills.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt; : Develop any additional knowledge or skills that may be required for fullstack development, such as programming languages or web development frameworks. There are many resources available to help you learn these skills, such as online courses, workshops, and conferences. Invest in your education and professional development to continue growing and excelling as a fullstack developer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt; : Apply your skills to real-world projects. This may involve working on personal projects, participating in hackathons, or contributing to open-source projects. Some examples of real-world projects to showcase your skills include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building a personal website or blog&lt;/li&gt;
&lt;li&gt;Developing a web application for a local business or organization&lt;/li&gt;
&lt;li&gt;Contributing to an open-source project on GitHub&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt; : Continuously learn and grow in your career as a fullstack developer. The field of fullstack development is constantly evolving, so it is important to stay up-to-date with the latest technologies and best practices.&lt;/p&gt;

&lt;p&gt;By following this roadmap and transferring your skills from mechanical design engineering to fullstack development, you can achieve success and advance your career. Start your journey today and take the first step towards a rewarding career as a fullstack developer.&lt;/p&gt;

</description>
      <category>career</category>
      <category>realworld</category>
      <category>skills</category>
      <category>fullstack</category>
    </item>
    <item>
      <title>Becoming a Self-Learner - Tips and Strategies for Personal and Professional Growth</title>
      <dc:creator>timDeHof</dc:creator>
      <pubDate>Sat, 10 Dec 2022 15:01:28 +0000</pubDate>
      <link>https://dev.to/timdehof/becoming-a-self-learner-tips-and-strategies-for-personal-and-professional-growth-51h2</link>
      <guid>https://dev.to/timdehof/becoming-a-self-learner-tips-and-strategies-for-personal-and-professional-growth-51h2</guid>
      <description>&lt;p&gt;Are you looking to grow and develop your skills, but feeling stuck or unsure of how to make progress? One key to unlocking your potential as a learner is to make the choice to be a self-learner. Here are a few strategies to help you get started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set specific, challenging goals that push you to improve and provide a clear roadmap for your learning journey. For example, aim to improve by at least 1% each day and track your progress over time.&lt;/li&gt;
&lt;li&gt;Identify when you are most productive and give yourself dedicated time to study during those times. For instance, if you find that you are most focused and energized in the morning, set aside a dedicated block of time for learning first thing each day.&lt;/li&gt;
&lt;li&gt;Adopt a growth mindset and reframe obstacles as opportunities for growth and learning. Instead of seeing failures as setbacks, view them as valuable learning experiences that bring you closer to your goals.&lt;/li&gt;
&lt;li&gt;Take advantage of available resources, such as online courses, books, podcasts, and mentors, to supplement your learning and gain new perspectives.&lt;/li&gt;
&lt;li&gt;Practice self-reflection and regularly evaluate your progress to identify areas for improvement and adjust your approach as needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By implementing these strategies and making the choice to be a self-learner, you can unlock your potential and achieve your goals. So, what are you waiting for? Take the first step towards becoming a self-learner and start shifting your focus to long-term learning today. With the right mindset and approach, the sky's the limit for your personal and professional growth!&lt;/p&gt;

</description>
      <category>selflearning</category>
      <category>productivity</category>
      <category>growthmindset</category>
      <category>selfimprovement</category>
    </item>
  </channel>
</rss>
