Deep Dive Articles

The Best Way to Learn a New Programming Language from Scratch - How I Approach and Learn Any Programming Language Efficiently

Preface: The following article is based on my experiences and opinions on learning programming languages. I have been learning about computers in-depth and find learning languages with specific purposes useful. For example, Python was for beginning, C is for memory management and Rust is for learning to write memory-safe code in my case. This time, I started learning Golang which is known for its simple syntax and powerful performance, and widely known for its awesome concurrency.

Why More is Not Always Good in Terms of Software - Words on Cross Platform Utilities, Bash-ism, and POSIX Compliance.

Preface: This article is about my views on software compliance and cross-platform support, and reflects my opinions and experience with the subject. Your experience and opinions may vary, which I respect. What I am Specifically Talking About? I am going to talk about the issues caused by non-compliant software and why more features are not always good, especially in the case of the upgrade of tools on a single platform.

Why I Shifted From Arch Linux to Debian Linux?

Preface: The following article is based on my personal experience with Arch Linux and Debian Linux. While I appreciate both distributions for their unique strengths and different use cases, the information provided reflects my own opinions and experiences. Your experiences may vary. What was I going for Initially? Bit of my Story as a Beginner Linux User When I started using Linux, I was going through security stuff and learning computer security when I was in my High School.

Tmux is the Ultimate Choice for Power Users - An Awesome Terminal Multiplexer for Managing Persistent Sessions

What is Tmux? Tmux is a Terminal Multiplexer Application for Linux and MacOS for managing terminal sessions and Windows. It is to be mentioned that Tmux is not a terminal emulator, instead, it’s a terminal application, a binary that allows you to stay productive over your terminal. It doesn’t matter which terminal emulator you are using (although I recommend the Suckless Terminal). The functionality of managing Windows and the session doesn’t happen on the desktop GUI side but on the terminal session, you are working with.

The Concept of RSS Feed - A Reliable Way for Publishers and Subscribers Model

Preface: I have been looking for simple solutions in nearly everything related to computing. A lot of software designed these days is not designed per your requirements but as per companies’ profit. Hence, most of these solutions end up sucking your time and energy and need to be replaced by more optimised solutions that would boost your productivity in the right way. RSS Feed is something that I found after searching for solutions related to subscribing to websites or creators without sucking much resources and design that is reliable to the user itself.

Breaking RSA Encryption on Hardware Devices with Side Channel Power Analysis — Leaking the Private Key by Exploiting Square-Multiply Algorithm

Preface: This article is about leaking the private key from hardware devices that implement RSA encryption which is part of hardware hacking. The author is not responsible for any damage caused by the given information. It is recommended to be careful while performing these attacks as they can damage the hardware or even destroy it. All the information provided here is for educational purposes. There are no such prerequisites for understanding the theory, although knowledge about modular arithmetic, basics of encryption mathematics, basic electronics, etc.

Serious Reconnaissance with Unmanned Aerial Vehicles — Mapping Out Devices in an Area with Drones

Introduction: The following content is for educational purposes and for hackers living in basements knowing enough ethics. The author is not responsible for any damage caused by the knowledge provided here and does not support anything like that. It’s essential to check out the rules in the area of reconnaissance about the tactics provided here and the use of materials (unless and until there is any apocalypse and a solid recon is required).

The Fundamentals of Hardware Hacking — Breaking and Reverse Engineering Smart IoT Devices

Disclaimer — This is an introductory article about Hardware Hacking and Security of IoT Devices. None of the mentioned information or techniques are intended for any illegal purposes and the author is not responsible for any damage. It’s advisable to experiment on devices that you own or have explicit permission to do so. Rest of all, hardware hacking is fun! The Beauty of Electronic Devices In the ever-growing world of smart devices and the connectivity of things to the internet, life has become more convenient than ever.

Setting Up a Remote Git Server — A Simple and Concise Step-by-Step Guide to Host a Private Git Server

Preface: This is a concise and simple guide to hosting a remote git server. I have been researching this topic for a while and came up with the idea of writing an article with a step-by-step guide for hosting a private git server. Covering all the aspects of git is not possible in a single article, so it’s assumed that the reader has prior knowledge of git and version control.

The Nature of Linux Kernel Development — Difference Between Rules of Kernel Level and User-Space Application Level

Preface: This article is intended to explain a clear distinction between the core principles of Linux Kernel Development and User-Application Level Development. The provided information is based on my research on Kernel Development through various sources and I have tried to make it as accurate as possible. Efforts have been made to explain it as simply and concisely as possible. Introduction to the Nature of Linux Kernel Linux Kernel is the abstraction layer between the Operating System and the Hardware in the system.

Linux Process Scheduling — The Reason your Linux System Processes so Efficiently (Kernel Perspective)

Preface: I was going through the book “Linux Kernel Development” by Robert Love, one of the best books I have referred to for low-level stuff and understanding the workings of Linux. I study this book with intensity, simplify the concepts and write it down here so that the readers can get a straightforward description and all they need to know about the topic. Covering the whole Linux Process Scheduling is not possible and is not the goal of this article.

Linux Processes — A Kernel’s Perspective Explained with Clarity and Simplicity

Preface: I have been going through the book “Linux Kernel Development” by Robert Love which I highly recommend for understanding the Linux Kernel in depth. I decided to write this article to explain “Linux Processes” simply and concisely. The topic itself is broad and is not explained into the deepest of it, but essential for Linux Administrators, Developers and even Linux users to appreciate the beauty of the Kernel they make use of every day.

NGINX for Deploying Next.js Application on AWS EC2 with AWS ELB — Control and Stability of Deployments

I was looking for an article like this a few days ago, which I didn’t find at that time, so I did the deployment on my own and came up with this article to prevent other developers from saving those efforts and focusing on development. I am not explaining every single step and have provided links for references. I prefer manual deployment of applications over automated (and even serverless) methods. Although they are convenient and require less effort by the developers, they are bound to the providers and offer less control over the underlying system.

Configuring and Building the Linux Kernel — Absolute Guide to Compiling Your Kernel

Linux Kernel is an Open-Source Software and the user is free to modify and customise it as per the requirements. The modification of the Kernel requires a deep understanding of the working of the Kernel, although patches are available to make the Kernel optimised for specific hardware. Linux Kernel Source Code has various options to configure the drivers, modules, preferences on hardware options, etc. This part can be studied by the user and is pretty much easy to work with.

The Elegance of the Linux Kernel — A Concise History of Unix and the Creation of the Linux Kernel

Introduction and Context I was going through the book “Linux Kernel Development” by Robert Love, an absolute guide to getting started with Linux Kernel Development and a highly recommended book for understanding the core of the Linux Kernel. Linux Kernel has been one of the most important software ever written and is even considered one of the biggest projects ever undertaken by a single person. The idea of the Linux Kernel was initiated by Linus Torvalds, a student from the University of Helsinki and is maintained by him to date (while writing this article).

Linux Shell Scripting — A Suckless and Concise Guide to the Command-line of Linux

Prior Statements: This is a concise guide on the Linux Shell Scripting while consolidating all the facts about the Linux Shell for quick developer’s reference while using Linux. I am referencing the Bash (Bourne-Again Shell) which is the default shell for Linux-based systems. I will also be providing references and external links to dive into depth and not fill the article with too much explanation about a single topic which is not universally required by all the readers.

Suckless Utilities for Arch Linux — The Most Minimal Way Run a Computer

Suckless utilities have been my favourite at this time and kind of essentials for my use of the computer. I have been using Arch Linux for a fair amount of time now and I started using it with XFCE for few weeks. I would appreciate the XFCE desktop environment for it’s smoothness and light-weight nature with works really fine when newly shifting on Arch Linux. But then I learnt the suckless ecosystem and eventually shifted to it as my full-time environment.

Installing Pacman in Arch Linux — When You Blow it Up

Let me suckless and divide the article into two parts: My story how I blew up Pacman Package Manager How to reinstall the Pacman Package Manager If you only care about the second part, skip the first one. The Scenario — Blow it Up I was trying to install the pacman game from the Internet to get it running on my Arch Linux Terminal (I use Suckless Terminal BTW). When I got it installed and played it, it was super awesome.

Boot Process of Computers — A Learner’s Perspective Of Exploring the Depth of Computers

Prior Clarifications: Here, I will be providing a philosophical explanation about the bootloaders and understanding them in a simple and as minimal way as possible. This is not supposed to be a manual for bootloader or provide any advice for experimenting over your live system. It’s my journey to understand computers (one of the most complex creations of mankind) and I will be stating my thoughts. Take it with a pinch of salt.

Networking Fundamentals for Linux Administrators — A Suckless and Concise Explanation

Statistics are clear on the fact that 96.3% (while writing this article) of the servers use Linux as their Operating System which is no doubt what every other Linux user on this Earth expects. I believe that the Linux Administrator has to take the shot about the configuration of Networking in Linux Based Server. Some of the underlying concepts remain the same for any other distros but it is mainly intended for Linux.

Operating Systems and Low-Level Access to the Hardware — Why should you learn it?

Today, I completed the whole read of the book “Linux Kernel in a Nutshell” by Greg Kroah-Hartman and I highly recommend that you go through it if you want to understand how to build your custom configuration of Linux Kernel and all you need to know about all the nuts and bolts. It’s always great to have such handbooks around the desk. This blog is about why it’s so awesome to look into the operating system you are using with your hardware and why have a grasp on the Low-Level aspects of a computer.

Arch Linux Custom Builds — Freedom of the Operating System

While writing this blog, I was reading the book “Linux Kernel in a Nutshell” by Greg Kroab-Hartman and as far as the pages of the book are concerned, it seems to be a two-day read (this is a handbook so reading it once and having around the desk is super useful). By the way, the author has the book left open for download http://www.kroah.com/lkn/ so check that out if you want to follow up.

Bypassing the Linux Login to access the files (with Physical Access), even the root!

Imagine being away from the computer for a couple of minutes and getting to know that the system has been compromised and a backdoor has been installed into the system. “The system was locked?” doesn’t matter, without the bios security implementation (which most probably would not be implemented), all the files can be recovered without any login made to the Login Screen. This goes with the story of me trying to get my Wi-Fi troubleshooting in Arch Linux where I was trying to upgrade the Kernel of my System to get the Wi-Fi working properly (as mentioned in the previous blog.

The Best Way to Learn a New Programming Language from Scratch - How I Approach and Learn Any Programming Language Efficiently

Planted June 4, 2024

Preface: The following article is based on my experiences and opinions on learning programming languages. I have been learning about computers in-depth and find learning languages with specific purposes useful. For example, Python was for beginning, C is for memory management and Rust is for learning to write memory-safe code in my case. This time, I started learning Golang which is known for its simple syntax and powerful performance, and widely known for its awesome concurrency. This time, I considered documentation on how I approach new programming languages when I have a requirement, such as for projects or work-related purposes. Note that your experiences and opinions may vary; I greatly respect that.

The Motivation to Learn a Programming Language

There are a lot of languages out there which are built for specific purposes and when you are working on diverse projects, it’s often necessary to learn a new programming language to make the best out of it. Some languages are easy to learn and few are mind-numbingly tough to understand. A few of them start harder and once you grab that one or two concepts, it becomes better (like Rust) and you start loving it despite it being different. Some start really easy and end up tougher and tougher (like C). In both cases, experience is the key. In this article, I will be focusing on the very beginning stage of learning a new programming language, just before you start working on that specific project you need to get done. Trust me, it’s always easier to learn a new programming language when you are comfortable with one or more before learning that new language. Learning programming languages is just about learning how to talk with the computer with new syntax (and often with newer methods of managing resources and stuff, like borrow-checker in Rust and manually managing memory in C). But most of all, it’s just about learning how computers interact and work upon a given piece of code. To start learning a new language, you must start with a motivation to learn the language. Like why do you want to get that one language in your skillset? You need a strong reason to learn that new language. Learning a lot of languages without knowing why you learned all of them doesn’t make you a good software engineer. If you don’t have a strong reason to learn that new language, leave it. You should practise and build upon your existing knowledge. But if you have got a strong reason to learn that new language, keep that one thing in your mind and then start working with it. In my case, I was going to learn golang because of its simplicity and concurrency. Let me be honest, I never learned to write concurrent code and I just wanted to get started with learning to program software that can work with multiple processes in parallel and make my programs faster. Golang is one of the best languages to get started with learning concurrency and while I was writing this article, I already learned about go routines, channels and pipelines. And in a few days with practice, it would be easier for me to use concurrency in my programs.

The Best Resource to Start With

The very best resource to start learning a programming language is to start with its official documentation. I know videos and bootcamp lectures are comforting and you understand what’s happening around there, but reading is the single best resource that has helped me learn multiple programming languages. You have to put that habit of sitting for hours, staring at the screen and scrolling documentation all along while copying, pasting and modifying existing code into your code editor and running it. This helps you get hands-on experience and understand the behaviour of that language. Trust me, watching or just reading would not make you better at that language, writing and analysing behaviour of it would do it. When you see a snippet of code in the documentation, read and try to understand it. Execute it and analyze its behaviour. Move ahead and experiment with it. Add more code to it. Don’t worry when it crashes, you are still a beginner. When you are stuck somewhere, and the documentation is failing you to explain that, fire up your search engine and search for resources. You need to keep your hand on the keyboard and work on it. The reason why I recommend using documentation is that it’s made by the official people who built the language itself or is maintained by the organisation that developed the language. They want you to understand the language and use it. They want as many people to use it and make it popular. So they give a lot of effort and make sure to reduce as much as friction possible to make you understand it. These documentations are free to use and anybody can access them. So there is no monetary friction to it which would keep you back. It’s the best and you have to refer to it anytime when you start writing code in that language.

How to Approach Programming Books

When you are done with reading the documentation and understand its basics, and you have practised enough for that, you are ready to go for specialised books. Now there are two types of beginner books that I believe exist in the market. One is the category of books related to a specific topic. For example, there is a book named “Concurrency in Go: Tools and Techniques for Developers” by Katherine Cox-Buday which focuses on Concurrency in Golang. These types of books in my opinion are awesome since they focus on one topic written by an expert author. Reading these types of books can make you better at that language and help you grasp all those topics individually. Other types of books are books for general learning of the language. I believe these books are not recommended for reading in most situations. You have gone through the documentation and are familiar with the syntax, so you might not need to go through them specifically from a book. Unless it’s the case that something is not clear in the documentation and you need another material to go through just for the sake of understanding better, then it’s okay to have it, but mostly, they are not just that good to work with. And I would recommend that you go through these books as you gain experience and not binge-read them. It’s good to have more and more knowledge, but if you are not applying it somewhere, then it will not help you. When you read these books, you have an overall acknowledgement of the topics, you don’t need to have them fit into your mind while you code. So it’s recommended to keep these books handy while you code in that language to just go through the concepts that you like and eventually, you would get that thing retained in your brain, making you a better programmer than before.

There is No Substitute for Practice and Repetition

Reading and understanding the language is one thing, but the application of the concepts you learn will let you know where you lack. When you read literature, it’s difficult for you to remember all of it. And when you are in the practical phase, you will certainly forget a lot of it. And you don’t need to memorise it. You have the documentation and books with you. But the fact is that as much as you write code in that language, you will become better at it. There is no magic pill for that. You have to get your hands on the keyboard, fire up the text editor or IDE and start writing code. To learn the syntax better, I would recommend that you solve a few problems. Like from competitive coding platforms, or find problems to solve and then start writing code for it. Try to write as optimal a solution as possible, since a lot of time we tend to write longer and unoptimised code to skip a certain method in the language which we don’t realise and end up not learning it. Look for solutions by other people. Now I am not recommending that you grind up that much and keep solving questions. Once you get comfortable with writing the basics, start building a few projects. Let them be small initially since they would be finished quickly covering a lot of topics and will be as less repetitive as possible in terms of methods. Move on to the bigger eventually and keep learning. Use your search engine, it is one of the best tools made for software engineers. Use AI but not copilot or AI-based completion tools unless you have mastered it. AI is super helpful while writing code and it would explain it to you like an artificial mentor.

Programming Videos? Great for Entertainment and Learning

Programming-based videos are good and can be helpful in your learning journey. But they should be taken with a pinch of salt. I recommend that you watch programming videos for entertainment and learning. A lot of things can be deduced from videos related to programming other than the language itself. You can get a lot of insights from the programmer making that video and especially for me, the enthusiasm motivates me to further learn the language in depth. I don’t recommend learning languages from videos or boot camps that go for long hours (it’s okay to learn a few concepts that are not clear from the documentation itself or other resources, but not the whole language). Especially learning a whole language by binge-watching these videos is not a good idea. Keep them as an extra resource which would be used when nothing works out. I love watching videos that go into explaining concepts related to a specific mechanism (and not the syntax) or videos that just talk about it. There are a lot of creators that go through a lot of things related to that language like comparing it with other languages, finding pros and cons, finding metrics, etc. They kind of motivated me to learn and find more things about the language. Like I can’t stop to implement it or write about the good things that I found out about it. These types of videos can entertain you, especially after a long coding session. In the end, it’s necessary to enjoy the process and not the destination of being the best programmer in that language. You would get better and better, eventually leading to being a master of that language, but it’s important to enjoy each stage of learning the language. As a beginner, the excitement of learning that language is the motivation that will drive you. Once you better an intermediate-level programmer in that language, you will get excited to learn more in-depth than you would believe not a lot of people know. Building stuff would make you realise how little you know and will push you to learn and become better at it.