<?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: Vikas Prabhu</title>
    <description>The latest articles on DEV Community by Vikas Prabhu (@prabhuvikas).</description>
    <link>https://dev.to/prabhuvikas</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%2F122442%2F2e421f9e-93ef-49c0-bd2b-00f7e7fb8c7a.jpeg</url>
      <title>DEV Community: Vikas Prabhu</title>
      <link>https://dev.to/prabhuvikas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/prabhuvikas"/>
    <language>en</language>
    <item>
      <title>RAG Explained for SQL Developers: Think of It as SELECT, But for Meaning</title>
      <dc:creator>Vikas Prabhu</dc:creator>
      <pubDate>Sat, 28 Feb 2026 11:06:42 +0000</pubDate>
      <link>https://dev.to/prabhuvikas/rag-explained-for-sql-developers-think-of-it-as-select-but-for-meaning-olg</link>
      <guid>https://dev.to/prabhuvikas/rag-explained-for-sql-developers-think-of-it-as-select-but-for-meaning-olg</guid>
      <description>&lt;p&gt;If you've spent years writing &lt;code&gt;SELECT&lt;/code&gt; statements, tuning execution plans, and building B-Tree indexes, &lt;strong&gt;you already understand 80% of what RAG does&lt;/strong&gt; — you just don't know it yet.&lt;/p&gt;

&lt;p&gt;RAG (Retrieval-Augmented Generation) is essentially a retrieval pipeline, just like SQL. The difference? Instead of &lt;code&gt;WHERE category = 'Small Cap'&lt;/code&gt;, it does &lt;code&gt;WHERE meaning ≈ 'what are the risks'&lt;/code&gt;. Instead of returning rows, it returns document passages. And instead of your application rendering a table, an LLM synthesizes a human-readable answer.&lt;/p&gt;

&lt;p&gt;This article maps every RAG concept to the SQL equivalent you already know — from storage to indexing to query execution — so it clicks immediately.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Mental Model
&lt;/h2&gt;

&lt;p&gt;Here's the mapping that'll make everything click:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You Know This (SQL)&lt;/th&gt;
&lt;th&gt;Now Learn This (RAG)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;CREATE TABLE&lt;/code&gt; + &lt;code&gt;INSERT&lt;/code&gt; rows&lt;/td&gt;
&lt;td&gt;Chunk documents + Store embeddings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;CREATE INDEX&lt;/code&gt; (B-Tree)&lt;/td&gt;
&lt;td&gt;Vector index (HNSW)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WHERE column = value&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cosine similarity search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROWID → fetch row from data block&lt;/td&gt;
&lt;td&gt;Chunk ID → fetch text passage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execution plan (CBO optimizer)&lt;/td&gt;
&lt;td&gt;Embed query → Top-K nearest neighbors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ResultSet → render table in app&lt;/td&gt;
&lt;td&gt;Retrieved chunks → LLM generates answer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Now let's walk through each phase.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 1: Data Sources — What You're Storing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🟡 SQL — You know this
&lt;/h3&gt;

&lt;p&gt;You work with &lt;strong&gt;structured, schema-defined data&lt;/strong&gt;. Every row has the same columns, every column has a defined type:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NAV tables&lt;/strong&gt; — &lt;code&gt;fund_id&lt;/code&gt;, &lt;code&gt;nav_date&lt;/code&gt;, &lt;code&gt;nav_value&lt;/code&gt; (NUMBER)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio holdings&lt;/strong&gt; — &lt;code&gt;security_id&lt;/code&gt;, &lt;code&gt;weight_pct&lt;/code&gt;, &lt;code&gt;market_value&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transaction ledgers&lt;/strong&gt; — &lt;code&gt;txn_id&lt;/code&gt;, &lt;code&gt;amount&lt;/code&gt;, &lt;code&gt;txn_type&lt;/code&gt;, &lt;code&gt;timestamp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client master&lt;/strong&gt; — &lt;code&gt;client_id&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;PAN&lt;/code&gt;, &lt;code&gt;risk_profile&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fund performance&lt;/strong&gt; — &lt;code&gt;fund_id&lt;/code&gt;, &lt;code&gt;period&lt;/code&gt;, &lt;code&gt;return_pct&lt;/code&gt;, &lt;code&gt;benchmark_pct&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clean, typed, relational. This is your comfort zone.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔵 RAG — Now imagine this
&lt;/h3&gt;

&lt;p&gt;But what about all the data that &lt;strong&gt;doesn't fit into rows and columns&lt;/strong&gt;?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SEBI circulars &amp;amp; regulatory filings&lt;/strong&gt; — PDF documents with legal text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fund factsheets &amp;amp; offer documents&lt;/strong&gt; — Multi-page PDFs with tables mixed into prose&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research reports &amp;amp; analyst notes&lt;/strong&gt; — Word docs, emails, presentations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Board meeting minutes&lt;/strong&gt; — Free-form narrative text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Annual reports &amp;amp; MD&amp;amp;A sections&lt;/strong&gt; — Long-form financial commentary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can't &lt;code&gt;SELECT * FROM sebi_circular WHERE topic = 'liquidity risk'&lt;/code&gt; — because there's no table, no columns, no schema. &lt;strong&gt;This is exactly the problem RAG solves.&lt;/strong&gt; It makes unstructured documents queryable, just like SQL makes structured tables queryable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 2: Data Ingestion &amp;amp; Storage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🟡 SQL — You know this
&lt;/h3&gt;

&lt;p&gt;You define a schema, create tables, and insert rows. Each row gets a physical address (ROWID) in Oracle's data blocks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Step 1: Define schema (DDL)&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;funds&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;fund_id&lt;/span&gt;      &lt;span class="n"&gt;NUMBER&lt;/span&gt;        &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;fund_name&lt;/span&gt;    &lt;span class="n"&gt;VARCHAR2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;category&lt;/span&gt;     &lt;span class="n"&gt;VARCHAR2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;risk_rating&lt;/span&gt;  &lt;span class="n"&gt;VARCHAR2&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;aum_crores&lt;/span&gt;   &lt;span class="n"&gt;NUMBER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&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="n"&gt;inception_dt&lt;/span&gt; &lt;span class="nb"&gt;DATE&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;TABLESPACE&lt;/span&gt; &lt;span class="n"&gt;fund_data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Step 2: Insert structured rows&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;funds&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="mi"&gt;1001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'Axis Small Cap Fund'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'Small Cap'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'Very High'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;18542&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="nb"&gt;DATE&lt;/span&gt; &lt;span class="s1"&gt;'2013-11-05'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Step 3: Data stored in Oracle data blocks&lt;/span&gt;
&lt;span class="c1"&gt;-- Each row → ROWID (physical address)&lt;/span&gt;
&lt;span class="c1"&gt;-- e.g., AAABnPAAEAAAAJHAAA&lt;/span&gt;
&lt;span class="c1"&gt;-- Format: Object | File | Block | Row&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Summary:&lt;/strong&gt; Schema → typed rows → physical storage in data blocks → each row addressable by ROWID.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔵 RAG — Now here's the equivalent
&lt;/h3&gt;

&lt;p&gt;RAG does the same thing, but for documents. Instead of rows, you store &lt;strong&gt;chunks&lt;/strong&gt;. Instead of ROWIDs, you store &lt;strong&gt;vectors&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;# Step 1: Load the document (like reading a CSV into a staging table)
&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_pdf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SEBI_circular_2024.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Step 2: Split into chunks (like breaking one big row into normalized pieces)
&lt;/span&gt;&lt;span class="n"&gt;chunks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;text_splitter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;# ~500 tokens per chunk
&lt;/span&gt;    &lt;span class="n"&gt;chunk_overlap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;      &lt;span class="c1"&gt;# overlap so context isn't lost at boundaries
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Result: ["Small-cap funds carry higher...",
#          "SEBI mandates stress testing...",
#          "Liquidity risk management..." ]
&lt;/span&gt;
&lt;span class="c1"&gt;# Step 3: Convert each chunk into a vector — THIS IS THE KEY STEP
# Think of it as: computing a "semantic ROWID" for each chunk
&lt;/span&gt;&lt;span class="n"&gt;vectors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;embedding_model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Each chunk → [0.023, -0.187, 0.441, ...] (1536 floating-point numbers)
&lt;/span&gt;
&lt;span class="c1"&gt;# Step 4: Store in vector database (like INSERT INTO ... VALUES)
&lt;/span&gt;&lt;span class="n"&gt;vector_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upsert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ids&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;chunk_001&lt;/span&gt;&lt;span class="sh"&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;chunk_002&lt;/span&gt;&lt;span class="sh"&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;# like primary keys
&lt;/span&gt;    &lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;vectors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                       &lt;span class="c1"&gt;# like the "semantic ROWID"
&lt;/span&gt;    &lt;span class="n"&gt;metadata&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;source&lt;/span&gt;&lt;span class="sh"&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;SEBI_2024.pdf&lt;/span&gt;&lt;span class="sh"&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;page&lt;/span&gt;&lt;span class="sh"&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="p"&gt;...]&lt;/span&gt;  &lt;span class="c1"&gt;# like extra columns
&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;The SQL developer's translation:&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;SQL Concept&lt;/th&gt;
&lt;th&gt;RAG Equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;CREATE TABLE&lt;/code&gt; with typed columns&lt;/td&gt;
&lt;td&gt;Define chunk size + embedding model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;INSERT INTO&lt;/code&gt; a row&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;upsert()&lt;/code&gt; a chunk + its vector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROWID (physical disk address)&lt;/td&gt;
&lt;td&gt;Vector embedding (semantic address in meaning-space)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data block in tablespace&lt;/td&gt;
&lt;td&gt;Vector stored in Pinecone / ChromaDB / pgvector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extra columns (category, date)&lt;/td&gt;
&lt;td&gt;Metadata fields (source file, page number)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key insight:&lt;/strong&gt; A ROWID tells Oracle &lt;em&gt;where&lt;/em&gt; a row lives on disk. A vector embedding tells the vector DB &lt;em&gt;what&lt;/em&gt; a chunk means. Both are addresses — one physical, one semantic.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Phase 3: Indexing — Making It Searchable
&lt;/h2&gt;

&lt;p&gt;Without indexes, both systems do full scans. You know this pain. Let's see how each solves it.&lt;/p&gt;

&lt;h3&gt;
  
  
  🟡 SQL — You know this
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- B-Tree Index (your bread and butter)&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_funds_category&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;funds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;TABLESPACE&lt;/span&gt; &lt;span class="n"&gt;fund_idx&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Composite Index (multi-column)&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_perf_fund_date&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;fund_performance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fund_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Bitmap Index (for low-cardinality columns)&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;BITMAP&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_funds_risk&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;funds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;risk_rating&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;-- Great for: 'Very High', 'High', 'Moderate' (few distinct values)&lt;/span&gt;

&lt;span class="c1"&gt;-- Function-Based Index&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_funds_upper_name&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;funds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;UPPER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fund_name&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;-- Speeds up: WHERE UPPER(fund_name) LIKE 'AXIS%'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How B-Tree works:&lt;/strong&gt; Root → branch → leaf → ROWID → fetch row. For 1 million rows, it takes &lt;strong&gt;~3-4 hops&lt;/strong&gt;. Deterministic, exact, fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔵 RAG — Now here's the equivalent
&lt;/h3&gt;

&lt;p&gt;Instead of a B-Tree that organizes values in sorted order, RAG uses a &lt;strong&gt;vector index&lt;/strong&gt; that organizes embeddings by semantic proximity.&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;# HNSW Index (the "B-Tree of the vector world")
# — Most popular, best recall/speed tradeoff
&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hnsw&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;# Hierarchical Navigable Small World
&lt;/span&gt;    &lt;span class="n"&gt;metric&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cosine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;# similarity metric (like ASC/DESC but for meaning)
&lt;/span&gt;    &lt;span class="n"&gt;ef_construction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# build quality (like PCT_FREE for B-Trees)
&lt;/span&gt;    &lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;                   &lt;span class="c1"&gt;# connections per node (like branching factor)
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Other index types:
# IVF  — Clusters vectors first, searches nearby clusters (like partitioning)
# FLAT — Brute force, checks ALL vectors (like a full table scan)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How HNSW works:&lt;/strong&gt; Imagine a multi-layer graph. Top layer = few nodes (coarse navigation). Bottom layer = all nodes (fine detail). Search starts at top → hops to closest node → drops a layer → repeats → arrives near the target.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The SQL developer's translation:&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;SQL Index Concept&lt;/th&gt;
&lt;th&gt;RAG Vector Index Equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;B-Tree (sorted values)&lt;/td&gt;
&lt;td&gt;HNSW (semantic proximity graph)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bitmap (low-cardinality)&lt;/td&gt;
&lt;td&gt;IVF (clustered vectors)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full Table Scan&lt;/td&gt;
&lt;td&gt;FLAT index (brute-force vector scan)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;INDEX RANGE SCAN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Approximate Nearest Neighbor (ANN) search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100% exact match&lt;/td&gt;
&lt;td&gt;95-99% approximate match (tradeoff for speed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ANALYZE TABLE&lt;/code&gt; for CBO stats&lt;/td&gt;
&lt;td&gt;Index tuning: &lt;code&gt;ef_construction&lt;/code&gt;, &lt;code&gt;M&lt;/code&gt; params&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key difference:&lt;/strong&gt; Your B-Tree finds &lt;code&gt;WHERE category = 'Small Cap'&lt;/code&gt; — an &lt;strong&gt;exact match&lt;/strong&gt;. A vector index finds &lt;code&gt;WHERE meaning ≈ 'risks of small-cap investing'&lt;/code&gt; — a &lt;strong&gt;semantic match&lt;/strong&gt;. "Risk" matches "volatility", "danger", "exposure" — even though the words are different.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Phase 4: Query Execution
&lt;/h2&gt;

&lt;p&gt;A user asks a question. Let's trace the execution path.&lt;/p&gt;

&lt;h3&gt;
  
  
  🟡 SQL — You know this
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- User wants: "Show me small-cap funds with low liquidity"&lt;/span&gt;
&lt;span class="c1"&gt;-- Translated to SQL:&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;fund_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;liquidity_ratio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;avg_volume&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;funds&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt;   &lt;span class="n"&gt;fund_liquidity&lt;/span&gt; &lt;span class="n"&gt;fl&lt;/span&gt; &lt;span class="k"&gt;ON&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;fund_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fund_id&lt;/span&gt;
&lt;span class="k"&gt;WHERE&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;category&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Small Cap'&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt;  &lt;span class="n"&gt;fl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;liquidity_ratio&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&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;5&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;fl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;liquidity_ratio&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Oracle CBO generates execution plan:&lt;/span&gt;
&lt;span class="c1"&gt;----------------------------------------------&lt;/span&gt;
&lt;span class="c1"&gt;-- | Id | Operation               | Cost |&lt;/span&gt;
&lt;span class="c1"&gt;-- |----|-------------------------|------|&lt;/span&gt;
&lt;span class="c1"&gt;-- |  0 | SELECT STATEMENT        |   15 |&lt;/span&gt;
&lt;span class="c1"&gt;-- |  1 |  SORT ORDER BY          |   15 |&lt;/span&gt;
&lt;span class="c1"&gt;-- |  2 |   NESTED LOOPS          |   12 |&lt;/span&gt;
&lt;span class="c1"&gt;-- |  3 |    INDEX RANGE SCAN     |    3 |&lt;/span&gt;
&lt;span class="c1"&gt;-- |    |     idx_funds_category  |      |&lt;/span&gt;
&lt;span class="c1"&gt;-- |  4 |    TABLE ACCESS ROWID   |    1 |&lt;/span&gt;
&lt;span class="c1"&gt;-- |    |     funds               |      |&lt;/span&gt;
&lt;span class="c1"&gt;-- |  5 |    INDEX RANGE SCAN     |    2 |&lt;/span&gt;
&lt;span class="c1"&gt;-- |    |     idx_liq_fund_ratio  |      |&lt;/span&gt;
&lt;span class="c1"&gt;-- |  6 |    TABLE ACCESS ROWID   |    1 |&lt;/span&gt;
&lt;span class="c1"&gt;-- |    |     fund_liquidity      |      |&lt;/span&gt;
&lt;span class="c1"&gt;----------------------------------------------&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Flow:&lt;/strong&gt; Parse SQL → CBO picks cheapest plan → index scan → get ROWIDs → fetch rows → sort → return ResultSet. Deterministic. Same query, same result, every time.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔵 RAG — Now here's the equivalent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# User asks (in plain English, no SQL needed):
# "What are the liquidity risks of small-cap funds?"
&lt;/span&gt;
&lt;span class="c1"&gt;# Step 1: Embed the question — like the CBO "parsing" your query
# But instead of parsing SQL syntax, it converts MEANING into a vector
&lt;/span&gt;&lt;span class="n"&gt;query_vec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What are the liquidity risks of small-cap funds?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → [0.034, -0.221, 0.187, ...] (1536-d)
&lt;/span&gt;
&lt;span class="c1"&gt;# Step 2: Search the vector index — like INDEX RANGE SCAN
# But instead of matching column values, it matches semantic similarity
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vector_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&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;=&lt;/span&gt;&lt;span class="n"&gt;query_vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;top_k&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="c1"&gt;# like FETCH FIRST 5 ROWS ONLY
&lt;/span&gt;    &lt;span class="nb"&gt;filter&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;source&lt;/span&gt;&lt;span class="sh"&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;regulatory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;   &lt;span class="c1"&gt;# like adding a WHERE clause
&lt;/span&gt;    &lt;span class="n"&gt;include_metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Step 3: Results come back ranked by similarity score
# (like ORDER BY relevance DESC)
# chunk_042  score: 0.93  "liquidity risk in small-cap..."
# chunk_187  score: 0.89  "market depth concerns for..."
# chunk_015  score: 0.85  "redemption pressure during..."
# chunk_221  score: 0.81  "SEBI stress testing norms..."
# chunk_098  score: 0.78  "exit load and lock-in..."
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice: the query doesn't contain the word "market depth" or "redemption pressure" — but those chunks scored high because the &lt;strong&gt;meaning is related&lt;/strong&gt;. A B-Tree could never do this. It only matches exact strings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The SQL developer's translation:&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;SQL Query Concept&lt;/th&gt;
&lt;th&gt;RAG Query Equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SELECT ... FROM ... WHERE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vector_db.query(vector, top_k, filter)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CBO parses SQL → execution plan&lt;/td&gt;
&lt;td&gt;Embedding model converts question → vector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;INDEX RANGE SCAN&lt;/code&gt; on B-Tree&lt;/td&gt;
&lt;td&gt;ANN search on HNSW graph&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WHERE category = 'Small Cap'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cosine similarity ≈ "small-cap risks"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ORDER BY column ASC&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Results ranked by similarity score (0.0 → 1.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FETCH FIRST 5 ROWS ONLY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;top_k=5&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AND source = 'regulatory'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;filter={"source": "regulatory"}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Phase 5: Retrieval — What Comes Back
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🟡 SQL — You know this
&lt;/h3&gt;

&lt;p&gt;You get back a &lt;strong&gt;typed ResultSet&lt;/strong&gt; — exact rows, exact columns, exact values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+------------------+-------+----------+
| FUND_NAME        | LIQ_R | AVG_VOL  |
+------------------+-------+----------+
| Quant Small Cap  | 0.31  | 1,24,500 |
| Nippon Small Cap | 0.38  | 2,87,300 |
| Axis Small Cap   | 0.42  | 3,45,100 |
| HDFC Small Cap   | 0.47  | 4,12,800 |
+------------------+-------+----------+
4 rows returned in 3ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exact. Typed. Deterministic. Run it again → same 4 rows.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔵 RAG — Now here's the equivalent
&lt;/h3&gt;

&lt;p&gt;Instead of typed rows, you get back &lt;strong&gt;ranked text passages with relevance scores&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chunk_042"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.93&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Small-cap funds face significant liquidity risk
      due to lower market depth. During market stress,
      bid-ask spreads can widen 3-5x compared to
      large-cap securities..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SEBI_circular_2024.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"page"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-03-15"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chunk_187"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.89&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Redemption pressure in mid and small-cap
      categories reached ₹8,200 Cr in Q4, forcing
      fund managers to sell positions at unfavorable
      prices..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The SQL developer's translation:&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;SQL ResultSet&lt;/th&gt;
&lt;th&gt;RAG Retrieval&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Rows with typed columns&lt;/td&gt;
&lt;td&gt;Text chunks with similarity scores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rs.getString("FUND_NAME")&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;result["text"]&lt;/code&gt; (free-form prose)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rs.getDouble("LIQ_RATIO")&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;result["score"]&lt;/code&gt; (0.0 to 1.0 relevance)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Always returns exact matches&lt;/td&gt;
&lt;td&gt;May return "near misses" (related, not exact)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Deterministic&lt;/strong&gt; — same query, same result&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Probabilistic&lt;/strong&gt; — may vary slightly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You render it in a table/chart&lt;/td&gt;
&lt;td&gt;You feed it to an LLM for synthesis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Phase 6: Response — The Final Output
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🟡 SQL — You know this
&lt;/h3&gt;

&lt;p&gt;Your application takes the ResultSet and renders it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;ResultSet&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;executeQuery&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"FUND_NAME"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;liq&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDouble&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"LIQ_RATIO"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;long&lt;/span&gt;   &lt;span class="n"&gt;vol&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getLong&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"AVG_VOLUME"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// render in UI table, chart, or report&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt; A data table, a chart, a CSV export. The &lt;strong&gt;numbers&lt;/strong&gt;, not the narrative. The human analyst interprets what the data means.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔵 RAG — Now here's the extra step SQL doesn't have
&lt;/h3&gt;

&lt;p&gt;RAG has one more step: an &lt;strong&gt;LLM reads the retrieved chunks and generates a human-readable answer&lt;/strong&gt;. Think of it as an AI analyst who reads the data and writes the report for you.&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;# The retrieved chunks become "context" for the LLM
# Think of it like: the LLM is a very smart stored procedure
# that reads text input and generates text output
&lt;/span&gt;
&lt;span class="n"&gt;prompt&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;Based on the following documents,
answer the user&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s question.

Context:
&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;chunk_042&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&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;chunk_187&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&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;chunk_015&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

Question: What are the liquidity risks?

Answer:&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&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;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Small-cap funds face significant liquidity risks across three dimensions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Market depth:&lt;/strong&gt; Lower trading volumes mean bid-ask spreads can widen 3-5x during stress, per SEBI's 2024 circular.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Redemption pressure:&lt;/strong&gt; Q4 saw ₹8,200 Cr in outflows from mid/small-cap categories, forcing managers to liquidate at unfavorable prices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Exit constraints:&lt;/strong&gt; Funds may impose exit loads or gate redemptions during severe stress, limiting investor flexibility.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sources: SEBI Circular (March 2024, p.7), Fund Industry Report Q4&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The SQL developer's translation:&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;SQL Response&lt;/th&gt;
&lt;th&gt;RAG Response&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ResultSet → app renders table/chart&lt;/td&gt;
&lt;td&gt;Retrieved chunks → LLM generates prose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human interprets the numbers&lt;/td&gt;
&lt;td&gt;LLM interprets AND explains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shows "what" (the data)&lt;/td&gt;
&lt;td&gt;Shows "what" + "why" + "so what"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;rs.next()&lt;/code&gt; loop in Java&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;llm.generate(prompt)&lt;/code&gt; in Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output: rows &amp;amp; columns&lt;/td&gt;
&lt;td&gt;Output: paragraphs &amp;amp; citations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The big "aha" moment:&lt;/strong&gt; RAG is like SQL where the ResultSet gets passed to an incredibly smart stored procedure that reads the data, understands it, and writes a report — automatically.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Complete Pipeline — One Table to Rule Them All
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;SQL (You Know This)&lt;/th&gt;
&lt;th&gt;RAG (Now You Know This Too)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;📦 &lt;strong&gt;Data&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Structured tables, typed columns&lt;/td&gt;
&lt;td&gt;Unstructured docs, PDFs, emails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📥 &lt;strong&gt;Store&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;CREATE TABLE&lt;/code&gt; → &lt;code&gt;INSERT&lt;/code&gt; rows → data blocks&lt;/td&gt;
&lt;td&gt;Chunk → &lt;code&gt;embed()&lt;/code&gt; → store vectors + metadata&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🗂️ &lt;strong&gt;Index&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;B-Tree / Bitmap (exact value lookup)&lt;/td&gt;
&lt;td&gt;HNSW / IVF (semantic proximity graph)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔍 &lt;strong&gt;Query&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Parse SQL → CBO plan → &lt;code&gt;INDEX RANGE SCAN&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Embed question → cosine similarity → Top-K ANN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📤 &lt;strong&gt;Retrieve&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Exact typed rows via ROWID (deterministic)&lt;/td&gt;
&lt;td&gt;Ranked text chunks via score (probabilistic)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💬 &lt;strong&gt;Respond&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;App renders table/chart (human interprets)&lt;/td&gt;
&lt;td&gt;LLM synthesizes answer (AI interprets)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  When to Use Which
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question Type&lt;/th&gt;
&lt;th&gt;Use&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;"Show me funds with Sharpe &amp;gt; 1.0"&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Exact numeric filtering on structured data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;"What's the NAV of Axis Small Cap today?"&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single exact value lookup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;"Top 10 holdings by weight in Fund X"&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ordered result set from structured tables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;"Why did our fund underperform?"&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RAG&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Needs synthesis across reports and commentary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;"Explain SEBI's new stress testing norms"&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RAG&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Requires reading and summarizing regulatory PDFs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;"What risks should I tell my client about?"&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RAG&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Open-ended, needs contextual intelligence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The Real Power: Combine Both
&lt;/h3&gt;

&lt;p&gt;The most powerful systems use &lt;strong&gt;both pipelines together&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Receive&lt;/strong&gt; a natural language question&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Route&lt;/strong&gt; it — SQL for data questions, RAG for document questions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execute&lt;/strong&gt; the appropriate pipeline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combine&lt;/strong&gt; structured data + document context into a single response&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example: &lt;em&gt;"Why did our mid-cap fund underperform last quarter?"&lt;/em&gt; triggers SQL for the performance numbers AND RAG for the attribution reports and CIO commentary — giving the user both the data and the explanation in one answer.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;If you know SQL, you already know the shape of RAG:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQL:  Table → INSERT row   → B-Tree index  → WHERE exact match → ResultSet    → App renders table
RAG:  Doc   → Embed chunk  → HNSW index    → WHERE meaning ≈   → Text chunks  → LLM writes answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both are retrieval systems. &lt;strong&gt;SQL retrieves data. RAG retrieves meaning.&lt;/strong&gt; The best architectures use both.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If this helped RAG "click" for you, drop a ❤️ — and if you're building systems that combine both, I'd love to hear about your architecture in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>rag</category>
      <category>sql</category>
      <category>database</category>
      <category>ai</category>
    </item>
    <item>
      <title>Harnessing the Power of Amazon S3 as a Mounted Drive: Benefits, Costs, and How-To</title>
      <dc:creator>Vikas Prabhu</dc:creator>
      <pubDate>Mon, 06 May 2024 15:58:29 +0000</pubDate>
      <link>https://dev.to/prabhuvikas/harnessing-the-power-of-amazon-s3-as-a-mounted-drive-benefits-costs-and-how-to-3afi</link>
      <guid>https://dev.to/prabhuvikas/harnessing-the-power-of-amazon-s3-as-a-mounted-drive-benefits-costs-and-how-to-3afi</guid>
      <description>&lt;p&gt;Amazon S3 (Simple Storage Service) by Amazon Web Services (AWS) offers a scalable, reliable, and low-latency data storage solution. While typically used for backup and recovery, data archiving, and as a web application storage layer, an innovative approach is to mount S3 as a drive on a server, such as an Ubuntu AWS instance. This post explores the benefits, costs, and provides a step-by-step guide on how to set this up.&lt;/p&gt;

&lt;h4&gt;
  
  
  Benefits of Using S3 as a Mounted Drive
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scalability and Elasticity&lt;/strong&gt;: Virtually unlimited storage means you can scale up as your data grows without worrying about physical storage limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Durability and Availability&lt;/strong&gt;: High durability and availability, with data automatically replicated across multiple devices in multiple facilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-Effectiveness&lt;/strong&gt;: Only pay for the storage you use, with no upfront costs or additional expenses for maintaining physical hardware.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility&lt;/strong&gt;: Simplifies workflows by making it accessible as part of the local file system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Secure data storage with AWS’s robust security model, enhanced by additional encryption and access controls when mounted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration and Automation&lt;/strong&gt;: Seamless integration with other AWS services and automation capabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Costs of Using S3 as a Mounted Drive
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Storage Costs&lt;/strong&gt;: Based on the amount of data stored per month and the chosen S3 storage class.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request Costs&lt;/strong&gt;: Charges for PUT, GET, and other requests, which can add up with frequent file accesses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Transfer Costs&lt;/strong&gt;: Charges for data transferred out of S3, especially significant if transferring to the internet or across AWS regions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Management Overhead&lt;/strong&gt;: Requires expertise to manage and maintain the setup, consuming administrative resources.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  How to Mount an S3 Bucket on Ubuntu
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Update Your System&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install Required Packages&lt;/strong&gt;:
Install &lt;code&gt;s3fs&lt;/code&gt;, a FUSE-based file system:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;s3fs &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Set Up AWS Credentials&lt;/strong&gt;:
Generate access key from aws console with full s3 access.Securely store your AWS credentials:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.aws
   &lt;span class="nb"&gt;echo &lt;/span&gt;YOUR_ACCESS_KEY_ID:YOUR_SECRET_ACCESS_KEY &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.aws/credentials
   &lt;span class="nb"&gt;chmod &lt;/span&gt;600 &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.aws/credentials
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a Mount Point&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; /mnt/s3bucket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Mount the S3 Bucket&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;s3fs your-bucket-name /mnt/s3bucket &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;passwd_file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.aws/credentials &lt;span class="nt"&gt;-o&lt;/span&gt; allow_other &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nb"&gt;umask&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0022
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Verify the Mount and Set Automatic Mount on Boot&lt;/strong&gt;:
Ensure the mount is successful and configure it to mount automatically on system reboot:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;ls&lt;/span&gt; /mnt/s3bucket
   &lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/fstab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the following line to &lt;code&gt;/etc/fstab&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;   your-bucket-name /mnt/s3bucket fuse.s3fs _netdev,allow_other,passwd_file=/home/ubuntu/.aws/credentials,umask=0022 0 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Conclusion
&lt;/h4&gt;

&lt;p&gt;Mounting an S3 bucket as a drive on an Ubuntu AWS instance can greatly enhance how you manage and interact with cloud storage. It not only brings the benefits of S3 into a more accessible and traditional file system format but also necessitates careful management to optimize costs. By following the above steps, organizations can effectively integrate Amazon S3 with their existing infrastructure and enjoy the myriad benefits it offers.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>s3</category>
      <category>ubuntu</category>
      <category>mount</category>
    </item>
    <item>
      <title>Ensuring Reliability in Web Services: Mastering Idempotency in Node.js and JavaScript</title>
      <dc:creator>Vikas Prabhu</dc:creator>
      <pubDate>Sun, 03 Mar 2024 08:36:19 +0000</pubDate>
      <link>https://dev.to/prabhuvikas/ensuring-reliability-in-web-services-mastering-idempotency-in-nodejs-and-javascript-31cf</link>
      <guid>https://dev.to/prabhuvikas/ensuring-reliability-in-web-services-mastering-idempotency-in-nodejs-and-javascript-31cf</guid>
      <description>&lt;h2&gt;
  
  
  This is how I explained it to my 9 year old kid :P
&lt;/h2&gt;

&lt;p&gt;Imagine you have a magical notebook that creates a toy every time you write down what toy you want. If you write "I want a skateboard," the notebook creates a skateboard for you. Now, imagine if you accidentally write "I want a skateboard" again in the notebook, but you don't get another skateboard because the notebook already knows you have one. The notebook is smart and remembers what you asked for before, so it doesn't make the same toy again unless you really need it. This way, no matter how many times you write the same thing, you still end up with just one skateboard, not a mountain of skateboards.&lt;/p&gt;

&lt;p&gt;This magical notebook is like a computer trick called "idempotency" used in computer programs and the internet. It makes sure that if something is asked to be done more than once, by mistake or on purpose, it doesn't do it again and again but only does it once. This helps prevent messes, like having too many of the same toy, or in the computer world, stopping the same message from being sent out many times or creating too many of the same thing in a computer system. It's a way to keep things neat and avoid unnecessary repeats.&lt;/p&gt;

&lt;h2&gt;
  
  
  But, What is Idempotency Technically :)
&lt;/h2&gt;

&lt;p&gt;Making your REST service idempotent is essential for ensuring reliability and consistency, especially in distributed systems where the same request might be received multiple times due to network retries or other issues. Idempotency means that making multiple identical requests has the same effect as making a single request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding Idempotency in HTTP Methods
&lt;/h3&gt;

&lt;p&gt;First, it's important to understand that some HTTP methods are inherently idempotent. GET, PUT, DELETE, HEAD, OPTIONS, and TRACE methods are supposed to be idempotent, meaning that no matter how many times the request is made, the server's state remains the same after the first request. POST methods are generally not considered idempotent, as they are used to create or update resources and can change the server's state with each request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategies to Achieve Idempotency
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use HTTP Methods Appropriately&lt;/strong&gt;: Adhere to the standard usage of HTTP methods. For operations that retrieve data without changing the server's state, use GET. For operations that update a resource in a way that multiple requests don't change the outcome, use PUT. For creating resources where subsequent requests might create duplicates, consider using PUT with a unique identifier or POST with additional mechanisms to ensure idempotency.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Idempotency Keys&lt;/strong&gt;: For operations where idempotency is crucial, such as creating a new resource with POST, you can implement idempotency keys. Clients generate a unique key for each operation and send it with the request. The server then checks if this key was used before; if it was, it returns the result of the previous operation instead of creating a new resource. This approach is commonly used in APIs for payment processing or other financial transactions.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Implementing Idempotency on the Server with Node.js and Express
&lt;/h2&gt;

&lt;p&gt;Lets implement idempotency keys with an example of express application. To achieve idempotency in POST operations, we use a combination of idempotency keys and middleware in a Node.js Express application. Here is how you can implement it:&lt;br&gt;
&lt;/p&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;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;bodyParser&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;body-parser&lt;/span&gt;&lt;span class="dl"&gt;'&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;bodyParser&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;idempotencyDB&lt;/span&gt; &lt;span class="o"&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;idempotencyMiddleware&lt;/span&gt; &lt;span class="o"&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="nx"&gt;next&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;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&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;//get the key from the header&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;idempotencyKey&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;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Idempotency-Key&lt;/span&gt;&lt;span class="dl"&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;idempotencyKey&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;idempotencyDB&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;idempotencyKey&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;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&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;idempotencyDB&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;idempotencyKey&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&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;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;finish&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="nx"&gt;idempotencyDB&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;idempotencyKey&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;locals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&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="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&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;idempotencyMiddleware&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;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;/data&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;success&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="na"&gt;data&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;body&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="nx"&gt;locals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&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;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;201&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;response&lt;/span&gt;&lt;span class="p"&gt;);&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="mi"&gt;3000&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Server is running on port 3000&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test Your Implementation&lt;/p&gt;

&lt;p&gt;To test your implementation, you'll need to make HTTP POST requests to your &lt;code&gt;/data&lt;/code&gt; endpoint, including an &lt;code&gt;Idempotency-Key&lt;/code&gt; header with a unique value for each new request. You can use tools like Postman, curl, or write a client script using Axios or the native fetch API in Node.js.&lt;/p&gt;

&lt;p&gt;Here's how you might use &lt;code&gt;curl&lt;/code&gt; to test your endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:3000/data &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Idempotency-Key: your-unique-key-here'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"name":"Test Resource"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repeat the request with the same &lt;code&gt;Idempotency-Key&lt;/code&gt; to see that it returns the same resource without creating a new one.&lt;/p&gt;

&lt;p&gt;The example above uses an in-memory object (idempotencyDB) to store idempotency keys and responses. For production use, replace this with a persistent storage solution, such as Redis, which is well-suited for this kind of key-value storage with expiry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing a Idempotency on the Client-Side
&lt;/h2&gt;

&lt;p&gt;The client-side example generates keys using timestamps for simplicity. In a real application, you might want to use a more robust method, such as UUIDs, to ensure uniqueness across requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  Axios Interceptors
&lt;/h3&gt;

&lt;p&gt;If you're using Axios in a JavaScript application, you can add an interceptor to attach an idempotency key to certain requests.&lt;br&gt;
&lt;/p&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;axios&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;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Create or use an existing Axios instance&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;interceptors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;request&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;config&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;// Add an idempotency key header to POST requests&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;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;post&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;// This is a simplistic approach for generating keys&lt;/span&gt;
        &lt;span class="c1"&gt;// Consider a more robust method for key generation&lt;/span&gt;
        &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Idempotency-Key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`idemp-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;error&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;return&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Example of using the Axios instance to make a POST request&lt;/span&gt;
&lt;span class="nx"&gt;instance&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;http://localhost:3000/data&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Test&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;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;loPg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&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="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Global Interceptors for &lt;code&gt;fetch&lt;/code&gt; and &lt;code&gt;XMLHttpRequest&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Achieving idempotency without changing existing code requires intercepting global HTTP requests. Here's how you can override the &lt;code&gt;fetch&lt;/code&gt; API and &lt;code&gt;XMLHttpRequest&lt;/code&gt; to automatically include an idempotency key in every request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Overriding the Fetch API
&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;originalFetch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;init&lt;/span&gt; &lt;span class="o"&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;init&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&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="nx"&gt;init&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Idempotency-Key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`idemp-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;originalFetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;init&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;
  
  
  Overriding the XMLHttpRequest
&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;originalOpen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;XMLHttpRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;open&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;XMLHttpRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;open&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;readystatechange&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readyState&lt;/span&gt; &lt;span class="o"&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setRequestHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Idempotency-Key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`idemp-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&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="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;originalOpen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&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;These interceptors ensure that every outgoing HTTP request, whether made via &lt;code&gt;fetch&lt;/code&gt; or &lt;code&gt;XMLHttpRequest&lt;/code&gt;, includes a unique idempotency key, improving the robustness and reliability of your application without requiring changes to existing request-making code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Considerations for Production
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Persistence&lt;/strong&gt;: Use a persistent storage system like Redis, which is well-suited for this kind of key-value storage and has built-in expiration capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleanup&lt;/strong&gt;: Implement a mechanism to clean up old keys to prevent the storage from growing indefinitely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Ensure that idempotency keys are securely generated and stored, and consider any privacy implications of storing request data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Monitor the performance impact of your idempotency mechanism, especially how it handles storage operations and response caching.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Implementing idempotency in your RESTful services is a best practice that can significantly enhance the reliability and consistency of your application. By using idempotency keys and implementing server-side middleware in Node.js, along with client-side interceptors, you can ensure that your services handle repeated requests gracefully, providing a better experience for your users.&lt;/p&gt;

</description>
      <category>rest</category>
      <category>idempotent</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Docker Learning Path - learn from best YouTube videos</title>
      <dc:creator>Vikas Prabhu</dc:creator>
      <pubDate>Tue, 20 Jun 2023 15:22:23 +0000</pubDate>
      <link>https://dev.to/prabhuvikas/docker-learning-path-learn-from-best-youtube-videos-2d77</link>
      <guid>https://dev.to/prabhuvikas/docker-learning-path-learn-from-best-youtube-videos-2d77</guid>
      <description>&lt;h3&gt;
  
  
  Install Docker
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Install Docker on your system by following the official Docker documentation for your specific operating system.&lt;/li&gt;
&lt;li&gt;YouTube link: &lt;a href="https://www.youtube.com/watch?v=lcYiJGtd2gc"&gt;How to Install Docker on Windows 10&lt;/a&gt; | &lt;a href="https://www.youtube.com/watch?v=mbSsh40_8WM"&gt;Install Docker on macOS&lt;/a&gt; | &lt;a href="https://www.youtube.com/watch?v=1_vnPyR4mX4"&gt;Install Docker on Ubuntu&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Docker Basics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Learn the basic concepts of Docker, such as containers, images, and Dockerfile.&lt;/li&gt;
&lt;li&gt;YouTube link: &lt;a href="https://www.youtube.com/watch?v=fqMOX6JJhGo"&gt;Docker Tutorial for Beginners - Full Course&lt;/a&gt; (9M+ views)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Working with Docker Images
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Understand how to pull, build, and push Docker images.&lt;/li&gt;
&lt;li&gt;YouTube link: &lt;a href="https://www.youtube.com/watch?v=3c-iBn73dDE"&gt;Docker Images Explained with Examples&lt;/a&gt; (1.4M+ views)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Docker Containers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Explore how to run, manage, and interact with Docker containers.&lt;/li&gt;
&lt;li&gt;YouTube link: &lt;a href="https://www.youtube.com/watch?v=JprTjTViaEA"&gt;Docker Tutorial - Running Containers&lt;/a&gt; (3.2M+ views)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Docker Compose
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Learn how to define and manage multi-container applications using Docker Compose.&lt;/li&gt;
&lt;li&gt;YouTube link: &lt;a href="https://www.youtube.com/watch?v=1SaMdx9B05w"&gt;Docker Compose in 5 Minutes&lt;/a&gt; (1.7M+ views)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Docker Networking
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Understand how to connect containers, expose ports, and work with network configurations in Docker.&lt;/li&gt;
&lt;li&gt;YouTube link: &lt;a href="https://www.youtube.com/watch?v=Vyp5_F42NGs"&gt;Docker Networking Basics&lt;/a&gt; (480K+ views)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Docker Volumes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Explore Docker volumes and how to persist data between containers.&lt;/li&gt;
&lt;li&gt;YouTube link: &lt;a href="https://www.youtube.com/watch?v=p2PH_YPCsis"&gt;Docker Volumes Explained with Examples&lt;/a&gt; (209K+ views)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dockerizing an Application
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Learn how to containerize an application by creating a Dockerfile and building an image.&lt;/li&gt;
&lt;li&gt;YouTube link: &lt;a href="https://www.youtube.com/watch?v=hP77Rua1E0c"&gt;Dockerize Your App in 5 Minutes&lt;/a&gt; (380K+ views)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Docker Registry
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Set up a private Docker registry to store and distribute Docker images.&lt;/li&gt;
&lt;li&gt;YouTube link: &lt;a href="https://www.youtube.com/watch?v=0UOIj32ZPzU"&gt;Creating Your Own Docker Registry&lt;/a&gt; (180K+ views)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Docker Swarm (Optional)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;If you're interested in orchestration, learn how to create a Docker Swarm cluster and deploy services.&lt;/li&gt;
&lt;li&gt;YouTube link: &lt;a href="https://www.youtube.com/watch?v=Qs4dX7SH7FE"&gt;Docker Swarm - Introduction and Demo&lt;/a&gt; (310K+ views)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>docker</category>
      <category>basics</category>
      <category>videos</category>
    </item>
    <item>
      <title>WSL 2.0 - Linux On Windows 10</title>
      <dc:creator>Vikas Prabhu</dc:creator>
      <pubDate>Tue, 20 Jun 2023 15:09:39 +0000</pubDate>
      <link>https://dev.to/prabhuvikas/wsl-20-linux-on-windows-10-4gae</link>
      <guid>https://dev.to/prabhuvikas/wsl-20-linux-on-windows-10-4gae</guid>
      <description>

&lt;p&gt;Have kept this article simple and to the point , please share you feedback and love &amp;lt;3&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Run all commands in Windows PowerShell with admin rights&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Enabling the Virtual Machine Platform
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;dism.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/enable-feature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/featurename:VirtualMachinePlatform&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/all&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/norestart&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Enabling the Windows Subsystem for Linux
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;dism.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/enable-feature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/featurename:Microsoft-Windows-Subsystem-Linux&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/all&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/norestart&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Restart the machine even if it was mentioned /norestart&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After restart reopen powershell with admin rights&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set default WSL version to 2.0&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--set-default-version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;It will give you upgrade message like this
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WSL 2 requires an update to its kernel component. For information please visit https://aka.ms/wsl2kernel
For information on key differences with WSL 2 please visit https://aka.ms/wsl2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Download the standalone update from this &lt;a href="https://docs.microsoft.com/en-us/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package"&gt;&lt;strong&gt;site&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Install the update by double click&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Search for &lt;strong&gt;Ubuntu 20 LTS&lt;/strong&gt; from app store&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After installation you should be able to see ubuntu in the start menu&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clicking it will open a bash shell&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;All your windows drives will be under &lt;strong&gt;/mnt/&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Search for &lt;strong&gt;Windows Terminal&lt;/strong&gt; from app store for better terminal experience&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upgrade your shell to ZSH (not mandatory but just for the love of ZSH)&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>wsl2</category>
      <category>windows10</category>
      <category>linux</category>
    </item>
    <item>
      <title>Python : Virtual Environment + requirments.txt</title>
      <dc:creator>Vikas Prabhu</dc:creator>
      <pubDate>Tue, 20 Jun 2023 15:01:46 +0000</pubDate>
      <link>https://dev.to/prabhuvikas/python-virtual-environment-requirmentstxt-20cg</link>
      <guid>https://dev.to/prabhuvikas/python-virtual-environment-requirmentstxt-20cg</guid>
      <description>&lt;p&gt;Python projects must always be developed in isolated environments or virtual environment so that all our dependencies are locked to that single project only.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;requirements.txt&lt;/code&gt; in Python is &lt;code&gt;package.json&lt;/code&gt; of NodeJS&lt;/p&gt;

&lt;p&gt;It contains all the packages required for running the python project.&lt;/p&gt;

&lt;p&gt;Lets see how we can create a virtual environment in Python and generate a &lt;code&gt;requirements.txt&lt;/code&gt; file&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating &amp;amp; Managing Virtual Environment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Install
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;virtualenv&lt;/code&gt; is a tool to create isolated environment in Python. Install this tool using &lt;code&gt;apt-get&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;fire the following command on bash terminal&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="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;python3-venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Initialize
&lt;/h3&gt;

&lt;p&gt;traverse to the project folder and run the following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;virtualenv venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;this creates a copy of Python in whichever directory you ran the command in, placing it in a folder named &lt;code&gt;venv&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Activate
&lt;/h3&gt;

&lt;p&gt;to begin using the virtual environment, it needs to be activated using the following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;install any new modules without affecting system default Python or other virtual environments using pip/pip3&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="nv"&gt;$ &lt;/span&gt;pip3 &lt;span class="nb"&gt;install &lt;/span&gt;numpy scipy matplotlib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;these packages will be installed in the project folder only under &lt;code&gt;venv&lt;/code&gt; folder&lt;/p&gt;

&lt;p&gt;now we can generate &lt;code&gt;requirements.txt&lt;/code&gt; using following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;pip3 freeze &lt;span class="nt"&gt;--local&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--local&lt;/code&gt; argument ensures only virtual environment packages are written to requirements.txt&lt;/p&gt;

&lt;h3&gt;
  
  
  Deactivate
&lt;/h3&gt;

&lt;p&gt;once your work is completed you stop the virtual environment&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="nv"&gt;$ &lt;/span&gt;deactivate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Delete
&lt;/h3&gt;

&lt;p&gt;There might be a case where you want to remove the virtual environment. You can simple do this my deleting the &lt;code&gt;venv&lt;/code&gt; folder.&lt;/p&gt;

</description>
      <category>python</category>
      <category>virtualenv</category>
    </item>
    <item>
      <title>Gitlab connect using SSH from Macbook</title>
      <dc:creator>Vikas Prabhu</dc:creator>
      <pubDate>Tue, 20 Jun 2023 14:56:12 +0000</pubDate>
      <link>https://dev.to/prabhuvikas/gitlab-connect-using-ssh-from-macbook-1h3o</link>
      <guid>https://dev.to/prabhuvikas/gitlab-connect-using-ssh-from-macbook-1h3o</guid>
      <description>&lt;p&gt;To connect GitLab from your MacBook, you can follow these step-by-step commands:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the Terminal application on your MacBook. You can find it in the "Utilities" folder within the "Applications" folder or use the Spotlight search to find it quickly.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure your Git identity by running the following commands:&lt;br&gt;
&lt;/p&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;"Your Name"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"your.email@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Replace "Your Name" with your actual name and "&lt;a href="//mailto:your.email@example.com"&gt;your.email@example.com&lt;/a&gt;" with your email address. These commands set your global Git configuration, which will be used for all your repositories.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Generate an SSH key pair by running the following command:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"your.email@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;This command generates an Ed25519 type SSH key pair. When prompted for a file to save the key, you can press Enter to accept the default location (&lt;code&gt;~/.ssh/id_ed25519&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start the SSH agent by running the following command:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;ssh-agent &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add your private key to the SSH agent by running the following command:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-add ~/.ssh/id_ed25519
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;If you saved your key with a different filename or location, adjust the command accordingly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy your public key to the clipboard by running the following command:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pbcopy &amp;lt; ~/.ssh/id_ed25519.pub
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;This command copies the contents of your public key to the clipboard.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Log in to your GitLab account in a web browser.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Navigate to your GitLab account settings and find the "SSH Keys" section.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on "Add SSH Key" or a similar button.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Paste the public key from your clipboard into the "Key" field.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide a title for the key (e.g., "MacBook SSH Key").&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on "Add Key" or a similar button to save the SSH key in your GitLab account.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now you have successfully connected GitLab from your MacBook. You can clone repositories, push changes, and interact with GitLab using the Git commands in the Terminal. Remember to adjust the repository URLs in the Git commands to match the repository you want to work with.&lt;/p&gt;

</description>
      <category>git</category>
      <category>gitlab</category>
      <category>ssh</category>
    </item>
  </channel>
</rss>
