<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Saiful Islam</title>
    <description>The latest articles on DEV Community by Saiful Islam (@saifulire).</description>
    <link>https://dev.to/saifulire</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%2F1233537%2F05f4aded-10e1-49db-a5fe-15ac4303132d.jpg</url>
      <title>DEV Community: Saiful Islam</title>
      <link>https://dev.to/saifulire</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/saifulire"/>
    <language>en</language>
    <item>
      <title>SDLC-2</title>
      <dc:creator>Saiful Islam</dc:creator>
      <pubDate>Sun, 07 Jun 2026 19:36:18 +0000</pubDate>
      <link>https://dev.to/saifulire/sdlc-2-1ef2</link>
      <guid>https://dev.to/saifulire/sdlc-2-1ef2</guid>
      <description>&lt;h1&gt;
  
  
  সফটওয়্যার ডেপ্লয়মেন্ট: লোকাল মেশিন থেকে লাইভ সার্ভার পর্যন্ত
&lt;/h1&gt;

&lt;h2&gt;
  
  
  একটি সম্পূর্ণ বাংলা গাইড
&lt;/h2&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;এই গাইডটি পড়লে আপনি শিখবেন:&lt;/strong&gt; কীভাবে আপনার নিজের কম্পিউটারে লেখা কোড, গিটহাবের মাধ্যমে, একটি ক্লাউড সার্ভারে স্বয়ংক্রিয়ভাবে ডেপ্লয় হয় — যাতে লক্ষো ব্যবহারকারী একসাথে সেটি ব্যবহার করতে পারে। &lt;br&gt;
&lt;em&gt;এই গাইডটি "সফটওয়্যার ডেভেলপমেন্ট সেশন টু" লাইভ ক্লাসের বিষয়বস্তু অবলম্বনে রচিত।&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  সূচিপত্র
&lt;/h2&gt;

&lt;p&gt;১. ভূমিকা: আমরা কী শিখব এবং কেন?&lt;br&gt;
২. ডেপ্লয়মেন্ট কী? — মূল ধারণা&lt;br&gt;
৩. তিনটি মেশিনের পরিবেশ — The Three-Machine Model&lt;br&gt;
৪. পোর্ট: দুই কম্পিউটারের কথোপকথনের দরজা&lt;br&gt;
৫. গিট ও গিটহাব — কোডের গুগল ড্রাইভ&lt;br&gt;
৬. ক্লাউড সার্ভার — আপনার অনলাইন কম্পিউটার&lt;br&gt;
৭. SSH Key — ডিজিটাল চাবির সিস্টেম&lt;br&gt;
৮. ডিজিটাল ওশান থেকে সার্ভার কেনা (ধাপে ধাপে)&lt;br&gt;
৯. লোকাল মেশিন থেকে সার্ভারে SSH সংযোগ&lt;br&gt;
১০. গিট ইনস্টল ও সার্ভারে গিটহাব সেটআপ&lt;br&gt;
১১. GitHub Actions — স্বয়ংক্রিয় ডেপ্লয়মেন্ট পাইপলাইন&lt;br&gt;
১২. YAML ওয়ার্কফ্লো ফাইল — পাইপলাইনের হৃদয়&lt;br&gt;
১৩. Secrets ও Environment Variables — গোপন তথ্য সুরক্ষা&lt;br&gt;
১৪. PM2 — Node.js সার্ভার ব্যাকগ্রাউন্ডে চালানো&lt;br&gt;
১৫. সম্পূর্ণ ওয়ার্কফ্লো: শুরু থেকে শেষ পর্যন্ত&lt;br&gt;
১৬. বাস্তব দলে ডেপ্লয়মেন্ট কীভাবে হয়?&lt;br&gt;
১৭. AI/NLP কোডিং — ভবিষ্যতের কোডিং পদ্ধতি&lt;br&gt;
১৮. পরবর্তী পদক্ষেপ ও রিসোর্স&lt;/p&gt;


&lt;h2&gt;
  
  
  অধ্যায় ১: ভূমিকা — আমরা কী শিখব এবং কেন?
&lt;/h2&gt;

&lt;p&gt;আপনি হয়তো অনেক কোড লিখেছেন। একটি পোর্টফোলিও ওয়েবসাইট, একটি ই-কমার্স সাইট, অথবা একটি ছোট ওয়েব অ্যাপ। কোডটি আপনার নিজের কম্পিউটারে দিব্যি চলছে। কিন্তু প্রশ্ন হলো — এই কোড হাজার হাজার মানুষ কীভাবে ব্যবহার করবে?&lt;/p&gt;

&lt;p&gt;এই প্রশ্নের উত্তরই হলো &lt;strong&gt;সফটওয়্যার ডেপ্লয়মেন্ট&lt;/strong&gt;।&lt;/p&gt;

&lt;p&gt;এই গাইডে আমরা শিখব:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;লোকাল মেশিন থেকে গিটহাবে কোড কীভাবে পুশ করতে হয়&lt;/li&gt;
&lt;li&gt;একটি ক্লাউড সার্ভার কীভাবে কিনতে ও সেটআপ করতে হয়&lt;/li&gt;
&lt;li&gt;SSH Key দিয়ে সার্ভারে নিরাপদ সংযোগ কীভাবে করতে হয়&lt;/li&gt;
&lt;li&gt;GitHub Actions দিয়ে স্বয়ংক্রিয় CI/CD পাইপলাইন কীভাবে তৈরি করতে হয়&lt;/li&gt;
&lt;li&gt;PM2 দিয়ে সার্ভারে Node.js অ্যাপ কীভাবে চালু রাখতে হয়&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;এই বিষয়গুলো কেন জরুরি?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;আপনি যে প্ল্যাটফর্মেই কাজ করুন না কেন — AWS, DigitalOcean, Azure, GCP — মূল নীতিগুলো সবজায়গায় একই। একবার এই ফান্ডামেন্টাল বুঝলে যেকোনো সার্ভারে কাজ করতে পারবেন।&lt;/p&gt;


&lt;h2&gt;
  
  
  অধ্যায় ২: ডেপ্লয়মেন্ট কী? — মূল ধারণা
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ডেপ্লয়মেন্ট&lt;/strong&gt; মানে হলো — আপনার লেখা সফটওয়্যার এমনভাবে একটি সার্ভারে স্থাপন করা, যাতে ইন্টারনেটের যেকোনো জায়গা থেকে যেকোনো মানুষ সেটি ব্যবহার করতে পারে।&lt;/p&gt;

&lt;p&gt;চিন্তা করুন আপনি &lt;code&gt;facebook.com&lt;/code&gt; ভিজিট করছেন। এই &lt;code&gt;facebook.com&lt;/code&gt; আসলে কী? এটি ফেসবুকের একটি কম্পিউটারে (সার্ভারে) রাখা একটি সফটওয়্যার। আপনার ব্রাউজার সেই সার্ভারে একটি অনুরোধ পাঠায়, সার্ভার উত্তর দেয়, আর আপনার স্ক্রিনে ওয়েবসাইট দেখা যায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ডেভেলপার হিসেবে আপনার কাজ তিনটি স্তরে হয়:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[আপনার ল্যাপটপ] → [গিটহাব] → [ক্লাউড সার্ভার] → [কোটি ইউজার]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই পুরো প্রক্রিয়াটিকেই বলা হয় &lt;strong&gt;Software Development Lifecycle (SDLC)&lt;/strong&gt;। এর সবচেয়ে শেষ ধাপ হলো ডেপ্লয়মেন্ট — যখন আপনার কোড ইন্টারনেটে "লাইভ" হয়।&lt;/p&gt;

&lt;h3&gt;
  
  
  ডেপ্লয়মেন্টে কী কী শেখা যায়?
&lt;/h3&gt;

&lt;p&gt;এই একটি বিষয় শিখতে গেলে আপনি পাশাপাশি শিখে ফেলবেন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD&lt;/strong&gt; (Continuous Integration / Continuous Deployment) — কোড পরিবর্তনের সাথে সাথে স্বয়ংক্রিয়ভাবে ডেপ্লয় হওয়া&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DevOps&lt;/strong&gt; মানসিকতা — ডেভেলপমেন্ট এবং অপারেশন একসাথে&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Computing&lt;/strong&gt; — ডিজিটাল ওশান, AWS, Azure ইত্যাদি&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux / Ubuntu&lt;/strong&gt; — সার্ভার অপারেটিং সিস্টেম&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bash Scripting&lt;/strong&gt; — কমান্ড লাইনে স্বয়ংক্রিয় কাজ&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  অধ্যায় ৩: তিনটি মেশিনের পরিবেশ
&lt;/h2&gt;

&lt;p&gt;একজন ডেভেলপার হিসেবে আপনাকে কমপক্ষে &lt;strong&gt;তিনটি আলাদা মেশিনের (পরিবেশের)&lt;/strong&gt; কথা মাথায় রাখতে হবে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────┐
│  মেশিন ১          মেশিন ২          মেশিন ৩             │
│  ──────────       ──────────       ──────────           │
│  আপনার           গিটহাব           ক্লাউড               │
│  ল্যাপটপ         সার্ভার          সার্ভার              │
│  (Dev Machine)   (Code Repo)      (Deploy Machine)     │
│                                                         │
│  কোড লেখা  ──→  কোড সংরক্ষণ ──→  কোড চালানো          │
└─────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  মেশিন ১: আপনার লোকাল মেশিন (Development Environment)
&lt;/h3&gt;

&lt;p&gt;এটি হলো আপনার নিজের ল্যাপটপ বা ডেস্কটপ। এখানে আপনি:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;কোড এডিটর (VS Code, IntelliJ, ইত্যাদি) দিয়ে কোড লেখেন&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;localhost&lt;/code&gt; এ সফটওয়্যার টেস্ট করেন&lt;/li&gt;
&lt;li&gt;গিট দিয়ে কোড ট্র্যাক করেন&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এই মেশিনে একটি মনিটর আছে, কীবোর্ড আছে — পুরো ডেস্কটপ পরিবেশ আছে।&lt;/p&gt;

&lt;h3&gt;
  
  
  মেশিন ২: গিটহাব সার্ভার (Code Repository)
&lt;/h3&gt;

&lt;p&gt;এটি হলো Microsoft-এর পরিচালিত একটি সার্ভার, যেখানে &lt;code&gt;github.com&lt;/code&gt; এর মাধ্যমে আপনি কোড সংরক্ষণ করেন।&lt;/p&gt;

&lt;p&gt;গিটহাবকে আপনি &lt;strong&gt;কোডের গুগল ড্রাইভ&lt;/strong&gt; হিসেবে ভাবতে পারেন। গুগল ড্রাইভে যেমন আপনার ফাইল অনলাইনে সংরক্ষিত থাকে, গিটহাবে তেমনি আপনার কোড সংরক্ষিত থাকে।&lt;/p&gt;

&lt;p&gt;পার্থক্য হলো: গিটহাব শুধু স্টোরেজ না — এটি কোডের ইতিহাস রাখে, টিম কোলাবোরেশন সাপোর্ট করে, এবং GitHub Actions দিয়ে স্বয়ংক্রিয় কাজও করতে পারে।&lt;/p&gt;

&lt;h3&gt;
  
  
  মেশিন ৩: ক্লাউড ডেপ্লয়মেন্ট সার্ভার (Production Server)
&lt;/h3&gt;

&lt;p&gt;এটি হলো DigitalOcean, AWS, Azure বা GCP-এর মতো কোম্পানির সার্ভার, যেটি আপনি মাসিক ভাড়া দিয়ে ব্যবহার করেন।&lt;/p&gt;

&lt;p&gt;এই মেশিনে কোনো মনিটর নেই, কীবোর্ড নেই। এটি শুধু ইন্টারনেটের সাথে সংযুক্ত একটি কম্পিউটার। এই মেশিনটিকে আপনি &lt;strong&gt;টার্মিনাল/কনসোল&lt;/strong&gt; দিয়ে দূর থেকে নিয়ন্ত্রণ করেন।&lt;/p&gt;

&lt;p&gt;এই মেশিনে আপনার সফটওয়্যার চলে, এবং ইন্টারনেটের যেকোনো মানুষ সেটি ব্যবহার করতে পারে।&lt;/p&gt;

&lt;h3&gt;
  
  
  কেন আলাদা মেশিন দরকার?
&lt;/h3&gt;

&lt;p&gt;এই তিনটি মেশিন তিনটি &lt;strong&gt;আলাদা হার্ডওয়্যার&lt;/strong&gt; এবং &lt;strong&gt;আলাদা নেটওয়ার্কে&lt;/strong&gt; থাকে। এরা এমনিতে একে অপরের সাথে কথা বলতে পারে না — ইন্টারনেট সংযোগ থাকলেই কেবল পারে।&lt;/p&gt;

&lt;p&gt;একজন ডেভেলপার হিসেবে আপনার কাজ হলো: কোড মেশিন-১ থেকে মেশিন-২ হয়ে মেশিন-৩ পর্যন্ত নিয়ে যাওয়ার প্রক্রিয়াটি সহজ ও স্বয়ংক্রিয় করা।&lt;/p&gt;




&lt;h2&gt;
  
  
  অধ্যায় ৪: পোর্ট — দুই কম্পিউটারের কথোপকথনের দরজা
&lt;/h2&gt;

&lt;p&gt;দুটি কম্পিউটার একে অপরের সাথে কথা বলার জন্য &lt;strong&gt;পোর্ট&lt;/strong&gt; ব্যবহার করে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;পোর্ট কী?&lt;/strong&gt; পোর্ট হলো কম্পিউটারের মধ্যে চলমান একটি প্রোগ্রাম, যেটি বাইরে থেকে আসা যোগাযোগের অনুরোধ গ্রহণ করতে পারে। সহজ ভাষায়: পোর্ট হলো একটি &lt;strong&gt;দরজা&lt;/strong&gt;, যেটি খোলা থাকলে বাইরে থেকে ঢোকা যায়।&lt;/p&gt;

&lt;h3&gt;
  
  
  গুরুত্বপূর্ণ পোর্ট নম্বরগুলো:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;পোর্ট নম্বর&lt;/th&gt;
&lt;th&gt;প্রোটোকল&lt;/th&gt;
&lt;th&gt;ব্যবহার&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;80&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP&lt;/td&gt;
&lt;td&gt;সাধারণ ওয়েবসাইট দেখা (যেমন &lt;code&gt;http://example.com&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;443&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTPS&lt;/td&gt;
&lt;td&gt;নিরাপদ ওয়েবসাইট দেখা (যেমন &lt;code&gt;https://example.com&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;22&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SSH&lt;/td&gt;
&lt;td&gt;এক সার্ভার থেকে আরেক সার্ভারে টার্মিনাল সংযোগ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3000&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;Node.js অ্যাপ সাধারণত এই পোর্টে চলে&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  পোর্ট 80 এবং 443 কীভাবে কাজ করে?
&lt;/h3&gt;

&lt;p&gt;যখন আপনি ব্রাউজারে &lt;code&gt;http://facebook.com&lt;/code&gt; লেখেন, তখন আপনার কম্পিউটার ফেসবুকের সার্ভারের পোর্ট 80-তে একটি অনুরোধ পাঠায়। সার্ভার সেটি গ্রহণ করে উত্তর দেয়।&lt;/p&gt;

&lt;p&gt;যদি &lt;code&gt;https://&lt;/code&gt; হয়, তাহলে পোর্ট 443 ব্যবহার হয়। HTTPS মানে যোগাযোগটি এনক্রিপ্টেড — মাঝপথে কেউ দেখতে পাবে না।&lt;/p&gt;

&lt;h3&gt;
  
  
  পোর্ট 22 কেন বিশেষ?
&lt;/h3&gt;

&lt;p&gt;পোর্ট 22 হলো &lt;strong&gt;SSH (Secure Shell)&lt;/strong&gt; প্রোটোকলের জন্য। এই পোর্ট দিয়ে আপনি একটি কম্পিউটার থেকে আরেকটি কম্পিউটারের টার্মিনালে সরাসরি ঢুকতে পারেন — যেন আপনি সেই কম্পিউটারের সামনে বসে কাজ করছেন।&lt;/p&gt;

&lt;p&gt;উদাহরণ: আপনি ঢাকায় বসে DigitalOcean-এর সিঙ্গাপুরের সার্ভারে কমান্ড দিচ্ছেন — এটি পোর্ট 22 এর মাধ্যমে হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;গুরুত্বপূর্ণ:&lt;/strong&gt; আপনার সার্ভারে পোর্ট 22 বন্ধ থাকলে কেউ SSH করে ঢুকতে পারবে না। ফায়ারওয়াল দিয়ে এই পোর্ট নিয়ন্ত্রণ করা হয়।&lt;/p&gt;




&lt;h2&gt;
  
  
  অধ্যায় ৫: গিট ও গিটহাব — কোডের গুগল ড্রাইভ
&lt;/h2&gt;

&lt;p&gt;ডেপ্লয়মেন্ট বুঝতে হলে আগে গিট ও গিটহাব বুঝতে হবে।&lt;/p&gt;

&lt;h3&gt;
  
  
  গিট (Git) কী?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;গিট&lt;/strong&gt; হলো আপনার লোকাল কম্পিউটারে ইনস্টল করা একটি সফটওয়্যার, যেটি আপনার কোডের পরিবর্তনগুলো ট্র্যাক করে। এটি যেকোনো অপারেটিং সিস্টেমে ইনস্টল করা যায়।&lt;/p&gt;

&lt;p&gt;টার্মিনালে &lt;code&gt;git&lt;/code&gt; লিখলে যদি গিটের সাহায্য দেখা যায়, তার মানে গিট ইনস্টল আছে।&lt;/p&gt;

&lt;h3&gt;
  
  
  গিটহাব (GitHub) কী?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;গিটহাব&lt;/strong&gt; হলো Microsoft-এর একটি ক্লাউড সার্ভিস, যেখানে আপনি আপনার গিট রিপোজিটরি অনলাইনে সংরক্ষণ করতে পারেন।&lt;/p&gt;

&lt;p&gt;সম্পর্কটা এরকম:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;গিট&lt;/strong&gt; = আপনার লোকাল মেশিনে চলা সফটওয়্যার&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;গিটহাব&lt;/strong&gt; = অনলাইনে কোড রাখার জায়গা&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  মূল গিট কমান্ডগুলো:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# নতুন গিট রিপো শুরু করা&lt;/span&gt;
git init

&lt;span class="c"&gt;# কোন কোন ফাইল পরিবর্তন হয়েছে দেখা&lt;/span&gt;
git status

&lt;span class="c"&gt;# সব পরিবর্তন "স্টেজ" করা (আপলোডের জন্য প্রস্তুত করা)&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# পরিবর্তনগুলো একটি "কমিট" হিসেবে সংরক্ষণ করা&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"আমার পরিবর্তনের বিবরণ"&lt;/span&gt;

&lt;span class="c"&gt;# গিটহাবে কোড পাঠানো&lt;/span&gt;
git push origin main

&lt;span class="c"&gt;# গিটহাব থেকে সর্বশেষ কোড আনা&lt;/span&gt;
git pull origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  গিটহাবে রিপোজিটরি তৈরি করা:
&lt;/h3&gt;

&lt;p&gt;১. &lt;code&gt;github.com&lt;/code&gt; এ লগইন করুন&lt;br&gt;
২. "New Repository" বাটনে ক্লিক করুন&lt;br&gt;
৩. রিপোজিটরির নাম দিন (যেমন: &lt;code&gt;session-two&lt;/code&gt;)&lt;br&gt;
৪. Public বা Private বেছে নিন&lt;br&gt;
৫. "Create Repository" ক্লিক করুন&lt;/p&gt;

&lt;p&gt;গিটহাব তখন কিছু কমান্ড দেখাবে। এই কমান্ডগুলো আপনার লোকাল প্রজেক্টকে গিটহাবের সাথে যুক্ত করে।&lt;/p&gt;
&lt;h3&gt;
  
  
  লোকাল প্রজেক্টকে গিটহাবে লিংক করা:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# গিটহাব কোন রিপোতে কোড পাঠাব সেটা বলা&lt;/span&gt;
git remote add origin https://github.com/আপনার-নাম/session-two.git

&lt;span class="c"&gt;# প্রথমবার পুশ করা&lt;/span&gt;
git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;এরপর থেকে &lt;code&gt;git push&lt;/code&gt; করলেই কোড গিটহাবে চলে যাবে।&lt;/p&gt;


&lt;h2&gt;
  
  
  অধ্যায় ৬: ক্লাউড সার্ভার — আপনার অনলাইন কম্পিউটার
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ক্লাউড সার্ভার&lt;/strong&gt; হলো ইন্টারনেটে থাকা একটি কম্পিউটার, যেটি আপনি মাসিক ভাড়া দিয়ে ব্যবহার করতে পারেন।&lt;/p&gt;
&lt;h3&gt;
  
  
  ক্লাউড সার্ভার এবং সাধারণ ল্যাপটপের পার্থক্য:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;বিষয়&lt;/th&gt;
&lt;th&gt;আপনার ল্যাপটপ&lt;/th&gt;
&lt;th&gt;ক্লাউড সার্ভার&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;মনিটর&lt;/td&gt;
&lt;td&gt;আছে&lt;/td&gt;
&lt;td&gt;নেই&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;কীবোর্ড&lt;/td&gt;
&lt;td&gt;আছে&lt;/td&gt;
&lt;td&gt;নেই&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;এক্সেস পদ্ধতি&lt;/td&gt;
&lt;td&gt;সরাসরি ব্যবহার&lt;/td&gt;
&lt;td&gt;SSH টার্মিনাল দিয়ে&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;চলার সময়&lt;/td&gt;
&lt;td&gt;আপনি চালু রাখলে&lt;/td&gt;
&lt;td&gt;২৪/৭ চালু থাকে&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ইন্টারনেট IP&lt;/td&gt;
&lt;td&gt;পরিবর্তনশীল&lt;/td&gt;
&lt;td&gt;স্থায়ী (Fixed IP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;মূল্য&lt;/td&gt;
&lt;td&gt;একবার কিনতে হয়&lt;/td&gt;
&lt;td&gt;মাসিক ভাড়া&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  জনপ্রিয় ক্লাউড সার্ভার প্রোভাইডার:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DigitalOcean&lt;/strong&gt;: সহজ ইন্টারফেস, ছোট প্রজেক্টের জন্য ভালো, মাসে মাত্র $4 থেকে শুরু&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS (Amazon Web Services)&lt;/strong&gt;: সবচেয়ে বেশি ব্যবহৃত, অনেক সার্ভিস আছে&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure (Microsoft)&lt;/strong&gt;: বড় কোম্পানিতে জনপ্রিয়&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GCP (Google Cloud Platform)&lt;/strong&gt;: AI/ML কাজের জন্য ভালো&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;সবার &lt;strong&gt;মূল কাজের পদ্ধতি একই&lt;/strong&gt;। একটিতে শিখলে অন্যগুলোতেও সহজে করতে পারবেন।&lt;/p&gt;
&lt;h3&gt;
  
  
  ক্লাউড সার্ভারের অপারেটিং সিস্টেম:
&lt;/h3&gt;

&lt;p&gt;সার্ভার কেনার সময় আপনাকে অপারেটিং সিস্টেম বেছে নিতে হয়। &lt;strong&gt;Ubuntu&lt;/strong&gt; (Linux-ভিত্তিক) সবচেয়ে বেশি ব্যবহৃত:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ubuntu 20.04 LTS&lt;/strong&gt;: স্থিতিশীল, বেশি সাপোর্টেড — সাধারণ কাজের জন্য প্রস্তাবিত&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ubuntu 22.04 LTS&lt;/strong&gt;: সর্বশেষ স্থিতিশীল সংস্করণ&lt;/li&gt;
&lt;li&gt;LTS মানে "Long Term Support" — দীর্ঘদিন আপডেট পাবেন&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  অধ্যায় ৭: SSH Key — ডিজিটাল চাবির সিস্টেম
&lt;/h2&gt;

&lt;p&gt;এটি সবচেয়ে গুরুত্বপূর্ণ অধ্যায়। SSH Key না বুঝলে সার্ভারে সংযোগ করা কঠিন হবে।&lt;/p&gt;
&lt;h3&gt;
  
  
  SSH Key কী?
&lt;/h3&gt;

&lt;p&gt;SSH Key হলো একজোড়া ডিজিটাল চাবি। একটি &lt;strong&gt;তালা&lt;/strong&gt; (Public Key) এবং একটি &lt;strong&gt;চাবি&lt;/strong&gt; (Private Key)।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────┐
│  কি-পেয়ার (Key Pair)                           │
│  ─────────────────                              │
│  Private Key (id_rsa)     → আপনার কাছে থাকে   │
│  Public Key (id_rsa.pub)  → সার্ভারে রাখা হয়  │
└─────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;নিয়মটা মনে রাখুন:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;যে মেশিন থেকে &lt;strong&gt;এক্সেস করবেন&lt;/strong&gt; → সেখানে &lt;strong&gt;Private Key&lt;/strong&gt; রাখুন&lt;/li&gt;
&lt;li&gt;যে মেশিনকে &lt;strong&gt;এক্সেস করতে চান&lt;/strong&gt; → সেখানে &lt;strong&gt;Public Key&lt;/strong&gt; রাখুন&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  কেন পাসওয়ার্ডের বদলে SSH Key?
&lt;/h3&gt;

&lt;p&gt;পাসওয়ার্ড দিয়েও সার্ভারে ঢোকা যায়, কিন্তু:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;পাসওয়ার্ড চুরি হওয়ার ঝুঁকি বেশি&lt;/li&gt;
&lt;li&gt;SSH Key গণিতগতভাবে অনেক বেশি সুরক্ষিত&lt;/li&gt;
&lt;li&gt;একবার সেটআপ করলে বারবার পাসওয়ার্ড দিতে হয় না&lt;/li&gt;
&lt;li&gt;প্রফেশনাল পরিবেশে এটিই স্ট্যান্ডার্ড&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SSH Key কীভাবে তৈরি করবেন?
&lt;/h3&gt;

&lt;p&gt;যেকোনো কম্পিউটারের টার্মিনালে এই কমান্ড দিন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa &lt;span class="nt"&gt;-b&lt;/span&gt; 4096 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"আপনার-ইমেইল@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;কমান্ড দেওয়ার পর:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ফাইলের নাম জিজ্ঞেস করবে&lt;/strong&gt;: Enter দিলে ডিফল্ট নাম (&lt;code&gt;id_rsa&lt;/code&gt;) নেবে। আলাদা নাম দিতে চাইলে টাইপ করুন।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Passphrase জিজ্ঞেস করবে&lt;/strong&gt;: Enter দিয়ে ফাঁকা রেখে দিন (এখন সহজের জন্য)।&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;গুরুত্বপূর্ণ&lt;/strong&gt;: GitHub Actions-এর সাথে SSH ব্যবহারের সময় Passphrase ফাঁকা রাখুন, নইলে অটোমেশনে সমস্যা হবে।&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  তৈরি হওয়া Key ফাইলগুলো কোথায় থাকে?
&lt;/h3&gt;

&lt;p&gt;Mac/Linux এ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.ssh/id_rsa          ← Private Key (কখনো কাউকে দেবেন না!)
~/.ssh/id_rsa.pub      ← Public Key (সার্ভারে দেওয়া যায়)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই ফাইলগুলো দেখতে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# .ssh ফোল্ডারে যাওয়া&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/.ssh

&lt;span class="c"&gt;# সব ফাইল দেখা (hidden ফাইলসহ)&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lah&lt;/span&gt;

&lt;span class="c"&gt;# Public Key এর ভেতরে কী আছে দেখা&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;id_rsa.pub

&lt;span class="c"&gt;# Private Key এর ভেতরে কী আছে দেখা (এটি কখনো শেয়ার করবেন না)&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;id_rsa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Public Key কেমন দেখায়?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ssh"&gt;&lt;code&gt;&lt;span class="k"&gt;ssh&lt;/span&gt;-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDKGr9n...দীর্ঘ স্ট্রিং... আপনার-ইমেইল@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই পুরো লাইনটি আপনার Public Key।&lt;/p&gt;

&lt;h3&gt;
  
  
  একাধিক Key তৈরি করা কি যায়?
&lt;/h3&gt;

&lt;p&gt;হ্যাঁ! আপনি চাইলে ভিন্ন ভিন্ন উদ্দেশ্যে ভিন্ন ভিন্ন Key তৈরি করতে পারেন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# GitHub-এর জন্য আলাদা key&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa &lt;span class="nt"&gt;-b&lt;/span&gt; 4096 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"github-actions-key"&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.ssh/github_actions_key

&lt;span class="c"&gt;# নিজের সার্ভার এক্সেসের জন্য আলাদা key&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa &lt;span class="nt"&gt;-b&lt;/span&gt; 4096 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"my-server-key"&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.ssh/my_server_key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এটি &lt;strong&gt;best practice&lt;/strong&gt; — কারণ একটি key কম্প্রোমাইজ হলে অন্যগুলো নিরাপদ থাকে।&lt;/p&gt;




&lt;h2&gt;
  
  
  অধ্যায় ৮: DigitalOcean থেকে সার্ভার কেনা (ধাপে ধাপে)
&lt;/h2&gt;

&lt;p&gt;DigitalOcean-এ একটি সার্ভার (তারা বলে "Droplet") তৈরি করার ধাপগুলো:&lt;/p&gt;

&lt;h3&gt;
  
  
  ধাপ ১: একাউন্ট তৈরি ও লগইন
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;digitalocean.com&lt;/code&gt; এ গিয়ে একাউন্ট খুলুন। ক্রেডিট কার্ড দিয়ে ভেরিফাই করতে হবে।&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;বিকল্প&lt;/strong&gt;: বাংলাদেশের লোকাল সার্ভার প্রোভাইডার থেকেও Linux সার্ভার কিনতে পারেন। প্রক্রিয়া একই।&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ধাপ ২: Droplets মেনু খুলুন
&lt;/h3&gt;

&lt;p&gt;বাম পাশের মেনুতে &lt;strong&gt;"Droplets"&lt;/strong&gt; ক্লিক করুন। Droplets মানে ছোট ছোট ক্লাউড কম্পিউটার।&lt;/p&gt;

&lt;h3&gt;
  
  
  ধাপ ৩: "Create Droplet" বাটনে ক্লিক করুন
&lt;/h3&gt;

&lt;h3&gt;
  
  
  ধাপ ৪: Region (অবস্থান) বেছে নিন
&lt;/h3&gt;

&lt;p&gt;বাংলাদেশ থেকে সবচেয়ে কাছের সার্ভার:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Singapore&lt;/strong&gt; — সবচেয়ে ভালো (কম latency)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bangalore&lt;/strong&gt; — দ্বিতীয় বিকল্প&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ধাপ ৫: Operating System বেছে নিন
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Ubuntu → 20.04 LTS&lt;/strong&gt; বা &lt;strong&gt;22.04 LTS&lt;/strong&gt; বেছে নিন।&lt;/p&gt;

&lt;h3&gt;
  
  
  ধাপ ৬: Plan (দাম) বেছে নিন
&lt;/h3&gt;

&lt;p&gt;শেখার জন্য সবচেয়ে সস্তা প্ল্যান নিন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;$4/মাস&lt;/strong&gt; — 1 GB RAM, 1 CPU, 25 GB SSD — শুরুর জন্য যথেষ্ট&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ধাপ ৭: Authentication Method বেছে নিন
&lt;/h3&gt;

&lt;p&gt;এখানে দুটি অপশন আছে:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;SSH Keys&lt;/strong&gt; ← এটি বেছে নিন (বেশি নিরাপদ)&lt;/li&gt;
&lt;li&gt;Password ← শেখার জন্য ব্যবহার করা যায়&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;SSH Key অপশনে ক্লিক করুন এবং আপনার Public Key পেস্ট করুন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# আপনার Public Key কপি করুন:&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_rsa.pub
&lt;span class="c"&gt;# উপরের আউটপুট কপি করে DigitalOcean-এর বক্সে পেস্ট করুন&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ধাপ ৮: সার্ভারের নাম দিন
&lt;/h3&gt;

&lt;p&gt;যেমন: &lt;code&gt;my-deployment-server&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ধাপ ৯: "Create Droplet" ক্লিক করুন
&lt;/h3&gt;

&lt;p&gt;কিছুক্ষণের মধ্যে আপনার সার্ভার তৈরি হয়ে যাবে। সার্ভারটি একটি &lt;strong&gt;IP Address&lt;/strong&gt; পাবে — যেমন &lt;code&gt;209.71.xx.xx&lt;/code&gt;।&lt;/p&gt;

&lt;p&gt;এই IP Address মনে রাখুন বা কপি করে রাখুন।&lt;/p&gt;




&lt;h2&gt;
  
  
  অধ্যায় ৯: লোকাল মেশিন থেকে সার্ভারে SSH সংযোগ
&lt;/h2&gt;

&lt;p&gt;এখন আমরা আমাদের ল্যাপটপ থেকে সার্ভারে সংযোগ করব।&lt;/p&gt;

&lt;h3&gt;
  
  
  SSH কানেক্ট করার কমান্ড:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh root@209.71.xx.xx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এখানে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;root&lt;/code&gt; = সার্ভারের অ্যাডমিন ইউজার নাম&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;209.71.xx.xx&lt;/code&gt; = আপনার সার্ভারের IP Address&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  প্রথমবার সংযোগে কী হবে?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;The authenticity of host '209.71.xx.xx' can't be established.
RSA key fingerprint is SHA256:...
Are you sure you want to continue connecting (yes/no)?
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;yes&lt;/code&gt; টাইপ করুন। এরপর সার্ভারে ঢুকে যাবেন।&lt;/p&gt;

&lt;h3&gt;
  
  
  সফল সংযোগের চিহ্ন:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;root@my-deployment-server:~#
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই প্রম্পট দেখলে বুঝবেন আপনি এখন &lt;strong&gt;সার্ভারের ভেতরে&lt;/strong&gt;। আপনার টার্মিনাল এখন সেই দূরের সার্ভারে কমান্ড পাঠাচ্ছে।&lt;/p&gt;

&lt;p&gt;এটা একটি অদ্ভুত মুহূর্ত: আপনি ঢাকায় বসে সিঙ্গাপুরের সার্ভারে কমান্ড দিচ্ছেন!&lt;/p&gt;

&lt;h3&gt;
  
  
  সার্ভার থেকে বেরিয়ে আসা:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;অথবা &lt;code&gt;Ctrl+D&lt;/code&gt;।&lt;/p&gt;




&lt;h2&gt;
  
  
  অধ্যায় ১০: গিট ইনস্টল ও সার্ভারে গিটহাব সেটআপ
&lt;/h2&gt;

&lt;p&gt;এখন সার্ভারে গিট ইনস্টল করব, যাতে সার্ভার গিটহাব থেকে কোড নামাতে পারে।&lt;/p&gt;

&lt;h3&gt;
  
  
  সার্ভারে গিট ইনস্টল করা:
&lt;/h3&gt;

&lt;p&gt;SSH দিয়ে সার্ভারে ঢুকুন, তারপর:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# প্যাকেজ লিস্ট আপডেট করা&lt;/span&gt;
apt update

&lt;span class="c"&gt;# গিট ইনস্টল করা&lt;/span&gt;
apt &lt;span class="nb"&gt;install &lt;/span&gt;git &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;# গিট ঠিকমতো ইনস্টল হয়েছে কিনা চেক করা&lt;/span&gt;
git &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  সার্ভারে গিটহাব কনফিগার করা:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"আপনার নাম"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"আপনার-ইমেইল@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  গিটহাব রিপো ক্লোন করা:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# গিটহাব থেকে প্রজেক্ট কপি করা&lt;/span&gt;
git clone https://github.com/আপনার-নাম/session-two.git

&lt;span class="c"&gt;# প্রজেক্ট ফোল্ডারে যাওয়া&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;session-two

&lt;span class="c"&gt;# ফোল্ডারের ভেতরে কী আছে দেখা&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এরপর থেকে নতুন কোড পেতে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  অধ্যায় ১১: GitHub Actions — স্বয়ংক্রিয় ডেপ্লয়মেন্ট পাইপলাইন
&lt;/h2&gt;

&lt;p&gt;এতক্ষণ আমরা দেখলাম সব কাজ ম্যানুয়ালি। কিন্তু প্রতিবার কোড পরিবর্তন করলে কি সার্ভারে ঢুকে &lt;code&gt;git pull&lt;/code&gt; করতে হবে?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;না!&lt;/strong&gt; এখানেই আসে &lt;strong&gt;GitHub Actions&lt;/strong&gt;।&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Actions কী?
&lt;/h3&gt;

&lt;p&gt;GitHub Actions হলো GitHub-এর একটি ফিচার, যেটি দিয়ে আপনি নির্দিষ্ট ঘটনায় (Event) স্বয়ংক্রিয় কাজ চালাতে পারেন।&lt;/p&gt;

&lt;p&gt;উদাহরণ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"যখনই main branch-এ কোড push হবে"&lt;/strong&gt; → &lt;strong&gt;"সার্ভারে স্বয়ংক্রিয়ভাবে git pull করো"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এটাই CI/CD পাইপলাইনের মূল ধারণা।&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Actions-এর মূল উপাদান:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────┐
│  GitHub Actions আর্কিটেকচার                            │
│  ─────────────────────────                              │
│                                                         │
│  Event (ঘটনা)      → কোড push হলো                     │
│       ↓                                                 │
│  Workflow (ওয়ার্কফ্লো) → .yml ফাইলে লেখা নির্দেশ     │
│       ↓                                                 │
│  Runner (রানার)    → ছোট্ট শর্ট-লাইভিং সার্ভার         │
│       ↓                                                 │
│  Jobs (কাজ)        → একটি বা একাধিক কাজ               │
│       ↓                                                 │
│  Steps (ধাপ)       → প্রতিটি কাজের ভেতরের ধাপগুলো     │
└─────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  GitHub Runner কী?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Runner&lt;/strong&gt; হলো GitHub-এর দেওয়া একটি ছোট, সাময়িক কম্পিউটার। যখন আপনি কোড push করেন, GitHub একটি Runner চালু করে, সেটি আপনার &lt;code&gt;.yml&lt;/code&gt; ফাইলের নির্দেশ মেনে কাজ করে, তারপর বন্ধ হয়ে যায়।&lt;/p&gt;

&lt;p&gt;মূল পয়েন্টগুলো:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;এটি &lt;strong&gt;সাময়িক&lt;/strong&gt; (Ephemeral) — কাজ শেষ হলে বন্ধ&lt;/li&gt;
&lt;li&gt;এটি &lt;strong&gt;GitHub-এর মধ্যে&lt;/strong&gt; চলে — আপনার DigitalOcean সার্ভার নয়&lt;/li&gt;
&lt;li&gt;এটি একটি ছোট Ubuntu মেশিন&lt;/li&gt;
&lt;li&gt;এই Runner থেকেই আপনার DigitalOcean সার্ভারে SSH করা হয়&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Events (ঘটনা) কী কী হতে পারে?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;                    &lt;span class="c1"&gt;# কোড push হলে&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;            &lt;span class="c1"&gt;# PR তৈরি হলে&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;       &lt;span class="c1"&gt;# ম্যানুয়ালি চালানো&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;                &lt;span class="c1"&gt;# নির্দিষ্ট সময়ে&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*'&lt;/span&gt;    &lt;span class="c1"&gt;# প্রতিদিন রাত ১২টায়&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  অধ্যায় ১২: YAML ওয়ার্কফ্লো ফাইল — পাইপলাইনের হৃদয়
&lt;/h2&gt;

&lt;p&gt;GitHub Actions-এর সব নির্দেশ একটি &lt;strong&gt;YAML&lt;/strong&gt; ফাইলে লেখা হয়।&lt;/p&gt;

&lt;h3&gt;
  
  
  YAML ফাইল কোথায় রাখতে হয়?
&lt;/h3&gt;

&lt;p&gt;আপনার প্রজেক্টে এই ফোল্ডার স্ট্রাকচার তৈরি করুন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;আপনার-প্রজেক্ট/
├── .github/
│   └── workflows/
│       └── deploy.yml     ← এখানে রাখুন
├── index.html
├── server.js
└── package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  সহজ পরীক্ষামূলক Workflow:
&lt;/h3&gt;

&lt;p&gt;শুরুতে এই সহজ &lt;code&gt;.yml&lt;/code&gt; ফাইল দিয়ে দেখুন GitHub Actions কাজ করছে কিনা:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/deploy.yml&lt;/span&gt;

&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to DigitalOcean&lt;/span&gt;

&lt;span class="c1"&gt;# কখন এই Workflow চলবে?&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;   &lt;span class="c1"&gt;# main branch-এ push হলে&lt;/span&gt;

&lt;span class="c1"&gt;# কী কাজ হবে?&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;echo-message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;   &lt;span class="c1"&gt;# Runner কোন OS ব্যবহার করবে&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# ধাপ ১: রিপোজিটরি চেক করা&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout Repository&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

      &lt;span class="c1"&gt;# ধাপ ২: একটি বার্তা প্রিন্ট করা&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Echo Push Event&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo "A push has happened on the main branch!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই ফাইলটি আপনার প্রজেক্টে যোগ করুন এবং push করুন।&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow চলছে কিনা দেখবেন কীভাবে?
&lt;/h3&gt;

&lt;p&gt;১. GitHub-এ আপনার রিপোতে যান&lt;br&gt;
২. &lt;strong&gt;"Actions"&lt;/strong&gt; ট্যাবে ক্লিক করুন&lt;br&gt;
৩. নতুন একটি Workflow Run দেখা যাবে&lt;br&gt;
৪. সবুজ হলে সফল, লাল হলে ব্যর্থ&lt;/p&gt;
&lt;h3&gt;
  
  
  সার্ভারে ডেপ্লয় করার Workflow:
&lt;/h3&gt;

&lt;p&gt;এখন আসল কাজ — সার্ভারে স্বয়ংক্রিয় ডেপ্লয়:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# ধাপ ১: কোড চেক করা&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout Repository&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

      &lt;span class="c1"&gt;# ধাপ ২: SSH সেটআপ এবং সার্ভারে কানেক্ট&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to Server&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;# SSH ফোল্ডার তৈরি করা&lt;/span&gt;
          &lt;span class="s"&gt;mkdir -p ~/.ssh&lt;/span&gt;

          &lt;span class="s"&gt;# Private Key সেভ করা (GitHub Secret থেকে আসবে)&lt;/span&gt;
          &lt;span class="s"&gt;echo "${{ secrets.DO_SSH_KEY }}" &amp;gt; ~/.ssh/id_rsa&lt;/span&gt;
          &lt;span class="s"&gt;chmod 600 ~/.ssh/id_rsa&lt;/span&gt;

          &lt;span class="s"&gt;# সার্ভার IP known hosts-এ যোগ করা&lt;/span&gt;
          &lt;span class="s"&gt;ssh-keyscan -H ${{ secrets.DO_HOST }} &amp;gt;&amp;gt; ~/.ssh/known_hosts&lt;/span&gt;

          &lt;span class="s"&gt;# সার্ভারে ঢুকে git pull করা&lt;/span&gt;
          &lt;span class="s"&gt;ssh root@${{ secrets.DO_HOST }} "&lt;/span&gt;
            &lt;span class="s"&gt;cd /root/session-two &amp;amp;&amp;amp;&lt;/span&gt;
            &lt;span class="s"&gt;git pull origin main &amp;amp;&amp;amp;&lt;/span&gt;
            &lt;span class="s"&gt;pm2 restart server&lt;/span&gt;
          &lt;span class="s"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  অধ্যায় ১৩: Secrets ও Environment Variables — গোপন তথ্য সুরক্ষা
&lt;/h2&gt;

&lt;p&gt;লক্ষ্য করুন, Workflow ফাইলে সার্ভারের IP সরাসরি লেখা নেই। বরং লেখা আছে &lt;code&gt;${{ secrets.DO_HOST }}&lt;/code&gt;।&lt;/p&gt;

&lt;p&gt;এর কারণ: আপনার সার্ভারের IP বা SSH Key সরাসরি কোডে রাখা &lt;strong&gt;নিরাপদ নয়&lt;/strong&gt; — যে কেউ গিটহাবে দেখে ফেলতে পারবে।&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Secrets কীভাবে সেট করবেন?
&lt;/h3&gt;

&lt;p&gt;১. আপনার রিপোতে যান&lt;br&gt;
২. &lt;strong&gt;Settings&lt;/strong&gt; ট্যাবে ক্লিক করুন&lt;br&gt;
৩. বাম পাশে &lt;strong&gt;"Secrets and variables"&lt;/strong&gt; → &lt;strong&gt;"Actions"&lt;/strong&gt; ক্লিক করুন&lt;br&gt;
৪. &lt;strong&gt;"New repository secret"&lt;/strong&gt; বাটনে ক্লিক করুন&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;যে Secrets যোগ করতে হবে:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Secret নাম&lt;/th&gt;
&lt;th&gt;মান কী হবে&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DO_HOST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;আপনার DigitalOcean সার্ভারের IP (যেমন: &lt;code&gt;209.71.xx.xx&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DO_SSH_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;আপনার Private Key-এর পুরো কন্টেন্ট&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Private Key কপি করবেন কীভাবে?
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Private Key দেখুন:&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_rsa

&lt;span class="c"&gt;# এই পুরো আউটপুট কপি করুন (-----BEGIN RSA PRIVATE KEY----- থেকে -----END RSA PRIVATE KEY----- পর্যন্ত)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;এই পুরো কন্টেন্ট GitHub Secret &lt;code&gt;DO_SSH_KEY&lt;/code&gt;-তে পেস্ট করুন।&lt;/p&gt;
&lt;h3&gt;
  
  
  কোন Key সার্ভারে রাখা থাকবে?
&lt;/h3&gt;

&lt;p&gt;আপনি যে Key pair (&lt;code&gt;id_rsa&lt;/code&gt; এবং &lt;code&gt;id_rsa.pub&lt;/code&gt;) তৈরি করেছেন, সেই Public Key (&lt;code&gt;id_rsa.pub&lt;/code&gt;) আপনার সার্ভারে থাকা দরকার।&lt;/p&gt;

&lt;p&gt;DigitalOcean-এ Droplet তৈরির সময় যদি SSH Key দিয়ে থাকেন, তাহলে ওই Public Key সার্ভারে &lt;code&gt;/root/.ssh/authorized_keys&lt;/code&gt; ফাইলে সংরক্ষিত আছে।&lt;/p&gt;

&lt;p&gt;যদি পরে নতুন Key যোগ করতে চান:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# সার্ভারে ঢুকুন&lt;/span&gt;
ssh root@সার্ভার-আইপি

&lt;span class="c"&gt;# authorized_keys ফাইলে নতুন Public Key যোগ করুন&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"এখানে-public-key-পেস্ট-করুন"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.ssh/authorized_keys

&lt;span class="c"&gt;# ফাইলের পারমিশন ঠিক করুন&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Secrets কেন আলাদা Key ব্যবহার করা উচিত?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best Practice হলো:&lt;/strong&gt; আপনার নিজের সার্ভার এক্সেসের Key এবং GitHub Actions-এর জন্য আলাদা Key তৈরি করুন।&lt;/p&gt;

&lt;p&gt;কারণ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Actions-এর Key হারিয়ে গেলে শুধু সেই Key বাতিল করলেই হবে&lt;/li&gt;
&lt;li&gt;আপনার মূল Key নিরাপদ থাকবে&lt;/li&gt;
&lt;li&gt;নিরাপত্তার স্তর বাড়ে
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# GitHub Actions-এর জন্য আলাদা Key তৈরি:&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa &lt;span class="nt"&gt;-b&lt;/span&gt; 4096 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"github-actions"&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.ssh/github_actions_key

&lt;span class="c"&gt;# এই নতুন Public Key সার্ভারে যোগ করুন:&lt;/span&gt;
&lt;span class="c"&gt;# (সার্ভারে ঢুকে)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/github_actions_key.pub&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.ssh/authorized_keys

&lt;span class="c"&gt;# নতুন Private Key GitHub Secret-এ দিন:&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/github_actions_key
&lt;span class="c"&gt;# এই আউটপুট DO_SSH_KEY secret-এ পেস্ট করুন&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  অধ্যায় ১৪: PM2 — Node.js সার্ভার ব্যাকগ্রাউন্ডে চালানো
&lt;/h2&gt;

&lt;h3&gt;
  
  
  সমস্যাটা কী?
&lt;/h3&gt;

&lt;p&gt;সার্ভারে Node.js অ্যাপ চালাতে সাধারণত:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;কিন্তু এই কমান্ড দিলে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSH session বন্ধ করলে অ্যাপও বন্ধ হয়ে যায়&lt;/li&gt;
&lt;li&gt;সার্ভার রিস্টার্ট হলে অ্যাপ বন্ধ হয়ে যায়&lt;/li&gt;
&lt;li&gt;ক্র্যাশ হলে নিজে থেকে পুনরায় চালু হয় না&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  সমাধান: PM2
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;PM2&lt;/strong&gt; (Process Manager 2) হলো Node.js-এর জন্য একটি Process Manager। এটি আপনার অ্যাপকে ব্যাকগ্রাউন্ডে চালু রাখে।&lt;/p&gt;

&lt;h3&gt;
  
  
  PM2 ইনস্টল করা:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; pm2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  PM2 দিয়ে অ্যাপ চালু করা:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# অ্যাপ শুরু করা&lt;/span&gt;
pm2 start server.js &lt;span class="nt"&gt;--name&lt;/span&gt; my-app

&lt;span class="c"&gt;# চলমান প্রসেসের তালিকা দেখা&lt;/span&gt;
pm2 list

&lt;span class="c"&gt;# লগ দেখা&lt;/span&gt;
pm2 logs my-app

&lt;span class="c"&gt;# অ্যাপ থামানো&lt;/span&gt;
pm2 stop my-app

&lt;span class="c"&gt;# অ্যাপ রিস্টার্ট করা&lt;/span&gt;
pm2 restart my-app

&lt;span class="c"&gt;# অ্যাপ ডিলিট করা&lt;/span&gt;
pm2 delete my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  সার্ভার রিবুটের পরেও PM2 চালু রাখা:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# PM2 কে startup script তৈরি করতে বলুন&lt;/span&gt;
pm2 startup

&lt;span class="c"&gt;# বর্তমান প্রসেস সেভ করুন&lt;/span&gt;
pm2 save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এরপর সার্ভার রিবুট হলেও PM2 স্বয়ংক্রিয়ভাবে আপনার অ্যাপ চালু করবে।&lt;/p&gt;

&lt;h3&gt;
  
  
  PM2 vs নিজে চালানো:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;বিষয়&lt;/th&gt;
&lt;th&gt;&lt;code&gt;node server.js&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;PM2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SSH বন্ধ হলে&lt;/td&gt;
&lt;td&gt;অ্যাপ বন্ধ&lt;/td&gt;
&lt;td&gt;চলতে থাকে&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;সার্ভার রিবুট হলে&lt;/td&gt;
&lt;td&gt;বন্ধ&lt;/td&gt;
&lt;td&gt;স্বয়ংক্রিয় চালু&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ক্র্যাশ হলে&lt;/td&gt;
&lt;td&gt;বন্ধ&lt;/td&gt;
&lt;td&gt;স্বয়ংক্রিয় রিস্টার্ট&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;লগ ম্যানেজমেন্ট&lt;/td&gt;
&lt;td&gt;নেই&lt;/td&gt;
&lt;td&gt;আছে&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  অধ্যায় ১৫: সম্পূর্ণ ওয়ার্কফ্লো — শুরু থেকে শেষ পর্যন্ত
&lt;/h2&gt;

&lt;p&gt;এতক্ষণ আমরা আলাদা আলাদা টুকরো দেখলাম। এবার পুরো ছবিটি একসাথে:&lt;/p&gt;

&lt;h3&gt;
  
  
  একবার সেটআপের কাজ (শুধু প্রথমবার):
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;১. DigitalOcean-এ সার্ভার কেনা + Ubuntu ইনস্টল
      ↓
২. SSH Key তৈরি (লোকাল মেশিনে)
      ↓
৩. Public Key সার্ভারে যোগ করা
      ↓
৪. সার্ভারে SSH করে ঢোকা
      ↓
৫. সার্ভারে গিট, Node.js, PM2 ইনস্টল
      ↓
৬. সার্ভারে প্রজেক্ট ক্লোন করা (git clone)
      ↓
৭. PM2 দিয়ে অ্যাপ চালু করা
      ↓
৮. GitHub Secrets সেট করা (DO_HOST, DO_SSH_KEY)
      ↓
৯. .github/workflows/deploy.yml তৈরি করা
      ↓
১০. Workflow ফাইল push করা → প্রথম পাইপলাইন টেস্ট
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  প্রতিদিনের কাজের ওয়ার্কফ্লো (সেটআপের পরে):
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;আপনি কোড পরিবর্তন করলেন
      ↓
git add .
git commit -m "নতুন ফিচার যোগ"
git push origin main
      ↓
GitHub main branch-এ push দেখে Workflow ট্রিগার হলো
      ↓
GitHub একটি Runner (Ubuntu মেশিন) চালু করল
      ↓
Runner আপনার .yml ফাইলের নির্দেশ মেনে কাজ শুরু করল
      ↓
Runner আপনার DigitalOcean সার্ভারে SSH করল
(Secrets থেকে IP ও Private Key নিল)
      ↓
Runner সার্ভারে গিয়ে "git pull" চালাল
      ↓
সার্ভারে নতুন কোড চলে এলো
      ↓
PM2 restart করা হলো
      ↓
ইউজাররা নতুন ভার্সন দেখতে পেলেন!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  সবুজ চেকমার্ক মানে কী?
&lt;/h3&gt;

&lt;p&gt;GitHub Actions ট্যাবে যদি সবুজ চেকমার্ক দেখেন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;✓ Checkout Repository    (সফল)
✓ Deploy to Server       (সফল)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;তার মানে সার্ভারে নতুন কোড পৌঁছে গেছে!&lt;/p&gt;

&lt;h3&gt;
  
  
  লাল ক্রস মানে কী?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;✗ Deploy to Server       (ব্যর্থ)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;তার মানে কোথাও সমস্যা আছে। এরর মেসেজ পড়ুন, সমস্যা খুঁজুন, ঠিক করুন। এটি স্বাভাবিক — প্রথমবার পাইপলাইন সেটআপে অনেকবার ব্যর্থ হওয়া স্বাভাবিক।&lt;/p&gt;




&lt;h2&gt;
  
  
  অধ্যায় ১৬: বাস্তব দলে ডেপ্লয়মেন্ট কীভাবে হয়?
&lt;/h2&gt;

&lt;p&gt;পাঠাও, বিকাশ বা বড় কোম্পানিতে কীভাবে কাজ হয় সেটা জানা দরকার।&lt;/p&gt;

&lt;h3&gt;
  
  
  Branch Strategy (শাখা কৌশল):
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;main (production) ← সরাসরি push নিষিদ্ধ
  └── develop (staging)
        └── feature/login-page (ডেভেলপারের কাজ)
        └── feature/payment    (আরেকজনের কাজ)
        └── bugfix/checkout    (বাগ ঠিক করা)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  প্রতিটি Branch-এ আলাদা Workflow:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ডেভেলপার branch-এ push করলে → শুধু test চলবে&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;feature/*&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;bugfix/*&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;

&lt;span class="c1"&gt;# main-এ merge হলে → production deploy হবে&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy-production&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ssh ... "git pull &amp;amp;&amp;amp; pm2 restart"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pull Request (PR) Review Process:
&lt;/h3&gt;

&lt;p&gt;১. ডেভেলপার নিজের branch-এ কাজ করে&lt;br&gt;
২. PR তৈরি করে main-এ merge করার অনুরোধ দেয়&lt;br&gt;
৩. &lt;strong&gt;CI চলে&lt;/strong&gt;: টেস্ট পাস না হলে merge করা যাবে না&lt;br&gt;
৪. টিম লিড/সিনিয়র দেখে Approve করেন&lt;br&gt;
৫. Approve হলেই main-এ merge হয়&lt;br&gt;
৬. Merge হওয়া মাত্র Production deploy শুরু হয়&lt;/p&gt;

&lt;p&gt;এই প্রক্রিয়ায় ভুলভাল কোড production-এ যাওয়ার সুযোগ অনেক কম।&lt;/p&gt;
&lt;h3&gt;
  
  
  আরেকটু উন্নত পাইপলাইন (Docker সহ):
&lt;/h3&gt;

&lt;p&gt;Docker ব্যবহার করলে প্রক্রিয়া একটু ভিন্ন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;কোড push হলো
      ↓
CI: Test চলল → Pass হলো
      ↓
Docker Image তৈরি হলো (পুরো অ্যাপ প্যাকেজ করা)
      ↓
Docker Hub/Registry-তে Image push হলো
      ↓
Production সার্ভার নতুন Image pull করল
      ↓
নতুন Container চালু হলো, পুরনো বন্ধ হলো
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docker ব্যবহারে সুবিধা: "আমার মেশিনে চলছে কিন্তু সার্ভারে চলছে না" এই সমস্যা থাকে না।&lt;/p&gt;




&lt;h2&gt;
  
  
  অধ্যায় ১৭: AI/NLP কোডিং — ভবিষ্যতের কোডিং পদ্ধতি
&lt;/h2&gt;

&lt;p&gt;এই ধারণাটি বোঝা আধুনিক ডেভেলপারদের জন্য অত্যন্ত গুরুত্বপূর্ণ।&lt;/p&gt;

&lt;h3&gt;
  
  
  NLP Coding কী?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;NLP Coding&lt;/strong&gt; মানে হলো — প্রোগ্রামিং ভাষায় কোড না লিখে, &lt;strong&gt;স্বাভাবিক ভাষায়&lt;/strong&gt; (ইংরেজি, বাংলা) বলে দিলে AI কোড লিখে দেয়।&lt;/p&gt;

&lt;p&gt;আগের দুনিয়া:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ডেভেলপার → HTML/CSS/JS হাতে লেখেন → ওয়েবপেজ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এখনকার দুনিয়া:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ডেভেলপার → AI-কে বাংলা/ইংরেজিতে বলেন → AI কোড লেখে → ওয়েবপেজ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  উদাহরণ:
&lt;/h3&gt;

&lt;p&gt;AI-কে বলা হলো:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Please make me a Contact Us form with TailwindCSS, mobile responsive and good looking. Use icons where necessary. Use consistent colors following color theory."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI সম্পূর্ণ HTML ফর্ম তৈরি করে দিল।&lt;/p&gt;

&lt;h3&gt;
  
  
  এর মানে কি ডেভেলপারদের কাজ নেই?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;না!&lt;/strong&gt; বরং উল্টো। AI ভালো আউটপুট দেওয়ার জন্য আপনাকে জানতে হবে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend Terminology&lt;/strong&gt;: "color theory", "information hierarchy", "responsive design" — এই শব্দগুলো না জানলে AI-কে সঠিকভাবে বলতে পারবেন না&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;কী লেখা আছে সেটা বোঝার ক্ষমতা&lt;/strong&gt;: AI যা লিখে দেয় তা আপনি বুঝতে না পারলে বাগ ঠিক করতে পারবেন না&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;সিদ্ধান্ত নেওয়ার ক্ষমতা&lt;/strong&gt;: AI কি লিখল সেটা সঠিক কিনা বোঝার জন্য ফান্ডামেন্টাল জ্ঞান দরকার&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AI-এর সীমাবদ্ধতা:
&lt;/h3&gt;

&lt;p&gt;একটি বাস্তব অভিজ্ঞতার কথা মনে রাখুন: AI দিয়ে ক্লাস প্রিপেয়ার করতে ১০-১২ ঘণ্টা লেগেছিল। কারণ এক জায়গায় এরর হয়েছিল যেটা AI ঠিক করতে পারছিল না।&lt;/p&gt;

&lt;p&gt;AI দিয়ে কাজ দ্রুত হয়, কিন্তু জটিল সমস্যায় এখনো মানুষের বিচারবুদ্ধি দরকার।&lt;/p&gt;

&lt;h3&gt;
  
  
  কীভাবে AI দিয়ে ভালো কাজ করবেন?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;স্পষ্টভাবে বলুন&lt;/strong&gt;: যত বেশি বিস্তারিত, তত ভালো আউটপুট&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical term ব্যবহার করুন&lt;/strong&gt;: "TailwindCSS", "responsive", "modal" — এই ধরনের শব্দ AI ভালো বোঝে&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iteratively কাজ করুন&lt;/strong&gt;: প্রথম আউটপুট মনমতো না হলে আরো বিস্তারিত বলুন&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ফলাফল যাচাই করুন&lt;/strong&gt;: AI যা দেয় সেটা অন্ধভাবে ব্যবহার না করে বুঝে নিন&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  অধ্যায় ১৮: পরবর্তী পদক্ষেপ ও রিসোর্স
&lt;/h2&gt;

&lt;h3&gt;
  
  
  এখনই যা করুন:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;১. একটি ছোট সার্ভার কিনুন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;মাসে $4-5 দিয়ে DigitalOcean বা লোকাল প্রোভাইডার থেকে একটি Linux সার্ভার নিন। এটি আপনার শেখার হাতিয়ার।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;২. একটি সরল প্রজেক্ট ডেপ্লয় করুন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;একটি সাধারণ HTML/CSS/JS পেজ বা Node.js অ্যাপ ডেপ্লয় করুন। প্রথমবার ম্যানুয়ালি করুন, তারপর GitHub Actions দিয়ে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;৩. GitHub Actions ডকুমেন্টেশন পড়ুন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GitHub-এর অফিশিয়াল ডকুমেন্টেশন পড়ুন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Workflow syntax বুঝুন&lt;/li&gt;
&lt;li&gt;বিভিন্ন Action ব্যবহার করে দেখুন&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;৪. Bash Scripting শিখুন&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;৩-৪ দিন Bash Scripting দেখুন। এটি deployment পাইপলাইনের জন্য অপরিহার্য।&lt;/p&gt;

&lt;h3&gt;
  
  
  সিভিতে যা যোগ করতে পারবেন:
&lt;/h3&gt;

&lt;p&gt;এই বিষয়গুলো শিখলে আপনার সিভিতে লিখতে পারবেন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Technical Skills:
- CI/CD Pipeline Setup (GitHub Actions)
- Cloud Server Management (DigitalOcean/AWS)
- Linux Server Administration (Ubuntu)
- SSH Key Management
- PM2 Process Management
- Git/GitHub Workflow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই দক্ষতাগুলো চাকরির বাজারে অত্যন্ত মূল্যবান।&lt;/p&gt;

&lt;h3&gt;
  
  
  গুরুত্বপূর্ণ বিষয়গুলো মনে রাখুন:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────┐
│  মূল শিক্ষা                                        │
│  ──────────                                         │
│  ✓ তিনটি মেশিন: Local → GitHub → Server            │
│  ✓ পোর্ট 22 = SSH টানেলিং                          │
│  ✓ পোর্ট 80/443 = HTTP/HTTPS                        │
│  ✓ SSH Key: Private আপনার কাছে, Public সার্ভারে    │
│  ✓ GitHub Actions = কোড push হলে স্বয়ংক্রিয় কাজ  │
│  ✓ Runner = GitHub-এর সাময়িক সার্ভার               │
│  ✓ YAML ফাইল = পাইপলাইনের নির্দেশনা               │
│  ✓ Secrets = গোপন তথ্য নিরাপদে সংরক্ষণ            │
│  ✓ PM2 = Node.js অ্যাপ ব্যাকগ্রাউন্ডে রাখা         │
└─────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  উপসংহার
&lt;/h2&gt;

&lt;p&gt;সফটওয়্যার ডেপ্লয়মেন্ট প্রথম দেখায় জটিল মনে হয়। কিন্তু মূল ধারণাগুলো বুঝলে এটি একটি পরিষ্কার এবং যুক্তিসঙ্গত প্রক্রিয়া।&lt;/p&gt;

&lt;p&gt;মনে রাখুন: &lt;strong&gt;ফান্ডামেন্টাল একই, প্ল্যাটফর্ম যেটাই হোক।&lt;/strong&gt; DigitalOcean, AWS, Azure, GCP — সবজায়গায় SSH, পোর্ট, Key Management, এবং CI/CD-এর ধারণা একই।&lt;/p&gt;

&lt;p&gt;প্রথমবার সেটআপে ভুল হবে, অনেক error দেখবেন — এটা স্বাভাবিক। প্রতিটি error আপনাকে একটু বেশি শেখায়।&lt;/p&gt;

&lt;p&gt;একটি সার্ভার কিনুন, একটি পাইপলাইন বানান, নিজের প্রজেক্ট deploy করুন — শেখার এটাই সেরা পথ।&lt;/p&gt;




</description>
      <category>selfnote</category>
      <category>personalnotes</category>
    </item>
    <item>
      <title>SDLC-1</title>
      <dc:creator>Saiful Islam</dc:creator>
      <pubDate>Sun, 07 Jun 2026 19:25:28 +0000</pubDate>
      <link>https://dev.to/saifulire/sdlc-1-4ip6</link>
      <guid>https://dev.to/saifulire/sdlc-1-4ip6</guid>
      <description>&lt;h1&gt;
  
  
  সফটওয়্যার ইঞ্জিনিয়ারিং: একটি সম্পূর্ণ বাংলা গাইড
&lt;/h1&gt;

&lt;h2&gt;
  
  
  শূন্য থেকে ডেপ্লয়মেন্ট পর্যন্ত
&lt;/h2&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;পাঠকের উদ্দেশ্যে:&lt;/strong&gt; এই বইটি একটি পূর্ণ দিনের বুটক্যাম্প সেশনের উপর ভিত্তি করে রচিত। বইয়ের প্রতিটি অধ্যায় এতটাই বিস্তারিতভাবে লেখা হয়েছে যাতে একজন পাঠক মূল ভিডিও না দেখেও সম্পূর্ণ জ্ঞান অর্জন করতে পারেন।&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;বইটি রচিত হয়েছে হিরা হাসানের সফটওয়্যার ইঞ্জিনিয়ারিং ডে-লং বুটক্যাম্প সেশনের উপর ভিত্তি করে।&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  সূচিপত্র
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;প্রথম অধ্যায়: সফটওয়্যার কী এবং কেন দরকার&lt;/li&gt;
&lt;li&gt;দ্বিতীয় অধ্যায়: সফটওয়্যার ডেভেলপমেন্ট লাইফ সাইকেল (SDLC)&lt;/li&gt;
&lt;li&gt;তৃতীয় অধ্যায়: সফটওয়্যারের প্রযুক্তিগত কাঠামো&lt;/li&gt;
&lt;li&gt;চতুর্থ অধ্যায়: ডেস্কটপ অ্যাপ্লিকেশন — Python দিয়ে হাতে-কলমে&lt;/li&gt;
&lt;li&gt;পঞ্চম অধ্যায়: ওয়েব অ্যাপ্লিকেশন — HTML, CSS ও জাভাস্ক্রিপ্ট&lt;/li&gt;
&lt;li&gt;ষষ্ঠ অধ্যায়: ব্যাক-এন্ড ডেভেলপমেন্ট — Node.js ও Express.js&lt;/li&gt;
&lt;li&gt;সপ্তম অধ্যায়: Git ও GitHub — ভার্সন কন্ট্রোল&lt;/li&gt;
&lt;li&gt;অষ্টম অধ্যায়: ক্লাউড সার্ভার ও ডেপ্লয়মেন্ট&lt;/li&gt;
&lt;li&gt;নবম অধ্যায়: রিয়েল-টাইম অ্যাপ্লিকেশন — Socket.io দিয়ে চ্যাট অ্যাপ&lt;/li&gt;
&lt;li&gt;দশম অধ্যায়: CI/CD পাইপলাইন&lt;/li&gt;
&lt;li&gt;একাদশ অধ্যায়: ক্যারিয়ার পথ ও অর্থ উপার্জনের উপায়&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  প্রথম অধ্যায়: সফটওয়্যার কী এবং কেন দরকার
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ১.১ সফটওয়্যার কি জিনিস?
&lt;/h2&gt;

&lt;p&gt;আমরা প্রতিদিন ফেসবুক ব্যবহার করি, বিকাশ দিয়ে টাকা পাঠাই, Google Map দিয়ে রাস্তা খুঁজি — এগুলো সবই সফটওয়্যার। কিন্তু সফটওয়্যার আসলে কী?&lt;/p&gt;

&lt;p&gt;সহজ ভাষায়, &lt;strong&gt;সফটওয়্যার হলো নির্দেশনার একটি সেট&lt;/strong&gt; যা কম্পিউটারকে বলে দেয় কী করতে হবে। যেমন একটি রেসিপি বই রান্নার নির্দেশনা দেয়, তেমনি সফটওয়্যার কম্পিউটারকে নির্দিষ্ট কাজ করার নির্দেশনা দেয়।&lt;/p&gt;

&lt;p&gt;কিন্তু শুধু সংজ্ঞা জেনে লাভ নেই। আরও গুরুত্বপূর্ণ প্রশ্ন হলো — &lt;strong&gt;আমরা সফটওয়্যার কেন বানাই?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ১.২ সফটওয়্যার বানানোর তিনটি প্রধান কারণ
&lt;/h2&gt;

&lt;p&gt;মডার্ন সফটওয়্যার ডেভেলপমেন্টের পেছনে তিনটি মূল কারণ রয়েছে। এগুলো বুঝলে সফটওয়্যার জগতটা অনেক পরিষ্কার হয়ে যায়।&lt;/p&gt;




&lt;h3&gt;
  
  
  কারণ ১: বড় হিসাব-নিকাশ স্বয়ংক্রিয় করা (Calculation Automation)
&lt;/h3&gt;

&lt;p&gt;একটি সহজ উদাহরণ দিয়ে শুরু করি।&lt;/p&gt;

&lt;p&gt;ধরুন কেউ আপনাকে বললো: &lt;strong&gt;১২ + ১২ = ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;এটা আপনার মস্তিষ্ক সহজেই করতে পারে। কোনো ক্যালকুলেটর লাগে না।&lt;/p&gt;

&lt;p&gt;এবার: &lt;strong&gt;১২৩৪৫৬ ÷ ৫৬ × ৩ + ৭৮৯ − ৪৫৬ = ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;এখন একটু কঠিন হয়ে গেল। ক্যালকুলেটর লাগতে পারে।&lt;/p&gt;

&lt;p&gt;কিন্তু এবার কল্পনা করুন: বাংলাদেশের &lt;strong&gt;প্রায় ১৭ কোটি মানুষের বয়সের গড়&lt;/strong&gt; বের করতে হবে। সবার জন্মতারিখ আছে। এই হিসাব মানুষের পক্ষে করা কার্যত অসম্ভব। কিন্তু একটি কম্পিউটার মাত্র কয়েক সেকেন্ডে করে ফেলতে পারে।&lt;/p&gt;

&lt;p&gt;এই কাজের জন্যই সফটওয়্যার দরকার।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;আরও উদাহরণ:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Maps যখন ঢাকা থেকে চট্টগ্রামের সবচেয়ে দ্রুততম রুট বের করে — এটা একটা জটিল অ্যালগরিদম চলছে&lt;/li&gt;
&lt;li&gt;ChatGPT যখন আপনার প্রশ্নের উত্তর দেয় — এটা বিশাল গাণিতিক হিসাব&lt;/li&gt;
&lt;li&gt;ফেসবুক যখন আপনার বন্ধুদের খুঁজে বের করে — এটা সার্চ অ্যালগরিদম&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;সারাংশ:&lt;/strong&gt; যখন কোনো কাজ এত বড় বা জটিল যে মানুষের পক্ষে করা কঠিন বা সময়সাপেক্ষ, তখন সফটওয়্যার সেটা স্বয়ংক্রিয়ভাবে করে দেয়।&lt;/p&gt;




&lt;h3&gt;
  
  
  কারণ ২: ডেটা আদান-প্রদান (Data Communication)
&lt;/h3&gt;

&lt;p&gt;চিন্তা করুন — ৩০ বছর আগে মানুষ কীভাবে যোগাযোগ করতো?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ধাপ ১ — টেলিফোন যুগ:&lt;/strong&gt;&lt;br&gt;
একটা টেলিফোন ডায়াল করলে অপর প্রান্তে ঘণ্টি বাজতো। উত্তর দিলে কথা হতো। দুটো ডিভাইস একটি তার বা রেডিও লিংকের মাধ্যমে যুক্ত থাকতো। সংযোগ স্থাপিত হলে ভয়েস ডেটা ট্র্যাভেল করতো।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ধাপ ২ — মোবাইল ফোন যুগ:&lt;/strong&gt;&lt;br&gt;
নোকিয়া ১১০০-এর মতো মোবাইল ফোন এলো। তারবিহীন যোগাযোগ হলো। কিন্তু সেই ফোনে ওয়েবসাইট দেখা যেতো না।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ধাপ ৩ — ইন্টারনেট ও স্মার্টফোন যুগ:&lt;/strong&gt;&lt;br&gt;
অ্যান্ড্রয়েড ফোন আর ওয়েবসাইট — এই দুটো প্রায় একই সময়ে বিশাল আকারে বিস্তার লাভ করলো। এখন আপনি ঢাকায় বসে আমেরিকায় থাকা বন্ধুকে WhatsApp বা Facebook Messenger দিয়ে বিনামূল্যে ভিডিও কল করতে পারছেন।&lt;/p&gt;

&lt;p&gt;এই যোগাযোগটা কীভাবে হচ্ছে? ইন্টারনেটের মাধ্যমে। আর ইন্টারনেটের মাধ্যমে এই যোগাযোগ সম্ভব করতে সফটওয়্যার লাগে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ:&lt;/strong&gt; আপনি যখন WhatsApp-এ বার্তা পাঠান, আপনার বার্তাটা:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;আপনার ফোন থেকে WhatsApp-এর সার্ভারে যায়&lt;/li&gt;
&lt;li&gt;সার্ভার থেকে আপনার বন্ধুর ফোনে যায়&lt;/li&gt;
&lt;li&gt;এই পুরো প্রক্রিয়া সফটওয়্যার পরিচালনা করে&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;সারাংশ:&lt;/strong&gt; এক জায়গা থেকে আরেক জায়গায় ডেটা পাঠানোর জন্য — ভয়েস, ভিডিও, ছবি, টেক্সট — সব কিছুর জন্য সফটওয়্যার দরকার।&lt;/p&gt;


&lt;h3&gt;
  
  
  কারণ ৩: এন্টারপ্রাইজ ডেটা ম্যানেজমেন্ট (Enterprise Data Storage &amp;amp; Access)
&lt;/h3&gt;

&lt;p&gt;বড় প্রতিষ্ঠানগুলোর কথা ভাবুন — ব্যাংক, বীমা কোম্পানি, সরকার।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ — ব্যাংকিং সফটওয়্যার:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ধরুন আপনার Standard Chartered ব্যাংকের অ্যাকাউন্টে ১,০০০ টাকা আছে। আপনি একই সময়ে তিনটি ATM বুথ থেকে ৫০০ টাকা করে তোলার চেষ্টা করা হচ্ছে (আপনার কার্ড ও PIN তিনজন জানে)।&lt;/p&gt;

&lt;p&gt;মোট তোলার চেষ্টা: ৫০০ × ৩ = ১,৫০০ টাকা&lt;br&gt;
কিন্তু অ্যাকাউন্টে আছে: ১,০০০ টাকা&lt;/p&gt;

&lt;p&gt;এই পরিস্থিতিতে কী হওয়া উচিত? কাউকে সর্বোচ্চ ১,০০০ টাকা তুলতে দেওয়া উচিত, বাকিদের না। এই কাজটা কীভাবে হয়?&lt;/p&gt;

&lt;p&gt;তিনটি ATM বুথ একটি কেন্দ্রীয় ডেটাবেসের সাথে যুক্ত থাকে। প্রথম ৫০০ টাকা তোলার সাথে সাথে ডেটাবেস আপডেট হয়ে যায় (১,০০০ − ৫০০ = ৫০০)। দ্বিতীয় ও তৃতীয় বুথ থেকে তোলার চেষ্টা করলে সিস্টেম জানে যে মাত্র ৫০০ টাকা আছে।&lt;/p&gt;

&lt;p&gt;এই পুরো সিস্টেম পরিচালনার জন্য সফটওয়্যার লাগে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;আরও বড় উদাহরণ:&lt;/strong&gt; Standard Chartered ব্যাংকের শাখা আছে বাংলাদেশে, ভারতে এবং আমেরিকায়। আপনি বাংলাদেশ থেকে ২০০ টাকা তুললেন, ভারত থেকে ১০০ টাকা তুললেন, আমেরিকা থেকে ১৫০ টাকা তুললেন — সব লেনদেন একটি কেন্দ্রীয় লেজার বইতে রেকর্ড হয়। এটা সম্ভব করে সফটওয়্যার।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;সারাংশ:&lt;/strong&gt; বড় প্রতিষ্ঠানগুলো তাদের বিশাল পরিমাণ ডেটা সংরক্ষণ, প্রক্রিয়াকরণ ও বিতরণের জন্য সফটওয়্যার ব্যবহার করে।&lt;/p&gt;


&lt;h2&gt;
  
  
  ১.৩ ইন্টারনেট কীভাবে কাজ করে — সহজ ভাষায়
&lt;/h2&gt;

&lt;p&gt;সফটওয়্যার বোঝার আগে ইন্টারনেট বোঝাটা জরুরি।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ইন্টারনেট হলো ডিভাইসগুলোর একটি বিশাল নেটওয়ার্ক।&lt;/strong&gt; পৃথিবীর প্রতিটি কম্পিউটার, মোবাইল, সার্ভার — সবকিছু কোনো না কোনোভাবে যুক্ত।&lt;/p&gt;

&lt;p&gt;এই যোগাযোগ দুটো উপায়ে হয়:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;১. তার (Wired):&lt;/strong&gt; বাংলাদেশ থেকে আমেরিকার সাথে যোগাযোগ হয় সমুদ্রের তলদেশ দিয়ে যাওয়া সাবমেরিন ক্যাবলের মাধ্যমে। এই তারগুলো হাজার হাজার কিলোমিটার লম্বা।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;২. তারবিহীন (Wireless):&lt;/strong&gt; মোবাইল টাওয়ার, ওয়াইফাই, এবং এখন স্যাটেলাইট ইন্টারনেট (যেমন Starlink)। স্যাটেলাইট ইন্টারনেটের সুবিধা হলো পৃথিবীর যেকোনো জায়গা থেকে একই সংযোগ ব্যবহার করা যায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IP Address কী?&lt;/strong&gt;&lt;br&gt;
পৃথিবীর প্রতিটি ডিভাইসের একটি অনন্য ঠিকানা আছে — এটাকে বলে IP Address। যেমন আপনার বাড়ির ঠিকানা আছে, তেমনি প্রতিটি কম্পিউটারের ঠিকানা আছে। এই ঠিকানার মাধ্যমেই ডেটা সঠিক গন্তব্যে পৌঁছায়।&lt;/p&gt;


&lt;h2&gt;
  
  
  ১.৪ সফটওয়্যারের তিনটি পক্ষ (Parties)
&lt;/h2&gt;

&lt;p&gt;যেকোনো সফটওয়্যারে সাধারণত তিনটি পক্ষ জড়িত থাকে:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;১. ডেভেলপার (Developer):&lt;/strong&gt;&lt;br&gt;
যারা সফটওয়্যার বানায়। সিনেমার উপমায় — যারা ক্যামেরা চালায়, অভিনয় করায়, সিনেমা এডিট করে। ফেসবুকের ডেভেলপাররা ফেসবুক তৈরি করেছে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;২. এন্ড ইউজার (End User / Client):&lt;/strong&gt;&lt;br&gt;
যারা সফটওয়্যার ব্যবহার করে। আমরা যখন ফেসবুক চালাই, আমরা ইউজার। তারা টেকনিক্যাল জিনিস না জানলেও চলে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;৩. মালিক / বিজনেস ওনার (Owner):&lt;/strong&gt;&lt;br&gt;
যিনি সফটওয়্যার বানানোর উদ্যোগ নেন এবং বিনিয়োগ করেন। মার্ক জাকারবার্গ ফেসবুকের মালিক। তিনি সরাসরি কোড না লিখলেও ব্যবসায়িক সিদ্ধান্ত নেন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;বাস্তব উদাহরণ:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;মালিক:&lt;/strong&gt; মার্ক জাকারবার্গ&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ডেভেলপার:&lt;/strong&gt; ফেসবুকের ইঞ্জিনিয়াররা&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ইউজার:&lt;/strong&gt; আমরা সবাই যারা ফেসবুক চালাই&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  ১.৫ সফটওয়্যারের প্রধান বিভাগ
&lt;/h2&gt;

&lt;p&gt;আধুনিক যুগে সফটওয়্যার তিন ধরনের হয়:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;১. ক্যালকুলেশন-ভিত্তিক সফটওয়্যার:&lt;/strong&gt;&lt;br&gt;
বড় হিসাব করে, যেমন বৈজ্ঞানিক গবেষণার সফটওয়্যার, AI সিস্টেম।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;২. কমিউনিকেশন-ভিত্তিক সফটওয়্যার:&lt;/strong&gt;&lt;br&gt;
মানুষকে সংযুক্ত রাখে — WhatsApp, Facebook, Gmail।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;৩. এন্টারপ্রাইজ সফটওয়্যার:&lt;/strong&gt;&lt;br&gt;
বড় প্রতিষ্ঠানের ব্যবস্থাপনার জন্য — ব্যাংকিং সিস্টেম, হাসপাতাল ম্যানেজমেন্ট, সরকারি রেকর্ড।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;নতুন সংযোজন — AI ডোমেইন:&lt;/strong&gt;&lt;br&gt;
আজকের যুগে চতুর্থ একটি বিভাগ যুক্ত হয়েছে। AI-ভিত্তিক সফটওয়্যার, যা মূলত প্রথম বিভাগেরই উন্নত রূপ। বিশাল পরিমাণ ডেটা ব্যবহার করে বুদ্ধিমান সিদ্ধান্ত নেওয়ার ক্ষমতা অর্জন করে।&lt;/p&gt;


&lt;h1&gt;
  
  
  দ্বিতীয় অধ্যায়: সফটওয়্যার ডেভেলপমেন্ট লাইফ সাইকেল (SDLC)
&lt;/h1&gt;
&lt;h2&gt;
  
  
  ২.১ লাইফ সাইকেল মানে কী?
&lt;/h2&gt;

&lt;p&gt;মানুষের জীবনচক্র আমরা স্কুলে পড়েছি — জন্ম, শৈশব, কৈশোর, যৌবন, বার্ধক্য, মৃত্যু। ব্যাঙের জীবনচক্র আমরা জীববিজ্ঞানে পড়েছি।&lt;/p&gt;

&lt;p&gt;ঠিক তেমনি, &lt;strong&gt;সফটওয়্যারেরও একটি জীবনচক্র আছে।&lt;/strong&gt; একটি সফটওয়্যার কীভাবে শুরু হয়, কীভাবে তৈরি হয়, কীভাবে মানুষের কাছে পৌঁছায়, এবং কীভাবে রক্ষণাবেক্ষণ হয় — এটাই SDLC বা Software Development Life Cycle।&lt;/p&gt;

&lt;p&gt;SDLC বোঝা গুরুত্বপূর্ণ কারণ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;একটি সফটওয়্যারে কতজন মানুষ কাজ করে তা বোঝা যায়&lt;/li&gt;
&lt;li&gt;কোথায় সমস্যা হলে কী পরিমাণ ক্ষতি হয় তা বোঝা যায়&lt;/li&gt;
&lt;li&gt;ক্যারিয়ার পথ বেছে নেওয়া সহজ হয়&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  ২.২ SDLC-এর ধাপগুলো
&lt;/h2&gt;

&lt;p&gt;একটি সফটওয়্যার তৈরির প্রক্রিয়া নিচের ধাপে হয়:&lt;/p&gt;


&lt;h3&gt;
  
  
  ধাপ ১: পরিকল্পনা (Planning) — বিজনেস ওনারের ভূমিকা
&lt;/h3&gt;

&lt;p&gt;সফটওয়্যারের ধারণা প্রথমে আসে মালিকের মাথায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ:&lt;/strong&gt; ধরুন একজন উদ্যোক্তা ভাবছেন একটি রাইড-শেয়ারিং অ্যাপ বানাবেন (Uber-এর মতো)। তার মাথায় আসে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;আমি এটা বানাবো&lt;/li&gt;
&lt;li&gt;প্রতি বছর কোটি টাকা আয় করবো&lt;/li&gt;
&lt;li&gt;আমার একটি মোবাইল অ্যাপ লাগবে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;মালিক এই পর্যায়ে টেকনিক্যাল বিষয় জানেন না। তিনি শুধু ব্যবসায়িক পরিকল্পনা করেন।&lt;/p&gt;

&lt;p&gt;এই পর্যায়ে যে ডকুমেন্ট তৈরি হয় তাকে বলে &lt;strong&gt;BRD — Business Requirements Document (ব্যবসায়িক প্রয়োজনীয়তার দলিল)।&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BRD-তে কী থাকে:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;সফটওয়্যার কী করবে (হাই-লেভেলে)&lt;/li&gt;
&lt;li&gt;ব্যবসায়িক লক্ষ্য কী&lt;/li&gt;
&lt;li&gt;কোন ধরনের পেমেন্ট গ্রহণ করবে&lt;/li&gt;
&lt;li&gt;কোন পণ্য বা সেবা বিক্রি হবে&lt;/li&gt;
&lt;li&gt;সপ্তাহের ৭ দিন ২৪ ঘণ্টা চলতে হবে কি না&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;গুরুত্বপূর্ণ বিষয়:&lt;/strong&gt; BRD-তে কোনো টেকনিক্যাল বিষয় থাকে না। ডেটাবেস কী, কোন প্রোগ্রামিং ভাষা ব্যবহার হবে — এসব মালিকের দরকার নেই।&lt;/p&gt;


&lt;h3&gt;
  
  
  ধাপ ২: বিশ্লেষণ (Analysis) — বিজনেস অ্যানালিস্টের ভূমিকা
&lt;/h3&gt;

&lt;p&gt;মালিকের BRD পেয়ে বিজনেস অ্যানালিস্টরা কাজ শুরু করেন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;বিজনেস অ্যানালিস্ট কী করেন:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ব্যবসাটি আসলেই লাভজনক হবে কি না তা যাচাই করেন&lt;/li&gt;
&lt;li&gt;বাজারে এই পণ্যের চাহিদা আছে কি না দেখেন&lt;/li&gt;
&lt;li&gt;প্রতিযোগীরা কে কে — Uber-এর মতো অ্যাপ কতটি আছে, তাদের মার্কেট শেয়ার কত&lt;/li&gt;
&lt;li&gt;লাভ-লোকসানের সম্ভাবনা কী&lt;/li&gt;
&lt;li&gt;ঝুঁকি কোথায়&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;অ্যানালিস্টরা বলতে পারেন "ভাই, এই ব্যবসায় লোকসান হবে, যাবেন না" — অথবা "এখানে বিশাল সুযোগ আছে, তাড়াতাড়ি বিনিয়োগ করুন।"&lt;/p&gt;


&lt;h3&gt;
  
  
  ধাপ ৩: পণ্য বিশ্লেষণ (Product Analysis) — প্রোডাক্ট ম্যানেজারের ভূমিকা
&lt;/h3&gt;

&lt;p&gt;বিজনেস অ্যানালিসিসের পরে আসেন প্রোডাক্ট ম্যানেজার।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রোডাক্ট ম্যানেজার কী করেন:&lt;/strong&gt;&lt;br&gt;
প্রোডাক্ট ম্যানেজার সেতুবন্ধন করেন ব্যবসার উদ্দেশ্য এবং ব্যবহারকারীর চাহিদার মধ্যে।&lt;/p&gt;

&lt;p&gt;তারা ভাবেন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ব্যবহারকারী কী চায়?&lt;/li&gt;
&lt;li&gt;অ্যাপে কোন কোন ফিচার থাকলে ব্যবহারকারীরা খুশি হবে?&lt;/li&gt;
&lt;li&gt;বিকাশ অ্যাপের নিচে যে বার থাকে সেটা কি এইভাবে থাকা উচিত?&lt;/li&gt;
&lt;li&gt;ফিচার লিস্ট কী হবে?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;কীভাবে তথ্য সংগ্রহ করেন:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ব্যবহারকারীদের সার্ভে করেন&lt;/li&gt;
&lt;li&gt;প্রতিযোগী অ্যাপ ব্যবহার করে দেখেন&lt;/li&gt;
&lt;li&gt;Product Hunt (producthunt.com) এ নতুন পণ্য খোঁজেন&lt;/li&gt;
&lt;li&gt;Tech Crunch-এর মতো ওয়েবসাইট পড়েন&lt;/li&gt;
&lt;li&gt;ব্যবহারকারীর আচরণ সংক্রান্ত গবেষণাপত্র পড়েন&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;চূড়ান্ত আউটপুট কী:&lt;/strong&gt;&lt;br&gt;
প্রোডাক্ট ম্যানেজার একটি &lt;strong&gt;Wireframe&lt;/strong&gt; তৈরি করেন। Wireframe হলো অ্যাপের হাতে আঁকা কাঠামো — কোথায় কী থাকবে সেটার প্রাথমিক রূপরেখা।&lt;/p&gt;

&lt;p&gt;এটা সুন্দর ডিজাইন নয়। কাগজে পেন্সিল দিয়ে আঁকা হতে পারে। কিন্তু এটা থেকে বোঝা যায়:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;এই বাটনে ক্লিক করলে কোথায় যাবে&lt;/li&gt;
&lt;li&gt;কোন স্ক্রিনে কী থাকবে&lt;/li&gt;
&lt;li&gt;ব্যবহারকারীর যাত্রা কেমন হবে (User Journey)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;User Requirements Document (URD):&lt;/strong&gt; প্রোডাক্ট ম্যানেজারের কাজের চূড়ান্ত ফলাফল হলো URD। এতে ফিচারগুলো তালিকাবদ্ধ করা থাকে।&lt;/p&gt;

&lt;p&gt;উদাহরণ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ব্যবহারকারীরা লগইন ছাড়া কোনো পণ্য অর্ডার করতে পারবে না&lt;/li&gt;
&lt;li&gt;লগইন ছাড়া অবস্থান দেখা যাবে না&lt;/li&gt;
&lt;li&gt;ব্যবহারকারীরা পণ্যের ক্যাটালগ দেখতে পারবে&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  ধাপ ৪: ডিজাইন (Design) — UI/UX ডিজাইনারের ভূমিকা
&lt;/h3&gt;

&lt;p&gt;প্রোডাক্ট ম্যানেজারের Wireframe পেয়ে UI/UX ডিজাইনাররা কাজ শুরু করেন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UI (User Interface):&lt;/strong&gt; অ্যাপটি দেখতে কেমন — রঙ, ফন্ট, বোতামের আকার।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UX (User Experience):&lt;/strong&gt; ব্যবহারকারীর অভিজ্ঞতা — অ্যাপ ব্যবহার করা কতটা সহজ।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;তারা কী তৈরি করেন:&lt;/strong&gt;&lt;br&gt;
Figma বা Adobe XD সফটওয়্যার ব্যবহার করে সম্পূর্ণ অ্যাপের চেহারা তৈরি করেন। এটা দেখতে একদম আসল অ্যাপের মতো, কিন্তু এটা ক্লিক করলে কাজ করে না। এটা শুধু "দেখার জন্য" — কোড নেই।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;কারা Figma ব্যবহার করেন:&lt;/strong&gt;&lt;br&gt;
গ্রাফিক ডিজাইনার, UI ডিজাইনার — যারা Figma বা Photoshop জানেন।&lt;/p&gt;


&lt;h3&gt;
  
  
  ধাপ ৫: বাস্তবায়ন (Implementation) — ডেভেলপমেন্ট টিমের ভূমিকা
&lt;/h3&gt;

&lt;p&gt;এখন সফটওয়্যার ডেভেলপাররা কাজ শুরু করেন।&lt;/p&gt;

&lt;p&gt;তাদের কাছে থাকে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;প্রোডাক্ট ম্যানেজারের Requirements Document&lt;/li&gt;
&lt;li&gt;UI/UX টিমের ডিজাইন ফাইল&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এই দুটো ইনপুট নিয়ে তারা আসল সফটওয়্যার কোড লেখেন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ডেভেলপমেন্ট টিমের ভেতরে কত রকম ভূমিকা:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ফ্রন্ট-এন্ড ডেভেলপার (যা ব্যবহারকারী দেখেন)&lt;/li&gt;
&lt;li&gt;ব্যাক-এন্ড ডেভেলপার (সার্ভারের কাজ)&lt;/li&gt;
&lt;li&gt;ডেটাবেস অ্যাডমিনিস্ট্রেটর&lt;/li&gt;
&lt;li&gt;DevOps ইঞ্জিনিয়ার&lt;/li&gt;
&lt;li&gt;টিম লিড&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;কাজ ম্যানেজ করার পদ্ধতি:&lt;/strong&gt;&lt;br&gt;
কাজগুলো ছোট ছোট ভাগে ভাগ করা হয়। &lt;strong&gt;Scrum&lt;/strong&gt; এবং &lt;strong&gt;Kanban&lt;/strong&gt; নামের পদ্ধতি ব্যবহার করা হয়। এগুলো দিয়ে ট্র্যাক রাখা হয় কে কোন কাজ করছেন, কোন কাজ শেষ হয়েছে, কোথায় সমস্যা আছে।&lt;/p&gt;


&lt;h3&gt;
  
  
  ধাপ ৬: টেস্টিং (Testing) — QA টিমের ভূমিকা
&lt;/h3&gt;

&lt;p&gt;সফটওয়্যার বানানো হলে সরাসরি বাজারে ছাড়া হয় না। আগে টেস্ট করা হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;কেন টেস্টিং দরকার:&lt;/strong&gt;&lt;br&gt;
কল্পনা করুন বিকাশ অ্যাপে এমন বাগ আছে যে কারো অ্যাকাউন্টে টাকা না থাকলেও সে ক্যাশআউট করতে পারছে। এটা কোম্পানির জন্য বিপর্যয়কর।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;টেস্টিংয়ের ধরন:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ম্যানুয়াল টেস্টিং:&lt;/strong&gt; মানুষ হাতে হাতে প্রতিটি ফিচার যাচাই করেন&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;অটোমেটেড টেস্টিং:&lt;/strong&gt; কোড লিখে স্বয়ংক্রিয়ভাবে টেস্ট করা হয়&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ব্ল্যাকবক্স টেস্টিং:&lt;/strong&gt; ভেতরের কোড না জেনে বাইরে থেকে টেস্ট&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;স্যানিটি টেস্ট:&lt;/strong&gt; মূল ফিচারগুলো সঠিক কাজ করছে কি না দেখা&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;টেস্টিং একটি আলাদা ক্যারিয়ার:&lt;/strong&gt;&lt;br&gt;
বাংলাদেশে এবং বিশ্বে &lt;strong&gt;QA (Quality Assurance) ইঞ্জিনিয়ার&lt;/strong&gt; হিসেবে ক্যারিয়ার গড়া যায়। এটি একটি সম্পূর্ণ আলাদা পেশা।&lt;/p&gt;


&lt;h3&gt;
  
  
  ধাপ ৭: ডেপ্লয়মেন্ট (Deployment) — ব্যবহারকারীর কাছে পৌঁছানো
&lt;/h3&gt;

&lt;p&gt;টেস্টিং শেষে সফটওয়্যার ডেপ্লয় করা হয় — মানে ব্যবহারকারীদের কাছে পৌঁছানো হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;প্রথমে Internal Release:&lt;/strong&gt; কোম্পানির ভেতরের মানুষজন প্রথমে ব্যবহার করেন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;তারপর Public Release:&lt;/strong&gt; সাধারণ ব্যবহারকারীরা অ্যাপ আপডেট পান।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ডেপ্লয়মেন্টের পর যদি বাগ থাকে:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ব্যবহারকারীরা রিপোর্ট করেন&lt;/li&gt;
&lt;li&gt;সেটা Bug Board-এ যায়&lt;/li&gt;
&lt;li&gt;ডেভেলপমেন্ট টিম সমস্যা সমাধান করে&lt;/li&gt;
&lt;li&gt;পরবর্তী আপডেটে ঠিক হয়&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  ধাপ ৮: রক্ষণাবেক্ষণ (Maintenance)
&lt;/h3&gt;

&lt;p&gt;সফটওয়্যার ডেপ্লয়ের পরেও কাজ শেষ হয় না।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;মেইনটেন্যান্সের কাজগুলো:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;নিরাপত্তা আপডেট (Security Patches)&lt;/li&gt;
&lt;li&gt;নতুন ফিচার যোগ করা&lt;/li&gt;
&lt;li&gt;সার্ভার পর্যবেক্ষণ করা&lt;/li&gt;
&lt;li&gt;পারফরম্যান্স উন্নত করা&lt;/li&gt;
&lt;li&gt;বাগ ফিক্স করা&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;মেইনটেন্যান্সে কারা কাজ করেন:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DevOps টিম&lt;/li&gt;
&lt;li&gt;Cloud ইঞ্জিনিয়ার&lt;/li&gt;
&lt;li&gt;Cybersecurity টিম&lt;/li&gt;
&lt;li&gt;সফটওয়্যার ডেভেলপার&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  ২.৩ SDLC একটি চক্র — শেষ নেই
&lt;/h2&gt;

&lt;p&gt;SDLC কখনো শেষ হয় না। সফটওয়্যার মেইনটেন্যান্সের পরে নতুন ফিচার আসে, নতুন ফিচারের জন্য আবার পরিকল্পনা হয়, আবার বিশ্লেষণ হয়, আবার ডিজাইন হয়...&lt;/p&gt;

&lt;p&gt;এটা একটি অসীম চক্র।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;আধুনিক পদ্ধতি:&lt;/strong&gt; আধুনিক সফটওয়্যার ডেভেলপমেন্টে কখনো "সব ফিচার একসাথে বানিয়ে তারপর রিলিজ" করা হয় না। ছোট ছোট অংশে (Incremental) ডেভেলপ করা হয়:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;একটু বানাও&lt;/li&gt;
&lt;li&gt;টেস্ট করো&lt;/li&gt;
&lt;li&gt;রিলিজ করো&lt;/li&gt;
&lt;li&gt;ব্যবহারকারীর মতামত নাও&lt;/li&gt;
&lt;li&gt;আবার শুরু করো&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  ২.৪ সবচেয়ে বড় সমস্যা: ভুল বোঝাবুঝি (Miscommunication)
&lt;/h2&gt;

&lt;p&gt;SDLC-তে সবচেয়ে বড় সমস্যা হলো তথ্যের ভুল বোঝাবুঝি।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;কীভাবে হয়:&lt;/strong&gt;&lt;br&gt;
মালিক একটি বিষয় ভাবলেন → বিজনেস অ্যানালিস্ট অন্যভাবে বুঝলেন → প্রোডাক্ট ম্যানেজার আরেকভাবে ব্যাখ্যা করলেন → ডেভেলপার ভিন্নভাবে কোড লিখলেন → ব্যবহারকারী একদম অন্য জিনিস চেয়েছিলেন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;সমাধান:&lt;/strong&gt; স্পষ্ট যোগাযোগ। সফটওয়্যার ইঞ্জিনিয়ারের সবচেয়ে গুরুত্বপূর্ণ দক্ষতা কোড লেখা নয়, বরং পরিষ্কার যোগাযোগ করার ক্ষমতা।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ভুল বোঝাবুঝির খরচ:&lt;/strong&gt; যদি শেষ ধাপে (ডেভেলপমেন্ট) ভুল ধরা পড়ে, তাহলে সব ধাপ আবার করতে হতে পারে — এটা অত্যন্ত ব্যয়বহুল।&lt;/p&gt;


&lt;h2&gt;
  
  
  ২.৫ AI যুগে সফটওয়্যার ডেভেলপমেন্ট
&lt;/h2&gt;

&lt;p&gt;অনেকে ভাবেন AI আসলে কি সফটওয়্যার ডেভেলপারের কাজ শেষ হয়ে যাবে?&lt;/p&gt;

&lt;p&gt;উত্তর হলো — না।&lt;/p&gt;

&lt;p&gt;কারণগুলো:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ব্যবসা বোঝা:&lt;/strong&gt; ব্যবসার উদ্দেশ্য কী, সফটওয়্যার সেটা পূরণ করছে কি না — এটা AI বুঝতে পারে না।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;যোগাযোগ:&lt;/strong&gt; ক্লায়েন্টের সাথে কথা বলে সঠিক চাহিদা বোঝা।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;টেস্টিং:&lt;/strong&gt; সফটওয়্যার সঠিকভাবে কাজ করছে কি না যাচাই।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;স্কেল করা:&lt;/strong&gt; লক্ষ লক্ষ ব্যবহারকারীর জন্য সফটওয়্যার চলবে কি না।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;নতুন প্রযুক্তি:&lt;/strong&gt; নতুন প্রযুক্তি এলে নতুন ইঞ্জিনিয়ারিং দরকার।&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AI একটি শক্তিশালী সহকারী। কিন্তু মানুষের বিচার এবং সিদ্ধান্তের বিকল্প নয়।&lt;/p&gt;


&lt;h1&gt;
  
  
  তৃতীয় অধ্যায়: সফটওয়্যারের প্রযুক্তিগত কাঠামো
&lt;/h1&gt;
&lt;h2&gt;
  
  
  ৩.১ সফটওয়্যারের তিনটি মূল অংশ
&lt;/h2&gt;

&lt;p&gt;যেকোনো আধুনিক সফটওয়্যারের তিনটি অংশ থাকে:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────────┐
│                    CLIENT SIDE                    │
│         (ব্যবহারকারীর ডিভাইসে চলে)              │
│   Mobile App | Browser | Desktop App             │
└──────────────────────┬───────────────────────────┘
                       │  ইন্টারনেট
                       │
┌──────────────────────┴───────────────────────────┐
│                    SERVER SIDE                    │
│          (সার্ভারে চলে, ব্যবহারকারী দেখেন না)   │
│         API | Business Logic | Auth               │
└──────────────────────┬───────────────────────────┘
                       │
┌──────────────────────┴───────────────────────────┐
│                    DATABASE                       │
│              (ডেটা সংরক্ষণ করে)                 │
│      PostgreSQL | MySQL | MongoDB | Redis         │
└──────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  অংশ ১: ক্লায়েন্ট সাইড (Client Side / Front-End)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;সংজ্ঞা:&lt;/strong&gt; ব্যবহারকারীর ডিভাইসে যে সফটওয়্যার চলে সেটা ক্লায়েন্ট সাইড।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;আপনার ফোনে বিকাশ অ্যাপ → ক্লায়েন্ট সাইড&lt;/li&gt;
&lt;li&gt;আপনার ব্রাউজারে Facebook.com → ক্লায়েন্ট সাইড&lt;/li&gt;
&lt;li&gt;আপনার কম্পিউটারে VS Code → ক্লায়েন্ট সাইড&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;তিন ধরনের ক্লায়েন্ট:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;মোবাইল অ্যাপ:&lt;/strong&gt; Android বা iOS ফোনে চলে। বিতরণ হয় Play Store বা App Store-এর মাধ্যমে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ওয়েব অ্যাপ:&lt;/strong&gt; ব্রাউজার (Chrome, Firefox) দিয়ে চলে। HTML, CSS, JavaScript দিয়ে তৈরি।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ডেস্কটপ অ্যাপ:&lt;/strong&gt; কম্পিউটারে সরাসরি ইনস্টল হয়।&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  অংশ ২: সার্ভার সাইড (Server Side / Back-End)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;সংজ্ঞা:&lt;/strong&gt; ইন্টারনেটে যুক্ত একটি কম্পিউটার যেখানে সফটওয়্যারের মূল যুক্তি চলে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;সার্ভার কী:&lt;/strong&gt;&lt;br&gt;
সার্ভার একটি সাধারণ কম্পিউটারের মতোই। পার্থক্য হলো এটি:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;সবসময় চালু থাকে (২৪/৭)&lt;/li&gt;
&lt;li&gt;ইন্টারনেটে সংযুক্ত থাকে&lt;/li&gt;
&lt;li&gt;অনেক মানুষের রিকোয়েস্ট একসাথে সামলাতে পারে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ:&lt;/strong&gt; আপনি যখন Facebook খোলেন, আপনার ব্রাউজার Facebook-এর সার্ভারে রিকোয়েস্ট পাঠায়। সার্ভার আপনার নিউজফিড ডেটা পাঠায়। আপনার ব্রাউজার সেটা সুন্দর করে দেখায়।&lt;/p&gt;


&lt;h3&gt;
  
  
  অংশ ৩: ডেটাবেস (Database)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;সংজ্ঞা:&lt;/strong&gt; ডেটা স্থায়ীভাবে সংরক্ষণ করার ব্যবস্থা।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;কেন ডেটাবেস দরকার:&lt;/strong&gt;&lt;br&gt;
কল্পনা করুন বিকাশের কোটি কোটি গ্রাহকের তথ্য। এই তথ্য কোথাও রাখতে হবে। সার্ভার বন্ধ হলেও ডেটা যেন না যায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ডেটাবেসের ধরন:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SQL ডেটাবেস:&lt;/strong&gt; MySQL, PostgreSQL (টেবিল আকারে ডেটা রাখে)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NoSQL ডেটাবেস:&lt;/strong&gt; MongoDB (নমনীয় কাঠামোতে ডেটা রাখে)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache:&lt;/strong&gt; Redis (দ্রুত অ্যাক্সেসের জন্য অস্থায়ী সংরক্ষণ)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  ৩.২ HTTP প্রোটোকল — ক্লায়েন্ট ও সার্ভারের কথা বলার ভাষা
&lt;/h2&gt;

&lt;p&gt;ক্লায়েন্ট এবং সার্ভার কীভাবে কথা বলে? তারা ব্যবহার করে HTTP (HyperText Transfer Protocol)।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP কী:&lt;/strong&gt;&lt;br&gt;
এটি একটি নিয়মের সেট। এই নিয়ম মেনে ক্লায়েন্ট রিকোয়েস্ট পাঠায় এবং সার্ভার রেসপন্স দেয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP-এর চারটি মূল পদ্ধতি (Methods):&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;পদ্ধতি&lt;/th&gt;
&lt;th&gt;মানে&lt;/th&gt;
&lt;th&gt;উদাহরণ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;ডেটা নিয়ে আসো&lt;/td&gt;
&lt;td&gt;Facebook নিউজফিড লোড&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;নতুন ডেটা পাঠাও&lt;/td&gt;
&lt;td&gt;নতুন পোস্ট করা&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PUT&lt;/td&gt;
&lt;td&gt;বিদ্যমান ডেটা আপডেট করো&lt;/td&gt;
&lt;td&gt;প্রোফাইল ছবি পরিবর্তন&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DELETE&lt;/td&gt;
&lt;td&gt;ডেটা মুছে দাও&lt;/td&gt;
&lt;td&gt;পোস্ট মুছে দেওয়া&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;HTTPS:&lt;/strong&gt; HTTP-এর নিরাপদ সংস্করণ। এতে ডেটা এনক্রিপ্ট হয়ে যায়, মাঝখানে কেউ পড়তে পারে না।&lt;/p&gt;


&lt;h2&gt;
  
  
  ৩.৩ API — সার্ভারের দরজা
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;API (Application Programming Interface)&lt;/strong&gt; হলো সার্ভারের নির্দিষ্ট "দরজা" যার মাধ্যমে ক্লায়েন্ট নির্দিষ্ট কাজ করতে পারে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;সহজ উদাহরণ:&lt;/strong&gt;&lt;br&gt;
রেস্টুরেন্টে ওয়েটার হলো API। আপনি (ক্লায়েন্ট) ওয়েটারকে অর্ডার দেন। ওয়েটার রান্নাঘরে (সার্ভার) যায়। রান্নাঘর থেকে খাবার এনে দেয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API Endpoint এর উদাহরণ:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET  /api/users/profile     → ব্যবহারকারীর প্রোফাইল দেখো
POST /api/posts/create      → নতুন পোস্ট তৈরি করো
PUT  /api/posts/123/update  → পোস্ট নম্বর ১২৩ আপডেট করো
DELETE /api/posts/123       → পোস্ট নম্বর ১২৩ মুছে দাও
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ৩.৪ PORT — সার্ভারের দরজা নম্বর
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Port কী:&lt;/strong&gt;&lt;br&gt;
একটি সার্ভারে অনেক সফটওয়্যার একসাথে চলতে পারে। Port নম্বর দিয়ে বোঝা যায় কোন সফটওয়্যারের সাথে কথা বলতে হবে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Port 80: সাধারণ ওয়েব ট্র্যাফিক (HTTP)&lt;/li&gt;
&lt;li&gt;Port 443: নিরাপদ ওয়েব ট্র্যাফিক (HTTPS)&lt;/li&gt;
&lt;li&gt;Port 3000: আমরা আমাদের Node.js অ্যাপের জন্য ব্যবহার করি&lt;/li&gt;
&lt;li&gt;Port 4040: আমাদের চ্যাট অ্যাপের জন্য ব্যবহার করি&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;তুলনা:&lt;/strong&gt; ভাবুন একটি বড় অফিস বিল্ডিং। বিল্ডিং হলো সার্ভার, বিভিন্ন অফিস হলো বিভিন্ন সার্ভিস, অফিস নম্বর হলো Port নম্বর।&lt;/p&gt;


&lt;h1&gt;
  
  
  চতুর্থ অধ্যায়: ডেস্কটপ অ্যাপ্লিকেশন — Python দিয়ে হাতে-কলমে
&lt;/h1&gt;
&lt;h2&gt;
  
  
  ৪.১ ডেস্কটপ অ্যাপ দুই ধরনের
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;১. স্বতন্ত্র অ্যাপ (Standalone / Offline):&lt;/strong&gt;&lt;br&gt;
ইন্টারনেট ছাড়া চলে। উদাহরণ: ক্যালকুলেটর, নোটপ্যাড।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;২. ইন্টারনেট-নির্ভর ডেস্কটপ অ্যাপ:&lt;/strong&gt;&lt;br&gt;
ইন্টারনেটের সাথে যুক্ত থাকে। উদাহরণ: VS Code (এক্সটেনশন ডাউনলোডের জন্য), GitHub Desktop।&lt;/p&gt;
&lt;h2&gt;
  
  
  ৪.২ সফটওয়্যার আউটপুটের দুটি ধরন
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;১. কনসোল অ্যাপ্লিকেশন:&lt;/strong&gt;&lt;br&gt;
টার্মিনালে (কালো পর্দায়) চলে। ব্যবহারকারী দেখতে পায়:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 + 2 = 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;কোনো সুন্দর গ্রাফিক্স নেই।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;২. গ্রাফিক্যাল ইউজার ইন্টারফেস (GUI) অ্যাপ:&lt;/strong&gt;&lt;br&gt;
সুন্দর উইন্ডো, বোতাম, ইনপুট বক্স সহ চলে। উদাহরণ: Windows Calculator, VS Code।&lt;/p&gt;
&lt;h2&gt;
  
  
  ৪.৩ Python দিয়ে সহজ ক্যালকুলেটর বানানো
&lt;/h2&gt;

&lt;p&gt;আমরা Python এর &lt;strong&gt;Tkinter&lt;/strong&gt; লাইব্রেরি ব্যবহার করবো GUI অ্যাপ বানাতে।&lt;/p&gt;
&lt;h3&gt;
  
  
  প্রথম প্রোগ্রাম — "Hello World" উইন্ডো
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;হ্যালো বিশ্ব!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;হ্যালো বিশ্ব!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                     &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Arial&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;কোড ব্যাখ্যা:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;import tkinter as tk&lt;/code&gt; → Tkinter লাইব্রেরি ব্যবহার করছি&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tk.Tk()&lt;/code&gt; → একটি উইন্ডো তৈরি&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;root.title("হ্যালো বিশ্ব!")&lt;/code&gt; → উইন্ডোর শিরোনাম&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tk.Label(...)&lt;/code&gt; → একটি টেক্সট লেবেল&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;root.mainloop()&lt;/code&gt; → উইন্ডো খোলা রাখো&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;চালানোর নিয়ম:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এটি চালালে একটি উইন্ডো খুলবে যাতে "হ্যালো বিশ্ব!" লেখা থাকবে।&lt;/p&gt;




&lt;h3&gt;
  
  
  ক্যালকুলেটর অ্যাপ
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_numbers&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;num1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="n"&gt;num2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;num1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;num2&lt;/span&gt;
        &lt;span class="n"&gt;result_label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ফলাফল: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result_label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;সঠিক সংখ্যা দিন!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;entry1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;entry2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result_label&lt;/span&gt;

    &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ক্যালকুলেটর&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;300x200&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;প্রথম সংখ্যা:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;entry1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;entry1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;দ্বিতীয় সংখ্যা:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;entry2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;entry2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;যোগ করো&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
              &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;add_numbers&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;result_label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;result_label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;কোড ব্যাখ্যা:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;entry1.get()&lt;/code&gt; → ইনপুট বক্স থেকে মান নেওয়া&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;float(...)&lt;/code&gt; → সংখ্যায় রূপান্তর&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;try/except ValueError&lt;/code&gt; → ভুল ইনপুট থেকে সুরক্ষা&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;result_label.config(text=...)&lt;/code&gt; → লেবেলের টেক্সট পরিবর্তন&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ৪.৪ হোমওয়ার্ক প্রজেক্ট: পাসওয়ার্ড ম্যানেজার
&lt;/h2&gt;

&lt;p&gt;একটি অফলাইন পাসওয়ার্ড ম্যানেজার বানান যা:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;পাসওয়ার্ড এনক্রিপ্ট করে রাখে&lt;/li&gt;
&lt;li&gt;গোপন কী দিয়ে আনলক করা যায়&lt;/li&gt;
&lt;li&gt;ইন্টারনেট ছাড়া চলে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এটি একটি চমৎকার পোর্টফোলিও প্রজেক্ট।&lt;/p&gt;




&lt;h1&gt;
  
  
  পঞ্চম অধ্যায়: ওয়েব অ্যাপ্লিকেশন — HTML, CSS ও JavaScript
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ৫.১ ব্রাউজার কীভাবে কাজ করে
&lt;/h2&gt;

&lt;p&gt;আপনি যখন কোনো ওয়েবসাইটের ঠিকানা টাইপ করেন:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ব্রাউজার সেই ঠিকানার সার্ভারে GET রিকোয়েস্ট পাঠায়&lt;/li&gt;
&lt;li&gt;সার্ভার HTML, CSS, JavaScript ফাইল পাঠায়&lt;/li&gt;
&lt;li&gt;ব্রাউজার সেগুলো নিয়ে সুন্দর পেজ তৈরি করে&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;ব্রাউজারের মালিক কে:&lt;/strong&gt; Google Chrome মালিক Google। Firefox-এর মালিক Mozilla। কিন্তু ব্রাউজারের ভেতরে যে পেজ দেখছেন সেটার মালিক সেই ওয়েবসাইটের স্বত্বাধিকারী।&lt;/p&gt;

&lt;h2&gt;
  
  
  ৫.২ HTML — পেজের কাঠামো
&lt;/h2&gt;

&lt;p&gt;HTML (HyperText Markup Language) দিয়ে পেজের কাঠামো তৈরি হয়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;আমার ওয়েবসাইট&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"style.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;স্বাগতম!&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;এটি আমার প্রথম ওয়েবসাইট।&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"greet()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;ক্লিক করুন&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"script.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ট্যাগের ব্যাখ্যা:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; → শিরোনাম&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; → অনুচ্ছেদ&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; → বোতাম&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; → CSS ফাইল যুক্ত করা&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; → JavaScript ফাইল যুক্ত করা&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ৫.৩ CSS — পেজের সৌন্দর্য
&lt;/h2&gt;

&lt;p&gt;CSS (Cascading Style Sheets) দিয়ে পেজ সুন্দর করা হয়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Arial&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f0f0f0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#333&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#007bff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0056b3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ৫.৪ Tailwind CSS — আধুনিক CSS Framework
&lt;/h2&gt;

&lt;p&gt;Tailwind CSS দিয়ে সরাসরি HTML-এ ক্লাস লিখে ডিজাইন করা যায়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Tailwind CSS সহ বোতাম --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-700"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    ক্লিক করুন
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tailwind CDN ব্যবহার করতে HTML-এ যোগ করুন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.tailwindcss.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ৫.৫ স্ট্যাটিক ও ডায়নামিক ওয়েবসাইট
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;স্ট্যাটিক ওয়েবসাইট:&lt;/strong&gt;&lt;br&gt;
শুধু দেখানোর জন্য। কোনো ব্যবহারকারীর ইনপুট নেয় না, ডেটা সংরক্ষণ করে না। উদাহরণ: সাধারণ পোর্টফোলিও সাইট।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ডায়নামিক ওয়েবসাইট:&lt;/strong&gt;&lt;br&gt;
ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করে, ডেটা নেয় এবং সংরক্ষণ করে। উদাহরণ: Facebook, Gmail।&lt;/p&gt;


&lt;h1&gt;
  
  
  ষষ্ঠ অধ্যায়: ব্যাক-এন্ড ডেভেলপমেন্ট — Node.js ও Express.js
&lt;/h1&gt;
&lt;h2&gt;
  
  
  ৬.১ Node.js কী এবং কেন ব্যবহার করি
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;JavaScript মূলত ব্রাউজারে চলে।&lt;/strong&gt; কিন্তু Node.js দিয়ে JavaScript সার্ভারেও চালানো যায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Node.js হলো:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript-এর সার্ভার-সাইড রানটাইম&lt;/li&gt;
&lt;li&gt;একটি ইঞ্জিন যা সার্ভারে JavaScript কোড চালায়&lt;/li&gt;
&lt;li&gt;C++ দিয়ে তৈরি (ভেতরে)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;কেন Node.js জনপ্রিয়:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Front-end এবং Back-end দুটোতেই একই ভাষা (JavaScript)&lt;/li&gt;
&lt;li&gt;দ্রুত এবং হালকা&lt;/li&gt;
&lt;li&gt;বিশাল NPM ইকোসিস্টেম&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  ৬.২ Express.js — ওয়েব সার্ভার ফ্রেমওয়ার্ক
&lt;/h2&gt;

&lt;p&gt;Node.js দিয়ে সরাসরি ওয়েব সার্ভার বানানো যায়, কিন্তু কঠিন। Express.js সেটা সহজ করে দেয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Express.js ইনস্টল:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;express
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ৬.৩ সম্পূর্ণ ওয়েব অ্যাপ্লিকেশন — Contact Form
&lt;/h2&gt;

&lt;p&gt;এটি একটি পূর্ণাঙ্গ ওয়েব অ্যাপ্লিকেশন যেখানে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ব্যবহারকারী একটি ফর্ম পূরণ করবেন&lt;/li&gt;
&lt;li&gt;ডেটা সার্ভারে যাবে&lt;/li&gt;
&lt;li&gt;সার্ভার ডেটা সংরক্ষণ করবে&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  প্রজেক্ট কাঠামো
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-web-app/
├── public/
│   └── index.html
├── app.js
└── package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  index.html (Front-End)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"bn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;যোগাযোগ ফর্ম&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.tailwindcss.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-gray-100 min-h-screen flex items-center justify-center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-white p-8 rounded-lg shadow-md w-96"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-2xl font-bold text-center mb-6"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            আমার সাথে যোগাযোগ করুন
        &lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"/submit-form"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mb-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"block text-gray-700 mb-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;নাম&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
                    &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; 
                    &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;
                    &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w-full border rounded px-3 py-2 focus:outline-none focus:border-blue-500"&lt;/span&gt;
                    &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"আপনার নাম লিখুন"&lt;/span&gt;
                    &lt;span class="na"&gt;required&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mb-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"block text-gray-700 mb-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;ইমেইল&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
                    &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; 
                    &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
                    &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w-full border rounded px-3 py-2"&lt;/span&gt;
                    &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"আপনার ইমেইল"&lt;/span&gt;
                    &lt;span class="na"&gt;required&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mb-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"block text-gray-700 mb-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;মোবাইল নম্বর&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
                    &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"tel"&lt;/span&gt; 
                    &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"mobile"&lt;/span&gt;
                    &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w-full border rounded px-3 py-2"&lt;/span&gt;
                    &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"০১XXXXXXXXX"&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mb-6"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"block text-gray-700 mb-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;বার্তা&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; 
                    &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt;
                    &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w-full border rounded px-3 py-2 h-24"&lt;/span&gt;
                    &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"আপনার বার্তা লিখুন"&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; 
                &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;
                &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w-full bg-blue-500 text-white py-2 rounded hover:bg-blue-700 transition"&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                পাঠান
            &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  app.js (Back-End)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// প্রয়োজনীয় লাইব্রেরি আনা হচ্ছে&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Express অ্যাপ তৈরি&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Middleware সেটআপ&lt;/span&gt;
&lt;span class="c1"&gt;// এই দুটি লাইন ছাড়া form data পড়া যাবে না&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlencoded&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;extended&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// Static ফাইল সার্ভ করা (HTML, CSS)&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;

&lt;span class="c1"&gt;// ==========================================&lt;/span&gt;
&lt;span class="c1"&gt;// ROUTE 1: প্রথম পেজ দেখানো&lt;/span&gt;
&lt;span class="c1"&gt;// ==========================================&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// index.html ফাইল ব্রাউজারে পাঠানো হচ্ছে&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;index.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// ==========================================&lt;/span&gt;
&lt;span class="c1"&gt;// ROUTE 2: ফর্ম ডেটা গ্রহণ করা&lt;/span&gt;
&lt;span class="c1"&gt;// ==========================================&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/submit-form&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ব্যবহারকারীর পাঠানো ডেটা&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mobile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;নতুন বার্তা পাওয়া গেছে:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;নাম:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ইমেইল:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;মোবাইল:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mobile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;বার্তা:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// ডেটা JSON ফাইলে সংরক্ষণ&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newEntry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;mobile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="c1"&gt;// বিদ্যমান ডেটা পড়া&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;existingData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;existsSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;requests.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fileContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;requests.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;existingData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fileContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// নতুন ডেটা যোগ করে সংরক্ষণ&lt;/span&gt;
    &lt;span class="nx"&gt;existingData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newEntry&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;requests.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;existingData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="c1"&gt;// ব্যবহারকারীকে ধন্যবাদ জানানো&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`
        &amp;lt;h1&amp;gt;ধন্যবাদ, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!&amp;lt;/h1&amp;gt;
        &amp;lt;p&amp;gt;আপনার বার্তা পাওয়া গেছে।&amp;lt;/p&amp;gt;
        &amp;lt;a href="/"&amp;gt;ফিরে যান&amp;lt;/a&amp;gt;
    `&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// ==========================================&lt;/span&gt;
&lt;span class="c1"&gt;// ROUTE 3: সব বার্তা দেখা (Admin)&lt;/span&gt;
&lt;span class="c1"&gt;// ==========================================&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/admin/submissions&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;existsSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;requests.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;requests.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// ==========================================&lt;/span&gt;
&lt;span class="c1"&gt;// সার্ভার চালু করা&lt;/span&gt;
&lt;span class="c1"&gt;// ==========================================&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`সার্ভার চলছে: http://localhost:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  সার্ভার চালানো
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# প্রথমে npm ইনিশিয়ালাইজ&lt;/span&gt;
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;# Express ইনস্টল&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;express

&lt;span class="c"&gt;# সার্ভার চালু&lt;/span&gt;
node app.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এরপর ব্রাউজারে যান: &lt;code&gt;http://localhost:3000&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ৬.৪ ডেটার প্রবাহ বোঝা (Data Flow)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ব্যবহারকারী → ফর্ম পূরণ → Submit বোতাম
         ↓
    HTML (Client Side)
    POST /submit-form রিকোয়েস্ট তৈরি
         ↓
  ইন্টারনেট (HTTP Protocol)
         ↓
    Express.js Server (Back-End)
    req.body থেকে ডেটা পড়া
         ↓
    ডেটাবেস / ফাইলে সংরক্ষণ
         ↓
    Response পাঠানো ("ধন্যবাদ!")
         ↓
  ব্যবহারকারীর স্ক্রিনে দেখানো
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;মনে রাখার বিষয়:&lt;/strong&gt; &lt;code&gt;app.js&lt;/code&gt; ফাইল কখনো ব্যবহারকারীর ব্রাউজারে যায় না। এটা সার্ভারেই থাকে। ব্যবহারকারী শুধু &lt;code&gt;index.html&lt;/code&gt; দেখতে পান।&lt;/p&gt;




&lt;h1&gt;
  
  
  সপ্তম অধ্যায়: Git ও GitHub — ভার্সন কন্ট্রোল
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ৭.১ Git কেন দরকার?
&lt;/h2&gt;

&lt;p&gt;কল্পনা করুন আপনি পাঁচ মাস ধরে একটি প্রজেক্টে কাজ করেছেন। হঠাৎ আপনার ল্যাপটপ নষ্ট হয়ে গেল। সব কোড চলে গেল। এই পরিস্থিতি থেকে বাঁচার জন্য Git।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Git-এর তিনটি প্রধান কাজ:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;১. পরিবর্তনের ইতিহাস রাখা:&lt;/strong&gt;&lt;br&gt;
আপনি কখন কী পরিবর্তন করেছেন সব রেকর্ড থাকে। ভুল হলে আগের অবস্থায় ফেরা যায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;২. দলীয় কাজ সহজ করা:&lt;/strong&gt;&lt;br&gt;
৬০ জন ডেভেলপার একসাথে কাজ করতে পারেন। কে কখন কী পরিবর্তন করেছেন সবাই দেখতে পারেন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;৩. কোড নিরাপদ রাখা:&lt;/strong&gt;&lt;br&gt;
GitHub-এ কোড রাখলে ল্যাপটপ নষ্ট হলেও কোড হারায় না।&lt;/p&gt;
&lt;h2&gt;
  
  
  ৭.২ GitHub কী?
&lt;/h2&gt;

&lt;p&gt;GitHub হলো Git-এর জন্য একটি অনলাইন প্ল্যাটফর্ম — কোডের জন্য Google Drive।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;মজার তথ্য:&lt;/strong&gt; GitHub এর Arctic Vault প্রকল্পে পৃথিবীর গুরুত্বপূর্ণ কোড নরওয়ের আর্কটিক অঞ্চলে একটি সুরক্ষিত গুহায় সংরক্ষিত আছে। পৃথিবীতে বড় কোনো বিপর্যয় হলেও কোড টিকে থাকবে।&lt;/p&gt;
&lt;h2&gt;
  
  
  ৭.৩ Git এর মূল কমান্ড
&lt;/h2&gt;
&lt;h3&gt;
  
  
  প্রজেক্ট শুরু করা
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# নতুন Git রিপোজিটরি তৈরি&lt;/span&gt;
git init

&lt;span class="c"&gt;# GitHub থেকে রিপোজিটরি ডাউনলোড&lt;/span&gt;
git clone https://github.com/username/project-name.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  পরিবর্তন ট্র্যাক করা
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# কী কী পরিবর্তন হয়েছে দেখুন&lt;/span&gt;
git status

&lt;span class="c"&gt;# সব পরিবর্তন স্টেজে আনুন&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# অথবা নির্দিষ্ট ফাইল স্টেজে আনুন&lt;/span&gt;
git add filename.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  পরিবর্তন সংরক্ষণ করা (Commit)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Commit করা — একটি নাম দিয়ে সেভ করা&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"ব্যবহারকারীর ফর্ম যোগ করা হলো"&lt;/span&gt;

&lt;span class="c"&gt;# Commit-এর ইতিহাস দেখুন&lt;/span&gt;
git log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  GitHub-এ পাঠানো (Push)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# GitHub-এ পাঠানো&lt;/span&gt;
git push origin main

&lt;span class="c"&gt;# GitHub থেকে আনা&lt;/span&gt;
git pull origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Branch নিয়ে কাজ
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# সব Branch দেখুন&lt;/span&gt;
git branch

&lt;span class="c"&gt;# নতুন Branch তৈরি&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; chat-app

&lt;span class="c"&gt;# Branch পরিবর্তন&lt;/span&gt;
git checkout main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  ৭.৪ GitHub Account সেটআপ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ধাপ ১:&lt;/strong&gt; github.com-এ যান এবং অ্যাকাউন্ট খুলুন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ধাপ ২:&lt;/strong&gt; আপনার কম্পিউটারে Git ইনস্টল করুন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows: git-scm.com থেকে ডাউনলোড&lt;/li&gt;
&lt;li&gt;Linux: &lt;code&gt;sudo apt install git&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Mac: &lt;code&gt;brew install git&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ধাপ ৩:&lt;/strong&gt; পরিচয় সেটআপ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"আপনার নাম"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"আপনার@ইমেইল.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ধাপ ৪:&lt;/strong&gt; SSH Key তৈরি (নিরাপদ সংযোগের জন্য):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa &lt;span class="nt"&gt;-b&lt;/span&gt; 4096 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"আপনার@ইমেইল.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;তারপর &lt;code&gt;~/.ssh/id_rsa.pub&lt;/code&gt; ফাইলের বিষয়বস্তু GitHub-এ যোগ করুন।&lt;/p&gt;

&lt;h2&gt;
  
  
  ৭.৫ .gitignore — কী পাঠাবেন না
&lt;/h2&gt;

&lt;p&gt;কিছু ফাইল GitHub-এ পাঠানো উচিত নয়:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Node.js এর ডিপেন্ডেন্সি ফোল্ডার
node_modules/

# পরিবেশ পরিবর্তনশীল (গোপন তথ্য)
.env

# অপারেটিং সিস্টেমের ফাইল
.DS_Store
Thumbs.db

# Build ফাইল
dist/
build/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;.gitignore&lt;/code&gt; ফাইলে এই নাম লিখলে Git সেই ফাইলগুলো উপেক্ষা করে।&lt;/p&gt;




&lt;h1&gt;
  
  
  অষ্টম অধ্যায়: ক্লাউড সার্ভার ও ডেপ্লয়মেন্ট
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ৮.১ ডেপ্লয়মেন্ট কী?
&lt;/h2&gt;

&lt;p&gt;আপনার কম্পিউটারে সফটওয়্যার বানালে শুধু আপনিই ব্যবহার করতে পারবেন। সবাই ব্যবহার করতে পারলে আপনার সফটওয়্যার সার্ভারে রাখতে হবে। এটাই ডেপ্লয়মেন্ট।&lt;/p&gt;

&lt;h2&gt;
  
  
  ৮.২ ক্লাউড সার্ভার প্রোভাইডার
&lt;/h2&gt;

&lt;p&gt;বিশ্বের প্রধান ক্লাউড সার্ভার প্রদানকারী:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;প্রদানকারী&lt;/th&gt;
&lt;th&gt;বৈশিষ্ট্য&lt;/th&gt;
&lt;th&gt;কখন ব্যবহার করবেন&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DigitalOcean&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;সহজ, সাশ্রয়ী&lt;/td&gt;
&lt;td&gt;শিক্ষানবিস ও ছোট প্রজেক্ট&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS (Amazon)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;সবচেয়ে বড়, জটিল&lt;/td&gt;
&lt;td&gt;বড় কোম্পানি&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Cloud&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Google সেবা ইন্টিগ্রেশন&lt;/td&gt;
&lt;td&gt;ML/AI প্রজেক্ট&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Azure (Microsoft)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Microsoft সেবা&lt;/td&gt;
&lt;td&gt;.NET প্রজেক্ট&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vercel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ফ্রি, সহজ&lt;/td&gt;
&lt;td&gt;স্ট্যাটিক সাইট&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;শিক্ষানবিসদের জন্য:&lt;/strong&gt; DigitalOcean সবচেয়ে ভালো। মাত্র $6/মাসে একটি সার্ভার পাওয়া যায়।&lt;/p&gt;

&lt;h2&gt;
  
  
  ৮.৩ DigitalOcean-এ সার্ভার তৈরি (Droplet)
&lt;/h2&gt;

&lt;p&gt;DigitalOcean-এ একটি সার্ভারকে "Droplet" বলা হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ধাপ ১:&lt;/strong&gt; DigitalOcean-এ অ্যাকাউন্ট তৈরি করুন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ধাপ ২:&lt;/strong&gt; "Create Droplet" ক্লিক করুন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ধাপ ৩:&lt;/strong&gt; সেটিং:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OS: Ubuntu 22.04 LTS&lt;/li&gt;
&lt;li&gt;Plan: Basic, Regular, $6/মাস (1GB RAM, 1 CPU)&lt;/li&gt;
&lt;li&gt;Data Center: Singapore (বাংলাদেশের কাছে)&lt;/li&gt;
&lt;li&gt;Authentication: SSH Key (নিরাপদ) অথবা Password&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ধাপ ৪:&lt;/strong&gt; "Create Droplet" ক্লিক করুন।&lt;/p&gt;

&lt;p&gt;কয়েক মিনিট পরে আপনার সার্ভার প্রস্তুত। একটি IP Address পাবেন।&lt;/p&gt;

&lt;h2&gt;
  
  
  ৮.৪ সার্ভারে প্রবেশ (SSH)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# SSH দিয়ে সার্ভারে প্রবেশ&lt;/span&gt;
ssh root@YOUR_SERVER_IP

&lt;span class="c"&gt;# উদাহরণ&lt;/span&gt;
ssh root@164.90.xxx.xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;পাসওয়ার্ড দিলে সার্ভারে প্রবেশ হবে। এখন আপনি সার্ভারের terminal-এ আছেন।&lt;/p&gt;

&lt;h2&gt;
  
  
  ৮.৫ সার্ভারে Node.js ইনস্টল
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# প্যাকেজ আপডেট করুন&lt;/span&gt;
apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;# Node.js ডাউনলোড লিংক পেতে&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://deb.nodesource.com/setup_18.x | bash -

&lt;span class="c"&gt;# Node.js ইনস্টল&lt;/span&gt;
apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nodejs

&lt;span class="c"&gt;# যাচাই করুন&lt;/span&gt;
node &lt;span class="nt"&gt;--version&lt;/span&gt;
npm &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ৮.৬ সার্ভারে প্রজেক্ট ডেপ্লয় করা
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;পদ্ধতি ১: সরাসরি কপি করে&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# সার্ভারে ফোল্ডার তৈরি&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;hira-web
&lt;span class="nb"&gt;cd &lt;/span&gt;hira-web

&lt;span class="c"&gt;# ফাইল তৈরি এবং কোড পেস্ট&lt;/span&gt;
nano app.js
&lt;span class="c"&gt;# কোড পেস্ট করুন, Ctrl+X দিয়ে সেভ করুন&lt;/span&gt;

&lt;span class="c"&gt;# ডিপেন্ডেন্সি ইনস্টল&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;express

&lt;span class="c"&gt;# সার্ভার চালু&lt;/span&gt;
node app.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;পদ্ধতি ২: GitHub থেকে ডাউনলোড করে (বেশি ভালো)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# GitHub থেকে ক্লোন&lt;/span&gt;
git clone git@github.com:username/project.git

&lt;span class="c"&gt;# ফোল্ডারে প্রবেশ&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;project

&lt;span class="c"&gt;# ডিপেন্ডেন্সি ইনস্টল&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# সার্ভার চালু&lt;/span&gt;
node app.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;এখন আপনার সার্ভারের IP দিয়ে যে কেউ অ্যাক্সেস করতে পারবেন:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;http://YOUR_IP:PORT&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ৮.৭ PM2 — সার্ভার সবসময় চালু রাখা
&lt;/h2&gt;

&lt;p&gt;সমস্যা: টার্মিনাল বন্ধ করলে সার্ভার বন্ধ হয়ে যায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;সমাধান:&lt;/strong&gt; PM2 ব্যবহার করুন।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# PM2 ইনস্টল&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; pm2

&lt;span class="c"&gt;# PM2 দিয়ে সার্ভার চালু&lt;/span&gt;
pm2 start app.js

&lt;span class="c"&gt;# সার্ভারের অবস্থা দেখুন&lt;/span&gt;
pm2 status

&lt;span class="c"&gt;# সার্ভার বন্ধ করুন&lt;/span&gt;
pm2 stop app.js

&lt;span class="c"&gt;# সার্ভার রিস্টার্ট করুন&lt;/span&gt;
pm2 restart app.js

&lt;span class="c"&gt;# সিস্টেম রিবুটের পরেও চালু থাকতে&lt;/span&gt;
pm2 startup
pm2 save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এখন টার্মিনাল বন্ধ করলেও সার্ভার চলতে থাকবে।&lt;/p&gt;

&lt;h2&gt;
  
  
  ৮.৮ Vercel — সহজ বিনামূল্যে ডেপ্লয়মেন্ট
&lt;/h2&gt;

&lt;p&gt;ছোট প্রজেক্টের জন্য Vercel সবচেয়ে সহজ।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;কীভাবে:&lt;/strong&gt;&lt;br&gt;
১. vercel.com-এ GitHub অ্যাকাউন্ট দিয়ে লগিন করুন&lt;br&gt;
২. "Import Project" ক্লিক করুন&lt;br&gt;
৩. আপনার GitHub রিপোজিটরি বেছে নিন&lt;br&gt;
৪. Deploy ক্লিক করুন&lt;/p&gt;

&lt;p&gt;কয়েক মিনিটে আপনার সাইট লাইভ হয়ে যাবে। একটি URL পাবেন যেটা সবাই ব্যবহার করতে পারবে।&lt;/p&gt;
&lt;h2&gt;
  
  
  ৮.৯ ডেপ্লয়মেন্ট পাইপলাইন
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;সম্পূর্ণ প্রবাহ:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;আপনার কম্পিউটার (Local)
        ↓ git push
GitHub Repository
        ↓ স্বয়ংক্রিয় ডেপ্লয়
Vercel / DigitalOcean Server
        ↓
ব্যবহারকারীর ব্রাউজার
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GitHub Actions দিয়ে স্বয়ংক্রিয় ডেপ্লয়মেন্ট:&lt;/strong&gt;&lt;br&gt;
GitHub-এ কোড push করলে স্বয়ংক্রিয়ভাবে সার্ভারে ডেপ্লয় হয়। এটাই CI/CD (Continuous Integration/Continuous Deployment)।&lt;/p&gt;


&lt;h1&gt;
  
  
  নবম অধ্যায়: রিয়েল-টাইম অ্যাপ্লিকেশন — Socket.io দিয়ে চ্যাট অ্যাপ
&lt;/h1&gt;
&lt;h2&gt;
  
  
  ৯.১ সাধারণ HTTP vs WebSocket
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;সাধারণ HTTP:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ব্যবহারকারী রিকোয়েস্ট পাঠায়&lt;/li&gt;
&lt;li&gt;সার্ভার রেসপন্স দেয়&lt;/li&gt;
&lt;li&gt;সংযোগ শেষ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এটা চিঠি পাঠানোর মতো। চিঠি পাঠালে জবাব আসবে। কিন্তু মাঝখানে সার্ভার কিছু পাঠাতে পারবে না।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WebSocket:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;একটি স্থায়ী সংযোগ তৈরি হয়&lt;/li&gt;
&lt;li&gt;যেকোনো সময় যেকোনো দিকে ডেটা যেতে পারে&lt;/li&gt;
&lt;li&gt;সংযোগ বিচ্ছিন্ন না হওয়া পর্যন্ত চলে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এটা ফোন কলের মতো। দুজনে একসাথে কথা বলতে পারেন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;কোথায় WebSocket দরকার:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;চ্যাট অ্যাপ্লিকেশন&lt;/li&gt;
&lt;li&gt;রিয়েল-টাইম নোটিফিকেশন&lt;/li&gt;
&lt;li&gt;অনলাইন গেম&lt;/li&gt;
&lt;li&gt;স্টক মার্কেট প্রাইস আপডেট&lt;/li&gt;
&lt;li&gt;Uber-এর ড্রাইভার ট্র্যাকিং&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  ৯.২ মোবাইলে নোটিফিকেশন কীভাবে আসে?
&lt;/h2&gt;

&lt;p&gt;আপনার ফোন বিশ্রামে আছে, কোনো অ্যাপ খোলা নেই। হঠাৎ WhatsApp নোটিফিকেশন আসলো।&lt;/p&gt;

&lt;p&gt;আপনি কোনো বোতাম চাপেননি। তাহলে কীভাবে এলো?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উত্তর:&lt;/strong&gt; আপনার ফোনে একটি অদৃশ্য সংযোগ সবসময় চালু থাকে। এটি WebSocket। WhatsApp-এর সার্ভার থেকে আপনার ফোনে একটি "পাইপ" খোলা আছে। নতুন বার্তা এলে এই পাইপ দিয়ে নোটিফিকেশন আসে।&lt;/p&gt;
&lt;h2&gt;
  
  
  ৯.৩ Socket.io কী?
&lt;/h2&gt;

&lt;p&gt;Socket.io হলো Node.js-এর একটি লাইব্রেরি যা WebSocket সহজে ব্যবহার করতে দেয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;দুটো অংশ:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server-side Socket.io:&lt;/strong&gt; সার্ভারে চলে (Node.js)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client-side Socket.io:&lt;/strong&gt; ব্রাউজারে চলে (JavaScript)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;দুটো মিলে একটি রিয়েল-টাইম সংযোগ তৈরি করে।&lt;/p&gt;
&lt;h2&gt;
  
  
  ৯.৪ সম্পূর্ণ চ্যাট অ্যাপ্লিকেশন
&lt;/h2&gt;
&lt;h3&gt;
  
  
  প্রজেক্ট কাঠামো
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chat-app/
├── public/
│   └── index.html
├── server.js
└── package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  সার্ভার ইনস্টলেশন
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;express socket.io
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  server.js — ব্যাক-এন্ড
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;socketIO&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;socket.io&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Express এবং HTTP সার্ভার তৈরি&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Socket.io এর সাথে HTTP সার্ভার যুক্ত&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;io&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;socketIO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Static ফাইল সার্ভ করা&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;

&lt;span class="c1"&gt;// প্রধান পেজ দেখানো&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;index.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// ======================================&lt;/span&gt;
&lt;span class="c1"&gt;// Socket.io ইভেন্ট হ্যান্ডলিং&lt;/span&gt;
&lt;span class="c1"&gt;// ======================================&lt;/span&gt;
&lt;span class="nx"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;connection&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;নতুন ব্যবহারকারী সংযুক্ত হয়েছেন&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// ব্যবহারকারী নাম দিয়ে ঢুকলে&lt;/span&gt;
    &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;join&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// সবাইকে জানানো&lt;/span&gt;
        &lt;span class="nx"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user-joined&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; চ্যাটে যোগ দিয়েছেন!`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; যোগ দিয়েছেন`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="c1"&gt;// বার্তা পাঠালে&lt;/span&gt;
    &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`বার্তা পাওয়া: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; from &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// সবার কাছে বার্তা পাঠানো&lt;/span&gt;
        &lt;span class="nx"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toLocaleTimeString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bn-BD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="c1"&gt;// ব্যবহারকারী বের হলে&lt;/span&gt;
    &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;disconnect&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user-left&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; চ্যাট ছেড়ে গেছেন।`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; বের হয়েছেন`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// সার্ভার চালু&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4090&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`চ্যাট সার্ভার চলছে: http://localhost:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  public/index.html — ফ্রন্ট-এন্ড
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"bn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;চ্যাট রুম&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.tailwindcss.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Socket.io Client লাইব্রেরি --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/socket.io/socket.io.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-gray-900 text-white min-h-screen"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- নাম দেওয়ার স্ক্রিন --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"login-screen"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex items-center justify-center min-h-screen"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-gray-800 p-8 rounded-lg w-80"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-2xl font-bold text-center mb-6"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;চ্যাট রুমে স্বাগতম&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
                &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; 
                &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"username-input"&lt;/span&gt;
                &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"আপনার নাম লিখুন"&lt;/span&gt;
                &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w-full bg-gray-700 rounded px-4 py-2 mb-4 focus:outline-none focus:ring-2 focus:ring-blue-500"&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; 
                &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"joinChat()"&lt;/span&gt;
                &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w-full bg-blue-600 hover:bg-blue-700 py-2 rounded font-bold transition"&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                ঢুকুন
            &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- চ্যাট স্ক্রিন (শুরুতে লুকানো) --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"chat-screen"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"hidden flex flex-col h-screen"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="c"&gt;&amp;lt;!-- শিরোনাম বার --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-gray-800 p-4 flex items-center shadow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w-10 h-10 bg-blue-600 rounded-full flex items-center justify-center mr-3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;💬&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"font-bold"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;গ্রুপ চ্যাট&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-green-400 text-sm"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;● সক্রিয়&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

        &lt;span class="c"&gt;&amp;lt;!-- বার্তার জায়গা --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"messages"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex-1 overflow-y-auto p-4 space-y-3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="c"&gt;&amp;lt;!-- বার্তাগুলো এখানে দেখাবে --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

        &lt;span class="c"&gt;&amp;lt;!-- বার্তা পাঠানোর বার --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-gray-800 p-4 flex gap-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
                &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; 
                &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"message-input"&lt;/span&gt;
                &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"বার্তা লিখুন..."&lt;/span&gt;
                &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex-1 bg-gray-700 rounded-full px-4 py-2 focus:outline-none"&lt;/span&gt;
                &lt;span class="na"&gt;onkeypress=&lt;/span&gt;&lt;span class="s"&gt;"handleKeyPress(event)"&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; 
                &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"sendMessage()"&lt;/span&gt;
                &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-blue-600 hover:bg-blue-700 w-10 h-10 rounded-full flex items-center justify-center transition"&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                ➤
            &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
        &lt;span class="c1"&gt;// Socket.io সংযোগ&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;socket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;io&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;currentUsername&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// নামে যুক্ত হওয়া&lt;/span&gt;
        &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;joinChat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;usernameInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;username-input&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;usernameInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;নাম লিখুন!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="nx"&gt;currentUsername&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="c1"&gt;// সার্ভারে পাঠানো&lt;/span&gt;
            &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;join&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="c1"&gt;// স্ক্রিন পরিবর্তন&lt;/span&gt;
            &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;login-screen&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hidden&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;chat-screen&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hidden&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// বার্তা পাঠানো&lt;/span&gt;
        &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messageInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message-input&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;messageInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="c1"&gt;// সার্ভারে পাঠানো&lt;/span&gt;
            &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;currentUsername&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;
            &lt;span class="p"&gt;});&lt;/span&gt;

            &lt;span class="nx"&gt;messageInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Enter চাপলে পাঠানো&lt;/span&gt;
        &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleKeyPress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Enter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// ========================================&lt;/span&gt;
        &lt;span class="c1"&gt;// সার্ভার থেকে ইভেন্ট গ্রহণ&lt;/span&gt;
        &lt;span class="c1"&gt;// ========================================&lt;/span&gt;

        &lt;span class="c1"&gt;// বার্তা পাওয়া গেলে&lt;/span&gt;
        &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messagesDiv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;messages&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isOwn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;currentUsername&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messageEl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;div&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;messageEl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`flex &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;isOwn&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;justify-end&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;justify-start&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nx"&gt;messageEl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
                &amp;lt;div class="max-w-xs"&amp;gt;
                    &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isOwn&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;p class="text-blue-400 text-xs mb-1"&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/p&amp;gt;`&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;
                    &amp;lt;div class="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;isOwn&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bg-blue-600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bg-gray-700&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; rounded-2xl px-4 py-2"&amp;gt;
                        &amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/p&amp;gt;
                        &amp;lt;p class="text-xs opacity-70 mt-1"&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/p&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="nx"&gt;messagesDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messageEl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;messagesDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollTop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;messagesDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollHeight&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="c1"&gt;// কেউ যোগ দিলে&lt;/span&gt;
        &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user-joined&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;addSystemMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text-green-400&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="c1"&gt;// কেউ বের গেলে&lt;/span&gt;
        &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user-left&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;addSystemMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text-red-400&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="c1"&gt;// সিস্টেম বার্তা দেখানো&lt;/span&gt;
        &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;addSystemMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;colorClass&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messagesDiv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;messages&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;div&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`text-center text-sm &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;colorClass&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; py-1`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nx"&gt;messagesDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;messagesDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollTop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;messagesDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollHeight&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  চালানোর নিয়ম
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;ব্রাউজারে যান: &lt;code&gt;http://localhost:4090&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;একাধিক ট্যাব বা ব্রাউজার খুলুন। বিভিন্ন নামে ঢুকুন। একজনের বার্তা সবাই একসাথে দেখতে পাবেন!&lt;/p&gt;


&lt;h2&gt;
  
  
  ৯.৫ চ্যাট অ্যাপের প্রযুক্তি বোঝা
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ব্রাউজার ১          ব্রাউজার ২          ব্রাউজার ৩
(রাহেলা)           (করিম)             (সুমাইয়া)
    |                   |                   |
    |===Socket.io===========Socket.io=====|
                         |
                    Socket.io Server
                    (app.js চলছে)
                         |
                  io.emit('message', data)
                  ↙              ↓             ↘
              রাহেলা          করিম         সুমাইয়া
           (সবাই পায়)       (সবাই পায়)   (সবাই পায়)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;&lt;code&gt;socket.emit&lt;/code&gt; vs &lt;code&gt;io.emit&lt;/code&gt; পার্থক্য:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;socket.emit(...)&lt;/code&gt; → শুধু যে পাঠিয়েছে তাকে পাঠায়&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;io.emit(...)&lt;/code&gt; → সবাইকে পাঠায় (broadcast)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;socket.broadcast.emit(...)&lt;/code&gt; → যে পাঠিয়েছে সে ছাড়া সবাইকে পাঠায়&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  দশম অধ্যায়: CI/CD পাইপলাইন
&lt;/h1&gt;
&lt;h2&gt;
  
  
  ১০.১ CI/CD কী?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;CI (Continuous Integration):&lt;/strong&gt; নিরন্তর একীভূতকরণ। ডেভেলপাররা ছোট ছোট পরিবর্তন নিয়মিত GitHub-এ পাঠান। প্রতিটি পরিবর্তন স্বয়ংক্রিয়ভাবে টেস্ট হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CD (Continuous Deployment):&lt;/strong&gt; নিরন্তর ডেপ্লয়মেন্ট। টেস্ট পাস হলে স্বয়ংক্রিয়ভাবে সার্ভারে ডেপ্লয় হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;আগের সমস্যা:&lt;/strong&gt;&lt;br&gt;
কোনো পরিবর্তন করলে:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;কোড লিখুন&lt;/li&gt;
&lt;li&gt;GitHub-এ পাঠান&lt;/li&gt;
&lt;li&gt;সার্ভারে SSH করুন&lt;/li&gt;
&lt;li&gt;git pull করুন&lt;/li&gt;
&lt;li&gt;npm install করুন&lt;/li&gt;
&lt;li&gt;সার্ভার রিস্টার্ট করুন&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;এটা ম্যানুয়াল, সময়সাপেক্ষ এবং ভুলের সম্ভাবনা বেশি।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CI/CD সমাধান:&lt;/strong&gt;&lt;br&gt;
শুধু GitHub-এ push করুন। বাকি সব স্বয়ংক্রিয়।&lt;/p&gt;
&lt;h2&gt;
  
  
  ১০.২ GitHub Actions দিয়ে CI/CD
&lt;/h2&gt;
&lt;h3&gt;
  
  
  .github/workflows/deploy.yml
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ডেপ্লয় করুন&lt;/span&gt;

&lt;span class="c1"&gt;# কখন চলবে&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;main&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# কোড ডাউনলোড&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;কোড চেকআউট&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

    &lt;span class="c1"&gt;# টেস্ট চালানো&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Node.js সেটআপ&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v3&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;18'&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ডিপেন্ডেন্সি ইনস্টল&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install&lt;/span&gt;

    &lt;span class="c1"&gt;# সার্ভারে ডেপ্লয়&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;সার্ভারে পাঠানো&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;appleboy/ssh-action@master&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SERVER_HOST }}&lt;/span&gt;
        &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;root&lt;/span&gt;
        &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_PRIVATE_KEY }}&lt;/span&gt;
        &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;cd /root/my-project&lt;/span&gt;
          &lt;span class="s"&gt;git pull origin main&lt;/span&gt;
          &lt;span class="s"&gt;npm install&lt;/span&gt;
          &lt;span class="s"&gt;pm2 restart app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;এই ফাইলটি প্রজেক্টে যোগ করলে GitHub-এ push করার সাথে সাথে সার্ভারে স্বয়ংক্রিয় ডেপ্লয় হবে।&lt;/p&gt;
&lt;h2&gt;
  
  
  ১০.৩ সম্পূর্ণ ডেপ্লয়মেন্ট প্রবাহ
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;আপনার কম্পিউটার
        |
   [কোড লেখুন]
        |
   git add .
   git commit -m "নতুন ফিচার"
   git push origin main
        |
        ↓
   GitHub Repository
        |
   [GitHub Actions চালু হয়]
        |
   ↓ টেস্ট চলে
   ↓ বিল্ড হয়
        |
   সার্ভারে SSH
   git pull
   npm install
   pm2 restart
        |
        ↓
   DigitalOcean Server
        |
        ↓
   ব্যবহারকারীরা নতুন ভার্সন পান
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  একাদশ অধ্যায়: ক্যারিয়ার পথ ও অর্থ উপার্জনের উপায়
&lt;/h1&gt;
&lt;h2&gt;
  
  
  ১১.১ SDLC-তে কত ধরনের ক্যারিয়ার আছে
&lt;/h2&gt;

&lt;p&gt;একটি সফটওয়্যারের জীবনচক্রের প্রতিটি ধাপে আলাদা ক্যারিয়ার আছে:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ধাপ&lt;/th&gt;
&lt;th&gt;ক্যারিয়ার&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;পরিকল্পনা&lt;/td&gt;
&lt;td&gt;Business Analyst&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;পণ্য বিশ্লেষণ&lt;/td&gt;
&lt;td&gt;Product Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ডিজাইন&lt;/td&gt;
&lt;td&gt;UI/UX Designer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ডেভেলপমেন্ট&lt;/td&gt;
&lt;td&gt;Front-end Developer, Back-end Developer, Full-stack Developer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;টেস্টিং&lt;/td&gt;
&lt;td&gt;QA Engineer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ডেপ্লয়মেন্ট&lt;/td&gt;
&lt;td&gt;DevOps Engineer, Cloud Engineer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;রক্ষণাবেক্ষণ&lt;/td&gt;
&lt;td&gt;Site Reliability Engineer (SRE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;নিরাপত্তা&lt;/td&gt;
&lt;td&gt;Cybersecurity Engineer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ডেটা&lt;/td&gt;
&lt;td&gt;Data Scientist, Data Engineer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;ML Engineer, AI Researcher&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  ১১.২ একজন সফটওয়্যার ইঞ্জিনিয়ারের সত্যিকারের ভূমিকা
&lt;/h2&gt;

&lt;p&gt;অনেকে ভাবেন সফটওয়্যার ডেভেলপারের কাজ শুধু কোড লেখা। এটা ভুল।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;একজন ভালো সফটওয়্যার ইঞ্জিনিয়ার:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ব্যবসার উদ্দেশ্য বোঝেন&lt;/li&gt;
&lt;li&gt;পরিষ্কারভাবে যোগাযোগ করেন&lt;/li&gt;
&lt;li&gt;প্রয়োজনীয়তা সঠিকভাবে বোঝেন (না বুঝলে জিজ্ঞেস করেন)&lt;/li&gt;
&lt;li&gt;ডেটা দিয়ে সিদ্ধান্ত নেন&lt;/li&gt;
&lt;li&gt;টিমকে সহায়তা করেন&lt;/li&gt;
&lt;li&gt;ব্যবসার পরিবর্তনের সাথে মানিয়ে নেন&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  ১১.৩ সফটওয়্যার দিয়ে অর্থ উপার্জন — চাকরির বাইরে
&lt;/h2&gt;

&lt;p&gt;চাকরি ছাড়াও সফটওয়্যার দিয়ে অনেকভাবে অর্থ উপার্জন করা যায়:&lt;/p&gt;


&lt;h3&gt;
  
  
  পথ ১: ফ্রিল্যান্সিং
&lt;/h3&gt;

&lt;p&gt;Fiverr, Upwork, Freelancer.com-এ প্রজেক্ট করুন। বাংলাদেশে বসে বিদেশী ক্লায়েন্টের কাজ করুন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;কী কী বিক্রি করা যায়:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ওয়েবসাইট তৈরি&lt;/li&gt;
&lt;li&gt;বাগ ফিক্স&lt;/li&gt;
&lt;li&gt;API তৈরি&lt;/li&gt;
&lt;li&gt;মোবাইল অ্যাপ&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  পথ ২: প্রোডাক্ট বিক্রি
&lt;/h3&gt;

&lt;p&gt;নিজের সফটওয়্যার বানিয়ে বিক্রি করুন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CodeCanyon (codecanyon.net):&lt;/strong&gt;&lt;br&gt;
Node.js, Django, Laravel দিয়ে তৈরি স্ক্রিপ্ট এখানে বিক্রি করা যায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ প্রজেক্ট:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;YouTube ডাউনলোডার (AI-চালিত)&lt;/li&gt;
&lt;li&gt;চ্যাট অ্যাপ&lt;/li&gt;
&lt;li&gt;অ্যাডমিন ড্যাশবোর্ড&lt;/li&gt;
&lt;li&gt;বুকিং সিস্টেম&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  পথ ৩: SaaS (Software as a Service)
&lt;/h3&gt;

&lt;p&gt;একটি অনলাইন টুল বানান যেখানে মাসিক সাবস্ক্রিপশন নেওয়া হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;উদাহরণ SaaS আইডিয়া:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI ভিডিও এডিটর (সাইলেন্ট কাট, রিপিট রিমুভ)&lt;/li&gt;
&lt;li&gt;YouTube ট্রান্সক্রিপশন টুল&lt;/li&gt;
&lt;li&gt;সেন্টিমেন্ট অ্যানালাইসিস টুল&lt;/li&gt;
&lt;li&gt;স্বয়ংক্রিয় সোশ্যাল মিডিয়া পোস্ট জেনারেটর&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;SaaS-এ অর্থ উপার্জন:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;বিজ্ঞাপন দেখানো (AdSense)&lt;/li&gt;
&lt;li&gt;মাসিক সাবস্ক্রিপশন&lt;/li&gt;
&lt;li&gt;প্রিমিয়াম ফিচার&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  পথ ৪: ইন্ডি হ্যাকার (Indie Hacker)
&lt;/h3&gt;

&lt;p&gt;IndieHackers.com-এ গিয়ে দেখুন কত ডেভেলপার একা একা প্রোডাক্ট বানিয়ে লক্ষ টাকা আয় করছেন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;কীভাবে শুরু করবেন:&lt;/strong&gt;&lt;br&gt;
১. একটি সমস্যা খুঁজুন যা আপনি অনুভব করেছেন&lt;br&gt;
২. সেটার সমাধান বানান&lt;br&gt;
৩. ProductHunt-এ লঞ্চ করুন&lt;br&gt;
৪. ফিডব্যাক নিন এবং উন্নত করুন&lt;br&gt;
৫. ধীরে ধীরে ব্যবহারকারী বাড়ান&lt;/p&gt;


&lt;h3&gt;
  
  
  পথ ৫: AI-চালিত প্রোডাক্ট
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;আইডিয়া: AI ভিডিও এডিটর&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;যারা YouTube বা TikTok-এর জন্য ভিডিও বানান তারা সবচেয়ে বেশি সময় নষ্ট করেন এডিটিংয়ে। বিশেষত:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;সাইলেন্ট পার্ট কাটা&lt;/li&gt;
&lt;li&gt;রিটেকের পুনরাবৃত্তি মুছে দেওয়া&lt;/li&gt;
&lt;li&gt;ক্যাপশন যোগ করা&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Python দিয়ে এটা তৈরি করা সম্ভব:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# সাইলেন্ট ডিটেকশনের জন্য
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydub&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AudioSegment&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydub.silence&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;detect_silence&lt;/span&gt;

&lt;span class="c1"&gt;# অডিও থেকে টেক্সটে রূপান্তরের জন্য
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;speech_recognition&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;

&lt;span class="c1"&gt;# ভিডিও প্রক্রিয়াকরণের জন্য
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;moviepy.editor&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;VideoFileClip&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Google এর বিনামূল্যে Speech-to-Text API ব্যবহার করা যায়।&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;বাজার বিশ্লেষণ (Semrush/Google Trends):&lt;/strong&gt;&lt;br&gt;
"AI video editor" - বৈশ্বিক মাসিক সার্চ ভলিউম: ১২,০০০+&lt;/p&gt;




&lt;h2&gt;
  
  
  ১১.৪ প্রজেক্ট পোর্টফোলিও — কী করবেন, কী করবেন না
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;যা করবেন:&lt;/strong&gt;&lt;br&gt;
✅ AI বা ML যুক্ত প্রজেক্ট বানান&lt;br&gt;
✅ ক্লাউডে ডেপ্লয় করুন (লাইভ লিংক দিন)&lt;br&gt;
✅ GitHub-এ কোড রাখুন&lt;br&gt;
✅ README.md তে ভালো ডকুমেন্টেশন লিখুন&lt;br&gt;
✅ ডেটাবেস সহ Full-stack প্রজেক্ট বানান&lt;br&gt;
✅ নিজে ব্যাখ্যা করতে পারেন এমন প্রজেক্ট বানান&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;যা করবেন না:&lt;/strong&gt;&lt;br&gt;
❌ টিউটোরিয়াল কপি করে সিভিতে দেবেন না&lt;br&gt;
❌ সবাই যা বানায় (To-do List, Calculator) শুধু সেটা দেবেন না&lt;br&gt;
❌ লাইভ নেই এমন প্রজেক্ট দেবেন না&lt;br&gt;
❌ বুঝতে পারবেন না এমন কোড দেবেন না&lt;/p&gt;




&lt;h2&gt;
  
  
  ১১.৫ মার্কেট বিশ্লেষণ টুল
&lt;/h2&gt;

&lt;p&gt;নিজের প্রোডাক্টের চাহিদা যাচাই করুন:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semrush / Ahrefs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;কত মানুষ এই কীওয়ার্ড সার্চ করে&lt;/li&gt;
&lt;li&gt;প্রতিযোগীরা কে কে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Google Trends:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;চাহিদা বাড়ছে নাকি কমছে&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ProductHunt:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;নতুন পণ্যের ট্রেন্ড&lt;/li&gt;
&lt;li&gt;ব্যবহারকারীর প্রতিক্রিয়া&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;IndieHackers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;সফল ইন্ডি ডেভেলপারদের গল্প&lt;/li&gt;
&lt;li&gt;রাজস্বের পরিসংখ্যান&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  পরিশিষ্ট ক: প্রজেক্ট আইডিয়ার তালিকা
&lt;/h1&gt;

&lt;p&gt;এই বইয়ের জ্ঞান দিয়ে আপনি নিচের প্রজেক্টগুলো বানাতে পারবেন:&lt;/p&gt;

&lt;h2&gt;
  
  
  শিক্ষানবিস পর্যায়
&lt;/h2&gt;

&lt;p&gt;১. &lt;strong&gt;পোর্টফোলিও ওয়েবসাইট&lt;/strong&gt; — HTML, CSS, JavaScript&lt;br&gt;
২. &lt;strong&gt;সাধারণ ক্যালকুলেটর&lt;/strong&gt; — Python + Tkinter&lt;br&gt;
৩. &lt;strong&gt;Contact Form&lt;/strong&gt; — Express.js + JSON সংরক্ষণ&lt;br&gt;
৪. &lt;strong&gt;Offline Password Manager&lt;/strong&gt; — Python + Encryption&lt;/p&gt;

&lt;h2&gt;
  
  
  মধ্যবর্তী পর্যায়
&lt;/h2&gt;

&lt;p&gt;৫. &lt;strong&gt;চ্যাট অ্যাপ&lt;/strong&gt; — Socket.io + Express.js&lt;br&gt;
৬. &lt;strong&gt;YouTube Downloader&lt;/strong&gt; — Python + yt-dlp&lt;br&gt;
৭. &lt;strong&gt;Blog Platform&lt;/strong&gt; — Full-stack (React + Node.js + Database)&lt;br&gt;
৮. &lt;strong&gt;Task Manager&lt;/strong&gt; — Express.js + PostgreSQL&lt;/p&gt;

&lt;h2&gt;
  
  
  উন্নত পর্যায়
&lt;/h2&gt;

&lt;p&gt;৯. &lt;strong&gt;AI ভিডিও এডিটর&lt;/strong&gt; — Python + MoviePy + Whisper&lt;br&gt;
১০. &lt;strong&gt;YouTube Transcriber + Sentiment Analyzer&lt;/strong&gt; — Python + NLP&lt;br&gt;
১১. &lt;strong&gt;রিয়েল-টাইম নোটিফিকেশন সিস্টেম&lt;/strong&gt; — Socket.io + Push API&lt;br&gt;
১২. &lt;strong&gt;অফলাইন LLM চ্যাটবট&lt;/strong&gt; — Python + Ollama&lt;/p&gt;




&lt;h1&gt;
  
  
  পরিশিষ্ট খ: দ্রুত রেফারেন্স কার্ড
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Git কমান্ড চিট শিট
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# শুরু করা&lt;/span&gt;
git init                          &lt;span class="c"&gt;# নতুন রিপো&lt;/span&gt;
git clone URL                     &lt;span class="c"&gt;# ক্লোন করা&lt;/span&gt;

&lt;span class="c"&gt;# ডেইলি কাজ&lt;/span&gt;
git status                        &lt;span class="c"&gt;# অবস্থা দেখা&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;                         &lt;span class="c"&gt;# সব স্টেজ করা&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"বার্তা"&lt;/span&gt;           &lt;span class="c"&gt;# কমিট করা&lt;/span&gt;
git push origin main              &lt;span class="c"&gt;# GitHub-এ পাঠানো&lt;/span&gt;
git pull origin main              &lt;span class="c"&gt;# GitHub থেকে আনা&lt;/span&gt;

&lt;span class="c"&gt;# Branch কাজ&lt;/span&gt;
git branch                        &lt;span class="c"&gt;# Branch দেখা&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; নতুন-branch       &lt;span class="c"&gt;# Branch তৈরি&lt;/span&gt;
git checkout main                 &lt;span class="c"&gt;# Branch পরিবর্তন&lt;/span&gt;
git merge branch-name             &lt;span class="c"&gt;# Merge করা&lt;/span&gt;

&lt;span class="c"&gt;# ইতিহাস&lt;/span&gt;
git log                           &lt;span class="c"&gt;# ইতিহাস দেখা&lt;/span&gt;
git log &lt;span class="nt"&gt;--oneline&lt;/span&gt;                 &lt;span class="c"&gt;# সংক্ষেপে দেখা&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  npm কমান্ড চিট শিট
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init &lt;span class="nt"&gt;-y&lt;/span&gt;                       &lt;span class="c"&gt;# প্রজেক্ট শুরু&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;express               &lt;span class="c"&gt;# প্যাকেজ ইনস্টল&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; pm2               &lt;span class="c"&gt;# গ্লোবাল ইনস্টল&lt;/span&gt;
npm start                         &lt;span class="c"&gt;# সার্ভার চালু&lt;/span&gt;
npm &lt;span class="nb"&gt;test&lt;/span&gt;                          &lt;span class="c"&gt;# টেস্ট চালু&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Linux সার্ভার কমান্ড
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt;                                &lt;span class="c"&gt;# ফাইল দেখা&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;folder                         &lt;span class="c"&gt;# ফোল্ডারে যাওয়া&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;folder                      &lt;span class="c"&gt;# ফোল্ডার তৈরি&lt;/span&gt;
nano file.js                      &lt;span class="c"&gt;# ফাইল সম্পাদনা&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;file.js                       &lt;span class="c"&gt;# ফাইল পড়া&lt;/span&gt;
&lt;span class="nb"&gt;rm &lt;/span&gt;file.js                        &lt;span class="c"&gt;# ফাইল মুছা&lt;/span&gt;
top                               &lt;span class="c"&gt;# চলমান প্রক্রিয়া দেখা&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  HTTP Status Codes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;কোড&lt;/th&gt;
&lt;th&gt;মানে&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;সফল&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;201&lt;/td&gt;
&lt;td&gt;তৈরি হয়েছে&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;ভুল রিকোয়েস্ট&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;401&lt;/td&gt;
&lt;td&gt;অনুমতি নেই&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;404&lt;/td&gt;
&lt;td&gt;পাওয়া যায়নি&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;সার্ভার ত্রুটি&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  পরিশিষ্ট গ: শেখার রোডম্যাপ
&lt;/h1&gt;

&lt;h2&gt;
  
  
  মাস ১-২: ভিত্তি গড়া
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;সপ্তাহ ১-২:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML মূল বিষয়&lt;/li&gt;
&lt;li&gt;CSS মূল বিষয়&lt;/li&gt;
&lt;li&gt;সহজ ওয়েবপেজ তৈরি&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;সপ্তাহ ৩-৪:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript মূল বিষয়&lt;/li&gt;
&lt;li&gt;ফাংশন, লুপ, অ্যারে&lt;/li&gt;
&lt;li&gt;DOM manipulation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;সপ্তাহ ৫-৬:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python মূল বিষয়&lt;/li&gt;
&lt;li&gt;একই ধারণা Python-এ&lt;/li&gt;
&lt;li&gt;ছোট স্ক্রিপ্ট লেখা&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;সপ্তাহ ৭-৮:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Git ও GitHub শেখা&lt;/li&gt;
&lt;li&gt;প্রথম প্রজেক্ট GitHub-এ&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  মাস ৩-৪: ব্যাক-এন্ড শেখা
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;সপ্তাহ ৯-১০:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js ও Express.js&lt;/li&gt;
&lt;li&gt;REST API তৈরি&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;সপ্তাহ ১১-১২:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ডেটাবেস (PostgreSQL বা MongoDB)&lt;/li&gt;
&lt;li&gt;CRUD অপারেশন&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;সপ্তাহ ১৩-১৪:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication (JWT)&lt;/li&gt;
&lt;li&gt;নিরাপত্তার মূল বিষয়&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;সপ্তাহ ১৫-১৬:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ক্লাউড ডেপ্লয়মেন্ট (DigitalOcean)&lt;/li&gt;
&lt;li&gt;প্রথম লাইভ প্রজেক্ট&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  মাস ৫-৬: উন্নত বিষয়
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Socket.io / রিয়েল-টাইম অ্যাপ&lt;/li&gt;
&lt;li&gt;CI/CD পাইপলাইন&lt;/li&gt;
&lt;li&gt;পারফরম্যান্স অপ্টিমাইজেশন&lt;/li&gt;
&lt;li&gt;AI/ML ইন্টিগ্রেশন&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  উপসংহার
&lt;/h1&gt;

&lt;p&gt;এই বইয়ে আমরা শিখেছি:&lt;/p&gt;

&lt;p&gt;১. &lt;strong&gt;সফটওয়্যার কেন বানানো হয়&lt;/strong&gt; — তিনটি প্রধান কারণ এবং বাস্তব উদাহরণ&lt;/p&gt;

&lt;p&gt;২. &lt;strong&gt;SDLC&lt;/strong&gt; — মালিক থেকে শুরু করে ব্যবহারকারী পর্যন্ত সফটওয়্যারের পুরো যাত্রা&lt;/p&gt;

&lt;p&gt;৩. &lt;strong&gt;প্রযুক্তিগত কাঠামো&lt;/strong&gt; — ক্লায়েন্ট, সার্ভার এবং ডেটাবেস কীভাবে একসাথে কাজ করে&lt;/p&gt;

&lt;p&gt;৪. &lt;strong&gt;হাতে-কলমে তৈরি&lt;/strong&gt; — Python, HTML, CSS, JavaScript, Node.js দিয়ে বাস্তব অ্যাপ্লিকেশন&lt;/p&gt;

&lt;p&gt;৫. &lt;strong&gt;ভার্সন কন্ট্রোল&lt;/strong&gt; — Git ও GitHub দিয়ে কোড পরিচালনা&lt;/p&gt;

&lt;p&gt;৬. &lt;strong&gt;ক্লাউড ডেপ্লয়মেন্ট&lt;/strong&gt; — সার্ভারে সফটওয়্যার রাখা যাতে সবাই ব্যবহার করতে পারে&lt;/p&gt;

&lt;p&gt;৭. &lt;strong&gt;রিয়েল-টাইম সংযোগ&lt;/strong&gt; — Socket.io দিয়ে চ্যাট অ্যাপ&lt;/p&gt;

&lt;p&gt;৮. &lt;strong&gt;CI/CD&lt;/strong&gt; — স্বয়ংক্রিয় ডেপ্লয়মেন্ট পাইপলাইন&lt;/p&gt;

&lt;p&gt;৯. &lt;strong&gt;ক্যারিয়ার পথ&lt;/strong&gt; — চাকরি থেকে নিজের প্রোডাক্ট — অনেক পথ খোলা&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;মনে রাখুন:&lt;/strong&gt; সফটওয়্যার ইঞ্জিনিয়ারিং কোনো নির্দিষ্ট ভাষা বা ফ্রেমওয়ার্কের নাম নয়। এটি একটি চিন্তার ধরন। সমস্যা চিহ্নিত করুন, ভেঙে ছোট করুন, সমাধান করুন। এই দক্ষতা একবার অর্জন হলে যেকোনো প্রযুক্তিতে কাজ করা সম্ভব।&lt;/p&gt;

&lt;p&gt;পরিশেষে, সবচেয়ে গুরুত্বপূর্ণ কথা — &lt;strong&gt;তৈরি করুন।&lt;/strong&gt; পড়া, দেখা, শোনা — এর সবই শেষ পর্যন্ত কম গুরুত্বপূর্ণ যদি আপনি নিজে হাতে কিছু না বানান। এই বই পড়ার পরে আজই একটি প্রজেক্ট শুরু করুন। ভুল হবে, সমস্যা আসবে — সেগুলো থেকেই শেখা হবে।&lt;/p&gt;

&lt;p&gt;শুভকামনা!&lt;/p&gt;




</description>
      <category>personalnotes</category>
    </item>
    <item>
      <title>Go Types Are Not What You Think: Numbers, Strings, and Memory Explained</title>
      <dc:creator>Saiful Islam</dc:creator>
      <pubDate>Mon, 25 May 2026 18:18:55 +0000</pubDate>
      <link>https://dev.to/saifulire/go-types-are-not-what-you-think-numbers-strings-and-memory-explained-3p44</link>
      <guid>https://dev.to/saifulire/go-types-are-not-what-you-think-numbers-strings-and-memory-explained-3p44</guid>
      <description>&lt;p&gt;Most developers write Go code every day without thinking about what actually lives in memory. Then a bug shows up — a balance is slightly off, a counter wraps to negative, or Bengali text gets garbled mid-slice. This post explains exactly why these things happen.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Foundation: Computers Only Know 0 and 1
&lt;/h2&gt;

&lt;p&gt;Everything stored in a computer — numbers, text, images — is ultimately a sequence of bits. A &lt;strong&gt;bit&lt;/strong&gt; is a single &lt;code&gt;0&lt;/code&gt; or &lt;code&gt;1&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0  →  off
1  →  on
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Group 8 bits together and you get a &lt;strong&gt;byte&lt;/strong&gt;. Memory is measured in bytes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8  bits = 1 byte
16 bits = 2 bytes
32 bits = 4 bytes
64 bits = 8 bytes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the foundation for understanding every number type.&lt;/p&gt;




&lt;h2&gt;
  
  
  Integer Types: Exact, But Bounded
&lt;/h2&gt;

&lt;p&gt;An integer type defines two things: how much memory to use, and how large a number you can store.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;th&gt;Range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;int8&lt;/td&gt;
&lt;td&gt;1 byte&lt;/td&gt;
&lt;td&gt;-128 to 127&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;int16&lt;/td&gt;
&lt;td&gt;2 byte&lt;/td&gt;
&lt;td&gt;-32,768 to 32,767&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;int32&lt;/td&gt;
&lt;td&gt;4 byte&lt;/td&gt;
&lt;td&gt;~±2 billion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;int64&lt;/td&gt;
&lt;td&gt;8 byte&lt;/td&gt;
&lt;td&gt;~±9.2 quintillion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The range is not arbitrary. With 8 bits, you have exactly 2⁸ = 256 possible values. Split between negative and positive (using one bit for the sign), you get -128 to 127. No more. That's physics.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="kt"&gt;int8&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;127&lt;/span&gt;  &lt;span class="c"&gt;// fine&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="kt"&gt;int8&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;128&lt;/span&gt;  &lt;span class="c"&gt;// compile error&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why Only Powers of 2?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;int4&lt;/code&gt; and &lt;code&gt;int12&lt;/code&gt; don't exist because CPU architecture works in powers of 2. Hardware is optimized for 8, 16, 32, 64. Anything else would be slower or require special handling. Go follows this convention.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unsigned Integers
&lt;/h3&gt;

&lt;p&gt;If you know a value is always positive, you can use unsigned types:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="kt"&gt;uint8&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;  &lt;span class="c"&gt;// range: 0 to 255&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get the full 256 values on the positive side.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Happens When You Overflow?
&lt;/h2&gt;

&lt;p&gt;This is where things get dangerous. If you exceed an integer's range, Go doesn't crash or throw an exception — it &lt;strong&gt;silently wraps around&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="kt"&gt;int8&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;127&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// -128&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In memory, &lt;code&gt;127&lt;/code&gt; is stored as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;01111111
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add 1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10000000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That pattern means &lt;code&gt;-128&lt;/code&gt; in a signed integer. The counter silently became negative.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In a banking or financial system, this is a critical bug.&lt;/strong&gt; A transaction counter hits max, wraps to a negative, and your system thinks money was subtracted instead of added.&lt;/p&gt;

&lt;p&gt;The fix: use &lt;code&gt;int64&lt;/code&gt; for financial counters. Its max (~9.2 quintillion) is large enough for any real-world value.&lt;/p&gt;




&lt;h2&gt;
  
  
  Floating-Point Types: Range, But Not Exactness
&lt;/h2&gt;

&lt;p&gt;Float types (&lt;code&gt;float32&lt;/code&gt;, &lt;code&gt;float64&lt;/code&gt;) handle decimal numbers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3.14159&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="kt"&gt;float32&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;9.99&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key difference from integers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;th&gt;Accurate Digits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;float32&lt;/td&gt;
&lt;td&gt;4 byte&lt;/td&gt;
&lt;td&gt;~7 digits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;float64&lt;/td&gt;
&lt;td&gt;8 byte&lt;/td&gt;
&lt;td&gt;~15-16 digits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Go's default floating-point type is &lt;code&gt;float64&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Float Is Actually Stored
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;float64&lt;/code&gt; is stored in three parts following the &lt;strong&gt;IEEE 754&lt;/strong&gt; standard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;| 1 bit  | 11 bits  | 52 bits  |
| sign   | exponent | fraction |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A number like &lt;code&gt;3.14&lt;/code&gt; is not stored as "3.14". It's converted into binary scientific notation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(For an example, Value Representation of Binary: 11.001000111...=1.1001000111... × 2¹)
decimal to binary: 3.14 ≈ 1.5700... × 2¹
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then each part (sign, exponent, fraction) is encoded into those fixed bit slots. The problem: 52 bits of fraction is finite. Many decimal values need an infinite binary representation. The computer stores the closest approximation it can fit.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Famous 0.1 + 0.2 Problem
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0.1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;// 0.30000000000000004&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not a Go bug. It happens in Python, JavaScript, Java, C++, Rust — every language using IEEE 754 floating-point (which is almost all of them).&lt;/p&gt;

&lt;p&gt;Here's why:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;0.1&lt;/code&gt; in binary is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.0001100110011001100110011...  (infinite)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Similar to how &lt;code&gt;1/3 = 0.3333...&lt;/code&gt; never ends in decimal. The computer can't store infinite digits, so it rounds. The stored value of &lt;code&gt;0.1&lt;/code&gt; is actually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.10000000000000000555...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And &lt;code&gt;0.2&lt;/code&gt; is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.20000000000000001110...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add them, and the tiny errors accumulate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.30000000000000004
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Want to see what's really happening under the surface?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%.20f&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;// 0.40000000000000002220&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output looks fine with default formatting, but the error is there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The rule:&lt;/strong&gt; Float is an approximation. It's designed for range and performance, not for exactness.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Three Types Compared
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Exact?&lt;/th&gt;
&lt;th&gt;Handles Decimals?&lt;/th&gt;
&lt;th&gt;Max Size&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;int64&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;~9.2 × 10¹⁸&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;float64&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;~1.8 × 10³⁰⁸&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;big.Int&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  big.Int: When You Need Huge Exact Numbers
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;int64&lt;/code&gt; is exact but has a ceiling. For numbers beyond that — cryptography, arbitrary-precision math — Go provides &lt;code&gt;math/big&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"math/big"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;big&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"999999999999999999999999999999999"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c"&gt;// 999999999999999999999999999999999  — exact&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How does it work? Instead of one fixed 8-byte block, &lt;code&gt;big.Int&lt;/code&gt; allocates multiple memory chunks and chains them together. The number grows as needed. Slower than &lt;code&gt;int64&lt;/code&gt;, but unlimited and exact.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Banking Rule
&lt;/h2&gt;

&lt;p&gt;Money is the most common place developers get this wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Never use float for money.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One cent of precision loss per transaction. Multiplied by millions of transactions. That's real money, and it's gone to rounding errors.&lt;/p&gt;

&lt;p&gt;The industry-standard approach: &lt;strong&gt;store money as an integer in the smallest unit&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// DON'T do this&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;100.50&lt;/span&gt;

&lt;span class="c"&gt;// DO this&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="kt"&gt;int64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10050&lt;/span&gt;  &lt;span class="c"&gt;// stored as paisa or cents&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When displaying:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10050 paisa → 100.50 taka
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Integer arithmetic is exact. The display logic handles the decimal point. No precision issues.&lt;/p&gt;

&lt;p&gt;For even more control — like fixed decimal arithmetic with explicit rounding rules — use a dedicated decimal library. But for most applications, the integer-as-smallest-unit approach is sufficient and battle-tested.&lt;/p&gt;




&lt;h2&gt;
  
  
  Text Types: rune and string
&lt;/h2&gt;

&lt;p&gt;Go has two types for text. They look similar but work completely differently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;rune&lt;/code&gt;&lt;/strong&gt; is an alias for &lt;code&gt;int32&lt;/code&gt;. It holds one Unicode character — just a number under the hood.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="kt"&gt;rune&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;'ক'&lt;/span&gt;   &lt;span class="c"&gt;// stored as: 2453 (its Unicode code point)&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="kt"&gt;rune&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;'😊'&lt;/span&gt;  &lt;span class="c"&gt;// stored as: 128522&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;string&lt;/code&gt;&lt;/strong&gt; is a read-only sequence of UTF-8 encoded bytes — not characters.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Go😊ক"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That string takes &lt;strong&gt;9 bytes&lt;/strong&gt; in memory, not 4 characters:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Char&lt;/th&gt;
&lt;th&gt;Bytes used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;G&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;o&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;😊&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ক&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Go stores strings as raw bytes. Unicode meaning only appears when Go decodes them.&lt;/p&gt;




&lt;h2&gt;
  
  
  The len() Trap
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"Go😊ক"&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c"&gt;// 9 — bytes, not characters&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;len()&lt;/code&gt; on a string returns &lt;strong&gt;byte count&lt;/strong&gt;, not character count. For ASCII-only strings this looks correct. For anything else, it misleads you.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"😊"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c"&gt;// 4&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ক"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c"&gt;// 3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The correct way to count characters:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;rune&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Go😊ক"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;  &lt;span class="c"&gt;// 4 ✓&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or iterate with &lt;code&gt;range&lt;/code&gt;, which decodes UTF-8 properly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="s"&gt;"Go😊ক"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%c&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;// prints each character correctly&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why String Slicing Breaks Characters
&lt;/h2&gt;

&lt;p&gt;Since strings are byte arrays, slicing cuts bytes — not characters.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"😊"&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c"&gt;// prints: � (broken)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You cut the emoji's 4 bytes in half. The output is invalid UTF-8.&lt;/p&gt;

&lt;p&gt;Bengali is even more dangerous. &lt;code&gt;ক&lt;/code&gt; is 3 bytes (&lt;code&gt;E0 A6 95&lt;/code&gt;). Almost every possible slice position cuts it mid-byte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"ক"&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c"&gt;// E0 alone → broken&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c"&gt;// E0 A6 → still broken&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And unlike emoji corruption (which renders visibly as &lt;code&gt;?&lt;/code&gt;), Bengali corruption can silently produce blank or wrong glyphs — harder to catch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Safe slicing always goes through runes:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;rune&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"বাংলা"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;  &lt;span class="c"&gt;// ✓ safe, correct characters&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  []byte ↔ string: Memory Is Always Copied
&lt;/h2&gt;

&lt;p&gt;Converting between &lt;code&gt;[]byte&lt;/code&gt; and &lt;code&gt;string&lt;/code&gt; is not free — Go allocates new memory and copies every byte.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c"&gt;// new allocation + full copy&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;'X'&lt;/span&gt;       &lt;span class="c"&gt;// does NOT affect s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is intentional. Strings in Go are &lt;strong&gt;immutable&lt;/strong&gt;. Sharing memory between a mutable &lt;code&gt;[]byte&lt;/code&gt; and an immutable &lt;code&gt;string&lt;/code&gt; would cause data races and bugs. So Go always copies.&lt;/p&gt;

&lt;p&gt;The cost is O(n). In hot paths that do many conversions, use &lt;code&gt;strings.Builder&lt;/code&gt; or keep data as &lt;code&gt;[]byte&lt;/code&gt; for as long as possible.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bit = one 0 or 1. Byte = 8 bits.&lt;/strong&gt; All numbers are stored in binary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;int types are exact&lt;/strong&gt;, but have a fixed range. Exceeding it causes silent overflow — it wraps around without error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;float types handle decimals&lt;/strong&gt;, but are approximations. They use IEEE 754 binary scientific notation, and most decimals cannot be represented exactly in binary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The 0.1 + 0.2 problem is not a language bug&lt;/strong&gt; — it's how IEEE 754 works, and it applies to almost every modern language.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;big.Int is exact and unlimited&lt;/strong&gt;, but slower and uses more memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For financial systems&lt;/strong&gt;, store amounts as integers (cents, paisa). Never use floats for money.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the END:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Counting things       → int / int64
Decimal math          → float64 (if approximation is acceptable)
Financial values      → int64 (in smallest unit)
Huge exact numbers    → big.Int
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Understanding this distinction is the difference between code that works and code that silently corrupts data.&lt;/p&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>golang beauty</title>
      <dc:creator>Saiful Islam</dc:creator>
      <pubDate>Thu, 15 Jan 2026 05:54:10 +0000</pubDate>
      <link>https://dev.to/saifulire/golang-beauty-2ap2</link>
      <guid>https://dev.to/saifulire/golang-beauty-2ap2</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/saifulire" 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%2F1233537%2F05f4aded-10e1-49db-a5fe-15ac4303132d.jpg" alt="saifulire"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/saifulire/beyond-the-go-keyword-the-secret-life-of-goroutines-the-go-runtime-38lg" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Beyond the `go` Keyword: The Secret Life of Goroutines &amp;amp; The Go Runtime&lt;/h2&gt;
      &lt;h3&gt;Saiful Islam ・ Jan 14&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#go&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#systems&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>go</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>systems</category>
    </item>
    <item>
      <title>Beyond the `go` Keyword: The Secret Life of Goroutines &amp; The Go Runtime</title>
      <dc:creator>Saiful Islam</dc:creator>
      <pubDate>Wed, 14 Jan 2026 18:46:23 +0000</pubDate>
      <link>https://dev.to/saifulire/beyond-the-go-keyword-the-secret-life-of-goroutines-the-go-runtime-38lg</link>
      <guid>https://dev.to/saifulire/beyond-the-go-keyword-the-secret-life-of-goroutines-the-go-runtime-38lg</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The Complex and Beautiful Truth About Go's Concurrency Model&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Core Revelation: Goroutines Are Virtual, But Their Behavior Is Real
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The most mind-bending insight:&lt;/strong&gt; A goroutine has no physical form in your operating system. It is not in your process table. It is not a real OS resource.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A goroutine is a virtual thread.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let me illustrate with a powerful analogy:&lt;/p&gt;

&lt;h3&gt;
  
  
  The Facebook Profile Analogy
&lt;/h3&gt;

&lt;p&gt;Consider your social media profile. The profile itself is &lt;strong&gt;virtual&lt;/strong&gt;—no flesh and blood. It's a logical construct. But when your virtual profile sends a message, a &lt;em&gt;real person&lt;/em&gt; reads it. The &lt;em&gt;behavior&lt;/em&gt; is real. The &lt;em&gt;effect&lt;/em&gt; is real. The impact on the real world is undeniable.&lt;/p&gt;

&lt;p&gt;Goroutines work the same way.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Virtual Profile → Sends Message → Real Person Reads It
Virtual Thread  → Executes Code  → Real Effect on State
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A goroutine is &lt;strong&gt;logical&lt;/strong&gt;. It exists as a concept within the Go Runtime. But when it executes, when it modifies variables, when it prints to stdout, when it sends over a network—those effects are profoundly real, executed by real OS threads on real CPU cores.&lt;/p&gt;

&lt;p&gt;This distinction is not mere philosophy. It's the foundation for understanding everything that follows.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Code Simulation: What &lt;em&gt;Actually&lt;/em&gt; Happens
&lt;/h2&gt;

&lt;p&gt;Let's trace through a simple example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"time"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"main function started"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello this is Islam Saiful-5"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;goRoutine&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"main function ended"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;goRoutine&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello this is saiful"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello world"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello this is saiful2"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello this is saiful3"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello this is saiful4"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"bye world"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Without the &lt;code&gt;go&lt;/code&gt; Keyword (Sequential Execution)
&lt;/h3&gt;

&lt;p&gt;If we remove all &lt;code&gt;go&lt;/code&gt; keywords:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output:
main function started
hello world
bye world
hello this is Islam Saiful-5
main function ended
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The execution is linear, predictable, deterministic. One thing after another.&lt;/p&gt;

&lt;h3&gt;
  
  
  With the &lt;code&gt;go&lt;/code&gt; Keyword (Concurrent Execution)
&lt;/h3&gt;

&lt;p&gt;With the &lt;code&gt;go&lt;/code&gt; keywords, multiple things happen "simultaneously":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output (Run 1):
main function started
hello world
bye world
hello this is saiful
hello this is saiful2
hello this is saiful3
hello this is saiful4
hello this is Islam Saiful-5
main function ended

Output (Run 2):
main function started
hello this is Islam Saiful-5
hello world
hello this is saiful
bye world
hello this is saiful4
hello this is saiful3
hello this is saiful2
main function ended

Output (Run 3):
main function started
hello world
hello this is saiful3
hello this is saiful
bye world
hello this is saiful4
hello this is Islam Saiful-5
hello this is saiful2
main function ended
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Notice:&lt;/strong&gt; The order is different every time. The goroutines are executing concurrently, and their relative ordering is non-deterministic.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Critical Question: Why Do We Need &lt;code&gt;time.Sleep&lt;/code&gt;?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;// Why is this line essential?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the barrier protecting you from a hard truth: &lt;strong&gt;The main goroutine is a tyrant. When it finishes, it terminates the entire process—no exceptions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If main returns before other goroutines complete, they are instantly killed. The OS doesn't care about them. The Go Runtime doesn't get a say. The process exits. Period.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;time.Sleep&lt;/code&gt; is a crude but effective way to keep the main goroutine alive long enough for others to finish. Without it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Will this print?"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c"&gt;// Nope. Main returns, process dies.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The answer is &lt;strong&gt;no&lt;/strong&gt;. You never see that output.&lt;/p&gt;

&lt;p&gt;This is why understanding the main goroutine's dominance is crucial.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Birth of a Process: Disk → Binary → RAM → Execution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Compilation (&lt;code&gt;go build main.go&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;When you compile your Go code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go build main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You create a &lt;strong&gt;binary executable file&lt;/strong&gt;. This file is structured:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Binary File
├── Code Segment
│   ├── Machine instructions (functions)
│   └── Constants (read-only)
├── Data Segment
│   └── Global variables (initialized)
└── BSS Segment
    └── Uninitialized globals
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This binary sits on your hard disk, inert and lifeless. It's potential energy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Execution (&lt;code&gt;./main&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;When you run the binary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The OS &lt;strong&gt;loader&lt;/strong&gt; springs into action:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Loads the binary into RAM&lt;/strong&gt; from the hard disk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Allocates memory&lt;/strong&gt; for the process&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creates a process structure&lt;/strong&gt; (virtual computer)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creates the main thread&lt;/strong&gt; (first execution context)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jumps to the entry point&lt;/strong&gt; (typically, the Go Runtime initialization)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now the binary transforms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────┐
│      Hard Disk           │ (Inert binary file)
└─────────┬────────────────┘
          │ OS Loader
          ↓
┌──────────────────────────┐
│    RAM (Memory Layout)   │
├──────────────────────────┤
│   Code Segment           │ ← Machine instructions
├──────────────────────────┤
│   Data Segment           │ ← Global variables
├──────────────────────────┤
│   Stack                  │ ← Function calls, local vars
├──────────────────────────┤
│   Heap                   │ ← Dynamic memory
└──────────────────────────┘
          ↓
┌──────────────────────────┐
│    CPU Execution         │
│  (Fetches, Decodes,      │
│   Executes instructions) │
└──────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where your program comes alive.&lt;/p&gt;




&lt;h2&gt;
  
  
  Enter the Go Runtime: The Mini-Operating System
&lt;/h2&gt;

&lt;p&gt;This is the game-changer. &lt;strong&gt;The Go Runtime is a mini operating system running inside your Go process.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think about it: The OS is a program that manages hardware, schedules threads, allocates memory. The Go Runtime does the same thing, but at a higher level, with different resources (goroutines instead of threads, logical processors instead of physical cores).&lt;/p&gt;

&lt;h3&gt;
  
  
  Timeline of Execution
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. OS loads binary into RAM
2. Process created with main thread
3. Main thread starts at the entry point
4. Go Runtime INITIALIZES (before your code runs!)
5. Go Runtime sets up:
   - 8MB main stack
   - Goroutine Scheduler
   - Heap Allocator
   - Garbage Collector
   - Logical Processors
6. THEN your main() function executes
7. When main() returns, Go Runtime shuts down
8. Process terminates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key insight:&lt;/strong&gt; Your code doesn't have exclusive control. The Go Runtime is always present, always managing, always orchestrating.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Four Core Components
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;Goroutine Scheduler&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The traffic controller of your program. It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tracks all goroutines&lt;/li&gt;
&lt;li&gt;Decides which goroutine runs when&lt;/li&gt;
&lt;li&gt;Manages the G-M-P model (Goroutine-Machine-Processor)&lt;/li&gt;
&lt;li&gt;Works like the OS kernel scheduler, but in user-space&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;Heap Allocator&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The memory banker. It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allocates memory for goroutine stacks&lt;/li&gt;
&lt;li&gt;Manages the &lt;code&gt;make()&lt;/code&gt; and &lt;code&gt;new()&lt;/code&gt; allocations&lt;/li&gt;
&lt;li&gt;Tracks where every byte lives&lt;/li&gt;
&lt;li&gt;Works alongside the Garbage Collector&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. &lt;strong&gt;Garbage Collector&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The janitor of memory. It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identifies unreachable memory&lt;/li&gt;
&lt;li&gt;Reclaims it automatically&lt;/li&gt;
&lt;li&gt;Runs concurrently with your code&lt;/li&gt;
&lt;li&gt;Uses mark-and-sweep algorithms&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4. &lt;strong&gt;Logical Processors (P)&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Virtual CPUs. They:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correspond to your system's actual CPU cores&lt;/li&gt;
&lt;li&gt;If your CPU has 4 cores, you get 4 Logical Processors&lt;/li&gt;
&lt;li&gt;Each has a run queue of goroutines&lt;/li&gt;
&lt;li&gt;Each is paired with an OS thread (M)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CPU has 4 cores
    ↓
Go Runtime creates 4 Logical Processors (P)
    ↓
OS creates 4 OS Threads (M)
    ↓
Each M executes goroutines from its P's queue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Complete Layer Hierarchy: From CPU to Your Code
&lt;/h2&gt;

&lt;p&gt;Understanding concurrent execution requires understanding all layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────────────────────┐
│         Your Go Code                       │
│  func main() { go doWork() }               │
└────────────────────────────────────────────┘
                    ↓
┌────────────────────────────────────────────┐
│      Goroutines (G)                        │
│  - Virtual threads                         │
│  - 2KB initial stack                       │
│  - Auto-growing stacks (heap)              │
│  - Thousands can exist                     │
└────────────────────────────────────────────┘
                    ↓
┌────────────────────────────────────────────┐
│  Logical Processors (P)                    │
│  - Virtual CPUs                            │
│  - Count = runtime.NumCPU()                │
│  - Each has a run queue of Gs              │
│  - Owned by Go Runtime Scheduler           │
└────────────────────────────────────────────┘
                    ↓
┌────────────────────────────────────────────┐
│    OS Threads (M)                          │
│  - Real OS threads                         │
│  - 8MB stack each (kernel memory)          │
│  - ~1 per P                                │
│  - Owned by OS Kernel                      │
└────────────────────────────────────────────┘
                    ↓
┌────────────────────────────────────────────┐
│  Go Runtime Scheduler                      │
│  - Maps G → P → M                          │
│  - User-space scheduling                   │
│  - Work-stealing algorithm                 │
└────────────────────────────────────────────┘
                    ↓
┌────────────────────────────────────────────┐
│  OS Kernel Scheduler                       │
│  - Schedules OS threads (M)                │
│  - Kernel-space scheduling                 │
│  - Preemptive scheduling                   │
└────────────────────────────────────────────┘
                    ↓
┌────────────────────────────────────────────┐
│    CPU Cores                               │
│  - Physical execution                      │
│  - Execute machine instructions            │
│  - Control Unit, Program Counter,          │
│    Registers                               │
└────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;This is the symphony.&lt;/strong&gt; Each layer abstracts the one below, providing a simplified interface. Your code sees only goroutines. The Go Runtime handles the rest.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 2KB Secret: Why Goroutines Are Lightweight
&lt;/h2&gt;

&lt;p&gt;This is where goroutines become magical.&lt;/p&gt;

&lt;h3&gt;
  
  
  OS Thread Stack: Fixed 8MB
&lt;/h3&gt;

&lt;p&gt;When the OS creates a thread, it immediately allocates &lt;strong&gt;8MB for its stack&lt;/strong&gt;. This is fixed. Whether you use 1KB or 7.9MB, the OS has reserved 8MB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implication:&lt;/strong&gt; You can create only thousands of threads. Beyond that, you run out of memory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1,000,000 threads × 8 MB = 8,000,000 MB = 8 TB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No modern system has 8TB of memory for thread stacks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Goroutine Stack: 2KB Initial, Dynamic Growth
&lt;/h3&gt;

&lt;p&gt;A goroutine starts with &lt;strong&gt;2KB&lt;/strong&gt;—that's a 4000:1 ratio.&lt;/p&gt;

&lt;p&gt;But here's the magic: It's not fixed. When a goroutine needs more stack (due to nested function calls), the &lt;strong&gt;Go Runtime reallocates&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2KB stack is full
    ↓
Go Runtime detects overflow
    ↓
Allocates new 4KB stack in heap
    ↓
Copies all data from old to new
    ↓
Deletes old stack
    ↓
Continues execution seamlessly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is &lt;strong&gt;transparent to your code&lt;/strong&gt;. You never see it. It just works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implication:&lt;/strong&gt; You can create millions of goroutines.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1,000,000 goroutines × 2 KB = 2,000,000 KB = 2 GB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most modern systems have 2GB of RAM available.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Memory Efficiency Advantage
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;OS Thread&lt;/th&gt;
&lt;th&gt;Goroutine&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stack Size&lt;/td&gt;
&lt;td&gt;8 MB (fixed)&lt;/td&gt;
&lt;td&gt;2 KB (initial)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stack Location&lt;/td&gt;
&lt;td&gt;Kernel memory&lt;/td&gt;
&lt;td&gt;Heap memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Growth&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Dynamic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max Stack&lt;/td&gt;
&lt;td&gt;Fixed&lt;/td&gt;
&lt;td&gt;Up to 1 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Creation Overhead&lt;/td&gt;
&lt;td&gt;High (syscall)&lt;/td&gt;
&lt;td&gt;Low (runtime call)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thousands Possible?&lt;/td&gt;
&lt;td&gt;~4,000&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Millions Possible?&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This memory efficiency is &lt;strong&gt;why Go can handle massive concurrency&lt;/strong&gt;. This is why you can build a server handling 1 million concurrent connections. This is why goroutines exist.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Scheduling Model: (from BGCE ARCHIEVE)
&lt;/h2&gt;

&lt;p&gt;The Go Runtime's scheduler implements the &lt;strong&gt;G-M-P model&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;G&lt;/strong&gt; = Goroutine (user-created concurrent units)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M&lt;/strong&gt; = Machine (OS thread)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;P&lt;/strong&gt; = Processor (logical CPU)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How the Scheduler Works
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You write: go printHello(1)
    ↓
Go Runtime creates Goroutine G1
    ↓
Scheduler adds G1 to a Processor's run queue
    ↓
When a Machine (OS thread) is free on that Processor
    ↓
M picks G1 from P's queue
    ↓
M executes G1 on the CPU
    ↓
When G1 blocks or finishes
    ↓
M picks next G from queue
    ↓
Repeat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Visual Example
&lt;/h3&gt;

&lt;p&gt;Imagine a CPU with 4 cores:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Go Runtime Scheduler
         │
    ┌────┼────┬────┐
    ↓    ↓    ↓    ↓
   P1   P2   P3   P4  (4 Logical Processors)
   │    │    │    │
   M1   M2   M3   M4  (4 OS Threads)
   │    │    │    │
   G1,G5,G9 G2,G6,G10 G3,G7,G11 G4,G8,G12
   │         │        │        │
   (4 Gs per queue, 12 total goroutines)
   │         │        │        │
   ↓         ↓        ↓        ↓
 Core1    Core2    Core3    Core4  (Physical CPU Cores)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The scheduler's job: &lt;strong&gt;Keep those 4 cores busy by swapping goroutines in and out.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Scheduling Example: 100,000 Goroutines
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100,000 goroutines on 4 cores:
- P1, P2, P3, P4 each have a queue of ~25,000 Gs
- M1, M2, M3, M4 rapidly swap goroutines
- If G1 blocks on I/O, M1 picks G2 from queue
- Context switching happens microseconds
- From CPU's perspective, all 4 cores are always busy
- From your perspective, 100,000 things happen "simultaneously"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the magic. It's not parallel (only 4 at a time). It's &lt;strong&gt;concurrent&lt;/strong&gt; (interleaved, but appears simultaneous).&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 Stack &amp;amp; Heap: Where Goroutines Live
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Main Goroutine vs Other Goroutines
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Main Goroutine:
  - Executes main() function
  - Stack in kernel memory (8MB)
  - Special status: only one per process
  - When it exits, process terminates

Other Goroutines:
  - Created with `go func()`
  - Stack in heap memory (2KB initial)
  - Completely interchangeable
  - Process continues even if they exit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Memory Layout During Execution
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Process Memory
├─ Kernel Stack (8MB for main goroutine)
│  ├─ main()
│  ├─ printHello()
│  ├─ fmt.Println()
│  └─ ... (other function frames)
│
└─ Heap
   ├─ Goroutine 1 Stack (2KB → 4KB → 8KB)
   │  ├─ printHello(1)
   │  ├─ fmt.Println()
   │  └─ ...
   │
   ├─ Goroutine 2 Stack (2KB)
   │  ├─ printHello(2)
   │  └─ ...
   │
   ├─ Goroutine 3 Stack (2KB → grows)
   │  └─ ...
   │
   └─ ... (more goroutines)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each goroutine is independent. Their stacks are separate, managed individually. When a goroutine needs more stack, the Go Runtime handles it—allocating new space, copying data, updating pointers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summarized
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Goroutines are virtual threads&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logical, not physical&lt;/li&gt;
&lt;li&gt;Managed by Go Runtime, not OS&lt;/li&gt;
&lt;li&gt;Their behavior is real, their existence is virtual&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Go Runtime is a mini-operating system&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Initializes before your code&lt;/li&gt;
&lt;li&gt;Manages scheduler, allocator, garbage collector&lt;/li&gt;
&lt;li&gt;Orchestrates everything transparently&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Memory efficiency is the secret&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2KB goroutine vs 8MB OS thread (4000:1 ratio)&lt;/li&gt;
&lt;li&gt;Dynamic growth in heap memory&lt;/li&gt;
&lt;li&gt;Millions possible, not thousands&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scheduling is sophisticated&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;G-M-P model: Goroutines → Processors → Machines → CPU&lt;/li&gt;
&lt;li&gt;Work-stealing algorithm for load balancing&lt;/li&gt;
&lt;li&gt;Non-deterministic by design, not accident&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Main goroutine is your control point&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First goroutine to run&lt;/li&gt;
&lt;li&gt;Process persists while it's alive&lt;/li&gt;
&lt;li&gt;Control its lifetime via blocking mechanisms&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Non-determinism is a feature&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevents race conditions by forcing safe code&lt;/li&gt;
&lt;li&gt;Scales with confidence&lt;/li&gt;
&lt;li&gt;Forces channels over shared memory&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Layers of abstraction protect you&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You write code; don't manage threads&lt;/li&gt;
&lt;li&gt;Go Runtime handles scheduling&lt;/li&gt;
&lt;li&gt;OS Kernel handles execution&lt;/li&gt;
&lt;li&gt;CPU handles actual computation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




</description>
      <category>go</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>systems</category>
    </item>
    <item>
      <title>Separate Stack for separate Thread.</title>
      <dc:creator>Saiful Islam</dc:creator>
      <pubDate>Sat, 10 Jan 2026 08:31:05 +0000</pubDate>
      <link>https://dev.to/saifulire/separate-stack-for-separate-thread-31jo</link>
      <guid>https://dev.to/saifulire/separate-stack-for-separate-thread-31jo</guid>
      <description>&lt;h1&gt;
  
  
  Threads &amp;amp; Processes:
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Core Concept&lt;/strong&gt;: Each thread needs its own stack, but threads within a process share code, data, and heap. The OS Kernel orchestrates everything.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is a Process?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;process&lt;/strong&gt; is a running program isolated from other processes. When you open Chrome or Spotify, the OS creates a process. It starts with &lt;strong&gt;one thread&lt;/strong&gt; (the main thread) and has its own memory space. The &lt;strong&gt;kernel&lt;/strong&gt; creates a &lt;strong&gt;Process Control Block (PCB)&lt;/strong&gt; to track everything about the process.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Thread?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;thread&lt;/strong&gt; is an execution path within a process. Multiple threads can exist in one process and &lt;strong&gt;share code and data&lt;/strong&gt;, but each thread must have its &lt;strong&gt;own stack&lt;/strong&gt;. The &lt;strong&gt;kernel&lt;/strong&gt; creates a &lt;strong&gt;Thread Control Block (TCB)&lt;/strong&gt; for each thread to track its state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Process Memory Layout
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Segment&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Shared?&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Compiled program instructions&lt;/td&gt;
&lt;td&gt;✅ All threads&lt;/td&gt;
&lt;td&gt;Read-only, fixed size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Global variables&lt;/td&gt;
&lt;td&gt;✅ All threads&lt;/td&gt;
&lt;td&gt;Fixed size, initialized&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Heap&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dynamic memory (malloc/new)&lt;/td&gt;
&lt;td&gt;✅ All threads&lt;/td&gt;
&lt;td&gt;Grows upward, managed by programmer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Local variables, function calls&lt;/td&gt;
&lt;td&gt;❌ Per thread&lt;/td&gt;
&lt;td&gt;Grows downward, isolated per thread&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why Separate Stacks?
&lt;/h2&gt;

&lt;p&gt;If two threads shared one stack, their function calls would collide and corrupt each other's data. When Thread A calls a function, it creates a stack frame. If Thread B also calls a function and adds its frame to the same stack, the frames overlap and overwrite each other. When Thread B returns and pops its frame, Thread A's data becomes corrupted.&lt;/p&gt;

&lt;p&gt;Solution: Each thread has &lt;strong&gt;its own stack&lt;/strong&gt; for its function calls and local variables. This way, Thread A and Thread B can execute different functions simultaneously without interfering with each other. Both threads execute independently and safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack Frames and LIFO
&lt;/h2&gt;

&lt;p&gt;Stack frames work with LIFO (Last In, First Out) order. When &lt;code&gt;main()&lt;/code&gt; calls &lt;code&gt;functionA()&lt;/code&gt;, which calls &lt;code&gt;functionB()&lt;/code&gt;, a new frame is created for each function on the stack. When &lt;code&gt;functionB()&lt;/code&gt; completes and returns, its frame is removed from the stack, revealing &lt;code&gt;functionA()&lt;/code&gt;'s frame. Then &lt;code&gt;functionA()&lt;/code&gt; returns and its frame is removed. This ensures proper return flow and variable access.&lt;/p&gt;

&lt;p&gt;Each thread has its own stack, so multiple threads can call the same functions simultaneously without interference. Thread A's stack frames remain separate from Thread B's stack frames.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thread Creation: Main vs. Sub-threads
&lt;/h2&gt;

&lt;p&gt;When a process starts, the OS automatically creates one thread—the &lt;strong&gt;main thread&lt;/strong&gt;. This main thread is the entry point for the program and begins execution at the &lt;code&gt;main()&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;The main thread can then create additional threads by calling &lt;code&gt;pthread_create()&lt;/code&gt;. These new threads are called &lt;strong&gt;sub-threads&lt;/strong&gt;. However, once created, all threads are treated as peers by the kernel. The main thread is not special anymore—it has no more authority than the sub-threads.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thread Hierarchy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Process Created by OS
    ↓
Main Thread (created automatically by kernel)
    ├─→ Sub-thread 1 (created by main thread)
    ├─→ Sub-thread 2 (created by any thread)
    └─→ Sub-thread 3 (created by any thread)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fi13fgfghiof6na1tqjl5.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%2Fi13fgfghiof6na1tqjl5.png" alt=" " width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each sub-thread receives its own stack (allocated by the kernel), its own TCB (Thread Control Block), and shares the process's code, data, and heap. Sub-threads can also create more sub-threads if needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Music Player Example
&lt;/h2&gt;

&lt;p&gt;A music player demonstrates multi-threading well. The main thread handles the UI and user interactions. But instead of blocking on audio playback or file I/O, it creates sub-threads to handle these tasks concurrently. One sub-thread decodes and plays audio continuously. Another sub-thread handles file system operations like loading songs. A third sub-thread updates the timer display.&lt;/p&gt;

&lt;p&gt;All threads share the music player's code and data (the song list, player settings, etc.). But each thread has its own stack for local variables and function execution. The kernel rapidly switches between threads, giving each one a time slice to execute. This makes it appear that all tasks happen simultaneously.&lt;/p&gt;

&lt;h2&gt;
  
  
  The OS Kernel: Central Orchestrator
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;kernel&lt;/strong&gt; is the central manager of the OS. It handles all resource allocation and coordination for processes and threads.&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%2Fjspzovxqcw0vo66xl7ux.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%2Fjspzovxqcw0vo66xl7ux.png" alt=" " width="800" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Process Management
&lt;/h3&gt;

&lt;p&gt;The kernel creates a &lt;strong&gt;Process Control Block (PCB)&lt;/strong&gt; for every process. This PCB stores the process's ID, state (running, waiting, ready, etc.), memory layout information, file descriptors, and signal handlers. The kernel uses this information to manage the process, isolate it from other processes, and enforce security.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thread Management
&lt;/h3&gt;

&lt;p&gt;For each thread, the kernel creates a &lt;strong&gt;Thread Control Block (TCB)&lt;/strong&gt;. The TCB stores the thread's ID, state, CPU registers (Program Counter, Stack Pointer), stack address and size, thread-local storage, and scheduling information. The kernel tracks all this information so it can schedule and manage threads properly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Memory Management
&lt;/h3&gt;

&lt;p&gt;The kernel allocates memory for thread stacks using system calls like &lt;code&gt;mmap()&lt;/code&gt;. It reserves virtual address space for each thread's stack. The kernel also creates guard pages at the stack boundaries to detect stack overflow conditions. When a thread actually uses its stack, the kernel allocates physical memory on demand.&lt;/p&gt;

&lt;h3&gt;
  
  
  CPU Scheduling
&lt;/h3&gt;

&lt;p&gt;The kernel decides which thread runs on which CPU core and for how long. It uses scheduling algorithms to fairly distribute CPU time among all threads. When a thread's time slice expires or it needs to wait for I/O, the kernel performs a context switch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Context Switching
&lt;/h3&gt;

&lt;p&gt;During a context switch, the kernel saves the current thread's CPU state (Program Counter, Stack Pointer, and all CPU registers) into the thread's TCB. It then loads the next thread's saved state from its TCB into the CPU registers. The CPU then resumes execution from the restored Program Counter, effectively transferring control to the next thread. The thread resumes as if it was never interrupted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Default Stack Size by OS
&lt;/h2&gt;

&lt;p&gt;Different operating systems allocate different amounts of stack space per thread. This is virtual address space, not physical RAM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linux&lt;/strong&gt;: 8 MB per thread. For 10 threads, that's 80 MB of reserved virtual space, but actual physical RAM used is only what the threads actually consume (typically a few kilobytes per thread).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows&lt;/strong&gt;: 1 MB per thread. For 10 threads, that's 10 MB of reserved space. Windows balances stack size with resource efficiency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;macOS&lt;/strong&gt;: 512 KB per thread. For 10 threads, that's 5 MB of reserved space. macOS is more conservative with memory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Java&lt;/strong&gt;: 1 MB per thread on most systems. The JVM handles stack allocation for Java threads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Go&lt;/strong&gt;: Approximately 2 KB per goroutine. Go's goroutines are much lighter because Go's runtime manages them, not the operating system. A single Go program can have thousands or even millions of goroutines running efficiently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Different Sizes?
&lt;/h3&gt;

&lt;p&gt;Linux's larger 8 MB stack supports deep recursion and large local variables in complex applications. Windows's 1 MB stack balances stability with resource usage. macOS's smaller 512 KB stack reflects its design philosophy of resource efficiency. Go's tiny goroutine stacks work because the Go runtime manages memory and context switching with more efficiency than the OS kernel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Virtual vs. Physical Memory
&lt;/h3&gt;

&lt;p&gt;When the kernel allocates 8 MB of stack space for a thread, it reserves 8 MB of virtual address space. However, it doesn't immediately use 8 MB of physical RAM. Instead, it uses &lt;strong&gt;demand paging&lt;/strong&gt;. Only when the thread actually writes to stack memory does the kernel allocate physical pages. If a thread only uses 100 KB of its 8 MB stack, then only 100 KB of actual RAM is used. The remaining 7.9 MB of virtual space uses no physical memory at all.&lt;/p&gt;

&lt;p&gt;This allows the kernel to efficiently allocate stacks without wasting memory, even for systems with hundreds or thousands of threads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kernel Data Structures
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Process Control Block (PCB)
&lt;/h3&gt;

&lt;p&gt;The PCB contains the process ID, process state, memory layout (where code, data, heap, and stacks are located), file descriptor table, signal handlers, and a list of all threads in the process. The kernel uses this information to manage the process's lifecycle and resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thread Control Block (TCB)
&lt;/h3&gt;

&lt;p&gt;The TCB contains the thread ID, thread state, CPU registers (Program Counter, Stack Pointer, etc.), the address and size of the thread's user-mode stack, thread-local storage information, scheduling priority, and a pointer to the kernel stack. The kernel uses the TCB during context switches to save and restore thread state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kernel Stack vs. User Stack
&lt;/h2&gt;

&lt;p&gt;Every thread actually has &lt;strong&gt;two stacks&lt;/strong&gt;: a user-mode stack and a kernel-mode stack.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;user-mode stack&lt;/strong&gt; is what we've been discussing. It's used when the thread executes user code. It holds local variables, function parameters, and return addresses. It's located in the process's virtual address space and has a typical size like 8 MB on Linux.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;kernel-mode stack&lt;/strong&gt; is used when the kernel executes on behalf of the thread. This happens during system calls (like reading a file), handling interrupts, or other kernel operations. The kernel-mode stack is separate and in kernel memory, which is protected from user code. This prevents user code from corrupting kernel data structures.&lt;/p&gt;

&lt;p&gt;When a thread calls a system call like &lt;code&gt;read()&lt;/code&gt; or &lt;code&gt;write()&lt;/code&gt;, the CPU switches to kernel mode, loads the kernel stack pointer for that thread, and the kernel code executes on the kernel stack. After the system call completes, the CPU switches back to user mode and restores the user stack pointer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Late Flourish at once!
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Processes are isolated&lt;/strong&gt;: Each process has its own memory space and is protected from other processes. The kernel enforces this isolation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Threads share resources&lt;/strong&gt;: All threads within a process share the code, data, and heap. They cooperate to perform the process's tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Each thread has its own stack&lt;/strong&gt;: The stack is the only memory region per thread within a process. This ensures independent execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Main thread is special only initially&lt;/strong&gt;: It's the entry point (at &lt;code&gt;main()&lt;/code&gt;), but all threads become peers once created.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sub-threads created via &lt;code&gt;pthread_create()&lt;/code&gt;&lt;/strong&gt;: The main thread or any other thread can create new threads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kernel allocates all stacks&lt;/strong&gt;: Stack size defaults are 8 MB (Linux), 1 MB (Windows), 512 KB (macOS).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kernel manages scheduling&lt;/strong&gt;: The kernel controls which thread runs, for how long, and on which CPU core.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context switching enables multitasking&lt;/strong&gt;: Rapid context switches between threads create the illusion of parallel execution on a single core.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack frames implement LIFO&lt;/strong&gt;: Function calls push frames, returns pop frames. This is fundamental to how program control flow works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demand paging saves RAM&lt;/strong&gt;: Virtual stack space doesn't consume physical memory until actually used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TCBs track all thread state&lt;/strong&gt;: The kernel maintains TCBs to manage threads throughout their lifetime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding This Matters
&lt;/h2&gt;

&lt;p&gt;Understanding how threads work at the operating system level is fundamental to computer science. It reveals how your code actually executes at the hardware level. You're not just using threading APIs—you're understanding the real mechanisms that make concurrent programming possible. This foundation is essential for building efficient, safe multithreaded applications and for understanding more advanced concurrency concepts like goroutines in Go.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>operatingsystm</category>
      <category>computerscience</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Go's Defer: Simple Rules, Deep Runtime Truths with intuitions.</title>
      <dc:creator>Saiful Islam</dc:creator>
      <pubDate>Fri, 09 Jan 2026 10:21:27 +0000</pubDate>
      <link>https://dev.to/saifulire/gos-defer-complex-thing-in-simple-manner-with-low-level-intuitions-43gj</link>
      <guid>https://dev.to/saifulire/gos-defer-complex-thing-in-simple-manner-with-low-level-intuitions-43gj</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;defer&lt;/code&gt; schedules a function call to run just before the surrounding function returns. If you think it's just "a function that runs at the end," you're missing the important details about how Go actually executes your code.&lt;/p&gt;

&lt;p&gt;This guide explains what &lt;code&gt;defer&lt;/code&gt; really does and how it works at the runtime level.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Mental Model
&lt;/h2&gt;

&lt;p&gt;Before diving deep, understand this fundamental truth:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;return x&lt;/code&gt;&lt;/strong&gt; (unnamed): The value is copied immediately, frozen in a register&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;return&lt;/code&gt; with named result&lt;/strong&gt;: The variable stays mutable until the function exits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This single insight explains 90% of defer behavior.&lt;/p&gt;




&lt;h2&gt;
  
  
  What &lt;code&gt;defer&lt;/code&gt; Does
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;defer&lt;/code&gt; stores a function call and executes it when the function returns.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;basicExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"This runs last"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"This runs first"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c"&gt;// Output:&lt;/span&gt;
    &lt;span class="c"&gt;// This runs first&lt;/span&gt;
    &lt;span class="c"&gt;// This runs last&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What actually happens:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The function call is &lt;strong&gt;stored&lt;/strong&gt; (not executed)&lt;/li&gt;
&lt;li&gt;Execution continues normally&lt;/li&gt;
&lt;li&gt;At return time, all deferred calls execute&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Argument Evaluation vs Execution Time
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Arguments are evaluated immediately&lt;/strong&gt;, not when the deferred function runs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;argumentTiming&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Deferred print:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;// i is evaluated NOW (value 1)&lt;/span&gt;
    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
    &lt;span class="c"&gt;// Output: Deferred print: 1&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The value &lt;code&gt;1&lt;/code&gt; is captured when &lt;code&gt;defer&lt;/code&gt; is encountered. Changing &lt;code&gt;i&lt;/code&gt; later has no effect.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stack Frames and Execution
&lt;/h2&gt;

&lt;p&gt;When a function is called:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A stack frame is created&lt;/li&gt;
&lt;li&gt;Local variables are allocated&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;defer list pointer&lt;/strong&gt; is attached to the frame&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When &lt;code&gt;defer&lt;/code&gt; is encountered, the function call is stored in the defer list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────┐
│    Stack Frame      │
├─────────────────────┤
│ Local Variables     │
│ Return Address      │
│ Defer List Pointer──┼──→┌─────────────┐
└─────────────────────┘   │  Defer Node │
                          ├─────────────┤
                          │ Function    │
                          │ Arguments   │
                          │ Next ───────┼─→ [More Defers]
                          └─────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  LIFO Order: Last-In, First-Out
&lt;/h2&gt;

&lt;p&gt;Multiple &lt;code&gt;defer&lt;/code&gt; statements execute in reverse order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;lifoExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"First"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Second"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Third"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Output:&lt;/span&gt;
    &lt;span class="c"&gt;// Third&lt;/span&gt;
    &lt;span class="c"&gt;// Second&lt;/span&gt;
    &lt;span class="c"&gt;// First&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last defer added is the first one to execute.&lt;/p&gt;




&lt;h2&gt;
  
  
  Named vs Unnamed Return Values
&lt;/h2&gt;

&lt;p&gt;This is the core concept. &lt;strong&gt;Named and unnamed returns behave differently with defer.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Unnamed Return (Value is Captured)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;unnamedReturn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;  &lt;span class="c"&gt;// Too late to affect return value&lt;/span&gt;
    &lt;span class="p"&gt;}()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;  &lt;span class="c"&gt;// Value 5 is captured here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;// Returns: 5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When &lt;code&gt;return x&lt;/code&gt; executes, Go immediately captures the value 5. Deferred functions run after, but they can't change what's already captured.&lt;/p&gt;

&lt;h3&gt;
  
  
  Named Return (Variable is Shared)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;namedReturn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;  &lt;span class="c"&gt;// Modifies the return variable!&lt;/span&gt;
    &lt;span class="p"&gt;}()&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="c"&gt;// Returns the modified value&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;// Returns: 15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;result&lt;/code&gt; is a variable in the stack frame that deferred functions can access and modify until the function actually returns.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deep Dive: Named vs Unnamed Returns with Closures
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Example 1: Named Return
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"first"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;show&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"defer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"me"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"second"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"calculate result:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;first 0
second 5
5
me 5
5
defer 15
calculate result: 15
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;result = 0&lt;/code&gt; → prints "first 0"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;defer show()&lt;/code&gt; → closure registered (captures reference to &lt;code&gt;result&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;result = 5&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;defer p(result)&lt;/code&gt; → function called with &lt;strong&gt;value 5&lt;/strong&gt; (argument captured immediately)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;defer fmt.Println(result)&lt;/code&gt; → value 5 captured&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;defer fmt.Println(5)&lt;/code&gt; → literal 5&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fmt.Println("second", result)&lt;/code&gt; → prints "second 5"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;return result&lt;/code&gt; → return statement reached&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Defers execute in LIFO order:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;defer fmt.Println(5)&lt;/code&gt; → "5"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;defer fmt.Println(result)&lt;/code&gt; → "5"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;defer p(result)&lt;/code&gt; → "me 5"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;defer show()&lt;/code&gt; → closure modifies &lt;code&gt;result&lt;/code&gt; to 15, prints "defer 15"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Return value becomes 15&lt;/strong&gt; because the named return variable was modified by the closure before the function actually returned.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 2: Named vs Unnamed Comparison
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="c"&gt;// Named return: defer can modify it&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"first"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;show&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"defer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"second"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Unnamed return: defer cannot modify it&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"first"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;show&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"defer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"second"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"calculate result:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"calc result:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;first 0
second 5
defer 15
calculate result: 15
first 0
second 5
defer 15
calc result: 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Difference:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;calculate()&lt;/code&gt; (Named)&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;calc()&lt;/code&gt; (Unnamed)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Return Value&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What Happens&lt;/td&gt;
&lt;td&gt;Closure modifies return variable&lt;/td&gt;
&lt;td&gt;Closure modifies local variable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Return Mechanism&lt;/td&gt;
&lt;td&gt;Returns modified variable&lt;/td&gt;
&lt;td&gt;Returns captured value&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Execution Timeline
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Named Return (&lt;code&gt;calculate()&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Enter function → result = 0 (named return in stack frame)
2. Register defer show() → closure captures reference to 'result'
3. Set result = 5
4. Return statement reached → process defer list
5. Execute show() → result = 15
6. Return final value of 'result' = 15
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Unnamed Return (&lt;code&gt;calc()&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Enter function → result = 0 (local variable)
2. Register defer show() → closure captures reference to 'result'
3. Set result = 5
4. Return statement reached → value 5 captured in register
5. Process defer list → execute show() → result = 15 (local changed)
6. Return value from register = 5 (unchanged!)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Understanding Closures in Defer
&lt;/h2&gt;

&lt;p&gt;Deferred closures capture variables by &lt;strong&gt;reference&lt;/strong&gt;, not by value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;closureExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;  &lt;span class="c"&gt;// Shares the same memory address&lt;/span&gt;
    &lt;span class="p"&gt;}()&lt;/span&gt;

    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;  &lt;span class="c"&gt;// Returns 10, not 5&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The closure has access to the actual &lt;code&gt;result&lt;/code&gt; variable and can modify it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reference vs Copy Semantics
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Direct value in &lt;code&gt;defer&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Copy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;defer fmt.Println(x)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Closure capturing variable&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;defer func() { use(x) }()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Named return variable&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;func f() (x int)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unnamed return value&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Copy (captured)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;return x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;referenceVsCopy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Copy:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;// Captures value 1&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;

    &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Reference:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;// Will see y=2&lt;/span&gt;
    &lt;span class="p"&gt;}()&lt;/span&gt;
    &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;// Output:&lt;/span&gt;
&lt;span class="c"&gt;// Reference: 2&lt;/span&gt;
&lt;span class="c"&gt;// Copy: 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How Go Implements defer Internally
&lt;/h2&gt;

&lt;p&gt;Go implements &lt;code&gt;defer&lt;/code&gt; using a &lt;strong&gt;singly linked list&lt;/strong&gt; where each function's stack frame maintains a pointer to a chain of defer records.&lt;/p&gt;

&lt;h3&gt;
  
  
  Defer Record Allocation
&lt;/h3&gt;

&lt;p&gt;When &lt;code&gt;defer&lt;/code&gt; is encountered, Go:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creates a new defer record (stack- or heap-allocated depending on escape analysis)&lt;/li&gt;
&lt;li&gt;Stores the function pointer and captured arguments&lt;/li&gt;
&lt;li&gt;Links it to the defer chain starting from the most recent addition&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This means each defer statement prepends to the chain, naturally achieving LIFO order.&lt;/p&gt;

&lt;h3&gt;
  
  
  Defer Record Structure
&lt;/h3&gt;

&lt;p&gt;A conceptual view of the defer record structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Simplified conceptual structure&lt;/span&gt;
&lt;span class="c"&gt;// (actual runtime definitions vary by Go version)&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;_defer&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fn&lt;/span&gt;   &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;       &lt;span class="c"&gt;// Function to call&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;uintptr&lt;/span&gt;    &lt;span class="c"&gt;// Captured argument values&lt;/span&gt;
    &lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;_defer&lt;/span&gt;      &lt;span class="c"&gt;// Pointer to next defer in chain&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This is a simplified conceptual structure; actual runtime definitions vary by Go version and may include additional fields for panic handling and frame pointers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Execution Flow
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stack Frame
├─ Local Variables
├─ Return Address
└─ Defer List Pointer ──→ [Defer Record #3] (most recent)
                          ├─ Function: show()
                          ├─ Arguments: captured values
                          └─ Next ──→ [Defer Record #2]
                                      ├─ Function: p()
                                      ├─ Arguments: 5
                                      └─ Next ──→ [Defer Record #1]
                                                  ├─ Function: fmt.Println()
                                                  ├─ Arguments: 5
                                                  └─ Next ──→ NULL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the function returns, execution starts at the head (most recently added defer) and follows the chain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;// Record 1&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;// Record 2 (becomes head)&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;// Record 3 (new head)&lt;/span&gt;

    &lt;span class="c"&gt;// At return:&lt;/span&gt;
    &lt;span class="c"&gt;// Head → Record 3 (execute) → Record 2 (execute) → Record 1 (execute) → NULL&lt;/span&gt;

    &lt;span class="c"&gt;// Output:&lt;/span&gt;
    &lt;span class="c"&gt;// 3&lt;/span&gt;
    &lt;span class="c"&gt;// 2&lt;/span&gt;
    &lt;span class="c"&gt;// 1&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why This Design?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Per-function management&lt;/strong&gt;: Each function tracks its own defer chain independently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic size&lt;/strong&gt;: No fixed limit on defer count; scales with runtime behavior&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O(1) insertion&lt;/strong&gt;: Adding a new defer is a single pointer operation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Natural LIFO&lt;/strong&gt;: Prepending to the head automatically gives reverse execution order&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Closure support&lt;/strong&gt;: Each record can capture different closure environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Panic handling&lt;/strong&gt;: The defer chain is traversed even during panic recovery&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Pitfalls
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Loop Variable Capture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// WRONG: All closures see final value of i&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;problematicLoop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;// Prints: 3, 3, 3&lt;/span&gt;
        &lt;span class="p"&gt;}()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// RIGHT: Pass as parameter to capture value&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;fixedLoop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;// Prints: 2, 1, 0&lt;/span&gt;
        &lt;span class="p"&gt;}(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Resource Cleanup in Loops
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// WRONG: All Close() calls happen at end of function&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;processFiles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filenames&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;filenames&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c"&gt;// Accumulates&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// RIGHT: Use a wrapper function for scope&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;processFilesCorrect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filenames&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;filenames&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c"&gt;// Closes immediately after this iteration&lt;/span&gt;
        &lt;span class="p"&gt;}()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Error Handling in Defer
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;mightFail&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"file.txt"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;closeErr&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;closeErr&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;closeErr&lt;/span&gt;  &lt;span class="c"&gt;// Combine errors with named return&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}()&lt;/span&gt;

    &lt;span class="c"&gt;// Process file...&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Practical Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Resource Cleanup (Named Return)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;openResource&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;acquireResource&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;closeErr&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;closeErr&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;closeErr&lt;/span&gt;  &lt;span class="c"&gt;// Can modify named return&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}()&lt;/span&gt;

    &lt;span class="c"&gt;// Use resource...&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Panic Recovery
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;safeOperation&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;recover&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"panic: %v"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}()&lt;/span&gt;

    &lt;span class="c"&gt;// Code that might panic...&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Transaction Pattern
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Begin&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;recover&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rollback&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}()&lt;/span&gt;

    &lt;span class="c"&gt;// Do work...&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;Defer is cheap for most use cases. However, in very tight loops with millions of iterations, the overhead of managing the defer chain becomes measurable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Slower: defer in tight loop (millions of iterations)&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;processBatch1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;mu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Unlock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c"&gt;// Creates millions of deferred records&lt;/span&gt;
        &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Faster: explicit unlock (millions of iterations)&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;processBatch2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;mu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Unlock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c"&gt;// Immediate cleanup, no defer overhead&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to use defer:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One-time resource cleanup (file opens, lock acquisition)&lt;/li&gt;
&lt;li&gt;Error handling and panic recovery&lt;/li&gt;
&lt;li&gt;Any non-performance-critical code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to avoid defer:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extremely hot loops with millions of iterations&lt;/li&gt;
&lt;li&gt;Real-time systems with strict latency requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Modern Go (1.20+) has optimized defer significantly with open-coded defers, making it even cheaper in most scenarios.&lt;/p&gt;




</description>
      <category>go</category>
      <category>webdev</category>
      <category>core</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Closures in Go:- escape analysis, memory layout, and runtime behavior</title>
      <dc:creator>Saiful Islam</dc:creator>
      <pubDate>Thu, 06 Nov 2025 13:29:30 +0000</pubDate>
      <link>https://dev.to/saifulire/closures-in-go-escape-analysis-memory-layout-and-runtime-behavior-8gk</link>
      <guid>https://dev.to/saifulire/closures-in-go-escape-analysis-memory-layout-and-runtime-behavior-8gk</guid>
      <description>&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%2Fjztzrj5evle2ficpney4.webp" 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%2Fjztzrj5evle2ficpney4.webp" alt=" " width="800" height="316"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Closures&lt;/strong&gt; in Go Includes the exact code, what the compiler does at compile-time, runtime steps, stack vs heap comparison, a compact memory diagram, and GC is here.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Starting with a code Example&lt;/li&gt;
&lt;li&gt;Program output&lt;/li&gt;
&lt;li&gt;What is a closure&lt;/li&gt;
&lt;li&gt;Why closures matter&lt;/li&gt;
&lt;li&gt;Compiler time: code/data segments &amp;amp; compilation flow&lt;/li&gt;
&lt;li&gt;Key segments (table)&lt;/li&gt;
&lt;li&gt;Escape analysis — what it is and how it decides&lt;/li&gt;
&lt;li&gt;Runtime behavior — stepwise

&lt;ul&gt;
&lt;li&gt;Program startup&lt;/li&gt;
&lt;li&gt;Call to &lt;code&gt;outer()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Invoking the closure&lt;/li&gt;
&lt;li&gt;Multiple closures&lt;/li&gt;
&lt;li&gt;End of life&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Stack vs Heap — compact comparison table&lt;/li&gt;
&lt;li&gt;Memory visualization (CLI)&lt;/li&gt;
&lt;li&gt;Garbage collector role&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  12. Minimal step-by-step trace (first &lt;code&gt;outer()&lt;/code&gt; and two closure calls)
&lt;/h2&gt;

&lt;h2&gt;
  
  
  1. Starting with a code Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;    &lt;span class="c"&gt;// compile-time constant&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;     &lt;span class="c"&gt;// package-level variable&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Bangla Bank"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;outer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
    &lt;span class="n"&gt;money&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Age = %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;show&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;money&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;money&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;money&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;incr1&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;outer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c"&gt;// creates closure capturing `money`&lt;/span&gt;
    &lt;span class="n"&gt;incr1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;          &lt;span class="c"&gt;// prints updated money&lt;/span&gt;
    &lt;span class="n"&gt;incr1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;          &lt;span class="c"&gt;// prints updated money again&lt;/span&gt;

    &lt;span class="n"&gt;incr2&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;outer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c"&gt;// new closure instance — independent `money`&lt;/span&gt;
    &lt;span class="n"&gt;incr2&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;incr2&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Program output
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bangla Bank
Age = 30
210
320
Age = 30
210
320
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note: two separate closures created by two calls to &lt;code&gt;outer()&lt;/code&gt; (&lt;code&gt;incr1&lt;/code&gt; and &lt;code&gt;incr2&lt;/code&gt;), each with its own &lt;code&gt;money&lt;/code&gt; value so their state does not interfere.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. What is a closure
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;closure&lt;/strong&gt; in Go is a function value (commonly an anonymous function) that &lt;em&gt;captures&lt;/em&gt; identifiers (variables) from its surrounding lexical scope. Captured variables remain accessible to the closure after the outer function returns. In the example above, &lt;code&gt;show&lt;/code&gt; captures &lt;code&gt;money&lt;/code&gt;. Because &lt;code&gt;show&lt;/code&gt; is returned and can be invoked later, the captured &lt;code&gt;money&lt;/code&gt; must survive the lifetime of &lt;code&gt;outer()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Implementation note (runtime view): a function value is usually represented as a small runtime struct containing a pointer to the compiled code and a pointer to the closure's environment (the captured variables).&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Why closures matter
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Closures allow a function to carry state with it (function + environment).&lt;/li&gt;
&lt;li&gt;Each call to &lt;code&gt;outer()&lt;/code&gt; returns an independent function value with its own captured environment. That’s why &lt;code&gt;incr1()&lt;/code&gt; and &lt;code&gt;incr2()&lt;/code&gt; maintain separate &lt;code&gt;money&lt;/code&gt; values.&lt;/li&gt;
&lt;li&gt;Knowing how captured variables are stored (stack vs heap) is essential for reasoning about performance and lifetime.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Compiler time: code/data segments &amp;amp; compilation flow
&lt;/h2&gt;

&lt;p&gt;At compile-time the Go toolchain typically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compiles function bodies into machine code → code segment (read-only).
&lt;/li&gt;
&lt;li&gt;Places package-level variables into the data segment (globals).
&lt;/li&gt;
&lt;li&gt;Treats local variables as stack candidates until escape analysis decides they must escape.
&lt;/li&gt;
&lt;li&gt;Produces a binary where constants, functions, and globals are laid into appropriate areas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The escape analysis pass marks variables that must live beyond their creating function; the compiler will then arrange for those variables to be heap-allocated.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Key segments and examples from the program
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Segment&lt;/th&gt;
&lt;th&gt;What it stores (this program)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Code segment&lt;/td&gt;
&lt;td&gt;compiled instructions for &lt;code&gt;init&lt;/code&gt;, &lt;code&gt;main&lt;/code&gt;, &lt;code&gt;outer&lt;/code&gt;, and the anonymous &lt;code&gt;show&lt;/code&gt; function. (Note: &lt;code&gt;const a&lt;/code&gt; is a compile-time constant — see "Anomalies &amp;amp; fine points" for nuance.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data segment&lt;/td&gt;
&lt;td&gt;package/global vars: &lt;code&gt;p&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stack&lt;/td&gt;
&lt;td&gt;local variables used only during function execution (e.g., &lt;code&gt;age&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heap&lt;/td&gt;
&lt;td&gt;variables that escape (e.g., the &lt;code&gt;money&lt;/code&gt; cell when captured by the closure)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  7. Escape analysis- what it is and how it decides
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Escape analysis&lt;/strong&gt; is a compile-time analysis that decides whether a variable can safely live on the stack or must be moved (escape) to the heap.&lt;/p&gt;

&lt;p&gt;Simplified rules (high level):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If a variable is used only inside the function and cannot be referenced afterwards → keep it on the stack.&lt;/li&gt;
&lt;li&gt;If a variable's address is taken, stored in a place that outlives the function, or is captured by a function value that may outlive the function (returned or stored elsewhere) → the variable escapes and is allocated on the heap.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;age&lt;/code&gt; is used only inside &lt;code&gt;outer()&lt;/code&gt; and is never referenced by &lt;code&gt;show&lt;/code&gt; → stays on the stack.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;money&lt;/code&gt; is referenced by &lt;code&gt;show&lt;/code&gt; and &lt;code&gt;show&lt;/code&gt; is returned → &lt;code&gt;money&lt;/code&gt; escapes and is allocated on the heap.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8. Runtime behavior- function values, stack frames, heap objects
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Program startup
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Package &lt;code&gt;init()&lt;/code&gt; runs (prints &lt;code&gt;Bangla Bank&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Program loads code/data segments and prepares to execute &lt;code&gt;main()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Call to &lt;code&gt;outer()&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A stack frame for &lt;code&gt;outer()&lt;/code&gt; is created.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;age := 30&lt;/code&gt; is allocated as a stack-local candidate.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;money := 100&lt;/code&gt; is created but marked by escape analysis as escaping; the compiler arranges for it to be allocated on the heap (addressable by the closure environment).&lt;/li&gt;
&lt;li&gt;The anonymous function &lt;code&gt;show&lt;/code&gt; has compiled code in the code segment; the runtime builds a function value that contains:

&lt;ul&gt;
&lt;li&gt;a pointer to the compiled code for the anonymous function, and&lt;/li&gt;
&lt;li&gt;a pointer to the captured environment (a heap object holding &lt;code&gt;money&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;outer()&lt;/code&gt; returns that function value; the stack frame is popped but the heap environment remains reachable through the function value.&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Invoking the closure
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Calling the function value (e.g., &lt;code&gt;incr1()&lt;/code&gt;) jumps to the code pointed to by the function value.&lt;/li&gt;
&lt;li&gt;The closure code uses the environment pointer to access and modify the heap-stored &lt;code&gt;money&lt;/code&gt; cell.&lt;/li&gt;
&lt;li&gt;Repeated calls mutate the same heap cell referenced by the closure (so state persists across calls).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Multiple closures
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Each call to &lt;code&gt;outer()&lt;/code&gt; that returns a closure creates a separate heap allocation for &lt;code&gt;money&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;incr1&lt;/code&gt; and &lt;code&gt;incr2&lt;/code&gt; therefore refer to different heap objects; their &lt;code&gt;money&lt;/code&gt; states do not interfere.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  End of life
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;When there are no remaining references to a closure's function value (and thus to its environment), the heap object becomes unreachable and the GC may reclaim it.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  9. Stack vs Heap- compact comparison table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Stack&lt;/th&gt;
&lt;th&gt;Heap&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Allocation&lt;/td&gt;
&lt;td&gt;Automatic per function call&lt;/td&gt;
&lt;td&gt;By compiler/runtime when variable escapes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lifetime&lt;/td&gt;
&lt;td&gt;LIFO — ends when function returns&lt;/td&gt;
&lt;td&gt;Lives until GC collects unreachable objects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use case&lt;/td&gt;
&lt;td&gt;Temporary locals (&lt;code&gt;age&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Captured locals that outlive function (&lt;code&gt;money&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Management&lt;/td&gt;
&lt;td&gt;Implicit, no GC involvement&lt;/td&gt;
&lt;td&gt;Managed by Go garbage collector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access cost&lt;/td&gt;
&lt;td&gt;Fast, no pointer indirection&lt;/td&gt;
&lt;td&gt;Additional indirection; GC overhead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visibility to closure&lt;/td&gt;
&lt;td&gt;Not available after return&lt;/td&gt;
&lt;td&gt;Reachable via closure function value&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  10. Memory visualization (CLI-style)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────┐
│ Code segment                │
│ --------------------------- │
│ compiled code: init, main,  │
│ outer, anonymous show       │
│ (const a inlined at compile time)
└─────────────────────────────┘
           ↓
┌─────────────────────────────┐
│ Data segment                │
│ --------------------------- │
│ var p = 100                 │
└─────────────────────────────┘
           ↓
┌─────────────────────────────┐
│ Stack                       │
│ --------------------------- │
│ outer() frame               │
│   age = 30                  │
│   return address, locals    │
└─────────────────────────────┘
           ↓
┌─────────────────────────────┐
│ Heap                        │
│ --------------------------- │
│ money = 100 (for incr1)     │
│ money = 100 (for incr2)     │
└─────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each returned closure function value points to the code segment (function code) and a pointer to its own heap block that holds &lt;code&gt;money&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Garbage collector role
&lt;/h2&gt;

&lt;p&gt;When closures (and references to them) go out of scope, the heap objects they reference become unreachable. Go's GC reclaims unreachable heap memory using concurrent mark-and-sweep techniques (collection timing is nondeterministic and happens automatically). From the programmer's perspective: you don't &lt;code&gt;free&lt;/code&gt; these captured variables manually — the runtime does it when they become unreachable.&lt;/p&gt;




&lt;h2&gt;
  
  
  12. Minimal step-by-step trace (first &lt;code&gt;outer()&lt;/code&gt; and two closure calls)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;outer()&lt;/code&gt; called:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;age := 30&lt;/code&gt; (stack)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;money := 100&lt;/code&gt; → marked to escape → heap allocation for &lt;code&gt;money&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fmt.Printf("Age = %d\n", age)&lt;/code&gt; prints &lt;code&gt;Age = 30&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;show&lt;/code&gt; is created as a function value (code pointer + pointer to heap &lt;code&gt;money&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;outer()&lt;/code&gt; returns &lt;code&gt;show&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;incr1()&lt;/code&gt; (first call):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;money = money + a + p&lt;/code&gt; → &lt;code&gt;100 + 10 + 100 = 210&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;prints &lt;code&gt;210&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;incr1()&lt;/code&gt; (second call):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;money = 210 + 10 + 100 = 320&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;prints &lt;code&gt;320&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;incr2 := outer()&lt;/code&gt; repeats the above steps and creates a new heap cell for &lt;code&gt;money&lt;/code&gt; for the second closure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When &lt;code&gt;incr1&lt;/code&gt; and &lt;code&gt;incr2&lt;/code&gt; become unreachable, GC reclaims their respective &lt;code&gt;money&lt;/code&gt; blocks.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




</description>
      <category>systemlevel</category>
      <category>go</category>
      <category>lowlevel</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Mastering Scopes in Go</title>
      <dc:creator>Saiful Islam</dc:creator>
      <pubDate>Tue, 14 Oct 2025 09:01:15 +0000</pubDate>
      <link>https://dev.to/saifulire/mastering-scopes-in-go-436b</link>
      <guid>https://dev.to/saifulire/mastering-scopes-in-go-436b</guid>
      <description>&lt;h1&gt;
  
  
  Scopes ins and outs
&lt;/h1&gt;

&lt;p&gt;Basics for all advanced Go concepts, it is &lt;strong&gt;scope&lt;/strong&gt;. Without a rock-solid understanding of scope, your programs will feel confusing and unpredictable—if a variable isn't accessible where you expect it, you'll get that dreaded "undefined" error.&lt;/p&gt;

&lt;p&gt;It’s important to &lt;strong&gt;understand why&lt;/strong&gt; they exist. One of the best ways to master scope is to simulate how the computer manages memory (RAM) and allocates space for your variables and functions.&lt;/p&gt;

&lt;p&gt;Now, let's dive into scope of Go and see how the computer handles each of them.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Pillars of Scope in Go
&lt;/h2&gt;

&lt;p&gt;Go classifies scope into a few main categories: &lt;strong&gt;global scope&lt;/strong&gt;, &lt;strong&gt;local (or block) scope&lt;/strong&gt;, and &lt;strong&gt;package scope&lt;/strong&gt;. Understanding how these layers interact and which one takes priority is crucial for writing bug-free Go programs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Global Scope:
&lt;/h3&gt;

&lt;p&gt;When your program starts running, the Go runtime allocates a dedicated portion of memory (RAM) known as the &lt;strong&gt;global scope&lt;/strong&gt;. Any variable or function declared outside of any function (that is, at the package level) is placed in this space.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="c"&gt;// Global variables A and B&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt; 
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt; 

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this code, &lt;code&gt;A&lt;/code&gt; and &lt;code&gt;B&lt;/code&gt; are declared in the global scope. During program startup, Go stores &lt;code&gt;A = 20&lt;/code&gt; and &lt;code&gt;B = 30&lt;/code&gt; in global memory. It also registers references to the &lt;code&gt;add&lt;/code&gt; function and the &lt;code&gt;main&lt;/code&gt; function at the global level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search Priority from:&lt;/strong&gt; The global scope serves as the final fallback. If the compiler can't find a variable or function in the current local scope (or any enclosing local scopes), it then checks the global scope. If it finds the name there, the code compiles successfully. Otherwise, you'll get an undefined error.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local Scope and Blocks:
&lt;/h3&gt;

&lt;p&gt;Local scope is created whenever a function (or another block) is executed. Each time you call a function, Go allocates a fresh block of memory for that function’s variables, often on the call stack. A &lt;strong&gt;block&lt;/strong&gt; in Go is defined by opening and closing curly braces &lt;code&gt;{}&lt;/code&gt;. Each function, as well as conditional &lt;strong&gt;(&lt;code&gt;if/else&lt;/code&gt;), &lt;code&gt;loop&lt;/code&gt;, or &lt;code&gt;switch&lt;/code&gt;&lt;/strong&gt; block, creates a new local scope.&lt;/p&gt;

&lt;p&gt;Consider this example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Local to main's scope&lt;/span&gt;
    &lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;18&lt;/span&gt; 

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="m"&gt;18&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// Local to the IF block (a nested scope)&lt;/span&gt;
        &lt;span class="n"&gt;P&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; 
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"I have"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"points"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// Output: 10&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// P is out of scope here!&lt;/span&gt;
    &lt;span class="c"&gt;// fmt.Println(P) // Uncommenting this will cause a compile error: undefined P&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this snippet, &lt;code&gt;X&lt;/code&gt; is a local variable in &lt;code&gt;main&lt;/code&gt;'s scope. When the &lt;code&gt;if&lt;/code&gt; condition is true, Go creates a new, nested scope for the &lt;code&gt;if&lt;/code&gt; block, and &lt;code&gt;P&lt;/code&gt; is a local variable in that inner scope. As soon as the &lt;code&gt;if&lt;/code&gt; block completes, Go clears the memory for &lt;code&gt;P&lt;/code&gt;. If you try to use &lt;code&gt;P&lt;/code&gt; outside that block, the compiler will say it's undefined because &lt;code&gt;P&lt;/code&gt; no longer exists in any active scope.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Crucial Scope Resolution Sequence
&lt;/h4&gt;

&lt;p&gt;Whenever your code needs to look up a name (variable or function), Go follows this sequence: 1-&amp;gt;2-&amp;gt;3;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Current Block/Function Scope:&lt;/strong&gt; Check the innermost local scope first.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enclosing/Parent Scopes:&lt;/strong&gt; If not found, look in any outer local scopes (for example, the enclosing function's scope).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global Scope:&lt;/strong&gt; Finally, check the global (package-level) scope.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the name isn't found by the time you reach the global scope, the compiler will give an error.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Real-World Scope Failure Example:&lt;/strong&gt; If you declare a variable &lt;code&gt;Z&lt;/code&gt; inside a function &lt;code&gt;add()&lt;/code&gt;, it only lives in the local scope of &lt;code&gt;add()&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Trying to use &lt;code&gt;Z&lt;/code&gt; in &lt;code&gt;main()&lt;/code&gt; will fail with &lt;code&gt;undefined: Z&lt;/code&gt;, because &lt;code&gt;Z&lt;/code&gt; was never in scope in &lt;code&gt;main()&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Package Scope: Cross-File Accessibility
&lt;/h3&gt;

&lt;p&gt;Package scope governs how code is visible across different files and packages. &lt;/p&gt;

&lt;h4&gt;
  
  
  Multiple Files in the Same Package
&lt;/h4&gt;

&lt;p&gt;If you have multiple Go files in the same package (for example, &lt;code&gt;main.go&lt;/code&gt; and &lt;code&gt;add.go&lt;/code&gt; both with &lt;code&gt;package main&lt;/code&gt;), you need to compile or run them together. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go run main.go add.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you run only &lt;code&gt;main.go&lt;/code&gt; by itself, Go won’t see the contents of &lt;code&gt;add.go&lt;/code&gt;. Any functions or variables declared in &lt;code&gt;add.go&lt;/code&gt; would be "undefined" in that case. Running both files together ensures all package-level declarations are included.&lt;/p&gt;

&lt;h4&gt;
  
  
  Importing from a Custom Package
&lt;/h4&gt;

&lt;p&gt;When using separate packages (for example, you create your own package &lt;code&gt;math_library&lt;/code&gt;), Go enforces that only identifiers starting with an &lt;strong&gt;uppercase letter&lt;/strong&gt; are exported. For instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Inside math_library/math.go&lt;/span&gt;
&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;math_library&lt;/span&gt;

&lt;span class="c"&gt;// Exported: accessible from other packages&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Not exported: starts with a lowercase letter&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;money&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After doing &lt;code&gt;go mod init example.com&lt;/code&gt; for this module, you might use &lt;code&gt;math_library&lt;/code&gt; from &lt;code&gt;main.go&lt;/code&gt; like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"example.com/math_library"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;math_library&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// Works, since Add is exported&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c"&gt;// Output: 11&lt;/span&gt;

    &lt;span class="c"&gt;// fmt.Println(math_library.money) // Error: money is unexported (undefined outside math_library--// Not exported: starts with a lowercase letter)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures that only the parts of your code you intend to share are visible to other packages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variable Shadowing:
&lt;/h3&gt;

&lt;p&gt;A common pitfall in Go is &lt;strong&gt;variable shadowing&lt;/strong&gt;, which occurs when an inner scope declares a variable with the same name as one in an outer scope. The inner declaration "shadows" the outer one within its block.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="c"&gt;// Global A&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt; 

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;18&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// This A shadows the global A inside this if-block&lt;/span&gt;
        &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;47&lt;/span&gt; 
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// Output 1: 47 (prints the inner A)****After printing it will disappear then or end of it's scope tasks.****&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// Output 2: 10 (prints the global A)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Shadowing Example
&lt;/h4&gt;

&lt;p&gt;In the code above:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Globally, &lt;code&gt;A&lt;/code&gt; is set to 10.
&lt;/li&gt;
&lt;li&gt;When the &lt;code&gt;if&lt;/code&gt; block executes, a new local scope is created. Inside this block, &lt;code&gt;A&lt;/code&gt; is redeclared and set to 47.
&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;fmt.Println(A)&lt;/code&gt; inside the block finds the &lt;em&gt;inner&lt;/em&gt; &lt;code&gt;A&lt;/code&gt; (47) first, so it prints 47.
&lt;/li&gt;
&lt;li&gt;When the block finishes, the inner &lt;code&gt;A&lt;/code&gt; (47) goes out of scope and is removed.
&lt;/li&gt;
&lt;li&gt;The next &lt;code&gt;fmt.Println(A)&lt;/code&gt; (outside the block) now only sees the global &lt;code&gt;A&lt;/code&gt;, which is still 10, so it prints 10.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The inner &lt;code&gt;A&lt;/code&gt; temporarily takes precedence, but only within the &lt;code&gt;if&lt;/code&gt; block.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion: Master Simulation, Master Go
&lt;/h2&gt;

&lt;p&gt;Scope is not just an abstract idea—it's a direct reflection of how memory is allocated and cleaned up in your program. By mastering scope, you gain insight into your program’s inner workings. Instead of rote learning, focus on &lt;strong&gt;simulating&lt;/strong&gt; execution flow and memory allocation. Visualize exactly when each variable is created and when it goes out of scope. As you write more Go code, keep imagining those memory blocks for your variables. The clearer your mental model, the fewer surprises (like "undefined" errors) you'll encounter.&lt;/p&gt;

&lt;p&gt;Start simulating today—your future self (and your future code) will thank you. Pardon me for not visualizing RAM memory allocations.&lt;br&gt;
All credit goes to Habib vai.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>go</category>
      <category>backend</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Variables and Data Types in Go (Golang)</title>
      <dc:creator>Saiful Islam</dc:creator>
      <pubDate>Sat, 04 Oct 2025 15:33:37 +0000</pubDate>
      <link>https://dev.to/saifulire/variables-and-data-types-in-go-golang-1832</link>
      <guid>https://dev.to/saifulire/variables-and-data-types-in-go-golang-1832</guid>
      <description>&lt;p&gt;"Understand variables, how they live in RAM, Go’s core data types, declaration styles, reassignment rules, and constants."&lt;/p&gt;

&lt;p&gt;When learning Go (Golang), understanding &lt;strong&gt;variables&lt;/strong&gt; and &lt;strong&gt;data types&lt;/strong&gt; is essential.&lt;br&gt;&lt;br&gt;
They form the foundation of every program — acting as the bridge between &lt;strong&gt;logic&lt;/strong&gt; and &lt;strong&gt;memory&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  In this guide, we’ll explore
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The concept of variables
&lt;/li&gt;
&lt;li&gt;How memory (RAM) works with variables
&lt;/li&gt;
&lt;li&gt;Go’s primary data types
&lt;/li&gt;
&lt;li&gt;Different variable declaration methods
&lt;/li&gt;
&lt;li&gt;Reassignment rules and type immutability
&lt;/li&gt;
&lt;li&gt;Constants in Go&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s dive in 👇&lt;/p&gt;


&lt;h2&gt;
  
  
  The Concept of Variables
&lt;/h2&gt;

&lt;p&gt;A variable is simply a &lt;strong&gt;container&lt;/strong&gt; — a vessel, bucket, or pot (বালতি, গামলা, বাসন) used to store something.&lt;br&gt;&lt;br&gt;
Just like you might store coffee in a mug or rice in a dish, a program stores &lt;strong&gt;data&lt;/strong&gt; in variables.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Purpose:&lt;/strong&gt; To store and manage data — the heart of programming and computer science.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Naming:&lt;/strong&gt; Programmers often use &lt;strong&gt;Var&lt;/strong&gt; (V-A-R) as shorthand for "Variable."
They also shorten other terms, like writing &lt;strong&gt;&lt;code&gt;int&lt;/code&gt;&lt;/strong&gt; instead of “Integer.”&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Variables and Computer Memory
&lt;/h2&gt;

&lt;p&gt;When you declare a variable, it doesn’t just exist in code — it occupies space in your computer’s &lt;strong&gt;RAM (memory)&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Components of a Computer Relevant to Variables
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Function / Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CPU (Central Processing Unit)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Executes instructions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RAM (Random Access Memory)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Temporarily stores variables and data during program execution.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hard Disk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Long-term data storage (not directly used for variables at runtime).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  How Variables Occupy RAM
&lt;/h3&gt;

&lt;p&gt;When you declare something like &lt;code&gt;a := 10&lt;/code&gt;, Go asks the computer to allocate space for it in memory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RAM is divided into many small storage spaces called &lt;strong&gt;cells&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Declaring a variable occupies one of those &lt;strong&gt;empty cells&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;That cell is given a &lt;strong&gt;name&lt;/strong&gt; (e.g., &lt;code&gt;a&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;value&lt;/strong&gt; (e.g., &lt;code&gt;10&lt;/code&gt;) is stored inside that cell.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So &lt;code&gt;a := 10&lt;/code&gt; means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Hey computer, take one cell in RAM, label it &lt;strong&gt;a&lt;/strong&gt;, and put &lt;strong&gt;10&lt;/strong&gt; inside it.”&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Data Types (ডাটা টাইপ)
&lt;/h2&gt;

&lt;p&gt;Every variable stores data — but not all data is the same type.&lt;br&gt;&lt;br&gt;
Go’s data types define &lt;strong&gt;what kind of value&lt;/strong&gt; a variable can hold.&lt;/p&gt;
&lt;h3&gt;
  
  
  Table of Primary Data Types in Go
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Meaning / Example&lt;/th&gt;
&lt;th&gt;Go Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Numeric&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Numbers of any kind.&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Divided into integers and floating-point types.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;-&amp;gt;Integer (পূর্ণ সংখ্যা)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Whole numbers (e.g., &lt;code&gt;10&lt;/code&gt;, &lt;code&gt;-5&lt;/code&gt;).&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;int&lt;/code&gt;, &lt;code&gt;int8&lt;/code&gt;, &lt;code&gt;int16&lt;/code&gt;, &lt;code&gt;int32&lt;/code&gt;, &lt;code&gt;int64&lt;/code&gt;, &lt;code&gt;uint&lt;/code&gt;, &lt;code&gt;uint8&lt;/code&gt;, etc.&lt;/td&gt;
&lt;td&gt;Whole numbers. The suffix (8, 16, 32, 64) refers to bit size.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;-&amp;gt;Floating Point (দশমিক সংখ্যা)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Decimal numbers (e.g., &lt;code&gt;10.5&lt;/code&gt;, &lt;code&gt;40.34&lt;/code&gt;).&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;float32&lt;/code&gt;, &lt;code&gt;float64&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;For numbers with decimals.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Boolean (বুলিয়ান)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;True or False values.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bool&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Can only be &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;String (স্ট্রিং)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Words or text.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enclosed in double quotes, e.g., &lt;code&gt;"Hello World"&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; More complex types (like &lt;strong&gt;arrays&lt;/strong&gt;, &lt;strong&gt;slices&lt;/strong&gt;, and &lt;strong&gt;structs&lt;/strong&gt;) come later — start simple!&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Declaring Variables in Go
&lt;/h2&gt;

&lt;p&gt;Go offers several ways to declare variables.&lt;br&gt;&lt;br&gt;
Knowing one or two is enough to start coding efficiently.&lt;/p&gt;
&lt;h3&gt;
  
  
  A. Explicit Declaration (Type Specified)
&lt;/h3&gt;

&lt;p&gt;You tell Go exactly what type the variable will hold:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;var&lt;/code&gt; → tells Go you’re declaring a variable.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;x&lt;/code&gt; → the variable name.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;int&lt;/code&gt; → its data type.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;= 10&lt;/code&gt; → the assigned value.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  B. Type Inference (Let Go Decide)
&lt;/h3&gt;

&lt;p&gt;Go is smart — it can infer the data type automatically based on the value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 1 — Long Form&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="c"&gt;// Go infers: a is int&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 2 — Short-Hand Declaration&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;       &lt;span class="c"&gt;// infers int&lt;/span&gt;
&lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;3.14&lt;/span&gt;    &lt;span class="c"&gt;// infers float64&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"Go"&lt;/span&gt;  &lt;span class="c"&gt;// infers string&lt;/span&gt;
&lt;span class="n"&gt;isCool&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt; &lt;span class="c"&gt;// infers bool&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;:=&lt;/code&gt; operator both &lt;strong&gt;declares&lt;/strong&gt; and &lt;strong&gt;initializes&lt;/strong&gt; a variable in one step.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Reassigning Variables
&lt;/h2&gt;

&lt;p&gt;Variables are “containers,” so their contents can change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rules for Reassignment&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You &lt;strong&gt;cannot&lt;/strong&gt; use &lt;code&gt;:=&lt;/code&gt; again — that’s only for &lt;strong&gt;declaring&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;To update, use the simple &lt;code&gt;=&lt;/code&gt; operator.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt; &lt;span class="c"&gt;// ✅ OK (reassignment)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you try this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt; &lt;span class="c"&gt;// ❌ Error: no new variables on left side&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Go will complain — you’re &lt;strong&gt;redeclaring&lt;/strong&gt; instead of &lt;strong&gt;reassigning&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Type Immutability
&lt;/h2&gt;

&lt;p&gt;Once a variable is assigned a type, it cannot hold a value of a different type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;   &lt;span class="c"&gt;// ✅ OK&lt;/span&gt;
&lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"saifulire"&lt;/span&gt; &lt;span class="c"&gt;// ❌ Error: cannot assign string to bool&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Variables in Go are &lt;strong&gt;“loyalenough_haha;)”&lt;/strong&gt; — they stick to their original type.&lt;/p&gt;




&lt;h2&gt;
  
  
  Constants
&lt;/h2&gt;

&lt;p&gt;A constant (&lt;code&gt;const&lt;/code&gt;) holds a value that &lt;strong&gt;never changes&lt;/strong&gt; — like a permanent variable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Pi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3.1416&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Declared using &lt;code&gt;const&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cannot&lt;/strong&gt; be reassigned — doing so triggers a compiler error:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;P&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;
&lt;span class="n"&gt;P&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="c"&gt;// ❌ Error: cannot assign to P&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Constants are great for fixed values like configuration keys, mathematical constants, or version numbers.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;Variables are at the core of Go programming — they link your &lt;strong&gt;logic&lt;/strong&gt; to &lt;strong&gt;memory&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;They occupy &lt;strong&gt;RAM cells&lt;/strong&gt; and store data with a &lt;strong&gt;defined type&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Go offers smart &lt;strong&gt;type inference&lt;/strong&gt; and multiple &lt;strong&gt;declaration styles&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Variable &lt;strong&gt;types are fixed&lt;/strong&gt; after declaration, ensuring &lt;strong&gt;type safety&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;constants&lt;/strong&gt; for unchangeable values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All credit goes to @-&amp;gt; Habib vai.&lt;/p&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>basic</category>
      <category>learning</category>
    </item>
    <item>
      <title>vectors a smart dynamic array</title>
      <dc:creator>Saiful Islam</dc:creator>
      <pubDate>Sun, 28 Sep 2025 04:33:09 +0000</pubDate>
      <link>https://dev.to/saifulire/vectors-a-smart-dynamic-array-215l</link>
      <guid>https://dev.to/saifulire/vectors-a-smart-dynamic-array-215l</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/saifulire/vectors-in-c-the-smart-dynamic-array-5ahe" class="crayons-story__hidden-navigation-link"&gt;Vectors in C++: The Smart Dynamic Array&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/saifulire" class="crayons-avatar  crayons-avatar--l  "&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%2F1233537%2F05f4aded-10e1-49db-a5fe-15ac4303132d.jpg" alt="saifulire profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/saifulire" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Saiful Islam
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Saiful Islam
                
              
              &lt;div id="story-author-preview-content-2873808" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/saifulire" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2F1233537%2F05f4aded-10e1-49db-a5fe-15ac4303132d.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Saiful Islam&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/saifulire/vectors-in-c-the-smart-dynamic-array-5ahe" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 28 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/saifulire/vectors-in-c-the-smart-dynamic-array-5ahe" id="article-link-2873808"&gt;
          Vectors in C++: The Smart Dynamic Array
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/performance"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;performance&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/saifulire/vectors-in-c-the-smart-dynamic-array-5ahe#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




</description>
      <category>programming</category>
      <category>performance</category>
    </item>
    <item>
      <title>Vectors in C++: The Smart Dynamic Array</title>
      <dc:creator>Saiful Islam</dc:creator>
      <pubDate>Sun, 28 Sep 2025 04:20:52 +0000</pubDate>
      <link>https://dev.to/saifulire/vectors-in-c-the-smart-dynamic-array-5ahe</link>
      <guid>https://dev.to/saifulire/vectors-in-c-the-smart-dynamic-array-5ahe</guid>
      <description>&lt;p&gt;When coding in &lt;strong&gt;C++&lt;/strong&gt;, one of the most common data structures you’ll encounter is the &lt;code&gt;vector&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
It behaves like an array but with runtime flexibility — it can grow or shrink dynamically, making it one of the most powerful tools in the Standard Template Library (STL).&lt;/p&gt;

&lt;p&gt;In this guide we’ll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vectors and STL basics&lt;/li&gt;
&lt;li&gt;Initialization methods&lt;/li&gt;
&lt;li&gt;Common functions and operations&lt;/li&gt;
&lt;li&gt;Static vs dynamic allocation&lt;/li&gt;
&lt;li&gt;Array vs vector differences&lt;/li&gt;
&lt;li&gt;How vectors manage memory&lt;/li&gt;
&lt;li&gt;Iterators&lt;/li&gt;
&lt;li&gt;2D vectors&lt;/li&gt;
&lt;li&gt;Performance considerations&lt;/li&gt;
&lt;li&gt;Comparison with other containers&lt;/li&gt;
&lt;li&gt;Automatic memory cleanup&lt;/li&gt;
&lt;/ul&gt;



&lt;ol&gt;
&lt;li&gt;STL and Vectors&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Standard Template Library (STL) provides ready-made containers and algorithms. Some commonly used containers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;vector&lt;/code&gt; → Dynamic array
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;queue&lt;/code&gt; → FIFO
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;stack&lt;/code&gt; → LIFO
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;set&lt;/code&gt; → Unique, ordered elements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Compilation note:&lt;/strong&gt; always use at least C++11:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;g++ &lt;span class="nt"&gt;-std&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;c++11 code.cpp &lt;span class="nt"&gt;-o&lt;/span&gt; runfile &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./runfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you forget &lt;code&gt;-std=c++11&lt;/code&gt;, you may run into compile errors or unexpected runtime issues.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Vector Initialization&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Different ways to initialize &lt;code&gt;std::vector&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;vector&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Direct initialization (C++11)&lt;/span&gt;
    &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="c1"&gt;// Fill constructor (size, initial_value)&lt;/span&gt;
    &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// [0, 0, 0]&lt;/span&gt;

    &lt;span class="c1"&gt;// Empty then push_back&lt;/span&gt;
    &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;v3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;v3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;v3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Printing using range-for loop&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 2 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ol&gt;
&lt;li&gt;Vector Functions &amp;amp; Operations&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Common vector operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Insertion / Removal&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;push_back(x)&lt;/code&gt; → add at end&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pop_back()&lt;/code&gt;  → remove last element&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Access&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;v[i]&lt;/code&gt; → element by index (no bounds check)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;v.at(i)&lt;/code&gt; → bounds-checked access (throws &lt;code&gt;out_of_range&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;front()&lt;/code&gt; / &lt;code&gt;back()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Information&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;size()&lt;/code&gt; → number of elements&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;capacity()&lt;/code&gt; → allocated memory size&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;empty()&lt;/code&gt; → check if empty&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// [10,20,30,40]&lt;/span&gt;
&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop_back&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;     &lt;span class="c1"&gt;// [10,20,30]&lt;/span&gt;

&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;front&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;// 10&lt;/span&gt;
&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;back&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;// 30&lt;/span&gt;
&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// 20&lt;/span&gt;
&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;// 3&lt;/span&gt;
&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// capacity &amp;gt;= 3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ol&gt;
&lt;li&gt;Static vs Dynamic Memory Allocation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Static arrays&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// size fixed at compile-time&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Usually stored on the stack&lt;/li&gt;
&lt;li&gt;Size rigid, cannot grow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dynamic arrays (manual)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Stored on the heap&lt;/li&gt;
&lt;li&gt;Requires manual memory management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vectors&lt;/strong&gt; use dynamic memory under the hood but manage it automatically, making them safer and more flexible than raw dynamic arrays.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Array vs Vector — Key Differences&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Array (Static)&lt;/th&gt;
&lt;th&gt;Vector (Dynamic)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Size&lt;/td&gt;
&lt;td&gt;Fixed at compile-time&lt;/td&gt;
&lt;td&gt;Can grow/shrink at runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory location&lt;/td&gt;
&lt;td&gt;Stack (usually)&lt;/td&gt;
&lt;td&gt;Heap (managed internally)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory management&lt;/td&gt;
&lt;td&gt;Manual (if dynamic)&lt;/td&gt;
&lt;td&gt;Automatic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functions available&lt;/td&gt;
&lt;td&gt;None (raw access only)&lt;/td&gt;
&lt;td&gt;Rich API: &lt;code&gt;push_back&lt;/code&gt;, &lt;code&gt;at&lt;/code&gt;, &lt;code&gt;size&lt;/code&gt;...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Initialization&lt;/td&gt;
&lt;td&gt;Limited forms&lt;/td&gt;
&lt;td&gt;Flexible constructors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safety&lt;/td&gt;
&lt;td&gt;No bounds checking&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;at()&lt;/code&gt; provides bounds-checked access&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;ol&gt;
&lt;li&gt;How Vectors Work in Memory&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;vector&lt;/code&gt; maintains two core concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;size&lt;/strong&gt; → number of stored elements
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;capacity&lt;/strong&gt; → allocated storage space (may be &amp;gt;= size)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When capacity is exceeded, implementations typically &lt;strong&gt;grow the capacity&lt;/strong&gt; (commonly by doubling), which amortizes insertion costs.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Size: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
         &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" Capacity: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Typical output (implementation-dependent):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Size: 1 Capacity: 1
Size: 2 Capacity: 2
Size: 3 Capacity: 4
Size: 5 Capacity: 8
Size: 9 Capacity: 16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use &lt;code&gt;reserve(n)&lt;/code&gt; to pre-allocate memory if you know the expected size — this avoids repeated reallocations.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Iterators&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Iterators behave like pointers and are used to traverse containers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Forward&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Reverse&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rbegin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rend&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10 20 30 40
40 30 20 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Iterators are the common way to use STL algorithms like &lt;code&gt;std::sort&lt;/code&gt;, &lt;code&gt;std::find&lt;/code&gt;, etc.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;2D Vectors&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nested vectors are useful for matrices, graphs, and dynamic 2D storage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 5 0
0 0 0
0 0 7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ol&gt;
&lt;li&gt;Performance Tips&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;size()&lt;/code&gt; is O(1). Use it freely.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;capacity()&lt;/code&gt; shows reserved memory; use &lt;code&gt;reserve(n)&lt;/code&gt; when you know the expected size.&lt;/li&gt;
&lt;li&gt;Avoid excessive copying — prefer &lt;code&gt;emplace_back()&lt;/code&gt; to construct in-place.&lt;/li&gt;
&lt;li&gt;Random access is O(1); inserting/removing at the middle is O(n).&lt;/li&gt;
&lt;li&gt;For frequent front insertions, consider &lt;code&gt;deque&lt;/code&gt;; for frequent middle insert/delete, consider &lt;code&gt;list&lt;/code&gt; (but lists have poor cache locality).&lt;/li&gt;
&lt;/ul&gt;




&lt;ol&gt;
&lt;li&gt;Vector vs Other Containers&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vector&lt;/strong&gt; → best for random access, fast end insertions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deque&lt;/strong&gt; → fast insertions at both ends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;List&lt;/strong&gt; → fast middle insertions/deletions (no random access).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set&lt;/strong&gt; → unique, ordered elements (logarithmic operations).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Default choice:&lt;/strong&gt; &lt;code&gt;vector&lt;/code&gt; unless you have a specific reason to choose another container.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Automatic Memory Cleanup&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vectors free their managed memory automatically when they go out of scope:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// memory is released when the function returns&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  ✅ Conclusion
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;std::vector&lt;/code&gt; is array-like but flexible, safe (with &lt;code&gt;at()&lt;/code&gt;), and efficient for most general-purpose needs. Prefer vectors over raw arrays unless you need a fixed-size, stack-allocated buffer or have very specific performance constraints.&lt;/p&gt;




</description>
      <category>programming</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
