<?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: avery</title>
    <description>The latest articles on DEV Community by avery (@avery_).</description>
    <link>https://dev.to/avery_</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3509744%2F169aa902-c18b-4ab2-ac89-61f80ba99fb8.jpg</url>
      <title>DEV Community: avery</title>
      <link>https://dev.to/avery_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/avery_"/>
    <language>en</language>
    <item>
      <title>29. Authentication and Security – Handling Credentials &amp; Designing a Secure Login</title>
      <dc:creator>avery</dc:creator>
      <pubDate>Fri, 03 Jul 2026 16:36:11 +0000</pubDate>
      <link>https://dev.to/avery_/29-authentication-and-security-handling-credentials-designing-a-secure-login-4a0e</link>
      <guid>https://dev.to/avery_/29-authentication-and-security-handling-credentials-designing-a-secure-login-4a0e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;BootCamp by Dr.Angela&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;1. Introduction to Authentication&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why Authenticate? : Authentication verifies a user's identity and restricts access to protected resources

&lt;ul&gt;
&lt;li&gt;Typical authentication flow : Create Account → Log In → Access Protected Resources&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Common Authentication Methods : Email &amp;amp; Password, OAuth (Google, GitHub, Facebook, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Level 1 – Registering Users with Email and Password&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic authentication process : User registers with an email and password -&amp;gt; Credentials are stored securely in the database -&amp;gt; User logs in using the same credentials -&amp;gt; The server verifies the information before granting access&lt;/li&gt;
&lt;li&gt;Never store passwords as plain text.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Level 2 – Encryption vs Hashing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Encryption

&lt;ul&gt;
&lt;li&gt;Encryption converts readable data into ciphertext using a key
Plaintext + Key
↓
Encryption
↓
Ciphertext&lt;/li&gt;
&lt;li&gt;Decryption restores the original data using the same (or a corresponding) key&lt;/li&gt;
&lt;li&gt;Caesar Cipher : &lt;a href="https://cryptii.com/pipes/caesar-cipher/" rel="noopener noreferrer"&gt;https://cryptii.com/pipes/caesar-cipher/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hashing : Hashing converts data into a fixed-length value using a one-way hash function
Password
↓
Hash Function
↓
Hashed Password

&lt;ul&gt;
&lt;li&gt;One-way transformation, Cannot be reversed, Used to store passwords securely&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. How Passwords Are Cracked&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hash Tables : Attackers can compare stored hashes against precomputed hash tables (or rainbow tables) to guess passwords, To reduce this risk, modern applications use salting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Level 3 – Salting Passwords with bcrypt&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is Salting? : A random value (salt) is added before hashing
Password + Salt
    ↓
Hash Function
    ↓
Hashed Password

&lt;ul&gt;
&lt;li&gt;Benefits : Prevents identical passwords from producing identical hashes, Makes rainbow table attacks impractical&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Salt Rounds : Higher salt rounds increase security, Higher values also require more processing time.&lt;/li&gt;
&lt;li&gt;bcrypt : &lt;a href="https://www.npmjs.com/package/bcrypt" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/bcrypt&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Hash a password :
import bcrypt from "bcrypt";
bcrypt.hash(password, saltRounds, (err, hash) =&amp;gt; {});&lt;/li&gt;
&lt;li&gt;Compare passwords :
bcrypt.compare(loginPassword, storedHash, (err, result) =&amp;gt; {});&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6. Managing Cookies and Sessions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sessions : A session stores user login information on the server, ex)
import session from "express-session";&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;app.use(&lt;br&gt;
  session({&lt;br&gt;
    secret: "TOPSECRETWORD",&lt;br&gt;
    resave: false,&lt;br&gt;
    saveUninitialized: true,&lt;br&gt;
  })&lt;br&gt;
);&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Passport.js : Passport is an authentication middleware for Express

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.passportjs.org/" rel="noopener noreferrer"&gt;https://www.passportjs.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Initialization :
import passport from "passport";&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;app.use(passport.initialize());&lt;br&gt;
app.use(passport.session());&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Middleware order matters.

&lt;ul&gt;
&lt;li&gt;passport-local : Used for username/password authentication, ex)
import { Strategy } from "passport-local";&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;passport.use(&lt;br&gt;
  new Strategy(async function verify(username, password, cb) {})&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;passport.serializeUser((user, cb) =&amp;gt; {&lt;br&gt;
  cb(null, user);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;passport.deserializeUser((user, cb) =&amp;gt; {&lt;br&gt;
  cb(null, user);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Level 5 – Environment Variables&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why Use Environment Variables? : Never store sensitive information inside your repository

&lt;ul&gt;
&lt;li&gt;Examples : API Keys, Session Secrets, Database Passwords, OAuth Client Secrets&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;dotenv : &lt;a href="https://www.npmjs.com/package/dotenv" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/dotenv&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;ex)
import env from "dotenv";&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;env.config();&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using environment variables :
app.use(
session({
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: true,
})
);

&lt;ul&gt;
&lt;li&gt;.gitignore : Common files to ignore&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Examples : .env, .DS_Store, .Trashes, *.exe, *.zip, API Keys, Secrets, Log files, ...&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/github/gitignore/blob/main/Node.gitignore" rel="noopener noreferrer"&gt;https://github.com/github/gitignore/blob/main/Node.gitignore&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;8. Setting Up Google OAuth Credentials&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Cloud Console : &lt;a href="https://console.cloud.google.com/" rel="noopener noreferrer"&gt;https://console.cloud.google.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Required credentials : Client ID, Client Secret&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;9. Level 6 – OAuth: Sign in with Google&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OAuth (Open Authorization) : OAuth allows users to log in without sharing their passwords with third-party applications&lt;/li&gt;
&lt;li&gt;Why OAuth? : Delegated authentication, Granular permission control, Read-only or read/write access, Users can revoke access at any time&lt;/li&gt;
&lt;li&gt;OAuth Flow : 
Set Up Application
    ↓
Redirect User to Google
    ↓
User Logs In
    ↓
User Grants Permission
    ↓
Authorization Code
    ↓
Access Token
    ↓
Access Protected Resources&lt;/li&gt;
&lt;li&gt;Authorization Code vs Access Token

&lt;ul&gt;
&lt;li&gt;Authorization Code : One-time code used to obtain a token&lt;/li&gt;
&lt;li&gt;Access Token : Temporary credential used to access APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Google OAuth : ex)
import GoogleStrategy from "passport-google-oauth2";&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;app.get(&lt;br&gt;
  "/auth/google",&lt;br&gt;
  passport.authenticate("google", {&lt;br&gt;
    scope: ["profile", "email"],&lt;br&gt;
  })&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;app.get(&lt;br&gt;
  "/auth/google/secrets",&lt;br&gt;
  passport.authenticate("google", {&lt;br&gt;
    successRedirect: "/secrets",&lt;br&gt;
    failureRedirect: "/login",&lt;br&gt;
  })&lt;br&gt;
);&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure the strategy :
passport.use(
"google",
new GoogleStrategy(
{
  clientID: process.env.GOOGLE_CLIENT_ID,
  clientSecret: process.env.GOOGLE_CLIENT_SECRET,
  callbackURL: "&lt;a href="http://localhost:3000/auth/google/secrets" rel="noopener noreferrer"&gt;http://localhost:3000/auth/google/secrets&lt;/a&gt;",
  userProfileURL: "&lt;a href="https://www.googleapis.com/oauth2/v3/userinfo" rel="noopener noreferrer"&gt;https://www.googleapis.com/oauth2/v3/userinfo&lt;/a&gt;",
},
async (accessToken, refreshToken, profile, cb) =&amp;gt; {
  // Find or create user
}
)
);&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>fullstack</category>
    </item>
    <item>
      <title>28. PostgreSQL</title>
      <dc:creator>avery</dc:creator>
      <pubDate>Wed, 01 Jul 2026 22:22:17 +0000</pubDate>
      <link>https://dev.to/avery_/28-postgresql-3ncp</link>
      <guid>https://dev.to/avery_/28-postgresql-3ncp</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;BootCamp by Dr.Angela&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;1. Introduction to PostgreSQL&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Powerful, open-source relational database system widely used in the industry&lt;/li&gt;
&lt;li&gt;It offers strong community support, scalability, and excellent career opportunities&lt;/li&gt;
&lt;li&gt;Typical web application architecture : Client &amp;lt;-&amp;gt; Server &amp;lt;-&amp;gt; Application &amp;lt;-&amp;gt; Database&lt;/li&gt;
&lt;li&gt;Node.js + Postgres

&lt;ul&gt;
&lt;li&gt;pg is the official PostgreSQL client for Node.js&lt;/li&gt;
&lt;li&gt;PostgreSQL runs as a separate database server&lt;/li&gt;
&lt;li&gt;Tools like pgAdmin provide a GUI for database management&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Tables, Keys, and PostgreSQL Data Types&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Table Structure : Columns (fields), Rows (records)&lt;/li&gt;
&lt;li&gt;Creating a Table :
CREATE TABLE  (
 ,
 ,
 
);

&lt;ul&gt;
&lt;li&gt;ex)
CREATE TABLE friends (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
age INT,
is_cool BOOLEAN
);&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PostgreSQL Data Types

&lt;ul&gt;
&lt;li&gt;SERIAL : Auto-incrementing integer&lt;/li&gt;
&lt;li&gt;VARCHAR(n) : Limited-length text&lt;/li&gt;
&lt;li&gt;TEXT : Unlimited text (including emojis)&lt;/li&gt;
&lt;li&gt;INT : Integer values&lt;/li&gt;
&lt;li&gt;BOOLEAN : True / False&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Reference : &lt;a href="https://www.postgresql.org/docs/current/datatype.html" rel="noopener noreferrer"&gt;https://www.postgresql.org/docs/current/datatype.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Creating Tables with pgAdmin&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pgAdmin allows visual database management&lt;/li&gt;
&lt;li&gt;CSV files can be imported into tables&lt;/li&gt;
&lt;li&gt;Ensure the CSV includes headers for proper mapping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Reading Data from PostgreSQL&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic SELECT Query : SELECT * FROM ;&lt;/li&gt;
&lt;li&gt;Node.js (pg Module) : ex) 
import pg from "pg";&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;const db = new pg.Client({&lt;br&gt;
  user: "postgres",&lt;br&gt;
  host: "localhost",&lt;br&gt;
  database: "world",&lt;br&gt;
  password: "123456",&lt;br&gt;
  port: 5432,&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;db.connect();&lt;/p&gt;

&lt;p&gt;db.query("SELECT * FROM capitals", (err, res) =&amp;gt; {&lt;br&gt;
  if (err) {&lt;br&gt;
    console.error("Error executing query", err.stack);&lt;br&gt;
  } else {&lt;br&gt;
    console.log(res.rows);&lt;br&gt;
  }&lt;br&gt;
  db.end();&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. SELECT, WHERE, and LIKE&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SELECT Variations : 

&lt;ul&gt;
&lt;li&gt;SELECT * FROM table;&lt;/li&gt;
&lt;li&gt;SELECT column FROM table;&lt;/li&gt;
&lt;li&gt;SELECT column1, column2 FROM table;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WHERE Clause : 
SELECT column FROM table
WHERE condition;

&lt;ul&gt;
&lt;li&gt;Operators : =, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LIKE Operator : Used for pattern matching

&lt;ul&gt;
&lt;li&gt;ex)
SELECT country
FROM world_food
WHERE country LIKE 'U%';&lt;/li&gt;
&lt;li&gt;% : wildcard (matches any sequence of characters)&lt;/li&gt;
&lt;li&gt;_ : single character wildcard&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6. Constraints : UNIQUE and NOT NULL&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NOT NULL : Prevents empty values, Requires a value for the column&lt;/li&gt;
&lt;li&gt;UNIQUE : Ensures all values in a column are distinct, Prevents duplicates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;7. INSERT Data&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQL Insert Syntax : 
INSERT INTO table_name (column1, column2)
VALUES (value1, value2);&lt;/li&gt;
&lt;li&gt;Node.js Example : 
db.query(
"INSERT INTO world_food (country, rice_production, wheat_production) VALUES ($1, $2, $3)",
["Italy", 1.46, 7.3]
);

&lt;ul&gt;
&lt;li&gt;$1, $2, $3 : parameterized queries (prevents SQL injection)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;8. Advanced LIKE Queries&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ex)
SELECT country_code
FROM countries
WHERE LOWER(country_name) LIKE '%' || $1 || '%';

&lt;ul&gt;
&lt;li&gt;LOWER() : makes search case-insensitive&lt;/li&gt;
&lt;li&gt;|| : string concatenation in SQL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;9. One-to-One Relationships &amp;amp; INNER JOIN&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One-to-One Relationship : ex)
CREATE TABLE student (
id SERIAL PRIMARY KEY,
first_name TEXT,
last_name TEXT
);&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CREATE TABLE contact_detail (&lt;br&gt;
  id INTEGER REFERENCES student(id) UNIQUE,&lt;br&gt;
  tel TEXT,&lt;br&gt;
  address TEXT&lt;br&gt;
);&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Join : ex)
SELECT *
FROM student
JOIN contact_detail
ON student.id = contact_detail.id;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;10. One-to-Many Relationships&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ex)
CREATE TABLE homework_submission (
id SERIAL PRIMARY KEY,
mark INTEGER,
student_id INTEGER REFERENCES student(id)
);&lt;/li&gt;
&lt;li&gt;Join Query : ex)
SELECT *
FROM student
JOIN homework_submission
ON student.id = student_id;

&lt;ul&gt;
&lt;li&gt;Selecting Specific Columns : ex)
SELECT student.id, first_name, last_name, mark
FROM student
JOIN homework_submission
ON student.id = student_id;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;11. Many-to-Many Relationships &amp;amp; Aliases&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Junction Table : ex) 
CREATE TABLE class (
id SERIAL PRIMARY KEY,
title VARCHAR(45)
);&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CREATE TABLE enrollment (&lt;br&gt;
  student_id INTEGER REFERENCES student(id),&lt;br&gt;
  class_id INTEGER REFERENCES class(id),&lt;br&gt;
  PRIMARY KEY (student_id, class_id)&lt;br&gt;
);&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Many-to-Many Join : ex)
SELECT *
FROM enrollment
JOIN student ON student.id = enrollment.student_id
JOIN class ON class.id = enrollment.class_id;&lt;/li&gt;
&lt;li&gt;Using Aliases : ex)
SELECT s.id AS stud, first_name, last_name, title
FROM enrollment e
JOIN student s ON s.id = e.student_id
JOIN class c ON c.id = e.class_id;

&lt;ul&gt;
&lt;li&gt;AS : renames tables or columns for readability, Can be omitted for cleaner syntax&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;12. Updating and Deleting Data &amp;amp; Tables&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ALTER TABLE : ex)

&lt;ul&gt;
&lt;li&gt;ALTER TABLE student RENAME TO user;&lt;/li&gt;
&lt;li&gt;ALTER TABLE user ALTER COLUMN first_name TYPE VARCHAR(20);&lt;/li&gt;
&lt;li&gt;ALTER TABLE contact_detail ADD email TEXT;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;UNIQUE Constraint : ex)
ALTER TABLE visited_countries
ADD UNIQUE(user_id, country_code);&lt;/li&gt;
&lt;li&gt;DROP TABLE : DROP TABLE IF EXISTS table_name;&lt;/li&gt;
&lt;li&gt;UPDATE Data : 
UPDATE table_name
SET column = value
WHERE condition;&lt;/li&gt;
&lt;li&gt;ORDER BY : 
SELECT *
FROM users
ORDER BY id ASC;&lt;/li&gt;
&lt;li&gt;DELETE Data : 
DELETE FROM table_name
WHERE condition;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;13. Permalist Project&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Possible Enhancements : Sort tasks by creation date, Support multiple lists, Family/shared todo lists, Extend CRUD functionality, Improve UI/UX integration with database&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>fullstack</category>
      <category>beginners</category>
    </item>
    <item>
      <title>27. SQL</title>
      <dc:creator>avery</dc:creator>
      <pubDate>Wed, 17 Jun 2026 15:59:03 +0000</pubDate>
      <link>https://dev.to/avery_/27-sql-4ha6</link>
      <guid>https://dev.to/avery_/27-sql-4ha6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;BootCamp by Dr.Angela&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;1. SQL Commands: CREATE TABLE and INSERT Data&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CRUD Operations : Create(INSERT), Read(SELECT), Update(UPDATE), Delete/Destroy(DELETE)&lt;/li&gt;
&lt;li&gt;Useful Resources

&lt;ul&gt;
&lt;li&gt;SQL Tutorial: &lt;a href="https://www.w3schools.com/sql/" rel="noopener noreferrer"&gt;https://www.w3schools.com/sql/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SQL Data Types: &lt;a href="https://www.w3schools.com/sql/sql_datatypes.asp" rel="noopener noreferrer"&gt;https://www.w3schools.com/sql/sql_datatypes.asp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SQL Primary Key: &lt;a href="https://www.w3schools.com/sql/sql_primarykey.asp" rel="noopener noreferrer"&gt;https://www.w3schools.com/sql/sql_primarykey.asp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Online SQL Playground: &lt;a href="https://sqliteonline.com/" rel="noopener noreferrer"&gt;https://sqliteonline.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Creating a Table : ex)
CREATE TABLE products (
id INT NOT NULL,
name STRING,
price MONEY,
PRIMARY KEY (id)
);&lt;/li&gt;
&lt;li&gt;Primary Key : uniquely identifies each row in a table

&lt;ul&gt;
&lt;li&gt;ex)
id INT NOT NULL,
PRIMARY KEY (id)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Inserting Data : Insert values into all columns

&lt;ul&gt;
&lt;li&gt;ex)
INSERT INTO products
VALUES (1, 'Pen', 1.20);&lt;/li&gt;
&lt;li&gt;Insert values into specific columns : ex)
INSERT INTO products (id, name)
VALUES (2, 'Pencil');&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. SQL Commands: READ, SELECT, and WHERE&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reading Data 

&lt;ul&gt;
&lt;li&gt;Retrieve all columns from a table, ex)
SELECT *
FROM products;&lt;/li&gt;
&lt;li&gt;Retrieve specific data using a condition, ex)
SELECT *
FROM products
WHERE id = 1;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WHERE Clause : Used to filter records based on specific conditions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Updating Values and Modifying Tables&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updating Existing Data

&lt;ul&gt;
&lt;li&gt;ex)
UPDATE products
SET price = 1.00
WHERE id = 1;&lt;/li&gt;
&lt;li&gt;SET : specifies the new value.&lt;/li&gt;
&lt;li&gt;WHERE : determines which row(s) will be updated.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Adding a New Column

&lt;ul&gt;
&lt;li&gt;ex)
ALTER TABLE products
ADD stock INT;&lt;/li&gt;
&lt;li&gt;ALTER TABLE : modifies an existing table structure.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. SQL Commands: DELETE&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deleting Data

&lt;ul&gt;
&lt;li&gt;ex)
DELETE FROM products
WHERE id = 2;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Removes rows that match the condition.&lt;/li&gt;
&lt;li&gt;Always use a WHERE clause unless you intend to delete all records.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Understanding SQL Relationships, Foreign Keys, and INNER JOINs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Foreign Keys : Creates a relationship between two tables, Helps maintain data integrity

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/sql/sql_foreignkey.asp" rel="noopener noreferrer"&gt;https://www.w3schools.com/sql/sql_foreignkey.asp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;INNER JOIN : Used to combine related data from multiple tables.

&lt;ul&gt;
&lt;li&gt;ex)
SELECT
orders.order_number,
customers.first_name,
customers.last_name,
customers.address
FROM orders
INNER JOIN customers
ON orders.customer_id = customers.id;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;How INNER JOIN Works : Only matching records from both tables are returned.

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/sql/sql_join_inner.asp" rel="noopener noreferrer"&gt;https://www.w3schools.com/sql/sql_join_inner.asp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>fullstack</category>
    </item>
    <item>
      <title>26. Databases</title>
      <dc:creator>avery</dc:creator>
      <pubDate>Wed, 17 Jun 2026 11:43:57 +0000</pubDate>
      <link>https://dev.to/avery_/26-databases-c25</link>
      <guid>https://dev.to/avery_/26-databases-c25</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;BootCamp by Dr.Angela&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;1. Databases Explained: SQL vs NoSQL&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why Do We Need Databases?

&lt;ul&gt;
&lt;li&gt;Databases provide persistent data storage.&lt;/li&gt;
&lt;li&gt;Unlike variables in memory, data stored in a database remains available even after the application stops running.&lt;/li&gt;
&lt;li&gt;Databases allow applications to store, retrieve, update, and manage large amounts of information efficiently.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Types of Databases

&lt;ul&gt;
&lt;li&gt;SQL(Structured Query Language) Databases : typically relational databases, where data is organized into tables with predefined schemas.&lt;/li&gt;
&lt;li&gt;Structured data, Fixed schema, Relationships between tables, Strong consistency, Uses SQL for querying&lt;/li&gt;
&lt;li&gt;ex) PostgreSQL, MySQL, Oracle Database, SQLite, ...&lt;/li&gt;
&lt;li&gt;NoSQL Databases : designed for flexibility and scalability.&lt;/li&gt;
&lt;li&gt;Flexible schema, Horizontal scalability, Suitable for large-scale or rapidly changing data, Multiple data models (document, key-value, graph, etc.)&lt;/li&gt;
&lt;li&gt;ex) MongoDB, Redis, Amazon DynamoDB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>fullstack</category>
      <category>beginners</category>
    </item>
    <item>
      <title>25. Build Your Own API</title>
      <dc:creator>avery</dc:creator>
      <pubDate>Tue, 16 Jun 2026 21:33:02 +0000</pubDate>
      <link>https://dev.to/avery_/24-build-your-own-api-3b0n</link>
      <guid>https://dev.to/avery_/24-build-your-own-api-3b0n</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;BootCamp by Dr.Angela&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;1. Building Your Own APIs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can build your own APIs using frameworks like Node.js + Express.&lt;/li&gt;
&lt;li&gt;API Platforms

&lt;ul&gt;
&lt;li&gt;RapidAPI : Marketplace for testing and using public APIs&lt;/li&gt;
&lt;li&gt;APIs can be:&lt;/li&gt;
&lt;li&gt;Monetized APIs : Data collection services, Algorithm / service-based APIs, Simplified interface for complex systems&lt;/li&gt;
&lt;li&gt;Internal APIs (Private APIs) : Used only within a company or application&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;What Makes an API RESTful?

&lt;ul&gt;
&lt;li&gt;A RESTful API follows these principles:&lt;/li&gt;
&lt;li&gt;Uses HTTP methods (GET, POST, PUT, PATCH, DELETE)&lt;/li&gt;
&lt;li&gt;Returns data in JSON format&lt;/li&gt;
&lt;li&gt;Follows Client–Server architecture&lt;/li&gt;
&lt;li&gt;Is stateless (each request is independent)&lt;/li&gt;
&lt;li&gt;Is resource-based (everything is treated as a resource)&lt;/li&gt;
&lt;li&gt;Operates over the web (HTTP/HTTPS)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Creating GET, POST, PATCH, and DELETE Routes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Express Routes Overview : In Express, routes define how the server responds to client requests.&lt;/li&gt;
&lt;li&gt;Route Parameters(:) : Used to capture dynamic values from the URL.

&lt;ul&gt;
&lt;li&gt;ex)
app.get("/users/:id", (req, res) =&amp;gt; {
console.log(req.params.id);
});&lt;/li&gt;
&lt;li&gt;:id → dynamic parameter&lt;/li&gt;
&lt;li&gt;Accessed via req.params&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Callback Functions in Array Methods : Commonly used when working with data in APIs(find, filter, findIndex, ...)

&lt;ul&gt;
&lt;li&gt;ex) const user = users.find(user =&amp;gt; user.id === 1);&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PUT vs PATCH

&lt;ul&gt;
&lt;li&gt;PUT : Replace entire resource, Update full object&lt;/li&gt;
&lt;li&gt;PATCH : Modify part of resource, Partial update&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DELETE Operation : Used to remove data from a collection.

&lt;ul&gt;
&lt;li&gt;ex) users.splice(index, 1);&lt;/li&gt;
&lt;li&gt;splice() : removes elements from an array , Commonly used for delete logic in in-memory data&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>fullstack</category>
    </item>
    <item>
      <title>24. Application Programming Interfaces (APIs)</title>
      <dc:creator>avery</dc:creator>
      <pubDate>Mon, 15 Jun 2026 19:04:16 +0000</pubDate>
      <link>https://dev.to/avery_/24-application-programming-interfaces-apis-595e</link>
      <guid>https://dev.to/avery_/24-application-programming-interfaces-apis-595e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;BootCamp by Dr.Angela&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;1. Introduction to APIs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is an API?

&lt;ul&gt;
&lt;li&gt;API (Application Programming Interface) acts as a bridge that allows different software applications to communicate with each other.&lt;/li&gt;
&lt;li&gt;APIs enable programs to exchange data and functionality without exposing internal implementation details.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;REST APIs

&lt;ul&gt;
&lt;li&gt;REST (Representational State Transfer) is a common architectural style for web APIs.&lt;/li&gt;
&lt;li&gt;REST APIs typically use the HTTP protocol.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Common HTTP Methods : GET(Retrieve data), POST(Create data), PUT(Replace data), PATCH(Partially update data), DELETE(Remove data)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Structuring API Requests&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API Types

&lt;ul&gt;
&lt;li&gt;Private API : Frontend ↔ Your Server, Used internally within your application&lt;/li&gt;
&lt;li&gt;Public API : Your Server ↔ External Server, Provided by third-party services&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;API Documentation : API documentation explains available endpoints, parameters, authentication methods, and response formats.

&lt;ul&gt;
&lt;li&gt;ex) &lt;a href="https://bored-api.appbrewery.com/" rel="noopener noreferrer"&gt;https://bored-api.appbrewery.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;API Endpoints : An endpoint is a specific URL that provides access to a resource.

&lt;ul&gt;
&lt;li&gt;Base URL + Endpoint&lt;/li&gt;
&lt;li&gt;ex) /random, /filter&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Query Parameters : Used to filter, sort, or customize responses.

&lt;ul&gt;
&lt;li&gt;ex) &lt;a href="https://bored-api.appbrewery.com/endpoint?query=value&amp;amp;query2=value" rel="noopener noreferrer"&gt;https://bored-api.appbrewery.com/endpoint?query=value&amp;amp;query2=value&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Format : ?key=value&amp;amp;key2=value2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Path Parameters : Used to identify a specific resource.

&lt;ul&gt;
&lt;li&gt;ex) &lt;a href="https://bored-api.appbrewery.com/endpoint/%7Bid%7D" rel="noopener noreferrer"&gt;https://bored-api.appbrewery.com/endpoint/{id}&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. What is JSON?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON (JavaScript Object Notation) : Lightweight format for storing and exchanging data, Human-readable and language-independent&lt;/li&gt;
&lt;li&gt;JSON vs JavaScript Objects

&lt;ul&gt;
&lt;li&gt;JSON : Stored as text (string)
{
"name": "John",
"age": 25
}&lt;/li&gt;
&lt;li&gt;JavaScript Object : Actual JavaScript object
{
name: "John",
age: 25
}&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;JSON Tools

&lt;ul&gt;
&lt;li&gt;JSON Visualizer : &lt;a href="https://jsonviewer.stack.hu/" rel="noopener noreferrer"&gt;https://jsonviewer.stack.hu/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Convert JSON to JavaScript Object : const data = JSON.parse(jsonData);&lt;/li&gt;
&lt;li&gt;Convert JavaScript Object to JSON : const jsonData = JSON.stringify(data);&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Making Server-Side API Requests with Axios&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Axios : Popular HTTP client for JavaScript and Node.js, Simpler syntax than the native https module&lt;/li&gt;
&lt;li&gt;Async/Await : Used to handle asynchronous API requests more cleanly.

&lt;ul&gt;
&lt;li&gt;ex) const response = await axios.get(url);&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Basic GET Request : 
`import axios from "axios";&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;const response = await axios.get(url);&lt;br&gt;
console.log(response.data);`&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. API Authentication&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why Authentication? : Authentication helps control access to APIs and protects resources from unauthorized use.&lt;/li&gt;
&lt;li&gt;Common Authentication Methods

&lt;ul&gt;
&lt;li&gt;No Authentication : Public access, Usually rate-limited&lt;/li&gt;
&lt;li&gt;Basic Authentication : Username + Password, Credentials are encoded using Base64, Typically sent in HTTP headers&lt;/li&gt;
&lt;li&gt;API Key Authentication : API Key → API, Unique key issued by the API provider, Often included in headers or query parameters&lt;/li&gt;
&lt;li&gt;Token-Based Authentication : Username/Password → Token → API, User logs in once, Server returns a token, Future requests use the token&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OAuth : Delegated authorization protocol , Allows users to grant limited access without sharing passwords

&lt;ul&gt;
&lt;li&gt;Commonly used with : Google, GitHub, Facebook&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6. REST APIs in Practice&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Making API Requests : GET(Read data), POST(Create data), PUT(Replace data), PATCH(Update part of a resource), DELETE(Remove data)&lt;/li&gt;
&lt;li&gt;CRUD Operations(Operation : HTTP Method)

&lt;ul&gt;
&lt;li&gt;Create : POST&lt;/li&gt;
&lt;li&gt;Read : GET&lt;/li&gt;
&lt;li&gt;Update : PUT / PATCH&lt;/li&gt;
&lt;li&gt;Delete : ELETE&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Axios Examples : &lt;a href="https://axios.rest/pages/getting-started/examples/commonjs.html" rel="noopener noreferrer"&gt;https://axios.rest/pages/getting-started/examples/commonjs.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Axios simplifies server-side API requests.&lt;br&gt;
Authentication methods include Basic Auth, API Keys, Tokens, and OAuth.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>fullstack</category>
      <category>beginners</category>
    </item>
    <item>
      <title>23. Git, GitHub, and Version Control</title>
      <dc:creator>avery</dc:creator>
      <pubDate>Sun, 14 Jun 2026 00:59:01 +0000</pubDate>
      <link>https://dev.to/avery_/23-git-github-and-version-control-okd</link>
      <guid>https://dev.to/avery_/23-git-github-and-version-control-okd</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;BootCamp by Dr.Angela&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;1. Introduction to Version Control and Git&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Version Control: Tracks changes to files and allows you to roll back to previous versions when needed.&lt;/li&gt;
&lt;li&gt;Git: A distributed version control system widely used for software development.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Version Control Using Git and the Command Line&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Git Workflow
Working Directory
  |
git add
  ↓
Staging Area
  |
git commit
  ↓
Local Repository
  |
git checkout
  ↓
Working Directory&lt;/li&gt;
&lt;li&gt;Common Commands

&lt;ul&gt;
&lt;li&gt;git status : Check the current repository status&lt;/li&gt;
&lt;li&gt;git add  : Add a file to the staging area&lt;/li&gt;
&lt;li&gt;git add . : Add all modified files&lt;/li&gt;
&lt;li&gt;git commit -m "message" : Save changes to the local repository&lt;/li&gt;
&lt;li&gt;git diff  : Compare changes in the working directory with the last committed version&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. GitHub and Remote Repositories&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developer Journey : Learn to Code → Attend Events → Participate in Hackathons → Volunteer → Freelance → Apply for Developer Jobs → Internship → Contribute to Open Source → Build and Share Your Own Projects&lt;/li&gt;
&lt;li&gt;Connecting to a Remote Repository : git remote add  &lt;/li&gt;
&lt;li&gt;Pushing Changes : git push -u  &lt;/li&gt;
&lt;li&gt;Repository Structure
Working Directory
  ↓
Staging Area
  ↓
Local Repository
  ↓
Remote Repository (GitHub)&lt;/li&gt;
&lt;li&gt;Useful GitHub Feature

&lt;ul&gt;
&lt;li&gt;Insights → Network: Visualize branch and commit history&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Main Branch : The primary branch of a repository (commonly main)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. .gitignore&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Common Files to Ignore

&lt;ul&gt;
&lt;li&gt;macOS : .DS_Store, .DS_Store?, .Trashes, ._*, .Spotlight-V100&lt;/li&gt;
&lt;li&gt;Windows: Thumbs.db, ehthumbs.db&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Creating a .gitignore File : touch .gitignore

&lt;ul&gt;
&lt;li&gt;Add files or directories that should not be tracked by Git.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Refresh Git Tracking : git rm --cached -r .

&lt;ul&gt;
&lt;li&gt;Removes all files from Git tracking&lt;/li&gt;
&lt;li&gt;Keeps local files intact&lt;/li&gt;
&lt;li&gt;Commonly used after updating .gitignore&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Cloning Repositories&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why Clone? : Build on existing code, Improve your own version, Read other people's code, Contribute to open-source projects&lt;/li&gt;
&lt;li&gt;Clone a Repository : git clone &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6. Branching and Merging&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why Use Branches? : Branches allow feature development without affecting the main codebase.&lt;/li&gt;
&lt;li&gt;Common Commands

&lt;ul&gt;
&lt;li&gt;git branch  : Create a new branch&lt;/li&gt;
&lt;li&gt;git checkout  : Switch to another branch&lt;/li&gt;
&lt;li&gt;git merge  : Merge a branch into the current branch&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Practice Tool : &lt;a href="https://learngitbranching.js.org/" rel="noopener noreferrer"&gt;https://learngitbranching.js.org/&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Additional Git Commands&lt;/li&gt;
&lt;li&gt;git branch -f main  : Force the main branch pointer to another commit&lt;/li&gt;
&lt;li&gt;git revert : Create a new commit that undoes changes (safe for shared repositories)&lt;/li&gt;
&lt;li&gt;git reset : Move the branch pointer (typically used locally)&lt;/li&gt;
&lt;li&gt;git rebase : Reapply commits on top of another branch&lt;/li&gt;
&lt;li&gt;git cherry-pick   ... : Apply specific commits&lt;/li&gt;
&lt;li&gt;git tag  : Create a tag&lt;/li&gt;
&lt;li&gt;git describe : Show the nearest tag and commit information

&lt;ul&gt;
&lt;li&gt;Format : --g&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;git fetch : Download remote changes without merging&lt;/li&gt;
&lt;li&gt;git pull : git fetch + git merge&lt;/li&gt;
&lt;li&gt;git push : Upload local commits to a remote repository&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;7. Forking and Pull Requests&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open Source Contribution Workflow&lt;/li&gt;
&lt;li&gt;Forking : Create your own copy of another repository on GitHub&lt;/li&gt;
&lt;li&gt;Pull Requests (PRs) : Suggest changes to the original repository, Allow maintainers to review, discuss, and merge contributions&lt;/li&gt;
&lt;li&gt;Typical Contribution Flow : Fork → Clone → Create Branch → Commit Changes → Push → Open Pull Request&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>fullstack</category>
    </item>
    <item>
      <title>22. EJS (Embedded JavaScript)</title>
      <dc:creator>avery</dc:creator>
      <pubDate>Thu, 30 Apr 2026 15:36:23 +0000</pubDate>
      <link>https://dev.to/avery_/22-ejs-embedded-javascript-2b3g</link>
      <guid>https://dev.to/avery_/22-ejs-embedded-javascript-2b3g</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;BootCamp by Dr.Angela&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;1. What is EJS?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EJS (Embedded JavaScript) is a templating engine for Node.js&lt;/li&gt;
&lt;li&gt;Key Concepts

&lt;ul&gt;
&lt;li&gt;Templating : Allows you to generate dynamic HTML using JavaScript&lt;/li&gt;
&lt;li&gt;Separation of Concerns : Frontend(HTML, CSS), Backend(JavaScript)&lt;/li&gt;
&lt;li&gt;Other Templating Languages : Python(Jinja), PHP(Twig), JavaScript(EJS)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;How EJS Works : ex)
&lt;code&gt;&amp;lt;% for (let i = 0; i &amp;lt; items.length; i++) { %&amp;gt;&lt;br&gt;
&amp;lt;li&amp;gt;&amp;lt;%= items[i] %&amp;gt;&amp;lt;/li&amp;gt;&lt;br&gt;
&amp;lt;% } %&amp;gt;&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript runs inside HTML, &amp;lt;%= %&amp;gt; outputs data to the page&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Rendering with Express

&lt;ul&gt;
&lt;li&gt;Static : ex) &lt;code&gt;res.sendFile("index.html");&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Dynamic (EJS) : ex)
&lt;code&gt;app.post("/submit", (req, res) =&amp;gt; {
res.render("index.ejs", {
name: req.body["name"]
});
});&lt;/code&gt;
&lt;code&gt;&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;Hello &amp;lt;%= name %&amp;gt;&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. EJS Tags&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&amp;lt;%= variable %&amp;gt; : output value&lt;/li&gt;
&lt;li&gt;&amp;lt;% code %&amp;gt; : execute JavaScript&lt;/li&gt;
&lt;li&gt;&amp;lt;%- html %&amp;gt; : render HTML (unescaped)&lt;/li&gt;
&lt;li&gt;&amp;lt;%% %%&amp;gt; : display &amp;lt;% %&amp;gt; literally&lt;/li&gt;
&lt;li&gt;&amp;lt;%# comment %&amp;gt; : comment (not executed)&lt;/li&gt;
&lt;li&gt;&amp;lt;%- include("header.ejs") %&amp;gt; : Include (Partials), Used to reuse components (header, footer, etc.)&lt;/li&gt;
&lt;li&gt;Using JavaScript in EJS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Passing Data&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server → EJS : Pass data using &lt;code&gt;res.render()&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;If no data exists : Use default values or locals&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;EJS → Server : Use forms with method="POST"&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Partials &amp;amp; Layouts&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Static files : &lt;code&gt;app.use(express.static("public"));&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Templating syntax : &amp;lt;% %&amp;gt;(logic), &amp;lt;%= %&amp;gt;(output), &amp;lt;%- %&amp;gt;(raw HTML)&lt;/li&gt;
&lt;li&gt;Partials : ex) &amp;lt;%- include("header.ejs") %&amp;gt;, &amp;lt;%- include("footer.ejs") %&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Helps avoid code duplication, Improves maintainability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Javascript Tip&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Variable Keywords : const(cannot be reassigned), let(can be reassigned)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;forEach : method used to loop through an array and run a function on each item. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ex) 
&lt;code&gt;array.forEach((element, index, array) =&amp;gt; {
console.log(element); 
console.log(index);  
});&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>fullstack</category>
      <category>programming</category>
    </item>
    <item>
      <title>21. Express.js with Node.js</title>
      <dc:creator>avery</dc:creator>
      <pubDate>Mon, 27 Apr 2026 16:17:38 +0000</pubDate>
      <link>https://dev.to/avery_/21-expressjs-with-nodejs-3mc4</link>
      <guid>https://dev.to/avery_/21-expressjs-with-nodejs-3mc4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;BootCamp by Dr.Angela&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;1. What is Express?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Express.js is a backend web framework for Node.js&lt;/li&gt;
&lt;li&gt;Express vs Node.js

&lt;ul&gt;
&lt;li&gt;Node.js : Runtime environment (not a framework)&lt;/li&gt;
&lt;li&gt;Express.js : Framework built on top of Node.js, Makes backend development easier&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Why Express? : Less code, Better readability, Middleware support, Faster development&lt;/li&gt;

&lt;li&gt;“It’s All Node To Me”

&lt;ul&gt;
&lt;li&gt;Can be used for : Web backend, IoT applications, Desktop apps (e.g. VS Code is built with Electron + Node)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Creating Your First Express Server&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend structure

&lt;ul&gt;
&lt;li&gt;Server : computer running 24/7 (listening for requests)&lt;/li&gt;
&lt;li&gt;Application : index.js (logic)&lt;/li&gt;
&lt;li&gt;Database : data storage&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Client-side vs Server-side

&lt;ul&gt;
&lt;li&gt;Client : browser&lt;/li&gt;
&lt;li&gt;Server : backend system&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Setup steps

&lt;ul&gt;
&lt;li&gt;mkdir project-folder&lt;/li&gt;
&lt;li&gt;cd project-folder&lt;/li&gt;
&lt;li&gt;touch index.js&lt;/li&gt;
&lt;li&gt;npm init -y&lt;/li&gt;
&lt;li&gt;npm i express&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Basic server : ex)
`import express from "express";&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;const app = express();&lt;br&gt;
const port = 3000;&lt;/p&gt;

&lt;p&gt;app.listen(port, () =&amp;gt; {&lt;br&gt;
  console.log(&lt;code&gt;Server running on port ${port}.&lt;/code&gt;);&lt;br&gt;
});`&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is localhost? : Local server running on your computer

&lt;ul&gt;
&lt;li&gt;Example : &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Think of it as your computer’s “door” for apps&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Check open ports

&lt;ul&gt;
&lt;li&gt;Windows : netstat -ano | findstr "LISTENING"&lt;/li&gt;
&lt;li&gt;Mac/Linux : sudo lsof -i -P -n | grep LISTEN&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. HTTP Requests&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP : HyperText Transfer Protocol&lt;/li&gt;
&lt;li&gt;HTTP Methods

&lt;ul&gt;
&lt;li&gt;GET : retrieve data&lt;/li&gt;
&lt;li&gt;POST : send data&lt;/li&gt;
&lt;li&gt;PUT : replace data&lt;/li&gt;
&lt;li&gt;PATCH : update data&lt;/li&gt;
&lt;li&gt;DELETE : remove data&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Basic route : ex) 
&lt;code&gt;app.get("/", (req, res) =&amp;gt; {&lt;br&gt;
res.send("Hello, World!");&lt;br&gt;
});&lt;/code&gt;
&lt;/li&gt;

&lt;li&gt;Endpoints
&lt;code&gt;app.get("/about", (req, res) =&amp;gt; {&lt;br&gt;
res.send("&amp;lt;h1&amp;gt;About Me&amp;lt;/h1&amp;gt;");&lt;br&gt;
});&lt;/code&gt;
&lt;/li&gt;

&lt;li&gt;Nodemon : Auto-restarts server when changes are made

&lt;ul&gt;
&lt;li&gt;ex)
&lt;code&gt;npm i -g nodemon
nodemon index.js&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Postman&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tool for testing APIs (without frontend)&lt;/li&gt;
&lt;li&gt;HTTP Status Codes

&lt;ul&gt;
&lt;li&gt;100–199 : Informational&lt;/li&gt;
&lt;li&gt;200–299 : Success&lt;/li&gt;
&lt;li&gt;300–399 : Redirection&lt;/li&gt;
&lt;li&gt;400–499 : Client errors&lt;/li&gt;
&lt;li&gt;500–599 : Server errors&lt;/li&gt;
&lt;li&gt;Reference : &lt;a href="https://developer.mozilla.org/ko/docs/Web/HTTP/Reference/Status" rel="noopener noreferrer"&gt;https://developer.mozilla.org/ko/docs/Web/HTTP/Reference/Status&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Install all dependencies : &lt;code&gt;npm install&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Installs everything listed in package.json&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Introduction to Middleware&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Body Parser : Handles form data (x-www-form-urlencoded)

&lt;ul&gt;
&lt;li&gt;app.use(bodyParser.urlencoded({extended:true}));&lt;/li&gt;
&lt;li&gt;Express built-in middleware : app.use(express.urlencoded({ extended: true }));&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Send file : res.sendFile(path);&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6. Custom Middleware&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is middleware? : Code that runs between request and response

&lt;ul&gt;
&lt;li&gt;Used for : Logging, Authentication, Error handling, Data preprocessing&lt;/li&gt;
&lt;li&gt;Example: Logger
&lt;code&gt;function logger(req, res, next) {
console.log("Request Method:", req.method);
console.log("Request URL:", req.url);
next();
}
app.use(logger);&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Path utilities : ex)
`import { dirname } from "path";
import { fileURLToPath } from "url";&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;const __dirname = dirname(fileURLToPath(import.meta.url));`&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Important : Middleware order matters, body-parser must come before routes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;7. Secrets Access Project&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Example : 
`var userIsAuthorised = false;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;function passwordCheck(req, res, next) {&lt;br&gt;
  const password = req.body["password"];&lt;/p&gt;

&lt;p&gt;if (password === "ILoveProgramming") {&lt;br&gt;
    userIsAuthorised = true;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;next();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;app.use(passwordCheck);`&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Route protection : 
`app.post("/check", (req, res) =&amp;gt; {
if (userIsAuthorised) {
res.sendFile(&lt;strong&gt;dirname + "/public/secret.html");
} else {
res.sendFile(&lt;/strong&gt;dirname + "/public/index.html");
}&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;console.log(req.body);&lt;br&gt;
});`&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>fullstack</category>
    </item>
    <item>
      <title>20. Node.js</title>
      <dc:creator>avery</dc:creator>
      <pubDate>Tue, 21 Apr 2026 20:30:34 +0000</pubDate>
      <link>https://dev.to/avery_/20-nodejs-11d8</link>
      <guid>https://dev.to/avery_/20-nodejs-11d8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;BootCamp by Dr.Angela&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;1. What is Node.js?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js is a JavaScript runtime that allows you to run JavaScript outside the browser (on a server or local machine)&lt;/li&gt;
&lt;li&gt;Why use frameworks/libraries? : Reuse components, Reduce development overhead

&lt;ul&gt;
&lt;li&gt;ex) Reading files, writing files, URL Strings, Networking, Data Streams, Diagnostics, Tests, Debugger, Error Codes&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Definition : “Node.js is an asynchronous, event-driven JavaScript runtime designed to build scalable network applications.”

&lt;ul&gt;
&lt;li&gt;Key Concepts&lt;/li&gt;
&lt;li&gt;JavaScript Runtime : Runs JS outside the browser (server/local computer)&lt;/li&gt;
&lt;li&gt;Asynchronous : Executes tasks without blocking (non-blocking)&lt;/li&gt;
&lt;li&gt;Event-driven : Responds to events (requests, user actions, etc.)&lt;/li&gt;
&lt;li&gt;Application : On Server(Computer)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Why Node.js? : Full-stack JavaScript, Scalable, Non-blocking I/O
, Huge ecosystem&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Using Node.js&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check version : node -v&lt;/li&gt;
&lt;li&gt;REPL (Read-Eval-Print Loop) : node

&lt;ul&gt;
&lt;li&gt;Commands&lt;/li&gt;
&lt;li&gt;.help : show commands)&lt;/li&gt;
&lt;li&gt;.exit or Ctrl + C (twice) : exit &lt;/li&gt;
&lt;li&gt;Similar to the browser console&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Run a JS file : 
cd path/to/file
node index.js&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Native Node Modules&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native Modules : Built-in modules provided by Node.js&lt;/li&gt;
&lt;li&gt;File System (fs) : const fs = require("fs");

&lt;ul&gt;
&lt;li&gt;Write file : 
fs.writeFile("message.txt", "Hello from NodeJS!", (err) =&amp;gt; {
if (err) throw err;
console.log("The file has been saved!");
});&lt;/li&gt;
&lt;li&gt;Read file : 
fs.readFile("./message.txt", "utf8", (err, data) =&amp;gt; {
if (err) throw err;
console.log(data);
});&lt;/li&gt;
&lt;li&gt;"utf8" → encoding option&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Docs : &lt;a href="https://nodejs.org/docs/latest-v18.x/api/fs.html" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://nodejs.org/docs/latest-v18.x/api/fs.html" rel="noopener noreferrer"&gt;https://nodejs.org/docs/latest-v18.x/api/fs.html&lt;/a&gt;
&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. NPM (Node Package Manager)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A repository of packages and libraries&lt;/li&gt;
&lt;li&gt;Website : &lt;a href="https://www.npmjs.com/" rel="noopener noreferrer"&gt;https://www.npmjs.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Initialize project : npm init

&lt;ul&gt;
&lt;li&gt;Quick setup : npm init -y&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Install packages : npm install 

&lt;ul&gt;
&lt;li&gt;ex) npm i sillyname&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Module Systems

&lt;ul&gt;
&lt;li&gt;CommonJS (CJS) : ex) const generateName = require("sillyname");&lt;/li&gt;
&lt;li&gt;ES Modules (ESM) : ex) import generateName from "sillyname";&lt;/li&gt;
&lt;li&gt;Enable ESM : "type": "module"&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Example : 
import superheroes, { randomSuperhero } from "superheroes";&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;const name = randomSuperhero();&lt;br&gt;
  console.log(`I am ${name}!`);&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Mini Project: QR Code Generator&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Packages : inquirer(user input), qr-image(generate QR codes)&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Install : npm i inquirer qr-image&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Note : Be careful with package names (typos can install wrong packages), Always check package documentation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>fullstack</category>
    </item>
    <item>
      <title>19. Backend Web Development</title>
      <dc:creator>avery</dc:creator>
      <pubDate>Sun, 19 Apr 2026 09:55:33 +0000</pubDate>
      <link>https://dev.to/avery_/19-backend-web-development-1fn4</link>
      <guid>https://dev.to/avery_/19-backend-web-development-1fn4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;BootCamp by Dr.Angela&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;1. Backend Web Development Explained&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is the backend? : The backend is the part of a web application that runs on the server and handles logic, data, and requests.&lt;/li&gt;
&lt;li&gt;Main Components

&lt;ul&gt;
&lt;li&gt;Server : A computer that runs 24/7, Can be local (localhost) or remote (cloud server)&lt;/li&gt;
&lt;li&gt;Application (Backend Logic) : Handles requests and responses&lt;/li&gt;
&lt;li&gt;Returns : HTML, Data (JSON, etc.), Status codes (e.g. 404 Not Found, 500 Server Error)&lt;/li&gt;
&lt;li&gt;Database : Stores and manages data, Ensures data persistence (data is saved long-term)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Web Page vs Web App

&lt;ul&gt;
&lt;li&gt;Web Page : Simple structure(User ↔ Server), Mostly static content&lt;/li&gt;
&lt;li&gt;Web Application : Full system(User ↔ Server ↔ Application ↔ Database), Dynamic content with data interaction&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Backend Tools and Technologies&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend : HTML, CSS, JavaScript(React, Angular, Vue)&lt;/li&gt;
&lt;li&gt;Backend : Java(Spring), Ruby(Ruby on Rails), PHP(Laravel), C#(ASP.NET), Python(Django, Flask), JavaScript(Node.js)&lt;/li&gt;
&lt;li&gt;Backend choice depends on the ecosystem, scalability needs, and personal or company preference.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>fullstack</category>
      <category>programming</category>
    </item>
    <item>
      <title>18. The Unix Command Line</title>
      <dc:creator>avery</dc:creator>
      <pubDate>Sun, 19 Apr 2026 07:00:43 +0000</pubDate>
      <link>https://dev.to/avery_/18-the-unix-command-line-l60</link>
      <guid>https://dev.to/avery_/18-the-unix-command-line-l60</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;BootCamp by Dr.Angela&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;1. Install Git Bash on Windows&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download: &lt;a href="https://gitforwindows.org/" rel="noopener noreferrer"&gt;https://gitforwindows.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Use Git Bash as the terminal in VS Code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Understanding the Command Line&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shell vs Kernel

&lt;ul&gt;
&lt;li&gt;Shell: user interface (CLI/GUI) that interacts with the system&lt;/li&gt;
&lt;li&gt;Kernel: core of the OS that manages CPU, memory, and disks&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Bash (Bourne Again Shell) : A popular Unix shell (used in macOS and Linux)&lt;/li&gt;

&lt;li&gt;Why use CLI (Command Line Interface)? : Faster, More control, More flexible&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Command Line Navigation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ls : list files and directories&lt;/li&gt;
&lt;li&gt;cd : change directory&lt;/li&gt;
&lt;li&gt;cd .. : move up one level&lt;/li&gt;
&lt;li&gt;Tips

&lt;ul&gt;
&lt;li&gt;Tab : auto-complete&lt;/li&gt;
&lt;li&gt;↑ / ↓ : reuse previous commands&lt;/li&gt;
&lt;li&gt;Drag &amp;amp; drop folder : auto path input&lt;/li&gt;
&lt;li&gt;Alt + Click : move cursor&lt;/li&gt;
&lt;li&gt;Ctrl + A : move to beginning of line&lt;/li&gt;
&lt;li&gt;Ctrl + E : move to end of line&lt;/li&gt;
&lt;li&gt;Ctrl + U : delete to the beginning&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. File &amp;amp; Directory Management&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create

&lt;ul&gt;
&lt;li&gt;mkdir folder-name     # create folder&lt;/li&gt;
&lt;li&gt;touch file.txt        # create file&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Open

&lt;ul&gt;
&lt;li&gt;start file.txt        # Windows&lt;/li&gt;
&lt;li&gt;open file.txt         # macOS&lt;/li&gt;
&lt;li&gt;code file.txt         # open in VS Code&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Delete

&lt;ul&gt;
&lt;li&gt;rm file.txt           # delete file&lt;/li&gt;
&lt;li&gt;rm *                  # delete all files in current folder&lt;/li&gt;
&lt;li&gt;rm -r folder-name     # delete folder&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Other commands

&lt;ul&gt;
&lt;li&gt;pwd                   # show current path&lt;/li&gt;
&lt;li&gt;clear                 # clear terminal&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Reference : &lt;a href="https://www.learnenough.com/command-line-tutorial" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.learnenough.com/command-line-tutorial" rel="noopener noreferrer"&gt;https://www.learnenough.com/command-line-tutorial&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;Note (Important)

&lt;ul&gt;
&lt;li&gt;rm * and rm -r are dangerous commands, Always double-check before running them (no undo)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>fullstack</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
