<?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: Kb Bohara</title>
    <description>The latest articles on DEV Community by Kb Bohara (@thekbbohara).</description>
    <link>https://dev.to/thekbbohara</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%2F1128450%2F2d01e912-057e-407f-be29-d7e596ba4ab4.jpeg</url>
      <title>DEV Community: Kb Bohara</title>
      <link>https://dev.to/thekbbohara</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thekbbohara"/>
    <language>en</language>
    <item>
      <title>Create SMTP server 101</title>
      <dc:creator>Kb Bohara</dc:creator>
      <pubDate>Sun, 04 May 2025 13:15:35 +0000</pubDate>
      <link>https://dev.to/thekbbohara/create-smtp-server-101-5p5</link>
      <guid>https://dev.to/thekbbohara/create-smtp-server-101-5p5</guid>
      <description>&lt;p&gt;Setting Up a Secure SMTP/IMAP Server on Ubuntu with Postfix, OpenDKIM &amp;amp; Dovecot&lt;/p&gt;

&lt;p&gt;This guide walks you through building your own mail server at mail.thekbbohara.xyz on Ubuntu. You'll configure DNS in Cloudflare, obtain TLS certificates, set up Postfix for SMTP, OpenDKIM for signing, and Dovecot for IMAP/POP3.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prerequisites&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;VPS with Ubuntu (20.04+).&lt;/p&gt;

&lt;p&gt;Domain thekbbohara.xyz, managed in Cloudflare.&lt;/p&gt;

&lt;p&gt;Root or sudo access via SSH (ssh &lt;a href="mailto:root@91.99.29.246"&gt;root@91.99.29.246&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Basic Linux command‑line familiarity.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DNS Configuration in Cloudflare&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Add the following records in your Cloudflare dashboard for the zone thekbbohara.xyz. For each record, set Proxy status to DNS only (gray cloud), not orange.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A Record&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;`Type: A&lt;/p&gt;

&lt;p&gt;Name: @&lt;/p&gt;

&lt;p&gt;IPv4 address: 91.99.29.246&lt;/p&gt;

&lt;p&gt;TTL: Auto&lt;/p&gt;

&lt;p&gt;Proxy status: DNS only (gray cloud)`&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A Record&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;`Type: A&lt;/p&gt;

&lt;p&gt;Name: mail&lt;/p&gt;

&lt;p&gt;IPv4 address: 91.99.29.246&lt;/p&gt;

&lt;p&gt;TTL: Auto&lt;/p&gt;

&lt;p&gt;Proxy status: DNS only (gray cloud)`&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;MX Record&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;`Type: MX&lt;/p&gt;

&lt;p&gt;Name: @&lt;/p&gt;

&lt;p&gt;Mail server: mail.thekbbohara.xyz&lt;/p&gt;

&lt;p&gt;Priority: 10&lt;/p&gt;

&lt;p&gt;TTL: Auto&lt;/p&gt;

&lt;p&gt;Proxy status: n/a`&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SPF Record&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;`Type: TXT&lt;/p&gt;

&lt;p&gt;Name: @&lt;/p&gt;

&lt;p&gt;Content: v=spf1 a:mail.thekbbohara.xyz -all&lt;/p&gt;

&lt;p&gt;TTL: Auto&lt;/p&gt;

&lt;p&gt;Proxy status: DNS only (gray cloud)`&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DKIM Record (after key generation)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;`Type: TXT&lt;/p&gt;

&lt;p&gt;Name: default._domainkey&lt;/p&gt;

&lt;p&gt;Content: v=DKIM1; k=rsa; p=YOUR_PUBLIC_KEY&lt;/p&gt;

&lt;p&gt;TTL: Auto&lt;/p&gt;

&lt;p&gt;Proxy status: DNS only (gray cloud)`&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DMARC Record&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;`Type: TXT&lt;/p&gt;

&lt;p&gt;Name: _dmarc&lt;/p&gt;

&lt;p&gt;Content: v=DMARC1; p=none; rua=mailto:&lt;a href="mailto:postmaster@thekbbohara.xyz"&gt;postmaster@thekbbohara.xyz&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TTL: Auto&lt;/p&gt;

&lt;p&gt;Proxy status: DNS only (gray cloud)`&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install &amp;amp; Configure Postfix&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Install&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt update&lt;br&gt;
sudo apt install -y postfix&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;During install, choose Internet Site, System mail name=thekbbohara.xyz.&lt;/p&gt;

&lt;p&gt;Configure /etc/postfix/main.cf – key settings:&lt;/p&gt;

&lt;p&gt;`myhostname = mail.thekbbohara.xyz&lt;br&gt;
mydomain   = thekbbohara.xyz&lt;br&gt;
myorigin   = $mydomain&lt;br&gt;
inet_interfaces = all&lt;br&gt;
mydestination   = $myhostname, localhost.$mydomain, localhost&lt;br&gt;
relayhost       =&lt;/p&gt;

&lt;h1&gt;
  
  
  Milter (OpenDKIM)
&lt;/h1&gt;

&lt;p&gt;smtpd_milters = inet:localhost:12345&lt;br&gt;
non_smtpd_milters = $smtpd_milters&lt;/p&gt;

&lt;h1&gt;
  
  
  TLS (letsencrypt paths)
&lt;/h1&gt;

&lt;p&gt;smtpd_tls_cert_file=/etc/letsencrypt/live/mail.thekbbohara.xyz/fullchain.pem&lt;br&gt;
smtpd_tls_key_file=/etc/letsencrypt/live/mail.thekbbohara.xyz/privkey.pem&lt;br&gt;
smtpd_use_tls=yes&lt;br&gt;
smtpd_tls_security_level = may&lt;br&gt;
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache&lt;br&gt;
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache`&lt;/p&gt;

&lt;p&gt;Reload&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo systemctl reload postfix&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Obtain TLS Certificates with Certbot&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Open port 80&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo ufw allow 80/tcp&lt;br&gt;
sudo ufw reload&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Install Certbot &amp;amp; run&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt install -y certbot&lt;br&gt;
sudo systemctl stop postfix&lt;br&gt;
sudo certbot certonly --standalone -d mail.thekbbohara.xyz --agree-tos --email postmaster@thekbbohara.xyz --non-interactive&lt;/code&gt;&lt;br&gt;
&lt;code&gt;sudo systemctl start postfix&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Verify&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ls /etc/letsencrypt/live/mail.thekbbohara.xyz/&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  cert.pem  chain.pem  fullchain.pem  privkey.pem
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Setup OpenDKIM for DKIM Signing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Install&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt install -y opendkim opendkim-tools&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Create user/group&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo groupadd --system opendkim&lt;br&gt;
sudo useradd  --system --gid opendkim --home /var/run/opendkim --shell /usr/sbin/nologin opendkim&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Generate keys&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo mkdir -p /etc/opendkim/keys/thekbbohara.xyz&lt;br&gt;
cd /etc/opendkim/keys/thekbbohara.xyz&lt;br&gt;
sudo opendkim-genkey -r -b 2048 -d thekbbohara.xyz -s default&lt;br&gt;
sudo chown opendkim:opendkim default.private&lt;br&gt;
sudo chmod 600 default.private&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Publish DNS record:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cat default.txt&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Copy the v=DKIM1;...p=... string into Cloudflare as TXT under default._domainkey.&lt;/p&gt;

&lt;p&gt;Configure /etc/opendkim.conf&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Domain    thekbbohara.xyz&lt;br&gt;
KeyFile   /etc/opendkim/keys/thekbbohara.xyz/default.private&lt;br&gt;
Selector  default&lt;br&gt;
Socket    inet:12345@localhost&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Enable socket in /etc/default/opendkim:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SOCKET="inet:12345@localhost"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Restart services&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo systemctl enable --now opendkim&lt;br&gt;
sudo systemctl reload postfix&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Test key&lt;/p&gt;

&lt;p&gt;&lt;code&gt;opendkim-testkey -d thekbbohara.xyz -s default -vv&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  should report "key OK"
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Enable SMTPS (Implicit TLS on Port 465)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Edit /etc/postfix/master.cf and uncomment the smtps block:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;smtps     inet  n       -       n       -       -       smtpd&lt;br&gt;
  -o syslog_name=postfix/smtps&lt;br&gt;
  -o smtpd_tls_wrappermode=yes&lt;br&gt;
  -o smtpd_sasl_auth_enable=yes&lt;br&gt;
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Reload Postfix&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo systemctl reload postfix&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Open firewall&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo ufw allow 465/tcp&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Verify&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo ss -tulpn | grep ':465'&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure Dovecot for IMAP/POP3&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Install&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt install -y dovecot-imapd dovecot-pop3d dovecot-lmtpd&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Mail location (/etc/dovecot/conf.d/10-mail.conf):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mail_location = maildir:~/Maildir&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Authentication socket (/etc/dovecot/conf.d/10-master.conf):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;service auth {&lt;br&gt;
  unix_listener /var/spool/postfix/private/auth {&lt;br&gt;
    mode = 0660&lt;br&gt;
    user = postfix&lt;br&gt;
    group = postfix&lt;br&gt;
  }&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;SSL config (/etc/dovecot/conf.d/10-ssl.conf):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ssl = required&lt;br&gt;
ssl_cert = &amp;lt;/etc/letsencrypt/live/mail.thekbbohara.xyz/fullchain.pem&lt;br&gt;
ssl_key  = &amp;lt;/etc/letsencrypt/live/mail.thekbbohara.xyz/privkey.pem&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Enable &amp;amp; start&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo systemctl enable --now dovecot&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Open ports&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo ufw allow 143/tcp  # IMAP&lt;br&gt;
sudo ufw allow 993/tcp  # IMAPS&lt;br&gt;
sudo ufw allow 110/tcp  # POP3&lt;br&gt;
sudo ufw allow 995/tcp  # POP3S&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Testing &amp;amp; Verification&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;SMTP STARTTLS handshake&lt;/p&gt;

&lt;p&gt;&lt;code&gt;openssl s_client -starttls smtp -connect mail.thekbbohara.xyz:25 -crlf &amp;lt;&amp;lt;&amp;lt; "EHLO test\r\nQUIT"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;SMTPS implicit TLS&lt;/p&gt;

&lt;p&gt;&lt;code&gt;openssl s_client -connect mail.thekbbohara.xyz:465 -crlf &amp;lt;&amp;lt;&amp;lt; "QUIT"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Send a test email&lt;/p&gt;

&lt;p&gt;&lt;code&gt;swaks --to you@domain.com --from noreply@thekbbohara.xyz --server mail.thekbbohara.xyz --port 465 --auth LOGIN --auth-user noreply --auth-password YOUR_PASS --tls&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Check mail queue&lt;/p&gt;

&lt;p&gt;&lt;code&gt;postqueue -p&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Verify reception&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ls ~/Maildir/new&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Inspect spam score&lt;/p&gt;

&lt;p&gt;Send to mail‑tester.com and aim for ≥10/10.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Troubleshooting&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;bad field count in master.cf → Ensure each service line has exactly 7 columns before options.&lt;/p&gt;

&lt;p&gt;ECONNREFUSED on 465 → Check smtps block in master.cf, reload Postfix, open firewall.&lt;/p&gt;

&lt;p&gt;DKIM_INVALID → Re-generate keys, republish DNS, test with opendkim-testkey.&lt;/p&gt;

&lt;p&gt;Spam placement → PTR alignment, SPF/DKIM/DMARC, warm up IP, request delisting.&lt;/p&gt;

&lt;p&gt;Congratulations! You’ve built a fully functional, secure, and authenticated mail server. 🎉&lt;/p&gt;

</description>
      <category>smtp</category>
      <category>postfix</category>
      <category>opendkim</category>
      <category>dovecot</category>
    </item>
    <item>
      <title>Types of Brand Name</title>
      <dc:creator>Kb Bohara</dc:creator>
      <pubDate>Sat, 08 Mar 2025 14:40:26 +0000</pubDate>
      <link>https://dev.to/thekbbohara/types-of-brand-name-4jjm</link>
      <guid>https://dev.to/thekbbohara/types-of-brand-name-4jjm</guid>
      <description>&lt;h1&gt;
  
  
  &lt;strong&gt;1. Eponymous&lt;/strong&gt;
&lt;/h1&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Named after a person or founder.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; Ford Motors (named after Henry Ford), Tesla (after Nikola Tesla), Disney (after Walt Disney).&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;2. Descriptive&lt;/strong&gt;
&lt;/h1&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Directly describing the product, service, or characteristic.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; General Motors (motors), Burger King (restaurant serving burgers).&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;3. Acronymic&lt;/strong&gt;
&lt;/h1&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Composed of initial letters from multiple words.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; IBM (International Business Machines), KFC (Kentucky Fried Chicken).&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;4.Suggestive&lt;/strong&gt;
&lt;/h1&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Suggesting a quality or benefit indirectly.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; Netflix (suggests internet-based movies), Fitbit (suggests fitness tracking).&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;5. Associative&lt;/strong&gt;
&lt;/h1&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Evokes symbolic or emotional connections
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Examples:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Amazon&lt;/strong&gt; (evokes vastness, diversity, and abundance).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nike&lt;/strong&gt; (named after the Greek goddess of victory, suggesting triumph and excellence).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple&lt;/strong&gt; (suggests simplicity, friendliness, and innovation).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;6.  Non-English&lt;/strong&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Examples:

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;SAMSUNG&lt;/em&gt;: 3 star in korean&lt;/li&gt;
&lt;li&gt;lego : Play well in denis&lt;/li&gt;
&lt;li&gt;Zappos: spanis
&lt;/li&gt;
&lt;li&gt;hulu: from chinese proverb&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;7. Abstract&lt;/strong&gt;
&lt;/h1&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invented words without intrinsic meaning
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Rolex&lt;/li&gt;
&lt;li&gt;Kodak&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>types</category>
      <category>brand</category>
      <category>name</category>
    </item>
    <item>
      <title>RTX 4090 vs RTX 5070 Ti vs RTX 5090 vs RTX 5080</title>
      <dc:creator>Kb Bohara</dc:creator>
      <pubDate>Wed, 26 Feb 2025 10:54:58 +0000</pubDate>
      <link>https://dev.to/thekbbohara/rtx-4090-vs-rtx-5070-ti-vs-rtx-5090-vs-rtx-5080-1f00</link>
      <guid>https://dev.to/thekbbohara/rtx-4090-vs-rtx-5070-ti-vs-rtx-5090-vs-rtx-5080-1f00</guid>
      <description>&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Specification&lt;/th&gt;
&lt;th&gt;RTX 4090&lt;/th&gt;
&lt;th&gt;RTX 5070 Ti&lt;/th&gt;
&lt;th&gt;RTX 5090&lt;/th&gt;
&lt;th&gt;RTX 5080&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ada Lovelace (AD102)&lt;/td&gt;
&lt;td&gt;Blackwell (GB203)&lt;/td&gt;
&lt;td&gt;Blackwell (GB202)&lt;/td&gt;
&lt;td&gt;Blackwell (GB203)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Process Node&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TSMC 4N (5nm)&lt;/td&gt;
&lt;td&gt;TSMC 4N (5nm)&lt;/td&gt;
&lt;td&gt;TSMC 4NP (4nm)&lt;/td&gt;
&lt;td&gt;TSMC 4N (5nm)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CUDA Cores&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16,384&lt;/td&gt;
&lt;td&gt;8,960&lt;/td&gt;
&lt;td&gt;21,760&lt;/td&gt;
&lt;td&gt;10,752&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tensor Cores&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;512 (4th Gen)&lt;/td&gt;
&lt;td&gt;280 (5th Gen)&lt;/td&gt;
&lt;td&gt;680 (5th Gen)&lt;/td&gt;
&lt;td&gt;336 (5th Gen)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RT Cores&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;128 (3rd Gen)&lt;/td&gt;
&lt;td&gt;70 (4th Gen)&lt;/td&gt;
&lt;td&gt;170 (4th Gen)&lt;/td&gt;
&lt;td&gt;84 (4th Gen)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Boost Clock&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2520 MHz&lt;/td&gt;
&lt;td&gt;2452 MHz&lt;/td&gt;
&lt;td&gt;2407 MHz&lt;/td&gt;
&lt;td&gt;2617 MHz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;24GB GDDR6X&lt;/td&gt;
&lt;td&gt;16GB GDDR7&lt;/td&gt;
&lt;td&gt;32GB GDDR7&lt;/td&gt;
&lt;td&gt;16GB GDDR7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory Bus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;384‑bit&lt;/td&gt;
&lt;td&gt;256‑bit&lt;/td&gt;
&lt;td&gt;512‑bit&lt;/td&gt;
&lt;td&gt;256‑bit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;21 Gbps&lt;/td&gt;
&lt;td&gt;28 Gbps&lt;/td&gt;
&lt;td&gt;30 Gbps&lt;/td&gt;
&lt;td&gt;30 Gbps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bandwidth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1008 GB/s&lt;/td&gt;
&lt;td&gt;896 GB/s&lt;/td&gt;
&lt;td&gt;1792 GB/s&lt;/td&gt;
&lt;td&gt;960 GB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TFLOPS (FP32)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;82.6&lt;/td&gt;
&lt;td&gt;43.9&lt;/td&gt;
&lt;td&gt;104.8&lt;/td&gt;
&lt;td&gt;~56.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TGP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;450W&lt;/td&gt;
&lt;td&gt;300W&lt;/td&gt;
&lt;td&gt;575W&lt;/td&gt;
&lt;td&gt;360W&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PCIe Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4.0 x16&lt;/td&gt;
&lt;td&gt;5.0 x16&lt;/td&gt;
&lt;td&gt;5.0 x16&lt;/td&gt;
&lt;td&gt;5.0 x16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DLSS Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DLSS 3&lt;/td&gt;
&lt;td&gt;DLSS 4&lt;/td&gt;
&lt;td&gt;DLSS 4&lt;/td&gt;
&lt;td&gt;DLSS 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Power Connectors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16‑pin (450W)&lt;/td&gt;
&lt;td&gt;8‑pin (300W)&lt;/td&gt;
&lt;td&gt;600W PCIe Gen5&lt;/td&gt;
&lt;td&gt;16‑pin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Release Date&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sept 2022&lt;/td&gt;
&lt;td&gt;Feb 2025&lt;/td&gt;
&lt;td&gt;Jan 2025&lt;/td&gt;
&lt;td&gt;Jan 30, 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MSRP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$1,599&lt;/td&gt;
&lt;td&gt;$749&lt;/td&gt;
&lt;td&gt;$1999&lt;/td&gt;
&lt;td&gt;$999&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
    </item>
    <item>
      <title>How to Expose Your Local MySQL Database to a Friend Using an EC2 Reverse SSH Tunnel baby.</title>
      <dc:creator>Kb Bohara</dc:creator>
      <pubDate>Tue, 25 Feb 2025 08:06:31 +0000</pubDate>
      <link>https://dev.to/thekbbohara/how-to-expose-your-local-mysql-database-to-a-friend-using-an-ec2-reverse-ssh-tunnel-baby-25f8</link>
      <guid>https://dev.to/thekbbohara/how-to-expose-your-local-mysql-database-to-a-friend-using-an-ec2-reverse-ssh-tunnel-baby-25f8</guid>
      <description>&lt;p&gt;When you want to share your local MySQL database with a friend but don’t have a public IP, you can use an EC2 instance as an intermediary. In this guide, I’ll walk you through how to set up a reverse SSH tunnel from your local machine (running MySQL) to your EC2 instance so your friend can access your database securely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you begin, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A Local Machine Running MySQL:&lt;br&gt;
Your local machine should have MySQL running (default port 3306).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An AWS EC2 Instance:&lt;br&gt;
The EC2 instance must have a public IP address. You’ll use this server to act as the gateway for your tunnel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SSH Access:&lt;br&gt;
You should be able to SSH into your EC2 instance from your local machine. Make sure your SSH keys are properly configured.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Basic Terminal and SSH Knowledge:&lt;br&gt;
Familiarity with command-line operations and SSH is required.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 1: Prepare Your EC2 Instance
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1.1. Configure the Security Group
&lt;/h4&gt;

&lt;p&gt;Log in to your AWS Management Console and navigate to your EC2 instance’s security group. Edit the inbound rules to allow traffic on a port that will be used for tunneling (e.g., port 3307).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Protocol: TCP&lt;/li&gt;
&lt;li&gt;Port Range: 3307&lt;/li&gt;
&lt;li&gt;Source: (Limit access to your friend’s IP or a safe range)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  1.2. Enable Gateway Ports
&lt;/h4&gt;

&lt;p&gt;By default, the SSH daemon on your EC2 instance might not allow remote hosts to connect to forwarded ports. To change this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SSH into your EC2 instance.&lt;/li&gt;
&lt;li&gt;Open the SSH configuration file:
&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;nano /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Find and update (or add) the following line:
&lt;/li&gt;
&lt;/ol&gt;

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

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Save the file and restart SSH:
&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;systemctl restart sshd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This change allows the tunnel to accept connections from any host.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Establish the Reverse SSH Tunnel from Your Local Machine
&lt;/h3&gt;

&lt;p&gt;On your local machine (where MySQL is running), set up a reverse SSH tunnel to forward a port on your EC2 instance to your local MySQL port.&lt;/p&gt;

&lt;p&gt;Run this command from your local terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-R&lt;/span&gt; 3307:localhost:3306 ec2-user@&amp;lt;EC2_PUBLIC_IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-R 3307:localhost:3306&lt;/code&gt;: This instructs SSH to forward port 3307 on the EC2 instance to port 3306 on your local machine.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ec2-user@&amp;lt;EC2_PUBLIC_IP&amp;gt;&lt;/code&gt;: Replace  with your EC2 instance’s public IP address and adjust ec2-user if your EC2 instance uses a different default username.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the command runs successfully, any connection to EC2_PUBLIC_IP on port 3307 will be forwarded to your local MySQL instance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tips for Persistence&lt;/strong&gt;&lt;br&gt;
To keep the tunnel alive even if the connection drops, consider using autossh. This tool automatically restarts your SSH session if it disconnects.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: Connect to MySQL Remotely
&lt;/h3&gt;

&lt;p&gt;Now, share these connection details with your friend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Host: &lt;/li&gt;
&lt;li&gt;Port: 3307&lt;/li&gt;
&lt;li&gt;MySQL Credentials: Your MySQL username and password
Your friend can now use any MySQL client (e.g., MySQL Workbench, command-line client) to connect using the above parameters. The traffic will be tunneled from the EC2 instance to your local machine securely.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, using the MySQL command-line client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysql &lt;span class="nt"&gt;-h&lt;/span&gt; &amp;lt;EC2_PUBLIC_IP&amp;gt; &lt;span class="nt"&gt;-P&lt;/span&gt; 3307 &lt;span class="nt"&gt;-u&lt;/span&gt; your_mysql_user &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security Considerations&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Use Strong Credentials:&lt;br&gt;
Ensure that your MySQL user has a strong password and only the required privileges.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Limit Access:&lt;br&gt;
Restrict the allowed IP addresses in your EC2 security group to trusted sources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Monitor Activity:&lt;br&gt;
Regularly check logs on both your EC2 instance and MySQL server to ensure there’s no unauthorized access.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Nextjs and next auth middleware baby.</title>
      <dc:creator>Kb Bohara</dc:creator>
      <pubDate>Sun, 23 Feb 2025 13:16:49 +0000</pubDate>
      <link>https://dev.to/thekbbohara/nextjs-and-next-auth-middleware-baby-183f</link>
      <guid>https://dev.to/thekbbohara/nextjs-and-next-auth-middleware-baby-183f</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getToken&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next-auth/jwt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;middleware&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="nx"&gt;NextRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getToken&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;req&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="na"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_AUTH_SECRET&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;pathname&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nextUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// If the user is logged in and they try to access /signin , /, redirect them away.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;unAuthorizedRouteOnly&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/signin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;unAuthorizedRouteOnly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pathname&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;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&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="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// If no token is found and they are not already on /signin or /, redirect to /signin.&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;unAuthorizedRouteOnly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signInUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/signin&lt;/span&gt;&lt;span class="dl"&gt;'&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="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;signInUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;callbackUrl&lt;/span&gt;&lt;span class="dl"&gt;'&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="nx"&gt;url&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;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;signInUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Allow the request to proceed if none of the above conditions are met.&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;matcher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/((?!api|_next/static|_next/image|favicon.ico).*)&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;



</description>
      <category>nextjs</category>
      <category>nextauth</category>
      <category>middleware</category>
      <category>authjs</category>
    </item>
    <item>
      <title>Custom socket.io server.ts in nextjs baby.</title>
      <dc:creator>Kb Bohara</dc:creator>
      <pubDate>Wed, 19 Feb 2025 08:49:16 +0000</pubDate>
      <link>https://dev.to/thekbbohara/custom-socketio-serverts-in-nextjs-baby-50fi</link>
      <guid>https://dev.to/thekbbohara/custom-socketio-serverts-in-nextjs-baby-50fi</guid>
      <description>&lt;ol&gt;
&lt;li&gt;Create a server.ts file in root dir of your nextjs project.
&lt;code&gt;vim server.ts&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createServer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;parse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;production&lt;/span&gt;&lt;span class="dl"&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;next&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;dev&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;handle&lt;/span&gt; &lt;span class="o"&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;getRequestHandler&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;prepare&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="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;httpServer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;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;parsedUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="o"&gt;!&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="nf"&gt;handle&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;parsedUrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="nx"&gt;httpServer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;`&amp;gt; Server listening at http://localhost:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; as &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;development&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;For socket.io.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;&lt;code&gt;pnpm add socket.io socket.io-client&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;code&gt;vim server.ts&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;imports&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Server&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;socket.io&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;httpServer&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;io&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;httpServer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// options&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;socket&lt;/span&gt; &lt;span class="nx"&gt;stuff&lt;/span&gt;
&lt;span class="nx"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;connect&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Socket connected&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="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="s2"&gt;msg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;msg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;rest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;package.json&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;&lt;code&gt;pnpm add cross-env&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;code&gt;pnpm add ts-node -D&lt;/code&gt;&lt;/em&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="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"module"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"scripts"&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;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nodemon"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"next build &amp;amp;&amp;amp; tsc --project tsconfig.server.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cross-env NODE_ENV=production node dist/server.js"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4.tsconfig-server.json&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="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./tsconfig.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compilerOptions"&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;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"es2015"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"outDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dist"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lib"&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="s2"&gt;"es2019"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"es2019"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"isolatedModules"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"noEmit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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;"include"&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="s2"&gt;"server.ts"&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;ol&gt;
&lt;li&gt;app/page.tsx (whatever)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@/components/ui/button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;io&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Socket&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;socket.io-client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Home&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;socketRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Socket&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&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;socketRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;io&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ws://localhost: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;span class="na"&gt;reconnectionDelayMax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="c1"&gt;// Cleanup the socket connection on unmount&lt;/span&gt;
    &lt;span class="k"&gt;return &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;socketRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSend&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;socketRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;msg&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;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;b&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;c&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="nx"&gt;socketRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&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="s2"&gt;msg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="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="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSend&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Send&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>nextjs</category>
      <category>websocket</category>
      <category>approuter</category>
      <category>customserver</category>
    </item>
    <item>
      <title>How to Change / Update the Kernel in Linux (systemd-boot) baby</title>
      <dc:creator>Kb Bohara</dc:creator>
      <pubDate>Mon, 17 Feb 2025 14:29:04 +0000</pubDate>
      <link>https://dev.to/thekbbohara/how-to-change-update-the-kernel-linux-systemd-boot-baby-2hn9</link>
      <guid>https://dev.to/thekbbohara/how-to-change-update-the-kernel-linux-systemd-boot-baby-2hn9</guid>
      <description>&lt;p&gt;Arch Linux provides multiple kernel options, and with &lt;strong&gt;systemd-boot&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1️⃣ Check Your Current Kernel&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before switching kernels, verify which kernel you're using:&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="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;
&lt;span class="c"&gt;# output: 6.13.2-arch1-1&lt;/span&gt;
&lt;span class="c"&gt;# This means you are running the **latest Arch Linux kernel**.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;2️⃣ Install a New Kernel&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Arch Linux offers various kernel options:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kernel Type&lt;/th&gt;
&lt;th&gt;Package Name&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Latest Stable Kernel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;linux&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default, rolling release&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LTS (Long-Term Support)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;linux-lts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;More stable, recommended for production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hardened Kernel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;linux-hardened&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Security-focused&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zen Kernel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;linux-zen&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Performance optimized&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Install the LTS Kernel&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you prefer a more stable setup:&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="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; linux-lts linux-lts-headers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Other Kernel Options&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hardened Kernel:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; linux-hardened
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zen Kernel:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; linux-zen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;3️⃣ Verify Kernel Installation&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Once installed, check if the new kernel appears in &lt;code&gt;/boot&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;You should see files like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; EFI                            initramfs-linux-lts-fallback.img   initramfs-linux.img   vmlinuz-linux
 initramfs-linux-fallback.img   initramfs-linux-lts.img            loader                vmlinuz-linux-lts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;4️⃣ Configure systemd-boot&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;🔹 Check Available Boot Entries&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; /boot/loader/entries/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arch.conf 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;arch-lts.conf&lt;/code&gt; is missing, you need to create it.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;🔹 Create a Boot Entry for Linux-LTS&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Manually create the entry file&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;vim /boot/loader/entries/arch-lts.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add the following content&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   title   Arch Linux LTS
   linux   /vmlinuz-linux-lts
   initrd  /initramfs-linux-lts.img
   options root=UUID=&amp;lt;your-root-partition-uuid&amp;gt; rw quiet splash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Find your root partition UUID&lt;/strong&gt; using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   lsblk &lt;span class="nt"&gt;-o&lt;/span&gt; NAME,MOUNTPOINTS,UUID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Save and exit&lt;/strong&gt; &lt;code&gt;esc:wq&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;5️⃣ Set Default Kernel (Optional)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you want &lt;strong&gt;linux-lts&lt;/strong&gt; to be the default kernel:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open systemd-boot loader config:
&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;vim /boot/loader/loader.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Change the &lt;strong&gt;default entry&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   default arch-lts.conf
   timeout 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Save the file and reboot.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;6️⃣ Reboot &amp;amp; Select Kernel&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Restart your system:&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="nb"&gt;sudo &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the &lt;strong&gt;systemd-boot menu&lt;/strong&gt;, you should now see &lt;strong&gt;Arch Linux LTS&lt;/strong&gt; listed. Select it to boot.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;7️⃣ Verify the Running Kernel&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;After booting, check if you're using the new kernel:&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="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you installed &lt;strong&gt;linux-lts&lt;/strong&gt;, the output should be something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;6.12.x-lts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;8️⃣ Remove Old Kernel (Optional)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you no longer need the old kernel:&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="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-R&lt;/span&gt; linux
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then update systemd-boot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bootctl update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>linux</category>
      <category>kernel</category>
      <category>systemd</category>
      <category>boot</category>
    </item>
    <item>
      <title>nvm best tutorial baby</title>
      <dc:creator>Kb Bohara</dc:creator>
      <pubDate>Sun, 16 Feb 2025 08:27:21 +0000</pubDate>
      <link>https://dev.to/thekbbohara/nvm-best-tutorial-baby-4b1e</link>
      <guid>https://dev.to/thekbbohara/nvm-best-tutorial-baby-4b1e</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yay &lt;span class="nt"&gt;-S&lt;/span&gt; nvm &lt;span class="c"&gt;# For arch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;For rest of the distro idc, go figure out yourself.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm &lt;span class="nb"&gt;install&lt;/span&gt; &amp;lt;version&amp;gt; &lt;span class="c"&gt;# install version.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm use &amp;lt;version&amp;gt; &lt;span class="c"&gt;# use installed version.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>NVIDIA RTX 4090 vs. RTX 5090: Deep Dive for AI Training</title>
      <dc:creator>Kb Bohara</dc:creator>
      <pubDate>Fri, 14 Feb 2025 11:38:18 +0000</pubDate>
      <link>https://dev.to/thekbbohara/nvidia-rtx-4090-vs-rtx-5090-deep-dive-for-ai-training-3gjn</link>
      <guid>https://dev.to/thekbbohara/nvidia-rtx-4090-vs-rtx-5090-deep-dive-for-ai-training-3gjn</guid>
      <description>&lt;h3&gt;
  
  
  &lt;em&gt;Gemini: Deep Research Summary&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;The rise of AI workloads has driven demand for powerful GPUs. This analysis compares NVIDIA's &lt;strong&gt;RTX 4090&lt;/strong&gt; and &lt;strong&gt;RTX 5090&lt;/strong&gt;, focusing on specs, benchmarks, and real-world AI performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Key Differences&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;RTX 4090&lt;/th&gt;
&lt;th&gt;RTX 5090&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ada Lovelace&lt;/td&gt;
&lt;td&gt;Blackwell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CUDA Cores&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16,384&lt;/td&gt;
&lt;td&gt;21,760&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tensor Cores&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;512&lt;/td&gt;
&lt;td&gt;680&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GDDR6X&lt;/td&gt;
&lt;td&gt;GDDR7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory Capacity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;24GB&lt;/td&gt;
&lt;td&gt;32GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory Bandwidth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,008 GB/s&lt;/td&gt;
&lt;td&gt;1,792 GB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Power Usage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;450W&lt;/td&gt;
&lt;td&gt;575W&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;RTX 5090&lt;/strong&gt; outperforms the &lt;strong&gt;4090&lt;/strong&gt; with more CUDA and Tensor Cores, faster GDDR7 memory, and improved efficiency, crucial for AI tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Benchmark Comparison&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;RTX 4090&lt;/th&gt;
&lt;th&gt;RTX 5090&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ResNet50 (FP16, Images/sec)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;379&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BERT Fine-tuning (Tokens/sec)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;297&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;General AI Speedup (4K)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;+36%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Image Gen (FP8)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;+75%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Image Gen (FP4)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;4x faster&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;RTX 5090&lt;/strong&gt; delivers a &lt;strong&gt;28-36% boost in ML tasks&lt;/strong&gt; and up to &lt;strong&gt;4x speedup in AI image generation&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;DLSS 4 &amp;amp; AI Benefits&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;DLSS 4 introduces &lt;strong&gt;Multi Frame Generation (MFG)&lt;/strong&gt;, enhancing AI-driven image and video processing.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pricing &amp;amp; Availability&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;GPU&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Availability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RTX 4090&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$1,600&lt;/td&gt;
&lt;td&gt;Widely available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RTX 5090&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$1,999+&lt;/td&gt;
&lt;td&gt;Limited stock, high demand&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Verdict&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RTX 5090&lt;/strong&gt;: Best for cutting-edge AI, higher performance, but expensive &amp;amp; hard to find.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RTX 4090&lt;/strong&gt;: Still powerful, more affordable, better availability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;For AI workloads, the &lt;strong&gt;RTX 5090 is the superior choice&lt;/strong&gt; but comes at a premium. The &lt;strong&gt;RTX 4090 remains a strong alternative&lt;/strong&gt; for those prioritizing cost and availability.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Redux toolkit basic setup baby.</title>
      <dc:creator>Kb Bohara</dc:creator>
      <pubDate>Wed, 12 Feb 2025 03:11:09 +0000</pubDate>
      <link>https://dev.to/thekbbohara/redux-toolkit-basic-setup-baby-1o4o</link>
      <guid>https://dev.to/thekbbohara/redux-toolkit-basic-setup-baby-1o4o</guid>
      <description>&lt;p&gt;You can setup your dir structure however you want.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;src
├ app
│ ├ layout.js
│ │ ├ redux
│ │ │ ├ provider.js
│ │ │ └ store
│ │ │   ├ index.js
│ │ │   └slices
│ │ │      └ userSlice.js
... other &lt;span class="nb"&gt;dirs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;slices/userSlice.js
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createSlice&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@reduxjs/toolkit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;initialState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="na"&gt;isLoggedIn&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userSlice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSlice&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;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;reducers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;setUser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&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;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;setIsLoggedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&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;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isLoggedIn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;payload&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;setUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIsLoggedIn&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;userSlice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;actions&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userReducer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;userSlice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reducer&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;userReducer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;store/index.js -&amp;gt; store.js
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;configureStore&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@reduxjs/toolkit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;userReducer&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./slices/userSlice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;configureStore&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userReducer&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;ul&gt;
&lt;li&gt;redux/provider.jsx
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="p"&gt;}&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="s2"&gt;react-redux&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="p"&gt;}&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="s2"&gt;./store&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;ReduxProvider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;store&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;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;ReduxProvider&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;app/layout.js
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;//other imports&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReduxProvider&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./redux/provider&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// ... other code&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;RootLayout&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&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="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'...'&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReduxProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;ReduxProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>SSH for GitHub Baby</title>
      <dc:creator>Kb Bohara</dc:creator>
      <pubDate>Sun, 09 Feb 2025 09:45:59 +0000</pubDate>
      <link>https://dev.to/thekbbohara/quick-guide-to-setting-up-ssh-for-github-3gi3</link>
      <guid>https://dev.to/thekbbohara/quick-guide-to-setting-up-ssh-for-github-3gi3</guid>
      <description>&lt;p&gt;&lt;strong&gt;Check for Existing SSH Keys&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-al&lt;/span&gt; ~/.ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Generate a New SSH Key&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   If no keys are found, generate one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa &lt;span class="nt"&gt;-b&lt;/span&gt; 4096 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"your_email@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Start the SSH Agent&lt;/strong&gt; (optional)&lt;br&gt;&lt;br&gt;
   &lt;strong&gt;Why?&lt;/strong&gt;: The agent manages your keys and prevents you from entering your passphrase every time.&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="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;/div&gt;



&lt;p&gt;&lt;strong&gt;Add SSH Key to Agent&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-add ~/.ssh/id_rsa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Copy the SSH Public Key&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_rsa.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Add the Key to GitHub&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to GitHub &amp;gt; Settings &amp;gt; SSH and GPG keys &amp;gt; &lt;strong&gt;New SSH key&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Paste the copied key.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Test SSH Connection&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-T&lt;/span&gt; git@github.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Update Git Remote URL&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote set-url origin git@github.com:uname/repo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Done! You're all set to use SSH with GitHub!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Install Arch with swapfile baby.</title>
      <dc:creator>Kb Bohara</dc:creator>
      <pubDate>Thu, 06 Feb 2025 19:19:44 +0000</pubDate>
      <link>https://dev.to/thekbbohara/install-arch-with-swapfile-baby-2kj9</link>
      <guid>https://dev.to/thekbbohara/install-arch-with-swapfile-baby-2kj9</guid>
      <description>&lt;p&gt;&lt;code&gt;Hi, let's get started with our install. Download the ISO and boot it however you want.&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Connect to WiFi
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Connect to your WiFi (replace &amp;lt;wifi_name&amp;gt; with your network)&lt;/span&gt;
iwctl station wlan0 connect &amp;lt;wifi_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Test the Connection
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ping a website to check connectivity&lt;/span&gt;
ping kbbohara.com.np
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Enable NTP
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Set network time protocol&lt;/span&gt;
timedatectl set-ntp &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Identify Your Disk
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List disks to identify your target disk (mine is /dev/sda)&lt;/span&gt;
lsblk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Partition the Disk
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Partition disk /dev/sda:&lt;/span&gt;
fdisk /dev/sda

&lt;span class="c"&gt;# Inside fdisk, input the following:&lt;/span&gt;
&lt;span class="c"&gt;#  g        -&amp;gt; Create a new GPT partition table&lt;/span&gt;
&lt;span class="c"&gt;#  n        -&amp;gt; Create new partition (EFI)&lt;/span&gt;
&lt;span class="c"&gt;#           -&amp;gt; Accept default partition number&lt;/span&gt;
&lt;span class="c"&gt;#           -&amp;gt; Accept default first sector&lt;/span&gt;
&lt;span class="c"&gt;#           -&amp;gt; Enter "+512M" for size&lt;/span&gt;
&lt;span class="c"&gt;#  n        -&amp;gt; Create new partition (Linux filesystem)&lt;/span&gt;
&lt;span class="c"&gt;#           -&amp;gt; Accept defaults to use the remaining space&lt;/span&gt;
&lt;span class="c"&gt;#  w        -&amp;gt; Write changes and exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Format the Partitions
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Format EFI partition as FAT32 and Linux partition as ext4&lt;/span&gt;
mkfs.fat &lt;span class="nt"&gt;-F32&lt;/span&gt; /dev/sda1
mkfs.ext4 /dev/sda2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Mount the Partitions
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Mount the Linux partition and create/mount the boot directory for EFI&lt;/span&gt;
mount /dev/sda2 /mnt
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /mnt/boot
mount /dev/sda1 /mnt/boot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8. Install Base Packages
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install base system, Linux kernel, firmware, and vim&lt;/span&gt;
pacstrap /mnt base linux linux-firmware vim
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  9. Generate fstab
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Generate filesystem table&lt;/span&gt;
genfstab &lt;span class="nt"&gt;-U&lt;/span&gt; /mnt &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /mnt/etc/fstab
&lt;span class="nb"&gt;cat&lt;/span&gt; /mnt/etc/fstab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  10. Change Root
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enter the new system environment&lt;/span&gt;
arch-chroot /mnt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  11. Create Swapfile
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create and activate a 16GB swapfile&lt;/span&gt;
fallocate &lt;span class="nt"&gt;-l&lt;/span&gt; 16GB /swapfile
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 /swapfile
mkswap /swapfile
swapon /swapfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  12. Add Swapfile to fstab
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Open fstab and add the swapfile entry at the end&lt;/span&gt;
vim /etc/fstab
&lt;span class="c"&gt;# Add: /swapfile none swap defaults 0 0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  13. Set Timezone &amp;amp; Clock
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Link timezone and sync hardware clock&lt;/span&gt;
&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; /usr/share/zoneinfo/Asia/Kathmandu /etc/localtime
hwclock &lt;span class="nt"&gt;--systohc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  14. Configure Locale
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Edit locale.gen to uncomment en_US.UTF-8 and generate locale&lt;/span&gt;
vim /etc/locale.gen
locale-gen
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"LANG=en_us.UTF-8"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/locale.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  15. Set Hostname
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Set hostname to "arch"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"arch"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/hostname
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  16. Configure Hosts File
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Edit /etc/hosts for proper hostname resolution&lt;/span&gt;
vim /etc/hosts
&lt;span class="c"&gt;# Add the following:&lt;/span&gt;
&lt;span class="c"&gt;# 127.0.0.1   localhost&lt;/span&gt;
&lt;span class="c"&gt;# ::1         localhost&lt;/span&gt;
&lt;span class="c"&gt;# 127.0.1.1   arch.localdomain arch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  17. Set Root Password
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Set the root password&lt;/span&gt;
passwd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  18. Install &amp;amp; Configure systemd-boot
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install systemd-boot on the EFI partition&lt;/span&gt;
bootctl &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Create loader configuration&lt;/span&gt;
vim /boot/loader/loader.conf
&lt;span class="c"&gt;# Add:&lt;/span&gt;
&lt;span class="c"&gt;# default  arch&lt;/span&gt;
&lt;span class="c"&gt;# timeout  3&lt;/span&gt;
&lt;span class="c"&gt;# editor   no&lt;/span&gt;

&lt;span class="c"&gt;# Create boot entry for Arch Linux&lt;/span&gt;
vim /boot/loader/entries/arch.conf
&lt;span class="c"&gt;# Add:&lt;/span&gt;
&lt;span class="c"&gt;# title   Arch Linux&lt;/span&gt;
&lt;span class="c"&gt;# linux   /vmlinuz-linux&lt;/span&gt;
&lt;span class="c"&gt;# initrd  /initramfs-linux.img&lt;/span&gt;
&lt;span class="c"&gt;# options root=UUID=&amp;lt;your-root-partition-UUID&amp;gt; rw&lt;/span&gt;
&lt;span class="c"&gt;# Get UUID: blkid /dev/sda2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  19. Install Additional Packages &amp;amp; Finalize
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install necessary packages&lt;/span&gt;
pacman &lt;span class="nt"&gt;-S&lt;/span&gt; networkmanager network-manager-applet wpa_supplicant dialog os-prober mtools dosfstools base-devel linux-headers

&lt;span class="c"&gt;# Exit chroot, unmount all partitions, and reboot&lt;/span&gt;
&lt;span class="nb"&gt;exit
&lt;/span&gt;umount &lt;span class="nt"&gt;-a&lt;/span&gt;
reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Post-Install Steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Connect to WiFi with nmcli
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Use nmcli or your preferred network manager after reboot&lt;/span&gt;
nmcli device wifi list
nmcli device wifi connect &amp;lt;wifi_name&amp;gt; password &amp;lt;password&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create a New User
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a new user and add to the wheel group&lt;/span&gt;
useradd &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nt"&gt;-G&lt;/span&gt; wheel baby
passwd baby

&lt;span class="c"&gt;# Allow wheel group sudo privileges&lt;/span&gt;
&lt;span class="nv"&gt;EDITOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vim visudo
&lt;span class="c"&gt;# Uncomment: %wheel ALL=(ALL) ALL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install GPU Drivers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# For Intel:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; xf86-video-intel intel-media-driver

&lt;span class="c"&gt;# For AMD:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; xf86-video-amdgpu

&lt;span class="c"&gt;# For NVIDIA:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; nvidia nvidia-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Audio Setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// By default, ALSA provides basic audio support.
// For a modern audio stack, install PipeWire.
// install:
pipewire # core
pipewire-pulse # (pulse-audio replacement)
wireplumber #(pipewire session manager)
alsa-utils #(for ALSA support)
helvum #(optional, for pipewire graph GUI)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install Hyprland and a Greeter
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Hyprland (Wayland compositor)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; hyprland wayland wlroots xorg-xwayland polkit

&lt;span class="c"&gt;# For a login greeter, consider installing ly&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; ly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;// Done. Enjoy your Arch Linux with Hyprland!&lt;/code&gt;&lt;/p&gt;

</description>
      <category>archlinux</category>
    </item>
  </channel>
</rss>
