<?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: Arjun Krishna</title>
    <description>The latest articles on Forem by Arjun Krishna (@decodedcipher).</description>
    <link>https://forem.com/decodedcipher</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%2F133799%2Fbd35c6d1-abd3-40c1-9b87-ba5e04237b2b.jpg</url>
      <title>Forem: Arjun Krishna</title>
      <link>https://forem.com/decodedcipher</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/decodedcipher"/>
    <language>en</language>
    <item>
      <title>Is AI Assistance Killing the Next Generation of Developers?</title>
      <dc:creator>Arjun Krishna</dc:creator>
      <pubDate>Sun, 05 Jan 2025 20:16:39 +0000</pubDate>
      <link>https://forem.com/decodedcipher/is-ai-assistance-killing-the-next-generation-of-developers-1pbf</link>
      <guid>https://forem.com/decodedcipher/is-ai-assistance-killing-the-next-generation-of-developers-1pbf</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In a recent interview, Sundar Pichai, the CEO of Alphabet, revealed a staggering fact: &lt;a href="https://fortune.com/2024/10/30/googles-code-ai-sundar-pichai/" rel="noopener noreferrer"&gt;More than 25% of Google’s code is now AI-generated.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data from GitHub reveals that &lt;a href="https://decrypt.co/147191/no-human-programmers-five-years-ai-stability-ceo" rel="noopener noreferrer"&gt;"41% of all code right now is AI generated"&lt;/a&gt; — Emad Mostaque, founder and CEO of Stability AI (the company behind Stable Diffusion, the world’s most popular open-source image generator)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These statistics spark excitement about the future of coding but also raise some serious concerns. &lt;strong&gt;What happens when developers stop being creators and become mere curators of AI-generated snippets?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Like most developers, I use AI tools in my work. They’re incredibly helpful for debugging, optimizing code, autocompleting tedious syntax, automating repetitive tasks, or even explaining someone else’s cryptic implementation. But I started to notice a disturbing pattern—not just in others, but sometimes even in myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Seduction of Shortcuts
&lt;/h2&gt;

&lt;p&gt;While working on a project with friends recently, I noticed something unsettling. Faced with a challenge, their first instinct wasn’t to analyze the problem or dive into the documentation—it was to craft the "perfect" prompt for their AI assistant. Tools like Copilot, Claude, Cursor, and ChatGPT became their go-to problem-solvers, as they hopped from one tool to another, chasing an elusive magic solution.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"To a man with a hammer, everything looks like a nail." — Mark Twain&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And here’s the problem: &lt;strong&gt;What happens when the AI doesn’t deliver?&lt;/strong&gt;&lt;br&gt;
I watched my friends grow visibly frustrated, spending hours tweaking prompts, experimenting with different tools, and waiting for a better response. Ironically, the task they were struggling with was simple—something a bit of logic and careful thought could have solved in minutes.&lt;/p&gt;

&lt;p&gt;But that’s the real trap of over-reliance on AI: it dulls our problem-solving instincts and erodes our patience to think critically.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Wall-E Parallel
&lt;/h2&gt;

&lt;p&gt;Remember the movie Wall-E? Humans became so dependent on technology that they could no longer walk, think critically, or fend for themselves. They floated around on chairs, with machines catering to their every need.&lt;/p&gt;

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

&lt;p&gt;Are we, as developers, heading in the same direction? &lt;strong&gt;The more we depend on AI to think, code, and problem-solve for us, the more we risk losing our fundamental skills.&lt;/strong&gt; Coding is a craft that thrives on curiosity, problem-solving, and creativity. When you hand over the reins to AI, you’re not just outsourcing tasks—you’re outsourcing your growth.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happens When the Free Ride Ends?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What happens if one day all these AI tools become fully paid?&lt;/strong&gt; Imagine a future where there’s no free tier, no freemium packages—just premium plans with hefty price tags. It’s not far-fetched. As the saying goes, &lt;strong&gt;“If you’re getting something for free, you are the product.”&lt;/strong&gt; Every prompt you write, every snippet you generate—it’s all data feeding back into the loop to fine-tune their LLMs. Once they’ve achieved their goals, they’ll have no obligation to keep the freebies going.&lt;/p&gt;

&lt;p&gt;Heroku did it. After years of offering free hosting, they pulled the plug on their free plans. &lt;strong&gt;It wasn’t unethical; it was just business.&lt;/strong&gt; AI tools could follow the same path. And if you’ve spent years relying on them to write your code, what happens then?&lt;/p&gt;

&lt;h2&gt;
  
  
  You Are Responsible for your Code
&lt;/h2&gt;

&lt;p&gt;There’s another angle to this: accountability. Whether you write the code or an AI does, &lt;strong&gt;You’re responsible for what gets pushed in your name&lt;/strong&gt;. Imagine debugging a critical production issue, only to realize you don’t understand half the code because you didn’t write it—or worse, because you skipped the documentation and relied solely on AI.&lt;/p&gt;

&lt;p&gt;In collaborative, production-quality projects, the stakes are even higher. &lt;strong&gt;Code isn’t just about solving the problem; it’s about writing something maintainable, readable, and scalable.&lt;/strong&gt; It’s about atomicity, pure functions, knowing when to use (or avoid) third-party libraries, and much more. AI can suggest solutions, but understanding why those solutions work—or fail—is your responsibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Generation at Risk
&lt;/h2&gt;

&lt;p&gt;I get it—AI tools are amazing. I use them too. But the difference lies in how we use them. &lt;strong&gt;AI can assist, but it shouldn’t replace your thinking. It can suggest, but it shouldn’t dictate your process.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I worry that the next generation of developers is losing touch with these fundamentals. They’re becoming spectators, relying on AI to do the heavy lifting instead of developing their own skills.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Here’s a scenario I dread: A developer spends years coding with AI assistance, only to find themselves helpless in a situation where the AI fails, or access is cut off. Without the foundation of logic, analysis, and creative problem-solving, they’ll feel stranded.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Balance is the Key
&lt;/h2&gt;

&lt;p&gt;AI isn’t inherently bad. It’s a tool; like all tools, it’s only as good as the person wielding it. The goal isn’t to reject AI but to use it wisely. Let it autocomplete repetitive syntax, suggest optimizations, or assist with debugging—but don’t let it write your code for you. AI should be a powerful assistive tool, not the entire process generator.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let’s Build the Future, Not just Prompt it
&lt;/h2&gt;

&lt;p&gt;The future of development is still ours to shape. But it won’t be shaped by those who let AI do the thinking for them. It’ll be shaped by those who use AI as a tool, not a crutch.&lt;/p&gt;

&lt;p&gt;So, the next time you’re tempted to turn to an AI assistant, pause. Ask yourself: &lt;strong&gt;"Do I understand the problem? Can I solve it myself?"&lt;/strong&gt; Because coding isn’t just about solving today’s challenges—it’s about preparing for the unknown challenges of tomorrow.&lt;/p&gt;

&lt;p&gt;We can’t afford to let the spark of creativity, logic, and critical thinking fade. After all, that’s what makes us developers—not just the ability to write code, but the ability to think deeply about the systems we build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy coding!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>githubcopilot</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>It works on my machine... Not on yours... But why? Let's talk Docker!</title>
      <dc:creator>Arjun Krishna</dc:creator>
      <pubDate>Thu, 01 Aug 2024 05:01:37 +0000</pubDate>
      <link>https://forem.com/decodedcipher/it-works-on-my-machine-not-on-yours-but-why-lets-talk-docker-2na4</link>
      <guid>https://forem.com/decodedcipher/it-works-on-my-machine-not-on-yours-but-why-lets-talk-docker-2na4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;For Dev &amp;amp; DevOps geeks, ensuring that your application runs smoothly across different environments can often be a daunting task. A phrase commonly heard among them when troubleshooting such issues is "This works on my machine, not on yours... But why?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Enter Docker, a powerful tool that can help solve this problem by containerizing your applications. Let's explore Docker with simple analogies.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Docker?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt; is an open platform that helps developers build, share, run, and verify applications anywhere — without tedious environment configuration or management.&lt;/p&gt;

&lt;h2&gt;
  
  
  Simplifying Docker (An analogy)
&lt;/h2&gt;

&lt;p&gt;Imagine you're a baker and want to share your special cake recipe with friends. However, each friend has a different kitchen setup and ingredients availability, which could affect how the cake turns out when they bake it.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://docs.docker.com/reference/dockerfile/" rel="noopener noreferrer"&gt;Dockerfile&lt;/a&gt; is like the magic recipe box that ensures everyone bakes the cake the same way, regardless of their kitchen setup. Instead of just giving your friends the recipe, you pack the recipe, all the necessary ingredients, and even the specific oven settings into a special box — a Docker container.&lt;/p&gt;

&lt;p&gt;Here’s how Docker works in this analogy:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Recipe: Your application's code and configuration are like the cake recipe. It tells Docker how to set up and run your application.&lt;/li&gt;
&lt;li&gt;Ingredients: The dependencies and libraries your application needs to work correctly. Docker packs all of them into the container.&lt;/li&gt;
&lt;li&gt;Oven Settings: In Docker, this is like the environment in which your application runs — whether it's Linux, Windows, or Mac. Docker ensures your application runs consistently across different environments.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Use an official Node.js runtime as a parent image&lt;/span&gt;
FROM node:latest

&lt;span class="c"&gt;# Set the working directory in the container&lt;/span&gt;
WORKDIR /usr/src/app

&lt;span class="c"&gt;# Copy package.json and package-lock.json to the working directory&lt;/span&gt;
COPY package&lt;span class="k"&gt;*&lt;/span&gt;.json ./

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
RUN npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Copy the rest of the application code to the working directory&lt;/span&gt;
COPY &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Expose the port your app runs on&lt;/span&gt;
EXPOSE 3000

&lt;span class="c"&gt;# Command to run the application&lt;/span&gt;
CMD &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;, &lt;span class="s2"&gt;"app.js"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Let's break down this Dockerfile, step by step, using our cake analogy:&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;&lt;em&gt;Base Image (&lt;code&gt;FROM node:latest&lt;/code&gt;)&lt;/em&gt;&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
This is like choosing the right type of kitchen to bake your cake. Here, we're using a Node.js kitchen (runtime environment).&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;&lt;em&gt;Working Directory (&lt;code&gt;WORKDIR /usr/src/app&lt;/code&gt;)&lt;/em&gt;&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
This sets up a clean and organized space in the kitchen where all the cake-making will happen.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;&lt;em&gt;Copy Ingredients (&lt;code&gt;COPY package*.json ./&lt;/code&gt;)&lt;/em&gt;&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
This step copies the ingredient list (package.json) to the kitchen.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;&lt;em&gt;Install Dependencies (&lt;code&gt;RUN npm install&lt;/code&gt;)&lt;/em&gt;&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
Just like measuring and mixing the ingredients, this step installs all the necessary dependencies (ingredients) listed in package.json.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;&lt;em&gt;Copy Recipe (&lt;code&gt;COPY . .&lt;/code&gt;)&lt;/em&gt;&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
This copies the actual cake recipe (all the remaining code files) to the kitchen workspace.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;&lt;em&gt;Expose Port (&lt;code&gt;EXPOSE 3000&lt;/code&gt;)&lt;/em&gt;&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
Think of this as opening a window to let the delicious cake aroma (application) spread outside the kitchen. Here, it exposes port 3000 so the app can be accessed.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;&lt;em&gt;Command to Start Baking (CMD ["node", "app.js"])&lt;/em&gt;&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
Finally, this command starts the baking process (runs the application).&lt;/p&gt;

&lt;p&gt;By using Docker containers, you can share your application (or recipe) with others knowing they'll get the same result, regardless of their local setup. It keeps everything self-contained and portable, making development and deployment smoother and more reliable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flmiior3d7fs6uc9nbdq5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flmiior3d7fs6uc9nbdq5.png" alt="Image description" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What is Docker Compose?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.docker.com/compose/" rel="noopener noreferrer"&gt;Docker Compose&lt;/a&gt; extends the idea of Docker by orchestrating multiple containers, allowing you to manage complex applications as easily as serving a dessert buffet.&lt;/p&gt;
&lt;h2&gt;
  
  
  Docker vs Docker Compose Explained (An analogy)
&lt;/h2&gt;

&lt;p&gt;Imagine you're not just baking one cake but preparing an entire dessert buffet for a party. Each dessert requires different recipes, ingredients, and baking times. Docker Compose helps you manage this complexity by orchestrating multiple containers, each handling a different dessert, yet ensuring they all work together seamlessly.&lt;/p&gt;
&lt;h2&gt;
  
  
  Docker (Single Recipe)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Recipe&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Each dessert's recipe represents your application's code and configuration in Docker. For instance, one recipe might be for a cake (Node.js app), and another for cookies (Python app).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Ingredients&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Ingredients are like the dependencies and libraries each dessert (application) needs. Docker packs these into separate containers to keep them isolated and prevent flavors (dependencies) from mixing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Oven Settings&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Docker ensures each dessert bakes consistently across different kitchens (environments), whether it's on Linux, Windows, or Mac.&lt;/p&gt;
&lt;h2&gt;
  
  
  Docker Compose (Dessert Buffet)
&lt;/h2&gt;

&lt;p&gt;Now, let's introduce Docker Compose to manage your dessert buffet:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Dessert Menu (docker-compose.yml)&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Think of docker-compose.yml as your party's dessert menu. It lists all the desserts (services) you want to serve at the party and how they should be prepared.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;version: &lt;span class="s1"&gt;'3.8'&lt;/span&gt;
services:
  cake:
    build: ./cake-app
    ports:
      - &lt;span class="s2"&gt;"3000:3000"&lt;/span&gt;
  cookies:
    build: ./cookies-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cake&lt;/code&gt; and &lt;code&gt;cookies&lt;/code&gt; are two services defined in your &lt;code&gt;docker-compose.yml&lt;/code&gt;. Each corresponds to a different Docker container.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;build: ./cake-app&lt;/code&gt; and &lt;code&gt;build: ./cookies-app&lt;/code&gt; specify where to find each dessert's recipe (Dockerfile).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Party Setup&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Before the party (deployment), you use Docker Compose to set up the dessert buffet.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Docker Compose builds each dessert according to its recipe and starts all containers based on your docker-compose.yml.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Enjoy the Party&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
With Docker Compose, each dessert (application) is managed separately but works together smoothly, just like different containers on a dessert buffet table.&lt;/p&gt;

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

&lt;p&gt;Docker simplifies application deployment by packaging applications and their dependencies into isolated containers, ensuring consistency across different environments. Docker Compose extends this concept by orchestrating multiple containers, allowing you to manage complex applications as easily as serving a dessert buffet.&lt;/p&gt;

&lt;p&gt;By using Docker and Docker Compose, you can confidently deploy your applications knowing they'll work the same way everywhere — a sweet solution to modern development challenges!&lt;/p&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Rising from the Ashes: Restoring Inovus Blogs Post-Termination</title>
      <dc:creator>Arjun Krishna</dc:creator>
      <pubDate>Sun, 05 Nov 2023 07:55:46 +0000</pubDate>
      <link>https://forem.com/decodedcipher/rising-from-the-ashes-restoring-inovus-blogs-post-termination-4ban</link>
      <guid>https://forem.com/decodedcipher/rising-from-the-ashes-restoring-inovus-blogs-post-termination-4ban</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Here's how we managed to recover the contents of a blog hosted on an AWS EC2 instance after being wrongfully terminated.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;In the world of blogging, setbacks and challenges are bound to occur. But what happens when a setback is not just a hurdle but a full-blown wrongful termination that leaves you with nothing but ashes?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Ascent and Unforeseen Halt
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://blog.inovuslabs.org/" rel="noopener noreferrer"&gt;Inovus Blogs&lt;/a&gt;&lt;/strong&gt; is more than just a blog; it is our creative outlet, a platform to express our thoughts, and a place to engage with a community of like-minded individuals. To be specific, (really happy to say) it turned out to be exactly what it was supposed to be when the initial ideas of the same were conceived.&lt;/p&gt;

&lt;p&gt;The blog was hosted on an AWS EC2 instance, utilizing its generous 12-month free tier. Even though I was skeptical about the 1-vCPU &amp;amp; 1 GiB RAM config of the t2-micro instance, with the generous &lt;a href="https://aws.amazon.com/ec2" rel="noopener noreferrer"&gt;750 EC2 hours&lt;/a&gt; every month, free &lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html" rel="noopener noreferrer"&gt;Elastic IP&lt;/a&gt;, and a whopping &lt;a href="https://aws.amazon.com/ebs/" rel="noopener noreferrer"&gt;30GB Elastic Block Storage&lt;/a&gt;, we were good to go.&lt;/p&gt;

&lt;p&gt;The Ghost CMS was our ultimate platform of choice and on 17th Jan 2023, Inovus Blogs was finally launched. Since then, 25+ blogs were written on a diverse range of topics. The Google Analytics dashboard too was showing really promising data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41d2kiv3mfvz7jtqxtz1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41d2kiv3mfvz7jtqxtz1.png" alt="Screenshot from our Google Analytics Dashboard" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On 20th May 2023, we started experiencing an issue with CPU Utilization of our EC2 Instance directly throttling to the max 100%, and crashing itself just like a stinger honeybee. As this self-throttling issue seems to appear often, I added &lt;a href="https://aws.amazon.com/cloudwatch/" rel="noopener noreferrer"&gt;AWS Cloudwatch&lt;/a&gt; actions to &lt;u&gt;monitor the server&lt;/u&gt;, &lt;u&gt;send an Alarm&lt;/u&gt; when the CPU utilization exceeds a predefined threshold, and &lt;u&gt;restart the server&lt;/u&gt; automatically.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jzpkpwr3jyifmu2yc4b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jzpkpwr3jyifmu2yc4b.png" alt="Screenshot of AWS EC2 Restart Alarms from AWS Cloudwatch" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since then I've received close to 80 Alarms, which means... Shit happened... As the Cloudwatch Actions worked really well, we never went totally down for more than 4-5 minutes. But as we all know, nothing lasts forever.&lt;/p&gt;

&lt;p&gt;The evening of 28th October 2023 was a delicate little thing until I happened to notice that, Inovus Blogs just went offline. At first glance, I thought of it as the CPU throttling issue, that I mentioned before. But I literally got shivers down my spine when I came to realize that, the instance just got &lt;strong&gt;TERMINATED&lt;/strong&gt; (not &lt;strong&gt;STOPPED&lt;/strong&gt;) - which means our blog just vanished into thin air, with literally no backup of the database &amp;amp; media uploaded alongside the blogs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Path to Recovery: Phoenix arises
&lt;/h2&gt;

&lt;p&gt;The mission was to recover this very blog to the way it was before ASAP. I'm not here to walk you through the step-by-step processes of deploying a Ghost blog. There are plenty of blogs and videos out there that lecture every step in detail, in a much simpler manner. Rather I would like to emphasize more on, how I recovered most of the data on a website that was deleted from the web entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Internet Archive (Wayback Machine)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Internet Archive&lt;/strong&gt; is a non-profit library of millions of free books, movies, software, music, websites, and more. As per Wikipedia, The &lt;strong&gt;Wayback Machine&lt;/strong&gt; is a digital archive of the World Wide Web founded by the Internet Archive. Created in 1996 and launched to the public in 2001, it allows the user to go "back in time" to see how websites looked in the past. It has already saved more than 858 Billion web pages over time.&lt;/p&gt;

&lt;p&gt;As per the &lt;a href="**https://web.archive.org/web/20230000000000*/https://blog.inovuslabs.org/**"&gt;Wayback Machine Search&lt;/a&gt;, our blog has been saved 8 times in the past, and the last entry was on June 25, 2023. There's no guarantee in the amount of data that you might find up there or the frequency in which they would capture a web page (totally random, I suppose). Half of the available data (blogs) were in good shape. But the story for the other half were'nt. Anyway, &lt;em&gt;"Half a loaf is better than none", right...&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo1amkoxd6pj8s5bacabz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo1amkoxd6pj8s5bacabz.png" alt="Web page cache from Wayback Machine" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the new deployment, we prefer to have a &lt;a href="https://www.digitalocean.com/products/droplets" rel="noopener noreferrer"&gt;DigitalOcean Droplet&lt;/a&gt; rather than an AWS EC2 Instance. I created a new droplet, configured Ghost, and started copy-pasting the blogs one by one. For the blogs with corrupted data &amp;amp; assets and the blogs published after June 25, 2023, we'll have to depend on something else.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Search Cache
&lt;/h3&gt;

&lt;p&gt;Google Cache is normally referred as the copies of the web pages cached by Google. Google crawls the web and takes snapshots of each page as a backup just in case the current page is not available. These pages then become part of Google's cache.&lt;/p&gt;

&lt;p&gt;Here's how you can &lt;a href="https://support.google.com/websearch/answer/1687222?hl=en" rel="noopener noreferrer"&gt;view web pages cached in Google Search Results&lt;/a&gt;. The &lt;code&gt;site : search operator&lt;/code&gt; would also help you filter the website URL. You can also use the &lt;code&gt;cache : search operator&lt;/code&gt; to find the cached version of a page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcm8o9jlh5qxibq9d1wu8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcm8o9jlh5qxibq9d1wu8.png" alt="Screenshot of a web page from Browser Web Cache" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lessons Learned
&lt;/h2&gt;

&lt;p&gt;Protecting your website from wrongful termination or unexpected shutdowns is crucial, as it ensures the continuity of your online presence and prevents the loss of valuable content. Here are some steps you can take to safeguard your website:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;u&gt;&lt;strong&gt;Read and Understand the Terms of Service:&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
Carefully review the terms of service (TOS) of your hosting provider. Ensure that you understand what is allowed and what isn't, as violating these terms can lead to wrongful termination.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;Regular Backups:&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Frequently back up your website and its data. Choose automated backup solutions if available, and store backups in multiple locations, including off-site and in the cloud.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;Stay In Compliance:&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Continuously monitor your website's activities to ensure compliance with the hosting provider's terms of service and relevant laws.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;Monitor Server Status and Uptime:&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Use server monitoring tools to keep an eye on your website's uptime and performance. This can help you identify issues before they become critical.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;Implement a Disaster Recovery Plan:&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Develop a disaster recovery plan that outlines the steps to take if your website is wrongfully terminated.&lt;br&gt;
Consider a Secondary Hosting Provider:&lt;br&gt;
Diversify your hosting setup. Having a secondary hosting provider can serve as a backup plan in case your primary hosting provider terminates your services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;Stay Informed:&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Keep yourself informed about industry best practices, changes in regulations, and updates in hosting provider policies that could affect your website.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remember that while these steps can help mitigate the risk of wrongful termination, there is no foolproof way to guarantee it won't happen. However, by being proactive and prepared, you can reduce the chances of your website being unjustly shut down and increase your ability to recover swiftly if it does occur.&lt;/p&gt;

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

&lt;p&gt;The wrongful termination that could have spelled the end for Inovus Blogs instead became the catalyst for its rebirth. Rising from the ashes was no easy feat, but it reaffirmed our commitment to the platform and the importance of the content we create. In the end, it was not just about rebuilding a website; it was about preserving our voice, our ideas, and our passion for sharing knowledge with the world.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>aws</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I created a simple Morse Code Converter that can generate equivalent sounds</title>
      <dc:creator>Arjun Krishna</dc:creator>
      <pubDate>Tue, 07 Jun 2022 21:21:59 +0000</pubDate>
      <link>https://forem.com/decodedcipher/i-created-a-simple-morse-code-converter-that-can-generate-equivalent-sounds-4pd9</link>
      <guid>https://forem.com/decodedcipher/i-created-a-simple-morse-code-converter-that-can-generate-equivalent-sounds-4pd9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Morse code&lt;/strong&gt; is a method used in telecommunication to encode text characters as standardized sequences of two different signal durations, called dots and dashes, or &lt;em&gt;dits and dahs&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I create a simple Morse Code Converter that converts typed-text to Morse Code (vice-versa), both visually and in audio format.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkybwzt4dk7469nmwavcp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkybwzt4dk7469nmwavcp.png" alt="Desktop View" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The converter fields could accept either Text (English) or Morse Code and could convert them to one another. The both scenarios the audio played will be of the Morse Code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi49ewqqfd6bw93lry631.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi49ewqqfd6bw93lry631.png" alt="Mobile View" width="375" height="810"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here in this project, Morse Code is represented visually using &lt;em&gt;periods &lt;strong&gt;(.)&lt;/strong&gt;&lt;/em&gt; and &lt;em&gt;hyphens &lt;strong&gt;(-)&lt;/strong&gt;&lt;/em&gt;. The input fields aren't case sensitive. But while converting Morse Code back to text, it displays result as in Uppercase.&lt;/p&gt;




&lt;h4&gt;
  
  
  🌟 Buttons
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;CONVERT&lt;/code&gt; - Convert Text to Morse Code&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RESET&lt;/code&gt; - Clear the input fields&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;COPY TO CLIPBOARD&lt;/code&gt; - Copy the Morse Code result to clipboard&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PLAY AUDIO&lt;/code&gt; - Replay the Audio result of Morse Code&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h4&gt;
  
  
  🌟 Dev Stack
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Handlebars (HTML, CSS &lt;em&gt;(Bootstrap)&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;Web Audio API&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h4&gt;
  
  
  🚀 &lt;a href="https://verbose-reflective-recorder.glitch.me/" rel="noopener noreferrer"&gt;Demo Link&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  🕵️ &lt;a href="https://github.com/decoded-cipher/morsecode-converter" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;
&lt;/h4&gt;

</description>
      <category>morsecode</category>
      <category>javascript</category>
      <category>handlebars</category>
      <category>bootstrap</category>
    </item>
  </channel>
</rss>
