<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Chus</title>
    <description>The latest articles on Forem by Chus (@chus).</description>
    <link>https://forem.com/chus</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%2F958727%2F1360ed61-853f-4976-be98-5573d0692985.jpg</url>
      <title>Forem: Chus</title>
      <link>https://forem.com/chus</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/chus"/>
    <language>en</language>
    <item>
      <title>Troubleshooting Datacenter: Resolving Apache Service Reachability On Server</title>
      <dc:creator>Chus</dc:creator>
      <pubDate>Wed, 29 Apr 2026 15:30:40 +0000</pubDate>
      <link>https://forem.com/chus/troubleshooting-datacenter-resolving-apache-service-reachability-on-server-53pb</link>
      <guid>https://forem.com/chus/troubleshooting-datacenter-resolving-apache-service-reachability-on-server-53pb</guid>
      <description>&lt;p&gt;A server was supposed to be serving web content via Apache on port 5002, anyone trying to connect was met with a "No route to host" or "Connection refused" error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here is a breakdown of how to investigate and eventually restore the service.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Investigating with Telnet
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;telnet&lt;/code&gt; command in Linux is a networking tool used to communicate with a remote host using the TELNET protocol. While it was originally designed for remote login and management, its lack of encryption (sending data like passwords in plain text) has made it largely obsolete for that purpose there. For secure remote access, always use the &lt;code&gt;SSH&lt;/code&gt; (ssh) command instead.&lt;br&gt;
Today, it is primarily used as a quick diagnostic tool to check if a specific TCP port is open and reachable on a remote server.&lt;/p&gt;

&lt;p&gt;The standard command structure is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;telnet &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt;/server_ip] &lt;span class="o"&gt;[&lt;/span&gt;port]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;hostname/Ip&lt;/strong&gt;: The address of the remote server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;port&lt;/strong&gt;: The target service port (e.g., 80 for HTTP). If omitted, it defaults to port 23.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;To Exit/Close, Type &lt;code&gt;quit&lt;/code&gt; at the telnet&amp;gt; prompt and press Enter.&lt;/em&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  SSH Into Server
&lt;/h2&gt;

&lt;p&gt;To log into a remote server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh username@server_ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Check Apache Status using:
&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;systemctl status httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;If Apache wasn't Running, Start it:
&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;systemctl start httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;If The output revealed that another process was using port 5002, causing Apache to fail with the error &lt;code&gt;Address already in use&lt;/code&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resolving Port Binding Conflicts
&lt;/h2&gt;

&lt;p&gt;A port binding conflict in Linux occurs when a service or application attempts to listen on a network port that is already in use by another process, preventing the new service from starting.&lt;/p&gt;

&lt;p&gt;Here is the technical workflow used to resolve binding conflicts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scan for conflict:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;[user@hostname ~]$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ss &lt;span class="nt"&gt;-tulnp&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;5002 
&lt;span class="go"&gt;tcp LISTEN 0 10 127.0.0.1:5002 0.0.0.0:* users:(("sendmail",pid=19948,fd=4))
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Resolution:&lt;/strong&gt; After identifying the conflicting Process ID (PID), terminate the process to release the bind, allowing the port to become available for its intended service (from the above sendmail is the service with pid=19948 that is conflicting with our Apache on host 5002).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;To Stop the service or kill the process ID&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;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop sendmail
&lt;span class="c"&gt;# If it won't stop, kill the PID manually:&lt;/span&gt;
&lt;span class="nb"&gt;sudo kill&lt;/span&gt; &lt;span class="nt"&gt;-9&lt;/span&gt; 19948
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start or Restart Apache:&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;systemctl start httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or&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;systemctl restart httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Ensure Network Access
&lt;/h2&gt;

&lt;p&gt;Adjusting Network Access Rules using &lt;code&gt;iptables&lt;/code&gt;. A running service does not guarantee external reachability if the system's firewall blocks incoming traffic. &lt;/p&gt;

&lt;p&gt;Explicitly add a rule to allow ingress TCP traffic on port 5002. This bridges the gap between the service being "up" and the service being "accessible."&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;iptables &lt;span class="nt"&gt;-I&lt;/span&gt; INPUT &lt;span class="nt"&gt;-p&lt;/span&gt; tcp &lt;span class="nt"&gt;--dport&lt;/span&gt; 5002 &lt;span class="nt"&gt;-j&lt;/span&gt; ACCEPT

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Final End-to-End Verification
&lt;/h2&gt;

&lt;p&gt;The final stage is the verification of the fix from an external source, typically the Jump Host (a secure intermediary server used to access and manage devices in a separate, secure, or private network zone). Using curl provides a definitive test of the entire communication stack.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Final Test:&lt;/strong&gt;
Use the curl utility to request the server's URL
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://[hostname/server_ip]:port
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Result:&lt;/strong&gt; A successful return of the site's HTML content confirms that the service is running, correctly bound to the port, and bypasses the firewall correctly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Investigate using &lt;code&gt;telnet&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Identified and terminated the unauthorized process occupying port 5002, successfully releasing the port bind for the web service using &lt;code&gt;ss&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Re-initialized the Apache service after verifying configuration alignment, ensuring it was successfully listening on the designated port using &lt;code&gt;systemctl&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updated the &lt;code&gt;iptables&lt;/code&gt; configuration to explicitly permit external ingress traffic on port 5002, bridging the gap between local service activity and external accessibility.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Confirmed full restoration of the communication path via curl from the jump host, verifying that the web server is once again reachable and performing as expected using &lt;code&gt;curl&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>linux</category>
      <category>networking</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>100 Days of Solana — Days 1–4: Keys, Lamports, and My First Browser Wallet</title>
      <dc:creator>Chus</dc:creator>
      <pubDate>Mon, 27 Apr 2026 03:04:27 +0000</pubDate>
      <link>https://forem.com/chus/100-days-of-solana-days-1-4-keys-lamports-and-my-first-browser-wallet-3n8</link>
      <guid>https://forem.com/chus/100-days-of-solana-days-1-4-keys-lamports-and-my-first-browser-wallet-3n8</guid>
      <description>&lt;p&gt;I've been doing the #100DaysOfSolana challenge and I want to share what the first four days looked like — because the mental shift from Web2 to Web3 hit me harder and faster than I expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 1 — Generate a Keypair and Get Devnet SOL
&lt;/h2&gt;

&lt;p&gt;I generated my first Solana keypair using the CLI and airdropped free SOL to it on devnet.  There was no sign-up form. No email. No password. My entire identity on the network is just 64 bytes — a private key and the public key derived from it. That's it. The blockchain doesn't know who I am.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5xhywmrkz5xp0gedzv87.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5xhywmrkz5xp0gedzv87.png" alt="solana-cli" width="800" height="836"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 2 — Create a Wallet and Check Its Balance Programmatically
&lt;/h2&gt;

&lt;p&gt;On this day, I wrote a TypeScript script that loads a saved keypair from disk and fetches its devnet SOL balance using @solana/kit.  The balance comes back in lamports, not SOL — and the RPC is just a plain JSON HTTP call. No special SDK magic required if you don't want it. It felt surprisingly close to calling a REST API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dp0b93va4h68rbkzrlx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dp0b93va4h68rbkzrlx.png" alt="balance check" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 3 — Understand SOL and Lamports
&lt;/h2&gt;

&lt;p&gt;I dug into the unit system — 1 SOL = 1,000,000,000 lamports (like satoshis in Bitcoin or wei in Ethereum). Everything on Solana is paid and measured in lamports internally. Even rent for storing data on-chain is denominated in lamports. The precision exists so micro-transactions are practical without floating-point weirdness. &lt;/p&gt;

&lt;h2&gt;
  
  
  Day 4 — Connect a Browser Wallet
&lt;/h2&gt;

&lt;p&gt;I built a browser dapp (Vite + React + TypeScript) that detects installed Solana wallets, connects to Phantom with user approval, reads the connected address, and shows the live devnet balance — updated in real time via a WebSocket. The dapp detect any compatible wallet using browser-level interface. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffuyb6nivxekwxmjiflew.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffuyb6nivxekwxmjiflew.png" alt="browser wallet" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Concept That Clicked for Me
&lt;/h2&gt;

&lt;p&gt;The whole cryptography model finally made sense across these four days.&lt;/p&gt;

&lt;p&gt;In Web2, your identity lives on someone else's server — a username-password pair that a company stores and controls. Lose access to their system, lose your account.&lt;/p&gt;

&lt;p&gt;In Solana (and Web3 broadly), your identity is a keypair you generate yourself. The private key never leaves your device. The public key is your address — it's what you share. When you "sign" something, you're using math (Ed25519) to prove you hold the private key without ever revealing it. The network verifies the signature against your public key. No server in between. No account recovery email.&lt;/p&gt;

&lt;p&gt;The dapp I built on Day 4 makes this tangible: it calls window.phantom.solana.connect(), Phantom pops up its own approval UI (fully sandboxed), and if you approve, it hands back only your public key. The dapp never sees your private key — not even for a millisecond. That's the guarantee cryptographic signing gives you.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;That shift — from trust the server to verify the math — is the real unlock of this whole ecosystem&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things I'm curious about
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;how accounts actually store state on-chain beyond just a balance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rent-exemption and why accounts need a minimum balance to exist.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;how transactions are structured and signed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>blockchain</category>
      <category>typescript</category>
      <category>web3</category>
    </item>
    <item>
      <title>Identity on Solana: SSH Keys Concept</title>
      <dc:creator>Chus</dc:creator>
      <pubDate>Mon, 27 Apr 2026 00:50:52 +0000</pubDate>
      <link>https://forem.com/chus/identity-on-solana-ssh-keys-concept-3c46</link>
      <guid>https://forem.com/chus/identity-on-solana-ssh-keys-concept-3c46</guid>
      <description>&lt;p&gt;If you’ve ever run ssh-keygen to push code to GitHub or access a remote server, you already understand 90% of how identity works on Solana.&lt;/p&gt;

&lt;p&gt;In the Web2 world, "identity" is usually something a company lends to you. You have a row in a PostgreSQL database owned by Google or Meta. If they delete that row, your identity vanishes. In the Web3 world—specifically on Solana—identity is something you math into existence.&lt;/p&gt;

&lt;p&gt;Here is how we move from "Login with Google" to "Login with Cryptography."&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj9thspe3xal0olfmd39f.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj9thspe3xal0olfmd39f.jpg" alt="cryptographically secured data" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Keypair: Your Global Passport
&lt;/h2&gt;

&lt;p&gt;In Web2, your identity is a Username + Password stored on a centralized server. On Solana, your identity is a Keypair.&lt;/p&gt;

&lt;p&gt;A keypair consists of two parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Public Key (Your Address)&lt;/strong&gt;: Think of this like your IBAN (International Bank Account Number) or your email address. You share this with the world so people know where to send SOL or tokens.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Private Key (Your Signature)&lt;/strong&gt;: This is your "password," but it’s never stored on a server. It stays on your machine (or in your wallet).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you "log in" to a Solana app, you aren't sending a password to be checked against a database. Instead, you are using your private key to digitally sign a piece of data. The network uses your public key to verify that signature. If the math checks out, you are who you say you are.&lt;/p&gt;

&lt;p&gt;N/B: We use a private key to sign transactions (such as sending crypto or messages), while the public key is used to verify those transactions and receive funds. &lt;/p&gt;

&lt;h2&gt;
  
  
  2. Accounts: The Folders of the Network
&lt;/h2&gt;

&lt;p&gt;On Solana, everything is an Account. If the Solana blockchain is a giant global operating system, accounts are the files.&lt;br&gt;
In Web2, a database might have a &lt;strong&gt;users&lt;/strong&gt; table with columns for &lt;strong&gt;balance&lt;/strong&gt;, &lt;strong&gt;username&lt;/strong&gt;, and &lt;strong&gt;profile_pic&lt;/strong&gt;. On Solana, your public key points to an account on the network that stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lamports&lt;/strong&gt;: The smallest unit of SOL (named after Leslie Lamport). &lt;strong&gt;1 SOL = 1,000,000,000 lamports&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Owner&lt;/strong&gt;: The program (smart contract) that is allowed to change the account's data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data&lt;/strong&gt;: A buffer of bytes where information (like your token balances) is stored.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Ownership vs. Permission
&lt;/h2&gt;

&lt;p&gt;The biggest "click" moment for a Web2 developer is realizing there is no "Forgot Password" button.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;In Web2&lt;/strong&gt;: You own your account because a company grants you access. They can lock you out or reset your password.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In Web3&lt;/strong&gt;: You own your account because you hold the private key. Because the network is decentralized, no one—not even the creators of Solana—can "admin" your account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;During my first week diving into Solana, I realized that managing these keys manually is risky. That’s where the "Wallet" comes in. Tools like Phantom (a browser wallet) act as a "Identity Proxy." They hold your private keys securely and provide a UI for you to "Sign" transactions when a web app requests it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Identity on Solana isn't a record in a company's database; it’s a cryptographic proof. It’s &lt;em&gt;&lt;strong&gt;self-custodied&lt;/strong&gt;&lt;/em&gt;, meaning you are the sole gatekeeper of your digital presence.&lt;/p&gt;

&lt;p&gt;If you're coming from a Web2 background, stop thinking about "Accounts" as entries in a table and start thinking about them as &lt;strong&gt;cryptographically secured files&lt;/strong&gt; that only you have the key to edit.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>blockchain</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
