<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Gaël Thomas - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Gaël Thomas - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 23 May 2026 16:26:54 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/author/gaelgthomas/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ One Step at a Time: My Journey from Full-time Software Engineer to First Indie Project ]]>
                </title>
                <description>
                    <![CDATA[ Introduction: The Spark of Indie Hacking I’m Gaël, a 25-year-old software engineer who’s been working in a startup environment in Southeast Asia for a few years. 🌏  Working remotely has its perks, and while hopping from one exotic location to anothe... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/from-full-time-software-engineer-to-first-indie-project/</link>
                <guid isPermaLink="false">66bb92030eaca026d8cfa5e9</guid>
                
                    <category>
                        <![CDATA[ Career development  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Entrepreneurship ]]>
                    </category>
                
                    <category>
                        <![CDATA[ personal development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gaël Thomas ]]>
                </dc:creator>
                <pubDate>Mon, 01 Apr 2024 19:33:07 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2024/03/Blog-Banner-Final.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <h2 id="heading-introduction-the-spark-of-indie-hacking">Introduction: The Spark of Indie Hacking</h2>
<p>I’m Gaël, a 25-year-old software engineer who’s been working in a startup environment in Southeast Asia for a few years. 🌏 </p>
<p>Working remotely has its perks, and while hopping from one exotic location to another, I’ve been nurturing a little dream: to kick-start my journey as a solopreneur.</p>
<p>I genuinely love my job—there’s a certain thrill in startup life that I think everyone should experience at least once. Sure, it’s a rollercoaster of highs and lows, but it's where I've learned the ropes of product development and caught the bug for making things people love (and will hopefully pay for!). I often think of coding as adult LEGO—endless possibilities and just plain fun. 🤓</p>
<p>After two years of nomadic life, I chose to plant my feet firmly on the ground to strike a better work-life balance and finally carve out time for my side projects. </p>
<p>But here’s the kicker: settling down didn’t magically make time appear. Between the 9-5 grind and weekend exhaustion, I struggled to find the energy and belief needed to start something of my own.</p>
<h2 id="heading-choosing-the-right-tools-for-the-journey">Choosing the Right Tools for the Journey</h2>
<p>Embarking on this solopreneur journey, I decided to harness the tools and technologies I was already familiar with: HTML, CSS, Tailwind, JavaScript, along with React and Next.js for creating websites. </p>
<p>This choice was not just about comfort but was also about applying best practices in web development that I've learned over a few years of experience.</p>
<p>In the following sections, I'll explain why I chose these particular technologies. I'll also provide guidance on how you can select the most suitable tools for your own projects, balancing learning curves, productivity, and project requirements. </p>
<p>Expect to find practical tips and lessons from my hands-on experience, which you can apply to enhance your coding skills or streamline your development process.</p>
<h2 id="heading-realizing-the-need-for-change">Realizing the Need for Change</h2>
<p>Until recently, my daily routine was disordered. I juggled work with late-night phone scrolling sessions until 1-2 AM, only waking just in time for a hurried breakfast before starting my day. </p>
<p>Frequent use of food delivery apps led to overeating and unhealthy habits, which, despite my overall good life, I knew wasn’t sustainable. </p>
<p>I was trapped in a cycle, fearing that cutting back on my late nights would reduce my life to just work, work, and work. 💻</p>
<p>Then, something clicked a month ago. Motivated by all the recommendations I've seen about going to the gym, I contacted a personal trainer and started my first few sessions. Initially skeptical about lifting weights, I was surprised by the surge in energy it brought me.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/03/CleanShot-2024-03-26-at-09.17.21@2x.png" alt="Image" width="600" height="400" loading="lazy">
<em>"Talking to my therapist today" - @levelsio on X (Twitter)</em></p>
<p>This burst of energy triggered a chain reaction: I began paying more attention to my diet, choosing healthier, lighter meals. Sleep, too, became a priority. Influenced by the insights from "Why We Sleep" I transformed my sleep routine, targeting eight hours a night. This shift turned my mornings from a rush into a peaceful, productive time. 😴</p>
<p>Now, a month later, these practices have almost become natural. Waking up earlier, I feel more energized, and I've discovered precious time in the morning before work.</p>
<h3 id="heading-how-improved-health-boosts-coding-productivity">How Improved Health Boosts Coding Productivity</h3>
<p>For those on a coding journey or balancing work with learning new skills, I cannot stress enough the importance of good sleep and regular exercise. These aren’t just lifestyle choices – they are essential tools for enhancing your cognitive function and focus.</p>
<p>After integrating better sleep and exercise into my routine, I noticed a significant improvement in my coding productivity. I was able to learn faster, stay focused for more extended periods, and tackle complex problems with more clarity. It felt like unlocking a cheat code for my brain!</p>
<p>Coding is an exciting yet demanding journey. With the additional energy gained from these changes, you'll be more equipped to face the challenges and joys of learning how to code.</p>
<h2 id="heading-taking-the-first-step-booksbymood">Taking the First Step: BooksByMood</h2>
<p>The concept for BooksByMood had been developing in my mind for months, inspired by Mood2Movie, an app developed by <a target="_blank" href="https://twitter.com/marc_louvion">Marc Lou</a>. </p>
<p>The idea of finding books based on your mood captivated me, and I envisioned a platform with my own twist on design and suggestions. This marked the beginning of my indie project journey with BooksByMood. 📚</p>
<p>Getting started on this new journey was daunting. My Twitter feed was full of stories of polished apps and good earnings, which heightened my stress and anxiety about starting. At that time, I didn't fully realize that we all have to start somewhere, and even the well-known people out there started at the beginning one day. </p>
<p>To manage my expectations and focus, I established clear, achievable goals:</p>
<ul>
<li>To create a straightforward website centered around a single, compelling feature.</li>
<li>To keep the website free, ensuring accessibility and user engagement (IMO, also easier to get started with–particularly as a 1st project).</li>
<li>To dedicate a week to learning promotion techniques, aiming to drive traffic to the site.</li>
</ul>
<p>These goals weren’t just milestones – they were my commitment to myself to prove that I could bring an idea to fruition and attract visitors. 🎯</p>
<h3 id="heading-how-i-chose-my-technical-stack">How I Chose My Technical Stack</h3>
<p>As mentioned earlier, I utilized technologies I was proficient in: HTML, CSS, JavaScript, along with Tailwind for styling and Next.js for the framework. I chose this stack for its familiarity and efficiency.</p>
<p>I specifically opted for Next.js due to its convenient features:</p>
<ul>
<li>server-side rendering and static site generation, leading to improved website performance</li>
<li>the file-based routing system</li>
<li>various optimizations such as website navigation using the <code>&lt;Link&gt;</code> component or the <code>&lt;Image&gt;</code> component</li>
<li>it's great for SEO</li>
<li>overall it helps craft a better user experience</li>
</ul>
<p>This stack allowed me to rapidly prototype and deploy, enhancing the site's performance without additional effort.</p>
<p><strong>Takeaways:</strong> Stick to technologies you know well when validating an idea quickly. This approach helps you move faster and focus on the project's core value. That's why you can find many solopreneurs online using the same technologies for years (for example, <a target="_blank" href="https://twitter.com/levelsio">Pieter Levels</a> is using HTML, CSS, JS (with JQuery) and PHP for years).</p>
<h2 id="heading-app-development-process-and-challenges">App Development Process and Challenges</h2>
<p>The journey of developing BooksByMood was iterative, starting with a basic, barely functional version. </p>
<p>I encountered several challenges, such as sourcing reliable book data and crafting a user-friendly interface. Overcoming these obstacles required research, trial and error, and continuous iteration.</p>
<h3 id="heading-challenge-1-finding-reliable-books-data">Challenge 1: Finding Reliable Books Data</h3>
<p>Finding a dependable source for book data was unexpectedly challenging.</p>
<p>I initially wanted to use some APIs. Unfortunately, Goodreads closed its API on December 8th, 2020. OpenLibrary was not bad, but the data needed to be more consistent. Google Books API was alright, but I would have also curated manually in the end, and sometimes some info could have been better.</p>
<p>This made me realize that it's hard to find a good books API out there (probably due to Amazon owning Goodreads and making sure it's hard for competitors to have good data as they do).</p>
<p>There was one thing I knew: it'd be complex to satisfy everyone with the recommendations, but I could do my best. My best was to ensure that what was recommended was well rated by the community (for example, it had a good rating on Goodreads).</p>
<p>You may wonder what will happen in the future, if the website is growing? In that case, it'll definitely need improvement. But, for a first release, it does the trick!</p>
<p><strong>Takeaways:</strong> When facing a challenge on a new project, always take your time to consider all options and find the right balance between shipping fast, quality and reliability. </p>
<p>As an example, I'm 95% sure that curating books manually in JSON files with the help of AI has been a great choice. It resulted in shipping in a reasonable time, only showing books liked by the community, and controlling the data (for example, cover, title, description, tags, authors, and so on).</p>
<h3 id="heading-challenge-2-designing-a-user-friendly-interface">Challenge 2: Designing a user-friendly interface</h3>
<p>As a full stack developer who's been working on the backend for a while, designing an appealing front end was my second major hurdle. Ensuring the site was not only functional but also aesthetically pleasing was crucial for user engagement.</p>
<p>I'm still in the process of learning about design, and it's far from perfect. But I discovered <a target="_blank" href="https://dribbble.com/">Dribbble</a> and it's been a great place to get inspiration. Also, I've been using <a target="_blank" href="https://excalidraw.com/">Excalidraw</a> to sketch an initial layout version showing how I'd like to organize the information.</p>
<p><strong>Takeaways:</strong> For non-designers, drawing inspiration from design-focused platforms like Dribbble can be incredibly helpful. Combining this with UI component libraries, like <a target="_blank" href="https://daisyui.com/">DaisyUI</a>, can significantly enhance the design process, making it more effective.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/03/Build-in-Public-Day-1.png" alt="Image" width="600" height="400" loading="lazy">
<em>Initial sketch of BooksByMood on Excalidraw (shared for my 1st day of #buildinpublic)</em></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/03/CleanShot-2024-03-30-at-15.56.46@2x.png" alt="Image" width="600" height="400" loading="lazy">
<em>1st version of BooksByMood</em></p>
<h2 id="heading-releasing-the-app">Releasing the App</h2>
<p>With the extra time my new morning routine afforded me, I devoted 1-2 hours each weekday and additional weekend time to developing BooksByMood. After a week of focused effort, I opted for a soft launch: I added the project on Twitter by updating my bio link.</p>
<p>The following day marked the beginning of more assertive promotion across various platforms, including Twitter, Reddit, and HackerNews. ✍️</p>
<p><strong>Takeaways:</strong> Feel free to release your project everywhere you can. It can sound scary, but you never know what will happen. Doing that will help you in many ways, such as starting to attract visitors, getting feedback, getting backlinks, and so on. There's nothing to lose!</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/03/CleanShot-2024-03-28-at-21.52.59@2x.png" alt="Image" width="600" height="400" loading="lazy">
<em>BooksByMood Homepage</em></p>
<h2 id="heading-learning-and-growing-early-lessons-from-the-journey">Learning and Growing: Early Lessons from the Journey</h2>
<h3 id="heading-personal-and-business-lessons">Personal and Business Lessons</h3>
<p>It might sound a bit cliché, but these points have genuinely resonated with me:</p>
<ul>
<li><strong>Believe in Yourself</strong>: Doubt was a constant companion, but taking the leap showed me the importance of faith in my ability to turn an idea into reality.</li>
<li><strong>Ship That Idea:</strong> After all, there could be only positives in doing so. Releasing a product, no matter how small, is a victory in itself.</li>
<li><strong>Building Publicly Is Rewarding</strong>: Engaging with the Indie Hackers community has been a blast. Their support and encouragement have been pivotal, making the process not just about building a product but also about being part of an inspiring collective.</li>
<li><strong>Believe in the Internet’s Magic</strong>: Sharing my project on HackerNews was a leap into the unknown. To my astonishment, we hit the first page, and the influx of visitors exceeded my expectations. Indeed, the internet can work wonders, turning small actions into significant impacts.</li>
</ul>
<h3 id="heading-technical-lessons">Technical lessons</h3>
<p>On the technical front, the project has been a rich source of learning:</p>
<ul>
<li><strong>Choosing the Right Stack</strong>: Leveraging familiar technologies like Next.js and React facilitated a smoother development process and quicker iterations. This really underscored the importance of choosing the right tools for the job. I've said it many times in this article: <em>Use what you know</em>. Don't try to overthink using the latest shiny technology. I'd advise you to focus on your product, not how it's being built.</li>
<li><strong>Data Handling and AI Utilization</strong>: The challenge of sourcing reliable book data forced me to consider solutions, including using AI for content curation. This experience highlighted the need for flexibility and creativity in problem-solving. Sometimes, in tech, you'll not find exactly what you want, and you'll have to evaluate potential tradeoffs to find alternatives.</li>
<li><strong>Design for the User</strong>: As a backend-focused developer, delving into front-end design was challenging. But prioritizing user experience and employing design resources like Dribbble for inspiration proved crucial in creating an engaging interface. Also, don't be too worried about your design. Your first version will probably be "ugly," but over time and iterations, you'll start having something visually pleasing. Everything takes time!</li>
<li><strong>Iterative Development</strong>: Start with a minimal viable product with only one focused feature. It's tempting for a developer to add many features, such as a dark mode, a user account, fancy filters, and so on, but that's unnecessary. Instead, use your technical skills to make that one feature work perfectly.</li>
</ul>
<p>To wrap up this reflection, I can’t emphasize enough the satisfaction of crafting a project, releasing it, and seeing people using it. It’s an amazing experience that I recommend to everyone. If you’ve been sitting on an idea, stop overthinking and start building it now. 🚧</p>
<h2 id="heading-looking-ahead-the-road-to-indie-hacking">Looking Ahead: The Road to Indie Hacking</h2>
<p>I plan to stay committed to the indie hacking path for the upcoming months, balancing it alongside my 9-5 job. </p>
<p>A vast landscape of knowledge awaits me, especially in areas like design and marketing, where my experience is limited. Objectively, I know it's not gonna be easy. Yet, the idea of acquiring new skills is exciting. 🎨</p>
<p>The Indie Hackers community has been a goldmine of insights, with members generously sharing their tips and success stories. This collective wisdom, along with a wealth of books and resources, will continue to guide and inspire my journey. 🔖</p>
<p>In the coming months, my focus is on continuous learning and building. I aim to diversify my projects, incorporating paid features to explore different business models and market needs.</p>
<p>Regarding the tech stack, I plan to stick with my current tools, which are versatile enough to meet most of my needs. While I'm open to integrating new libraries like <a target="_blank" href="https://next-auth.js.org/">NextAuth</a> for streamlined authentication processes, my primary focus will be learning marketing. Understanding and getting better at marketing is crucial for any indie hacker, as it's often required to transform a side project into something bigger.</p>
<p>Whether it leads to success or failure, every step forward is one step toward. I'm excited to see where this path will take me and to share the journey's story with you all.</p>
<p><strong>Takeaways:</strong> Your journey should be one of continuous iteration and exploration. While developing your project, never underestimate the power of marketing—it's essential for gaining traction and turning your ideas into reality. To realize your full potential, embrace both the technical and business sides.</p>
<h2 id="heading-conclusion-an-invitation-to-join-the-journey">Conclusion: An Invitation to Join the Journey</h2>
<p>As this chapter of my journey unfolds, I invite you to come along. I'd love to navigate the ups and downs of indie hacking together.</p>
<p><a target="_blank" href="https://twitter.com/gaelgthomas">Join me on Twitter</a> where I share real-time updates, insights, and milestones of this journey, all in the hope of inspiring some of you to embark on your own adventures. 👀</p>
<h2 id="heading-explore-booksbymood">Explore BooksByMood</h2>
<p>Curious about what I’ve been working on? Check out BooksByMood, my first indie project that helps you find books based on your mood. 👇</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://booksbymood.com/">https://booksbymood.com/</a></div>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Web Scraping in JavaScript – How to Use Puppeteer to Scrape Web Pages ]]>
                </title>
                <description>
                    <![CDATA[ Welcome to the world of web scraping! Have you ever needed data from a website but found it hard to access it in a structured format? This is where web scraping comes in. Using scripts, we can extract the data we need from a website for various purpo... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/web-scraping-in-javascript-with-puppeteer/</link>
                <guid isPermaLink="false">66bb921e0eaca026d8cfa5ed</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ puppeteer ]]>
                    </category>
                
                    <category>
                        <![CDATA[ web scraping ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gaël Thomas ]]>
                </dc:creator>
                <pubDate>Tue, 31 Jan 2023 15:26:55 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2023/01/web-scraping-in-javascript-with-puppeteer.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Welcome to the world of web scraping! Have you ever needed data from a website but found it hard to access it in a structured format? This is where web scraping comes in.</p>
<p>Using scripts, we can extract the data we need from a website for various purposes, such as creating databases, doing some analytics, and even more.</p>
<blockquote>
<p><strong>Disclaimer:</strong> Be careful when doing web scraping. Always make sure you're scraping sites that allow it, and performing this activity within ethical and legal limits.</p>
</blockquote>
<p>JavaScript and Node.js offers various libraries that make web scraping easier. For simple data extraction, you can use Axios to fetch an API responses or a website HTML. </p>
<p>But if you're looking to do more advanced tasks including automations, you'll need libraries such as <a target="_blank" href="https://pptr.dev/">Puppeteer</a>, <a target="_blank" href="https://cheerio.js.org/">Cheerio</a>, or <a target="_blank" href="https://github.com/segmentio/nightmare">Nightmare</a> (don't worry the name is nightmare, but it's not that bad to use 😆).</p>
<p>I'll introduce the basics of web scraping in JavaScript and Node.js using Puppeteer in this article. I structured the writing to show you some basics of fetching information on a website and clicking a button (for example, moving to the next page).</p>
<p>At the end of this introduction, I'll recommend ways to practice and learn more by improving the project we just created.</p>
<h2 id="heading-prerequisites">Prerequisites</h2>
<p>Before diving in and scraping our first page together using JavaScript, Node.js, and the <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Introduction">HTML DOM</a>, I'd recommend having a basic understanding of these technologies. It'll improve your learning and understanding of the topic.</p>
<p>Let's dive in! 🤿</p>
<h2 id="heading-how-to-initialize-your-first-puppeteer-scraper">How to Initialize Your First Puppeteer Scraper</h2>
<p>New project...new folder! First, create the <code>first-puppeteer-scraper-example</code> folder on your computer. It'll contain the code of our future scraper.</p>
<pre><code class="lang-shell">mkdir first-puppeteer-scraper-example
</code></pre>
<p>Now, it's time to initialize your Node.js repository with a package.json file. It's helpful to add information to the repository and NPM packages, such as the Puppeteer library.</p>
<pre><code class="lang-shell">npm init -y
</code></pre>
<p>After typing this command, you should find this <code>package.json</code> file in your repository tree.</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"name"</span>: <span class="hljs-string">"first-puppeteer-scraper-example"</span>,
  <span class="hljs-attr">"version"</span>: <span class="hljs-string">"1.0.0"</span>,
  <span class="hljs-attr">"main"</span>: <span class="hljs-string">"index.js"</span>,
  <span class="hljs-attr">"scripts"</span>: {
    <span class="hljs-attr">"test"</span>: <span class="hljs-string">"echo \"Error: no test specified\" &amp;&amp; exit 1"</span>
  },
  <span class="hljs-attr">"keywords"</span>: [],
  <span class="hljs-attr">"author"</span>: <span class="hljs-string">""</span>,
  <span class="hljs-attr">"license"</span>: <span class="hljs-string">"ISC"</span>,
  <span class="hljs-attr">"dependencies"</span>: {
    <span class="hljs-attr">"puppeteer"</span>: <span class="hljs-string">"^19.6.2"</span>
  },
  <span class="hljs-attr">"type"</span>: <span class="hljs-string">"module"</span>,
  <span class="hljs-attr">"devDependencies"</span>: {},
  <span class="hljs-attr">"description"</span>: <span class="hljs-string">""</span>
}
</code></pre>
<p>Before proceeding, we must ensure the project is configured to handle ES6 features. To do so, you can add the <code>"types": "module"</code> instruction at the end of the configuration.</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"name"</span>: <span class="hljs-string">"first-puppeteer-scraper-example"</span>,
  <span class="hljs-attr">"version"</span>: <span class="hljs-string">"1.0.0"</span>,
  <span class="hljs-attr">"main"</span>: <span class="hljs-string">"index.js"</span>,
  <span class="hljs-attr">"scripts"</span>: {
    <span class="hljs-attr">"test"</span>: <span class="hljs-string">"echo \"Error: no test specified\" &amp;&amp; exit 1"</span>
  },
  <span class="hljs-attr">"keywords"</span>: [],
  <span class="hljs-attr">"author"</span>: <span class="hljs-string">""</span>,
  <span class="hljs-attr">"license"</span>: <span class="hljs-string">"ISC"</span>,
  <span class="hljs-attr">"dependencies"</span>: {
    <span class="hljs-attr">"puppeteer"</span>: <span class="hljs-string">"^19.6.2"</span>
  },
  <span class="hljs-attr">"type"</span>: <span class="hljs-string">"module"</span>,
  <span class="hljs-attr">"description"</span>: <span class="hljs-string">""</span>,
  <span class="hljs-attr">"types"</span>: <span class="hljs-string">"module"</span>
}
</code></pre>
<p>The last step of our scraper initialization is to install the Puppeteer library. Here's how:</p>
<pre><code class="lang-shell">npm install puppeteer
</code></pre>
<p>Wow! We're there – we're ready to scrape our first website together. 🤩</p>
<h2 id="heading-how-to-scrape-your-first-piece-of-data">How to Scrape Your First Piece of Data</h2>
<p>In this article, we'll use the <a target="_blank" href="https://toscrape.com/">ToScrape</a> website as our learning platform. This online sandbox provides two projects specifically designed for web scraping, making it a great starting point to learn the basics such as data extraction and page navigation.</p>
<p>For this beginner's introduction, we'll specifically focus on the <a target="_blank" href="http://quotes.toscrape.com/">Quotes to Scrape</a> website.</p>
<h3 id="heading-how-to-initialize-the-script">How to Initialize the Script</h3>
<p>In the project repository root, you can create an <code>index.js</code> file. This will be our application entry point.</p>
<p>To keep it simple, our script consists of one function in charge of getting the website's quotes (<code>getQuotes</code>).</p>
<p>In the function's body, we will need to follow different steps:</p>
<ul>
<li>Start a Puppeteer session with <code>puppeteer.launch</code> (it'll instantiate a <code>browser</code> variable that we'll use for manipulating the browser)</li>
<li>Open a new page/tab with <code>browser.newPage</code> (it'll instantiate a <code>page</code> variable that we'll use for manipulating the page)</li>
<li>Change the URL of our new page to <a target="_blank" href="http://quotes.toscrape.com/"><code>http://quotes.toscrape.com/</code></a> with <code>page.goto</code></li>
</ul>
<p>Here's the commented version of the initial script:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> puppeteer <span class="hljs-keyword">from</span> <span class="hljs-string">"puppeteer"</span>;

<span class="hljs-keyword">const</span> getQuotes = <span class="hljs-keyword">async</span> () =&gt; {
  <span class="hljs-comment">// Start a Puppeteer session with:</span>
  <span class="hljs-comment">// - a visible browser (`headless: false` - easier to debug because you'll see the browser in action)</span>
  <span class="hljs-comment">// - no default viewport (`defaultViewport: null` - website page will in full width and height)</span>
  <span class="hljs-keyword">const</span> browser = <span class="hljs-keyword">await</span> puppeteer.launch({
    <span class="hljs-attr">headless</span>: <span class="hljs-literal">false</span>,
    <span class="hljs-attr">defaultViewport</span>: <span class="hljs-literal">null</span>,
  });

  <span class="hljs-comment">// Open a new page</span>
  <span class="hljs-keyword">const</span> page = <span class="hljs-keyword">await</span> browser.newPage();

  <span class="hljs-comment">// On this new page:</span>
  <span class="hljs-comment">// - open the "http://quotes.toscrape.com/" website</span>
  <span class="hljs-comment">// - wait until the dom content is loaded (HTML is ready)</span>
  <span class="hljs-keyword">await</span> page.goto(<span class="hljs-string">"http://quotes.toscrape.com/"</span>, {
    <span class="hljs-attr">waitUntil</span>: <span class="hljs-string">"domcontentloaded"</span>,
  });
};

<span class="hljs-comment">// Start the scraping</span>
getQuotes();
</code></pre>
<p>What do you think of running our scraper and seeing the output? Let's do it with the command below:</p>
<pre><code class="lang-shell">node index.js
</code></pre>
<p>After doing this, you should have a brand new browser application started with a new page and the website Quotes to Scrape loaded onto it. Magic, isn't it? 🪄</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/01/image-353.png" alt="Image" width="600" height="400" loading="lazy">
<em>Quotes to Scrape homepage loaded by our initial script</em></p>
<p><strong>Note:</strong> For this first iteration, we're not closing the browser. This means you will need to close the browser to stop the running application.</p>
<h3 id="heading-how-to-fetch-the-first-quote">How to Fetch the First Quote</h3>
<p>Whenever you want to scrape a website, you'll have to play with the HTML DOM. What I recommend is to inspect the page and start navigating the different elements to find what you need.</p>
<p>In our case, we'll follow the <a target="_blank" href="https://dictionary.cambridge.org/dictionary/english/baby-step">baby step principle</a> and start fetching the first quote, author, and text.</p>
<p>After browsing the page HTML, we can notice a quote is encapsulated in a <code>&lt;div&gt;</code> element with a class name <code>quote</code> (<code>class="quote"</code>). This is important information because the scraping works with <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors">CSS selectors</a> (for example, .quote).</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/01/image-354.png" alt="Image" width="600" height="400" loading="lazy">
<em>Browser inspector with the first quote <code>&amp;lt;div&amp;gt;</code> selected</em></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/01/image-355.png" alt="Image" width="600" height="400" loading="lazy">
<em>An example of how each quote is rendered in the HTML</em></p>
<p>Now that we have this knowledge, we can return to our <code>getQuotes</code> function and improve our code to select the first quote and extract its data.</p>
<p>We will need to add the following after the <code>page.goto</code> instruction:</p>
<ul>
<li>Extract data from our page HTML with <code>page.evaluate</code> (it'll execute the function passed as a parameter in the page context and returns the result)</li>
<li>Get the quote HTML node with <code>document.querySelector</code> (it'll fetch the first <code>&lt;div&gt;</code> with the classname <code>quote</code> and returns it)</li>
<li>Get the quote text and author from the previously extracted quote HTML node with <code>quote.querySelector</code> (it'll extract the elements with the classname <code>text</code> and <code>author</code> under <code>&lt;div class="quote"&gt;</code> and returns them)</li>
</ul>
<p>Here's the updated version with detailed comments:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> puppeteer <span class="hljs-keyword">from</span> <span class="hljs-string">"puppeteer"</span>;

<span class="hljs-keyword">const</span> getQuotes = <span class="hljs-keyword">async</span> () =&gt; {
  <span class="hljs-comment">// Start a Puppeteer session with:</span>
  <span class="hljs-comment">// - a visible browser (`headless: false` - easier to debug because you'll see the browser in action)</span>
  <span class="hljs-comment">// - no default viewport (`defaultViewport: null` - website page will in full width and height)</span>
  <span class="hljs-keyword">const</span> browser = <span class="hljs-keyword">await</span> puppeteer.launch({
    <span class="hljs-attr">headless</span>: <span class="hljs-literal">false</span>,
    <span class="hljs-attr">defaultViewport</span>: <span class="hljs-literal">null</span>,
  });

  <span class="hljs-comment">// Open a new page</span>
  <span class="hljs-keyword">const</span> page = <span class="hljs-keyword">await</span> browser.newPage();

  <span class="hljs-comment">// On this new page:</span>
  <span class="hljs-comment">// - open the "http://quotes.toscrape.com/" website</span>
  <span class="hljs-comment">// - wait until the dom content is loaded (HTML is ready)</span>
  <span class="hljs-keyword">await</span> page.goto(<span class="hljs-string">"http://quotes.toscrape.com/"</span>, {
    <span class="hljs-attr">waitUntil</span>: <span class="hljs-string">"domcontentloaded"</span>,
  });

  <span class="hljs-comment">// Get page data</span>
  <span class="hljs-keyword">const</span> quotes = <span class="hljs-keyword">await</span> page.evaluate(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-comment">// Fetch the first element with class "quote"</span>
    <span class="hljs-keyword">const</span> quote = <span class="hljs-built_in">document</span>.querySelector(<span class="hljs-string">".quote"</span>);

    <span class="hljs-comment">// Fetch the sub-elements from the previously fetched quote element</span>
    <span class="hljs-comment">// Get the displayed text and return it (`.innerText`)</span>
    <span class="hljs-keyword">const</span> text = quote.querySelector(<span class="hljs-string">".text"</span>).innerText;
    <span class="hljs-keyword">const</span> author = quote.querySelector(<span class="hljs-string">".author"</span>).innerText;

    <span class="hljs-keyword">return</span> { text, author };
  });

  <span class="hljs-comment">// Display the quotes</span>
  <span class="hljs-built_in">console</span>.log(quotes);

  <span class="hljs-comment">// Close the browser</span>
  <span class="hljs-keyword">await</span> browser.close();
};

<span class="hljs-comment">// Start the scraping</span>
getQuotes();
</code></pre>
<p>Something interesting to point out is that the function name for selecting an element is the same as in the browser inspect. Here's an example:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/01/image-362.png" alt="Image" width="600" height="400" loading="lazy">
<em>After running the <code>document.querySelector</code> instruction in the browser inspector, we have the first quote as an output (like on Puppeteer)</em></p>
<p>Let's run our script one more time and see what we have as an output:</p>
<pre><code class="lang-json">{
  text: '“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”',
  author: 'Albert Einstein'
}
</code></pre>
<p>We did it! Our first scraped element is here, right in the terminal. Now, let's expand it and fetch all the current page quotes. 🔥</p>
<h3 id="heading-how-to-fetch-all-current-page-quotes">How to Fetch All Current Page Quotes</h3>
<p>Now that we know how to fetch one quote, let's trick our code a bit to get all the quotes and extract their data one by one.</p>
<p>Previously we used <code>document.getQuerySelector</code> to select the first matching element (the first quote). To be able to fetch all quotes, we will need the <code>document.querySelectorAll</code> function instead.</p>
<p>We'll need to follow these steps to make it work:</p>
<ul>
<li>Replace <code>document.getQuerySelector</code> with <code>document.querySelectorAll</code> (it'll fetch all <code>&lt;div&gt;</code> elements with the classname <code>quote</code> and return them)</li>
<li>Convert the fetched elements to a list with <code>Array.from(quoteList)</code> (it'll ensure the list of quotes is iterable)</li>
<li>Move our previous code to get the quote text and author inside the loop and return the result (it'll extract the elements with the classname <code>text</code> and <code>author</code> under <code>&lt;div class="quote"&gt;</code> for each quote)</li>
</ul>
<p>Here's the code update:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> puppeteer <span class="hljs-keyword">from</span> <span class="hljs-string">"puppeteer"</span>;

<span class="hljs-keyword">const</span> getQuotes = <span class="hljs-keyword">async</span> () =&gt; {
  <span class="hljs-comment">// Start a Puppeteer session with:</span>
  <span class="hljs-comment">// - a visible browser (`headless: false` - easier to debug because you'll see the browser in action)</span>
  <span class="hljs-comment">// - no default viewport (`defaultViewport: null` - website page will be in full width and height)</span>
  <span class="hljs-keyword">const</span> browser = <span class="hljs-keyword">await</span> puppeteer.launch({
    <span class="hljs-attr">headless</span>: <span class="hljs-literal">false</span>,
    <span class="hljs-attr">defaultViewport</span>: <span class="hljs-literal">null</span>,
  });

  <span class="hljs-comment">// Open a new page</span>
  <span class="hljs-keyword">const</span> page = <span class="hljs-keyword">await</span> browser.newPage();

  <span class="hljs-comment">// On this new page:</span>
  <span class="hljs-comment">// - open the "http://quotes.toscrape.com/" website</span>
  <span class="hljs-comment">// - wait until the dom content is loaded (HTML is ready)</span>
  <span class="hljs-keyword">await</span> page.goto(<span class="hljs-string">"http://quotes.toscrape.com/"</span>, {
    <span class="hljs-attr">waitUntil</span>: <span class="hljs-string">"domcontentloaded"</span>,
  });

  <span class="hljs-comment">// Get page data</span>
  <span class="hljs-keyword">const</span> quotes = <span class="hljs-keyword">await</span> page.evaluate(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-comment">// Fetch the first element with class "quote"</span>
    <span class="hljs-comment">// Get the displayed text and returns it</span>
    <span class="hljs-keyword">const</span> quoteList = <span class="hljs-built_in">document</span>.querySelectorAll(<span class="hljs-string">".quote"</span>);

    <span class="hljs-comment">// Convert the quoteList to an iterable array</span>
    <span class="hljs-comment">// For each quote fetch the text and author</span>
    <span class="hljs-keyword">return</span> <span class="hljs-built_in">Array</span>.from(quoteList).map(<span class="hljs-function">(<span class="hljs-params">quote</span>) =&gt;</span> {
      <span class="hljs-comment">// Fetch the sub-elements from the previously fetched quote element</span>
      <span class="hljs-comment">// Get the displayed text and return it (`.innerText`)</span>
      <span class="hljs-keyword">const</span> text = quote.querySelector(<span class="hljs-string">".text"</span>).innerText;
      <span class="hljs-keyword">const</span> author = quote.querySelector(<span class="hljs-string">".author"</span>).innerText;

      <span class="hljs-keyword">return</span> { text, author };
    });
  });

  <span class="hljs-comment">// Display the quotes</span>
  <span class="hljs-built_in">console</span>.log(quotes);

  <span class="hljs-comment">// Close the browser</span>
  <span class="hljs-keyword">await</span> browser.close();
};

<span class="hljs-comment">// Start the scraping</span>
getQuotes();
</code></pre>
<p>As an end result, if we run our script one more time, we should have a list of quotes as an output. Each element of this list should have a text and an author property.</p>
<pre><code class="lang-json">[
  {
    text: '“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”',
    author: 'Albert Einstein'
  },
  {
    text: '“It is our choices, Harry, that show what we truly are, far more than our abilities.”',
    author: 'J.K. Rowling'
  },
  {
    text: '“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”',
    author: 'Albert Einstein'
  },
  {
    text: '“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”',
    author: 'Jane Austen'
  },
  {
    text: <span class="hljs-string">"“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”"</span>,
    author: 'Marilyn Monroe'
  },
  {
    text: '“Try not to become a man of success. Rather become a man of value.”',
    author: 'Albert Einstein'
  },
  {
    text: '“It is better to be hated for what you are than to be loved for what you are not.”',
    author: 'André Gide'
  },
  {
    text: <span class="hljs-string">"“I have not failed. I've just found 10,000 ways that won't work.”"</span>,
    author: 'Thomas A. Edison'
  },
  {
    text: <span class="hljs-string">"“A woman is like a tea bag; you never know how strong it is until it's in hot water.”"</span>,
    author: 'Eleanor Roosevelt'
  },
  {
    text: '“A day without sunshine is like, you know, night.”',
    author: 'Steve Martin'
  }
]
</code></pre>
<p>Good job! All the quotes from the first page are now scraped by our script. 👏</p>
<h3 id="heading-how-to-move-to-the-next-page">How to Move to the Next Page</h3>
<p>Our script is now able to fetch all the quotes for one page. What would be interesting is clicking on the "Next page" at the page bottom and doing the same on the second page.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/01/image-363.png" alt="Image" width="600" height="400" loading="lazy">
<em>"Next" button at the Quotes to Scrape page bottom</em></p>
<p>Back to our browser inspect, and let's find how we can target this element using CSS selectors. </p>
<p>As we can notice, the next button is placed under an unordered list <code>&lt;ul&gt;</code> with a <code>pager</code> classname (<code>&lt;ul class="pager"&gt;</code>). This list has an element <code>&lt;li&gt;</code> with a <code>next</code> classname (<code>&lt;li class="next"&gt;</code>). Finally, there is a link anchor <code>&lt;a&gt;</code> that links to the second page (<code>&lt;a href="/page/2/"&gt;</code>).</p>
<p>In CSS, if we want to target this specific link there are different ways to do that. We can do:</p>
<ul>
<li><code>.next &gt; a</code>: but, it's risky because if there is an other element with <code>.next</code> as a parent element containing a link, it'll click on it.</li>
<li><code>.pager &gt; .next &gt; a</code>: safer, because we make sure the link should be inside the <code>.pager</code> parent element under the <code>.next</code> element. There is a low risk of having this hierarchy more than once.</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/01/image-356.png" alt="Image" width="600" height="400" loading="lazy">
<em>An example of how the "Next" button is rendered in the HTML</em></p>
<p>To click this button, at the end of our script after the <code>console.log(quotes);</code>, you can add the following: <code>await page.click(".pager &gt; .next &gt; a");</code>.</p>
<p>Since we're now closing the browser page with <code>await browser.close();</code> after all instructions are done, you need to comment on this instruction to see the second page opened in the scraper browser.</p>
<p>It's temporary and for testing purposes, but the end of our <code>getQuotes</code> function should look like this:</p>
<pre><code class="lang-javascript">  <span class="hljs-comment">// Display the quotes</span>
  <span class="hljs-built_in">console</span>.log(quotes);

  <span class="hljs-comment">// Click on the "Next page" button</span>
  <span class="hljs-keyword">await</span> page.click(<span class="hljs-string">".pager &gt; .next &gt; a"</span>);

  <span class="hljs-comment">// Close the browser</span>
  <span class="hljs-comment">// await browser.close();</span>
</code></pre>
<p>After this, if you run our scraper again, after processing all instructions, your browser should stop on the second page:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/01/image-357.png" alt="Image" width="600" height="400" loading="lazy">
<em>Quotes to Scrape second page loaded after clicking the "Next" button</em></p>
<h2 id="heading-its-your-time-heres-what-you-can-do-next">It’s Your Time! Here’s What You Can Do Next:</h2>
<p>Congrats on reaching the end of this introduction to scraping with Puppeteer! 👏</p>
<p>Now it's your turn to improve the scraper and make it get more data from the Quotes to Scrape website. Here's a list of potential improvements you can make:</p>
<ul>
<li>Navigate between all pages using the "Next" button and fetch the quotes on all the pages.</li>
<li>Fetch the quote's tags (each quote has a list of tags).</li>
<li>Scrape the author's about page (by clicking on the author's name on each quote).</li>
<li>Categorize the quotes by tags or authors (it's not 100% related to the scraping itself, but that can be a good improvement).</li>
</ul>
<p>Feel free to be creative and do any other things you see fit 🚀</p>
<h3 id="heading-scraper-code-is-available-on-github">Scraper Code Is Available on GitHub</h3>
<p>Check out the latest version of our scraper on GitHub! You're free to save, fork, or utilize it as you see fit.</p>
<p>=&gt; <a target="_blank" href="https://github.com/gaelgthomas/first-puppeteer-scraper-example">First Puppeteer Scraper (example)</a></p>
<h2 id="heading-successful-scraping-start-thanks-for-reading-the-article">Successful Scraping Start: Thanks for reading the article!</h2>
<p>I hope this article gave you a valuable introduction to web scraping using JavaScript and Puppeteer. Writing this was a pleasure, and I hope you found it informative and enjoyable.</p>
<p><a target="_blank" href="https://twitter.com/gaelgthomas">Join me on Twitter</a> for more content like this. I regularly share content to help you grow your web development skills and would love to have you join the conversation. Let's learn, grow, and inspire each other along the way!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Music for Programming – Coding Music Playlists, Radio Stations, Videos, and Lives ]]>
                </title>
                <description>
                    <![CDATA[ Do you like listening to music while you code? If so, you're in luck. This blog post is all about music for programming.  In this reference guide, I'll be sharing a variety of different playlists, radio stations, and videos that you can listen to whi... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/music-for-programming-youtube-channels-twitchtv-web-radios-and-more/</link>
                <guid isPermaLink="false">66bb9216add24ba427325101</guid>
                
                    <category>
                        <![CDATA[ coding ]]>
                    </category>
                
                    <category>
                        <![CDATA[ music ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gaël Thomas ]]>
                </dc:creator>
                <pubDate>Mon, 14 Mar 2022 19:16:43 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/03/Big-Text-How-to-Youtube-Thumbnail.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Do you like listening to music while you code? If so, you're in luck. This blog post is all about music for programming. </p>
<p>In this reference guide, I'll be sharing a variety of different playlists, radio stations, and videos that you can listen to while coding. Whether you're a beginner or an experienced programmer, you will find something to listen to. </p>
<p>So put on your headphones and get to work!</p>
<h2 id="heading-coding-music-on-spotify">Coding music on Spotify</h2>
<p>One of my favorite ways to listen to music while working is through Spotify. If you're not familiar with Spotify, it's a music streaming service that you can use for free (with ads) or for a monthly fee (no ads). </p>
<p>I like using Spotify because it has a huge selection of songs and albums, and you can create your own playlists. Plus, if you have the paid version, you can download songs and listen to them offline.</p>
<p>If you're looking for some good coding music, here are a few Spotify playlists:</p>
<ul>
<li><a target="_blank" href="https://open.spotify.com/playlist/37i9dQZF1DWWQRwui0ExPn?si=29e9d713abbd4a91">Lofi Beats</a></li>
<li><a target="_blank" href="https://open.spotify.com/album/5oxHFqFU06ufRSZt8izJX6?si=MX_8hXM7SaWYefMFPN_4Ag">Electronic Music for Coding: Fast Programming Instrumentals for Concentration</a></li>
<li><a target="_blank" href="https://open.spotify.com/playlist/37i9dQZF1DX5trt9i14X7j?si=96dcbb8950ab4bbe">Coding Mode</a></li>
<li><a target="_blank" href="https://open.spotify.com/playlist/0vvXsWCC9xrXsKd4FyS8kM?si=c615a01d6e4646f6">Lofi Hip Hop Music - Beats to Relax/Study by Lofi Girl</a></li>
<li><a target="_blank" href="https://open.spotify.com/playlist/37i9dQZF1DWZeKCadgRdKQ?si=06a40e58cffc4fdc">Deep Focus</a></li>
<li><a target="_blank" href="https://open.spotify.com/playlist/37i9dQZF1DX0wMD4IoQ5aJ?si=16161a1feec54601">Electronic Focus</a></li>
<li><a target="_blank" href="https://open.spotify.com/playlist/37i9dQZF1DX8wtrGDH81Oa?si=c93d44084cc247bc">House Focus</a></li>
</ul>
<h2 id="heading-music-for-programming-on-youtube">Music for programming on YouTube</h2>
<p>YouTube is another great resource for finding music to listen to while programming. In fact, there are entire channels dedicated to that kind of music.</p>
<p>Here are a few productivity/programming/concentration music channels on YouTube:</p>
<ul>
<li><a target="_blank" href="https://www.youtube.com/channel/UCwVQIkAtyZzQSA-OY1rsGig">Chill Music Lab</a></li>
<li><a target="_blank" href="https://www.youtube.com/c/FilFar">Filfar</a></li>
<li><a target="_blank" href="https://www.youtube.com/channel/UCDK54OyzWnOczY7LzEd9V2Q/">Lofi Ghostie</a></li>
<li><a target="_blank" href="https://www.youtube.com/c/lofigeek/">Lofi Geek</a></li>
<li><a target="_blank" href="https://www.youtube.com/c/LofiGirl/">Lofi Girl</a></li>
<li><a target="_blank" href="https://www.youtube.com/c/GreenredProductions/">Greenred Productions</a></li>
<li><a target="_blank" href="https://www.youtube.com/channel/UCNl1nMcK1X9EHsW_b5dGzaA/">Productivity Music by Evan Carmichael</a></li>
<li><a target="_blank" href="https://www.youtube.com/c/Fluidified/">Fluidified</a></li>
</ul>
<p>There are also many 24/7 coding music lives. Let me share with you some YouTube queries to find them:</p>
<ul>
<li><a target="_blank" href="https://www.youtube.com/results?search_query=24%2F7+coding">24/7 coding</a></li>
<li><a target="_blank" href="https://www.youtube.com/results?search_query=24%2F7+lofi">24/7 lofi</a></li>
<li>P<a target="_blank" href="https://www.youtube.com/results?search_query=programming+music&amp;sp=EgJAAQ%3D%3D">rogramming music</a></li>
<li><a target="_blank" href="https://www.youtube.com/results?search_query=coffee+music&amp;sp=EgJAAQ%3D%3D">Coffee music</a></li>
<li><a target="_blank" href="https://www.youtube.com/results?search_query=focus+music&amp;sp=EgJAAQ%3D%3D">Focus music</a></li>
</ul>
<h2 id="heading-music-for-coding-on-twitchtv">Music for coding on TwitchTV</h2>
<p>TwitchTV is a live streaming video platform where you can watch people play video games, listen to music, and more. There is a lot of great content that you can watch and listen to while coding.</p>
<p>Here are a few music channels on TwitchTV:</p>
<ul>
<li><a target="_blank" href="https://www.twitch.tv/leekbeats">LeekBeats</a></li>
<li><a target="_blank" href="https://www.twitch.tv/kubomusic">KuboMusic</a></li>
<li><a target="_blank" href="https://www.twitch.tv/sixtysevenradio">SixtySevenRadio</a></li>
<li><a target="_blank" href="https://www.twitch.tv/spinninrecords">SpinninRecords</a></li>
</ul>
<p>On this platform, some streamers like to create virtual offices. Most of the time, they are streaming in the <a target="_blank" href="https://www.twitch.tv/directory/game/Just%20Chatting">"Just Chatting"</a> or <a target="_blank" href="https://www.twitch.tv/directory/game/Software%20and%20Game%20Development">"Software and Game Development"</a> sections. You can launch their streaming in the background, work with them and listen to good music.</p>
<p>It can be motivating when you're working alone at home and need to have the feeling of working with someone. Some of these streamers are even doing Pomodoro Sessions that you can follow to <a target="_blank" href="https://herewecode.io/blog/low-productivity-how-to-stop-wasting-time/">get your code done and improve your focus</a>.</p>
<h2 id="heading-web-radio-broadcasting-music-for-developers">Web radio broadcasting music for developers</h2>
<p>If you're looking for something a little more low-key, you can try listening to radio dedicated for developers. There are a few stations that play nothing but programming music.</p>
<p>Here are a few of them:</p>
<ul>
<li><a target="_blank" href="https://coderadio.freecodecamp.org/">Code radio by freeCodeCamp</a></li>
<li><a target="_blank" href="https://musicforprogramming.net/latest/">musicForProgramming();</a></li>
<li><a target="_blank" href="https://radio.x-team.com/">X-Team Radio</a></li>
<li><a target="_blank" href="https://www.lofi.cafe/">Lofi Cafe</a></li>
</ul>
<h2 id="heading-wrapping-up">Wrapping up</h2>
<p>Thank you for reading this article. I hope these links will be helpful and motivate you in your day-to-day developer work. Keep coding, and keep hustling.</p>
<p>I regularly deliver content about web development, personal growth as a developer, and my journey as an aspiring digital nomad and remote software engineer. If you don't want to miss them, I invite you to <a target="_blank" href="https://twitter.com/gaelgthomas">follow me on Twitter</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Working from Home – Tips to Help You Stay Productive ]]>
                </title>
                <description>
                    <![CDATA[ Over the past few years, a lot of us have started working remotely. That's what I also did, and I fell in love with this life. Indeed, a bit more than two years ago, I started my first full-time job as a Software Engineer. And at the same time, I ]]>
                </description>
                <link>https://www.freecodecamp.org/news/working-from-home-tips-to-stay-productive/</link>
                <guid isPermaLink="false">66bb92250eaca026d8cfa5ef</guid>
                
                    <category>
                        <![CDATA[ remote work ]]>
                    </category>
                
                    <category>
                        <![CDATA[ remote-working ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gaël Thomas ]]>
                </dc:creator>
                <pubDate>Tue, 22 Feb 2022 00:12:34 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/02/working-from-home-tips-to-stay-productive-3.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Over the past few years, a lot of us have started working remotely. That's what I also did, and I fell in love with this life.</p>
<p>Indeed, a bit more than two years ago, I started my first full-time job as a Software Engineer. And at the same time, I began my first remote experience. </p>
<p>Nowadays, I'm 23 years old, living in Europe, working for a company based in Singapore, and planning to start a digital nomad life in Asia.</p>
<p>Based on my experience, I've put together 15 working from home tips to help you stay productive. I categorized these tips into 5 categories that you'll discover just below.</p>
<p>Just keep in mind that these tips are based on my personal experience, readings, and documentation. Everyone is different, and some of them may not work with your needs and goals.</p>
<h2 id="heading-tip-1-build-a-strong-work-life-balance">Tip #1 – Build a strong work-life balance</h2>
<p>One of the most impactful categories you need to take care of is your work-life balance.</p>
<p>Yes, you read about this in all remote-work articles, but what does it mean?</p>
<p>When you work remotely, it's easy to cut yourself out from your life. Your work can start overwhelming you because you feel like you're only doing that.</p>
<p>Even if you're passionate about what you are doing, it's essential to know how to step away from it to relax and stay productive in the long run.</p>
<p>Here are some tips to achieve a work-life balance.</p>
<h3 id="heading-1-take-breaks-and-go-outside">1. Take breaks and go outside</h3>
<p>It seems simple, right? Remote work doesn't mean staying at home all day. I highly recommend taking breaks and going outside to refresh your mind and leave your workplace.</p>
<p>What about eating outside during your lunchtime or even going for a walk in the afternoon?</p>
<h3 id="heading-2-take-up-a-sport-or-activity-that-takes-your-mind-off-things">2. Take up a sport or activity that takes your mind off things</h3>
<p>To avoid feeling burnout from your job, take a step back and practice a relaxing and mind-changing activity. </p>
<p>Many people like to play a sport, while others prefer simply making time for other activities or hobbies that are different from what they do at work.</p>
<h3 id="heading-3-split-your-computer">3. Split your computer</h3>
<p>One of the most challenging parts of working from home is differentiating your work time from your non-work time. </p>
<p>If you're using the same computer for your work and your side-projects/chill time, this tip is for you.</p>
<h4 id="heading-split-your-browser-configuration">Split your browser configuration</h4>
<p>Nowadays, most browsers allow you to create profiles. I recommend that you make two profiles, one for your work and one for non-work time.</p>
<p>This allows you to disconnect easier when you're outside of work. At the same time, it helps organize your bookmarks and sessions (for example: if you're using the same tools between your work and your side-projects).</p>
<h4 id="heading-create-another-session-on-your-computer">Create another session on your computer</h4>
<p>This isn't something that I do personally. But, I read a lot about people using two different sessions.</p>
<p>It sounds like the "ultimate" solution if you want to keep these two spaces independent.</p>
<h3 id="heading-4-dont-setup-work-notifications-on-your-phone">4. Don't setup work notifications on your phone</h3>
<p>This tip can be controversial depending on what you're doing as a remote worker. But, still, I think it's something essential if you want to keep a work-life balance.</p>
<p>I don't like to have work applications or notifications on my phone for many reasons. Remote work means asynchronous life. Your co-workers can work at different hours than you. If you want to avoid waking up with work notifications or receiving messages while you're outside with friends, this is something you should avoid.</p>
<blockquote>
<p><strong>Note:</strong> If your work requires setting up some applications, there are many ways to remove the notifications after a defined hour. That can be an alternative.</p>
</blockquote>
<h3 id="heading-5-work-from-a-co-working-space">5. Work from a co-working space</h3>
<p>Another piece of advice that I've heard a lot is to work remotely from outside your home. Well, it's a bit controversial with this article title, but it's a genius way to keep a work-life balance if you can afford it and feel comfortable working in a public space.</p>
<p>If you're not feeling productive at home, even after reading and trying many things, working from a co-working space can help you. </p>
<p>Nowadays, co-working spaces are everywhere. If you can, try one of them out to see if it works for you.</p>
<h2 id="heading-tip-2-create-your-own-working-environment">Tip #2 – Create your own working environment</h2>
<p>Now that we've talked about the importance of keeping a work-life balance, let's dig a bit more into your workspace and how you can improve it.</p>
<h3 id="heading-1-choose-or-create-a-workspace-that-stimulates-you">1. Choose or create a workspace that stimulates you</h3>
<p>While working remotely, you have the freedom to create a workspace where you feel good. Be imaginative and bring what stimulates you around your desk. It can be plants, books, or anything that you like.</p>
<p>If you're a digital nomad or a frequent traveler, you can select a coffee shop, a co-working space, or a flat that inspires you.</p>
<p>A nice place to work is always a good source of motivation.</p>
<h3 id="heading-2-separate-your-workspace-from-your-sleeping-one">2. Separate your workspace from your sleeping one</h3>
<p>I know that's not possible for everyone, but try as much as possible to separate your workspace from your bedroom.</p>
<p>If you wake up and work in the same place as you sleep, you will certainly have the feeling that you're always doing the same thing. It's not motivating to stay in the same room all day. When you reach your bed, you will still be in your "working" room.</p>
<h3 id="heading-3-declutter-your-desk">3. Declutter your desk</h3>
<p>Many articles and guides about productivity share this tip, but decluttering your desk and keeping it clean and minimal can help free your mind and help you focus more.</p>
<p>Again, it's a matter of personal opinion, but I like to keep my remote working space clean and simple to focus only on what matters.</p>
<h2 id="heading-tip-3-socialize-at-work">Tip #3 – Socialize at work</h2>
<p>Social aspects are essential as a remote worker. They help you stay motivated and avoid this inner feeling of working alone (even if you're not).</p>
<h3 id="heading-1-schedule-virtual-time-with-your-colleagues">1. Schedule virtual time with your colleagues</h3>
<p>Remote work doesn't mean staying away from your colleagues. Even if it can seem socially distancing at times, one essential point is to keep socializing.</p>
<p>Don't be shy – ask your colleagues for a 15-30 minutes coffee meeting to get to know them better.</p>
<p>If you're not working as a freelancer on alone on your project, there are many online events and communities that allow you to talk with like-minded people and share a coffee with them. </p>
<h3 id="heading-2-try-to-schedule-a-social-meeting-each-week-in-your-company">2. Try to schedule a social meeting each week in your company</h3>
<p>If you're leading a remote company or working at one, this point is for you. Don't hesitate to schedule or ask for a social meeting each week. For example, it can be an hour where everyone meets up online and plays an online game together. The possibilities are endless.</p>
<p>Let me give you feedback on my experience. I'm working at <a target="_blank" href="https://www.cococart.co/?ref=freeCodeCamp">Cococart</a>. We create a product that allows you to create a simple, beautiful store in minutes. We're a remote worldwide company: all the team is spread worldwide, and some are frequent travelers.</p>
<p>Each week, we do one "Campfire" – an hour and a half meeting where we meet each other, talk about our highlights and lowlights of the week, give kudos to our co-workers, and play a game together. It can seem like a short time but trust me, it really helps build up significant team motivation and spirit.</p>
<p>One of the most awkward parts of working remotely is to feel alone. This point is only one example, but feel free to socialize using your preferred way.</p>
<h2 id="heading-tip-4-become-a-time-management-expert">Tip #4 – Become a time-management expert</h2>
<p>To improve your productivity as a remote worker, time also matters. Make sure you're using yours wisely.</p>
<h3 id="heading-1-try-to-have-a-set-work-schedule">1. Try to have a set work schedule</h3>
<p>I don't want to say that you shouldn't work hard or count your hours. I work a lot and don't always follow this rule.</p>
<p>I want to share that it's better to have at least a vague idea of when you start your day and finish it. It can be a good thing for your work-life balance, staying focused, and getting your work in the dedicated timeframe.</p>
<p>But as with all the tips I'm sharing in this article, it's a matter of personal opinion. I often shift my work schedule depending on a meeting or if I want to work more one day, and so on. Remote work gives you more flexibility and freedom. So it would be sad to not benefit from it! Just do what's best for you.</p>
<h3 id="heading-2-schedule-your-tasks">2. Schedule your tasks</h3>
<p>This advice applies to many topics, but you will probably work more efficiently and achieve your goals easier if you schedule your day.</p>
<p>As a remote worker, it can be a good motivation factor. An organized day with focused work results in more time for yourself, lets you start working on something new at your job, or anything that you like.</p>
<h2 id="heading-tip-5-learn-to-deep-focus">Tip #5 – Learn to deep focus</h2>
<p>Practicing some deep focus sessions is your ally if you want to skyrocket your productivity. Let me give you three tips that can help with it.</p>
<h3 id="heading-1-listen-to-focus-songs">1. Listen to focus songs</h3>
<p>Using focus/chill music can help you stay productive and enter into a deep focus. It's often an excellent way to hack your productivity.</p>
<p>Here are some examples of websites where you can listen to that kind of music for free:</p>
<ul>
<li><a target="_blank" href="https://coderadio.freecodecamp.org/">freeCodeCamp radio</a></li>
<li><a target="_blank" href="https://www.youtube.com/c/LofiGirl">LofiGirl on YouTube</a></li>
<li><a target="_blank" href="https://www.youtube.com/channel/UCJhjE7wbdYAae1G25m0tHAA">Cafe Music BGM channel on YouTube</a></li>
</ul>
<h3 id="heading-2-use-the-do-not-disturb-option-on-your-phone">2. Use the "Do not disturb" option on your phone</h3>
<p>Nowadays, we always receive notifications on our phones. Most modern devices have a "Do not disturb" feature that allows you to disable notifications when entering "Work" mode.</p>
<p>If you don't have this option, tons of applications like <a target="_blank" href="https://www.forestapp.cc/">Forest</a> in the store allow you to "restrict" your phone and enter focus mode.</p>
<h3 id="heading-3-limit-distractions">3. Limit distractions</h3>
<p>A bit related to the last tip, limiting distractions helps you stay focused. Review your environment and try to remove or push away all objects that annoy you while working.</p>
<p>Here are some examples: put away your phone, close YouTube videos while working, switch off the TV, and so on.</p>
<h2 id="heading-wrapping-up">Wrapping up</h2>
<p>Thank you for reading this article. I hope it provided you with insightful tips to improve your remote work life or even start working remotely.</p>
<p>I regularly deliver content about web development, personal growth as a developer, and my journey as an aspiring digital nomad and remote software engineer. If you don't want to miss them, I invite you to <a target="_blank" href="https://twitter.com/gaelgthomas">follow me on Twitter</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Why You Should Share Your Knowledge as a Developer ]]>
                </title>
                <description>
                    <![CDATA[ Sharing your knowledge can help you improve your skills and level up your career as a developer. Many developers are already doing it, and if you aren't, this article is for you. In it, I will show you why you should share your coding expertise by lo... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/why-you-should-share-your-knowledge-as-a-developer/</link>
                <guid isPermaLink="false">66bb9223add24ba427325105</guid>
                
                    <category>
                        <![CDATA[ community ]]>
                    </category>
                
                    <category>
                        <![CDATA[ community building ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technical writing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gaël Thomas ]]>
                </dc:creator>
                <pubDate>Mon, 27 Sep 2021 17:41:26 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/09/why-you-should-share-your-knowledge-as-a-developer.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Sharing your knowledge can help you improve your skills and level up your career as a developer. Many developers are already doing it, and if you aren't, this article is for you.</p>
<p>In it, I will show you why you should share your coding expertise by looking at five extraordinary benefits.</p>
<p>I have always enjoyed sharing content online and helping others. But today, as a software engineer, I can tell you that it helps me even more.</p>
<p>Recently, I started asking myself about the benefits of doing sharing knowledge. That's how I found five reasons that will motivate you to start today.</p>
<p>Let’s discover them!</p>
<h2 id="heading-youll-gain-a-deeper-understanding-of-what-youre-learning">You'll gain a deeper understanding of what you’re learning</h2>
<p>One of the main benefits of sharing what you know is that you will deep dive into the subjects you want to share with everyone.</p>
<p>This means that you will repeat your learning process in order to best write your technical content. By doing so, you strengthen your knowledge of the subject, and you may even learn something new.</p>
<p>For example, when I'm creating new content, I like to read similar resources before I start writing. This helps me to understand the concept better and write something more accurate and useful.</p>
<p>Then when I publish my content, sometimes I receive feedback that gives me better ways of solving my issue.</p>
<p>This happens to me often when I'm sharing articles about JavaScript, and it's super useful in my own learning process.</p>
<h2 id="heading-youll-help-others">You’ll help others</h2>
<p>Always remember that you're not alone! Many developers encounter the same issue as you and will benefit from your specific way of explaining that issue.</p>
<p>In the beginning, you might feel like you're writing only for yourself. But one day people will start finding your content and they'll learn from and enjoy it.</p>
<p>I recommend using an open publishing platform like Hashnode, Dev.to, or Twitter if you want to get started. These have significant developer communities built around them. People there will support you and give you feedback on your content. It can be an excellent motivation to start!</p>
<p>And once you've done some writing, you can apply to publications like freeCodeCamp's and share your knowledge with the large community they've built as well.</p>
<p>One side note: even if there is plenty of content about a particular topic, please write your own article about it. There is considerable potential that your article will complete or complement what's already out there. Everyone explains things and brings value in their own way.</p>
<h2 id="heading-youll-have-fun-and-discover-new-opportunities">You’ll have fun and discover new opportunities</h2>
<p>Creating content takes time, but it's a fun way to learn. You will improve your skills while building an audience of people with the same interests as you.</p>
<p>I've seen a lot of great stories from developers sharing content on Twitter. The good thing is that the Tech community is generally supportive, and everyone helps each other.</p>
<p>Also, building an audience, or at least sharing content online, can bring you new opportunities. For example, it can help you find and apply for a new job, create a side-project, and even more.</p>
<h2 id="heading-youll-create-a-piece-of-knowledge-for-your-future-self">You’ll create a piece of knowledge for your future self</h2>
<p>Sharing your knowledge is like writing documentation for your work. It helps others – but it also helps you! You can refer later to what you documented and shared if you can't remember how you solved a bug or issue.</p>
<p>As an example, I like to take notes whenever I repetitively search for something on Google. And I know that others are probably searching for the same thing. </p>
<p>So later, I often write an article about that search. It allows me to refer to my content when I need a reminder.</p>
<p>It’s very gratifying when you find your article on Google, and at the same time it helps you and others.</p>
<p>You should give it a try :)</p>
<h2 id="heading-youll-be-more-motivated">You’ll be more motivated</h2>
<p>Last but not least – creating content will help you stay motivated. Sharing your journey as a developer can help you feel like you're making progress in your learning.</p>
<p>I think this is the case because:</p>
<ul>
<li>you will have concrete pieces of content based on what you learned, tested, and built (it helps to keep track of your progress)</li>
<li>you will help others and have their support</li>
<li>you will have fun (enjoying the process = motivation)</li>
</ul>
<h2 id="heading-ready-to-start">Ready to start?</h2>
<p>Hopefully, this article can motivate you to start sharing your knowledge. Start today by sharing your learning journey with the community.</p>
<p>I have primarily written up these benefits based on my experience. I'm pretty sure you can find even more. In any case, you'll have a lot of fun getting started.</p>
<p><strong>If you're interested, <a target="_blank" href="https://twitter.com/gaelgthomas/">follow me on Twitter 🐦</a>! I'll help you to improve your skills as a web developer.</strong></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Build a Node.js Database using Prisma and SQLite ]]>
                </title>
                <description>
                    <![CDATA[ Lately I've been seeing many tweets and articles about Prisma. It's a modern ORM (Object-Relational-Mapping tool) that works with Node.jsand TypeScript. Yes, this library will help you build and manage your Node.js database – and it's compatible with... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/build-nodejs-database-using-prisma-orm/</link>
                <guid isPermaLink="false">66bb9200a5fd14123a8b4a34</guid>
                
                    <category>
                        <![CDATA[ database ]]>
                    </category>
                
                    <category>
                        <![CDATA[ node js ]]>
                    </category>
                
                    <category>
                        <![CDATA[ SQLite ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gaël Thomas ]]>
                </dc:creator>
                <pubDate>Wed, 11 Aug 2021 15:24:42 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/08/manage-node-js-database-prisma-orm.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Lately I've been seeing many tweets and articles about <a target="_blank" href="https://www.prisma.io/">Prisma</a>. It's a modern <a target="_blank" href="https://blog.bitsrc.io/what-is-an-orm-and-why-you-should-use-it-b2b6f75f5e2a">ORM</a> (Object-Relational-Mapping tool) that works with Node.jsand TypeScript.</p>
<p>Yes, this library will help you build and manage your Node.js database – and it's compatible with TypeScript! It will generate all the types of your entities automatically.</p>
<p>The schema definition is easy to read by humans – no more headache there. You will see how that works in the coming sections.</p>
<p>Also, the ORM works well with Next.js, GraphQL, Nest.Js, Express.js, Apollo, and Hapi.</p>
<p>To summarize, Prisma is a modern ORM that plays nice with all the trending tech stacks.</p>
<p>That is why I decided to try it and to replace my previous database management library: <a target="_blank" href="https://typeorm.io/">TypeORM</a>.</p>
<blockquote>
<p>"Prisma helps app developers build faster and make fewer errors with an open source ORM for PostgreSQL, MySQL and SQLite." – <a target="_blank" href="https://www.prisma.io/">Prisma homepage</a></p>
</blockquote>
<h2 id="heading-lets-build-a-simple-twitter-database-using-node-prisma-and-sqlite">Let's build a simple Twitter database using Node, Prisma, and SQLite</h2>
<p>Time to practice. I will show you how to build your first Node.js database using Prisma. To keep this introduction accessible, we will use Node with SQLite.</p>
<p>SQLite is a self-contained database engine. This means that you don't need to configure a database on your computer. The project will run by itself if you follow the steps of this tutorial.</p>
<p>If, in the future, you want to use Prisma with a PostgreSQL database, here is a <a target="_blank" href="https://herewecode.io/blog/create-a-postgresql-database-using-docker-compose/">tutorial on creating a PostgreSQL database using Docker-Compose</a>.</p>
<h3 id="heading-prerequisites">Prerequisites</h3>
<ul>
<li><strong>Node.js (12.2 or higher)</strong></li>
</ul>
<p>Before getting started, take the time to double-check if you have version 12.2 or higher of <a target="_blank" href="https://nodejs.org/en/">Node.js</a>. If you don't, just update your Node before starting the next section.</p>
<blockquote>
<p><strong>Note:</strong> If you want to check your Node.js version, you can type: <code>node -v</code> in a terminal. The output will be the version.</p>
</blockquote>
<ul>
<li><strong>Basic SQL knowledge</strong></li>
</ul>
<p>Even though I'm taking a simple approach to this new library, I recommend that you have basic SQL knowledge to fully understand the tutorial.</p>
<blockquote>
<p><strong>Note:</strong> You don't need to be an expert! Only the basics like creating a table and making some requests are essential here.</p>
</blockquote>
<h2 id="heading-how-to-set-up-a-basic-twitter-project">How to Set Up a Basic Twitter Project</h2>
<p>First, you need to create a new folder for this project and move into it:</p>
<pre><code class="lang-shell">$ mkdir minimalistic-twitter
$ cd minimalistic-twitter
</code></pre>
<p>Then, we will install all the mandatory dependencies such as TypeScript and Prisma.</p>
<pre><code class="lang-shell">$ npm init -y
$ npm install prisma typescript ts-node @types/node --save-dev
$ npm install @prisma/client
</code></pre>
<p>From now, you should see a <code>node_modules</code> folder and a <code>package.json</code> file in your repository.</p>
<p>Before moving on to the Prisma initialization, the last configuration step is to create a configuration for TypeScript at the repository root.</p>
<p>To do so, you can create a <code>tsconfig.json</code> and paste the following configuration:</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"compilerOptions"</span>: {
    <span class="hljs-attr">"sourceMap"</span>: <span class="hljs-literal">true</span>,
    <span class="hljs-attr">"outDir"</span>: <span class="hljs-string">"dist"</span>,
    <span class="hljs-attr">"strict"</span>: <span class="hljs-literal">true</span>,
    <span class="hljs-attr">"lib"</span>: [<span class="hljs-string">"esnext"</span>],
    <span class="hljs-attr">"esModuleInterop"</span>: <span class="hljs-literal">true</span>
  }
}
</code></pre>
<p>There we go! It's time to use Prisma in our project. In the <code>minimalistic-twitter</code> folder, you can use the following command to prompt the Prisma help output.</p>
<pre><code class="lang-shell">$ npx prisma
</code></pre>
<p>Now, the last step before building our minimalistic Twitter app is to initialize the database configuration.</p>
<p>We will use the <code>init</code> command but with a <code>--datasource-provider</code> parameter to set the database type. Otherwise, by default, <code>init</code> will create a PostgreSQL database.</p>
<pre><code class="lang-shell">$ npx prisma init --datasource-provider sqlite
</code></pre>
<p>When the command finishes executing, you should find in your repository a <code>.env</code> file and a <code>prisma</code> folder with a <code>schema.prisma</code> file inside of it.</p>
<p>The <code>schema.prisma</code> file contains all the instructions to connect to your database. Later it will also include the instructions to generate your database tables.</p>
<p>The <code>.env</code> file contains all the environment variable that your project needs to run. For Prisma, the only variable is <code>DATABASE_URL</code>. Its value is set to <code>./dev.db</code> .</p>
<p>The <code>dev.db</code> file will be the self-contained database file.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-07-at-23.56.14.png" alt="Project tree after the project initialization" width="600" height="400" loading="lazy">
<em>Project tree after the project initialization</em></p>
<p>If you have the same output, congrats, it means that your project is ready! 🎉</p>
<h2 id="heading-how-to-build-our-first-model-user">How to Build Our First Model – User</h2>
<p>Our basic Twitter database will consist of two main entities:</p>
<ul>
<li>A user entity with the user information and its tweets</li>
<li>A tweet entity with the tweet content and its author</li>
</ul>
<p>First, we'll focus on user entity creation. Each of them has:</p>
<ul>
<li>an id</li>
<li>a unique email (two users can't have the same email)</li>
<li>a username</li>
<li>a list of tweets</li>
</ul>
<p>With Prisma, if we want to define a new schema (model), we need to do it in the <code>schema.prisma</code> file.</p>
<p>To define an entity, we will use the <code>model</code> instruction as below. You can reproduce it after the database connection instruction in your <code>schema.prisma</code> file.</p>
<pre><code class="lang-typescript"><span class="hljs-comment">// After the database connection</span>

model User {
  <span class="hljs-comment">// We set an `id` variable</span>
  <span class="hljs-comment">// With an `Int` type (number)</span>
  <span class="hljs-comment">// Then, we set the Prisma decorators:</span>
  <span class="hljs-comment">// - @id (because it's an ID)</span>
  <span class="hljs-comment">// - @default(autoincrement()) (default value is auto-incremented)</span>
  id Int <span class="hljs-meta">@id</span> <span class="hljs-meta">@default</span>(autoincrement())

  <span class="hljs-comment">// We set an `email` variable</span>
  <span class="hljs-comment">// With a `String` type</span>
  <span class="hljs-comment">// Then, we set the Prisma decorator:</span>
  <span class="hljs-comment">// - @unique (because we want the user to be unique</span>
  <span class="hljs-comment">// based on the email - two users can't have the same)</span>
  email <span class="hljs-built_in">String</span> <span class="hljs-meta">@unique</span>

  <span class="hljs-comment">// We set a `username` variable</span>
  <span class="hljs-comment">// With a `String` type</span>
  username <span class="hljs-built_in">String</span>

  <span class="hljs-comment">// We set a `tweets` variable</span>
  <span class="hljs-comment">// With a `Tweet[]` type (one-to-many relationship)</span>
  <span class="hljs-comment">// Because each user can have between</span>
  <span class="hljs-comment">// 0 and an infinite number of tweets</span>
  tweets Tweet[]
}
</code></pre>
<p>As you might notice, we don't have the <code>Tweet</code> model yet. It will be our next step.</p>
<h2 id="heading-how-to-build-our-second-model-tweet">How to Build Our Second Model – Tweet</h2>
<p>Now that we have users, we need tweets. Let's follow the same process as before, but this time for the <code>Tweet</code> entity.</p>
<p>Each of them has:</p>
<ul>
<li>an id</li>
<li>a creation date</li>
<li>a text</li>
<li>an userId (tweet's author)</li>
</ul>
<p>Below, you will find the entity. You can reproduce it after the <code>User</code> model declaration in your <code>schema.prisma</code> file.</p>
<pre><code class="lang-typescript"><span class="hljs-comment">// After the database connection</span>

<span class="hljs-comment">// After the User model</span>

model Tweet {
  <span class="hljs-comment">// We set an `id` variable</span>
  <span class="hljs-comment">// With an `Int` type (number)</span>
  <span class="hljs-comment">// Then, we set the Prisma decorators:</span>
  <span class="hljs-comment">// - @id (because it's an ID)</span>
  <span class="hljs-comment">// - @default(autoincrement()) (default value is auto-incremented)</span>
  id Int <span class="hljs-meta">@id</span> <span class="hljs-meta">@default</span>(autoincrement())

  <span class="hljs-comment">// Save the tweet creation time</span>
  createdAt DateTime <span class="hljs-meta">@default</span>(now())

  <span class="hljs-comment">// We set a `text` variable</span>
  <span class="hljs-comment">// With a `String` type</span>
  text <span class="hljs-built_in">String</span>

  <span class="hljs-comment">// We set a `userId` variable</span>
  <span class="hljs-comment">// With an `Int` type (number)</span>
  <span class="hljs-comment">// It will link the `id` of the `User` model</span>
  userId Int

  <span class="hljs-comment">// We set a `user` variable</span>
  <span class="hljs-comment">// With a `User` type (many-to-one relationship)</span>
  <span class="hljs-comment">// Because each tweet has an author</span>
  <span class="hljs-comment">// This author is a `User`</span>
  <span class="hljs-comment">// We link the `User` to a `Tweet` based on:</span>
  <span class="hljs-comment">// - the `userId` in the `Tweet` model</span>
  <span class="hljs-comment">// - the `id` in the `User` model</span>
  user User <span class="hljs-meta">@relation</span>(fields: [userId], references: [id])
}
</code></pre>
<h2 id="heading-how-to-generate-our-first-database-migration">How to Generate our First Database Migration</h2>
<p>The first thing we need to do before using our database is to generate it. To do so, we will use another command of the Prisma CLI. This command will allow us to create migrations.</p>
<p>If we have a look at the documentation about the <code>migrate</code> command, we'll see the following:</p>
<blockquote>
<p>"Prisma Migrate is an imperative database schema migration tool that enables you to: <strong>Keep your database schema in sync with your Prisma schema as it evolves _and m_aintain existing data in your database</strong>." – <a target="_blank" href="https://www.prisma.io/docs/concepts/components/prisma-schema/">Prisma migrate documentation</a></p>
</blockquote>
<p>The idea here is to save our first database implementation. You can do it by typing the command below in your terminal:</p>
<pre><code class="lang-shell">npx prisma migrate dev --name initialize
</code></pre>
<p><strong>Note:</strong> You can enter the name of your choice after the <code>--name</code> parameter. Keep in mind that the migration name is helpful to remember the changes you made.</p>
<p>If your migration command is successful, it means that all the instructions in <code>schema.prisma</code> are correct. ✅</p>
<p>Your project tree should now be similar to the image below (except for the migration hash).</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-08-at-00.41.22.png" alt="Project tree after the migration generation" width="600" height="400" loading="lazy">
<em>Project tree after the migration generation</em></p>
<p><strong>Note:</strong> In the <code>migration.sql</code> file, you will find the SQL queries to generate your database.</p>
<p>Your database is ready! 🚀 It's time to try it, add some users, and let them tweet.</p>
<h2 id="heading-how-to-test-our-node-js-sqlite-project">How to Test our Node JS SQLite Project</h2>
<p>So, will the users now be able to tweet? Let's try to run some queries on our database. We'll create an <code>index.ts</code> file at the repository root, and we'll write some instructions into it.</p>
<p>First, we need to import and initialize the database connection. Based on the <a target="_blank" href="https://www.prisma.io/docs/getting-started/quickstart/">Prisma Quickstart documentation</a>, we create a <code>prisma</code> variable to interact with the database and a function to write our test code:</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">import</span> { PrismaClient } <span class="hljs-keyword">from</span> <span class="hljs-string">"@prisma/client"</span>;

<span class="hljs-keyword">const</span> prisma = <span class="hljs-keyword">new</span> PrismaClient();

<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">main</span>(<span class="hljs-params"></span>) </span>{}

main()
  .catch(<span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> {
    <span class="hljs-keyword">throw</span> e;
  })
  .finally(<span class="hljs-keyword">async</span> () =&gt; {
    <span class="hljs-keyword">await</span> prisma.$disconnect();
  });
</code></pre>
<p>We're ready to fill the <code>main</code> function with some instructions.</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">import</span> { PrismaClient } <span class="hljs-keyword">from</span> <span class="hljs-string">"@prisma/client"</span>;

<span class="hljs-keyword">const</span> prisma = <span class="hljs-keyword">new</span> PrismaClient();

<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">main</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-comment">// We create a new user</span>
  <span class="hljs-keyword">const</span> newUser = <span class="hljs-keyword">await</span> prisma.user.create({
    data: {
      email: <span class="hljs-string">"hello@herewecode.io"</span>,
      username: <span class="hljs-string">"gaelgthomas"</span>, <span class="hljs-comment">// &lt;- it's also my Twitter username 😄</span>
    },
  });

  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"New User:"</span>);
  <span class="hljs-built_in">console</span>.log(newUser);

  <span class="hljs-comment">// We create a new tweet and we link it to our new user</span>
  <span class="hljs-keyword">const</span> firstTweet = <span class="hljs-keyword">await</span> prisma.tweet.create({
    data: {
      text: <span class="hljs-string">"Hello world!"</span>,
      userId: newUser.id,
    },
  });

  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"First tweet:"</span>);
  <span class="hljs-built_in">console</span>.log(firstTweet);

  <span class="hljs-comment">// We fetch the new user again (by its unique email address)</span>
  <span class="hljs-comment">// and we ask to fetch its tweets at the same time</span>
  <span class="hljs-keyword">const</span> newUserWithTweets = <span class="hljs-keyword">await</span> prisma.user.findUnique({
    where: {
      email: <span class="hljs-string">"hello@herewecode.io"</span>,
    },
    include: { tweets: <span class="hljs-literal">true</span> },
  });

  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"User object with Tweets:"</span>);
  <span class="hljs-built_in">console</span>.dir(newUserWithTweets);
}

main()
  .catch(<span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> {
    <span class="hljs-keyword">throw</span> e;
  })
  .finally(<span class="hljs-keyword">async</span> () =&gt; {
    <span class="hljs-keyword">await</span> prisma.$disconnect();
  });
</code></pre>
<p><strong>Note:</strong> If you want to discover the different instructions you can use, a good Prisma documentation page is <a target="_blank" href="https://www.prisma.io/docs/concepts/components/prisma-client/crud">the CRUD one</a>.</p>
<p>Time to run the <code>index.ts</code> file.</p>
<p>Before doing it, open your <code>package.json</code> file and search for the <code>scripts</code> section. You will need to add a command to start the project using <code>ts-node</code>.</p>
<p>If you want, you can replace your <code>scripts</code> section with the following code:</p>
<pre><code class="lang-json"><span class="hljs-string">"scripts"</span>: {
  <span class="hljs-attr">"dev"</span>: <span class="hljs-string">"ts-node ./index.ts"</span>,
  <span class="hljs-attr">"test"</span>: <span class="hljs-string">"echo \"Error: no test specified\" &amp;&amp; exit 1"</span>
},
</code></pre>
<p>Then, in your terminal, you can type the command below and read the output to see if everything is working well:</p>
<pre><code class="lang-shell">$ npm run dev
</code></pre>
<p><strong>Note</strong>: In the command above, we run the dev script from our package.json.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-08-at-01.04.59.png" alt="NPM test output using Prisma" width="600" height="400" loading="lazy">
<em>NPM test output using Prisma</em></p>
<p>It's working! You got your first user and tweet. 👏 Now that you've set up your first database using Prisma, you can add some features to it. Here are some ideas:</p>
<ul>
<li>add more information in the User entity (birthday, address, biography, and so on)</li>
<li>add a like system (each tweet can have likes, each user can have a liked tweet list)</li>
</ul>
<h3 id="heading-the-code-is-available-on-github-node-js-with-prisma-and-sqlite"><strong>The Code is available on Github – Node JS with Prisma and SQLite</strong></h3>
<p>If you want to get the complete code, you can find it on my GitHub.</p>
<p><strong>-&gt;</strong> <a target="_blank" href="https://github.com/gaelgthomas/prisma-sqlite-example">GitHub: Prisma SQLite example</a></p>
<p><strong>Thanks for reading until the end!</strong></p>
<p>I hope you will use Prisma in one of your next projects. 🎉</p>
<p>I'm starting to tweet more consistently. If you want to get more tips and resources about web programming -&gt; <a target="_blank" href="https://twitter.com/gaelgthomas">Find me on my Twitter 🐦</a></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 5 JavaScript Tips That'll Help You Save Time ]]>
                </title>
                <description>
                    <![CDATA[ I've always wanted to create videos around my programming hobby. But I'm not a native English speaker, and I was scared to try. But a few weeks ago, while I was preparing some JavaScript tips to start my YouTube journey, I wrote this list of time-sav... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/time-saving-javascript-tips/</link>
                <guid isPermaLink="false">66bb921bd2bda3e4315491e7</guid>
                
                    <category>
                        <![CDATA[ ES6 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tips ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gaël Thomas ]]>
                </dc:creator>
                <pubDate>Thu, 19 Nov 2020 16:54:42 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/11/time-saving-javascript-tips.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>I've always wanted to create videos around my programming hobby. But I'm not a native English speaker, and I was scared to try.</p>
<p>But a few weeks ago, while I was preparing some JavaScript tips to start my YouTube journey, I wrote this list of time-saving tips. I hope they help you as they've helped me.</p>
<p>In this article, I'm going to share with you 5 useful JavaScript tips (are you ready to dive in? 😀).</p>
<p>And now, guess what? Some of these tips are on <a target="_blank" href="https://www.youtube.com/channel/UCSRuzHhjUaAnBb6_rmlr10g">my YouTube channel</a>📹! (here is <a target="_blank" href="https://www.youtube.com/playlist?list=PL-P9AMQZdy2aj3uLhjHagEsfTOrVqF7AR">the playlist</a>. </p>
<h2 id="heading-object-destructuring">Object Destructuring</h2>
<p>Destructuring is a feature that was introduced in ES6. It's one of the features you will use daily once you know how.</p>
<p>It helps you deal with three main issues:</p>
<ul>
<li><strong>Repetition.</strong> Every time you want to extract one object property and create a new variable, you create a new line.</li>
</ul>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> user = {
  <span class="hljs-attr">firstName</span>: <span class="hljs-string">"John"</span>,
  <span class="hljs-attr">lastName</span>: <span class="hljs-string">"Doe"</span>,
  <span class="hljs-attr">password</span>: <span class="hljs-string">"123"</span>,
};

<span class="hljs-comment">// Wow... should we display</span>
<span class="hljs-comment">// John's password like that?</span>

<span class="hljs-keyword">const</span> firstName = user.firstName;
<span class="hljs-keyword">const</span> lastName = user.lastName;
<span class="hljs-keyword">const</span> password = user.password;
</code></pre>
<ul>
<li><strong>Accessibility.</strong> Each time you want to access an object property, you should write the path to it. (<strong>example:</strong> <code>user.firstName</code>, <code>user.family.sister</code>, and so on).</li>
<li><strong>Usage.</strong> As an example, when you create a new function, and you are only working with one property of an object.</li>
</ul>
<p>Now that you've seen what these three issues with objects are, how do you think you can solve them?</p>
<h3 id="heading-how-to-solve-the-repetition-issue">How to Solve the Repetition Issue</h3>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> user = {
  <span class="hljs-attr">firstName</span>: <span class="hljs-string">"John"</span>,
  <span class="hljs-attr">lastName</span>: <span class="hljs-string">"Doe"</span>,
  <span class="hljs-attr">password</span>: <span class="hljs-string">"123"</span>,
};

<span class="hljs-keyword">const</span> { firstName, lastName, password } = user;

<span class="hljs-built_in">console</span>.log(firstName, lastName, password);
<span class="hljs-comment">// Output: 'John', 'Doe', '123'</span>
</code></pre>
<p>Destructuring is the process of extracting a property from an object by its key. By taking an existing key in your object, then placing it between two brackets (<code>{ firstName }</code>) you tell JavaScript:</p>
<p>"Hey JavaScript, I want to create a variable with the same name as my property. I want to create a variable <code>firstName</code> for the <code>firstName</code> property of my object."</p>
<blockquote>
<p><strong>Note:</strong> If you want to destructure an object, you should always use an existing key. Otherwise, it will not work.</p>
</blockquote>
<h3 id="heading-how-to-solve-the-accessibility-issue">How to Solve the Accessibility Issue</h3>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> user = {
  <span class="hljs-attr">firstName</span>: <span class="hljs-string">"John"</span>,
  <span class="hljs-attr">lastName</span>: <span class="hljs-string">"Doe"</span>,
  <span class="hljs-attr">password</span>: <span class="hljs-string">"123"</span>,
  <span class="hljs-attr">family</span>: {
    <span class="hljs-attr">sister</span>: {
      <span class="hljs-attr">firstName</span>: <span class="hljs-string">"Maria"</span>,
    },
  },
};

<span class="hljs-comment">// We access to the nested object `sister`</span>
<span class="hljs-comment">// and we extract the `firstName` property</span>
<span class="hljs-keyword">const</span> { firstName } = user.family.sister;

<span class="hljs-built_in">console</span>.log(firstName);
<span class="hljs-comment">// Output: 'Maria'</span>
</code></pre>
<p>When you work with nested objects, it can become quite repetitive and wastes a lot of time accessing the same property many times.</p>
<p>Using destructuring, in one line only, you can reduce the property path to one variable.</p>
<h3 id="heading-how-to-solve-the-usage-issue">How to Solve the Usage Issue</h3>
<p>Now that you know how to destructure an object, let me show you how to extract properties directly in your function parameter definition.</p>
<p>If you know React, you're probably already familiar with it.</p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getUserFirstName</span>(<span class="hljs-params">{ firstName }</span>) </span>{
  <span class="hljs-keyword">return</span> firstName;
}

<span class="hljs-keyword">const</span> user = {
  <span class="hljs-attr">firstName</span>: <span class="hljs-string">"John"</span>,
  <span class="hljs-attr">lastName</span>: <span class="hljs-string">"Doe"</span>,
  <span class="hljs-attr">password</span>: <span class="hljs-string">"123"</span>,
};

<span class="hljs-built_in">console</span>.log(getUserFirstName(user));
<span class="hljs-comment">// Output: 'John'</span>
</code></pre>
<p>In the above example, we have a <code>getUserFirstName</code> function, and we know that it will only use one property of our object, <code>firstName</code>.</p>
<p>Rather than passing the whole object or creating a new variable, we can destructure the object's function parameters.</p>
<h2 id="heading-how-to-merge-objects-in-es6">How to Merge Objects in ES6</h2>
<p>In programming, you often have to tackle issues with data structures. Thanks to <a target="_blank" href="https://herewecode.io/blog/spread-operator-in-javascript/">the spread operator</a> introduced in ES6, object and array manipulations are more straightforward.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> user = {
  <span class="hljs-attr">firstName</span>: <span class="hljs-string">"John"</span>,
  <span class="hljs-attr">lastName</span>: <span class="hljs-string">"Doe"</span>,
  <span class="hljs-attr">password</span>: <span class="hljs-string">"123"</span>,
};

<span class="hljs-keyword">const</span> userJob = {
  <span class="hljs-attr">jobName</span>: <span class="hljs-string">"Developer"</span>,
  <span class="hljs-attr">jobCountry</span>: <span class="hljs-string">"France"</span>,
  <span class="hljs-attr">jobTimePerWeekInHour</span>: <span class="hljs-string">"35"</span>,
};
</code></pre>
<p>Let's imagine that we have two objects:</p>
<ul>
<li><strong>User.</strong> An object defining general information about the user.</li>
<li><strong>UserJob.</strong> An object defining job information of the user.</li>
</ul>
<p>We want to create one object that only contains the properties of these two objects.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> user = {
  <span class="hljs-attr">firstName</span>: <span class="hljs-string">"John"</span>,
  <span class="hljs-attr">lastName</span>: <span class="hljs-string">"Doe"</span>,
  <span class="hljs-attr">password</span>: <span class="hljs-string">"123"</span>,
};

<span class="hljs-keyword">const</span> userJob = {
  <span class="hljs-attr">jobName</span>: <span class="hljs-string">"Developer"</span>,
  <span class="hljs-attr">jobCountry</span>: <span class="hljs-string">"France"</span>,
  <span class="hljs-attr">jobTimePerWeekInHour</span>: <span class="hljs-string">"35"</span>,
};

<span class="hljs-keyword">const</span> myNewUserObject = {
  ...user,
  ...userJob,
};

<span class="hljs-built_in">console</span>.log(myNewUserObject);
<span class="hljs-comment">// Output:</span>
<span class="hljs-comment">//{</span>
<span class="hljs-comment">//  firstName: 'John',</span>
<span class="hljs-comment">//  lastName: 'Doe',</span>
<span class="hljs-comment">//  password: '123',</span>
<span class="hljs-comment">//  jobName: 'Developer',</span>
<span class="hljs-comment">//  jobCountry: 'France',</span>
<span class="hljs-comment">//  jobTimePerWeekInHour: '35'</span>
<span class="hljs-comment">//}</span>
</code></pre>
<p>Using the spread operator (<code>...</code>), we can extract all the properties of one object to another.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> user = {
  <span class="hljs-attr">firstName</span>: <span class="hljs-string">"John"</span>,
  <span class="hljs-attr">lastName</span>: <span class="hljs-string">"Doe"</span>,
  <span class="hljs-attr">password</span>: <span class="hljs-string">"123"</span>,
};

<span class="hljs-keyword">const</span> myNewUserObject = {
  ...user,
  <span class="hljs-comment">// We extract:</span>
  <span class="hljs-comment">// - firstName</span>
  <span class="hljs-comment">// - lastName</span>
  <span class="hljs-comment">// - password</span>
  <span class="hljs-comment">// and send them to</span>
  <span class="hljs-comment">// a new object `{}`</span>
};
</code></pre>
<h3 id="heading-how-to-merge-arrays">How to Merge Arrays</h3>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> girlNames = [<span class="hljs-string">"Jessica"</span>, <span class="hljs-string">"Emma"</span>, <span class="hljs-string">"Amandine"</span>];
<span class="hljs-keyword">const</span> boyNames = [<span class="hljs-string">"John"</span>, <span class="hljs-string">"Terry"</span>, <span class="hljs-string">"Alexandre"</span>];

<span class="hljs-keyword">const</span> namesWithSpreadSyntax = [...girlNames, ...boyNames];

<span class="hljs-built_in">console</span>.log(namesWithSpreadSyntax);
<span class="hljs-comment">// Output: ['Jessica', 'Emma', 'Amandine', 'John', 'Terry', 'Alexandre']</span>
</code></pre>
<p>Like objects, the spread operator (<code>...</code>) extracts all the elements from one array to another.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> girlNames = [<span class="hljs-string">"Jessica"</span>, <span class="hljs-string">"Emma"</span>, <span class="hljs-string">"Amandine"</span>];

<span class="hljs-keyword">const</span> newNewArray = [
  ...girlNames,
  <span class="hljs-comment">// We extract:</span>
  <span class="hljs-comment">// - 'Jessica'</span>
  <span class="hljs-comment">// - 'Emma'</span>
  <span class="hljs-comment">// - 'Amandine'</span>
  <span class="hljs-comment">// and send them to</span>
  <span class="hljs-comment">// a new array `[]`</span>
];
</code></pre>
<h3 id="heading-how-to-remove-array-duplicates">How to Remove Array Duplicates</h3>
<p>Because arrays are lists, you can have many items of the same value. If you want to remove duplicates in your array, you can follow one of the examples below.</p>
<p>One of them will be only one line thanks to ES6, but I let the "old" example  in there so you can compare.</p>
<h4 id="heading-how-to-remove-array-duplicates-the-old-way">How to remove array duplicates "the old way"</h4>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> animals = [<span class="hljs-string">"owl"</span>, <span class="hljs-string">"frog"</span>, <span class="hljs-string">"canary"</span>, <span class="hljs-string">"duck"</span>, <span class="hljs-string">"duck"</span>, <span class="hljs-string">"goose"</span>, <span class="hljs-string">"owl"</span>];

<span class="hljs-keyword">const</span> uniqueAnimalsWithFilter = animals.filter(
  <span class="hljs-comment">// Parameters example: 'owl', 0, ['owl', 'frog', 'canary', 'duck', 'duck', 'goose', 'owl']</span>
  <span class="hljs-function">(<span class="hljs-params">animal, index, array</span>) =&gt;</span> array.indexOf(animal) == index
);

<span class="hljs-built_in">console</span>.log(uniqueAnimalsWithSet);
<span class="hljs-comment">// Output: ['owl', 'frog', 'canary', 'duck', 'goose']</span>
</code></pre>
<p>In the above example, we want to clean the <code>animals</code> array by removing all duplicates.</p>
<p>We can do that by using the function <code>filter</code> with <code>indexOf</code> inside it.</p>
<p>The <code>filter</code> function takes all elements of the <code>animals</code> array (<code>animals.filter</code>). Then for each occurrence it provides:</p>
<ul>
<li>the current value (<strong>example:</strong> <code>duck</code>)</li>
<li>the index (<strong>example:</strong> 0)</li>
<li>the initial array (<strong>example:</strong> the <code>animals</code> array =&gt; <code>['owl', 'frog', 'canary', 'duck', 'duck', 'goose', 'owl']</code>)</li>
</ul>
<p>We will apply <code>indexOf</code> on the original array for each occurrence and give as a parameter the <code>animal</code> variable (the current value).</p>
<p><code>indexOf</code> will return the first index of the current value (<strong>example:</strong> for 'owl' the index is 0).</p>
<p>Then inside of the filter, we compare the value of <code>indexOf</code> to the current index. If it's the same, we return <code>true</code> otherwise <code>false</code>.</p>
<p><code>filter</code> will create a new array with only the elements where the returned value was <code>true</code>.</p>
<p>So, in our case: <code>['owl', 'frog', 'canary', 'duck', 'goose']</code>.</p>
<h3 id="heading-how-to-remove-array-duplicates-the-new-way">How to remove array duplicates "the new way"</h3>
<p>Well, the "old way" is interesting to understand, but it's long and a bit hard. So let's check out the new way now: </p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> animals = [<span class="hljs-string">"owl"</span>, <span class="hljs-string">"frog"</span>, <span class="hljs-string">"canary"</span>, <span class="hljs-string">"duck"</span>, <span class="hljs-string">"duck"</span>, <span class="hljs-string">"goose"</span>, <span class="hljs-string">"owl"</span>];

<span class="hljs-keyword">const</span> uniqueAnimalsWithSet = [...new <span class="hljs-built_in">Set</span>(animals)];

<span class="hljs-built_in">console</span>.log(uniqueAnimalsWithSet);
<span class="hljs-comment">// Output: ['owl', 'frog', 'canary', 'duck', 'goose']</span>
</code></pre>
<p>Let's separate out the different steps:</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// 1</span>
<span class="hljs-keyword">const</span> animals = [<span class="hljs-string">"owl"</span>, <span class="hljs-string">"frog"</span>, <span class="hljs-string">"canary"</span>, <span class="hljs-string">"duck"</span>, <span class="hljs-string">"duck"</span>, <span class="hljs-string">"goose"</span>, <span class="hljs-string">"owl"</span>];

<span class="hljs-comment">// 2</span>
<span class="hljs-keyword">const</span> animalsSet = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Set</span>(animals);

<span class="hljs-built_in">console</span>.log(animalsSet);
<span class="hljs-comment">// Output: Set { 'owl', 'frog', 'canary', 'duck', 'goose' }</span>

<span class="hljs-comment">// 3</span>
<span class="hljs-keyword">const</span> uniqueAnimalsWithSet = [...animalsSet];

<span class="hljs-built_in">console</span>.log(uniqueAnimalsWithSet);
<span class="hljs-comment">// Output: ['owl', 'frog', 'canary', 'duck', 'goose']</span>
</code></pre>
<p>We have an <code>animals</code> array, and we convert it into a <code>Set</code>, which is a special type of object in ES6.</p>
<p>The thing that's different about it is that it lets you create a collection of unique values.</p>
<blockquote>
<p><strong>Note:</strong> <code>Set</code> is a collection of unique values, but it's not an <code>Array</code>.</p>
</blockquote>
<p>Once we have our <code>Set</code> object with unique values, we need to convert it back to an array.</p>
<p>To do that, we use the spread operators to destructure it and send all the properties to a new <code>Array</code>.</p>
<p>Because the <code>Set</code> object has unique properties, our new array will also have unique values only.</p>
<h2 id="heading-how-to-use-ternary-operators">How to Use Ternary Operators</h2>
<p>Have you already heard about a way to write small conditions in only one line?</p>
<p>If not, it's time to remove a lot of your <code>if</code> and <code>else</code> blocks and convert them to small ternary operations.</p>
<p>Let's look at an example with <code>console.log</code> to start. The idea is to check the value of a variable and conditionally display an output.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> colour = <span class="hljs-string">"blue"</span>;

<span class="hljs-keyword">if</span> (colour === <span class="hljs-string">"blue"</span>) {
  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`It's blue!`</span>);
} <span class="hljs-keyword">else</span> {
  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`It's not blue!`</span>);
}
</code></pre>
<p>This example is a typical case where you can use <a target="_blank" href="https://herewecode.io/blog/ternary-operator-in-javascript/">the ternary operator</a> to reduce these 5 <code>if</code> and <code>else</code> lines to only one!</p>
<p><strong>One line to rule them all!</strong></p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> colour = <span class="hljs-string">"blue"</span>;

colour === <span class="hljs-string">"blue"</span> ? <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`It's blue!`</span>) : <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`It's not blue!`</span>);
<span class="hljs-comment">// [condition] ? [if] : [else]</span>
</code></pre>
<p>Ternary operators replace <code>if</code> and <code>else</code> for small conditions.</p>
<blockquote>
<p><strong>Note:</strong> It's not recommended to create complex conditions with ternary operators because it can reduce readability.</p>
</blockquote>
<p>Below is another example that uses ternary operators, but this time in the <code>return</code> of a function.</p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">sayHelloToAnne</span>(<span class="hljs-params">name</span>) </span>{
  <span class="hljs-keyword">return</span> name === <span class="hljs-string">"Anne"</span> ? <span class="hljs-string">"Hello, Anne!"</span> : <span class="hljs-string">"It's not Anne!"</span>;
}

<span class="hljs-built_in">console</span>.log(sayHelloToAnne(<span class="hljs-string">"Anne"</span>));
<span class="hljs-comment">// Output: 'Hello, Anne!'</span>

<span class="hljs-built_in">console</span>.log(sayHelloToAnne(<span class="hljs-string">"Gael"</span>));
<span class="hljs-comment">// Output: "It's not Anne!"</span>
</code></pre>
<h2 id="heading-want-to-contribute-heres-how">Want to Contribute? Here's How.</h2>
<p>You are welcome to contribute to this GitHub repository. Any contribution is appreciated, and it will help each of us improve our JavaScript skills.
<a target="_blank" href="https://github.com/gael-thomas/javascript-awesome-tips">GitHub: JavaScript Awesome Tips</a></p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>I hope you learned some new things about JavaScript while reading this post.</p>
<p>If you want more content like this, you can <a target="_blank" href="https://twitter.com/gaelgthomas/">follow me on Twitter</a> where I tweet about web development, self-improvement, and my journey as a full stack developer!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ A Beginner’s Guide to Git — What is a Changelog and How to Generate it ]]>
                </title>
                <description>
                    <![CDATA[ Say you are a developer, and you use Git for one of your projects. You want to share the changes you made with your users, but you don’t know how. Well, then this article is for you. In the last part of this series, I shared with you how to ]]>
                </description>
                <link>https://www.freecodecamp.org/news/a-beginners-guide-to-git-what-is-a-changelog-and-how-to-generate-it/</link>
                <guid isPermaLink="false">66bb91fd7a6500a14ba5b794</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gaël Thomas ]]>
                </dc:creator>
                <pubDate>Wed, 01 Apr 2020 09:36:56 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/04/what-is-a-changelog-and-how-to-generate-it.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Say you are a developer, and you use Git for one of your projects. You want to share the changes you made with your users, but you don’t know how. Well, then this article is for you.</p>
<p>In the last part of this series, I shared with you <a target="_blank" href="https://herewecode.io/blog/a-beginners-guide-to-git-how-to-write-a-good-commit-message/">how to write a good commit message</a>.</p>
<p>I gave you an overview of the benefits of writing a good commit, and I mentioned the possibility of generating a changelog.</p>
<p>In this article, you will learn what a changelog is along with two ways to generate it – a simple one and a sophisticated one.  </p>
<h2 id="heading-what-is-a-changelog">What is a changelog?</h2>
<p>A changelog is a file that shares a chronologically ordered list of the changes you've made on your project. It’s often organized by the version with the date followed by a list of added, improved, and removed features.</p>
<p>Globally, there are two ways to write a changelog:</p>
<ul>
<li>the usual way: create a text file and start to enumerate all your changes with a specific date</li>
<li>the developer choice (alias the lazy option): auto-generate your changelog from your commit messages. I have good news for you – this is what you’re going to learn in this article!</li>
</ul>
<blockquote>
<p>“A changelog is a log or record of all notable changes made to a project. The project is often a website or software project, and the changelog usually includes records of changes such as bug fixes, new features, etc.” – <a target="_blank" href="https://en.wikipedia.org/wiki/Changelog">Wikipedia</a></p>
</blockquote>
<h3 id="heading-why-is-it-essential">Why is it essential?</h3>
<p>I think, even now, you are asking yourself why it is essential and why you should take the time to create it.</p>
<p>A changelog is a kind of summary of all your changes. It should be easy to understand both by the users using your project and the developers working on it.</p>
<p>In a world where everything is evolving quickly, a user needs to know if the website/software they are using is changing. You might be surprised, but people love to read blog posts or an update page on your website.</p>
<p>For a developer, for example, if the project is big, it can be interesting to know how the software they're working on is evolving.</p>
<p>Or if you are working on an open-source project, you can find a "CHANGELOG.md" file in the GitHub repository. This file aims to inform contributors of the latest updates on the project. </p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/angularjs-changelog.png" alt="Image" width="600" height="400" loading="lazy">
<em>CHANGELOG.md of the <a target="_blank" href="https://github.com/angular/angular/blob/master/CHANGELOG.md">Angular.js GitHub repository</a></em></p>
<h3 id="heading-where-do-we-find-them">Where do we find them?</h3>
<p>Changelogs are everywhere! Okay, they often have different styles and locations, but they're literally on every project.</p>
<p>I created a short list with a few places where you can find a changelog.</p>
<ul>
<li>A blog post. A changelog can be delivered under an article sharing the last features point by point.</li>
<li>A "CHANGELOG.md" file in a GitHub repository.</li>
<li>A Changelog section on your favourite website/software. Here's <a target="_blank" href="https://ticktick.com/public/changelog/en.html">one example with the task management tool TickTick</a>.</li>
<li>In "What's new" on the Android and the IOS store.</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/ticktick-android-changelog.png" alt="Image" width="600" height="400" loading="lazy">
<em>TickTick "What's new" section on Android</em></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/ticktick-ios-changelog.png" alt="Image" width="600" height="400" loading="lazy">
<em>TickTick "What's new" section on iOS</em></p>
<h2 id="heading-changelog-auto-generation">Changelog auto-generation</h2>
<p>In this part, we're going to generate our first changelog together.</p>
<p>By doing this task, you will understand why it can be useful to commit by following some rules.</p>
<p>An excellent and explicit commit doesn't need to be modified and can be directly added to the changelog.</p>
<p>If you are interested in generating a necessary file without any personalisation or beautification, I recommend the first way; otherwise, the second one is better.</p>
<p><strong>Note</strong>: Some websites such as <a target="_blank" href="https://keepachangelog.com/">Keep A Changelog</a> explain that you shouldn't make a changelog only by copying and pasting your git commits (refer to the simple way). Indeed, I recommend trying to avoid this way if you are working on a professional product. </p>
<p>However, nowadays, there are some advanced generators that allow you to change your git logs into changelogs (refer to the sophisticated way).</p>
<h3 id="heading-how-to-generate-a-changelog-the-simple-way">How to generate a changelog (the simple way)</h3>
<p>By using this first way, you don't need any prerequisites. All you need is to type a few commands inside your Git repository.</p>
<p>As a simple reminder, when you type "git log", a list of all your commits is displayed.</p>
<pre><code>$ git log

<span class="hljs-comment">// Output</span>
commit f6986f8e52c1f889c8649ec75c5abac003102999 (HEAD -&gt; master, origin/master, origin/HEAD)
<span class="hljs-attr">Author</span>: Sam Katakouzinos &lt;sam.katakouzinos@gmail.com&gt;
<span class="hljs-built_in">Date</span>:   Tue Mar <span class="hljs-number">10</span> <span class="hljs-number">11</span>:<span class="hljs-number">41</span>:<span class="hljs-number">18</span> <span class="hljs-number">2020</span> +<span class="hljs-number">1100</span>

    docs(developers): commit message format typo

    Any line <span class="hljs-keyword">of</span> the commit message cannot be longer *than* <span class="hljs-number">100</span> characters!

    Closes #<span class="hljs-number">17006</span>

commit ff963de73ab8913bce27a1e75ac01f53e8ece1d9
<span class="hljs-attr">Author</span>: Chives &lt;chivesrs@gmail.com&gt;
<span class="hljs-built_in">Date</span>:   Thu Feb <span class="hljs-number">6</span> <span class="hljs-number">19</span>:<span class="hljs-number">05</span>:<span class="hljs-number">57</span> <span class="hljs-number">2020</span> <span class="hljs-number">-0500</span>

    docs($aria): get the docs working <span class="hljs-keyword">for</span> the service

    Closes #<span class="hljs-number">16945</span>

commit <span class="hljs-number">2</span>b28c540ad7ebf4a9c3a6f108a9cb5b673d3712d
<span class="hljs-attr">Author</span>: comet &lt;hjung524@gmail.com&gt;
<span class="hljs-built_in">Date</span>:   Mon Jan <span class="hljs-number">27</span> <span class="hljs-number">19</span>:<span class="hljs-number">49</span>:<span class="hljs-number">55</span> <span class="hljs-number">2020</span> <span class="hljs-number">-0600</span>

    docs(*): fix spelling errors

    Closes #<span class="hljs-number">16942</span>
</code></pre><p>This command can take a few parameters. We are going to use them to change the output and get an improved one to generate our changelog.</p>
<p>By typing the following command, you will have an output with one commit per line.</p>
<pre><code>$ git log --oneline --decorate

<span class="hljs-comment">// Output</span>
f6986f8e5 (HEAD -&gt; master, origin/master, origin/HEAD) docs(developers): commit message format typo
ff963de73 docs($aria): get the docs working <span class="hljs-keyword">for</span> the service
<span class="hljs-number">2</span>b28c540a docs(*): fix spelling errors
<span class="hljs-number">68701</span>efb9 chore(*): fix serving <span class="hljs-keyword">of</span> URI-encoded files on code.angularjs.org
c8a6e8450 chore(package): fix scripts <span class="hljs-keyword">for</span> latest Node <span class="hljs-number">10.</span>x on Windows
<span class="hljs-number">0</span>cd592f49 docs(angular.errorHandlingConfig): fix typo (wether --&gt; whether)
a4daf1f76 docs(angular.copy): fix <span class="hljs-string">`getter`</span>/<span class="hljs-string">`setter`</span> formatting
be6a6d80e chore(*): update copyright year to <span class="hljs-number">2020</span>
<span class="hljs-number">36</span>f17c926 docs: add mention to changelog
ff5f782b2 docs: add mention to changelog
<span class="hljs-number">27460</span>db1d docs: release notes <span class="hljs-keyword">for</span> <span class="hljs-number">1.7</span><span class="hljs-number">.9</span>
add78e620 fix(angular.merge): <span class="hljs-keyword">do</span> not merge __proto__ property
</code></pre><p>It’s better, but let’s see what we can do with the following one.</p>
<pre><code>$ git log --pretty=”%s”

<span class="hljs-comment">// Output</span>
docs(developers): commit message format typo
docs($aria): get the docs working <span class="hljs-keyword">for</span> the service
docs(*): fix spelling errors
chore(*): fix serving <span class="hljs-keyword">of</span> URI-encoded files on code.angularjs.org
chore(package): fix scripts <span class="hljs-keyword">for</span> latest Node <span class="hljs-number">10.</span>x on Windows
docs(angular.errorHandlingConfig): fix typo (wether --&gt; whether)
docs(angular.copy): fix <span class="hljs-string">`getter`</span>/<span class="hljs-string">`setter`</span> formatting
chore(*): update copyright year to <span class="hljs-number">2020</span>
<span class="hljs-attr">docs</span>: add mention to changelog
<span class="hljs-attr">docs</span>: add mention to changelog
<span class="hljs-attr">docs</span>: release notes <span class="hljs-keyword">for</span> <span class="hljs-number">1.7</span><span class="hljs-number">.9</span>
fix(angular.merge): <span class="hljs-keyword">do</span> not merge __proto__ property
</code></pre><p>With this one, you can print the list of commits with the style you want.</p>
<p>The “%s” corresponds to the commit title itself. You can modify the string to style your commit as you like.</p>
<p>In our case, we want to create a list.</p>
<pre><code>$ git log --pretty=<span class="hljs-string">"- %s"</span>

<span class="hljs-comment">// Output</span>
- docs(developers): commit message format typo
- docs($aria): get the docs working <span class="hljs-keyword">for</span> the service
- docs(*): fix spelling errors
- chore(*): fix serving <span class="hljs-keyword">of</span> URI-encoded files on code.angularjs.org
- chore(package): fix scripts <span class="hljs-keyword">for</span> latest Node <span class="hljs-number">10.</span>x on Windows
- docs(angular.errorHandlingConfig): fix typo (wether --&gt; whether)
- docs(angular.copy): fix <span class="hljs-string">`getter`</span>/<span class="hljs-string">`setter`</span> formatting
- chore(*): update copyright year to <span class="hljs-number">2020</span>
- docs: add mention to changelog
- docs: add mention to changelog
- docs: release notes <span class="hljs-keyword">for</span> <span class="hljs-number">1.7</span><span class="hljs-number">.9</span>
- fix(angular.merge): <span class="hljs-keyword">do</span> not merge __proto__ property
</code></pre><p>You did it! You created a simple changelog.</p>
<p><strong>Note</strong>: If you want to go further, and save your changelog faster: instead of copying and pasting the result into a file, redirect it to your terminal by typing “git log --pretty="- %s" &gt; CHANGELOG.md”</p>
<h3 id="heading-how-to-generate-a-changelog-the-sophisticated-way">How to generate a changelog (the sophisticated way)</h3>
<p><strong>Prerequisites</strong></p>
<p>We are now going to explore a sophisticated way to generate a changelog. The idea behind the process stays the same, but this time we’re going to use other tools to help us.</p>
<p>Do you remember when <a target="_blank" href="https://herewecode.io/blog/a-beginners-guide-to-git-how-to-write-a-good-commit-message/">in the last part of this series</a> I wrote about the Git guidelines?</p>
<p><strong>Note</strong>: Git guidelines are a set of rules to write your commits better. These guidelines help you add some structure to your commits.</p>
<p>When you are using a guideline for your project, you can use tools to generate a changelog. Most of the time, these tools are better because they allow you to create a markdown formatted changelog.</p>
<p>In this example, we’re going to use a simple generator which works with most of the guidelines. Its name is “<a target="_blank" href="https://github.com/lob/generate-changelog">generate-changelog</a>”, and it’s available on NPM (the Node Package Manager).</p>
<p>This tool is going to create a stylised changelog, but it’s not the one with the most features. I decided to use it because it’s an excellent example for a beginner. If you want to go further, please refer to the list of changelog tools below:</p>
<p>Here are a few tools you can use:</p>
<ul>
<li><a target="_blank" href="https://github.com/github-changelog-generator/github-changelog-generator">Github Changelog Generator</a></li>
<li><a target="_blank" href="https://github.com/git-chglog/git-chglog">Git Chglog</a></li>
<li><a target="_blank" href="https://github.com/CookPete/auto-changelog">Auto Changelog</a></li>
<li><a target="_blank" href="https://github.com/conventional-changelog/conventional-changelog">Conventional Changelog</a></li>
</ul>
<blockquote>
<p>Note: Before installing the tool, you need to have NPM installed on your computer. If you don't have it, I invite you to <a target="_blank" href="https://www.npmjs.com/get-npm">follow the official website</a> (it will help you to install Node and NPM).</p>
</blockquote>
<p>To install the package on your computer, type the following command in your terminal.</p>
<pre><code>$ npm install generate-changelog -g
</code></pre><p>Once you do that, it’s installed!</p>
<p><strong>How to use it</strong></p>
<p>To make this package work, you need to follow the guidelines for using this pattern – “type(category): description [flags]”. In this example, I will use the Angular.js GitHub repository.</p>
<p>Now you can type the generate command in your terminal inside your GitHub repository.</p>
<pre><code>$ changelog generate
</code></pre><p>A “CHANGELOG.md” file will be automatically created and filled with your logs in a markdown format.</p>
<p>You can find an example of the output (with a markdown reader such as GitHub) below.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/generate-changelog-example.png" alt="Image" width="600" height="400" loading="lazy">
<em>Auto-generated changelog with the generate-changelog tool</em></p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>I hope you liked this guide and now understand how to create a changelog for your project. I think it’s a good way to demonstrate why you should write good commit messages.</p>
<p>Feel free to try other changelog generators and send me the result!</p>
<p>If you have any questions or feedback, please let me know. </p>
<p>If you want more content like this, you can <a target="_blank" href="https://twitter.com/gaelgthomas/">follow me on Twitter</a>, where I tweet about web development, self-improvement, and my journey as a full stack developer!   </p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ A Beginner’s Guide to Git — How to Write a Good Commit Message ]]>
                </title>
                <description>
                    <![CDATA[ Are you a developer who has recently started using Git? If you are wondering how to create a good commit message for your project, then this article is made for you. After a few weeks away from writing, I’m coming back today with a follow-up to one o... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/a-beginners-guide-to-git-how-to-write-a-good-commit-message/</link>
                <guid isPermaLink="false">66bb91fa7a6500a14ba5b792</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gaël Thomas ]]>
                </dc:creator>
                <pubDate>Tue, 24 Mar 2020 14:15:54 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/03/how-to-write-a-good-commit-message.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Are you a developer who has recently started using Git? If you are wondering how to create a good commit message for your project, then this article is made for you.</p>
<p>After a few weeks away from writing, I’m coming back today with a follow-up to one of my most searched posts on Google.</p>
<p>When I started to write, one year ago, I created an article on <a target="_blank" href="https://herewecode.io/blog/a-beginners-guide-to-git-how-to-start-and-create-your-first-repository/">how to start and create your first repository with Git</a>.</p>
<p>This article helps many people each week. So I decided to write this post on how to write a good commit message so you can take your Git skills to the next level.</p>
<h2 id="heading-what-is-a-good-commit-message">What is a good commit message?</h2>
<p>As a short reminder, a commit message is the short text you left when you saved your work on Git. This message aims to identify your work.</p>
<p>The idea is that just bu reading it, anyone will be able to clearly understand what you did in this part of your work.</p>
<h3 id="heading-a-good-commit-example">A good commit example</h3>
<p>Below, you can find the last commits to the Angular.js project on GitHub. As you can see, messages are clear, and we can better understand which work has been done in different parts.</p>
<p>For example, on July 24, 2019, “gkalpak” upgraded “SauceConnect” and switched to the last version of Safari (the web browser).</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/git-commits-history.png" alt="Image" width="600" height="400" loading="lazy">
<em>Git commits history on the Angular.js project <a target="_blank" href="https://github.com/angular/angular.js/commits/master">on GitHub</a></em></p>
<h3 id="heading-why-is-everyone-not-committing-the-same-way">Why is everyone not committing the same way?</h3>
<p>Unfortunately, there's not a universal way to write commits. Each project and each company define specific rules for their needs.</p>
<p>But don’t worry – you will often find similar ways of writing a message.</p>
<p>To find out what those are, I highly recommend that you read the rules before starting at a company or working on an open-source project.</p>
<p>I will give you more details on these guidelines later in this article.</p>
<h2 id="heading-why-it-is-essential-to-write-your-commit-well">Why it is essential to write your commit well</h2>
<p>I created a short list of the advantages of using a good commit message.</p>
<h3 id="heading-better-collaboration">Better collaboration</h3>
<p>If you are working at a company, or on an open-source project, it’s essential to follow the rules for better cooperation. If you write something understandable, following the rules of the project, other developers will be able to work more efficiently. They won't have to ask you questions about your work.</p>
<blockquote>
<p>Note: If you are working on a personal project, I highly recommend that you also follow specific rules. It will improve your productivity, and if you need help from another developer, it will be easier for them to start working on your project.</p>
</blockquote>
<h3 id="heading-better-understanding">Better understanding</h3>
<p>You need to create clear and understandable messages. This will help you and your collaborator work on a project together. Below, you can find an example of a git commit history with only unclear messages. As you will see, it’s difficult to understand what was going on.</p>
<h3 id="heading-bonus-a-changelog-generation">BONUS - A changelog generation</h3>
<p>I’ll tell you a small secret: if you write good messages, you will be able to generate a changelog directly from your commit messages. </p>
<p>Here are a few tools to do it: </p>
<ul>
<li><a target="_blank" href="https://github.com/github-changelog-generator/github-changelog-generator">Github Changelog Generator</a></li>
<li><a target="_blank" href="https://github.com/git-chglog/git-chglog">Git Chglog</a></li>
<li><a target="_blank" href="https://github.com/CookPete/auto-changelog">Auto Changelog</a> </li>
<li><a target="_blank" href="https://github.com/conventional-changelog/conventional-changelog">Conventional Changelog</a>. </li>
</ul>
<p>I'll write an upcoming article on this topic, too. If you want to be updated, <a target="_blank" href="https://twitter.com/gaelgthomas/">you can follow me on Twitter</a>. I post every update there.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/bad-git-commits.png" alt="Image" width="600" height="400" loading="lazy">
<em>Bad git commits example from <a target="_blank" href="https://jasonmccreary.me/articles/when-to-make-git-commit/">Jason McCreary</a></em></p>
<blockquote>
<p>Note: If you want to have more example of bad commits and have fun at the same time, <a target="_blank" href="https://twitter.com/gitlost">a Twitter account named "gitlost"</a> is tweeting every day with the funny and unfiltered commits.</p>
</blockquote>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/git-changelog.png" alt="Image" width="600" height="400" loading="lazy">
<em>Example of auto-generated Git changelog</em></p>
<p>OK, now let's get into more detail and look at what it really takes to write a good commit message.</p>
<h2 id="heading-how-to-write-a-commit-message">How to write a commit message</h2>
<p>If you want to write a good commit message, you need to follow some rules. I created a checklist below. Every time you want to commit, take the time to refer to this list.</p>
<ul>
<li><strong>Always check your grammar.</strong> It's never pleasant to read a message full of errors. To do this, I recommend you to use a grammar tool. If you are writing in English, you can use <a target="_blank" href="https://www.grammarly.com/">Grammarly</a>, <a target="_blank" href="https://www.reverso.net/spell-checker/english-spelling-grammar/">Reverso</a>, or <a target="_blank" href="https://www.grammarcheck.net/editor/">GrammarCheck</a>. These tools are not perfect, but they will remove most of your errors.</li>
<li><strong>One commit, one change.</strong> Try to commit often. It is ideal to have each change in a different commit. It will be easier for you to go back to your previous work.</li>
<li><strong>Be clear.</strong> When you are writing a commit, try to be as transparent as possible. I recommend that you use simple English and get straight to the point.</li>
<li><strong>Detail what you did.</strong> Take the time to reread your code to write what you did. In case you need to add a lot of detail, use the description part of the commit.</li>
</ul>
<h3 id="heading-the-git-commit-command">The git commit command</h3>
<p>I want to share more details on the 'git commit' command. If you are not using a git software, you should know that you can create detailed commits by typing this command:</p>
<pre><code>$ git commit -m <span class="hljs-string">"Title"</span> -m <span class="hljs-string">"Description"</span>
</code></pre><p>It's the same as before, but with a second part for the description. So, "-m 'title' " lets you write the short title of the commit, and "-m 'description' " lets you write the description if you need to give more details.</p>
<h3 id="heading-use-git-guidelines">Use git guidelines</h3>
<p>If you want to have a clear git commit history, you should follow some guidelines. In my case, I chose <a target="_blank" href="http://udacity.github.io/git-styleguide/">this simple one from Udacity</a>. </p>
<p>There are a lot of others, like <a target="_blank" href="https://www.conventionalcommits.org/en/v1.0.0/">Conventional Commits</a>, and <a target="_blank" href="https://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit">Angular Guideline</a>. A commit guideline will help you give structure to your commits. </p>
<p>For example, adding a tag to clarify what you did: "git commit -m 'fix: correctly delete all user information when the button delete account is triggered'".</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>I hope that you liked this guide on how to commit to Git! If you have any questions or feedback, feel free to ask.</p>
<p>If you have any other tips on how to make good commits, please let me know.</p>
<p>If you want more content like this, you can <a target="_blank" href="https://twitter.com/gaelgthomas/">follow me on Twitter</a>, where I tweet about web development, self-improvement, and my journey as a full stack developer!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Make Programming More Exciting and More Fun ]]>
                </title>
                <description>
                    <![CDATA[ Although the majority of developers know why programming is exciting, you might wonder about ways to make it funnier. I've recently asked on the Instagram of HereWeCode the following question: "What small tutorials do you want to see on the account?"... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-make-programming-more-exciting-and-funnier/</link>
                <guid isPermaLink="false">66bb9210d2bda3e4315491e5</guid>
                
                    <category>
                        <![CDATA[ beginner ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Career ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tips ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gaël Thomas ]]>
                </dc:creator>
                <pubDate>Wed, 29 Jan 2020 09:37:02 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/01/how-to-make-programming-more-exciting-and-more-fun-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Although the majority of developers know why programming is exciting, you might wonder about ways to make it funnier.</p>
<p>I've recently asked on <a target="_blank" href="https://www.instagram.com/gaelgthomas/">the Instagram</a> of HereWeCode the following question: "What small tutorials do you want to see on the account?". One of the followers answered "How to make coding interesting?". I was surprised because I'd never asked this myself.</p>
<p>After a few hours of searching, I wanted share with you different ways to make programming more fun.</p>
<h2 id="heading-why-coding-is-exciting">Why coding is exciting</h2>
<p>In my opinion, IT in general is exciting. We live in a world where computers are one of the most important things. </p>
<p>As we speak, programming is not a skill that everyone has. Being able to develop your own project is this world gives you a chance. Everything is possible thanks to Information Technology, and we live in a key period where there are not enough developers to satisfy the need.</p>
<p>Coding is a creative skill, and it's exciting to be a part of a project. Although mobile apps and websites are everywhere, I talked with a lot of people who don't know how they work.</p>
<p>My speech so far may seem a bit over-sold and over-played, but it's the reason why coding is exciting for me.</p>
<p>It's one of the reasons why I take so much pleasure in creating educational content.</p>
<h2 id="heading-how-to-make-it-more-fun">How to make it more fun</h2>
<p>After thinking about it, although programming is now a passion for me, I remembered that it hasn't always been fun for me.</p>
<p>Mostly when I started, I would get stuck for days on a problem. Sometimes I would completely lose hope and say: "This is not for me. I tried everything, and it still does not work. I'm not that good."</p>
<p>If that's the case with you, I can tell you – everybody's been there.</p>
<p>This situation can also happen for many other reasons. For example, when you are bored with a language or a framework because you've used it too much.</p>
<p>Anyway, don't worry too much about it. Here, I've listed a few tips to give you a dose of fun when you need it.</p>
<h2 id="heading-practice">Practice</h2>
<p>Writing code is like playing golf. When you start, it's not fun. You need to learn everything: which driver to use for hitting the ball in such a way, how to position yourself, and so on. The pleasure will come as you go along, begin to understand things, and start to have fun with them.</p>
<h2 id="heading-dont-just-read-code-run-it">Don't just read code, run it</h2>
<p>Following along with lessons by simply reading the code can be a significant problem when people start programming. </p>
<p>When you are learning how to code, you should try to write and run it by yourself. Take the time to do it – you will understand it better, and you will have fun trying to modify the code to create your programs.</p>
<p>Here's another example: when you are searching for a code on GitHub, why not try it out? It can be fun to understand someone else's work and be able to integrate it into your project.</p>
<h2 id="heading-add-a-dose-of-fun-to-your-projects-or-apprenticeships">Add a dose of fun to your projects or apprenticeships</h2>
<p>When you are bored with one technology or if you want to increase your knowledge, you can learn a new library, framework, or language. This can be an interesting process and can help you to try new things and have fun doing them.</p>
<p>However, I don't recommend that you only learn from and follow along with a course. If you do so, after a few days you will be bored. Every day or with every new chapter, create small projects to encourage yourself, and let your creativity run free.</p>
<p>Try to find some fun projects to work on. For example, imagine you are learning the basics of JavaScript. Even if these skills are the most important, learning them won't be enjoyable. Once you know how to get user inputs and print in the console, why not trying to create a simple "chatbot" that answers user questions?</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/chatbot-example.png" alt="Image" width="600" height="400" loading="lazy">
<em>Chatbot example</em></p>
<p>When I was doing my search to answer this question, I found this story from a Quora user, and I liked it. It's an excellent example of how to put fun into your apprenticeships.</p>
<blockquote>
<p>"Another thing - the worst is learning a new thing - it is usually very challenging, and your progress is much slower than you wish it were. To make that fun, I typically trick my brain.   </p>
<p>For example, when I was learning about assembly language, and we had a project to program a tiny hardware display - well first, it was very dull. You had to study the hardware manual, it had inputs and outputs, and all you could achieve was a few letters to appear on the screen.   </p>
<p>But I challenged myself to master that thing, and to do that, I came up with my own "special exercise". Instead of merely writing 10101 on display, I came up with the idea to write something more stupid, more childish. Something like - ——CALL -ME - NOW -XXXX — flashing and moving over the screen - this was WAY more advanced than the actual task we had been assigned in class. I just used this stupid thing to motivate myself to learn everything I could about assembly languages, and boy, this worked out well! :)"   </p>
<p>— <a target="_blank" href="https://www.quora.com/How-can-I-make-coding-fun-and-interesting">Marcus Biel</a></p>
</blockquote>
<h2 id="heading-always-challenge-yourself">Always challenge yourself</h2>
<p>When you are a developer, you always need to learn new things to stay up to date. Everything is evolving quickly, and you can't be left behind. Boredom or lack of fun occurs when you no longer feel like you are growing or learning.</p>
<p>To counteract this feeling, you can try to achieve goals that you have not yet met.</p>
<p>For example, if you have never participated in an open-source project, you can search on GitHub and contribute for the first time.</p>
<p>Your sense of satisfaction will be increased when you succeed in having your work accepted within the project. Perhaps you will help dozens, even hundreds of people, by fixing a previously unresolved problem.</p>
<p>You can also participate in coding competitions or use coding websites such as <a target="_blank" href="https://www.hackerrank.com/home?utm_expid=.2u09ecQTSny1HV02SEVoCg.1&amp;utm_referrer=https%3A%2F%2Fwww.google.com%2F">HackerRank</a>, <a target="_blank" href="https://www.codingame.com/start">CodingGame</a>, or <a target="_blank" href="https://projecteuler.net/">Project Euler</a> to challenge yourself.</p>
<h2 id="heading-create-a-personal-project-from-scratch">Create a personal project from scratch</h2>
<p>It can be frustrating to be a developer when you're only working on a small part of a project for your company.</p>
<p>Maybe you have always dreamed about a project, but you've never taken the time to work on it. Why not try to code it? You will see – it's fun to start the project of your dreams. It's also a worthy goal to <a target="_blank" href="https://herewecode.io/blog/how-to-make-programming-a-daily-habit/">make your programming habit stick</a>.</p>
<p>If you don't have any ideas, try to find a theme you like, for example:</p>
<ul>
<li>If you like video games, you can try to create a game.</li>
<li>If you are into education, why not create tutorials around code?</li>
<li>If you love hardware and electronics, why not build an Arduino or a raspberry pi?</li>
</ul>
<blockquote>
<p>"Programming is like writing - in the main subject matters much more than the writing itself." — <a target="_blank" href="https://news.ycombinator.com/item?id=7669435">lifeisstillgood</a></p>
</blockquote>
<h2 id="heading-define-a-goal">Define a goal</h2>
<p>This point always returns in all of my productivity articles. You must define goals.</p>
<p>Without goals, it's challenging to feel comfortable and enjoy what you are doing as a developer.</p>
<h2 id="heading-find-a-mentor">Find a mentor</h2>
<p>A mentor can be motivating if you don't find coding fun anymore.</p>
<p>A mentor can give you a goal to follow and teach you the best practices. They can also help you <a target="_blank" href="https://herewecode.io/blog/how-to-improve-your-programming-skills/">improve your programming skills</a> and stimulate your professional career.</p>
<p>Perhaps you are wondering how to ask your "hero" to become your mentor.</p>
<p>Well, just send a message and them to be your mentor.</p>
<p>Yeah yeah, it's that simple. Maybe, they will be pleased to know that you value their skills enough to mentor you. In most cases, they will be delighted to accompany you in your development.</p>
<h2 id="heading-sleep-more">Sleep more</h2>
<p>When you are in a downward spiral, programming becomes less fun. Sometimes it can be difficult for you to move forward and thrive in your work. </p>
<p>Go to bed earlier for a few nights or sleep later in the morning for a few days, and everything should improve dramatically.</p>
<h2 id="heading-show-your-work">Show your work</h2>
<p>What's worse than being a developer and losing all hope because you're alone in your basement? It's a bit of a cliché but, believe me, when you work alone for a long time on a project and never show it to anyone, it becomes less fun right away.</p>
<p>This tip is close to the previous ones. Once you share your work, people will make suggestions or ask questions. It's going to be challenging for you and will help you set new goals.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>I tried to round up some essential tips to help you have fun while programming. If you have any other advice or suggestions to make it more fun, feel free to leave a comment or send me a message.</p>
<p><strong>Why do you think programming is exciting? How do you make programming more fun?</strong></p>
<p>Feel free to share this article if you liked it.</p>
<p>If you want more content like this, you can <a target="_blank" href="https://twitter.com/gaelgthomas/">follow me on Twitter</a>, where I tweet about web development, self-improvement, and my journey as a full stack developer!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Make Programming a Daily Habit ]]>
                </title>
                <description>
                    <![CDATA[ Coding has been a hot topic over the last few years. A lot of people want to start programming and become a developer. So how can you develop a coding habit? A few days ago, I started to read The Power Of Habit by Charles Duhigg. This book made me ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-make-programming-a-daily-habit/</link>
                <guid isPermaLink="false">66bb920d0eaca026d8cfa5eb</guid>
                
                    <category>
                        <![CDATA[ Habit Building ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gaël Thomas ]]>
                </dc:creator>
                <pubDate>Sun, 26 Jan 2020 08:51:01 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/01/how-to-make-programming-a-daily-habit.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Coding has been a hot topic over the last few years. A lot of people want to start programming and become a developer. So how can you develop a coding habit?</p>
<p>A few days ago, I started to read <em>The Power Of Habit</em> by Charles Duhigg. This book made me think a lot about why some people struggle with programming daily. I think it's because of the habit process. Most people don't know how habits work and need concrete examples.</p>
<p>In this article, I'm going to explain what a habit is and give you some advice to help you create a daily programming habit.</p>
<h2 id="heading-what-is-a-habit">What is a habit?</h2>
<p>Before starting, it's essential to define what a habit is and how you form one.</p>
<p>If we check the definition of the word "habit" on Google, we find this:</p>
<blockquote>
<p>"Habits are routines of behavior that are repeated regularly and tend to occur subconsciously" ― <a target="_blank" href="https://en.wikipedia.org/wiki/Habit">Wikipedia</a></p>
<p>"a behavior pattern acquired by frequent repetition or physiologic exposure that shows itself in regularity or increased facility of performance" ― <a target="_blank" href="https://www.merriam-webster.com/dictionary/habits">Meriam-Webster Dictionary</a></p>
<p>"a recurrent, often unconscious pattern of behavior that is acquired through frequent repetition" ― <a target="_blank" href="https://www.thefreedictionary.com/habits">The Free Dictionary</a></p>
<p>"something that you do often or regularly, often without thinking about it" ― <a target="_blank" href="https://www.macmillandictionary.com/dictionary/british/habit">MacMillan Dictionary</a></p>
</blockquote>
<p>As you can see, a habit is an automatic process in your life. Take brushing your teeth, for example.</p>
<p>It's interesting to define the components of a habit to understand how it works.</p>
<p>Each habit includes three components: a cue, a routine, and a reward.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/the-habit-loop.jpg" alt="Image" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://charlesduhigg.com/keep-your-resolutions-this-year/">The Habit Loop</a></em></p>
<h3 id="heading-what-is-the-cue">What is the cue?</h3>
<p>The cue is an event in your life that triggers a habit. Every time you do something automatically, it was started by a cue.</p>
<p>Most of the time, a cue is defined by time, an emotional state, a location, or an action.</p>
<p>For example, if I'm working and suddenly smell coffee from my colleague's direction, my habit "Taking a coffee break" is triggered. </p>
<h3 id="heading-what-is-the-routine">What is the routine?</h3>
<p>The routine is what you are doing while the habit process is running. You can define whatever you want it to be in this part. As I said previously, it can be, "I'm going to take a coffee break."</p>
<h3 id="heading-what-is-the-reward">What is the reward?</h3>
<p>The reward is the final element of the process. In other words, what this routine has done for you. For the coffee break example, the reward is "Thanks to the caffeine, I feel less tired, and I am more dynamic."</p>
<p>The more positive and pleasant the reward is for yourself, the more your brain will save the habit.</p>
<blockquote>
<p>"This process within our brains is a three-step loop. First, there is a cue, a trigger that tells your brain to go into automatic mode and which habit to use. Then there is the routine, which can be physical or mental or emotional. Finally, there is a reward, which helps your brain figure out if this particular loop is worth remembering for the future. Over time, this loop—cue, routine, reward; cue, routine, reward—becomes more and more automatic. The cue and reward become intertwined until a powerful sense of anticipation and craving emerges. Eventually, whether in a chilly MIT laboratory or your driveway, a habit is born." ― Charles Duhigg, The Power of Habit: Why We Do What We Do in Life and Business</p>
</blockquote>
<h3 id="heading-a-little-exercise">A little exercise</h3>
<p>Here's something you can do: take one of your daily habits and try to define the cue, the routine, and the reward. Once you do, you're ready to read the next part on how to create your daily programming habit.</p>
<h2 id="heading-how-to-make-programming-a-daily-habit">How to make programming a daily habit</h2>
<p>All you have to do to make programming a daily activity is to create a routine.</p>
<p>You are free to define what you want for each part of this exercise, but I will give you a few tips to help you.</p>
<p>For the cue, you can try to define something based on time:</p>
<ul>
<li>Every morning right after I wake up</li>
<li>When I come back from my job</li>
<li>During my lunch break</li>
<li>[Insert a time-based cue]</li>
</ul>
<p>Routine will be our most straightforward element to define. You can just say, "I want to code for 30 minutes," "I'm going to learn [Insert a skill] for 30 minutes," or many more.</p>
<p>Finally, one of the most critical parts will be the reward. As I recommended in the first part of <a target="_blank" href="https://herewecode.io/blog/how-to-improve-your-programming-skills/">my first productivity article</a>, you need to establish goals for yourself. It's going to help you define a reward. Every time you practice your habit, you are closer to your goal.</p>
<p>Try to determine a long term goal, and inside of that, a lot of small goals.</p>
<p>For example, you can say:</p>
<ul>
<li>I'm getting closer to my goals for the week.</li>
<li>I'm getting a little closer to my final goal.</li>
<li>If I code right after waking up, I'll make myself breakfast as a reward.</li>
<li>[Insert a reward]</li>
</ul>
<h3 id="heading-a-challenge-that-can-help-you">A challenge that can help you</h3>
<p>One of the best ways to get into a habit is to follow a <a target="_blank" href="https://www.100daysofx.com/">100DaysOfX challenge</a>. This challenge is designed to help you create a pattern and commit to it every day by sharing what you did on Twitter, Instagram, or your blog.</p>
<p>The reason I'm telling you about this challenge is that it became famous on Twitter with the <a target="_blank" href="https://www.100daysofcode.com/">100DaysOfCode</a>.</p>
<p>I strongly recommend that you read the rules on the site and get started. You'll see, at first, it may seem big and impossible, but you'll find it fun to do.</p>
<p>Besides, you will most certainly get support on Twitter, which will motivate you. </p>
<blockquote>
<p>"Are you passionate about self-improvement? Eager to change your habits, have tried to do so many times, but had difficulties changing them? Life always seems to get in the way, there is not enough support, and you feel like you're alone in it? Find yourself thinking, "What's the use of all this self-improvement if I always seem to go back to where I started from?" ― <a target="_blank" href="https://www.100daysofx.com/">100DaysOfX</a></p>
</blockquote>
<p>If I recommend this challenge to you, it's because I'm doing it. I'm thrilled with the results, and I'm only starting. </p>
<p>For my part, I'm doing the 100DaysOfReading challenge. I always wanted to start reading but I never took the time to do it. Thanks to this challenge, I'm on day 17, and already finished one and a half books.</p>
<p>My habit loop:</p>
<ul>
<li>Every day before lunch or before sleeping (the cue).</li>
<li>I read 20 pages or more (the routine).</li>
<li>I am approaching my long-term goal of reading daily. I am close to my short-term goal of finishing the book. It makes me happy because I have always wanted to read daily (the reward).</li>
<li>I publish a quote from the book I'm reading with some explanations and motivational text <a target="_blank" href="https://twitter.com/gaelgthomas/">on my Twitter</a> (the commitment).</li>
</ul>
<p>Here are some tips that can help you to create your programming habit.</p>
<h3 id="heading-plan-your-tasks">Plan your tasks</h3>
<p>To work every day and achieve my monthly goals, I plan all my tasks the evening before. I put on paper what I want to make, and every time I do it, I'll scratch it off my list. I recommend that you do this with your daily programming habit because it's going to motivate you and satisfy you a lot when you finish all your goals.</p>
<p>If you need more structure in your work, define what you are going to do, how, when, and why.</p>
<p>For example, I'm going to create a landing page for my website (what I'm going to do). I will use Vue.JS to build it (how). I will do it between 8am and 10am (when). It's going to help me better understand Vue.JS and help me to start getting my visitor's email addresses.</p>
<h3 id="heading-code-your-dream-project">Code your dream project</h3>
<p>What could be better than coding daily while working on the project of your dreams? If you need motivation, it's an excellent way to program every day. Don't be afraid to take the initiative. Doing it a little bit every day will motivate you even more and give you results in a short time.</p>
<h3 id="heading-find-the-field-you-want-to-work-in">Find the field you want to work in</h3>
<p>The world of programming is vast – web, software, AI, embedded, and much more.</p>
<p>One of the significant difficulties is to define what you want to do as a programmer.</p>
<p>It's not easy for everyone, but choosing a topic and sticking to it can be a good motivation factor to practice daily.</p>
<p>For example, if you choose web programming, just focus on that. Even though it's still a big topic, you removed software, AI, embedded, and everything else. That's a good start.</p>
<p>To go further, you can choose between the front-end and back-end.</p>
<p>I'm telling you all this because often, when you start, you get demotivated fast because there are too many things, and you can't focus on a specific theme.</p>
<h3 id="heading-a-good-environment">A good environment</h3>
<p>Something that can motivate you in your daily programming habit is a pleasant working environment. I do not recommend working in your bed. You're going get tired easily.</p>
<p>Try to work at a desk or a table and do whatever you need to feel comfortable in that space. It will make you want to work more efficiently.</p>
<h2 id="heading-further-reading">Further reading</h2>
<p>If you are interested to know more about the habit process, I invite you to read <em>The Power of Habit</em> by Charles Duhigg. This book helped me a lot while writing this article, and a lot of the examples I gave you were inspired by it.</p>
<p>I've also heard about <em>Atomic Habits: An Easy &amp; Proven Way to Build Good Habits &amp; Break Bad Ones</em> by James Clear. This book offers a framework to improve your daily habits. The author tries to provide practical guidance on how to make changes.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Do you plan to make programming a daily habit? Are you going to commit to 100DaysOfCode?</p>
<p>Feel free to share this article if you liked it.</p>
<p>If you want more content like this, you can <a target="_blank" href="https://twitter.com/gaelgthomas/">follow me on Twitter</a>, where I tweet about web development, self-improvement, and my journey as a full stack developer!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Learn Flutter in 2020 ]]>
                </title>
                <description>
                    <![CDATA[ Flutter is a trending technology this year. This article will suggest some free and paid ways to learn how to develop iOS and Android applications with Flutter. Are you interested in mobile application development? If your answer is yes, you are read... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-learn-flutter-in-2020/</link>
                <guid isPermaLink="false">66bb920b7a6500a14ba5b796</guid>
                
                    <category>
                        <![CDATA[ Android ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Career ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Flutter ]]>
                    </category>
                
                    <category>
                        <![CDATA[ iOS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gaël Thomas ]]>
                </dc:creator>
                <pubDate>Wed, 22 Jan 2020 12:38:14 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/01/how-to-learn-flutter-in-2020.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Flutter is a trending technology this year. This article will suggest some free and paid ways to learn how to develop iOS and Android applications with Flutter.</p>
<h2 id="heading-are-you-interested-in-mobile-application-development">Are you interested in mobile application development?</h2>
<p>If your answer is yes, you are reading the right article! Maybe you don't know about Flutter yet, but don't worry – I wrote an article about <a target="_blank" href="https://herewecode.io/blog/what-is-flutter-and-why-you-should-learn-it-in-2020/">what flutter is and why you should learn it this year</a>.</p>
<blockquote>
<p>Flutter is a free and open-source mobile UI framework created by Google and released in May 2017. In a few words, this allows you to create a native mobile application with only one code. It means that you can use one programming language and one codebase to create two different apps (IOS and Android). – <a target="_blank" href="https://herewecode.io/blog/what-is-flutter-and-why-you-should-learn-it-in-2020/">What is Flutter and Why You Should Learn It in 2020</a></p>
</blockquote>
<p>In this post, I share with you two types of content, free or paid. I tried to find excellent resources to support every type of learner (videos, courses, books, tutorials, and so on).</p>
<p>Before we start, I also wrote an article about <a target="_blank" href="https://herewecode.io/blog/should-you-learn-programming-with-paid-or-free-content-and-why/">whether you should you learn to code with paid or free content - and why?</a> If you don't know what type of content is the best for you, I recommend that you read that article before reading this one.</p>
<p>So let's get started. I tried to explain each resource with a small paragraph. All information came from the description of the associated website. As you can imagine, I haven't tried all these methods. If you need more details, I invite you to visit the linked website.</p>
<h2 id="heading-free-content">Free content</h2>
<h3 id="heading-videoscourses">Videos/Courses</h3>
<ul>
<li><a target="_blank" href="https://www.youtube.com/watch?v=Ej_Pcr4uC2Q">Dart Programming Tutorial - Full Course</a></li>
</ul>
<p>A freeCodeCamp full course on Dart.</p>
<blockquote>
<p>Learn the Dart programming language in this complete tutorial for beginners. Dart is a strictly typed programming language that is used in the Flutter framework to develop cross-platform mobile apps. – Dart Programming Tutorial - Full Course</p>
</blockquote>
<ul>
<li><a target="_blank" href="https://www.youtube.com/watch?v=pTJJsmejUOQ">Flutter Course - Full Tutorial for Beginners (Build iOS and Android Apps)</a></li>
</ul>
<p>A freeCodeCamp full tutorial for beginners. This tutorial was one of my references when I started Flutter. It is an excellent introduction and helps you understand the first concepts that will be useful for you.</p>
<blockquote>
<p>Learn Flutter, Google’s groundbreaking multi-platform mobile development framework, to create apps for Android and iOS.  In this course, Nick Manning from <a target="_blank" href="https://fluttercrashcourse.com/">Flutter Crash Course</a> teaches you how to get up and running with Flutter quickly and effectively. Nick has been a Flutter engineer since 2017 and has boiled down this real-world know-how into a clear-cut, realistic, and step-by-step crash course. – Flutter Course - Full Tutorial for Beginners (Build iOS and Android Apps)</p>
</blockquote>
<ul>
<li><a target="_blank" href="https://www.youtube.com/watch?v=1gDhl4leEzA&amp;feature=youtu.be">Flutter Crash Course</a></li>
</ul>
<p>A Traversy Media crash course on Flutter. </p>
<blockquote>
<p>In this crash course we will look at Flutter for building native mobile apps. We will look at what Flutter is, how to get setup, built in widgets, stateless and stateful widgets, routing and more. – Traversy Media</p>
</blockquote>
<ul>
<li><a target="_blank" href="https://www.youtube.com/playlist?list=PL4cUxeGkcC9jLYyp2Aoh6hcWuxFDX6PBJ">Flutter Tutorial for Beginners</a></li>
</ul>
<p>A Youtube playlist on Flutter for beginners created by The Net Ninja.</p>
<blockquote>
<p>You will discover how to use Flutter (and Dart) to create Android and IOS apps from scratch. You will learn all about widgets, packages, assets &amp; asynchronous code to create a World Time app, as well as two other mini-apps to put your Flutter skills to good use! – Flutter Tutorial for Beginners</p>
</blockquote>
<ul>
<li><a target="_blank" href="https://www.youtube.com/playlist?list=PL4cUxeGkcC9j--TKIdkb3ISfRbJeJYQwC">Flutter &amp; Firebase App Build</a></li>
</ul>
<p>A Youtube playlist on Flutter and Firebase created by The Net Ninja. When I wanted to use Firebase in my first application, I first took this course. It was comprehensive and gave me a good understanding of how to integrate this tool with Flutter.</p>
<blockquote>
<p>You will learn how to create a Flutter application from scratch, using Firebase Firestore (a real-time database) and Firebase Authentication. This playlist is for developers who already know Flutter. – Flutter &amp; Firebase App Build</p>
</blockquote>
<ul>
<li><a target="_blank" href="https://www.youtube.com/channel/UCSIvrn68cUk8CS8MbtBmBkA/featured">Reso Coder</a></li>
</ul>
<p>A Youtube channel dedicated to Flutter. Reso Coder created a lot of tutorials to explain how the framework works. Several tools you can use with Flutter are explained so that you can integrate them into your project. There are even lessons on code architecture for Flutter.</p>
<blockquote>
<p>Flutter is changing the app development scene. Don't be left behind! Learn how to develop for cross-platform mobile &amp; web.  Learn from carefully crafted project driven lessons and immediately apply what you've learned in your own apps. – Reso Coder</p>
</blockquote>
<ul>
<li><a target="_blank" href="https://www.youtube.com/channel/UC2d0BYlqQCdF9lJfydl_02Q/featured">FilledStacks</a></li>
</ul>
<p>A Youtube channel dedicated to Flutter. You will discover many tutorials on Flutter such as Firebase, UI, architecture and so on. There are mobile and web Flutter lessons as well.</p>
<blockquote>
<p>Learn to build high quality production ready mobile apps using Flutter.  – FilledStacks</p>
</blockquote>
<ul>
<li><a target="_blank" href="https://www.youtube.com/c/CodeWithAndrea">Code With Andrea</a></li>
</ul>
<blockquote>
<p>Tutorials about learning Flutter. Regular videos covering all things Flutter, including state management, layouts, testing, and more.  This channel will help you to become a better Flutter developer. – Code With Andrea</p>
</blockquote>
<h3 id="heading-google-codelabs">Google Codelabs</h3>
<p>You can also learn Flutter with the <a target="_blank" href="https://codelabs.developers.google.com/?cat=Flutter">Google Codelabs</a> website. The website provides a guided, tutorial-based, hands-on coding experience. I have just discovered this site. You can even use it outside of Flutter. It references all the Google technologies with many tutorials to help you use them.</p>
<blockquote>
<p>Most codelabs will step you through the process of building a small application or adding a new feature to an existing application. They cover a wide range of topics such as Android Wear, Google Compute Engine, Project Tango, and Google APIs on iOS. – Google Codelabs</p>
</blockquote>
<h3 id="heading-documentation">Documentation</h3>
<p>Something I love about Flutter is the <a target="_blank" href="https://flutter.dev/docs">documentation</a>. It’s complete and can be helpful when you are learning or developing an application.</p>
<p>The documentation goes through many topics, such as:</p>
<ul>
<li>How to start with Flutter</li>
<li>All the available widgets</li>
<li>The API docs (libraries docs)</li>
<li>A cookbook with a lot of tutorials</li>
<li>Some examples of apps</li>
<li>The Flutter Youtube channel</li>
</ul>
<h3 id="heading-books">Books</h3>
<ul>
<li><a target="_blank" href="https://www.syncfusion.com/ebooks/flutter-succinctly">Flutter Succinctly</a></li>
</ul>
<p>By searching through the Flutter documentation, I found this book. The author creates a fully functional app, which allows you to get a clear understanding of the framework. This book is accessible whether or not you have mobile development experience.</p>
<ul>
<li><a target="_blank" href="https://kodestat.gitbook.io/flutter/">Flutter Tutorials Handbook</a></li>
</ul>
<p>This cookbook contains recipes that demonstrate how to solve common problems while writing Flutter apps. Each method is standalone and can be used as a reference to help you build up an application. It can be used in addition to the Flutter documentation. Many examples are listed there.</p>
<h3 id="heading-herewecode">HereWeCode</h3>
<p>I plan to create tutorials on Flutter soon. To stay up-to-date, you can follow <a target="_blank" href="https://www.youtube.com/channel/UCSRuzHhjUaAnBb6_rmlr10g">the Youtube channel</a> and <a target="_blank" href="https://twitter.com/gaelgthomas/">Twitter</a>. Feel free to let me know what topics and tutorials you want to see.</p>
<h2 id="heading-paid-content">Paid content</h2>
<h3 id="heading-courses">Courses</h3>
<ul>
<li><a target="_blank" href="https://www.udemy.com/course/flutter-bootcamp-with-dart/">The Complete 2020 Flutter Development Bootcamp with Dart</a></li>
</ul>
<blockquote>
<p>This Flutter Bootcamp is officially created in collaboration with the Google Flutter team. You will learn from scratch and create a few applications. The course includes 27+ hours of video tutorials and projects. Even if you have zero programming experience, you can start it. – The Complete 2020 Flutter Development Bootcamp with Dart</p>
</blockquote>
<ul>
<li><a target="_blank" href="https://www.udemy.com/course/learn-flutter-dart-to-build-ios-android-apps/">Learn Flutter &amp; Dart to Build iOS &amp; Android Apps [2020]</a></li>
</ul>
<blockquote>
<p>A Complete Guide to the Flutter SDK &amp; Flutter Framework for building native iOS and Android apps. The basic programming language will help but is not a must-have. With this course, you will learn Flutter not only in theory but with the build of a complete realistic app. The app is going to use features like Google Maps, the device camera, animations, and more. – Learn Flutter &amp; Dart to Build iOS &amp; Android Apps [2020]</p>
</blockquote>
<ul>
<li><a target="_blank" href="https://www.udemy.com/course/dart-and-flutter-the-complete-developers-guide/?ranMID=39197&amp;ranEAID=R7BSs79ua1Y&amp;ranSiteID=R7BSs79ua1Y-SpCxrCZ5bX.j71JLQLZ2Bg&amp;LSNPUBID=R7BSs79ua1Y">Dart and Flutter: The Complete Developer's Guide</a></li>
</ul>
<blockquote>
<p>Everything you need to know for building mobile apps with Flutter and Dart, including RxDart and Animations! Previous programming experience with Javascript, Java, Python, or similar is required.  In this course, you will understand how to design, create animations, and architecture an application with Flutter. This course appears to be more advanced than others; you will learn skills such as using offline storage, optimizing network requests, using advanced design patterns, and so on. – Dart and Flutter: The Complete Developer's Guide</p>
</blockquote>
<ul>
<li><a target="_blank" href="https://www.udemy.com/course/flutter-firebase-build-a-complete-app-for-ios-android/?couponCode=JAN-20">Flutter &amp; Firebase: Build a Complete App for IOS &amp; Android</a></li>
</ul>
<blockquote>
<p>In this course you will build a complete, real-world application for iOS and Android, by using Dart, Flutter and Firebase. This course starts from the basics, and includes a full introduction to Dart and Flutter. As you make progress, the course will introduce more advanced topics, with special emphasis on writing production-ready code, so that you can learn how to build robust applications that scale. Important concepts are explained with clear diagrams. So by the end of this course you will be a competent Flutter developer. – Flutter &amp; Firebase: Build a Complete App for iOS &amp; Android</p>
</blockquote>
<h3 id="heading-books-1">? Books</h3>
<ul>
<li><a target="_blank" href="https://www.amazon.com/dp/1092297375?creativeASIN=1092297375&amp;imprToken=3roEoQsoEHSkrt2BzcZW9g&amp;slotNum=33&amp;tag=reactdom-20&amp;linkCode=osi&amp;th=1&amp;psc=1&amp;keywords=flutter%20programming%20books">Learn Google Flutter Fast: 65 Example Apps</a></li>
</ul>
<p>A complete book about Flutter. Learn Google Flutter by example with 65 example mini-apps. You will learn how to create everything from the most basic application to an advanced one with complex architecture. At the end of the book, the author explains to you how to publish your app on app stores.  </p>
<ul>
<li><a target="_blank" href="https://www.amazon.com/Beginning-Flutter-Hands-Guide-Development/dp/1119550823/ref=sr_1_5?keywords=Flutter&amp;qid=1579668628&amp;sr=8-5">Beginning Flutter: A Hands-On Guide to App Development 1st Edition</a></li>
</ul>
<p>This is an excellent introduction to Flutter so you can quickly get started and understand the fundamental principles. If you prefer to learn through books, don't hesitate!</p>
<blockquote>
<p>Beginning Flutter: A Hands-On Guide to App Development is an essential resource for both experienced and novice developers interested in getting started with Flutter. It's an introduction to Flutter, step by step. This book is written by Marco L. Napoli, the CEO of Pixolini Inc. and an experienced mobile, web, and desktop app developer. He has a strong proven record in developing visually elegant and simple to use systems. – Beginning Flutter: A Hands-On Guide to App Development 1st Edition</p>
</blockquote>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Do you know other resources to learn Flutter? Send me a message on Twitter and I'll add them.</p>
<p>Feel free to share this article if you liked it.</p>
<p>If you want more content like this, you can <a target="_blank" href="https://twitter.com/gaelgthomas/">follow me on Twitter</a>, where I tweet about web development, self-improvement, and my journey as a full stack developer!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Should you Learn to Code with Paid or Free Content - and Why? ]]>
                </title>
                <description>
                    <![CDATA[ As more and more people use computers, the number of resources out there for learning about them has increased a lot, too. When you start programming, it isn't straightforward to choose between free or paid content. I've been thinking, gathering argu... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/should-you-learn-programming-with-paid-or-free-content-and-why/</link>
                <guid isPermaLink="false">66bb9218a5fd14123a8b4a36</guid>
                
                    <category>
                        <![CDATA[ beginner ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Career ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tips ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gaël Thomas ]]>
                </dc:creator>
                <pubDate>Sat, 18 Jan 2020 14:20:15 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/01/should-you-learn-to-code-with-paid-or-free-content-and-why.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>As more and more people use computers, the number of resources out there for learning about them has increased a lot, too. When you start programming, it isn't straightforward to choose between free or paid content. I've been thinking, gathering arguments, and creating examples to help you make your choice.</p>
<h2 id="heading-what-should-you-choose-paid-or-free-content">What Should You Choose - Paid or Free Content?</h2>
<p>This question is widespread, and everyone has asked it at one point.</p>
<p>I've thought about it for a long time and have reviewed my habits to understand why someone would be more interested in paid rather than free content.</p>
<p>Most of the time paid content is qualified by:</p>
<ul>
<li><em>All-in-one content.</em> You pay to get all the information in the same place (for example, on Udemy).</li>
<li><em>More detail.</em> When I pay for a book or a course, I expect a bunch of information from the creator. I want to really understand why and how to use something.</li>
<li><em>A warranty on knowledge.</em> You are guaranteed to know all the basic necessary information on a subject when you finish a course. Indeed, when I take a "Learn Flutter and Firebase with concrete examples" course, I know I will see all the critical concepts surrounding these two technologies. I'll also be able to develop a small application using these technologies. Sometimes, when I use YouTube for this kind of search, I don't get all the necessary details, and I need to find another video.</li>
<li><em>Time savings.</em> You don't have to search for other online resources. You can focus only on the course.</li>
<li><em>Quality.</em> Usually when you pay for content, the sound quality and recording are much better.</li>
<li><em>Community support.</em> People pay for content to support a creator, or to contribute to the development of a community. If you buy a course on a new technology, you encourage the creator to develop more resources on the technology.</li>
</ul>
<h2 id="heading-my-recommendations-to-learners">My recommendations to learners</h2>
<p>All types of content are great. I personally use both free and paid content at the same time.</p>
<p>I think certain types of people are more likely to choose one type of content over another.</p>
<h3 id="heading-if-you-choose-primarily-paid-content">If you choose primarily paid content:</h3>
<ul>
<li>You are a beginner, and you know what you want to learn.</li>
<li>You are a beginner, and you don't want to waste time searching for content or looking at many tutorials and videos to find a solution to your problem. DISCLAIMER: Being able to search for a solution to a problem in programming is a crucial concept. It will happen–one day you're going to have to look for content to solve a specific problem. If you use paid content, be sure you know how to search for potential errors yourself.</li>
<li>You are a beginner, and you don’t know how to search for the right resources.</li>
<li>You want to learn a subject quickly and globally to accomplish a task (for example, <a target="_blank" href="https://www.instagram.com/gaelgthomas/">I watched a course on Instagram to launch HereWeCode on the social network</a>) .</li>
<li>You don't have a lot of time (for example, you need to learn a new technology for your company in one week).</li>
<li>You like to read books and understand all the details of the technology.</li>
</ul>
<h3 id="heading-if-you-choose-primarily-free-content"><strong>If you choose primarily free content:</strong></h3>
<ul>
<li>You are a beginner, and you have a lot of time. In my opinion, this is the best way to learn how to code. For example, this works great if it's as a hobby or if you know you have 1-2 years to retrain yourself and find work. Nothing is better than taking your time to learn programming. I took almost 3 years to be comfortable in computer development and I still have a lot to learn. You'll feel like you're taking a long time, but I guarantee it's worth it. Searching, testing, failing, retrying and so on is the key to success.</li>
<li>You have been a developer for some time, and you know how to search efficiently on Google. </li>
</ul>
<p>Note that these profiles are only examples of people who may be inclined to pay for content or search for it for free. It's up to you to do what you want. I just hope this helps people decide what kind of content they should use.</p>
<h2 id="heading-a-case-study-my-own-learning-path">A Case Study: My Own Learning Path</h2>
<p>To show you that this subject is complex and very personal, I will tell you what I did.</p>
<p>I have been coding for more than three years. It's my hobby, and I like to share my knowledge to help people to learn how to code. These reasons pushed me to create <a target="_blank" href="https://herewecode.io">HereWeCode</a>.</p>
<h3 id="heading-period-with-only-free-content">Period with only free content</h3>
<p><em>The goal of this period:</em> Learn programming and critical concepts to be able to switch quickly from one language to another.</p>
<p>When I started to code three years ago, I was in a school with a project pedagogy. I learned development with online resources such as StackOverflow, YouTube, freeCodeCamp, and blogs.</p>
<p>This period was hard for me, but it was also exciting. It was an essential part of my life as a developer. By learning with free content, I was forced to search a lot and understand where I could easily find answers to my questions. Nowadays, I'm able to explore everything efficiently on the internet.</p>
<p>It may not seem like it, but searching on the internet is not easy for everyone. I can tell you because I'm teaching students on a French platform, and most of the time, the beginners don't know how to find the answer to fix an error.</p>
<h3 id="heading-period-with-free-and-paid-content">Period with free and paid content</h3>
<p>For one year now I've been using both types of content. And it just depends on my goals with each technology.</p>
<p>I like to use paid courses on Udemy when I want to learn quickly and have a showcase of that new technology. </p>
<p>For example, my Instagram course allowed me to understand a new social network, define a strategy, and deploy a professional account in a few weeks. I reached my goal with this course, which was to share a new type of content as soon as possible.</p>
<p>When I want to learn technology deeply, I like to read books. Most of the time, there are books with lots of details you can't find in any other content.</p>
<p>I still use free content daily to answer a question, find a code example, understand a specific concept in a few minutes, and so on.</p>
<h3 id="heading-bonus-the-seemingly-paid-but-actually-free-content">Bonus: The Seemingly PAID but Actually FREE content</h3>
<p>In my opinion, there is another type of content which I call "paid but free" content.</p>
<p>This is the name I've given to a platform offering <strong>free</strong> content with a premium paid <strong>quality</strong>.</p>
<p>There are very few of them, and the most famous is <a target="_blank" href="https://www.freecodecamp.org/">freeCodeCamp</a>.</p>
<p>It's quite incredible to imagine that so many hours of training are free. You can even get certified!</p>
<p>I know people who have changed their lives thanks to freeCodeCamp, and all for free.</p>
<p>I'm writing this last paragraph to give thanks for the work done by the whole team and the contributors to the platform.</p>
<p>If you want to do a kind act and help develop free content, you can <a target="_blank" href="https://www.freecodecamp.org/donate">support freeCodeCamp</a>.</p>
<blockquote>
<p>"When you donate to freeCodeCamp, you help people learn new skills and provide for their families. You also help us create new resources for you to use to expand your technology skills." - <a target="_blank" href="https://www.freecodecamp.org/donate/">freeCodeCamp's Donate Page</a></p>
</blockquote>
<h2 id="heading-conclusion">Conclusion</h2>
<p>This topic is not easy to answer, and it's the first time I've discussed something like this. I'll be honest with you: I was scared when I hit the publish button. It's quite an engaging topic, and I'll be waiting for your opinions.</p>
<p>I think nowadays there are so many ways to learn new things. This diversity comes from the need to satisfy all different types of learners.</p>
<p>It's like when you were in school – some people learned by reading, others by drawing, reading aloud, answering quizzes, and so on.</p>
<p>Choose the content that best suits your situation and goals.</p>
<p>What type of content do you use? Do you sometimes switch between paid and free content? If so, why?</p>
<p>If you want more content like this, you can <a target="_blank" href="https://twitter.com/gaelgthomas/">follow me on Twitter</a>, where I tweet about web development, self-improvement, and my journey as a full stack developer!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to deploy a static website for free in just 3 minutes straight from your Google Drive, using Fast.io ]]>
                </title>
                <description>
                    <![CDATA[ In this article, I'll show you how to deploy a static website for free in only 3 minutes, using a cloud storage service like Google Drive or Dropbox. And no - fast.io didn't pay me or freeCodeCamp to create this article. We don't have any relationshi... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-deploy-a-static-website-for-free-in-only-3-minutes-with-google-drive/</link>
                <guid isPermaLink="false">66bb92053e3fa59ecfecb876</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ HTML ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Hosting ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gaël Thomas ]]>
                </dc:creator>
                <pubDate>Wed, 15 Jan 2020 12:24:22 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/01/how-to-deploy-a-static-website-for-free-in-only-3-minutes-with-google-drive-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>In this article, I'll show you how to deploy a static website for free in only 3 minutes, using a cloud storage service like Google Drive or Dropbox.</p>
<p>And no - fast.io didn't pay me or freeCodeCamp to create this article. We don't have any relationship with them. I'm just writing about this because I found their tool to be really exciting and useful for quickly hosting static websites for free.</p>
<p><em>Note: The information in this tutorial is now outdated, but this article stays here for posterity. <a target="_blank" href="https://www.freecodecamp.org/news/search?query=static%20website">Here are some helpful articles you may like</a> on a similar topic.</em></p>
<h2 id="heading-what-is-fastio">What is Fast.io?</h2>
<p>Fast.io is a solution created by Mediafire to simplify how the web works. In a few words, their goal is to make your life easier by making the web more accessible and manageable.</p>
<p>It was launched at the end of 2019, so I'm sharing it with you now.</p>
<h2 id="heading-how-it-works">How it works</h2>
<p>When you use Fast.io, you will be able to connect to your cloud (Google Drive, DropBox, etc.), choose a website name, and deploy your content all in a few clicks.</p>
<p>If your content is ready, only 3 minutes are required to put your content online and make it accessible to everyone.</p>
<p>Once your website is online, you can configure it, add a custom domain name, and connect Google Analytics so you know how many people you are reaching.</p>
<p>I haven't mentioned this yet, but the service automatically updates your website once you modify the source files. For example, if you are using Google Drive to share your content, once you change something in your HTML page, it will be updated.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/fast-io-how-it-works.png" alt="Image" width="600" height="400" loading="lazy">
<em>Fast.io - <a target="_blank" href="https://fast.io/">How it works</a></em></p>
<h3 id="heading-available-storage-providers">Available storage providers</h3>
<p>Here's a list of available storage providers if I were to publish my website today:</p>
<ul>
<li>GitHub</li>
<li>Dropbox</li>
<li>Google Drive</li>
<li>Box</li>
<li>Mediafire</li>
<li>OneDrive</li>
</ul>
<p>As you can imagine, this list is going to grow as new services are added. But even now, you have many possibilities to host your static website.</p>
<h2 id="heading-competitors">Competitors</h2>
<p>There are already a number of different companies who allow you to quickly get a static website online. The most famous solutions are GitHub Pages, Heroku, and Netlify.</p>
<p>I'm not necessarily saying that Fast.io is the best one, but I like how simple it is to deploy a basic website.</p>
<p>Quick note: if you want to deploy something more complex – like a Python Flask website – you can't do it with Fast.io. In this case, I highly recommend using Heroku.</p>
<p>As I told you, I'm going to be transparent with you. Fast.io an excellent service for certain tasks.</p>
<h2 id="heading-what-is-a-static-website">What is a static website?</h2>
<p>Before showing you how to deploy your website, I think it's essential to define what a static website is and what the differences are from a dynamic site.</p>
<p>A static website contains web pages with fixed content. The content of your page is in HTML, and all users see the same thing.</p>
<p>For example, you can use this type of site when you want to do a landing page for your website (a basic page with information about your product).</p>
<p>The main difference between that and a dynamic website is, of course… the dynamic part!</p>
<p>A dynamic website uses a server technology to build the page when a user requests the website.</p>
<p>For example, you can use this type of site for your blog. Every time you add a new article to your database, the website will display it.</p>
<h2 id="heading-its-time-to-deploy-your-website">It’s time to deploy your website</h2>
<p>Are you ready to share your page with everyone? Let’s do it!</p>
<p>In this part, I will show you how to put your website online in a few clicks. I’m going to use a basic HTML page, but once you understand how Fast.io works you are free to modify everything.</p>
<h3 id="heading-1-create-a-indexhtml-file">1) Create a index.html file</h3>
<p>You need to create an index.html file with your HTML code inside. I recommend that you to start with something simple because you can always update it later.</p>
<p>Save the file on your computer.</p>
<pre><code class="lang-html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>My Static Website<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>My Static Website<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
      Hello, I'm online, and everyone can see me!
    <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<h3 id="heading-2-open-the-fastio-homepage">2) Open the Fast.io homepage</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/fast-io-homepage.png" alt="Image" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://fast.io">Fast.io</a> homepage</em></p>
<p>All you need to do to start with Fast.io is open the website. Once you've done that, click on <strong>"Sign up now - it's free!"</strong>.</p>
<h3 id="heading-3-configure-google-drive">3) Configure Google Drive</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/fast-io-storage-provider.png" alt="Image" width="600" height="400" loading="lazy">
<em>Fast.io - Storage provider</em></p>
<p>This page appears after step 2 and allows you to select a storage provider. Select <strong>"Google Drive"</strong>.</p>
<p>If you want to create a website with another provider, you can do that later by adding it through your account page.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/fast-io-connect-google-drive.png" alt="Image" width="600" height="400" loading="lazy">
<em>Fast.io - Connect Google Drive</em></p>
<p>Fast.io needs access to your Google Drive account to work. They will create a "Fast.io" folder to contains your website(s). Click on <strong>"Connect Google Drive Now"</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/fast-io-select-google-account.png" alt="Image" width="600" height="400" loading="lazy">
<em>Fast.io - Select your Google account</em></p>
<p>You need to <strong>select your Google account</strong> to link it with Fast.io.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/01/fast-io-allow-google.png" alt="Image" width="600" height="400" loading="lazy">
<em>Fast.io - Allow Fast.io to access Google Drive</em></p>
<p>You need to <strong>allow Fast.io to access your Google account</strong> to link it correctly.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/fast-io-create-account.png" alt="Image" width="600" height="400" loading="lazy">
<em>Fast.io - Create your account</em></p>
<p>Your account is now ready, so just choose a password and then <strong>click on "Create Account"</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/fast-io-welcome.png" alt="Image" width="600" height="400" loading="lazy">
<em>Fast.io - Welcome page</em></p>
<p>When your account is ready, a "Welcome to Fast!" page will appear. <strong>Click on "Let's begin!"</strong>.</p>
<h3 id="heading-4-create-your-website">4) Create your website</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/fast-io-add-new-website.png" alt="Image" width="600" height="400" loading="lazy">
<em>Fast.io - Dashboard</em></p>
<p>You are ready to create your website and share it with everyone! <strong>Click on "Add New Site"</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/fast-io-website-name.png" alt="Image" width="600" height="400" loading="lazy">
<em>Fast.io - Choose a website name</em></p>
<p><strong>Choose your website name and type it</strong> in the input box. When you've finished, <strong>click on "Next"</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/fast-io-select-website-type.png" alt="Image" width="600" height="400" loading="lazy">
<em>Fast.io - Choose a website type</em></p>
<p>Fast.io allows you to create three website types: a File Sharing website, a Web Page, or a Files Browser website.</p>
<p>In our case, we will <strong>select "Web Pages"</strong> because we want to host an HTML web page.</p>
<p>If later you want to create a website to share some documents, you have to go back to your dashboard, create a new one, and select File Downloads.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/fast-io-select-google-drive.png" alt="Image" width="600" height="400" loading="lazy">
<em>Fast.io - Choose a storage provider for your website</em></p>
<p>Once you clicked on "Web Pages", you need to select your storage provider. <strong>Click on "Google Drive"</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/fast-io-select-url.png" alt="Image" width="600" height="400" loading="lazy">
<em>Fast.io - Choose your website URL</em></p>
<p><strong>Choose your website URL and type it</strong> in the input box. When you've finished, <strong>click on "Create Site"</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/fast-io-success.png" alt="Image" width="600" height="400" loading="lazy">
<em>Fast.io - Successfully created website</em></p>
<p>You did it! Your website is online and available at the URL you chose. In my case, you can find my site on <a target="_blank" href="https://mygoogledrivewebsite.imfast.io">mygoogledrivewebsite.imfast.io</a></p>
<h3 id="heading-5-upload-your-indexhtml">5) Upload your index.html</h3>
<p>If you open your website, you may notice an error because you didn't upload your index.html file on your Google Drive.</p>
<p>Here are two ways to do that:</p>
<ul>
<li><strong>Open your Google Drive and search for the Fast.io folder</strong>, then the folder of your website (in my case, "mygoogledrivewebsite.imfast.io").</li>
<li>On the step 4 success page, <strong>click on "See your Google Drive"</strong>.</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/fast-io-google-drive-upload.png" alt="Image" width="600" height="400" loading="lazy">
<em>Fast.io - Google Drive before upload</em></p>
<p>Once you've done that, <strong>right-click with your mouse and select "Upload files"</strong>. A new window will open, <strong>find your "index.html" file - select it</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/fast-io-google-drive.png" alt="Image" width="600" height="400" loading="lazy">
<em>Fast.io - Google Drive after upload</em></p>
<p>Wait for a little bit before the change appears on your website.</p>
<h3 id="heading-6-celebrate">6) Celebrate!</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/fast-io-website-demo.png" alt="Image" width="600" height="400" loading="lazy">
<em>Fast.io - Website demo</em></p>
<p>Spread the word to all your friends! Your website is live and everyone can see it!</p>
<p> ? <a target="_blank" href="https://ctt.ac/Me7Uk">Share it on Twitter by clicking here!</a> ?</p>
<h3 id="heading-7-bonus">7) Bonus</h3>
<p>If you are curious and want to configure everything, you can go back to your dashboard and click on your website.</p>
<p>You will be able to link your website to Google Analytics (visitors statistics), change your domain name (for example, mywebsite.com), and a lot more!</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>What do you think of this new service? Did you find it fast and easy?</p>
<p>Feel free to share this article if you liked it.</p>
<p>If you want more content like this, you can <a target="_blank" href="https://twitter.com/gaelgthomas/">follow me on Twitter</a>, where I tweet about web development, self-improvement, and my journey as a full stack developer!</p>
<p>### </p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What is Flutter and Why You Should Learn it in 2020 ]]>
                </title>
                <description>
                    <![CDATA[ This year, mobile applications continued to become more and more popular. Fortunately there are many programming tools available to developers who want to create them. Among these tools there is Flutter, which has distinguished itself lately.  What i... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-flutter-and-why-you-should-learn-it-in-2020/</link>
                <guid isPermaLink="false">66bb9220add24ba427325103</guid>
                
                    <category>
                        <![CDATA[ Android ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Career ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Flutter ]]>
                    </category>
                
                    <category>
                        <![CDATA[ iOS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gaël Thomas ]]>
                </dc:creator>
                <pubDate>Thu, 12 Dec 2019 17:17:41 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2019/12/what-is-flutter-and-why-you-should-learn-it-in-2020.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>This year, mobile applications continued to become more and more popular. Fortunately there are many programming tools available to developers who want to create them. Among these tools there is Flutter, which has distinguished itself lately. </p>
<h2 id="heading-what-is-flutter">What is Flutter?</h2>
<p>Flutter is a free and open-source mobile UI framework created by Google and released in May 2017. In a few words, it allows you to create a native mobile application with only one codebase. This means that you can use one programming language and one codebase to create two different apps (for iOS and Android).</p>
<p>Flutter consists of two important parts:</p>
<ul>
<li>An SDK (Software Development Kit): A collection of tools that are going to help you develop your applications. This includes tools to compile your code into native machine code (code for iOS and Android).</li>
<li>A Framework (UI Library based on widgets): A collection of reusable UI elements (buttons, text inputs, sliders, and so on) that you can personalize for your own needs.</li>
</ul>
<p>To develop with Flutter, you will use a programming language called Dart. The language was created by Google in October 2011, but it has improved a lot over these past years.</p>
<p>Dart focuses on front-end development, and you can use it to create mobile and web applications.</p>
<p>If you know a bit of programming, Dart is a typed object programming language. You can compare Dart's syntax to JavaScript.</p>
<blockquote>
<p>“Flutter is Google’s UI toolkit for building beautiful, natively compiled applications for mobile, web, and desktop from a single codebase.” - Google, <a target="_blank" href="https://flutter.dev">flutter.dev</a></p>
</blockquote>
<h2 id="heading-why-you-should-learn-flutter">Why you should learn Flutter?</h2>
<p>I selected some of the reasons why I like Flutter and why I want to use it next year. I will give you details and my feedback below.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/companies-using-flutter.png" alt="Image" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://flutter.dev/showcase">Companies using Flutter</a></em></p>
<h3 id="heading-simple-to-learn-and-use">Simple to learn and use</h3>
<p>Flutter is a modern framework, and you can feel it! It’s way simpler to create mobile applications with it. If you have used Java, Swift, or React Native, you'll notice how Flutter is different.</p>
<p>I personally never liked mobile application development before I started using Flutter.</p>
<p>What I love about Flutter is that you can create a real native application without a bunch of code.</p>
<h3 id="heading-quick-compilation-maximum-productivity">Quick compilation: maximum productivity</h3>
<p>Thanks to Flutter, you can change your code and see the results in real-time. It’s called Hot-Reload. It only takes a short amount of time after you save to update the application itself. </p>
<p>Significant modifications force you to reload the app. But if you do work like design, for example, and change the size of an element, it’s in real-time!</p>
<h3 id="heading-ideal-for-startup-mvps">Ideal for startup MVPs</h3>
<p>If you want to show your product to investors as soon as possible, Flutter is a good choice.</p>
<p>Here are my top 4 reasons to use it for your MVP:</p>
<ul>
<li>It’s cheaper to develop a mobile application with Flutter because you don’t need to create and maintain two mobile apps (one for iOS and one for Android).</li>
<li>One developer is all you need to create your MVP.</li>
<li>It’s performant – you won't notice the difference between a native application and a Flutter app.</li>
<li>It’s beautiful – you can easily use widgets provided by Flutter and personalize it to create a valuable UI for your customers (you can find examples of applications made with Flutter below).</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/flutter-app-example.gif" alt="Image" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://github.com/LiveLikeCounter/Flutter-Todolist">Flutter App Example - ToDo List</a></em></p>
<h3 id="heading-good-documentation">Good documentation</h3>
<p>It’s important for new technology to have good documentation. But it’s not always the case that it has it! </p>
<p>You can learn a lot from Flutter's documentation, and everything is very detailed with easy examples for basic use cases. Each time I’ve had a problem with one of my widgets in my code, I have been able to check the documentation and the answer was there.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/flutter-documentation.png" alt="Image" width="600" height="400" loading="lazy">
<em>Flutter Documentation Architecture</em></p>
<h3 id="heading-a-growing-community">A growing community</h3>
<p>Flutter has a robust community, and it’s only the beginning!</p>
<p>As you may know, I love to share my knowledge and useful content on programming <a target="_blank" href="https://herewecode.io">on my website</a>. I need to know I’m working on a technology full of potential with a lot of backers.</p>
<p>When I started using Flutter, the first thing I did was search for communities, and to my surprise… there are a considerable number of places to exchange info on Flutter.</p>
<p>I will give you some examples of places I love to check daily. Feel free to <a target="_blank" href="https://twitter.com/gaelgthomas/">send me a message on Twitter</a> with your suggestions.  </p>
<ul>
<li><a target="_blank" href="https://flutterawesome.com/">Flutter Awesome:</a> An awesome list that curates the best Flutter libraries and tools. This website publishes daily content with lots of examples, application templates, advice, and so on.</li>
<li><a target="_blank" href="https://github.com/Solido/awesome-flutter">Awesome Flutter:</a> A GitHub repository (linked to Flutter Awesome) with a list of articles, videos, components, utilities, and so on.</li>
<li><a target="_blank" href="https://itsallwidgets.com/">It’s all widgets!:</a> An open list of apps built with Flutter.</li>
<li><a target="_blank" href="https://medium.com/flutter-community">Flutter Community:</a> A Medium publication where you can find articles, tutorials, and much more.</li>
</ul>
<h3 id="heading-supported-by-android-studio-and-vs-code">Supported by Android Studio and VS Code</h3>
<p>Flutter is available on different IDEs. The two main code editors for developing with this technology are Android Studio (IntelliJ) and VS Code.</p>
<p>Android Studio is a complete software with everything already integrated. You have to download Flutter and Dart plugins to start.</p>
<p>VS Code is a lightweight tool, and everything is configurable through plugins from the marketplace.</p>
<p>I use Android Studio because I don’t need to configure a lot of things to work.</p>
<p>You are free to choose your preferred IDE!</p>
<h2 id="heading-bonus">Bonus</h2>
<h3 id="heading-freelance">Freelance</h3>
<p>If you want to start doing some freelance work, you should think about using Flutter.</p>
<p>In 2020, I believe that this technology is going to explode. And that means a lot of people are going to search for developers who know how to use it.</p>
<p>The biggest platform for freelancers in France, called Malt, recently published the tech trends of this year. Flutter has grown by +303% on this platform between 2018 and 2019.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/flutter-malt-statistics.png" alt="Image" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://www.malt.com/resources/reports/tech-data-2019/">Flutter statistics - Malt</a></em></p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Well, what do you think of Flutter? Will you start learning it next year?</p>
<p>I hope that this introduction has interested and motivated you. Feel free to share this article if you liked it.</p>
<p>If you want more content like this, you can <a target="_blank" href="https://twitter.com/gaelgthomas/">follow me on Twitter</a>, where I tweet about web development, self-improvement, and my journey as a full stack developer!</p>
<p>### </p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
