<?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[ configuration - 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[ configuration - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 25 May 2026 22:38:19 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/configuration/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ How to Set a Different Location to Save All Screenshots on macOS ]]>
                </title>
                <description>
                    <![CDATA[ If you're coming to macOS from a different operating system (like Windows or Linux), it might feel odd that, by default, macOS saves screenshots in the Desktop folder. This make the desktop look messy after a while if you take a lot of screenshots! B... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-set-a-different-location-to-save-screenshots-on-mac/</link>
                <guid isPermaLink="false">66b902fd05ed142b6e64c271</guid>
                
                    <category>
                        <![CDATA[ configuration ]]>
                    </category>
                
                    <category>
                        <![CDATA[ macOS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Md. Fahim Bin Amin ]]>
                </dc:creator>
                <pubDate>Wed, 17 Apr 2024 22:02:43 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2024/04/iewek-gnos-hhUx08PuYpc-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>If you're coming to macOS from a different operating system (like Windows or Linux), it might feel odd that, by default, macOS saves screenshots in the Desktop folder. This make the desktop look messy after a while if you take a lot of screenshots!</p>
<p>But it doesn't look messy if you create a specific directory for saving all the screenshots and your MacBook saves all the screenshots there automatically. </p>
<p>Configuring the settings might seem tricky for new MacBook users. So I will show you how you can do this within a few minutes with this step-by-step guide.</p>
<p>Keep in mind that although I am choosing the <code>Pictures/Screenshots</code> directory as my specific directory for saving all my screenshots, you can choose any directory you want.</p>
<p>For this article, I am using my newly purchased MacBook M1 Air (8/256) which is currently running on macOS Sonoma 14.4.1. But the same procedure is applicable for all the latest macOS versions as well.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/04/change-default-save-location-screenshots-mac-os-x-for-cleaner-desktop.w1456.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>A messy desktop full of screenshots :( (Source: <a target="_blank" href="https://macos.gadgethacks.com/how-to/change-default-save-location-screenshots-mac-os-x-for-cleaner-desktop-0160154/">Internet</a>)</em></p>
<h2 id="heading-how-to-choose-a-different-location">How to Choose a Different Location</h2>
<p>Firstly, you need to select a specific location where you want to save all the screenshots directly. </p>
<p>In my case, I created a separate folder for saving screenshots inside my "Pictures" directory.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/04/Screenshot-2024-04-15-at-6.24.07-PM.png" alt="Image" width="600" height="400" loading="lazy">
<em>Directory where I want to save the screenshots automatically</em></p>
<h2 id="heading-how-to-configure-the-screenshot-tool">How to Configure the Screenshot Tool</h2>
<p>Now we need to configure the default screenshot tool on macOS so that it automatically saves the screenshot images to our desired location. Here's how you can do that:</p>
<ol>
<li>Use <code>Shift</code> + <code>Command</code> + <code>5</code> to open the screenshot tool.</li>
<li>Click on "Options". Then click "Other Location...".</li>
<li>Select that specific location that you created earlier. </li>
<li>Now click "Ok", or "Open", or whatever it says to confirm that new location.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/04/IMG_20240415_175823.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Screenshot tool's options. I captured it using my phone. :)</em></p>
<p>That's it! From now on, whenever you use the default screenshot tool, it will automatically save all the screenshots in that newly specified location. This will help your desktop remain clutter free!</p>
<h2 id="heading-screenshot-shortcut">Screenshot Shortcut</h2>
<p>There are many people who still open the Screenshot tool using Spotlight or the launchpad. But there is a dedicated shortcut key for that!</p>
<p>You can use <code>Shift</code> + <code>Command</code> + <code>3</code> to take screenshot directly and save yourself a little time.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>I hope you have learned something new from this article.</p>
<p>If you have enjoyed the procedures step-by-step, then don't forget to let me know on <a target="_blank" href="https://twitter.com/Fahim_FBA">Twitter/X</a> or <a target="_blank" href="https://www.linkedin.com/in/fahimfba/">LinkedIn</a>. I would appreciate it if you could endorse me for some relevant skillsets on <a target="_blank" href="https://www.linkedin.com/in/fahimfba/">LinkedIn</a>.</p>
<p>You can follow me on <a target="_blank" href="https://github.com/FahimFBA">GitHub</a> as well if you are interested in open source. Make sure to check <a target="_blank" href="https://fahimbinamin.com/">my website</a> (<a target="_blank" href="https://fahimbinamin.com/">https://fahimbinamin.com/</a>) as well.</p>
<p>Thank you so much! 😀</p>
<p>Cover image: Photo by <a target="_blank" href="https://unsplash.com/@imkirk?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Iewek Gnos</a> on <a target="_blank" href="https://unsplash.com/photos/macbook-pro-on-white-wooden-desk-hhUx08PuYpc?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What is Firebase Remote Config? ]]>
                </title>
                <description>
                    <![CDATA[ Remote configurations are useful because they allow you to alter the behavior in your application without having to release a new version of the app. One prominent example is using remote configurations to decide if a feature should be turned on or o... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/firebase-remote-config/</link>
                <guid isPermaLink="false">66ba4ff0158e6c6a8cb8c79a</guid>
                
                    <category>
                        <![CDATA[ Cloud Services ]]>
                    </category>
                
                    <category>
                        <![CDATA[ configuration ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Firebase ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Tomer ]]>
                </dc:creator>
                <pubDate>Tue, 03 Oct 2023 15:44:31 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2023/09/rima-kruciene-gpKe3hmIawg-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Remote configurations are useful because they allow you to alter the behavior in your application without having to release a new version of the app. One prominent example is using remote configurations to decide if a feature should be turned on or off. That way, you can gradually roll it out to production or test it to see how users react.</p>
<p>If you want your application to have this functionality, you'd usually have to build your server and its logic. But we now live in an age of technological innovation, and tools have been created to help you minimize your development time.</p>
<p>This tool is called Firebase Remote Config — a cloud service that enables you change different functionalities of your app without releasing updates or asking users to update the app.</p>
<h2 id="heading-overview">Overview</h2>
<p>You can access the Remote Config feature in your project’s Firebase console. It is usually under the Release &amp; Monitor section on the left sidebar.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/09/1-6.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>There are two ways in which you can define your remote configurations:</p>
<ol>
<li>Using Firebase.</li>
<li>Using a template file that is in JSON format.</li>
</ol>
<p>We will focus on the first option, as the second option is a less intuitive approach.</p>
<p>Firebase Remote Config lets you define one or more keys during configuration. Keys can be of the following type:</p>
<ul>
<li>String</li>
<li>Number</li>
<li>Boolean</li>
<li>JSON</li>
</ul>
<p>These keys are used as the configurations for your application. For example, if you have a feature in your application that you would like to control through remote configurations, you  could define a Boolean key titled enableFeatureX.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/09/1-7.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Each key you set has a few other settings that may be useful to you. For example, you can define a default value for a key (for example, false can be the default value of a Boolean key) or make it use a value that you have defined in your application. </p>
<p>Another cool thing you can do, by clicking on the Add new button in the image above, is to set the value of a key based on certain factors. You'll see these options when you click on the button:</p>
<ul>
<li>Conditional value.</li>
<li>Experiment.</li>
<li>Personalization.</li>
</ul>
<p>Once you are done adding a key, make sure to publish your changes so they will be deployed.</p>
<h2 id="heading-the-conditional-value-option">The Conditional Value Option</h2>
<p>You can configure how a value will be set to specific users based on various conditions.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/09/1-8.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Here, you can decide on what you want to test and how. You will discover several options when you click on the “Applies if” dropdown. </p>
<p>To illustrate the use of this feature, let’s say that you want to target iOS users in the US. You can do that using the “Applies if” dropdown and choosing Platform and then iOS. </p>
<p>After that, you can press the "and" button to add a condition for Country/Region and choose United States.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/09/1-9.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Make sure to also name your condition, otherwise, the Create condition button won’t be enabled.</p>
<p>Notice how the last field in defining a new condition window tells you how many users will be affected by this condition? That's a pretty cool feature.</p>
<h2 id="heading-the-experiment-option">The Experiment Option</h2>
<p>This option lets you change the behavior of a value in your remote configurations before taking effect on all your users.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/09/1-10.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>You can follow these steps to configure the experiment option:</p>
<ul>
<li>In the first step, you have to fill in the name and description of your experiment.</li>
<li>Then, you have choose which application to target and how many users will be affected (percentage-wise) in the second step.</li>
<li>The third step is to set up the metrics to measure this experiment. There are two types — the primary metrics and additional metrics.</li>
<li>Lastly, you can decide on the number of A/B test groups for this experiment.</li>
</ul>
<h2 id="heading-the-personalization-option">The Personalization Option</h2>
<p>Last but not least is the option to tailor a specific value of your remote configurations to a user based on their own behavior.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/09/1-11.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>You can define values the algorithm may supply to the user based on their behavior. These will be chosen by an objective you define (Step 2). This objective can range from the engagement time of the user to the amount of clicks they perform. In Step 3, you define a condition that will target users so that they will become personalized. Lastly, in Step 4, you add the name and description of this personalization.</p>
<p>Each option has much more to offer than what I have described here, so if you want to learn more, you can use one of the reference links at the bottom. Now that we understand what Remote Config is, let’s see how we can add it to our application.</p>
<h2 id="heading-how-to-setup-firebase-remote-config">How to Setup Firebase Remote Config</h2>
<p>Before you can do anything related to applying remote configurations, you need to make sure you've added Firebase to your Android project. This has been documented <a target="_blank" href="https://firebase.google.com/docs/android/setup?authuser=0">here</a>. </p>
<p>After you have done that, follow these steps:</p>
<h3 id="heading-step-1-add-the-firebase-remote-configuration-library-to-your-project-inside-your-application-buildgradle-file">Step #1 - Add the Firebase remote configuration library to your project inside your application build.gradle file</h3>
<pre><code> implementation <span class="hljs-string">'com.google.firebase:firebase-config-ktx'</span>
</code></pre><p>There is an option to also import the Firebase Analytics module, but it is not required for remote configurations. It is used in other areas of remote configurations, such as defining a condition based on a specific event happening.</p>
<h3 id="heading-step-2-use-the-remoteconfig-object">Step #2 - Use the <code>RemoteConfig</code> Object</h3>
<p>After syncing your project, you can access the <code>RemoteConfig</code> object with this command:</p>
<pre><code class="lang-kotlin"><span class="hljs-keyword">val</span> remoteConfig: FirebaseRemoteConfig = Firebase.remoteConfig
</code></pre>
<h3 id="heading-step-3-define-fetch-interval">Step #3 - Define fetch interval</h3>
<p>You can define how often your remote configurations will be fetched and updated. When you are still developing your application, setting this number to be relatively low is more ideal.</p>
<pre><code class="lang-kotlin"><span class="hljs-keyword">val</span> remoteConfigSettings = remoteConfigSettings {                             minimumFetchIntervalInSeconds = <span class="hljs-number">2000</span>
}
</code></pre>
<p>If you set the <code>**minimumFetchIntervalInSeconds**</code> to be too low, Firebase will throw a <code>FirebaseRemoteConfigFetchThrottledException</code>, so use a low number only when you are testing things.</p>
<h3 id="heading-step-4-set-the-configuration-for-the-remote-configuration">Step #4 - Set the configuration for the remote configuration</h3>
<p>You can set the remote configuration using the code below:</p>
<pre><code class="lang-kotlin">remoteConfig.setConfigSettingsAsync(remoteConfigSettings)
</code></pre>
<h3 id="heading-step-5-set-default-values">Step #5 - Set default values</h3>
<p>You can have application default values for your remote configurations. These can be created as an XML file inside the XML directory inside the res folder. Here’s what the code looks like:</p>
<pre><code class="lang-kotlin">:remoteConfig.setDefaultsAsync(R.xml.remote_config_defaults)
</code></pre>
<p>This XML file must have an underlying element of a map to wrap all your default values. For example, let’s imagine we have defined a key in remote configurations called <code>my_key</code>, whose value is <code>1</code>. The XML for the default values will look like this:</p>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">defaultsMap</span>&gt;</span>
   <span class="hljs-tag">&lt;<span class="hljs-name">entry</span>&gt;</span>      
      <span class="hljs-tag">&lt;<span class="hljs-name">key</span>&gt;</span>my_key<span class="hljs-tag">&lt;/<span class="hljs-name">key</span>&gt;</span>     
      <span class="hljs-tag">&lt;<span class="hljs-name">value</span>&gt;</span>1<span class="hljs-tag">&lt;/<span class="hljs-name">value</span>&gt;</span>   
    <span class="hljs-tag">&lt;/<span class="hljs-name">entry</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">defaultsMap</span>&gt;</span>
</code></pre>
<p>Remote configurations need to be fetched and activated. The fetch action fetches and stores your Remote Configurations inside the Remote Config object. The activation part is to make these values available to your application. That’s why there are two API methods:</p>
<ul>
<li><code>fetch</code> (and later use activate)</li>
</ul>
<pre><code class="lang-kotlin">remoteConfig.fetch().addOnCompleteListener { task -&gt;               <span class="hljs-keyword">if</span>                <span class="hljs-keyword">if</span> (task.isSuccessful) {     
              <span class="hljs-comment">//Remote Configurations fetch successfully          </span>
           }         
        }.addOnFailureListener { error -&gt;             
                <span class="hljs-comment">//Remote Configurations fetch failure            </span>
       }
-------------------------
remoteConfig.activate().addOnCompleteListener { task -&gt;  
<span class="hljs-keyword">if</span> (task.isSuccessful) {
        <span class="hljs-comment">//Remote Configurations activation success   </span>
        }  
   }.addOnFailureListener { error -&gt; 
               <span class="hljs-comment">//Remote Configurations activation failure</span>
  }
</code></pre>
<ul>
<li><code>fetchAndActivate</code></li>
</ul>
<pre><code class="lang-kotlin">remoteConfig.fetchAndActivate().addOnCompleteListener { task -&gt;                                <span class="hljs-keyword">if</span> (task.isSuccessful) {     
                <span class="hljs-comment">//Remote Configurations fetched and activated successfully                }        </span>
       }.addOnFailureListener { error -&gt;           
       <span class="hljs-comment">//Remote Configurations fetched and activated failure    </span>
     }
</code></pre>
<h3 id="heading-step-6-access-configurations">Step #6 - Access configurations</h3>
<p>Now that our remote configurations have been fetched and activated, we can access and use them in our application. We can do so by accessing the <code>remoteConfig</code> object and using one of the getter methods per the type of the value we set:</p>
<pre><code class="lang-kotlin"><span class="hljs-keyword">val</span> myRemoteConfigValue: String = remoteConfig.getString(<span class="hljs-string">"my_key"</span>)
</code></pre>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Since your application will rely on remote configurations for its operation (or parts of it), it is crucial to decide how the application will behave if it does not arrive or takes too long to receive a response. </p>
<p>In essence, there are two ways to handle loading the remote configurations:</p>
<ol>
<li>Your application boots up and waits for the remote configurations to be activated.</li>
<li>Your application boots up and does not wait for the remote configuration to be activated. Opting instead to use the remote configurations on the second application run.</li>
</ol>
<p>It's important to understand that there is no option that is preferable over the other. It all depends on what your use case is and how you would like the user's experience to be when using your application. The first option guarantees that once your application is loaded, all the remote configurations that you have defined will be set and the user's experience will be smooth after the initial load time. If you have critical features that rely on the remote configurations, you will have to go with this option.</p>
<p>On the other hand, if your remote configurations concern a specific feature of your application that doesn't necessarily need to happen on the first initial launch, you might consider going for second option. That way, your application does not need to wait for the remote configurations to be received from Firebase and the logic inside your application can happen later.</p>
<p>There are good and bad implications for each of these methods, and it’s up to you to decide which is better suited for your application. If you choose the first option, you may add a loading screen that times out after a certain period. If you choose option two, it is recommended to create a default mechanism for features in your application and how they should work when the configuration has not yet been received.</p>
<p>There is more than we have discussed in this article, and I encourage you to investigate deeper things. I recently used Firebase Remote Configurations in an application I created that helps users schedule appointments.</p>
<p>You can check it out o<a target="_blank" href="https://play.google.com/store/apps/details?id=com.tomerpacific.scheduler">n the Google Play store</a>.</p>
<p>And you can see the source code here:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://github.com/TomerPacific/scheduler">https://github.com/TomerPacific/scheduler</a></div>
<p>If you want to read other articles I have written, you can find them below:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://github.com/TomerPacific/MediumArticles">https://github.com/TomerPacific/MediumArticles</a></div>
<h2 id="heading-references">References</h2>
<ul>
<li><a target="_blank" href="https://firebase.google.com/docs/remote-config/get-started?platform=android">Getting Started With Firebase For Android</a></li>
<li><a target="_blank" href="https://firebase.google.com/docs/remote-config/use-cases">Remote Config Use Cases</a></li>
<li><a target="_blank" href="https://firebase.google.com/docs/remote-config/loading">Remote Config Loading Strategies</a></li>
<li><a target="_blank" href="https://firebase.google.com/docs/remote-config/personalization">Remote Config Personalization</a></li>
</ul>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What is Bonjour on my Computer? Windows 10 Bonjour Program PC Guide ]]>
                </title>
                <description>
                    <![CDATA[ Apple devices work well and connect readily with other Apple devices. But they have a hard time communicating with devices running other operating systems like Windows and Linux. If you have both Apple and Windows devices, you might want to share fil... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-bonjour-on-my-computer/</link>
                <guid isPermaLink="false">66adf26a88723f64bc4313a5</guid>
                
                    <category>
                        <![CDATA[ configuration ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                    <category>
                        <![CDATA[ mac ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Windows 10 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kolade Chris ]]>
                </dc:creator>
                <pubDate>Tue, 02 Nov 2021 18:23:02 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/11/bonjour.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Apple devices work well and connect readily with other Apple devices. But they have a hard time communicating with devices running other operating systems like Windows and Linux.</p>
<p>If you have both Apple and Windows devices, you might want to share files between them over a local network. And this is what Apple's Bonjour service makes happen under the hood. </p>
<p>In this guide, I will take you through what Bonjour is and how you can get it running on your Windows 10 computer.</p>
<h2 id="heading-what-is-apples-bonjour-program">What is Apple's Bonjour Program?</h2>
<p>Bonjour is Apple's implementation of zero-configuration networking (zeroconf). It allows devices running both Windows and Apple operating systems (like macOS and iOS) to connect and share resources without any configuration settings.</p>
<p>With Bonjour, you can locate other devices such as scanners and printers on a local network and connect with them. You can also share files irrespective of the operating system you are using, whether it's Windows, macOS, or Linux. </p>
<h2 id="heading-how-bonjour-works-on-a-computer">How Bonjour Works on a Computer</h2>
<p>Bonjour is not a regular software product. Unlike other software and apps, you don't get to use Bonjour directly.</p>
<p>Instead, Bonjour runs in the background and connects devices together by using a "link addressing scheme", which automatically assigns IP addresses to devices on a local network.</p>
<p>Examples of apps that use Bonjour include iTunes, Skype, iChat, and iPhoto.</p>
<h2 id="heading-how-to-get-bonjour-up-and-running-on-windows-10">How to Get Bonjour Up and Running on Windows 10</h2>
<p>Unlike Apple devices which work hand in hand with Bonjour, you might have to manually install Bonjour on your Windows 10 computer. </p>
<p>Bonjour is not available to be downloaded as a standalone app, so you'll need to download an app that uses it. </p>
<p>It used to come attached with Mac apps such as iTunes and the Safari browser in a zip folder, but these days, the iTunes app may download it for you over a WiFi network.</p>
<p>However, you can install Bonjour for your Windows 10 computer by downloading the Bonjour SDK (Software Development Kit) from the <a target="_blank" href="https://developer.apple.com/bonjour/">Apple Developer Website</a>.</p>
<p>Make sure you select Bonjour SDK for Windows as shown below:
<img src="https://www.freecodecamp.org/news/content/images/2021/11/bonjour-sdk.jpg" alt="bonjour-sdk" width="600" height="400" loading="lazy"></p>
<p>Once you do that, you will have to sign in with your Apple ID. If you don't have one, you can create it.</p>
<p>When you sign in successfully, you will be presented with different versions of Bonjour SDK. Download the one you want and install it by opening up the installer and following the prompts.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/versions.png" alt="versions" width="600" height="400" loading="lazy"></p>
<p>When the Bonjour SDK gets installed, the Bonjour program gets installed with it as well.</p>
<h2 id="heading-do-you-need-bonjour-on-your-windows-10-computer">Do you need Bonjour on your Windows 10 computer?</h2>
<p>If you use an app that depends on Bonjour to run on a Windows computer, you definitely need Bonjour for the app to function effectively. </p>
<p>In addition, if you use devices that cut across multiple operating systems such as macOS, Windows, and Linux, you might need to connect them together to share resources such as files and devices – and you'll need Bonjour for that to happen. This will also give you the advantage of zero-configuration.</p>
<p>Lastly, if you don't use an Apple device like a Mac but you have friends who do, you should consider getting Bonjour installed on your device, so you can share files and other resources with them.</p>
<h2 id="heading-how-to-stop-or-uninstall-bonjour-on-windows-10">How to Stop or Uninstall Bonjour on Windows 10</h2>
<p>If you stop using an app that depends on Bonjour to work, or you want to say goodbye for any other reason, you might want to stop Bonjour. You can do this from the Task Manager.</p>
<p><strong>Step 1</strong>: Click on Start, or press the <code>WIN</code> (Windows) key on your keyboard.</p>
<p><strong>Step 2</strong>: Search for "task manager" and hit <code>ENTER</code>.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-1a.png" alt="ss-1a" width="600" height="400" loading="lazy"></p>
<p><strong>Step 3</strong>: Click on the Services tab. Here you will see Bonjour Service, which is sometimes available as <code>"mDNSResponder.exe"</code>.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-1.jpg" alt="ss-1" width="600" height="400" loading="lazy"></p>
<p><strong>Step 4</strong>: Right-click on it and select “Stop”.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-2.jpg" alt="ss-2" width="600" height="400" loading="lazy"></p>
<h3 id="heading-to-uninstall-bonjour-you-can-do-it-in-the-settings-app">To uninstall Bonjour, you can do it in the Settings app.</h3>
<p><strong>Step 1</strong>: Click on Start, or press the <code>WIN</code> (Windows) key on your keyboard, and Select Settings to open the Settings app.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-3.jpg" alt="ss-3" width="600" height="400" loading="lazy"></p>
<p><strong>Step 2</strong>: Select Apps.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-4.jpg" alt="ss-4" width="600" height="400" loading="lazy"></p>
<p><strong>Step 3</strong>: On the Apps &amp; Features tab, scroll till you find Bonjour, or search for it.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-5.jpg" alt="ss-5" width="600" height="400" loading="lazy"></p>
<p><strong>Step 4</strong>: Select uninstall, and again, uninstall.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-6.jpg" alt="ss-6" width="600" height="400" loading="lazy"></p>
<p>Please note that to get rid of the Bonjour service totally, you might have to uninstall the app using it as well. If you installed Bonjour through the Bonjour SDK, make sure you uninstall the Bonjour SDK as well.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Bonjour is a useful service that gives you more flexibility if you work with devices that use multiple operating systems. </p>
<p>This guide showed youß what the Bonjour service is, what it does, and how you can have more control over it on your Windows 10 computer.</p>
<p>Thank you for reading. If you find this article helpful, please share it with your friends and family.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What Items Should Be Configurable in an Application? ]]>
                </title>
                <description>
                    <![CDATA[ By Kenneth Angelo Reyes Configuration is an essential part of every application. It helps enhance an application's flexibility and maintainability.  With this in mind, it's very important that developers are able to correctly identify what items shou... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-should-be-configurable-in-apps/</link>
                <guid isPermaLink="false">66d460c7787a2a3b05af43f2</guid>
                
                    <category>
                        <![CDATA[ configuring settings ]]>
                    </category>
                
                    <category>
                        <![CDATA[ configuration ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Applications ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 27 Oct 2021 20:30:15 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/10/sigmund-f0dJjQMhfXo-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Kenneth Angelo Reyes</p>
<p>Configuration is an essential part of every application. It helps enhance an application's flexibility and maintainability. </p>
<p>With this in mind, it's very important that developers are able to correctly identify what items should be in configuration.</p>
<p>In this article, I'll walk you through 8 items that should be configurable in your applications.</p>
<h2 id="heading-define-configuration">Define "Configuration"</h2>
<p>We will not be aligning with any existing platforms out there.</p>
<p>For the context of this article, an application configuration has the following characteristics:</p>
<ul>
<li>A set of simple or complex values that can affect an application's behavior</li>
<li>Values can easily be changed without requiring any code deployment</li>
</ul>
<p>With that out of the way, let's go to our list!</p>
<h2 id="heading-the-configurables">The "Configurables"</h2>
<p>Here are the 8 items that should be configurable in your applications.</p>
<h3 id="heading-magic-numbers">Magic Numbers</h3>
<p>These are special numbers that are used in certain displays, validations, or business rules.</p>
<p><strong>Examples:</strong></p>
<ul>
<li>Number of days before an SLA (Service Level Agreement) is breached</li>
<li>Number of decimal places when rendering a currency</li>
</ul>
<h3 id="heading-urls">URLs</h3>
<p>When connecting to 3rd-party services, there's no knowing when their URLs will change. It's best to keep these values configurable. Additionally, configurable URLs can help you control the value in different environments.</p>
<p><strong>Examples:</strong></p>
<ul>
<li>API Endpoints</li>
<li>External websites</li>
</ul>
<h3 id="heading-feature-toggle">Feature Toggle</h3>
<p>This is helpful when there is a feature that's already in production, but which can only be enabled after a certain time.</p>
<p>An example of this is a feature that can only be enabled after a live stream event. Normally, this can be a Boolean value, but you can also use Date Time for this. This just means that the feature will automatically be enabled once that time has passed.</p>
<h3 id="heading-regex-patterns">Regex Patterns</h3>
<p>Some Regex patterns, especially those used in validation, have the potential to change regularly.</p>
<p>An example of this is phone number validation. Initially, your application might allow phone numbers from several countries. Then, perhaps a change in requirements came about where you now have to allow only phone numbers from specific countries. </p>
<p>If your validation pattern is in configuration, then you can quickly make this change.</p>
<h3 id="heading-special-dates">Special Dates</h3>
<p>Not the romantic ones! In some applications, there's a need to "block" certain dates from being selected by users.</p>
<p>A perfect example of this are public holidays. Since these dates can change regularly, they should be placed in configuration.</p>
<h3 id="heading-connection-strings">Connection Strings</h3>
<p>Database connection strings should never be placed in your code! When you place connection strings in configuration, you'll also be able to set a different value per environment.</p>
<h3 id="heading-formulas">Formulas</h3>
<p>For finance-related applications, making formulas configurable is very important. For these type of applications, adapting to policy or regulatory changes as soon as possible is a must.</p>
<h3 id="heading-special-messages">Special Messages</h3>
<p>This may be more applicable to non-CMS applications. In some cases, the regular changes in text messages are tied to legal or regulatory policies. Therefore, these messages should be easy to update.</p>
<p>A good example of this is an announcement that shows whether the application is currently facing any issues or is under maintenance.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>These are the 8 items that I believe should be configurable in every application. I'm sure you have other items on your mind. Let me know! Looking forward to hearing from you.</p>
<p>Glad you reached the end of this article. I hope you learned something new from me today.</p>
<p>_<a target="_blank" href="https://unsplash.com/photos/f0dJjQMhfXo">Cover photo</a> <a target="_blank" href="https://unsplash.com/@sigmund?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">f</a>rom <a target="_blank" href="https://unsplash.com/s/photos/settings?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>_</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Why You Should Use EditorConfig to Standardize Code Styles ]]>
                </title>
                <description>
                    <![CDATA[ You use EditorConfig to define formatting conventions for textual files in a project. It's great because it's widely supported, and it's not tied to any particular language, framework, or code editor. EditorConfig on its own is just a vendor-agnostic... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-use-editorconfig-to-standardize-code-styles/</link>
                <guid isPermaLink="false">66d460f2d1ffc3d3eb89de58</guid>
                
                    <category>
                        <![CDATA[ automation ]]>
                    </category>
                
                    <category>
                        <![CDATA[ configuration ]]>
                    </category>
                
                    <category>
                        <![CDATA[ configuring settings ]]>
                    </category>
                
                    <category>
                        <![CDATA[ editor ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Seth Falco ]]>
                </dc:creator>
                <pubDate>Wed, 21 Jul 2021 21:28:55 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/07/untitled.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>You use <a target="_blank" href="https://editorconfig.org/">EditorConfig</a> to define formatting conventions for textual files in a project. It's great because it's widely supported, and it's not tied to any particular language, framework, or code editor.</p>
<p>EditorConfig on its own is just a vendor-agnostic configuration file. It relies on third-party tools or integrations to implement support for the rules declared in the file.</p>
<p>They can be read by IDEs (Integrated Development Environments), code editors, or build tools to enforce or apply formatting conventions.</p>
<h2 id="heading-what-does-editorconfig-solve">What Does EditorConfig Solve?</h2>
<p>Users usually configure the code style settings in an editor to <em>their</em> preferences. Unfortunately, their preferences probably don't correlate with yours.</p>
<p>What happens when they're contributing to a shared project? This might be a project at work, or an open-source project on GitLab or GitHub.</p>
<p>The user's style settings get applied to the files they modify. This can result in projects feeling inconsistent or messy, with some or all of the following issues:</p>
<ul>
<li><p>Mixed use of tabs and spaces.</p>
</li>
<li><p>Mixed use of line endings. (Usually not a significant issue with <a target="_blank" href="https://git-scm.com/">Git</a>.)</p>
</li>
<li><p>Files may not have the desired character encoding.</p>
</li>
<li><p>Various indentation sizes across files.</p>
</li>
</ul>
<p>Without consistency, the code can appear untidy and be a pain to read, depending on a user's development environment.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/07/3.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><a target="_blank" href="https://github.com/eclipse/eclipse.jdt.ls/blob/master/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/EventNotification.java?ts=8"><em>eclipse.jdt.ls</em></a> <em>mixes tabs and spaces, here's how it looks on GitHub with a tab size of 8.</em></p>
<p>A common solution is to share editor settings as part of the project, but this assumes all committers are using the same editor as you, which probably isn't the case.</p>
<p>For Java development alone, the following are all popular choices:</p>
<ul>
<li><p><a target="_blank" href="https://code.visualstudio.com/">Visual Studio Code</a> (What I use!)</p>
</li>
<li><p><a target="_blank" href="https://www.eclipse.org/">Eclipse</a></p>
</li>
<li><p><a target="_blank" href="https://www.jetbrains.com/idea/">IntelliJ</a></p>
</li>
<li><p><a target="_blank" href="https://netbeans.apache.org/">NetBeans</a></p>
</li>
</ul>
<p>You'll bloat your project with unrelated files if you add the configuration for every editor someone might use.</p>
<p>So, how about a vendor-agnostic solution where editors are responsible for utilizing a shared configuration instead?</p>
<h2 id="heading-how-editorconfig-helps">How EditorConfig Helps</h2>
<p>Defining conventions helps everyone throughout a project's life-cycle. There are namely three ways it saves time.</p>
<h3 id="heading-editorconfig-makes-code-more-readable">EditorConfig Makes Code More Readable</h3>
<p>Making code more readable is by far the most important reason to use it. This improves the maintainability of the project, and the speed that people can work.</p>
<blockquote>
<p>“Indeed, the ratio of time spent reading versus writing is well over 10 to 1. We are constantly reading old code as part of the effort to write new code… Therefore, making it easy to read makes it easier to write.”<br>― Robert C. Martin</p>
</blockquote>
<p>There are many other reasons someone might be reading the code outside of development too:</p>
<ul>
<li><p>Researchers that need to better understand how the project works.</p>
</li>
<li><p>Security analysts that are checking for vulnerabilities.</p>
</li>
<li><p>Technical writers that are documenting application behavior.</p>
</li>
</ul>
<p>People will be able to perform their role more effectively if your code is kept tidy, consistent, and human-readable.</p>
<h3 id="heading-editorconfig-makes-code-reviews-easier">EditorConfig Makes Code Reviews Easier</h3>
<p>As a project maintainer, you'll inevitably have to review code contributed by others. They might be a fellow team member, or open-source contributors that discover your project.</p>
<p>Enforcing formatting should be delegated to software. This will make reading and reviewing the code more efficient, and avoids the need to request changes based on formatting.</p>
<p>Reducing the feedback loop ultimately saves everyone time.</p>
<h3 id="heading-editorconfig-makes-development-easier">EditorConfig Makes Development Easier</h3>
<p>Developers can save a lot of headache by having conventions that are automatically applied by their editor.</p>
<p>Without it, they have to find a contribution guide, style guide, or check other code manually to learn project conventions.</p>
<p>Even when the conventions are known, they may conflict with a developer's settings. Then they'll have to code against the editor's automatic formatting, or frequently change settings between projects.</p>
<p>This is especially useful for developers that jump between projects a lot. For example, open-source contributors frequently write code for projects across organizations that follow different coding conventions.</p>
<h2 id="heading-how-editorconfig-works">How EditorConfig Works</h2>
<p>EditorConfig uses a simple <a target="_blank" href="https://en.wikipedia.org/wiki/INI_file">INI</a>-like file named <code>.editorconfig</code>. This file declares rules that will be translated to settings in your editor, or perform formatting over your workspace.</p>
<p>For example, in my editor I use 2-space indentations for XML files, but a project I contribute to might prefer 4-space indentations.</p>
<pre><code class="lang-plaintext">[*.xml]
indent_size = 4
</code></pre>
<p>When I open the project, my editor will see the <code>.editorconfig</code> file, and override the settings to suit the project's conventions.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/07/1.png" alt="Instance of Visual Studio Code. There is an XML file on the left side which uses spaces as defined in the EditorConfig, but my default indentation size of 2." width="600" height="400" loading="lazy"></p>
<p><em>Writing an XML file with my default editor settings. I use spaces for indentation with a size of 2.</em></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/07/2-1.png" alt="Instance of Visual Studio Code. The EditorConfig configuration includes an XML section that sets the indentation style to tab and size to 4. The XML file on the left is reformmated to reflect this change." width="600" height="400" loading="lazy"></p>
<p><em>Automatically reformatting the file after overriding the XML formatting settings.</em></p>
<h2 id="heading-how-to-use-editorconfig">How to Use EditorConfig</h2>
<p>Depending on your editor of choice, it may have native support for EditorConfig already. There is a list of "<a target="_blank" href="https://editorconfig.org/#pre-installed">No Plugin Necessary</a>" editors on the website, which includes JetBrains IDEs and Visual Studio.</p>
<p>If your editor doesn't have native support, you'll likely be able to add it with a plugin. Editors like Visual Studio Code and Eclipse support it this way, which can also be found on the EditorConfig website under "<a target="_blank" href="https://editorconfig.org/#download">Download a Plugin</a>".</p>
<p>Once installed, your editor should automatically find the EditorConfig file in your project if it exists, and start applying the rules.</p>
<h2 id="heading-how-to-define-rules-in-editorconfig">How to Define Rules in EditorConfig</h2>
<p>You can find a list of rules on the <a target="_blank" href="https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties">EditorConfig Wiki</a>. It contains all officially supported rules, as well as proposals for domain-specific rules that may be supported by certain implementations.</p>
<p>Not all implementations support every rule. This is especially true for domain-specific rules like <code>curly_bracket_next_line</code>. It can still be worth declaring these properties anyway for users that can utilize it, or to at least document the preference.</p>
<p>You must set <code>root</code> to <code>true</code> for the top level EditorConfig in the project, which is normally in the root of your project directory.</p>
<p>Additional EditorConfig files can be defined in nested directories, but shouldn't set <code>root</code> to <code>true</code>.</p>
<p>Then you can define a header that selects files, with rules for what to apply to matching files.</p>
<pre><code class="lang-plaintext"># Declares that this is the top-level configuration
root = true

# Applies to all files
[*]
indent_style = space
indent_size = 2

# Applies to all Markdown files
[*.md]
trim_trailing_whitespace = false

# Applies to all C# and Java files, overriding rules declared before
[*.{cs,java}]
indent_size = 4
</code></pre>
<p>There are no standard conventions for how to write an <code>.editorconfig</code> file, but there are two notable approaches you can take.</p>
<h3 id="heading-define-rules-per-project">Define Rules Per Project</h3>
<p>Just add to it as you need to. This means just defining rules, or appending file formats as your project grows.</p>
<p>You can start by generating the file with your editor, or just create a file named <code>.editorconfig</code> manually. You can copy-and-paste the <a target="_blank" href="https://editorconfig.org/#example-file">example</a> from the official website.</p>
<h3 id="heading-define-rules-for-all-projects">Define Rules for All Projects</h3>
<p>Alternatively, you can put together all of your preferences and plan the ideal configuration for all files you might interact with.</p>
<p>You can work from scratch, or start with mine and make the necessary adjustments.</p>
<pre><code class="lang-plaintext">root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
curly_bracket_next_line = false
spaces_around_operators = true

[*.bat]
end_of_line = crlf

[*.cs]
curly_bracket_next_line = true

[*.{cpp,cs,gradle,java,kt,py,rs}]
indent_size = 4

[*.{js,ts}]
quote_type = single

[*.md]
trim_trailing_whitespace = false

[*.tsv]
indent_style = tab
</code></pre>
<h2 id="heading-editorconfig-rule-recommendations">EditorConfig Rule Recommendations</h2>
<p>These are rules I'd objectively recommend declaring, if your project contains the respective file format. It'll help you avoid tedious issues that can occur due to a user's development environment.</p>
<h3 id="heading-batch">Batch</h3>
<p>Line endings need to have a textual representation when stored. This is usually something you wouldn't see or have to worry about.</p>
<p>However, different systems use different characters to represent the end of a line. (<a target="_blank" href="https://en.wikipedia.org/wiki/Newline#Representation">More Info</a>)</p>
<ul>
<li><p>Unix systems use a line feed. (<code>lf</code> or <code>\n</code>)</p>
</li>
<li><p>Windows uses a carriage return and line feed. (<code>crlf</code> or <code>\r\n</code>)</p>
</li>
</ul>
<p><a target="_blank" href="https://en.wikipedia.org/wiki/Batch_file">Batch</a> files can have unexpected behavior if they end with Unix line endings. You can avoid this by setting <code>end_of_line</code> to <code>crlf</code> to ensure they have Windows line endings instead. (<a target="_blank" href="https://serverfault.com/questions/429594/is-it-safe-to-write-batch-files-with-unix-line-endings">More Info</a>)</p>
<pre><code class="lang-plaintext">[*.bat]
end_of_line = crlf
</code></pre>
<h3 id="heading-markdown">Markdown</h3>
<p>In <a target="_blank" href="https://en.wikipedia.org/wiki/Markdown">Markdown</a>, you can write a line break in the current paragraph by adding 2 spaces at the end of a line. (<a target="_blank" href="https://en.wikipedia.org/wiki/Markdown#Example">More Info</a>)</p>
<p>You'll want to set <code>trim_trailing_whitespace</code> to <code>false</code> to avoid having your editor remove those spaces when you save.</p>
<pre><code class="lang-plaintext">[*.md]
trim_trailing_whitespace = false
</code></pre>
<h3 id="heading-tab-separated-values">Tab Separated Values</h3>
<p><a target="_blank" href="https://en.wikipedia.org/wiki/Tab-separated_values">TSV</a> (Tab Separated Values) files are very similar to <a target="_blank" href="https://en.wikipedia.org/wiki/Comma-separated_values">CSV</a> (Comma Separated Values), but use tabs instead of commas as the column delimiter.</p>
<p>It's very common for developers to have tabs automatically convert to spaces. You should set <code>indent_style</code> to <code>tab</code> to avoid the delimiter from being replaced, otherwise your entire table might become a single column.</p>
<pre><code class="lang-plaintext">[*.tsv]
indent_style = tab
</code></pre>
<h2 id="heading-conclusion">Conclusion</h2>
<p>If you're a maintainer, either working in a collaborative environment or in open-source, I strongly recommend adding an <code>.editorconfig</code> file defining the project's conventions to the root of your repository.</p>
<p>Maintainers can then spend more time reviewing clean pull requests that adhere to the style guide, as the editor will automatically start enforcing or applying the conventions.</p>
<p>Committers get a better experience, as the project will override their workspace settings. This reduces the need to reformat code or work against preconfigured editor settings.</p>
<p>And projects will be cleaner, as the conventions will be in a single vendor-agnostic file, rather than editor-specific files that only certain contributors can use anyway.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Use Multiple Git Configs on One Computer ]]>
                </title>
                <description>
                    <![CDATA[ By Dhruv Barochiya You might have a hard time managing many cats, but when it comes to Git profiles there is something you can do. Let's get straight to the solution – The answer lies in the .gitconfig file. This is starter point for Git to identify ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-handle-multiple-git-configurations-in-one-machine/</link>
                <guid isPermaLink="false">66d45e3d73634435aafcef6e</guid>
                
                    <category>
                        <![CDATA[ configuration ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                    <category>
                        <![CDATA[ GitHub ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 13 Jan 2021 01:15:27 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/01/cover-1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Dhruv Barochiya</p>
<p>You might have a hard time managing many cats, but when it comes to Git profiles there is something you can do.</p>
<p>Let's get straight to the solution – The answer lies in the <code>.gitconfig</code> file. This is starter point for Git to identify what configurations need to be used. </p>
<p>The idea is to segregate the repos on your machine into multiple directories by separating the profiles you want, and then define a <code>.gitconfig</code> file per profile.</p>
<h2 id="heading-step-1-create-separate-directories-for-repos">Step 1 → create separate directories for repos</h2>
<p>Organize the projects that you are working on into separate folders by the profiles you want to work with.</p>
<p>For example let's say there are two Git profiles you are working with. This is a common use case for most of us:</p>
<ul>
<li><code>WORK</code> → for work related projects</li>
<li><code>PERSONAL</code> → for open source and side projects</li>
</ul>
<h2 id="heading-step-2-create-a-global-git-configuration">Step 2 → create a global Git configuration</h2>
<p>Create the global <code>.gitconfig</code> file in your home directory if it doesn't already exist. Then add all the profile directories as an entry like in the example below.</p>
<p>The way this works is very intuitive – if the directory path where you created the Git directory matches one of the paths in <code>includeIF</code>, then Git uses that particular profile configuration file. Otherwise, it uses the default configuration.</p>
<pre><code>[includeIf <span class="hljs-string">"gitdir:~/personal/"</span>]
  path = ~/.gitconfig-personal
[includeIf <span class="hljs-string">"gitdir:~/work/"</span>]
  path = ~/.gitconfig-work
</code></pre><h2 id="heading-step-3-create-individual-git-configurations-for-profiles">Step 3 → create individual Git configurations for profiles</h2>
<p>If you haven't noticed by now, we just mentioned the <code>.gitconfig-personal</code> and  <code>.gitconfig-work</code> files in the global <code>.gitconfig</code> file, but we didn't create them yet. These individual files can contain all the customization that you need, from user name and email to commit hooks.</p>
<pre><code class="lang-bash">[user]
 name = work_user
 email = work_email
</code></pre>
<pre><code class="lang-bash">[user]
 name = personal_user
 email = personal_email
</code></pre>
<h2 id="heading-lets-verify">Let's verify</h2>
<p>We're all set!  Now you will have three Git files in your home directory.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/Screenshot-2021-01-03-at-3.36.24-PM.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Now we will create and initiate a new Git repo in the work and personal directories and check the configurations.</p>
<pre><code class="lang-bash">$ <span class="hljs-built_in">cd</span> ~/work
$ mkdir work-test-repo
$ <span class="hljs-built_in">cd</span> work-test-repo
$ git init
        *Initialized empty Git repository <span class="hljs-keyword">in</span> /Users/dbarochiya/work/work-test-repo/.git/*
$ git config -l   
        *credential.helper=osxkeychain
        includeif.gitdir:~/personal/.path=~/.gitconfig-personal
        includeif.gitdir:~/work/.path=~/.gitconfig-work
        **user.name=working_me
        user.email = work@work.com**
        core.repositoryformatversion=0
        core.filemode=<span class="hljs-literal">true</span>
        core.bare=<span class="hljs-literal">false</span>
        core.logallrefupdates=<span class="hljs-literal">true</span>
        core.ignorecase=<span class="hljs-literal">true</span>
        core.precomposeunicode=<span class="hljs-literal">true</span>*                                                                                                                   1
</code></pre>
<pre><code class="lang-bash">$ <span class="hljs-built_in">cd</span> ~/personal
$ mkdir personal-test-repo
$ git init
    *Initialized empty Git repository <span class="hljs-keyword">in</span> /Users/dbarochiya/personal/.git/*
$ git config -l
    *credential.helper=osxkeychain
    includeif.gitdir:~/personal/.path=~/.gitconfig-personal
    **user.name=me_personal
    user.email=personal@personal.com**
    includeif.gitdir:~/work/.path=~/.gitconfig-work
    core.repositoryformatversion=0
    core.filemode=<span class="hljs-literal">true</span>
    core.bare=<span class="hljs-literal">false</span>
    core.logallrefupdates=<span class="hljs-literal">true</span>
    core.ignorecase=<span class="hljs-literal">true</span>
    core.precomposeunicode=<span class="hljs-literal">true</span>*
</code></pre>
<p>Voilà – as you can see, the email and user name are different in both cases. Depending on the path of the Git repo, it is able to use the custom <code>.gitconfig</code> files.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Connect Amazon EC2 Using Microsoft Remote Desktop in macOS ]]>
                </title>
                <description>
                    <![CDATA[ By Clark Jason Ngo I created this guide because of an experience I had while teaching. My students needed to use an application that was only available on Windows OS but the students only had macOS. We will be touching on the technologies shown below... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/ec2-with-microsoft-remote-desktop/</link>
                <guid isPermaLink="false">66d45e24230dff01669057dd</guid>
                
                    <category>
                        <![CDATA[ configuration ]]>
                    </category>
                
                    <category>
                        <![CDATA[ ec2 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ macOS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ rdp ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Thu, 09 Apr 2020 01:22:54 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/04/rdp.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Clark Jason Ngo</p>
<p>I created this guide because of an experience I had while teaching. My students needed to use an application that was only available on Windows OS but the students only had macOS.</p>
<p>We will be touching on the technologies shown below:  </p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-56.png" alt="Image" width="600" height="400" loading="lazy"></p>
<ul>
<li>Amazon EC2: launch a Windows Server 2019</li>
<li>Microsoft Remote Desktop: macOS application to remote desktop connect (RDP) to EC2</li>
</ul>
<h2 id="heading-amazon-ec2">Amazon EC2</h2>
<h3 id="heading-launching-a-windows-server-ec2-instance">Launching a Windows Server EC2 Instance</h3>
<ol>
<li>Sign in to your <a target="_blank" href="https://aws.amazon.com/console/">AWS Management Console</a>.</li>
<li>Choose <strong>Services</strong>, then <strong>EC2</strong>.</li>
<li>In the sidebar, click <strong>Instances</strong>.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-57.png" alt="Image" width="600" height="400" loading="lazy">
<em>EC2 sidebar</em></p>
<ol start="4">
<li>Click <strong>Launch Instance</strong>.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-58.png" alt="Image" width="600" height="400" loading="lazy">
<em>Launch Instance button</em></p>
<ol start="5">
<li>Scroll down and choose <strong>Microsoft Windows Server 2019 Base</strong>.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-59.png" alt="Image" width="600" height="400" loading="lazy">
<em>Choose AMI page</em></p>
<ol start="6">
<li>At the bottom of the Choose Instance Type page, click <strong>Review and Launch</strong>. This will skip you to the Review page.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-60.png" alt="Image" width="600" height="400" loading="lazy">
<em>Launch with minimal configuration</em></p>
<ol start="7">
<li>In the Review page, click <strong>Launch</strong>. You'll be prompted to select an existing key pair or new key pair. </li>
</ol>
<p>If you choose <strong>Create a new key pair</strong>, you need to give the new key pair a name, then download the key pair.  Then you'll be able to proceed to choose <strong>Launch Instance</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-61.png" alt="Image" width="600" height="400" loading="lazy">
<em>Key pair to access the instance</em></p>
<p>If you choose <strong>Choose an existing key pair</strong>, you need to select a key pair and tick the checkbox to acknowledge the use of the key pair.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-62.png" alt="Image" width="600" height="400" loading="lazy">
<em>Last step to launch instance</em></p>
<ol start="8">
<li>Click the generated Instance ID.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-63.png" alt="Image" width="600" height="400" loading="lazy">
<em>Accessing the EC2 Instance</em></p>
<ol start="9">
<li><p>Find and save the following information:</p>
</li>
<li><p>Public DNS (IP Address)</p>
</li>
<li>Username</li>
<li>Password</li>
</ol>
<p>To get the IP Address, scroll to the right of your EC2 instance:  </p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-70.png" alt="Image" width="600" height="400" loading="lazy">
<em>IP Address of EC2 Instance</em></p>
<p>You can also find this in the Description tab below:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-67.png" alt="Image" width="600" height="400" loading="lazy">
<em>IP Address of EC2 Instance</em></p>
<ol start="10">
<li>To get the username and password, choose the EC2 instance (tick the checkbox), click <strong>Actions</strong>, then <strong>Get Windows Password</strong>.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-68.png" alt="Image" width="600" height="400" loading="lazy">
<em>Obtaining the username and password</em></p>
<p>You may encounter <em>Password not available</em> and you'll need to wait a couple of minutes.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-71.png" alt="Image" width="600" height="400" loading="lazy">
<em>Provisioning the auto-generated password</em></p>
<ol start="11">
<li>Locate the existing key pair or the newly created key pair you have downloaded in your local machine. Click <strong>Choose File</strong>.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-72.png" alt="Image" width="600" height="400" loading="lazy">
<em>Retrieve the key pair</em></p>
<ol start="12">
<li>After uploading the key pair, click <strong>Decrypt Password</strong>.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-73.png" alt="Image" width="600" height="400" loading="lazy"></p>
<ol start="13">
<li>Copy the following information and save it in a file or clipboard. Click <strong>Close</strong> when you are done.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-74.png" alt="Image" width="600" height="400" loading="lazy">
<em>Information for remote desktop connection</em></p>
<h2 id="heading-microsoft-remote-desktop">Microsoft Remote Desktop</h2>
<h3 id="heading-installing-the-application-and-connecting-to-ec2-instance">Installing the application and connecting to EC2 instance</h3>
<ol>
<li>Open your App Store, then search for <strong>Microsoft Remote Desktop</strong>. Click Install (it shows UPDATE here as I already have installed).</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-64.png" alt="Image" width="600" height="400" loading="lazy">
<em>Microsoft Remote Desktop in the App Store</em></p>
<ol start="2">
<li><p>After installation, Open Microsoft Remote Desktop.</p>
</li>
<li><p>At the top, click the <strong>+</strong> Icon and choose <strong>Desktop</strong>.</p>
</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-65.png" alt="Image" width="600" height="400" loading="lazy">
<em>Creating a new desktop connection</em></p>
<ol start="4">
<li>In the PC name, copy the EC2 Instance IP address, then click <strong>Add</strong>.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-66.png" alt="Image" width="600" height="400" loading="lazy">
<em>Adding the IP address</em></p>
<ol start="5">
<li>Copy the Administrator and Password from earlier and paste it here. Hit <strong>Continue</strong>.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-75.png" alt="Image" width="600" height="400" loading="lazy">
<em>Signing in with the username and password</em></p>
<p>You are now connected to your Windows Server EC2 Instance.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-76.png" alt="Image" width="600" height="400" loading="lazy">
<em>Windows Server EC2 Instance</em></p>
<p>Note: To avoid getting charged after you have used up the free tier for EC2, either click <strong>Stop</strong> to have a lower cost, or <strong>Terminate</strong> to remove the instance and not be charged. </p>
<p>You have access to this by selecting the instance and choosing <strong>Actions &gt; Instance State &gt; Stop/Terminate</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/04/image-77.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-heres-a-video-tutorial">Here's a video tutorial:</h2>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/QQIivlr_CKk" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<p>Connect with me on LinkedIn <a target="_blank" href="https://www.linkedin.com/in/clarkngo/">here</a>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/03/image-243.png" alt="Image" width="600" height="400" loading="lazy"></p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
