<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Eduardo Garcia</title>
    <description>The latest articles on DEV Community by Eduardo Garcia (@alexantartico).</description>
    <link>https://dev.to/alexantartico</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F577748%2F04d953f5-4724-44ab-9f06-eaf0e7ec96d6.jpg</url>
      <title>DEV Community: Eduardo Garcia</title>
      <link>https://dev.to/alexantartico</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexantartico"/>
    <language>en</language>
    <item>
      <title>Supporting SQL ops - Please Don't Be a Bottleneck</title>
      <dc:creator>Eduardo Garcia</dc:creator>
      <pubDate>Wed, 06 Aug 2025 11:15:58 +0000</pubDate>
      <link>https://dev.to/alexantartico/supporting-sql-ops-please-dont-be-a-bottleneck-akb</link>
      <guid>https://dev.to/alexantartico/supporting-sql-ops-please-dont-be-a-bottleneck-akb</guid>
      <description>&lt;p&gt;Let's get this straight: In a prod environment you &lt;strong&gt;should&lt;/strong&gt; be having DQL access to the DB's of the applications you support. Any other command belonging to DML, DDL etc are usually reserved to either DBA teams or you will need to go through your organization's formal deployment process. Do not cowboy the system, no exceptions.&lt;/p&gt;

&lt;p&gt;From a resiliency point of view, the absolute bare minimum is to run two database instances on separate hosts. These are usually named prod and a prod-replication (or prod-replica/prod-repl). These instancess MUST live on entirely different infrastructure, be it different physical hosts  or even better, different availability zones. If your primary replication is in the same rack or worse: on the same physical host (I have seen this happened (╯°□°)╯), you have not built resilient infrastructure, you created a single point of failure and a post-mortem document that will be very difficult and akward to explain after that outage that will render your db unusable.&lt;/p&gt;

&lt;p&gt;The two-instance set-up is not only to switch to the healthy server during an outage. It also helps to solve an operational need: providing your support teams with read-only access to the data of the applications they manage. By offloading all those SELECT queries to replication, you provide your teams the visibility they need to do their jobs without consuming resources from the production DB. &lt;/p&gt;

&lt;p&gt;Not only you will address the issue of ensuring availability and disaster recovery to your prod operation but will also address an overlooked but, necessary operational need: providing your operations team with DQL access to the data of the applications they support. &lt;/p&gt;

&lt;p&gt;Making your operations team to file a ticket and wait for approval just to run a SELECT query is an auto sabotage that will cripple the sla to reply to business requests and slow down incident response. I can honestly just think of two reasons to do this, a dysfunctional IT culture or a  lack of trust in the people running the systems.&lt;/p&gt;

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

&lt;p&gt;"But what can I do if a table contains PII or sensitive data" I hear you ask. If a table contains data falling under GDPR or HIPAA regulations, the answer will never be to lock the door and throw away the key, but implementing modern security controls like &lt;strong&gt;data masking, column level security and/or granular roles&lt;/strong&gt; to strike a balance between providing access to your ops teams and being compliant with security policies. Is not 2005 anymore, we have better tools, better practices. Lets keep discipline in operations and implement them.&lt;/p&gt;

&lt;p&gt;This is an extract of a sort of practical crash course in SQL that I am working on. You can access it here:  &lt;a href="https://github.com/AlexAntartico/sql-crash-course/edit/main/README.md" rel="noopener noreferrer"&gt;sql-crash-course&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy coding,&lt;br&gt;
Eduardo.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to upload Markdown files to Dev.to from GitHub</title>
      <dc:creator>Eduardo Garcia</dc:creator>
      <pubDate>Wed, 15 Jan 2025 11:32:44 +0000</pubDate>
      <link>https://dev.to/alexantartico/how-to-upload-markdown-files-to-devto-from-github-598f</link>
      <guid>https://dev.to/alexantartico/how-to-upload-markdown-files-to-devto-from-github-598f</guid>
      <description>&lt;p&gt;How to upload Markdown files to Dev.to from GitHub&lt;/p&gt;

&lt;p&gt;This is a test post to show how to upload Markdown files to Dev.to.&lt;/p&gt;

&lt;p&gt;You can do this with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub actions&lt;/li&gt;
&lt;li&gt;Dev.to API Token&lt;/li&gt;
&lt;li&gt;A custom GitHub action&lt;/li&gt;
&lt;li&gt;A Python script&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am assuming you have a general knowledge with GitHub actions and Python scripting, but you can achieve this with a superficial knowledge. To know more about it, you can check the &lt;a href="https://docs.github.com/en/actions" rel="noopener noreferrer"&gt;GitHub documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub action to upload Markdown file
&lt;/h2&gt;

&lt;p&gt;You can use GitHub actions to automate the process of uploading Markdown files to Dev.to. Using this action will make your life easier as every time you push a new commit to your repository, the markdown document will be pushed as well. There are already several actions available that can help you with this task or you can create your own action, but why reinvent the wheel?&lt;/p&gt;

&lt;p&gt;I did some quick research and initially decided to use this &lt;a href="https://github.com/marketplace/actions/publish-to-dev-to" rel="noopener noreferrer"&gt;Publish to dev.to&lt;/a&gt; GitHub action. It's simple to use and gets the job done. Or so I thought, after 2 failed repositories and a bunch of attempts I falled back to the conventional curl POST method. To be fair, is probably due to my lack of knowledge in GitHub actions, but I will try to use it again in the future.&lt;/p&gt;

&lt;p&gt;First, fetch your DEV.TO API key. For this, log in to your DEV.TO account and go to settings/extensions, scroll all the way to the bottom and in you will see a section Named "DEV Community API Keys". Name your project and click on "Generate API Key". Copy this key and save it in your GitHub repository secrets.&lt;/p&gt;

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

&lt;p&gt;To save the key as a secret. go to your repository settings, click on secrets, and add a new secret with the name &lt;code&gt;DEVTO_TOKEN&lt;/code&gt; and paste the key you copied from DEV.TO. Ensure you have saved at repository level.&lt;/p&gt;

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

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

&lt;p&gt;In your repository, create a new file called &lt;code&gt;.github/workflows/devto_publish.yml&lt;/code&gt; and add the following code that you can &lt;a href="https://github.com/AlexAntartico/devto-publish-test/blob/main/.github/workflows/devto_publish.yml" rel="noopener noreferrer"&gt;find here.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Publish to Dev.to&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;posts/**'&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;publish&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout repository&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set up Python&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-python@v4&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;python-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.11'&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upgrade pip and Install dependencies&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;python -m pip install --upgrade pip&lt;/span&gt;
        &lt;span class="s"&gt;pip install pyyaml requests&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify API Key Availability&lt;/span&gt;
      &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;DEVTO_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.DEVTO_API_KEY }}&lt;/span&gt;  &lt;span class="c1"&gt;# Keep existing secret mapping&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;echo "API key character count: ${#DEVTO_API_KEY}"&lt;/span&gt;
        &lt;span class="s"&gt;echo "API key empty check: $([ -z "$DEVTO_API_KEY" ] &amp;amp;&amp;amp; echo 'Empty' || echo 'Set')"&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Convert md to Dev.to format&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;python publish_script.py ./posts/main.md &amp;gt; formatted_article.json&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Publish or Update to Dev.to&lt;/span&gt;
      &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;DEVTO_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.DEVTO_API_KEY }}&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;action=$(jq -r '.action' formatted_article.json)&lt;/span&gt;
        &lt;span class="s"&gt;article=$(jq -r '.article' formatted_article.json)&lt;/span&gt;

        &lt;span class="s"&gt;if [ "$action" = "create" ]; then&lt;/span&gt;
          &lt;span class="s"&gt;response=$(curl -X POST "https://dev.to/api/articles" \&lt;/span&gt;
            &lt;span class="s"&gt;-H "api-key: $DEVTO_API_KEY" \&lt;/span&gt;
            &lt;span class="s"&gt;-H "Content-Type: application/json" \&lt;/span&gt;
            &lt;span class="s"&gt;-d "$article" -w "\n%{http_code}")&lt;/span&gt;
        &lt;span class="s"&gt;elif [ "$action" = "update" ]; then&lt;/span&gt;
          &lt;span class="s"&gt;article_id=$(echo $article | jq -r '.id')&lt;/span&gt;
          &lt;span class="s"&gt;response=$(curl -X PUT "https://dev.to/api/articles/$article_id" \&lt;/span&gt;
            &lt;span class="s"&gt;-H "api-key: $DEVTO_API_KEY" \&lt;/span&gt;
            &lt;span class="s"&gt;-H "Content-Type: application/json" \&lt;/span&gt;
            &lt;span class="s"&gt;-d "$article" -w "\n%{http_code}")&lt;/span&gt;
        &lt;span class="s"&gt;else&lt;/span&gt;
          &lt;span class="s"&gt;echo "Invalid action: $action"&lt;/span&gt;
          &lt;span class="s"&gt;exit 1&lt;/span&gt;
        &lt;span class="s"&gt;fi&lt;/span&gt;

        &lt;span class="s"&gt;status_code=$(echo "$response" | tail -n1)&lt;/span&gt;
        &lt;span class="s"&gt;if [ "$status_code" -ne 200 ] &amp;amp;&amp;amp; [ "$status_code" -ne 201 ]; then&lt;/span&gt;
          &lt;span class="s"&gt;echo "Failed to update article. Status code: $status_code"&lt;/span&gt;
          &lt;span class="s"&gt;exit 1&lt;/span&gt;
        &lt;span class="s"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Brief explanation of GitHub action
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Triggers when there's a push to the main branch that modifies files in the &lt;code&gt;posts/ directory&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Sets up the environment:

&lt;ul&gt;
&lt;li&gt;Runs on &lt;code&gt;ubuntu-latest&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Checks out the repository&lt;/li&gt;
&lt;li&gt;Configures Python &lt;code&gt;3.11&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Installs required dependencies &lt;code&gt;pyyaml&lt;/code&gt; and &lt;code&gt;requests&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Performs API key validation by checking its presence and length&lt;/li&gt;
&lt;li&gt;Executes the publishing process:

&lt;ul&gt;
&lt;li&gt;Converts markdown files to Dev.to format using a Python script&lt;/li&gt;
&lt;li&gt;Generates a formatted JSON article output&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Handles article publication:

&lt;ul&gt;
&lt;li&gt;Determines whether to create new or update existing article&lt;/li&gt;
&lt;li&gt;Makes appropriate API calls to Dev.to - &lt;code&gt;POST&lt;/code&gt; for new, &lt;code&gt;PUT&lt;/code&gt; for updates)&lt;/li&gt;
&lt;li&gt;Includes proper headers and authentication using DEVTO_API_KEY&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Includes error handling:

&lt;ul&gt;
&lt;li&gt;Validates HTTP response codes&lt;/li&gt;
&lt;li&gt;Exits with failure if status code isn't &lt;code&gt;200&lt;/code&gt; or &lt;code&gt;201&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Provides detailed error output for troubleshooting1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The python script
&lt;/h2&gt;

&lt;p&gt;This Python script handles the conversion and publishing of markdown files to Dev.to. Here's a breakdown of its main components. The script's main purpose is to convert markdown files to Dev.to API format and verify existing articles1&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;extract_front_matter Function&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Takes a markdown file path as input and returns:

&lt;ul&gt;
&lt;li&gt;A dictionary containing parsed YAML front matter data&lt;/li&gt;
&lt;li&gt;The markdown body content without the front matter1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Handles errors for:

&lt;ul&gt;
&lt;li&gt;Missing files&lt;/li&gt;
&lt;li&gt;Invalid YAML parsing1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;md_to_devto Function&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Accepts:

&lt;ul&gt;
&lt;li&gt;Markdown file path&lt;/li&gt;
&lt;li&gt;Dev.to API key&lt;/li&gt;
&lt;li&gt;Returns:&lt;/li&gt;
&lt;li&gt;JSON string of the article&lt;/li&gt;
&lt;li&gt;Action string ('create' or 'update')1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Key operations:

&lt;ul&gt;
&lt;li&gt;Extracts front matter and body&lt;/li&gt;
&lt;li&gt;Validates required fields (title, tags)&lt;/li&gt;
&lt;li&gt;Checks for existing articles&lt;/li&gt;
&lt;li&gt;Prepares article JSON with title, published status, content, and tags1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;fetch_existing_articles Function&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Takes API key as input

&lt;ul&gt;
&lt;li&gt;Returns list of existing articles from Dev.to&lt;/li&gt;
&lt;li&gt;Raises HTTP errors for failed requests1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Main Execution

&lt;ul&gt;
&lt;li&gt;Validates:&lt;/li&gt;
&lt;li&gt;Command line arguments&lt;/li&gt;
&lt;li&gt;API key presence
Outputs:&lt;/li&gt;
&lt;li&gt;Formatted JSON result with article data and action&lt;/li&gt;
&lt;li&gt;Error messages to stderr on failure&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;The script and GitHub action provided in this article can help you automate the process of uploading markdown files to Dev.to. However, needs to be modified to incorporate more of the error handling in Pyton and create a more robust and maintainable solution. I hope this article helps you in your journey to automate your workflow and make your life easier.&lt;/p&gt;

&lt;p&gt;I will create an updated version of this scripts with a new article in the future, so stay tuned for that.&lt;/p&gt;

&lt;p&gt;Cheers and happy, happy coding!&lt;/p&gt;

&lt;p&gt;Eduardo Mendoza&lt;/p&gt;

</description>
      <category>github</category>
      <category>actions</category>
      <category>devto</category>
      <category>automation</category>
    </item>
    <item>
      <title>After installing Fedora 41: A Glorious Adventure Awaits!</title>
      <dc:creator>Eduardo Garcia</dc:creator>
      <pubDate>Thu, 26 Dec 2024 09:47:21 +0000</pubDate>
      <link>https://dev.to/alexantartico/after-installing-fedora-41-a-glorious-adventure-awaits-3anc</link>
      <guid>https://dev.to/alexantartico/after-installing-fedora-41-a-glorious-adventure-awaits-3anc</guid>
      <description>&lt;p&gt;After installing Fedora 41: A Glorious Adventure Awaits!&lt;/p&gt;

&lt;p&gt;Welcome, brave linux enthusiasts, to the land of Fedora 41! You've just embarked on a journey where your terminal is your sword, and your bash commands are your spellbook. Here's how to make your new digital home not just functional but confortable as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update system
&lt;/h2&gt;

&lt;p&gt;First things first, let's ensure your Fedora fortress is up to date. Run these commands to banish the outdated demons:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="c"&gt;# sudo dnf update -y&lt;/span&gt;
&lt;span class="c"&gt;# upgrade is now the preffered command, it has backwards compatibility&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because nothing says "I installed a new Linux" like a good old system update.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure DNF simultaneous mirrors
&lt;/h2&gt;

&lt;p&gt;Cast a speed spell to your dnf sources by enabling max downlows parameter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;vi /etc/dnf/dnf.conf

&lt;span class="c"&gt;# then add and wq&lt;/span&gt;
add &lt;span class="nv"&gt;max_parallel_downloads&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, your downloads will race through the internet like Usain Bolt on a caffeine rush... or me when someone mentions 'production outage'.&lt;/p&gt;

&lt;h2&gt;
  
  
  dnf Plugins
&lt;/h2&gt;

&lt;p&gt;DNF plugins are like magical accessories for your package manager. They add extra features to the dnf package manager and provide some essential plugins. Here is how to arm yourself with them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;dnf-plugins-core &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;builddep:&lt;/strong&gt; This plugin allows you to automatically install the build dependencies for a package. This is useful if you want to compile software from source code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;changelog:&lt;/strong&gt; This plugin lets you view the changelog for a package, showing the changes made in each version. Who doesn't love a transaction log?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;config-manager:&lt;/strong&gt; This plugin helps you manage DNF configuration options and repositories.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;copr:&lt;/strong&gt; This plugin enables you to install packages from COPR, a community-driven repository for Fedora packages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;debug:&lt;/strong&gt; This plugin installs debugging information for packages, which can be useful for developers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;debuginfo-install:&lt;/strong&gt; This plugin installs debuginfo packages, which contain debugging symbols for programs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;download:&lt;/strong&gt; This plugin allows you to download RPM packages without installing them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;needs-restarting:&lt;/strong&gt; This plugin checks for and reports on processes that need to be restarted after package updates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;versionlock:&lt;/strong&gt; This plugin allows you to lock specific packages to a particular version, preventing them from being updated.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install SW
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Proton Fedora VPN
&lt;/h3&gt;

&lt;p&gt;Feeling the need for privacy? Here’s how to cloak yourself with ProtonVPN or follow the guide: &lt;a href="https://protonvpn.com/support/official-linux-vpn-fedora/" rel="noopener noreferrer"&gt;https://protonvpn.com/support/official-linux-vpn-fedora/&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
wget &lt;span class="s2"&gt;"https://repo.protonvpn.com/fedora-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/fedora-release | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; 3&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;-stable/protonvpn-stable-release/protonvpn-stable-release-1.0.2-1.noarch.rpm"&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install&lt;/span&gt; ./protonvpn-stable-release-1.0.2-1.noarch.rpm

&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf check-update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;dnf upgrade

&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--refresh&lt;/span&gt; proton-vpn-gnome-desktop

&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf check-update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;dnf upgrade

&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;libappindicator-gtk3 gnome-shell-extension-appindicator gnome-extensions-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't forgent to restart and enable AppIndicator and KStatusNotifierItem Support extension for that sweet, sweet VPN icon.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install IVPN
&lt;/h3&gt;

&lt;p&gt;If ProtonVPN feels too mainstream, or you're just looking for a faster alternative, IVPN might be your speed demon.&lt;/p&gt;

&lt;p&gt;Its pretty much anonymous, pay with crypto if you're feeling cyberpunk.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# [Fedora 41+] Add the IVPN repository&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf config-manager addrepo &lt;span class="nt"&gt;--from-repofile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://repo.ivpn.net/stable/fedora/generic/ivpn.repo

&lt;span class="c"&gt;# To install IVPN software (CLI and UI)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;ivpn-ui

&lt;span class="c"&gt;# To install only IVPN CLI&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;ivpn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is for Fedora 41, for below versions go here: &lt;a href="https://www.ivpn.net/en/apps-linux/#fedora" rel="noopener noreferrer"&gt;https://www.ivpn.net/en/apps-linux/#fedora&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Install all of this cool stuff
&lt;/h3&gt;

&lt;p&gt;Recommended by yours truly (づ ◕‿◕ )づ, assuming you've already embraced the magic of rpmfusion-nonfree:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf5 &lt;span class="nb"&gt;install &lt;/span&gt;fastfetch mpv unrar p7zip p7zip-plugins htop android-tools vlc discord dejavu-sans-mono-fonts fira-code-fonts kdenlive easyeffects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Some Devtools for Your Spellbook
&lt;/h3&gt;

&lt;p&gt;To expand your arcane library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf5 &lt;span class="nb"&gt;install &lt;/span&gt;gcc make python3-pip python3-tools cargo nodejs vim java-17-openjdk gh development-tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;To enhance your python spell tree, &lt;a href="https://developer.fedoraproject.org/tech/languages/python/multiple-pythons.html" rel="noopener noreferrer"&gt;check this guide&lt;/a&gt;. It's crucial if you're delving deep into Python on Fedora.&lt;/li&gt;
&lt;li&gt;gh is very important when you conjure local repos and you need to reflect them in GitHub. &lt;a href="https://cli.github.com/manual/" rel="noopener noreferrer"&gt;Check this grimoire to learn this magic.&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With these enchantments, your Fedora journey be filled with wonder and productivity!&lt;/p&gt;

&lt;h3&gt;
  
  
  VSCode
&lt;/h3&gt;

&lt;p&gt;Because who doesn't love an editor that thinks it's an IDE? Add repo from here: &lt;a href="https://code.visualstudio.com/docs/setup/linux#_rhel-fedora-and-centos-based-distributions" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/setup/linux#_rhel-fedora-and-centos-based-distributions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dnf check-update
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Vim plugins
&lt;/h3&gt;

&lt;p&gt;Make Vim as fancy as your socks. Ensure you always have the latest repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fLo&lt;/span&gt; ~/.vim/autoload/plug.vim &lt;span class="nt"&gt;--create-dirs&lt;/span&gt; https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command downloads the &lt;code&gt;plug.vim&lt;/code&gt; file and installs it in &lt;code&gt;~/.vim/autoload&lt;/code&gt;. If the directory doesn’t exist, it will be created. To verify installation, open a new Vim session and type &lt;code&gt;:PlugVersion&lt;/code&gt; to verify that Vim-Plug is installed correctly.&lt;/p&gt;

&lt;p&gt;Here’s a list of plugins that will make you feel like a coding wizard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="s2"&gt;" Plugins
call plug#begin('~/.vim/plugged')
Plug 'junegunn/vim-plug'
"&lt;/span&gt; Python
Plug &lt;span class="s1"&gt;'davidhalter/jedi-vim'&lt;/span&gt;
Plug &lt;span class="s1"&gt;'preservim/nerdtree'&lt;/span&gt;
&lt;span class="s2"&gt;" GH Copilot
Plug 'github/copilot.vim'
"&lt;/span&gt; markdown
Plug &lt;span class="s1"&gt;'plasticboy/vim-markdown'&lt;/span&gt;
Plug &lt;span class="s1"&gt;'shime/vim-livedown'&lt;/span&gt;
&lt;span class="s2"&gt;" Fuzzy finder
Plug 'junegunn/fzf', { 'do': { -&amp;gt; fzf#install() } }
Plug 'junegunn/fzf.vim'
call plug#end()
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Vim GitHub copilot setup:
&lt;/h3&gt;

&lt;p&gt;Your perfect AI buddy&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;:Copilot setup&lt;/code&gt; This command will prompt you to authenticate with GitHub. You'll get a code to enter on a GitHub login page that opens in your browser. Follow the instructions to authorize Copilot.&lt;/li&gt;
&lt;li&gt;To accept a suggestion, press &lt;code&gt;Tab&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For more information on usage, you can check the plugin's documentation with &lt;code&gt;:help copilot&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If you encounter issues, check the status with &lt;code&gt;:Copilot status&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="s2"&gt;" Toggle GitHub Copilot on and off
nnoremap &amp;lt;leader&amp;gt;cc :Copilot disable&amp;lt;CR&amp;gt;
nnoremap &amp;lt;leader&amp;gt;ce :Copilot enable&amp;lt;CR&amp;gt;

function! CopilotStatus()abort
    return exists('*copilot#Enabled') &amp;amp;&amp;amp; copilot#Enabled() ? 'enabled' : 'disabled'
endfunction
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;nnoremap&lt;/code&gt;: Non-recursive mapping in normal mode.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;leader&amp;gt;cp&lt;/code&gt;: This is the shortcut;  is typically , by default, but you can change it in your config. So, this would be ,cc if you haven't changed your leader key.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;:Copilot diable/enable&lt;/code&gt;: This is the command to enable/disable Copilot.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;CR&amp;gt;&lt;/code&gt;: Simulates pressing Enter to execute the command.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Timeshift
&lt;/h3&gt;

&lt;p&gt;Similar to system restore in Windows. Consider it your Fedora's time machine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;timeshift

&lt;span class="nb"&gt;sudo &lt;/span&gt;timeshift &lt;span class="nt"&gt;--create&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;timeshift &lt;span class="nt"&gt;--restore&lt;/span&gt;

timeshift &lt;span class="nt"&gt;--list&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  YTMusic player (⌐■_■)
&lt;/h3&gt;

&lt;p&gt;For those who like their music with a side of Linux. Go to &lt;a href="https://ytmdesktop.app/#download" rel="noopener noreferrer"&gt;https://ytmdesktop.app/#download&lt;/a&gt; and download your rpm.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# go to Downloads and rpm, substitute with your own version&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;rpm &lt;span class="nt"&gt;-ivh&lt;/span&gt; youtube-music-desktop-app-2.0.6-1.x86_64.rpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf5 update &amp;lt;package_name&amp;gt;
&lt;span class="c"&gt;# rmp may not solve al dependencies while dnf does&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Docker -- edit: Just skip this and use Podman
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Very important&lt;/strong&gt;: At the moment of writing, Fedora 41 includes Podman as the default container runtime. If you want to use Docker, you need to install it manually, which is only advisable if you really need Docker. Docker will just override Podman. So &lt;strong&gt;I would suggest you to actually skip this step and use Podman&lt;/strong&gt;. It will be cleaner if you need to use containers. I have to use it as I am completing a course that requires Docker.&lt;/p&gt;

&lt;p&gt;First update system, we will be installing community edition.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# sys update&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf update &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="c"&gt;# add repo from docker address, check this, dont blindly copy pls&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf config-manager &lt;span class="nt"&gt;--add-repo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://download.docker.com/linux/fedora/docker-ce.repo
&lt;span class="c"&gt;#install&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;docker-ce docker-ce-cli containerd.io docker-compose-plugin &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will be asked if you wanto enable docker since boot which I don't want as this is for personal and not a corporate environment where you probably want it that way.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# this will start docker&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start docker
&lt;span class="c"&gt;# thiw will enable boot run&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Terminal Transparency
&lt;/h3&gt;

&lt;p&gt;Credits to &lt;a href="https://www.reddit.com/r/Fedora/comments/1gt0ewk/terminal_transparency/" rel="noopener noreferrer"&gt;this Reddit post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ptyxis is the default terminal for Gnome, it was previously known as Prompt. To change transparency just run the below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gsettings &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="s1"&gt;'org.gnome.Ptyxis.Profile:/org/gnome/Ptyxis/Profiles/'&lt;/span&gt;&lt;span class="nv"&gt;$PTYXIS_PROFILE&lt;/span&gt;&lt;span class="s1"&gt;'/'&lt;/span&gt; &lt;span class="s1"&gt;'opacity'&lt;/span&gt; &lt;span class="s1"&gt;'0.8'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;.8 is currently working fine for me, just try and adjust to your taste.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aliases
&lt;/h2&gt;

&lt;p&gt;Fedora points your bashrc file to /etc/bashrc to have a cleaner config. To have your own, create a bashrc.d directory and then put whatever you want. It would be more useful that you know these before aliasing&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;These are some linux aliases I use on my day to day.&lt;/li&gt;
&lt;li&gt;Upme and py_gitignore command are fast casting a full update and the standard .gitignore file aimed to python development&lt;/li&gt;
&lt;li&gt;fastfetch command at the end is to run fastfetch at terminal startup.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mdkir ~/.bashrc.d
vi ~/.bashrc.d/aliases.sh

&lt;span class="c"&gt;# then save and wq the below commands&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;ll&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'ls -lrth --color=auto'&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;la&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'ls -lrtha --color=auto'&lt;/span&gt;
&lt;span class="nb"&gt;alias df&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'df -hT'&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;d1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'cd ..'&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;d2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'cd ../..'&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;d3&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'cd ../../..'&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;d4&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'cd ../../../..'&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;upme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'sudo dnf5 upgrade -y'&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;py_gitignore&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'curl https://raw.githubusercontent.com/github/gitignore/main/Python.gitignore &amp;gt; ./.gitignore'&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;To not use any alias and run the standard command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="se"&gt;\d&lt;/span&gt;f

&lt;span class="c"&gt;#or&lt;/span&gt;

&lt;span class="nb"&gt;command df&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;upgrade&lt;/code&gt; is the preferred term: In DNF5, upgrade is the technically correct and recommended command for updating packages.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;update&lt;/code&gt; is an alias: update still works because it's maintained as an alias for upgrade for backward compatibility and user familiarity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In older dnf and yum versions, there was a distinction between update and upgrade, where upgrade was usually reserved for version upgrades, like from Fedora 36, to 37.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom DNS
&lt;/h2&gt;

&lt;p&gt;Feel like you are on a secret scenario quest with this setup.&lt;/p&gt;

&lt;p&gt;In terminal, run &lt;code&gt;resolvectl&lt;/code&gt;, you will probably be running under your ISP's DNS server and this command will show it. The most common DNS servers are Google and Cloudfare.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloudflare:

&lt;ul&gt;
&lt;li&gt;Primary DNS: 1.1.1.1&lt;/li&gt;
&lt;li&gt;Secondary DNS: 1.0.0.1&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Google Public DNS:

&lt;ul&gt;
&lt;li&gt;Primary DNS: 8.8.8.8  &lt;/li&gt;
&lt;li&gt;Secondary DNS: 8.8.4.4

 &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;nmcli connection show

NAME                UUID                                  TYPE      DEVICE
Wired connection 1  f87e2a6c-b089-31d3-ba62-83e08188db2a  ethernet  enp9s0
virbr0              9ad8ea46-a589-43f7-a904-95098b18404f  bridge    virbr0

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

&lt;/div&gt;



&lt;p&gt;Explanation of the columns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NAME&lt;/strong&gt;: The name assigned to the network connection. This is usually how you identify the connection in NetworkManager.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UUID&lt;/strong&gt;: A universally unique identifier for the connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TYPE&lt;/strong&gt;: The type of network connection (e.g., ethernet, Wi-Fi, bridge, VPN).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DEVICE&lt;/strong&gt;: The network interface associated with the connection (e.g., enp9s0 for a wired connection, wlan0 for Wi-Fi).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Point DNS and Connection to your preffered service&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;nmcli con mod &lt;span class="s2"&gt;"Wired connection 1"&lt;/span&gt; ipv4.dns &lt;span class="s2"&gt;"1.1.1.1 1.0.0.1"&lt;/span&gt;

&lt;span class="c"&gt;# restart network connection to apply changes&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;nmcli con down &lt;span class="s2"&gt;"Wired connection 1"&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;nmcli con up &lt;span class="s2"&gt;"Wired connection 1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Wallpapers
&lt;/h2&gt;

&lt;p&gt;Dress up your desktop with some fresh wallpaper from here: &lt;a href="https://github.com/ropapermaker/Wallpapers/blob/main/README.md" rel="noopener noreferrer"&gt;https://github.com/ropapermaker/Wallpapers/blob/main/README.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because even Linux needs a good aesthetic.&lt;/p&gt;

&lt;p&gt;And there you have it! Your Fedora 41 setup should now be more than just functional; this is a statement. Now, go forth and conquer your Linux adventures with style and speed.&lt;/p&gt;

</description>
      <category>fedora41</category>
      <category>fedora</category>
      <category>linux</category>
      <category>dnf</category>
    </item>
  </channel>
</rss>
