<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Proman4713</title>
    <description>The latest articles on Forem by Proman4713 (@proman4713).</description>
    <link>https://forem.com/proman4713</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%2F1798283%2F09a79ce2-576e-4dad-9c49-38100bef8f1c.png</url>
      <title>Forem: Proman4713</title>
      <link>https://forem.com/proman4713</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/proman4713"/>
    <language>en</language>
    <item>
      <title>The start of my new devlog!</title>
      <dc:creator>Proman4713</dc:creator>
      <pubDate>Fri, 12 Dec 2025 11:56:27 +0000</pubDate>
      <link>https://forem.com/proman4713/the-start-of-my-new-devlog-359e</link>
      <guid>https://forem.com/proman4713/the-start-of-my-new-devlog-359e</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/proman4713" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F1798283%2F09a79ce2-576e-4dad-9c49-38100bef8f1c.png" alt="proman4713"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/proman4713/game-dev-is-tedious-and-i-like-it-172k" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Game Dev is tedious — and I like it.&lt;/h2&gt;
      &lt;h3&gt;Proman4713 ・ Dec 10&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#gamedev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#unity3d&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#godot&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#godotengine&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>gamedev</category>
      <category>unity3d</category>
      <category>godot</category>
      <category>godotengine</category>
    </item>
    <item>
      <title>Game Dev is tedious — and I like it.</title>
      <dc:creator>Proman4713</dc:creator>
      <pubDate>Wed, 10 Dec 2025 23:29:19 +0000</pubDate>
      <link>https://forem.com/proman4713/game-dev-is-tedious-and-i-like-it-172k</link>
      <guid>https://forem.com/proman4713/game-dev-is-tedious-and-i-like-it-172k</guid>
      <description>&lt;p&gt;4 years &lt;em&gt;ago,&lt;/em&gt; 2021, I was a beginner programmer in many things, but one of the things I liked most was Roblox Studio, which meant I got recommended game dev videos unrelated to Roblox on YouTube. After being exposed to a ton of game dev content, I began to have floods of ideas for what I could make. I had a laptop that's now 13 years old and didn't directly meet Unity's system requirements, but I installed Unity anyway. I began applying a game idea immediately, no courses, no nothing, simply Brackeys and a lot of other YouTube videos at my disposal (as well as Stack Overflow and other forums)... The game idea never changed, but after I learnt how to use Unity properly, I remade the project and had a fresh start.&lt;/p&gt;

&lt;p&gt;This idea didn't have a name, so I chatted with an online developer who was my friend at the time, and we just slapped together this name:&lt;br&gt;
&lt;strong&gt;HALIENS&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;HALIENS, Hacking + Aliens, Harry and the Aliens, we had multiple meanings behind it... All of them were lame, but the project kept dragging on for so long that "HALIENS" just stuck as its own name, without any meaning or symbolism behind it, and it felt too late to change it.&lt;/p&gt;

&lt;p&gt;It would take me too long to describe the exact timeline of what happened with that project, and it would be exceptionally tedious considering the fact that I've told this story a billion times so far... 3 times of them being public:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On "our" website, which was proman4713gamedev.com before the domain expired, and this became its URL: &lt;a href="https://homepage-2sg.pages.dev/" rel="noopener noreferrer"&gt;https://homepage-2sg.pages.dev/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;On our YouTube channel: &lt;a href="https://www.youtube.com/@Proman4713GameDev" rel="noopener noreferrer"&gt;https://www.youtube.com/@Proman4713GameDev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;On my latest YouTube channel's first video: &lt;a href="https://www.youtube.com/watch?v=eYe8YqWcqv8" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=eYe8YqWcqv8&lt;/a&gt; (the game didn't actually take 4 years, I miscalculated. It was only 1)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The website has an outdated way of showing Discord profile pictures, and this blog post may just convince me to release the first update in years to fix it.&lt;/p&gt;

&lt;p&gt;I had no money to spend on game-making, and I could barely develop the actual game, and I was a little bit too unwise to be leading a game dev group. But regardless, I had a team of volunteers who kept coming and going over time.&lt;/p&gt;

&lt;p&gt;In late 2023, as I got busy developing something else, I completely gave up on HALIENS; I had deemed it "too demanding" of time and money to be completed. But I still cared for it, so I still made sure the project was pushed to GitHub with its last unfinished, unreleased changes.&lt;/p&gt;

&lt;p&gt;And if you checked out the links I mentioned above, then you may have noticed that the game graphics improved dramatically from what is shown on PGD's channel versus what's shown in Codeswallop's first video: This wasn't an in-progress update that wasn't released before the game was cancelled; this was actually a change that I made &lt;em&gt;while editing Codeswallop's video&lt;/em&gt; just to make the recordings look good for it! I still cared about making the game look and feel good.&lt;/p&gt;

&lt;p&gt;Do not think that I didn't try to fix the game's lighting during the main period of development; I did for days and weeks, and it never worked. And it's just another proof of me having been simply too naive back then, because a few years later, and a few months ago, while editing Codeswallop's video, and revisiting the HALIENS project files after years, I was able in a few minutes to describe the issue with the graphics well enough in my head, form a good Google search out of it, and do the steps to change my project graphics from the built-in renderer to URP (the Universal Rendering Pipeline).&lt;/p&gt;

&lt;p&gt;Default Renderer:&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%2Fabmwepykdrx9pr1z5fle.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%2Fabmwepykdrx9pr1z5fle.png" alt="A screenshot of how the game looked with the default renderer" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;URP:&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%2F9lsblhb6v6kyvkf7arkw.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%2F9lsblhb6v6kyvkf7arkw.png" alt="A screenshot of how the game looks with the URP" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;This may seem like a bunch of useless information, but if you think about it, this incredibly oversimplified story gives us some key information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I hadn't done any preparation or studying of the HALIENS project (not even a game design doc), and therefore simply missed the option of creating the Unity project with the URP option and avoiding all that hassle.&lt;/li&gt;
&lt;li&gt;I didn't have the skills to actually make a game this large. Whereas now I do know 2D art, video editing, voiceover, and am much better at Game/System Design (because it's not just the game you have to design, there's a back-end too)&lt;/li&gt;
&lt;li&gt;I didn't have the resources to do this: Unity sometimes took 30+ minutes to do certain actions on my old laptop. And I learnt pseudo-best practices like alt+tabbing to the Unity editor to start script compilation and then back to VS 2019 so that it compiles &lt;em&gt;faster?&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;And finally, we can deduce, from this info and from context that would take too long to explain here, that I was simply too unwise to finish this through.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Now, why am I saying all this? I just went on and on about the &lt;em&gt;mistakes&lt;/em&gt; without really giving a clear conclusion. Well, first and foremost, I want &lt;strong&gt;&lt;em&gt;everybody,&lt;/em&gt;&lt;/strong&gt; especially young people who are excited to see their names in a game's credits screen, to learn from my mistakes. But I don't want to present video essays that explain game design techniques; GMTK and others already do an awesome job at this.&lt;/p&gt;

&lt;p&gt;I want to present understandable, personal experiences and show their direct consequences on the fate of my game. And this will not be the last blog post, god willing. And I will share more and more over time. I also have other article series that I kept hanging, and I will try to fulfil my promises there.&lt;/p&gt;

&lt;p&gt;Despite all of these problems, I still like game dev, and I like games that have meaning, because too few do these days. And, of course, I like games like those that I want to make.&lt;/p&gt;

&lt;p&gt;I want to fix the mistakes that were made during HALIENS's development. I want to study any game before I make it, I want to plan it well, and I want to ensure it doesn't go out of hand the same way HALIENS did.&lt;/p&gt;

&lt;p&gt;But I'm not giving up on HALIENS, I'm here to give you a plot twist: my next game idea is simply HALIENS's prequel, HALIENS Season 0: It all begins (the title "It All Begins" is subject to change). This isn't something I pulled out of thin air; this was planned back during HALIENS's main game development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HALIENS Season 1, the main game, with its story, which is available in a badly articulated way on its &lt;a href="https://homepage-2sg.pages.dev/games/HALIENS/season-1/#story" rel="noopener noreferrer"&gt;webpage&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;HALIENS Season 0, the prequel, telling the story of how humans ruined their planet. This was planned to be a 2/2.5D game, unlike the other two 3D games.&lt;/li&gt;
&lt;li&gt;HALIENS Season 2, the sequel, telling the story of the player's journey to find other human life after S1's events.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The release of seasons 1, the main game, and 2 is incredibly unlikely unless season 0 makes some sort of miraculous success. But the making of S0, if it happens, will allow us to use many assets, UIs and scripts that were already made for S1, except the main logo, which is unique to the events of S1.&lt;/p&gt;

&lt;p&gt;I'm not guaranteeing the development of season 0; I'm only guaranteeing that I keep sharing my experience in game dev and general coding, and that I make a sincere attempt at studying and planning season 0 to determine if it's a dream worth pursuing.&lt;/p&gt;

&lt;p&gt;If you wish to know more about me, my journey, or HALIENS, then simply join my &lt;a href="https://discord.gg/uShZnFjhgS" rel="noopener noreferrer"&gt;Discord server&lt;/a&gt;, follow my DEV.to.&lt;/p&gt;

&lt;p&gt;You can financially support me using the link in my bio with a custom message so that I contact you personally :)&lt;/p&gt;

&lt;p&gt;I shall start the planning and structuring phase of HALIENS S0 soon enough, and I'll follow every stage I finish with a post here on my DEV.to, and maybe a YouTube video as well.&lt;/p&gt;

&lt;p&gt;Any demos or trailers I release will be on my Discord server. With every post, I'll detail everything that I did differently compared to HALIENS S1, so that I provide solutions to the problems I described today and many more. And I hope that I helped an aspiring game dev somewhere with this post, to see a mistake that they're currently making and be warned, so that they don't fall into the same traps.&lt;/p&gt;

&lt;p&gt;And, as always, Happy Hacking :)&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>unity3d</category>
      <category>godot</category>
      <category>godotengine</category>
    </item>
    <item>
      <title>Why learning by doing sometimes isn't enough for programming</title>
      <dc:creator>Proman4713</dc:creator>
      <pubDate>Tue, 10 Jun 2025 20:52:59 +0000</pubDate>
      <link>https://forem.com/proman4713/why-learning-by-doing-sometimes-isnt-enough-for-programming-1jdp</link>
      <guid>https://forem.com/proman4713/why-learning-by-doing-sometimes-isnt-enough-for-programming-1jdp</guid>
      <description>&lt;p&gt;I am a "self-taught" programmer; I never got a degree, so far, or took any courses to start making apps. And what I learnt recently is that learning by doing is &lt;em&gt;not&lt;/em&gt; enough for programming... And I made production apps while fundamentally misunderstanding basic programming concepts...&lt;/p&gt;

&lt;h3&gt;
  
  
  The start
&lt;/h3&gt;

&lt;p&gt;I used to play with Scratch when I was &lt;em&gt;incredibly&lt;/em&gt; young, but I didn't accomplish much, which is a reason for me not counting Scratch as the start of my coding journey. Rather, I used to play Roblox during the COVID-19 pandemic (nostalgic, I know) and liked the concept of making my own games and pushing them onto the platform... That's when I learned about &lt;strong&gt;Roblox Studio,&lt;/strong&gt; and started using ready-made assets and scripts to put together and form games. The most coding I did was modifying a few variables and implementing a few if statements in &lt;strong&gt;Lua&lt;/strong&gt;, the language Roblox Studio used.&lt;/p&gt;

&lt;p&gt;The most "successful" game I made was called "escape the impossible obby" (yes, I cringe about it myself), without any word capitalisation. The game has had 245 visits since its creation until now.&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%2Fg08mhm0xtxp25nbvocba.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%2Fg08mhm0xtxp25nbvocba.png" alt="escape the impossible obby screenshot" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And earned me the single Robux that remains to this day&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%2F42rhldasg50nfnk4yby3.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%2F42rhldasg50nfnk4yby3.png" alt="a screenshot of the single robux I have" width="282" height="49"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Getting Started
&lt;/h3&gt;

&lt;p&gt;Later, I met some people and was introduced to CS50, who make what are arguably &lt;em&gt;the best&lt;/em&gt; CS courses ever. So I took CS50's "Web programming with Python and JavaScript" course, and that was all I needed to take off. I learnt how to "think" like a programmer, and that was enough...&lt;/p&gt;

&lt;p&gt;With only that course (and not its certificate), I proceeded to make what I would now call "basic" websites. With a local-only to-do list app and a chatting app that's copied 99% from a Medium post [with me not understanding anything but the HTML and a bit of the JS, and not even knowing what NodeJS is], I felt very proud of projects that would actually be trivial to someone who took a few courses more than I did.&lt;/p&gt;




&lt;h3&gt;
  
  
  Breakthrough moment
&lt;/h3&gt;

&lt;p&gt;But then, a lot of things happened, probably because the "basic" websites taught how to deal with code... There was some sort of "take off": I made websites such as this:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.upwork.com%2Fatt%2Fdownload%2Fportfolio%2Fpersons%2Fuid%2F1670507622937563136%2Fprofile%2Fprojects%2Ffiles%2Fac4fca97-44aa-4ce9-80b8-c0d0ec2377b4" 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%2Fwww.upwork.com%2Fatt%2Fdownload%2Fportfolio%2Fpersons%2Fuid%2F1670507622937563136%2Fprofile%2Fprojects%2Ffiles%2Fac4fca97-44aa-4ce9-80b8-c0d0ec2377b4" alt="Diva Hosting design 1 main screen" width="800" height="400"&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%2Fwww.upwork.com%2Fatt%2Fdownload%2Fportfolio%2Fpersons%2Fuid%2F1670507622937563136%2Fprofile%2Fprojects%2Ffiles%2Fd8db56f0-2e1a-40d2-a550-3c1be9610bbb" 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%2Fwww.upwork.com%2Fatt%2Fdownload%2Fportfolio%2Fpersons%2Fuid%2F1670507622937563136%2Fprofile%2Fprojects%2Ffiles%2Fd8db56f0-2e1a-40d2-a550-3c1be9610bbb" alt="Diva Hosting design 1 footer" width="1920" height="1080"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And this:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.upwork.com%2Fatt%2Fdownload%2Fportfolio%2Fpersons%2Fuid%2F1670507622937563136%2Fprofile%2Fprojects%2Ffiles%2F1e77b8c0-3a22-4593-bbff-7b0bf2335f10" 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%2Fwww.upwork.com%2Fatt%2Fdownload%2Fportfolio%2Fpersons%2Fuid%2F1670507622937563136%2Fprofile%2Fprojects%2Ffiles%2F1e77b8c0-3a22-4593-bbff-7b0bf2335f10" alt="Diva Hosting design 2 main screen" width="1920" height="1080"&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%2Fwww.upwork.com%2Fatt%2Fdownload%2Fportfolio%2Fpersons%2Fuid%2F1670507622937563136%2Fprofile%2Fprojects%2Ffiles%2F300b3824-6d88-4b00-a2fd-462cf5841c98" 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%2Fwww.upwork.com%2Fatt%2Fdownload%2Fportfolio%2Fpersons%2Fuid%2F1670507622937563136%2Fprofile%2Fprojects%2Ffiles%2F300b3824-6d88-4b00-a2fd-462cf5841c98" alt="Diva Hosting design 2 footer" width="1920" height="1080"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And I made games like this:&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%2Fj4p6wbes7zir6po4c6k6.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%2Fj4p6wbes7zir6po4c6k6.png" alt="HALIENS player walking" width="800" height="450"&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%2Fndlj7gv4zu3odcs9ckn7.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%2Fndlj7gv4zu3odcs9ckn7.png" alt="HALIENS loading screen" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also made Discord bots on Discord.js with relatively complex mechanics...&lt;/p&gt;

&lt;p&gt;All of that happened on a laptop with &lt;em&gt;these&lt;/em&gt; specs: GeForce GT 630M, Intel Core i5 3210M, and 8 GBs of RAM!&lt;/p&gt;

&lt;p&gt;Just to put this into perspective, here's the comparison between that laptop's GPU and my current one's:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs059bf1zmkyuc6wjuxv0.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%2Fs059bf1zmkyuc6wjuxv0.png" alt="Old laptop GPU vs New laptop GPU" width="222" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And between that laptop's CPU and my current one's:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flig17rrku1jkbe3fmecw.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%2Flig17rrku1jkbe3fmecw.png" alt="Old laptop CPU vs New laptop CPU" width="235" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So that's good and all, I did all of that without taking any courses (except that one CS50 course that got me started), on a potato PC, and without studying anything! Right? Wrong...&lt;/p&gt;




&lt;h3&gt;
  
  
  The problem and realisation
&lt;/h3&gt;

&lt;p&gt;At the end of 2023, I wanted to make a mobile app, and I was under one too tight of a time constraint to learn both Java/Kotlin and Swift, and I didn't have a Mac. So I discovered React Native, and I thought that this would be the perfect opportunity to deal with React and make a mobile app at the same time. I had previously interacted with React while revamping Diva Hosting's (now called Galactic Hosting, having a much laggier panel that still contains some remnants of my design decisions) panel, but I'd only dealt with the parts that were almost identical to plain HTML/CSS/JS, so I saw this as an opportunity to learn React properly.&lt;/p&gt;

&lt;p&gt;And then: It was too weird and overwhelming to know how components, building and EAS (on Expo applications) work... Or knowing how React "rerendered" things, which would help me make my apps more performant...&lt;br&gt;
I had an easy time with HTML, CSS and JavaScript because I was introduced to the core principles, I had an easy time with Unity because I watched the legend Brackeys's videos, and I had an easy time with Discord bots because a member of my game dev team, @lulu5239 on Discord, taught me how to do it while making a Discord bot for the team's server.&lt;br&gt;
My brain had gotten sort of "wired" to these platforms... The core principles of React and any other framework that is more advanced would be much more complicated than the core principles of HTML, and beyond that: I had other human beings teach me the basics of the other two platforms: Brackeys for Unity and Lulu5239 for Discord.js (through which I also got the hang of general-purpose NodeJS).&lt;/p&gt;




&lt;h3&gt;
  
  
  The missing foundation
&lt;/h3&gt;

&lt;p&gt;I eventually resorted to taking &lt;a href="https://www.coursera.org/learn/react-native-course" rel="noopener noreferrer"&gt;a course&lt;/a&gt; on React Native, and although it was a bit outdated, it acted as the CS50 course (although nowhere near as good as the lovely CS50 courses) but for React Native... I used it to make another "take off" and continued to finish a fully functioning production app. The same happened with React on the web, I managed to get started on it by taking &lt;a href="https://www.coursera.org/learn/react-basics" rel="noopener noreferrer"&gt;another course&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And yet, that wasn't enough for me to find myself able to talk expertly about the CS topics I was interested in... When I would sometimes be told about some CS principles, I would go blank. Only to later realise that I understood these concepts by practice, but was never able to communicate them clearly or explain them since I never "learnt" them, rather, I simply tried them once by chance and saw that they worked, so I kept repeating them.&lt;/p&gt;

&lt;p&gt;One example would be the "separation of concerns" principle, or modularity as we commonly say: I did not understand what that was! But I wrote relatively modular code simply because I intuitively didn't &lt;em&gt;like&lt;/em&gt; cluttered code.&lt;/p&gt;

&lt;p&gt;I had to more-or-less "study" by doing extensive research on topics to be able to understand them...&lt;br&gt;
For example, my knowledge of encryption led me to make up what I thought was a "novel" theory of how to manage my app's security. Only to later realise that the "theory" existed as a bunch of principles that everyone knew, but I didn't; rather, I unknowingly used them after trial and error.&lt;/p&gt;




&lt;h3&gt;
  
  
  The fix
&lt;/h3&gt;

&lt;p&gt;So I now know that I wouldn't have really made it in a job interview before actually researching topics and taking courses. For example, I took Google's Cybersecurity professional certificate, and while taking it, I noticed bits of information that I &lt;em&gt;knew&lt;/em&gt; would've taken me ages to discover if I'd gone with the same way of "self-learning" cybersecurity. And especially considering the fragility of advanced things, like React or  Cybersecurity, it's becoming more reasonable to want to take courses or study curricula, so that I don't make miserable programs that are built on a weak foundation.&lt;/p&gt;

&lt;p&gt;And I'm not saying you should take courses and spend money for everything, I now know much more information than these few courses would give me... It's because nowadays we have the powers of Google Search, YouTube &lt;em&gt;and&lt;/em&gt; AI combined! You can learn about pretty much anything through a free CS50 course, a few articles, or a YouTube video! The most important thing is that you are intentionally searching for things that teach concepts, not just methods of doing something.&lt;/p&gt;

&lt;p&gt;But yet, there are &lt;em&gt;many&lt;/em&gt; "aha!" moments that I experience where studying or researching &lt;em&gt;theory&lt;/em&gt; explains &lt;em&gt;practice...&lt;/em&gt; Especially regarding software architecture and design: Previously, I overhauled one of my apps' API to make it more performant and simply cleaner, and I later discovered that the principles I "made up" to make this API were already existent and could've been implemented from the start (e.g. separation of concerns and duties, least privilege, single responsibility, etc)! Now, these wouldn't require courses or deep research to learn. But you wouldn't specifically remember them if you just hear them a few times over the hundreds of YouTube videos that you watch about CS, you need to specifically target clean code and security principles to be able to engrave them into your brain, and constantly think about them while writing code.&lt;/p&gt;




&lt;h3&gt;
  
  
  Bridging the gap
&lt;/h3&gt;

&lt;p&gt;Well, I still personally prefer learning by doing over anything else. And it's important to start with &lt;em&gt;it&lt;/em&gt;, and &lt;em&gt;after&lt;/em&gt; you get good and proper experience with making functional apps, start learning about the design, coding, and security principles needed to &lt;em&gt;improve&lt;/em&gt; these apps. And while doing that, you will learn to apply these principles everywhere.&lt;/p&gt;

&lt;p&gt;But it will always remain important to write clean, secure, and optimised code when writing your programs — which wouldn't necessarily happen if you never researched algorithms, or cybersecurity, or CI/CD pipelines! — so that you may actually work in large teams or pass interviews!&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Practical experience is very important — and in my opinion, the &lt;em&gt;most&lt;/em&gt; important — because it gets you started: You find out whether or not programming is for you by actually building stuff, and you learn how to build with practical experience. But theoretical knowledge is what makes you build &lt;em&gt;well, and intentionally well...&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you're self-taught, then don't abandon the hands-on way of learning that got you started. Rather, I just want you to make sure that you always account for the theoretical as long as it fits your project(s). Your tendency to get your feet wet and experiment with new concepts is why you're special, why you're "self-taught". But when you hit the wall that I hit with React Native, recognise that intuition is not always enough, and that you need to understand the &lt;em&gt;why&lt;/em&gt; behind your code.&lt;/p&gt;

&lt;p&gt;And this is what I would call the "sweet spot": Knowing how to switch between doing and studying. To start by building to motivate yourself, then learn the theory to reinforce your experience and improve existing projects.&lt;/p&gt;

&lt;p&gt;What I do now is that I immediately get started with a new technology if I want to learn it, no courses or research beforehand, and I &lt;em&gt;immediately&lt;/em&gt; start working on my project idea rather than prototyping random things. After I finish it, or scrap it in favour of a better version or idea, I start to read documentation, take courses, or watch videos... And after that, I become capable of not only implementing what I learnt well, but also learning new aspects of the technology that I hadn't learnt before. And that makes all the difference in teams, interviews, and building scalable software!&lt;/p&gt;




&lt;h3&gt;
  
  
  Key takeaways
&lt;/h3&gt;

&lt;p&gt;This took long to write, and I think it's worthwhile to summarise everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learning by doing is what builds confidence and practical skills&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Theoretical&lt;/em&gt; knowledge is what builds the vocabulary and context to build apps that are &lt;em&gt;intentionally&lt;/em&gt; good&lt;/li&gt;
&lt;li&gt;Both together form a knowledgeable programmer
That's it for today, everyone. Please share your opinions, and Happy Hacking!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>Dual booting Windows and Ubuntu: is it even worth it with WSL?</title>
      <dc:creator>Proman4713</dc:creator>
      <pubDate>Fri, 30 Aug 2024 14:00:57 +0000</pubDate>
      <link>https://forem.com/proman4713/dual-booting-windows-and-ubuntu-is-it-even-worth-it-with-wsl-576o</link>
      <guid>https://forem.com/proman4713/dual-booting-windows-and-ubuntu-is-it-even-worth-it-with-wsl-576o</guid>
      <description>&lt;p&gt;Welcome back to the fourth article of my "Leveraging Linux for Development" series! I apologize for the wait, I've been very busy with issues with my laptop.&lt;/p&gt;

&lt;p&gt;No matter, what I'm here to explain today is all for the Windows users who want to try out Linux (Ubuntu is our demonstration). I'll also talk about WSL, and if it's even worth it to dual boot Ubuntu with Windows if WSL exists. Let's get started!&lt;/p&gt;




&lt;h2&gt;
  
  
  WSL should do the job, right?
&lt;/h2&gt;

&lt;p&gt;Short answer: Not really.&lt;br&gt;
Some Windows developers daily drive Windows and develop on WSL, and they seem to decide that it's "enough" for them, and that there's no need to replace Windows with Ubuntu or even just dual boot Ubuntu alongside Windows!&lt;/p&gt;

&lt;p&gt;While that does have some truth to it, I personally don't think WSL comes even close to actual standalone Linux.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;p&gt;I used to develop React apps on Windows with WSL. So I would have WSL open as a terminal, VSCode connected to the WSL session, &lt;em&gt;and&lt;/em&gt; Brave Browser running the React app!&lt;/p&gt;

&lt;p&gt;I can not describe how slow my PC would become. And because Windows tends to freeze completely instead of freezing a singular Window/app, my PC was almost unusable.&lt;br&gt;
While I do have old hardware that does contribute to the performance degradation, running standalone Ubuntu on the same hardware in the same situation (terminal running React, VSCode open in the project, and Brave Browser showing the app) was, with no exaggeration, a million times better!&lt;/p&gt;

&lt;p&gt;From my whole PC freezing and having to wait more than 10 seconds for VSCode intellisense to work, to everything running smoothly with VSCode intellisense working the same as if I'm writing a static HTML file: That difference was &lt;strong&gt;astronomical!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And the same could be said for all tasks I did on WSL Vs Standalone Ubuntu, WSL will just never reach the speed or efficiency of the standalone distro.&lt;/p&gt;

&lt;h3&gt;
  
  
  Terminal-only interface
&lt;/h3&gt;

&lt;p&gt;Ubuntu WSL, while supporting some GNOME Apps, predominantly only provides access to the Ubuntu terminal. So you can use bash and apt, but if you run &lt;code&gt;gnome-text-editor&lt;/code&gt; you'll get a barely good-looking window that's terribly slow.&lt;/p&gt;

&lt;p&gt;Standalone Ubuntu comes with GNOME by default, and even if you can change the desktop environment to something like KDE, having a full UI environment is much better for users coming from Windows than a bare terminal that is very inefficient for accessing files (even if you use Windows apps, you have to go to Linux &amp;gt; Ubuntu &amp;gt; /home/username to access your files. And to upload files from WSL you have to type &lt;code&gt;\\wsl.localhost\Ubuntu&lt;/code&gt; manually)!&lt;/p&gt;

&lt;p&gt;I personally prefer my full Ubuntu Desktop experience than the boring, bland-looking black terminal of WSL. I also much prefer the beautiful GNOME terminal over WSL or CMD! And besides the looks, the GNOME terminal is still easier to use, and resizing the window does not break the terminal like on Windows.&lt;/p&gt;

&lt;p&gt;So while WSL can get your job done with some light tasks (e.g. running a discord.js bot), it will get slower and slower the more you do on it (and the more packages you install) and it's inefficient to use with the Windows side (e.g. VSCode + WSL) of your system.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to dual boot Ubuntu with Windows?
&lt;/h2&gt;

&lt;p&gt;It would seem simple at first, but depending on the state of your Windows machine, things could go terribly wrong!&lt;/p&gt;

&lt;h3&gt;
  
  
  Check your disk type
&lt;/h3&gt;

&lt;p&gt;If you have lots of partitions on your Windows disk, or have two hard drives and played around with the second, then your disk type might be Dynamic. And we definitely don't want that.&lt;/p&gt;

&lt;p&gt;Dynamic disks allow for large amounts of partitions on one disk, but they are only a Windows thing. Other operating systems will not be able to read partitions on a dynamic disk and will treat the whole disk as one chunk of &lt;strong&gt;unallocated space.&lt;/strong&gt; You can easily imagine how this could go wrong since partitioning the disk during Ubuntu installation could cause terrible data loss in the other partitions due to Ubuntu not acknowledging them!&lt;/p&gt;

&lt;p&gt;To check your disk type, press Win + X &amp;gt; Disk Management and look at your disk(s). Any disk than has yellow-ish partitions instead of blue are dynamic disks and will say "Dynamic Disk" under their name (you can also right click the disk name, if it shows a "Convert to basic disk" option then it's dynamic, and vice versa).&lt;/p&gt;

&lt;p&gt;If all your disks are basic, skip the next section. If the one you're planning to install Ubuntu on is dynamic, continue reading...&lt;/p&gt;

&lt;h3&gt;
  
  
  Convert dynamic disks to basic disks
&lt;/h3&gt;

&lt;p&gt;Do &lt;strong&gt;NOT&lt;/strong&gt; click "Convert to basic disk" immediately in the context menu of the disk, this will &lt;em&gt;wipe all the data on the disk!&lt;/em&gt; We need to do a few things first:&lt;/p&gt;

&lt;h4&gt;
  
  
  Clean your dynamic disk(s)
&lt;/h4&gt;

&lt;p&gt;First of all, clean your disks of any trash you don't need, movies you already watched, projects that are commited to GitHub, .exe installer files, and everything that doesn't need to take space on your disk. Preferably get the occupied disk space to be less than half the total disk space.&lt;/p&gt;

&lt;h4&gt;
  
  
  Compress your entire disks
&lt;/h4&gt;

&lt;p&gt;Next, you need to protect the data that's left. Download &lt;a href="https://www.7-zip.org/" rel="noopener noreferrer"&gt;7-Zip&lt;/a&gt; on any partition of a disk that's &lt;em&gt;not the dynamic one.&lt;/em&gt; Then go to the first partition of the dynamic disk, and select everything in it (make sure you select everything including hidden folders) then right-click your selection.&lt;br&gt;
Click 7-Zip and add to archive, use this configuration for the compression:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Archive format:&lt;/strong&gt; 7z&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compression level:&lt;/strong&gt; 9 - Ultra&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compression method:&lt;/strong&gt; * LZMA2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dictionary size:&lt;/strong&gt; 512MB (if 512MB shows an error when starting the compression, decrease the size. If it doesn't show an error, keep increasing the size until you reach the maximum size that does not show an error)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Word size:&lt;/strong&gt; 273&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solid Block size:&lt;/strong&gt; Solid&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Number of CPU threads:&lt;/strong&gt; * 2    / 4&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory usage for Compressing:&lt;/strong&gt;
5415 MB/6315 MB/7894 MB                       * 80%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory usage for Decompressing:&lt;/strong&gt; 514MB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last two fields could change based on your dictionary size. This 7-Zip configuration will take the longest time, but it will result in the most compact .7z archive!&lt;/p&gt;

&lt;p&gt;After the first partition is done archiving (could take multiple hours), go on to do the second partition and continue until you finish each partition in the dynamic disk (if it's only one, then go ahead to the next section).&lt;/p&gt;

&lt;h4&gt;
  
  
  Store the archive(s) safely
&lt;/h4&gt;

&lt;p&gt;The archive of each partition will be output in the same partition (that's why I told you to clean the partitions until the occupied space is less than half the size of the entire partition. This is to ensure that the archive has enough space to be saved).&lt;/p&gt;

&lt;p&gt;You need to move the archives somewhere other than the dynamic disk, this could be an external hard drive or USB, or it could just be another disk on your computer.&lt;/p&gt;

&lt;p&gt;Always prefer copying (yes, copying not cutting. If cutting fails then you could lose data from the archive. Only delete the archive after it's done copying) the archives to a hardware device you have before the cloud. Uploading it to the cloud can take tremendous time and bandwidth (and probably money) based on the archive size, but you can still use the cloud if you so like!&lt;/p&gt;

&lt;h4&gt;
  
  
  Delete all partitions on the dynamic disk(s)
&lt;/h4&gt;

&lt;p&gt;After you're done moving the archives and have made sure that they're safe, right click each partition on the dynamic disk(s) and select "Delete partition". It will show you a warning, click yes.&lt;/p&gt;

&lt;p&gt;The dynamic disk(s) should now show only one huge, black chunk that says "Unallocated Space". Right click on the disk itself, then choose convert to basic disk. If there's also an option to "Covert to GPT Disk", select it!&lt;/p&gt;

&lt;p&gt;And that's it, your disk is now basic. If you want to recreate the previous partitions that were archived, you can do so, but make sure you leave some Unallocated Space for Ubuntu to use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install Ubuntu 24.04.1 LTS
&lt;/h3&gt;

&lt;p&gt;Ubuntu 24.04.1 LTS just came out yesterday, you can get the ISO file from the &lt;a href="https://ubuntu.com/download/desktop" rel="noopener noreferrer"&gt;Ubuntu Desktop download page&lt;/a&gt; (or &lt;a href="https://releases.ubuntu.com/24.04.1/ubuntu-24.04.1-desktop-amd64.iso" rel="noopener noreferrer"&gt;download the file directly&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;You can follow the &lt;a href="https://ubuntu.com/tutorials/install-ubuntu-desktop#3-create-a-bootable-usb-stick" rel="noopener noreferrer"&gt;Ubuntu installation tutorial&lt;/a&gt; to create the bootable USB and run the installer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make sure you run the installer without and internet connection to avoid weird issues&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the installer still has annoying issues, download the &lt;a href="https://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-desktop-amd64.iso" rel="noopener noreferrer"&gt;Ubuntu 22.04.4 LTS&lt;/a&gt; instead, create the bootable media, and follow the rest of the Ubuntu installation tutorial to install Ubuntu.&lt;/p&gt;

&lt;p&gt;One thing to note, though, is when you get to the "How do you want to install Ubuntu?" page. Carefully select the option you need:&lt;/p&gt;

&lt;h4&gt;
  
  
  If you only have one disk with Windows on it, and you want to dual boot Ubuntu
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;You have to first disable Windows BitLocker before installing Ubuntu.&lt;/li&gt;
&lt;li&gt;Select "Install alongside Windows Boot Manager", click next and use the slider to specify the space you need for Ubuntu&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  If you have two or more disks, and you want to install Ubuntu on a disk besides the Windows disk
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Select "Something else..." (Or "Manual Installation") and look for the disk you want to install Ubuntu on (it will be sdX, where X is the count of the disk alphabetically. The first disk will be sda, second will be sdb, and so on)&lt;/li&gt;
&lt;li&gt;Remove all partitions on the wanted disk (partitions on the wanted disk will be numbered sdX1, sdX2, and so on...) by selecting each of them and clicking the minus sign&lt;/li&gt;
&lt;li&gt;Create one big partition in the resulting "Free Space" by clicking the plus sign, then choose "/" as the mount point, and choose the file system as "EXT4 Journaling Filesystem"&lt;/li&gt;
&lt;li&gt;Look for a partition with type "efi" (should be on sda, the Windows disk), then look for that same partition in the "Device for bootloader" dropdown and select it&lt;/li&gt;
&lt;li&gt;Continue the installation&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  If you have two or more disks, and want to install Ubuntu on a single partition of one of those disks
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Do the same steps as the previous section, but choose one partition of the device to delete and recreate as EXT4 (or immediately create a new partition with the same info if there's free space left in that disk)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  If you want to replace Windows with Ubuntu
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Select "Erase disk and install Ubuntu" and choose the Windows disk, then continue with the installation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Configure Secure Boot (Optional)
&lt;/h3&gt;

&lt;p&gt;If you have Secure Boot enabled in your BIOS/UEFI settings then Ubuntu could show you a "configure Secure Boot" checkbox:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;On Ubuntu 22.04, you'll find this checkbox in the minimal/extended installation screen under the "Install third-party drivers" checkbox. Type a one-time password (do something easy like "aaaaaaaa", this password is only used once anyways) and continue with the installation&lt;br&gt;
On Ubuntu 24.04, there will be no checkbox, it will automatically configure Secure Boot&lt;br&gt;
After you specify a one-time password for Ubuntu 22.04, finish the installation and reboot... Your device should show a "Perform MOK management" screen or something similar, you'll have a couple of options which you can pick using the arrow keys and the enter key.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select "Enroll MOK"&lt;/li&gt;
&lt;li&gt;Select "View key 0" and you'll see the key is related to Ubuntu, go back by pressing an arrow key (optional)&lt;/li&gt;
&lt;li&gt;Select "Continue"&lt;/li&gt;
&lt;li&gt;It will ask you for a password, type "aaaaaaaa" (your typing will not show up, so make sure you type it correctly) that we used during installation and hit enger&lt;/li&gt;
&lt;li&gt;Select "Yes"&lt;/li&gt;
&lt;li&gt;Select "Reboot"
Dell has a useful &lt;a href="https://www.dell.com/support/kbdoc/en-us/000221584/mok-message-when-booting-linux-with-secure-boot-enabled" rel="noopener noreferrer"&gt;Support Page&lt;/a&gt; that also works for my Samsung PC&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Reboot into Ubuntu and enjoy
&lt;/h3&gt;

&lt;p&gt;After rebooting, you'll either boot directly into Ubuntu or will see the GRUB menu to pick between Windows and Ubuntu. Depending on whether or not you kept Windows...&lt;/p&gt;

&lt;p&gt;You can also check out my &lt;a href="https://dev.to/proman4713/maximize-your-experience-on-ubuntu-desktop-2lg4"&gt;"Maximize Your Experience on Ubuntu Desktop"&lt;/a&gt; article to learn about some cool optimisations for your system! If the GRUB menu does not show up and boots into Ubuntu directly even though you kept Windows, then you can also read that article since it contains a solution.&lt;/p&gt;

&lt;p&gt;The next article will be about familiarizing yourself with Linux and customizing it to fit your muscle memory as a Windows user so that you don't have to relearn all the various actions.&lt;/p&gt;

&lt;p&gt;And, as always, Happy Hacking!&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ubuntu</category>
      <category>bash</category>
      <category>archlinux</category>
    </item>
    <item>
      <title>Maximize your experience on Ubuntu Desktop</title>
      <dc:creator>Proman4713</dc:creator>
      <pubDate>Mon, 22 Jul 2024 10:00:37 +0000</pubDate>
      <link>https://forem.com/proman4713/maximize-your-experience-on-ubuntu-desktop-2lg4</link>
      <guid>https://forem.com/proman4713/maximize-your-experience-on-ubuntu-desktop-2lg4</guid>
      <description>&lt;p&gt;Welcome back to the third article of the "Leveraging Linux for Development" series! In this article, I'll go over the steps you should take after getting a fresh installation of Ubuntu Desktop to solve common issues such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slow boot time&lt;/li&gt;
&lt;li&gt;Slow app startup&lt;/li&gt;
&lt;li&gt;Sluggish navigation&lt;/li&gt;
&lt;li&gt;and more...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's get right into it!&lt;/p&gt;




&lt;h2&gt;
  
  
  Install Ubuntu 22.04.04 LTS
&lt;/h2&gt;

&lt;p&gt;I recommend installing Ubuntu 22.04.04 LTS (Jammy Jellyfish) and &lt;strong&gt;not&lt;/strong&gt; Ubuntu 24.04 LTS (Noble Numbat) since 24.04 is currently &lt;em&gt;unstable&lt;/em&gt; and not compatible with all hardware yet. Your Jammy Jellyfish installation will warn you when the updates for Noble Numbat are okay to install (with the release of 24.04.&lt;strong&gt;&lt;em&gt;1&lt;/em&gt;&lt;/strong&gt; on August 29th).&lt;/p&gt;

&lt;p&gt;The first thing you want to do is to get a USB drive with at least 8GB of free space, this is the drive that you will use to boot into the Ubuntu Installation. To get the Jammy Jellyfish ISO file (which is used to create a bootable media on the USB), go to the &lt;a href="https://releases.ubuntu.com/22.04/" rel="noopener noreferrer"&gt;Jammy Jellyfish Releases&lt;/a&gt; page and download the ISO (or &lt;a href="https://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-desktop-amd64.iso" rel="noopener noreferrer"&gt;download it directly&lt;/a&gt;). Then follow the rest of the &lt;a href="https://ubuntu.com/tutorials/install-ubuntu-desktop#3-create-a-bootable-usb-stick" rel="noopener noreferrer"&gt;&lt;em&gt;Ubuntu Installation Guide&lt;/em&gt;&lt;/a&gt; normally and install Ubuntu Jammy Jellyfish!&lt;br&gt;
I suggest that you go with the minimal installation since the extended installation can fill your system with bloat you'll never use.&lt;/p&gt;
&lt;h4&gt;
  
  
  For Windows users who want to Dual Boot with Ubuntu or have WSL and think that it's enough, the next article is entirely made for you!
&lt;/h4&gt;
&lt;h2&gt;
  
  
  Reduce GRUB timeout
&lt;/h2&gt;

&lt;p&gt;After installing Ubuntu Desktop, go to the terminal app and run this 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="nb"&gt;sudo &lt;/span&gt;gedit /etc/default/grub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and set the &lt;code&gt;GRUB_TIMEOUT&lt;/code&gt; variable to a small number like 5 seconds. While this does not necessarily &lt;em&gt;speed up&lt;/em&gt; the boot time, it is useful for providing small but enough delay at startup for Dual Boot users (which will be addressed in the next article) and users who need to enter UEFI firmware settings or recovery mode.&lt;/p&gt;

&lt;p&gt;To update GRUB with this new configuration run:&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;update-grub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next time you reboot, you will find that the GRUB timeout has been set to 5 seconds!&lt;/p&gt;

&lt;h2&gt;
  
  
  Pick the optimal server for Ubuntu Software updates
&lt;/h2&gt;

&lt;p&gt;Open the launchpad (Win + A or click "Show Applications"), go to "Software &amp;amp; Updates" -&amp;gt; "Ubuntu Software" -&amp;gt; "Download from" -&amp;gt; "Other...", this will show a list of all available Download Servers for Ubuntu Software.&lt;/p&gt;

&lt;p&gt;Click on "Select Best Server", wait for it to finish, then click "Choose Server" and "Close".&lt;/p&gt;

&lt;p&gt;This could drastically speed up package installation and updates, which makes the experience smoother but not technically more performant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Nala instead of APT
&lt;/h2&gt;

&lt;p&gt;Run:&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;apt &lt;span class="nb"&gt;install &lt;/span&gt;nala
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nala uses the same "APT-DPKG" library that APT uses, it's just a different front-end that's much faster (and also much cooler) than APT (You can cross-use APT and Nala with no issues). You can also use the &lt;code&gt;sudo nala fetch&lt;/code&gt; command to do the same Ubuntu mirror check as the previous item and select up to 16 optimal mirrors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use XORG instead of Wayland for older hardware
&lt;/h2&gt;

&lt;p&gt;If your hardware is relatively old, you might notice that the fresh Ubuntu installation is a bit &lt;strong&gt;sluggish,&lt;/strong&gt; and this could largely be because your hardware is too old for Wayland. In this case, you can switch to XORG since Wayland could cause anything from glitches to freezes.&lt;/p&gt;

&lt;p&gt;To switch to XORG, log out from the power options. Choose your username, and before typing in your password, click on the gear icon in the bottom right of the screen. Whatever was already chosen in this menu, change it to the option containing the word "XORG" (This differs between releases so I'm just including a generic description of what the option will be), or if there are only two options ("Ubuntu" and "Ubuntu Wayland") then choose "Ubuntu".&lt;/p&gt;

&lt;p&gt;Depending on your hardware, you will find that GNOME apps open up much faster and your experience is far smoother.&lt;/p&gt;

&lt;h2&gt;
  
  
  Remove the Snap package manager and install apps using .DEB files instead
&lt;/h2&gt;

&lt;p&gt;The Snap package manager can really slow down system startup, and applications installed using Snap are also slower to start. To remove snap, check out &lt;a href="https://kskroyal.com/remove-snap-packages-from-ubuntu/" rel="noopener noreferrer"&gt;this awesome article&lt;/a&gt; (Only follow that article until right before the "Installing Firefox as DEB" section) that already covers that!&lt;/p&gt;

&lt;p&gt;Now time to start using .DEB files to install programs! There's an awesome tool to do this called &lt;em&gt;GDEBI&lt;/em&gt; which allows you to install .DEB applications easily, to do this run:&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;nala &lt;span class="nb"&gt;install &lt;/span&gt;gdebi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next time you install a program, preferably use its DEB package and install it using GDEBI by right-clicking on the DEB file and installing it with GDEBI&lt;/p&gt;

&lt;h2&gt;
  
  
  Gnome Tweaks and Gnome Shell Extensions Manager
&lt;/h2&gt;

&lt;p&gt;Gnome Tweaks is a wonderful application that allows you to &lt;em&gt;tweak&lt;/em&gt; various aspects of your OS, while the Extensions Manager allows you to install Gnome Extensions and customize them however you want! There are hundreds of available extensions that you could use to customize your experience on Ubuntu.&lt;br&gt;
Run:&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;nala &lt;span class="nb"&gt;install &lt;/span&gt;gnome-tweaks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can then open the Gnome Tweaks app and customize various aspects of your system! To install the Extensions Manager:&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;nala &lt;span class="nb"&gt;install &lt;/span&gt;gnome-shell-extension-manager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can then open the Extension Manager and install various extensions to customize your Gnome Desktop experience!&lt;/p&gt;

&lt;h2&gt;
  
  
  Disable boot splash screen
&lt;/h2&gt;

&lt;p&gt;While the Ubuntu splash screen that shows on boot looks very cool, it can slow down your system boot time a lot. To disable it, first, go to the same grub config file as the first step:&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;gedit /etc/default/grub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, change the &lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;/code&gt; property to &lt;code&gt;fsck.mode=skip quiet&lt;/code&gt;, that way the splash screen will not show the next time you boot into Ubuntu.&lt;br&gt;
Update GRUB again:&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;update-grub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install useful packages
&lt;/h2&gt;

&lt;p&gt;Those are packages that don't necessarily come with a fresh Ubuntu installation but can be very useful, run this command to install 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;nala &lt;span class="nb"&gt;install &lt;/span&gt;htop neofetch curl wget git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;htop shows some CPU and memory statistics about your PC which could help know what's slowing your PC down. This is sort of an equivalent of "Task Manager" on Windows.&lt;/li&gt;
&lt;li&gt;neofetch shows various system information including your distribution, GPU name, and CPU name.&lt;/li&gt;
&lt;li&gt;curl and wget are tools for sending network requests from the command line&lt;/li&gt;
&lt;li&gt;git is used to interact with, well, Git!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installing auto-cpufreq
&lt;/h2&gt;

&lt;p&gt;auto-cpufreq is an awesome tool to manage your PC's resources, especially for laptop users. To install it, go to the &lt;a href="https://github.com/AdnanHodzic/auto-cpufreq?tab=readme-ov-file#auto-cpufreq-installer" rel="noopener noreferrer"&gt;GitHub page's installer&lt;/a&gt; and follow the instructions!&lt;/p&gt;

&lt;p&gt;After you're done, you can go to the launchpad and start the auto-cpufreq app. Once it starts, click on the "install" button to enable auto-cpufreq. You can then restart the app to change your "Governor". &lt;strong&gt;Performance&lt;/strong&gt; prioritizes device performance over battery life, &lt;strong&gt;Powersave&lt;/strong&gt; prioritizes battery life over device performance, and &lt;strong&gt;Default&lt;/strong&gt; changes the governor based on whether or not your laptop is plugged in.&lt;/p&gt;

&lt;h4&gt;
  
  
  For desktop users, choose a specific governor and keep it on, default would not matter for you.
&lt;/h4&gt;

&lt;h2&gt;
  
  
  Minimize apps on click-again
&lt;/h2&gt;

&lt;p&gt;On Windows, if you open an app, wait for it to start, and then click on its icon again it minimizes itself.&lt;br&gt;
While this behaviour makes sense, it's not the default behaviour on Ubuntu (on Ubuntu, nothing happens when you click again). And there's no way to change it through the GNOME settings GUI. To make apps minimize themselves on "click-again", run this command:&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;org.gnome.shell.extensions.dash-to-dock click-action &lt;span class="s1"&gt;'minimize-or-previews'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now whenever you click on an already-open app's item in the dock, it should minimize itself!&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Disk Usage Analyzer (Baobab)
&lt;/h2&gt;

&lt;p&gt;The Disk Usage Analyzer is to me a very useful app when it comes to knowing what takes the most space on my system. To install it, run:&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;nala &lt;span class="nb"&gt;install &lt;/span&gt;baobab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, open your launchpad and open the program, scan a specific drive you want, and wait for it to show you a diagram of all storage taken by your system!&lt;/p&gt;

&lt;h2&gt;
  
  
  Enable universe and/or multiverse repositories
&lt;/h2&gt;

&lt;p&gt;The universe and multiverse repositories for packages include additional packages that are not included in the default Ubuntu Repository! Universe is for additional open-source repositories, while Multiverse is for closed-source repositories. To add universe run:&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;add-apt-repository universe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And to add multiverse run:&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;add-apt-repository multiverse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And to &lt;em&gt;disable&lt;/em&gt; any of these repositories just run those same commands with the &lt;code&gt;-r&lt;/code&gt; flag added!&lt;/p&gt;

&lt;h2&gt;
  
  
  Enable Ubuntu media codecs
&lt;/h2&gt;

&lt;p&gt;Ubuntu does not come with all media codecs by default (for example, codecs for MOV files), to install all additional media codecs run:&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;nala &lt;span class="nb"&gt;install &lt;/span&gt;ubuntu-restricted-extras &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's it, you can now use such codecs freely!&lt;/p&gt;

&lt;h2&gt;
  
  
  Set up UFW
&lt;/h2&gt;

&lt;p&gt;UFW is a firewall system available for Linux systems that can help protect you online, to check your UFW version run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ufw &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure it's up to date by running:&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;nala &lt;span class="nb"&gt;install &lt;/span&gt;ufw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable it on system startup by running this 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="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;ufw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start it:&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;systemctl start ufw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;sudo ufw status&lt;/code&gt; says inactive, run:&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;ufw &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;UFW status should now say active.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Stacer
&lt;/h2&gt;

&lt;p&gt;Stacer is an open-source system cleaner and optimizer. It allows you to monitor all applications in a GUI manner, clean your system of trash, customize some aspects of your GNOME experience, and more! To install Stacer run:&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;nala &lt;span class="nb"&gt;install &lt;/span&gt;stacer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you can then open the app from the launchpad and tinker around however you like, I mostly use it to clean my system or monitor processes in a more "Task Manager"-looking interface than htop:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ofb3v8692ohegxq9ruo.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%2F9ofb3v8692ohegxq9ruo.png" alt="Stacer Processes Page" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Decrease "Swappiness" (optional)
&lt;/h2&gt;

&lt;p&gt;If you specified a swap area for Ubuntu during installation, you should make sure that this swap area is only used in the most extreme cases when your RAM is close to being fully taken up. This is because Swap Space is on your HDD/SSD, which is far slower than your dedicated RAM stick(s). If Ubuntu relies on swap too much, you can feel it's too slow even though you have plenty of RAM left. You can run &lt;code&gt;cat /proc/sys/vm/swappiness&lt;/code&gt; to see what your current swappiness value is (should be 60 by default). You can decrease it &lt;strong&gt;temporarily&lt;/strong&gt; [until you reboot] to try different values, to do this run:&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;sysctl vm.swappiness&lt;span class="o"&gt;=&lt;/span&gt;15
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To me, this value was best at 15, maybe lower would be even better but 15 was good enough. You can change this value however you want to experiment around since this is only a temporary change that's effective until you reboot. Once you find a good value, run this to keep it permanently:&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;gedit /etc/sysctl.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;look for the &lt;code&gt;vm.swappiness=&amp;lt;value&amp;gt;&lt;/code&gt; line, if it does not exist add it to the bottom:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;vm&lt;/span&gt;.&lt;span class="n"&gt;swappiness&lt;/span&gt;=&lt;span class="m"&gt;15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the file and your swappiness will decrease permanently until you manually change that file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preload (bonus)
&lt;/h2&gt;

&lt;p&gt;I have seen many people talk about preload, however after I tried it for around two weeks I did not notice any difference, but that was mostly because I already did not have many applications on my Ubuntu Desktop installation.&lt;br&gt;
Preload is a tool that &lt;strong&gt;preloads&lt;/strong&gt; libraries for your most-used apps into memory before they start. But, before we get into installing preload. I must note that &lt;strong&gt;preload could be harmful to you depending on what your usage habits are,&lt;/strong&gt; remember that preload is always running in the background to optimize your frequent app startups. However, if you only open a certain app once a day (like Brave Browser for me) and don't close it again, preload will keep the preloaded copy of Brave Browser that it doesn't even need since even if I close the Brave Browser window, Brave stays running in the background ready to be started again. So the additional preloaded copy is &lt;strong&gt;just a waste of memory!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you execute some programs for only a few minutes, close them, and open them again a little while afterwards. Then preload is for those programs only (For me these programs are the files app and the terminal, both system apps that do not quite need preload).&lt;br&gt;
So, depending on which use case you practice the most, you decide whether or not you are going to install preload:&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;nala &lt;span class="nb"&gt;install &lt;/span&gt;preload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's it, preload is now installed.&lt;/p&gt;




&lt;p&gt;And that's it for today, everyone! I heavily recommend that you reboot your system after applying all those steps before continuing with your daily usage to make sure all changes have been applied.&lt;/p&gt;

&lt;p&gt;The next article will be all about the transition from Windows to Linux and what to look out for before setting up dual boot to ensure that you don't regret the entire process.&lt;/p&gt;

&lt;p&gt;If you notice I've missed anything, or have any suggestions, make sure to let me know in the comments!&lt;/p&gt;

</description>
      <category>ubuntu</category>
      <category>linux</category>
      <category>bash</category>
      <category>archlinux</category>
    </item>
    <item>
      <title>Part 2: Which distro should I choose when moving to Linux?</title>
      <dc:creator>Proman4713</dc:creator>
      <pubDate>Fri, 19 Jul 2024 09:24:33 +0000</pubDate>
      <link>https://forem.com/proman4713/part-2-which-distro-should-i-choose-when-moving-to-linux-496h</link>
      <guid>https://forem.com/proman4713/part-2-which-distro-should-i-choose-when-moving-to-linux-496h</guid>
      <description>&lt;h6&gt;
  
  
  For part 1, see &lt;a href="https://dev.to/proman4713/part-1-why-should-developers-use-linux-2884"&gt;this article&lt;/a&gt;
&lt;/h6&gt;

&lt;p&gt;Hello again! And welcome back to my "Leveraging Linux for Development" series. This is part 2, and we'll talk about what Linux distributions are the best option for newbies who want to move to Linux from Windows or MacOS!&lt;/p&gt;

&lt;p&gt;So first, let's pick a distro family that is both popular and has wide support. Most people would consider those to be the &lt;a href="https://en.wikipedia.org/wiki/Fedora_Linux" rel="noopener noreferrer"&gt;&lt;em&gt;Fedora&lt;/em&gt;&lt;/a&gt; and the &lt;a href="https://ubuntu.com/desktop" rel="noopener noreferrer"&gt;&lt;em&gt;Ubuntu&lt;/em&gt;&lt;/a&gt;/&lt;a href="https://www.debian.org/" rel="noopener noreferrer"&gt;&lt;em&gt;Debian&lt;/em&gt;&lt;/a&gt; (Ubuntu is based on Debian) families.&lt;/p&gt;

&lt;p&gt;The key difference between the Fedora and Ubuntu/Debian families is who they are for:&lt;/p&gt;

&lt;p&gt;The Fedora family is for developers who need the absolute latest features and are okay with having to update their software really often, the Fedora family is ideal for experimenting with new technologies that &lt;strong&gt;involve some risk&lt;/strong&gt;.&lt;br&gt;
The Ubuntu/Debian family is for users who want a much larger support community (Ubuntu is by far the most popular Linux distro) and long-term stability in their OS. The Ubuntu/Debian family is ideal for &lt;strong&gt;production environments and long-term projects&lt;/strong&gt; that need to be stable for the longest time possible.&lt;/p&gt;



&lt;p&gt;Personally, I think the Ubuntu/Debian family is what most newbies would be looking for since it is more familiar to Windows and MacOS users and is more stable and risk-free.&lt;/p&gt;

&lt;p&gt;Ubuntu is a child of Debian, but Ubuntu is the most popular distro &lt;em&gt;based on&lt;/em&gt; Debian. Which leads many people to call the entire family Ubuntu/Debian.&lt;/p&gt;

&lt;p&gt;We'll compare three Ubuntu/Debian-based derivatives to get a clearer view of what we have at hand:&lt;/p&gt;
&lt;h2&gt;
  
  
  Ubuntu
&lt;/h2&gt;

&lt;p&gt;As I've said, Ubuntu is based on Debian. It's developed by &lt;a href="https://canonical.com/" rel="noopener noreferrer"&gt;&lt;em&gt;Canonical&lt;/em&gt;&lt;/a&gt; and has a &lt;a href="https://ubuntu.com/about/release-cycle" rel="noopener noreferrer"&gt;release cycle&lt;/a&gt; of a new LTS (Long-Term Support) Release every 2 years in April and an Interim Release every 6 months between LTS Releases. Interim Releases are "supported for 9 months, with sufficient time provided for users to update, but these releases do not receive the long-term commitment of LTS releases." While LTS Releases are supported for 5 years (and up to 12 years with Ubuntu Pro). This means that you will not have to update very often and can stably use Ubuntu.&lt;/p&gt;

&lt;p&gt;Ubuntu supports different &lt;a href="https://ubuntu.com/desktop/flavours" rel="noopener noreferrer"&gt;&lt;em&gt;flavours&lt;/em&gt;&lt;/a&gt;. The default "Ubuntu" distribution uses the GNOME desktop environment, while other flavours use other desktop environments: Kubuntu (KDE), Xubuntu (XFCE), Lubuntu (LXQt), etc.&lt;br&gt;
Ubuntu uses the Snap Store (in its own GUI interface called "Ubuntu Software") by default for installing apps. While many people complain that the Snap Store is slowing down their PC, the &lt;strong&gt;next article&lt;/strong&gt; of this series will deal with that.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/q5yM4ZYwB_s"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Linux Mint
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://linuxmint.com/" rel="noopener noreferrer"&gt;&lt;em&gt;Linux Mint&lt;/em&gt;&lt;/a&gt; is based on Ubuntu itself, and it has a release cycle based on Ubuntu's release cycle with versions being released a few months after their Ubuntu counterpart. The Linux Mint major version number is based on the XX.04 version number of its underlying Ubuntu Version (e.g. Linux Mint 20 is based on Ubuntu 20.04 LTS) and the minor version number is based on the underlying Ubuntu point-release version (e.g. Mint 20.1 is based on Ubuntu 20.04.1).&lt;/p&gt;

&lt;p&gt;Linux Mint is focused on providing a traditional desktop experience. It uses the Cinnamon desktop environment by default, which is supposed to resemble Windows the most, and also supports MATE and XFCE. Linux Mint uses the Snap Store far less than Ubuntu, its minimal use of Snap packages does degrade performance a little but this will also be addressed in the next article. It also has its own "Software Manager". It's pretty much ideal for users who prefer a more traditional desktop environment and great for users transitioning from Windows due to its similarity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Elementary OS
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://elementary.io/" rel="noopener noreferrer"&gt;&lt;em&gt;Elementary OS&lt;/em&gt;&lt;/a&gt; is another Ubuntu-based Linux distro, and it does &lt;strong&gt;not&lt;/strong&gt; have a fixed release cycle. Updates are released whenever they are ready, which could be unexpected and chaotic for some people and &lt;strong&gt;could cause having to get a fresh reinstall.&lt;/strong&gt; Since Elementary OS is based on Ubuntu LTS, it has the same stability and long-term support benefits, but the exact support period is usually shorter and not explicitly defined by Elementary.&lt;/p&gt;

&lt;p&gt;ElementaryOS is focused on being user-friendly with out-of-the-box usability. It uses the Pantheon desktop environment by default, which is emphasised by aesthetics and minimalism, and &lt;strong&gt;does not support any other desktop environments.&lt;/strong&gt; Elementary uses its own "App Center" by default for installing curated applications. It's ideal for users who value design and people looking for a macOS-like experience on Linux.&lt;/p&gt;




&lt;p&gt;All these distributions use the &lt;a href="https://en.wikipedia.org/wiki/APT_(software)" rel="noopener noreferrer"&gt;&lt;em&gt;APT&lt;/em&gt;&lt;/a&gt; (Advanced Package Tool) package manager for installing dependencies on your system.&lt;/p&gt;

&lt;p&gt;While Elementary seems promising, Elementary has a more restricted experience which I don't prefer myself.&lt;br&gt;
Mint is too similar to Windows (Which is exactly what I'm running away from) and seems to lack multiple features that need to be installed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For most newbies,&lt;/strong&gt; Ubuntu would be the solution as it provides a new interface, but a familiar feel to Windows and MacOS users.&lt;/p&gt;

&lt;p&gt;This series will continue using Ubuntu as a demonstration and &lt;em&gt;could get articles for other distros after.&lt;/em&gt; Both Elementary and Mint are based on Ubuntu, which means that there should not be too many differences when it comes to applying steps from Ubuntu. You can just do whatever floats your boat!&lt;/p&gt;

&lt;p&gt;And that's it for this article, I hope that I've made a proper introduction to reasonable distro options for new Linux users. If you have any suggestions or questions please let me know in the comments!&lt;/p&gt;

&lt;p&gt;The next article will be about installing Ubuntu and customizing it to maximally boost the performance and user experience as well as solving common issues such as slow system boot time!&lt;/p&gt;

&lt;p&gt;And, as always, Happy Hacking!&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ubuntu</category>
      <category>archlinux</category>
      <category>bash</category>
    </item>
    <item>
      <title>Part 1: Why should developers use Linux?</title>
      <dc:creator>Proman4713</dc:creator>
      <pubDate>Thu, 18 Jul 2024 23:13:24 +0000</pubDate>
      <link>https://forem.com/proman4713/part-1-why-should-developers-use-linux-2884</link>
      <guid>https://forem.com/proman4713/part-1-why-should-developers-use-linux-2884</guid>
      <description>&lt;h3&gt;
  
  
  Note: This is the first part of an entire series on Linux and how to comfortably move to it, as well as things I have not been told when first moving to Linux.
&lt;/h3&gt;




&lt;p&gt;I've been using Windows for my whole life, and so have my parents, and my brothers, and my friends, and my family. Literally &lt;strong&gt;everyone&lt;/strong&gt; uses Windows, and while this is not particularly a &lt;em&gt;bad&lt;/em&gt; thing, it's a little bit of a pity...&lt;/p&gt;

&lt;p&gt;Windows is a "good" operating system and all, but it always had some issues that will never get fixed because Microsoft's goals are not targeted at such issues. Especially in the recent times, people have been complaining about Windows 11 causing performance issues on their old hardware, about having to pay for the Windows license or pirate it (both are annoying tasks for most), and more!&lt;br&gt;
And with Windows 10's End Of Life coming closer, people have been looking for an &lt;strong&gt;alternative&lt;/strong&gt; that can run on their old hardware!&lt;/p&gt;

&lt;p&gt;The only other two options are MacOS and Linux, and for most people who don't want to get a new PC or want a free solution, Linux is the answer.&lt;/p&gt;

&lt;p&gt;Now, when it comes to Linux, many people have doubts because they haven't ever used or seen it before. Most think that Linux would probably be a messy terminal window that can only be controlled through commands!&lt;/p&gt;

&lt;p&gt;While this is far from the truth, especially considering that there is no one "Linux", I'm here to introduce the power of Linux to &lt;strong&gt;developers,&lt;/strong&gt; so now that you understand the context behind this series, let's dive in:&lt;/p&gt;

&lt;h3&gt;
  
  
  "Which distro should I use?"
&lt;/h3&gt;

&lt;p&gt;This is a question that I see stump many people due to the vast number of options, but before we ask that question, we should first focus on today's question: "Is Linux even for me?"&lt;/p&gt;

&lt;p&gt;Linux "distros", or distributions, are simply different builds (with their own UI, desktop environment, shell tools, etc) of the same Linux kernel. Think of distros like hundreds of books in a giant library, &lt;strong&gt;everyone has a book in there that suits them!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Linux Mint is supposed to resemble Windows a lot, while Ubuntu resembles MacOS but can very easily be customized to look like Windows too... There are many options, but overall, any Linux distro has many reasons for you to use them instead of your current OS...&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;After specific customizations depending on your distro, Linux is much more performant than Windows and MacOS, &lt;em&gt;especially&lt;/em&gt; when it comes to development (specific benchmarks and statistics will be in the fifth article of the series).&lt;/p&gt;

&lt;h2&gt;
  
  
  FOSS
&lt;/h2&gt;

&lt;p&gt;Linux is "Free and Open-Source Software", there is no price tag on &lt;strong&gt;anything&lt;/strong&gt; that you need to use Linux!&lt;/p&gt;

&lt;h2&gt;
  
  
  Customizability
&lt;/h2&gt;

&lt;p&gt;Linux is much more customizable than Windows and MacOS combined. From the fact that there's a distro for every need to the fact that you can easily change your system boot scripts, Windows and MacOS have never reached the level of customization that Linux has with so much accessibility!&lt;/p&gt;

&lt;p&gt;If there's anything in your Linux distro that feels — "odd" — because it's dramatically different from what you have in your current OS, there's &lt;em&gt;always&lt;/em&gt; (and I mean always) a way to change it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Package sizes
&lt;/h2&gt;

&lt;p&gt;While Windows and MacOS come preinstalled with all the low-level binaries you could imagine even if no one ever uses them, most Linux distros only come with the "dependencies" that just give you a good experience, if any application or script needs any more binaries it can just use them as dependencies and they will be installed just for this specific script. This leads to smaller disk space taken after you install a fresh installation of a Linux distro, and mostly smaller space needed for a specific program to install (This largely depends on the distro of course, but this is true for most distros after you customize them to boost their experience, which is going to be explained in the third article of this series)&lt;/p&gt;

&lt;h2&gt;
  
  
  Bloat-free
&lt;/h2&gt;

&lt;p&gt;Windows is &lt;strong&gt;full&lt;/strong&gt; of bloatware, a simple example is when your PC is freezing and the top bar of apps (as well as the alt+tab UI) switch to the Windows 7 UI, can anyone tell me what this thing is doing there?&lt;/p&gt;

&lt;p&gt;Linux is relatively clean of bloat, there are no huge useless chunks of code or code from older versions on most Linux distros. MacOS has done a little better job at decreasing bloatware than Windows, but it's not lightweight by any means.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Windows is fine for most people, but for people who want a truly &lt;em&gt;free&lt;/em&gt; experience with &lt;strong&gt;full control&lt;/strong&gt; over their computers, Linux is the better choice.&lt;br&gt;
Even though Windows occupies more than &lt;strong&gt;70%&lt;/strong&gt; of the OS market, Linux still has good support for the services you need!&lt;br&gt;
Linux is free, open source, lightweight, performant, and customizable. Which means you'll most likely find a Linux distribution that fits your needs and wants.&lt;/p&gt;

&lt;p&gt;Even though Linux technically has less support than that of Windows and MacOS, the only way more support and products will be brought to it is if more people use it, which means more companies and projects would need to put Linux into account!&lt;/p&gt;

&lt;p&gt;And that's it for today everyone, next article will be about which distro you should choose based on your needs.&lt;/p&gt;

&lt;p&gt;And as always, Happy Hacking!&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ubuntu</category>
      <category>bash</category>
      <category>archlinux</category>
    </item>
    <item>
      <title>A little whiff of Cybersecurity</title>
      <dc:creator>Proman4713</dc:creator>
      <pubDate>Thu, 18 Jul 2024 14:21:16 +0000</pubDate>
      <link>https://forem.com/proman4713/a-little-whiff-of-cybersecurity-2hde</link>
      <guid>https://forem.com/proman4713/a-little-whiff-of-cybersecurity-2hde</guid>
      <description>&lt;p&gt;For the past year, I've been working on a React Native mobile app for schools in my governorate to use. And this app was going to be responsible for things including students' attendance grades. So it could mean a lot if such data was forged or changed illegitimately...&lt;/p&gt;

&lt;p&gt;For the majority of the time I spent writing this app, its API, and its website, I had not a single thought about whether or not this system was any secure. And this was because of one crucial mistake that you should never make when creating apps or systems:&lt;br&gt;
&lt;strong&gt;Don't suppose that your API will be used correctly!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's right, the first thing you should do when making your projects secure is think of how your API (or anything that communicates with your app's backend or database) could be used out of proper context, misused maliciously, or even just accidentally used improperly!&lt;/p&gt;

&lt;p&gt;One common example in which I see friends making this mistake is when they make an API endpoint that changes data in the database, and their front-end uses that endpoint whenever the user makes a change. But they never think about how that same API endpoint could be called outside of the application and misused maliciously without the legitimate user's permission.&lt;/p&gt;

&lt;p&gt;So, considering my "API" was made on &lt;a href="https://workers.cloudflare.com/" rel="noopener noreferrer"&gt;&lt;em&gt;Cloudflare Workers&lt;/em&gt;&lt;/a&gt;, I needed a simple way to make it secure that would work on serverless functions like Workers. So my first step was to move from the web editor to &lt;a href="https://developers.cloudflare.com/workers/wrangler/" rel="noopener noreferrer"&gt;&lt;em&gt;Wrangler CLI&lt;/em&gt;&lt;/a&gt; to be able to install compatible NPM packages to my project. Then I wrote this workflow of account authorization:&lt;/p&gt;

&lt;h2&gt;
  
  
  Registration
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;User enters their username, email and password in the registration form&lt;/li&gt;
&lt;li&gt;User client generates a new Public/Private &lt;a href="https://en.wikipedia.org/wiki/RSA_(cryptosystem)" rel="noopener noreferrer"&gt;&lt;em&gt;RSA&lt;/em&gt;&lt;/a&gt; 4096-bit Key Pair and keeps them aside&lt;/li&gt;
&lt;li&gt;User client encrypts the password with the &lt;strong&gt;server&lt;/strong&gt;'s public key as well as a &lt;a href="https://en.wikipedia.org/wiki/Cryptographic_nonce" rel="noopener noreferrer"&gt;&lt;em&gt;nonce&lt;/em&gt;&lt;/a&gt; (number used only once)&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User client sends the username, email, encrypted password, the nonce, and the newly-generated public key to the server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Server decrypts the &lt;code&gt;password + nonce&lt;/code&gt; with its own &lt;strong&gt;private key,&lt;/strong&gt; then strips the decrypted value of the &lt;code&gt;nonce&lt;/code&gt; provided by the user&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The nonce is then stored so that if the same nonce is used ever again, it can reject the request. This is to prevent &lt;a href="https://en.wikipedia.org/wiki/Replay_attack" rel="noopener noreferrer"&gt;&lt;em&gt;Replay Attacks&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Server makes sure the account doesn't already exist&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Server generates a new account ID for the user (this is just for users to identify each other and is not related to the security of the system)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Server generates a &lt;a href="https://auth0.com/blog/adding-salt-to-hashing-a-better-way-to-store-passwords/" rel="noopener noreferrer"&gt;&lt;em&gt;Salt&lt;/em&gt;&lt;/a&gt; and appends it to the password. The server then hashes the password using the new salt. It stores both the hash and the salt on the database&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The server then generates a new &lt;a href="https://www.geeksforgeeks.org/advanced-encryption-standard-aes/" rel="noopener noreferrer"&gt;&lt;em&gt;AES&lt;/em&gt;&lt;/a&gt; encryption/decryption key, generates a new &lt;a href="https://jwt.io/introduction" rel="noopener noreferrer"&gt;&lt;em&gt;JWT&lt;/em&gt;&lt;/a&gt;, encrypts that JWT with the new AES Key, and keeps the encrypted value aside&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The server encrypts that same original JWT with its own &lt;strong&gt;public key&lt;/strong&gt; and stores it in the database&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The server finally saves the new user with their name, ID, hashed password, and salt, then adds a new session to that user that contains their public key and an encrypted version of the newly-generated AES Key&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Server responds back to the client with their new session token (encrypted), AES Key (encrypted), and the &lt;a href="https://en.wikipedia.org/wiki/Initialization_vector" rel="noopener noreferrer"&gt;&lt;em&gt;IV&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Client decrypts their AES Key, their token using the provided IV. And the client finally saves this data and the registration process is successful!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;PHEW!&lt;/em&gt;&lt;/strong&gt; This was a lot, I understand. Especially for people who are new to this stuff, this could require re-reading. But if you have any questions let me know in the comments!&lt;/p&gt;

&lt;p&gt;Now for the login proc— Nope I'm just kidding, I'm not writing all that again 😅&lt;br&gt;
However, I'm gonna subtly go through the other process real quick for those who want to read more:&lt;/p&gt;

&lt;h2&gt;
  
  
  Login
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Same password and nonce relationship as before&lt;/li&gt;
&lt;li&gt;Non-nonced password is hashed using the same salt stored on the database&lt;/li&gt;
&lt;li&gt;If the hashes match, the user is authorized&lt;/li&gt;
&lt;li&gt;Generate a new AES Key, and JWT token and do the same response process as with the registration&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Load Data
&lt;/h2&gt;

&lt;p&gt;This is for the client to make sure it's still authorized and show data about the user (e.g. profile picture, bio):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Client sends encrypts its saved JWT token with its saved AES Key. It sends its public key, user ID and the IV as well to the server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The server checks if an account with this user ID and session with such a public key exists&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The server decrypts the JWT using the provided IV and the saved AES Key&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The server validates the JWT token using various checks to ensure that the token is valid (These checks, besides the signature check, differ from app to app)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If all goes well, respond with the User Data&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Logout
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The client sends its user ID, public key, session token (encrypted with the AES Key), and the used IV to the server&lt;/li&gt;
&lt;li&gt;Server checks if an account with this user ID and session with such a public key exists.&lt;/li&gt;
&lt;li&gt;The server decrypts the JWT and verifies it as before&lt;/li&gt;
&lt;li&gt;The server deletes the found session from the database and the client logs itself out&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For any other processes that require Authorization, do the same validation steps as the Load Data process (in addition to any process-specific validations) to verify the user!&lt;/p&gt;

&lt;p&gt;I understand this could feel a little overwhelming, but no worries, a couple of YouTube videos can get you well started in the realm of Cybersecurity! I myself am still learning Cybersecurity at the time of writing this, I'm not an expert and I don't claim to be. This was just the security model that I found resonated most with my needs, you can change it however you like, or come up with an entirely different structure!&lt;/p&gt;

&lt;p&gt;However, &lt;strong&gt;if you want to get started in this field for absolutely free,&lt;/strong&gt; I recommend watching the &lt;a href="https://www.youtube.com/playlist?list=PLhQjrBD2T383Cqo5I1oRrbC1EKRAKGKUE" rel="noopener noreferrer"&gt;&lt;em&gt;CS50's Introduction to Cybersecurity&lt;/em&gt;&lt;/a&gt; course on YouTube. CS50 is a group of teachers at Harvard that introduces absolute beginners to the world of computer science. They have been most helpful to me, I don't think I would've continued in the field of computer science without their courses. So check them out!&lt;/p&gt;

&lt;p&gt;Put any suggestions you want down in the comments, and happy hacking!&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>api</category>
      <category>javascript</category>
      <category>reactnative</category>
    </item>
    <item>
      <title>Console Styling in JavaScript with a few kilobytes</title>
      <dc:creator>Proman4713</dc:creator>
      <pubDate>Thu, 18 Jul 2024 00:37:30 +0000</pubDate>
      <link>https://forem.com/proman4713/console-styling-in-javascript-with-a-few-kilobytes-2gjn</link>
      <guid>https://forem.com/proman4713/console-styling-in-javascript-with-a-few-kilobytes-2gjn</guid>
      <description>&lt;p&gt;I don't know about &lt;em&gt;you&lt;/em&gt;, but I like to keep my console logs in my JavaScript projects look good. And since not all terminals support emojis, what better way do I have than colouring the console output?&lt;/p&gt;

&lt;p&gt;Well, you can go about it by googling the &lt;a href="https://en.wikipedia.org/wiki/ANSI_escape_code" rel="noopener noreferrer"&gt;ANSI escape code&lt;/a&gt; for each console style that you want. Or maybe memorize some of them from a page like &lt;a href="https://www.w3docs.com/snippets/javascript/colors-in-javascript-console.html" rel="noopener noreferrer"&gt;W3Docs&lt;/a&gt;. But I love making my logs look good, I'm definitely not a person who can memorize lots of stuff, and I like to have one way that works &lt;strong&gt;everywhere.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Well, I usually only use colored logs for JS, so no need for something that works literally everywhere. But at least something that works wherever there's JavaScript involved.&lt;/p&gt;

&lt;p&gt;So I decided to write my own script that contains every possible ANSI escape code that I could ever possibly need, in the form of functions. But then I realized it would be annoying to copy the same script over and over again in all my projects. So, as a person who never worked with an npm command besides &lt;code&gt;npm i&lt;/code&gt; and init, I decided to learn more and create a private NPM package that I could just install in my projects (or clone its GitHub repository for non-NodeJS projects).&lt;br&gt;
I didn't want to deal with NPM authentication every time I installed the package, so I just made it public.&lt;/p&gt;

&lt;p&gt;And that's what we're here for today: &lt;a href="https://www.npmjs.com/package/javascript-console-styling" rel="noopener noreferrer"&gt;javascript-console-styling&lt;/a&gt; is a package that I made to ease this process on me.&lt;/p&gt;

&lt;p&gt;Indeed, similar packages to mine have been made before (which is a fact that I had only realized after making it). But I noticed that my own solution was still better for me, or anyone like me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;My package took only 14KB of space, according to npm. While other similar packages took up to &lt;strong&gt;50 times&lt;/strong&gt; the same amount (more than 500 kilobytes). Even though they're both under a megabyte, it's still better to have a smaller package because you can manage all of its files easily (or even fork it and modify it easily if you wish)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My package could nest different styles and decorations since they are functions... And even if you have an entire styled string that contains a substring with a different style then you could just concatenate the substring (including the substring inside the parent string will stop any styles from applying after it due to the reset that each styling function does)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My package had easy testing tools that showed all possible colour and decoration combinations so that users could verify its output in their terminal (Test functions are not included in the default package, but are available on the NPM page and on GitHub)&lt;br&gt;
Example test:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fki6bt5lvbe4lbcrncsrn.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%2Fki6bt5lvbe4lbcrncsrn.png" alt="All available colours" width="245" height="591"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0r1rgk6jw9uxvsuy0f22.gif" 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%2F0r1rgk6jw9uxvsuy0f22.gif" alt="All available decorations, the eighth one is " width="245" height="169"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy439cad9qfhlzxxdqc1i.gif" 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%2Fy439cad9qfhlzxxdqc1i.gif" alt="All available decoration/colour style combinations" width="360" height="620"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhvmily462ti5fu0h5h6.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%2Fmhvmily462ti5fu0h5h6.png" alt="The first block of those two is hidden" width="370" height="179"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So overall, I prefer to use my own code. But a part of owning a public package is making sure people know how it can help them so that they can choose for themselves if they need it.&lt;/p&gt;

&lt;p&gt;I don't think this will be the last NPM package I create, but it was a good way to get me motivated about the entire NPM thing!&lt;/p&gt;

&lt;p&gt;Make sure to check out the package, and happy hacking!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>cli</category>
      <category>npm</category>
      <category>github</category>
    </item>
  </channel>
</rss>
