<?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: FOBABS </title>
    <description>The latest articles on DEV Community by FOBABS  (@fobabs).</description>
    <link>https://dev.to/fobabs</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%2F34844%2F91a9c9a3-5434-4b06-87c1-893fc99a40cb.jpeg</url>
      <title>DEV Community: FOBABS </title>
      <link>https://dev.to/fobabs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fobabs"/>
    <language>en</language>
    <item>
      <title>The Urgent Need for You to Be Security Conscious</title>
      <dc:creator>FOBABS </dc:creator>
      <pubDate>Thu, 27 Feb 2025 09:00:00 +0000</pubDate>
      <link>https://dev.to/fobabs/the-urgent-need-for-you-to-be-security-conscious-34in</link>
      <guid>https://dev.to/fobabs/the-urgent-need-for-you-to-be-security-conscious-34in</guid>
      <description>&lt;p&gt;The recent &lt;strong&gt;Bybit hack&lt;/strong&gt; once again exposed the vulnerabilities of the digital world, sending a strong message: &lt;strong&gt;No one is immune to cyber threats.&lt;/strong&gt; As financial assets, sensitive data, and personal identities become increasingly digitized, security consciousness is no longer optional—it is a necessity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bybit Breach: A Stark Wake-Up Call
&lt;/h2&gt;

&lt;p&gt;Bybit, one of the world’s leading cryptocurrency exchanges, recently suffered a &lt;strong&gt;massive security breach&lt;/strong&gt;, resulting in hackers siphoning off over &lt;strong&gt;$1.5 billion worth of Ethereum&lt;/strong&gt;. The attack, which targeted the exchange’s cold wallet, has been described as one of the largest digital heists in history.&lt;/p&gt;

&lt;p&gt;This isn’t the first time a major crypto platform has been compromised. &lt;strong&gt;Binance, FTX, and Mt. Gox&lt;/strong&gt; all fell victim to devastating hacks, shaking investor confidence and exposing flaws in centralized security systems. Yet, despite these incidents, many individuals and institutions remain dangerously complacent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Security Consciousness is Critical
&lt;/h2&gt;

&lt;p&gt;The Bybit hack serves as a lesson not just for crypto users but for &lt;strong&gt;everyone operating in the digital space&lt;/strong&gt;. Whether you're an investor, developer, business owner, or just an everyday internet user, here’s why you need to prioritize security:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cybercriminals Are More Sophisticated Than Ever&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Hackers are constantly developing new attack vectors, from &lt;strong&gt;phishing scams and malware&lt;/strong&gt; to &lt;strong&gt;deepfake social engineering&lt;/strong&gt;. The moment you let your guard down, you become an easy target.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Financial and Personal Losses Can Be Irreversible&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Unlike traditional banks, cryptocurrency transactions are &lt;strong&gt;irreversible&lt;/strong&gt;. If your funds are stolen due to weak security measures, there’s little to no chance of recovery. The same applies to &lt;strong&gt;hacked bank accounts, stolen credit card details, and leaked personal data&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Trust is Hard to Rebuild&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
For businesses and platforms, a security breach can mean &lt;strong&gt;loss of users, legal liabilities, and reputational damage&lt;/strong&gt;. It takes years to build trust, but only seconds to lose it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What You Can Do to Stay Secure
&lt;/h2&gt;

&lt;p&gt;Security starts with &lt;strong&gt;you&lt;/strong&gt;. Here are some &lt;strong&gt;immediate steps&lt;/strong&gt; you can take to protect yourself and your assets:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Use Multi-Factor Authentication (MFA)&lt;/strong&gt; – Always enable &lt;strong&gt;2FA&lt;/strong&gt; for exchanges, email accounts, and banking apps. &lt;strong&gt;A strong password alone is not enough.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Store Crypto in Hardware Wallets&lt;/strong&gt; – Never keep large amounts of cryptocurrency on exchanges. Cold wallets provide &lt;strong&gt;offline security&lt;/strong&gt; against hacks.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Beware of Phishing Attacks&lt;/strong&gt; – Hackers often impersonate trusted platforms via &lt;strong&gt;emails, messages, or fake websites&lt;/strong&gt; to steal login credentials. Always double-check URLs.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Keep Your Software Updated&lt;/strong&gt; – Whether it’s your phone, computer, or wallet app, always install security updates to fix vulnerabilities.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Limit Data Exposure Online&lt;/strong&gt; – Avoid oversharing personal details on &lt;strong&gt;social media&lt;/strong&gt;, as cybercriminals can use this information for targeted attacks.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Lesson for the World
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Bybit hack is not just a crypto issue—it’s a global security concern.&lt;/strong&gt; It highlights the ever-growing need for individuals, businesses, and governments to strengthen &lt;strong&gt;cybersecurity defences&lt;/strong&gt;. In an era where data is as valuable as currency, &lt;strong&gt;your awareness and preparedness are your best protection.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stay vigilant. Stay secure. The digital world depends on it.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Analyzing a Suspicious Flash Loan Arbitrage Smart Contract</title>
      <dc:creator>FOBABS </dc:creator>
      <pubDate>Tue, 18 Feb 2025 11:00:00 +0000</pubDate>
      <link>https://dev.to/fobabs/analyzing-a-suspicious-flash-loan-arbitrage-smart-contract-k04</link>
      <guid>https://dev.to/fobabs/analyzing-a-suspicious-flash-loan-arbitrage-smart-contract-k04</guid>
      <description>&lt;p&gt;Recently, I came across a code snippet on a YouTube channel (linked via &lt;a href="https://pastebin.com/raw/RRg1xMVH" rel="noopener noreferrer"&gt;Pastebin&lt;/a&gt;) that claims to implement a flash loan arbitrage strategy on PancakeSwap. In this post, I’ll break down the code, discuss its intended functionality, and point out several concerning vulnerabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview of the Code
&lt;/h2&gt;

&lt;p&gt;The contract is named &lt;code&gt;FlashLoanArbitrage&lt;/code&gt; and includes the following features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Token Initialization:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The constructor accepts a token name, symbol, and loan amount.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fallback Function:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A payable fallback function exists to allow the contract to receive funds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;String Manipulation Functions:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Two functions (&lt;code&gt;PancakeSwapYeild&lt;/code&gt; and &lt;code&gt;_stringReplace&lt;/code&gt;) manipulate strings. They appear to “modify” a hardcoded string in an attempt to generate an address.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Address Parsing:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The function &lt;code&gt;parseAddr&lt;/code&gt; converts a manipulated hexadecimal string into an address.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Core Action Function:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The &lt;code&gt;action()&lt;/code&gt; function transfers the entire contract balance to an address derived by &lt;code&gt;exchange()&lt;/code&gt;, and it contains commented-out pseudocode for performing flash loan tasks and arbitrage operations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first glance, the contract seems to promise flash loan arbitrage functionality. However, a closer look reveals several critical issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identified Vulnerabilities
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Reentrancy and Unsafe Fund Transfers&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;action()&lt;/code&gt; function calls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;address(uint160(exchange())).transfer(address(this).balance);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Issue:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
This external call transfers all of the contract’s balance to a dynamically computed address. Since the function does not follow the Checks-Effects-Interactions pattern or uses a reentrancy guard, it could be vulnerable to reentrancy attacks if the recipient is a malicious contract.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Recommendation:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use OpenZeppelin’s &lt;code&gt;ReentrancyGuard&lt;/code&gt; or implement proper checks and effects before making external calls.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Obscure Address Calculation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The code uses two similar functions—&lt;code&gt;PancakeSwapYeild&lt;/code&gt; and &lt;code&gt;_stringReplace&lt;/code&gt;—to manipulate a hardcoded string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;string memory neutral_variable = "QG30C72A9E96D685CA4a74B274Eb54CBE73CCd8e8b";
PancakeSwapYeild(neutral_variable,0,'0');
PancakeSwapYeild(neutral_variable,2,'1');
PancakeSwapYeild(neutral_variable,1,'x');
address addr = parseAddr(neutral_variable);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Issue:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Instead of clearly setting an address, the contract “scrambles” a hardcoded string and then parses it into an address. This indirect method can lead to unexpected results, making it difficult to audit and verify the destination.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Recommendation:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Hardcode the intended address directly in the code or provide clear documentation and tests verifying that the intended recipient is used.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Lack of Access Control&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Any user can call the &lt;code&gt;action()&lt;/code&gt; function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function action() public payable { … }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Issue:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
There are no access restrictions, meaning that any caller can trigger the transfer of the contract’s balance. This could lead to unauthorized or malicious use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Recommendation:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Implement an access control mechanism (for example, using OpenZeppelin’s &lt;code&gt;Ownable&lt;/code&gt; contract) to restrict sensitive operations only to trusted accounts (e.g., the contract creator or a designated manager).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Outdated Solidity Version&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The contract uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pragma solidity ^0.5.0;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Issue:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Solidity 0.5.0 is an outdated version. Newer versions (0.8.x and later) include built-in protections such as automatic overflow/underflow checks and improved security features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Recommendation:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Upgrade the contract to Solidity 0.8.x to benefit from modern language features and security improvements.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Unnecessary and Potentially Confusing Code&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;There are functions like &lt;code&gt;PancakeSwapYeild&lt;/code&gt; and &lt;code&gt;_stringReplace&lt;/code&gt; which seem redundant and add unnecessary complexity. The comments also include “pseudo-code” for actual arbitrage functionality that isn’t implemented.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Issue:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Unused or confusing code increases the attack surface and makes it harder to audit the contract’s true functionality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Recommendation:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Remove extraneous code and ensure that only the necessary, secure logic is present. Clear documentation of each function’s purpose is also important.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The examined code snippet promises a flash loan arbitrage mechanism but hides several vulnerabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reentrancy risk&lt;/strong&gt; through unsafe fund transfers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Obscure address manipulation&lt;/strong&gt; that may lead to unexpected recipients.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lack of access control&lt;/strong&gt;, allowing anyone to trigger sensitive operations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Outdated Solidity version&lt;/strong&gt; that misses out on modern security checks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unnecessary code&lt;/strong&gt; that obscures the contract’s true intent.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What Should You Do?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Exercise Caution:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If you’re considering using or interacting with such a contract, understand that its current implementation could lead to loss of funds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Community Discussion:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Share these findings with your community to raise awareness about proper security practices in smart contract development.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Smart contract security is critical, especially when dealing with high-risk activities like flash loans and arbitrage. Contracts must always undergo rigorous audits before any funds are at risk. Let’s continue to build and share knowledge to keep the decentralized finance ecosystem secure.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Do you have thoughts or questions about this analysis? Feel free to leave a comment or reach out on&lt;/em&gt; &lt;a href="https://x.com/fobabs" rel="noopener noreferrer"&gt;&lt;em&gt;Twitter&lt;/em&gt;&lt;/a&gt; &lt;em&gt;or&lt;/em&gt; &lt;a href="https://www.linkedin.com/in/fobabs" rel="noopener noreferrer"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>web3</category>
      <category>smartcontract</category>
      <category>vulnerabilities</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Smart Contract Security</title>
      <dc:creator>FOBABS </dc:creator>
      <pubDate>Fri, 07 Feb 2025 11:00:00 +0000</pubDate>
      <link>https://dev.to/fobabs/smart-contract-security-3584</link>
      <guid>https://dev.to/fobabs/smart-contract-security-3584</guid>
      <description>&lt;p&gt;Smart contracts power decentralized applications (dApps), automating transactions and enforcing rules without intermediaries. However, a single vulnerability can lead to millions in losses. To stay ahead of attackers, developers must actively secure their contracts, test rigorously, and follow best practices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Smart Contract Vulnerabilities
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Reentrancy Attacks
&lt;/h3&gt;

&lt;p&gt;Attackers exploit this flaw by making repeated calls to a contract before the first execution completes, draining funds.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; The infamous DAO hack ($60M loss) exposed Ethereum’s vulnerability to reentrancy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Follow the &lt;strong&gt;checks-effects-interactions&lt;/strong&gt; pattern-update contract state before making external calls. Use &lt;strong&gt;reentrancy guards&lt;/strong&gt; in Solidity.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Integer Overflow &amp;amp; Underflow
&lt;/h3&gt;

&lt;p&gt;Hackers manipulate arithmetic operations to trigger unexpected behaviour.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Early Solidity versions allowed unchecked math operations, leading to exploits.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Use Solidity’s &lt;strong&gt;built-in overflow protection&lt;/strong&gt; (from v0.8) or the &lt;strong&gt;SafeMath&lt;/strong&gt; library.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Access Control Flaws
&lt;/h3&gt;

&lt;p&gt;Poorly designed permissions allow unauthorized users to control contracts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; The &lt;strong&gt;Parity multisig hack&lt;/strong&gt; ($150M loss) happened because anyone could reinitialize the contract.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Implement &lt;strong&gt;role-based access control (RBAC)&lt;/strong&gt; using OpenZeppelin’s &lt;code&gt;Ownable&lt;/code&gt; or &lt;code&gt;AccessControl&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Unchecked External Calls
&lt;/h3&gt;

&lt;p&gt;Contracts interacting with untrusted external contracts or addresses risk manipulation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; Validate responses, set gas limits, and use &lt;strong&gt;pull-over-push&lt;/strong&gt; patterns to avoid forced execution.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Denial of Service (DoS) Attacks
&lt;/h3&gt;

&lt;p&gt;Attackers force contract failures by exploiting gas limits or blocking execution paths.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; Optimize contract functions, limit loops, and handle unexpected failures gracefully.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Best Practices for Bulletproof Smart Contracts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Use Secure Development Frameworks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adopt&lt;/strong&gt; battle-tested frameworks like &lt;strong&gt;Hardhat&lt;/strong&gt;, or &lt;strong&gt;Foundry&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Leverage&lt;/strong&gt; OpenZeppelin’s audited smart contract libraries to avoid reinventing security mechanisms.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Follow Secure Coding Standards
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write modular contracts&lt;/strong&gt; to limit attack surfaces.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use the latest Solidity version&lt;/strong&gt; to benefit from security updates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Avoid hardcoded values&lt;/strong&gt; (addresses, secrets) to prevent exposure.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Test Relentlessly
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Run unit tests&lt;/strong&gt; for all functions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use fuzz testing&lt;/strong&gt; with tools like &lt;strong&gt;Echidna&lt;/strong&gt; to detect edge cases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Simulate attacks&lt;/strong&gt; using &lt;strong&gt;MythX&lt;/strong&gt;, &lt;strong&gt;Slither&lt;/strong&gt;, &lt;strong&gt;and&lt;/strong&gt; &lt;strong&gt;Manticore&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Perform Security Audits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Conduct internal audits&lt;/strong&gt; before deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hire professional auditors&lt;/strong&gt; to review the code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use bug bounty programs&lt;/strong&gt; (via Immunefi or HackerOne) to crowdsource vulnerability detection.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Implement Strict Access Controls
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use&lt;/strong&gt; &lt;code&gt;onlyOwner&lt;/code&gt; or &lt;code&gt;onlyRole&lt;/code&gt; modifiers to restrict sensitive functions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adopt multisig wallets&lt;/strong&gt; for critical operations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Prevent Reentrancy Attacks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Follow the checks-effects-interactions pattern:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Validate user input.

2. Update contract state.

3. Interact with external contracts.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use&lt;/strong&gt; &lt;code&gt;reentrancyGuard&lt;/code&gt; from OpenZeppelin.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Optimize Gas Efficiency
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write gas-efficient code&lt;/strong&gt; to prevent DoS attacks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use Layer 2 solutions&lt;/strong&gt; like Optimistic Rollups to reduce transaction costs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8. Secure Oracles and External Data
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use decentralized oracles&lt;/strong&gt; like &lt;strong&gt;Chainlink&lt;/strong&gt; to avoid data manipulation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Validate off-chain data&lt;/strong&gt; before using it in smart contracts.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9. Monitor and Upgrade Contracts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Implement pause functions&lt;/strong&gt; to stop transactions during emergencies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use upgradable contracts&lt;/strong&gt; cautiously, ensuring proper governance and security.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real-World Smart Contract Hacks &amp;amp; Lessons
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The DAO Hack (2016) - $60M Lost
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Cause: Reentrancy attack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Implement state updates before making external calls.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Parity Wallet Hack (2017) - $150M Lost
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; Unprotected initialization function.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Lock down access control and validate contract ownership.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Ronin Bridge Exploit (2022) - &amp;gt;$615M Stolen
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; Weak private key security.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Use multi-sig authentication for critical functions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Smart contract security &lt;strong&gt;isn’t optional&lt;/strong&gt;—it’s the foundation of trust in decentralized applications. Developers can build secure and resilient contracts by &lt;strong&gt;coding defensively, testing aggressively, and auditing thoroughly&lt;/strong&gt;. The future of Web3 depends on robust security—&lt;strong&gt;stay proactive, stay safe&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>smartcontract</category>
      <category>blockchain</category>
      <category>security</category>
    </item>
    <item>
      <title>Learn Rust if You Don’t Wanna Be Rusty</title>
      <dc:creator>FOBABS </dc:creator>
      <pubDate>Sat, 25 Jan 2025 23:16:35 +0000</pubDate>
      <link>https://dev.to/fobabs/learn-rust-if-you-dont-wanna-be-rusty-4f9b</link>
      <guid>https://dev.to/fobabs/learn-rust-if-you-dont-wanna-be-rusty-4f9b</guid>
      <description>&lt;p&gt;Let’s face it: in the fast-moving world of tech, skills can go stale faster than that half-eaten sandwich in the back of your fridge. If you don’t want your coding chops to gather cobwebs, it’s time to meet Rust—a programming language so loved that developers practically write it love letters on Stack Overflow.&lt;/p&gt;

&lt;p&gt;Rust isn’t just another tool in the box; it’s the shiny Swiss Army knife of programming languages. Safe, fast, and versatile, it’s like the superhero cape you didn’t know your code needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rust: The Language Your Code Crushes On
&lt;/h3&gt;

&lt;p&gt;Why do developers go nuts for Rust? Glad you asked:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Memory Safety: No More “Oopsies”&lt;/strong&gt;&lt;br&gt;
Rust has your back like a good friend who stops you from sending that regrettable 3 AM text. Its ownership model and compile-time checks ensure you don’t trip over pesky memory bugs like null pointers or buffer overflows. No segfaults here—just smooth sailing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Concurrency Without Tears&lt;/strong&gt;&lt;br&gt;
Ever tried writing multithreaded code and felt like you aged ten years in the process? Rust’s fearless concurrency model catches data races at compile time. It’s like having a strict-but-loving teacher who won’t let you fail.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Web3’s Secret Sauce&lt;/strong&gt;&lt;br&gt;
If Web3 is the future, Rust is the rocket fuel. Blockchain platforms like Solana and Polkadot are already partying with Rust because it delivers safety, performance, and that je ne sais quoi that Web3 needs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ecosystem Perks: Cargo Cult (in a Good Way)&lt;/strong&gt;&lt;br&gt;
Rust comes with Cargo, a package manager so good it’s like the personal assistant you wish you had IRL. Add in tools like Clippy (not the annoying paperclip, promise) and Rustfmt, and you’ll wonder how you ever coded without them.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How to Start Your Rusty Journey
&lt;/h3&gt;

&lt;p&gt;Here’s your step-by-step guide to becoming a Rustacean (yes, that’s the official term, and no, it doesn’t mean you have to grow claws):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Crack Open &lt;a href="https://doc.rust-lang.org/book/" rel="noopener noreferrer"&gt;The Rust Book&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
This is your Bible, your survival guide, your best buddy on the journey. It explains everything with the patience of a saint and the clarity of a sunny day.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Build Something Cool (or Silly)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A command-line to-do list (bonus points if it yells at you for procrastinating).&lt;/li&gt;
&lt;li&gt;A bot that sends you dry jokes at random intervals.&lt;/li&gt;
&lt;li&gt;A mini blockchain (because why not flex on your LinkedIn?).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Join the Rust Herd&lt;/strong&gt;&lt;br&gt;
Rust’s community is one of the nicest corners of the internet. Ask questions, share memes, and find out why Rust developers are basically a cult but without the weird chanting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Level Up Like a Pro&lt;/strong&gt;&lt;br&gt;
Ready to go beast mode? Tackle Rust’s more advanced features, like lifetimes (not as scary as they sound) or async programming (Rust makes it fun, promise).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Rust in Real Life
&lt;/h3&gt;

&lt;p&gt;Rust isn’t just the hot new kid on the block; it’s the one who’s acing math, winning the talent show, and somehow still has time to volunteer. Companies are using Rust to build blazing-fast games, rock-solid servers, and next-gen blockchain platforms.&lt;/p&gt;

&lt;p&gt;If you want your résumé to scream “hire me,” a line about Rust might just do the trick.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion: Rust Never Sleeps
&lt;/h3&gt;

&lt;p&gt;In a world where programming languages come and go like TikTok trends, Rust is built to last. It’s fast, safe, and versatile—kind of like your favourite superhero but without the spandex.&lt;/p&gt;

&lt;p&gt;So, don’t be that developer who gets left behind in the dust of obsolete skills. Pick up Rust, and watch your code (and your career) shine like never before.&lt;/p&gt;

&lt;p&gt;PS: If you don’t, you might end up...well...rusty.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>rust</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Foundry vs Hardhat (A story version)</title>
      <dc:creator>FOBABS </dc:creator>
      <pubDate>Fri, 06 Dec 2024 11:30:00 +0000</pubDate>
      <link>https://dev.to/fobabs/foundry-vs-hardhat-a-story-version-2me</link>
      <guid>https://dev.to/fobabs/foundry-vs-hardhat-a-story-version-2me</guid>
      <description>&lt;p&gt;Imagine you're a blockchain developer stepping into a vast, digital forest, armed with a single goal: to build secure, efficient, and groundbreaking decentralized applications. In this forest, two guides approach you—each offering their unique path. One is Foundry, a sharp, efficient, and focused blacksmith. The other is Hardhat, a versatile and resourceful craftsman. Both are eager to help you, but their methods differ greatly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Path of Foundry: The Swift Blacksmith
&lt;/h2&gt;

&lt;p&gt;Foundry greets you with a confident, no-nonsense demeanour. “I offer speed,” it declares, precisely hammering a glowing piece of metal. Foundry is built on Rust, exuding an aura of strength and efficiency. With it, you dive straight into Solidity. It doesn’t clutter your journey with unnecessary tools—it’s just you, your code, and pure performance.&lt;/p&gt;

&lt;p&gt;As Foundry sharpens your tools, you notice its minimalism. It provides Forge for testing, Cast for interacting with contracts, and Anvil for simulating blockchain environments—all tightly integrated and lightning-fast. Foundry’s domain is the realm of advanced warriors who value speed and precision. It whispers, “Your tests will run faster, your code will compile swifter, and your blockchain simulations will be seamless.”&lt;/p&gt;

&lt;p&gt;But Foundry demands discipline. It expects you to stay within its sharp, well-defined boundaries. “I am not for the faint of heart or the easily distracted,” it warns. It’s perfect for those who already know the battlefield or are ready to embrace a steeper learning curve.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Path of Hardhat: The Versatile Craftsman
&lt;/h2&gt;

&lt;p&gt;On the other side of the forest stands Hardhat, with a warm, approachable smile. Tools of every kind hang from its belt—some old, some new, all well-used. “Flexibility is my gift,” Hardhat says, as it hands you a set of instructions and a box of modular tools. It thrives on JavaScript, a language familiar to many adventurers from the web2 world.&lt;/p&gt;

&lt;p&gt;Hardhat’s camp is bustling with life. Its tent is surrounded by a vibrant community, a marketplace of plugins, and endless tutorials. It invites you to pick and choose from its arsenal: debugging tools, deployment scripts, integrations with libraries like Ethers.js, and plugins like Hardhat Deploy.&lt;/p&gt;

&lt;p&gt;As you follow Hardhat’s path, you realize its strength lies in its flexibility. It caters to those just beginning their journey, guiding them gently, but it’s also ready for seasoned veterans who need a versatile toolkit. “I am for the explorers, the creators who want to mould their journey into something unique,” it says.&lt;/p&gt;

&lt;p&gt;However, Hardhat’s many tools come with a cost—speed. Its Node.js-based architecture lags behind Foundry’s Rust-powered swiftness. But for many, the trade-off is worth it, as Hardhat’s path is well-trodden and friendly to newcomers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Paths, One Destination
&lt;/h2&gt;

&lt;p&gt;As you stand between these two guides, the choice becomes clearer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Follow Foundry&lt;/strong&gt; if you crave the thrill of speed and efficiency, the joy of mastering a streamlined, high-performance toolset, and the satisfaction of working directly with Solidity without extra frills.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Choose Hardhat&lt;/strong&gt; if you value flexibility, a bustling ecosystem, and the comfort of a familiar JavaScript environment.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the end, both paths lead to the same destination: building exceptional decentralized applications. The question is, which guide will you trust to lead you through the forest?&lt;/p&gt;

&lt;p&gt;The choice is yours. The forest awaits. 🌲&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>solidity</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>The beginning of dsa-scripts</title>
      <dc:creator>FOBABS </dc:creator>
      <pubDate>Thu, 21 Mar 2024 11:00:00 +0000</pubDate>
      <link>https://dev.to/fobabs/the-beginning-of-dsa-scripts-2kl5</link>
      <guid>https://dev.to/fobabs/the-beginning-of-dsa-scripts-2kl5</guid>
      <description>&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/fobabs" rel="noopener noreferrer"&gt;
        fobabs
      &lt;/a&gt; / &lt;a href="https://github.com/fobabs/dsa-scripts" rel="noopener noreferrer"&gt;
        dsa-scripts
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      This contains solutions to some data structures and algorithms problems.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Data Structures and Algorithms Solutions&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://choosealicense.com/licenses/mit/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/28f4d479bf0a9b033b3a3b95ab2adc343da448a025b01aefdc0fbc7f0e169eb8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d677265656e2e737667" alt="MIT License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This contains solutions to some DSA problems in JavaScript, Typescript, Python, Rust and Bash.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you like the project, kindly give it a star. It means a lot to me.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contributing&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Contributions are always welcome!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you want to help us improve, take a minute to read the &lt;a href="https://github.com/fobabs/dsa-scripts/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contribution Guidelines&lt;/a&gt; first.&lt;/li&gt;
&lt;li&gt;If you find a problem with a specific code, please &lt;a href="https://github.com/fobabs/data-structures-and-algorithms-solutions/issues/new" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If you want to get your hands dirty by fixing issues and bugs, fork the project.&lt;/li&gt;
&lt;li&gt;Please adhere to this project's &lt;code&gt;code of conduct&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Feedback&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;If you have any feedback, please reach out to us at &lt;a href="https://github.com/fobabs/dsa-scriptsmailto:hi@fobabs.co" rel="noopener noreferrer"&gt;hi@fobabs.co&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/fobabs/dsa-scripts" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
 

&lt;p&gt;In the field of computer science, mastering data structures and algorithms (DS&amp;amp;A) is paramount. However, the journey to proficiency can be arduous, requiring extensive practice, experimentation, and often the use of various resources. Faced with this challenge myself, I embarked on a mission to document my data structures and algorithms journey, ultimately leading to the creation of &lt;a href="https://github.com/fobabs/dsa-scripts" rel="noopener noreferrer"&gt;&lt;code&gt;dsa-scripts&lt;/code&gt;&lt;/a&gt;. This was born out of a desire to strengthen my knowledge of data structures and algorithms, and I intend to have support for a good number of programming languages, with JavaScript and Typescript already included.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dsa-scripts&lt;/code&gt; intends to offer a rich repository of meticulously crafted scripts covering a wide array of DS&amp;amp;A topics, ranging from fundamental data structures like arrays and linked lists to advanced algorithms such as dynamic programming and graph traversal.&lt;/p&gt;

&lt;p&gt;In addition, it will provide problem sets and solutions tailored to reinforce specific concepts or algorithms. These problem sets and solutions will challenge users to apply their knowledge to solving real-world problems, thereby solidifying their understanding and honing their problem-solving abilities.&lt;/p&gt;

&lt;p&gt;In an era where proficiency in DS&amp;amp;A is synonymous with technical excellence, it emerges as a catalyst for accelerating skill development and fostering a culture of continuous learning. Combining practical utility with educational value, &lt;code&gt;dsa-scripts&lt;/code&gt; empowers individuals to embark on a transformative journey towards mastery of data structures and algorithms, one script at a time.&lt;/p&gt;

&lt;p&gt;If you love this idea and want to be a part of it, kindly fork the project on &lt;a href="https://github.com/fobabs/dsa-scripts" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and follow the contributing guidelines available. If you do not want to contribute but want to be a spectator, you can star the project.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/fobabs" rel="noopener noreferrer"&gt;
        fobabs
      &lt;/a&gt; / &lt;a href="https://github.com/fobabs/dsa-scripts" rel="noopener noreferrer"&gt;
        dsa-scripts
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      This contains solutions to some data structures and algorithms problems.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Data Structures and Algorithms Solutions&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://choosealicense.com/licenses/mit/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/28f4d479bf0a9b033b3a3b95ab2adc343da448a025b01aefdc0fbc7f0e169eb8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d677265656e2e737667" alt="MIT License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This contains solutions to some DSA problems in JavaScript, Typescript, Python, Rust and Bash.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you like the project, kindly give it a star. It means a lot to me.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contributing&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Contributions are always welcome!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you want to help us improve, take a minute to read the &lt;a href="https://github.com/fobabs/dsa-scripts/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contribution Guidelines&lt;/a&gt; first.&lt;/li&gt;
&lt;li&gt;If you find a problem with a specific code, please &lt;a href="https://github.com/fobabs/data-structures-and-algorithms-solutions/issues/new" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If you want to get your hands dirty by fixing issues and bugs, fork the project.&lt;/li&gt;
&lt;li&gt;Please adhere to this project's &lt;code&gt;code of conduct&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Feedback&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;If you have any feedback, please reach out to us at &lt;a href="https://github.com/fobabs/dsa-scriptsmailto:hi@fobabs.co" rel="noopener noreferrer"&gt;hi@fobabs.co&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/fobabs/dsa-scripts" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>opensource</category>
      <category>algorithms</category>
      <category>javascript</category>
      <category>python</category>
    </item>
    <item>
      <title>How to deploy a Nest app to Railway using Bitbucket pipelines</title>
      <dc:creator>FOBABS </dc:creator>
      <pubDate>Fri, 23 Feb 2024 11:00:00 +0000</pubDate>
      <link>https://dev.to/fobabs/how-to-deploy-a-nest-app-to-railway-using-bitbucket-pipelines-3d8p</link>
      <guid>https://dev.to/fobabs/how-to-deploy-a-nest-app-to-railway-using-bitbucket-pipelines-3d8p</guid>
      <description>&lt;p&gt;Deploying a project from GitHub to Railway is as straightforward as knowing your name, but there's more when deploying from Bitbucket. Many of us love Railway because it offers features that we (developers) find beneficial, such as easy deployment workflows, scalability, good performance, cost-effectiveness, and robust support for various programming languages and frameworks. For me, it's just a "plug-and-play" app.&lt;/p&gt;

&lt;p&gt;The aggravation I felt knowing that Railway did not natively support Bitbucket prompted me to devise a workaround.&lt;/p&gt;

&lt;p&gt;💡&lt;br&gt;
&lt;strong&gt;Just for laugh:&lt;/strong&gt; Railway only support "Big Boys" 😆&lt;/p&gt;

&lt;p&gt;After a futile search through the internet pages, expecting to locate an existing solution, an inspiration struck me: what if all I had to do was construct a deployment pipeline, like Railway had done behind the scenes for GitHub? That struck a chord in my mind.&lt;/p&gt;

&lt;p&gt;If you have been trying to achieve this, sweat no more; you can now deploy from Bitbucket using CI/CD (bitbucket pipelines).&lt;/p&gt;

&lt;p&gt;💡&lt;br&gt;
&lt;strong&gt;Just for laugh:&lt;/strong&gt; You can tell Railway you're a "Bigger Boy" now 😆&lt;/p&gt;

&lt;p&gt;Without further ado, let’s begin.&lt;/p&gt;

&lt;p&gt;Prerequisites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A Bitbucket account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A &lt;a href="https://bit.ly/3OnffBY" rel="noopener noreferrer"&gt;Railway account&lt;/a&gt; already setup. (If you do not already have an account, you can create one &lt;a href="https://bit.ly/3OnffBY" rel="noopener noreferrer"&gt;here&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the root folder of your application, create a file called &lt;code&gt;bitbucket-pipelines.yml&lt;/code&gt; and add the following code snippet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node:18&lt;/span&gt;

&lt;span class="na"&gt;clone&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;full&lt;/span&gt;

&lt;span class="na"&gt;pipelines&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;step&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to railway&lt;/span&gt;
        &lt;span class="na"&gt;caches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;node&lt;/span&gt;
        &lt;span class="na"&gt;deployment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt; &lt;span class="c1"&gt;# Only if you have more than one environment&lt;/span&gt;
        &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;npm i -g @railway/cli&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;RAILWAY_TOKEN=$RAILWAY_TOKEN railway up --service=$RAILWAY_SERVICE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; Please take note of the indention. Any incorrect indentation will render your pipeline invalid.&lt;/p&gt;

&lt;p&gt;To avoid "story that touches," you can validate your pipeline before pushing to Bitbucket using this link: &lt;a href="https://bitbucket-pipelines.prod.public.atl-paas.net/validator" rel="noopener noreferrer"&gt;https://bitbucket-pipelines.prod.public.atl-paas.net/validator&lt;/a&gt;&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%2F11fe8qh77optpz9hsjeh.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%2F11fe8qh77optpz9hsjeh.png" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After you've validated your pipeline with &lt;code&gt;VALID&lt;/code&gt; status, you can push your repo to Bitbucket.&lt;/p&gt;

&lt;p&gt;Just a step back, if you're a DevOps engineer, this pipeline is simple math; but, if you're unfamiliar with CI/CD pipelines, this may appear to be a mirage to you.&lt;/p&gt;

&lt;p&gt;Check out the &lt;a href="https://support.atlassian.com/bitbucket-cloud/docs/bitbucket-pipelines-configuration-reference/" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt; to fully understand Bitbucket pipelines. To gain a basic grasp of CI/CD, check this article: &lt;a href="https://itnext.io/ci-cd-an-introduction-using-bitbucket-pipelines-8701a400b97d" rel="noopener noreferrer"&gt;https://itnext.io/ci-cd-an-introduction-using-bitbucket-pipelines-8701a400b97d&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let me walk you through the pipeline I just constructed.&lt;/p&gt;

&lt;p&gt;I used node v18 as my image, but you can use any node version you wish. One thing I enjoy doing is caching &lt;code&gt;node&lt;/code&gt; to minimize build time; you should do the same.&lt;/p&gt;

&lt;p&gt;Take heed of this line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;deployment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is unnecessary if you just have one deployment environment, but in practice, you will have several environments. This line instructs Bitbucket which environment variables to deploy. In our instance, it is the production environment, which implies that our pipeline will deploy utilizing variables from that environment. I'll go into how you can do this later.&lt;/p&gt;

&lt;p&gt;Let us now go on to the last line, which completes the railway deployment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;RAILWAY_TOKEN=$RAILWAY_TOKEN railway up --service=$RAILWAY_SERVICE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll notice $RAILWAY_TOKEN and $RAILWAY_SERVICE. These two variables will serve as your environment variables later on, and they are required to start our pipeline.&lt;/p&gt;

&lt;p&gt;For you to connect to your railway project, you'll need a railway token and a service ID to identify the exact service for which your project is hosted, but to achieve that, you have to set up your railway project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; First, start a new project and select &lt;code&gt;Empty Project&lt;/code&gt; .&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%2Fpid6at67rpjaudfwq3fk.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%2Fpid6at67rpjaudfwq3fk.png" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; After your project has been created, you’ll see the following image prompting you to add a service. Simply follow the process of adding a service.&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%2F0ijd94vo8h7t09cdtl8t.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%2F0ijd94vo8h7t09cdtl8t.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Now it's time to acquire your token and service ID. Click on the service you created, as illustrated below:&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%2Fdgckzw8r4xh2sgk9hj9c.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%2Fdgckzw8r4xh2sgk9hj9c.png" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Navigate to the page address, and you'll notice a URL string in this format:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://railway.app/project/&amp;lt;project-id&amp;gt;/service/&amp;lt;service-id&amp;gt;&lt;/code&gt; .&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%2Fs0v0hwsi4mcx2cq7kbfj.jpeg" 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%2Fs0v0hwsi4mcx2cq7kbfj.jpeg" width="800" height="30"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy &lt;code&gt;&amp;lt;service-id&amp;gt;&lt;/code&gt; which is your service ID, and save it somewhere for later use, as this will serve as your $RAILWAY_SERVICE.&lt;/p&gt;

&lt;p&gt;Now click on the &lt;code&gt;Tokens&lt;/code&gt; tab. Create a new token with any name of your choice. I opted to use &lt;code&gt;BITBUCKET_DEPLOY&lt;/code&gt; to signify that this token is intended for usage with Bitbucket.&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%2F1oubbbkur9qld2c3pxn3.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%2F1oubbbkur9qld2c3pxn3.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the token immediately and securely store it as previously described, since this will function as your $RAILWAY_TOKEN.&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%2Fupsmq2aixygq6pzmwofv.jpeg" 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%2Fupsmq2aixygq6pzmwofv.jpeg" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; You will only be shown the token once, after which you will be unable to copy it again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Check the build and start commands by accessing your service's &lt;code&gt;settings&lt;/code&gt; page. &lt;strong&gt;NOTE:&lt;/strong&gt; The default build and start commands are &lt;code&gt;npm run build&lt;/code&gt; and &lt;code&gt;npm run start&lt;/code&gt; respectively. If your project requires a different command, adjust it accordingly.&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%2Fojzqujfq2nde3p7cgbhd.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%2Fojzqujfq2nde3p7cgbhd.png" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5 (optional):&lt;/strong&gt; If your project requires environment variables, which is the case in real life, proceed to the &lt;code&gt;Variables&lt;/code&gt; tab.&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%2F6wpj42zuqea3khzbvg4d.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%2F6wpj42zuqea3khzbvg4d.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on &lt;code&gt;RAW Editor&lt;/code&gt; .&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%2Fpj14fhzfvacm9ynafe3a.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%2Fpj14fhzfvacm9ynafe3a.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Under the &lt;code&gt;ENV&lt;/code&gt; tab, paste your &lt;code&gt;.env&lt;/code&gt; variables from your nest app and hit the &lt;code&gt;Update Variables&lt;/code&gt; button, and you're done.&lt;/p&gt;

&lt;p&gt;Now, let's return to your Bitbucket repository and configure your pipeline. Click on &lt;code&gt;Repository settings&lt;/code&gt;, go down to &lt;code&gt;Settings&lt;/code&gt;, and then change &lt;code&gt;Enable Pipelines&lt;/code&gt; to true.&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%2Fef37sk9rr92bu629fvep.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%2Fef37sk9rr92bu629fvep.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that, click on &lt;code&gt;Deployments&lt;/code&gt; and scroll down to choose the production environment, since you will be deploying to this environment. Create the variable &lt;code&gt;RAILWAY_TOKEN&lt;/code&gt; and put the token you saved previously into it. Before adding it, ensure that the &lt;code&gt;Secured&lt;/code&gt; option is set to &lt;code&gt;true&lt;/code&gt;.&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%2Fu949m44gi1wyr14bk4x5.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%2Fu949m44gi1wyr14bk4x5.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; This page allows you to manage variables for various deployment environments.&lt;/p&gt;

&lt;p&gt;Next, navigate to &lt;code&gt;Repository Variables&lt;/code&gt;. Create a &lt;code&gt;RAILWAY_SERVICE&lt;/code&gt; variable and put the service ID you saved previously into it. Also, before adding, ensure that the &lt;code&gt;Secured&lt;/code&gt; option is set to &lt;code&gt;true&lt;/code&gt;.&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%2F76w4k82khxqvh3xstmh6.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%2F76w4k82khxqvh3xstmh6.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hurray! 💃 Your pipeline is ready to receive oil.&lt;/p&gt;

&lt;p&gt;Now, return to your repo, choose the &lt;code&gt;Pipelines&lt;/code&gt; tab, run the pipeline by clicking the &lt;code&gt;Run initial pipeline&lt;/code&gt; button, and follow through with the procedures.&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%2Fgoahyuv5rey9pwxhrjmx.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%2Fgoahyuv5rey9pwxhrjmx.png" width="800" height="444"&gt;&lt;/a&gt;&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%2Fpbq7lcphnbfxdbv7of6n.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%2Fpbq7lcphnbfxdbv7of6n.png" width="800" height="444"&gt;&lt;/a&gt;&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%2Fv3s5ka96z1tuffbx8qj4.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%2Fv3s5ka96z1tuffbx8qj4.png" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the pipeline is successful, you should see the following:&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%2Ffuv1jd7i47nz0f0v1aqb.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%2Ffuv1jd7i47nz0f0v1aqb.png" width="800" height="448"&gt;&lt;/a&gt;&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%2F2gdrewqvd02dgkk2emqo.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%2F2gdrewqvd02dgkk2emqo.png" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bravo! Now let's return to Railway to observe your deployment.&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%2Fo631o04e28skuflsggfe.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%2Fo631o04e28skuflsggfe.png" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see that your project is now being deployed. After it is successful, you will see the following:&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%2F4t06x1rzk0vud07w5jmb.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%2F4t06x1rzk0vud07w5jmb.png" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, your project has been successfully deployed. You may view the logs and see them for yourself.&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%2Fr7ufpmphmn8127wml5or.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%2Fr7ufpmphmn8127wml5or.png" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you can easily deploy from Bitbucket to Railway. My work here is done till we meet again.&lt;/p&gt;

&lt;p&gt;P.S. You can also use this pipeline for other projects.&lt;/p&gt;

</description>
      <category>node</category>
      <category>nestjs</category>
      <category>bitbucket</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Hacktoberfest 2020: Looking for a small project to contribute to</title>
      <dc:creator>FOBABS </dc:creator>
      <pubDate>Thu, 22 Oct 2020 21:26:56 +0000</pubDate>
      <link>https://dev.to/fobabs/hacktoberfest-2020-looking-for-a-small-project-to-contribute-to-3095</link>
      <guid>https://dev.to/fobabs/hacktoberfest-2020-looking-for-a-small-project-to-contribute-to-3095</guid>
      <description>&lt;p&gt;It's never too late to make your pull requests. Even though today is the 22nd day, you can still be a part of &lt;a href="https://hacktoberfest.digitalocean.com/" rel="noopener noreferrer"&gt;hacktoberfest&lt;/a&gt; by contributing to this small Javascript projects&lt;/p&gt;

&lt;p&gt;10 Days of JS: &lt;a href="https://github.com/fobabs/10-Days-of-JS" rel="noopener noreferrer"&gt;https://github.com/fobabs/10-Days-of-JS&lt;/a&gt;&lt;br&gt;
Date Picker: &lt;a href="https://github.com/fobabs/date-picker" rel="noopener noreferrer"&gt;https://github.com/fobabs/date-picker&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>How I built a typical Ubuntu Terminal using HTML &amp; CSS</title>
      <dc:creator>FOBABS </dc:creator>
      <pubDate>Wed, 06 May 2020 08:41:20 +0000</pubDate>
      <link>https://dev.to/fobabs/how-i-built-a-typical-ubuntu-terminal-using-html-css-1bpj</link>
      <guid>https://dev.to/fobabs/how-i-built-a-typical-ubuntu-terminal-using-html-css-1bpj</guid>
      <description>&lt;p&gt;I woke up one morning and felt the need to test my HTML &amp;amp; CSS skills without using any library nor framework. This is to test how well I understood HTML &amp;amp; CSS.&lt;/p&gt;

&lt;p&gt;Today, many young developers don’t like taking the time to understand how HTML and CSS work under the hood before delving into front-end frameworks like React, Angular, Vue, etc. They all want to jump into using the tools and technologies to build apps. I know that feeling too. I was once at that state.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Without Further Ado, let’s get down to business.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In my project root directory, I created an &lt;code&gt;index.htm&lt;/code&gt; file using my text editor and input the following boilerplate to start with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;  
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;    
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;    
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;"X-UA-Compatible"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"IE=edge"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;        
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Ubuntu Terminal&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;    
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;    
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;    
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/css"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"style.css"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;  
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;  
    &lt;span class="c"&gt;&amp;lt;!-- Body Section --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you read through, you’ll notice I made use of 2 &lt;a href="https://www.w3schools.com/html/html5_semantic_elements.asp" rel="noopener noreferrer"&gt;HTML5 semantic elements&lt;/a&gt; &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt; introduced by &lt;a href="https://www.w3.org/" rel="noopener noreferrer"&gt;W3C&lt;/a&gt; to clearly define elements.&lt;/p&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;You should also consider using HTML5 semantic elements in your next project.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;p&gt;Now, in the body section, I first inserted the &lt;code&gt;main&lt;/code&gt; tag, giving it an &lt;code&gt;id&lt;/code&gt; attribute of &lt;code&gt;container&lt;/code&gt; and nest a &lt;code&gt;div&lt;/code&gt; tag with an &lt;code&gt;id&lt;/code&gt; attribute of &lt;code&gt;terminal&lt;/code&gt;. I then sectioned the terminal into two (2) parts: the terminal bar and the terminal body. For the terminal bar section, I used a &lt;code&gt;section&lt;/code&gt; tag with an &lt;code&gt;id&lt;/code&gt; attribute of &lt;code&gt;terminal__bar&lt;/code&gt; while the terminal body section takes a &lt;code&gt;section&lt;/code&gt; tag with an &lt;code&gt;id&lt;/code&gt; attribute of &lt;code&gt;terminal__body&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I don’t want to go into many details so I don't bore you. You all want to see codes, not epistles.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The code snippet below shows everything you need to see. I believe even a newbie would understand what has been done there.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;main&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"terminal"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Terminal Bar --&amp;gt;&lt;/span&gt;       
    &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"terminal__bar"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;          
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"bar__buttons"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;            
        &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bar__button"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"bar__button--exit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;#10005;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;            
        &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bar__button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;#9472;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;                
        &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bar__button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;#9723;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;          
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;          
      &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"bar__user"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;fobabs@ubuntu: ~&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;        
    &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;        
    &lt;span class="c"&gt;&amp;lt;!-- Terminal Body --&amp;gt;&lt;/span&gt;        
    &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"terminal__body"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;          
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"terminal__prompt"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;            
        &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"terminal__prompt--user"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;fobabs@ubuntu:&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;            
        &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"terminal__prompt--location"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;~&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;            
        &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"terminal__prompt--bling"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;$&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;            
        &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"terminal__prompt--cursor"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;          
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;        
    &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;      
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;    
&lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The BEM methodology in naming my class and id attributes was used here&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;p&gt;Now done with the skeletal work of the terminal, it’s time to add some beauty.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="sx"&gt;url('https://fonts.googleapis.com/css?family=Ubuntu')&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="sx"&gt;url('https://fonts.googleapis.com/css?family=Ubuntu+Mono')&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;45deg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#57003f&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;#f57453&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Ubuntu&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="nf"&gt;#container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100vh&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="nf"&gt;#terminal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;70vw&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;65vh&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="nf"&gt;#terminal__bar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;box-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;border-box&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;border-top-left-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;border-top-right-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;#504b45&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;#3c3b37&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="nf"&gt;#bar__buttons&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="nc"&gt;.bar__button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;margin-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;box-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;border-box&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;#7d7871&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#595953&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
  &lt;span class="nl"&gt;text-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt; &lt;span class="m"&gt;#41403A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt; &lt;span class="m"&gt;#474642&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.bar__button&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.bar__button&lt;/span&gt;&lt;span class="nd"&gt;:focus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="nl"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;#bar__button--exit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;#f37458&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#de4c12&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    
  &lt;span class="nl"&gt;background-clip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;padding-box&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="nf"&gt;#bar__user&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;   
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#d5d0ce&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="nf"&gt;#terminal__body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;56&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Ubuntu Mono'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100%&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="m"&gt;30px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
  &lt;span class="nl"&gt;padding-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;-1px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="nf"&gt;#terminal__prompt&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;#terminal__prompt--user&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#7eda28&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;#terminal__prompt--location&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#4878c0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;#terminal__prompt--bling&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#dddddd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;#terminal__prompt--cursor&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;17px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;9px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;blink&lt;/span&gt; &lt;span class="m"&gt;1200ms&lt;/span&gt; &lt;span class="n"&gt;linear&lt;/span&gt; &lt;span class="n"&gt;infinite&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="nb"&gt;blink&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;    
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ffffff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="p"&gt;}&lt;/span&gt;  
  &lt;span class="err"&gt;49&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;    
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ffffff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="p"&gt;}&lt;/span&gt;  
  &lt;span class="err"&gt;60&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;    
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;transparent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="p"&gt;}&lt;/span&gt;  
  &lt;span class="err"&gt;99&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;    
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;transparent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="err"&gt;100&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;    
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ffffff&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;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="nf"&gt;#terminal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;    
    &lt;span class="nl"&gt;max-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;90%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;90%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Checking the CSS code above, you’ll notice I made use of ubuntu fonts to make the terminal look “Ubuntuish”. I believe it is understandable enough to comprehend.&lt;/p&gt;

&lt;p&gt;“Et voilà!”. I believe you enjoyed me.&lt;/p&gt;

&lt;p&gt;P.S. I hope to add some interactivity and functionalities to make it a full-fledged app in the future. If you want to contribute to the project, you can fork it on GitHub with the link below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/fobabs/ubuntu-terminal" rel="noopener noreferrer"&gt;GitHub - Ubuntu Terminal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Don’t forget to follow me here on Dev for more curated tech stuff.&lt;/p&gt;

&lt;p&gt;You can also follow my activities on &lt;a href="https://facebook.com/fobabs" rel="noopener noreferrer"&gt;Facebook&lt;/a&gt;, &lt;a href="https://twitter.com/fobabs" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;, &lt;a href="https://linkedin.com/in/fobabs" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, and &lt;a href="https://instagram.com/fobabs" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>html</category>
      <category>css</category>
      <category>ubuntu</category>
      <category>bash</category>
    </item>
    <item>
      <title>HackerRank’s 10 Days of JS</title>
      <dc:creator>FOBABS </dc:creator>
      <pubDate>Fri, 03 Apr 2020 13:06:00 +0000</pubDate>
      <link>https://dev.to/fobabs/hackerrank-s-10-days-of-js-1k95</link>
      <guid>https://dev.to/fobabs/hackerrank-s-10-days-of-js-1k95</guid>
      <description>&lt;p&gt;Many programmers out there may likely have difficulties in solving some of the HackerRank’s 10 Days of JS practice, some may even abandon it for something else.&lt;/p&gt;

&lt;p&gt;This reason prompted me to make my solutions open-source on GitHub for everyone taking up the practice to learn from. All you have to do is click on the link below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/fobabs/10_Days_of_JS" rel="noopener noreferrer"&gt;https://github.com/fobabs/10_Days_of_JS&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>hackerrank</category>
      <category>github</category>
    </item>
    <item>
      <title>How to manually create a workspace in VSCode</title>
      <dc:creator>FOBABS </dc:creator>
      <pubDate>Mon, 16 Dec 2019 14:26:47 +0000</pubDate>
      <link>https://dev.to/fobabs/how-to-manually-create-a-workspace-in-vscode-16eo</link>
      <guid>https://dev.to/fobabs/how-to-manually-create-a-workspace-in-vscode-16eo</guid>
      <description>&lt;p&gt;The usual convention of creating a workspace in VScode is by adding the working folders you desire in the workspace and saving it with any name of your choice.&lt;/p&gt;

&lt;p&gt;For example, we have an existing workspace named &lt;em&gt;“coding.code-workspace”&lt;/em&gt; with three working folders: fobabs-app, JavaScript and FOSS as shown below:&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%2F05akqdo6h9bk147t4llz.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%2F05akqdo6h9bk147t4llz.png" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But what if you want to do it manually, then you’ll have to create a file named &lt;strong&gt;example.code-workspace&lt;/strong&gt; and add the following code into it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Take note of the “.code-workspace” extension.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&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;"folders"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JavaScript/fobabs/fobabs-app"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JavaScript"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JavaScript/FOSS"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looking at the code, you can see they are in JSON format which makes it cool 😎 if you are already familiar with JavaScript Objects. The above code is for folders in the same directory and sub-directories. Let’s say you want to add a folder from a different directory, all you have to do is to do add the file path as shown below depending on your OS installed:&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;"folders"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JavaScript/fobabs/fobabs-app"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JavaScript"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JavaScript/FOSS"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/home/fobabs/Desktop/facebook-clone"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you’re just a few steps to becoming a VSCode Ninja 🦹‍♀️.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>vscode</category>
      <category>code</category>
    </item>
    <item>
      <title>My New Profession as an Artist</title>
      <dc:creator>FOBABS </dc:creator>
      <pubDate>Sat, 24 Aug 2019 18:57:19 +0000</pubDate>
      <link>https://dev.to/fobabs/my-new-profession-as-an-artist-nl0</link>
      <guid>https://dev.to/fobabs/my-new-profession-as-an-artist-nl0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhropperm.sirv.com%2FDev%2F212A3674-0EC1-4CB3-97EE-07ABB201E517.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%2Fhropperm.sirv.com%2FDev%2F212A3674-0EC1-4CB3-97EE-07ABB201E517.JPG" width="800" height="1200"&gt;&lt;/a&gt;&lt;br&gt;
I know what comes to mind when you hear the word ”Artist” is being an actor, a painter, comedian, musician or whatever an Artist mean to you but let me re-orientate you.&lt;/p&gt;

&lt;p&gt;An Artist is someone who does something with great skills or someone who creates work as a form of expression. It can be inspired by virtually anything that has meaning to the artist, or it can be an exercise in randomness. It can involve very complex and profound concepts or a subconscious zen-like execution. Art does not have to have an audience to exist. It only needs to have the artist.&lt;/p&gt;

&lt;p&gt;I will be using the software development as a case study in a moment from now.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A house painter isn’t an artist just because he uses some of the same tools as an artist. The intent is what matters.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When a writer hammers away at a typewriter, he’s creating his art. A musician composing a piece of music is creating her art. To say that a person writing code for a program cannot be art is like saying the writer hasn’t created his work until it has been published or the musician’s work doesn’t exist until it has been performed. Someone who can’t read music may not be able to experience it by looking at the sheet music and a blind person may not be able to experience painting, but the works still exist.&lt;/p&gt;

&lt;p&gt;Most, but not all, art forms share some common attributes. Those are the inspiration, process and technology. Painters prepare the canvas, they select their brushes, they arrange their materials and workspace. Art doesn’t begin when the artist first applies paint to his canvas or sketches the contours of his composition. It began when he was at the market, was inspired by an arrangement of produce, and began the act of selecting different items for his still life. The painting may never get finished, but that doesn’t disqualify it. It’s still art when the painter is working on it. The only thing that separates a painting that never gets finished and one that does is the artefact that gets left behind. That’s all that matters to some people because it’s the only thing of value, it’s the only way they can experience it. But that’s not what art is all about.&lt;/p&gt;

&lt;p&gt;A programmer may be motivated to code a piece of software to explore a concept in his own mind. If the intent is to create that as a work of art, then he’s creating art. He may see the beauty in code others have written, or see the beauty in patterns generated at random, but those are his inspiration. The computer and the code are his technology instead of a paintbrush and canvas. When he executes and debugs and fine-tunes his code in an effort to see where it takes him, that’s his process. It may end with no one else ever seeing his work and the code fail to execute as intended, but those never take away from the fact that he set to create some sort of artistic expression. Art involves failure too.&lt;/p&gt;

&lt;p&gt;Software development is more art than science. Sure, the programming languages that comprise software development have rules and are highly systematic, but the application of these languages is an artistic, highly individual creation. Each piece of software reflects the individual who created it. No two pieces of software are identical. It is this highly individual nature of software creation that makes it so artistic, so one-of-a-kind.&lt;/p&gt;

&lt;p&gt;I think the real value of being a software artist is that you don’t quantify, you constantly improve. When you design a project, constantly ask yourself: can this project be designed better? When you write code, after testing all the functionality, sit back, look at it, and ask yourself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;is this code structured beautifully as the finest artwork you have ever seen?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So as Software engineers consider yourself more of a Software artist. Software engineers will stop improving their projects once they checked all the checkboxes, software artists do not have those checkboxes because their work is already above the standards. As a software artist, once you settle down on measuring your project against some baselines, your project is no longer an artwork because you would not challenge yourself any more.&lt;br&gt;
Artists usually influence other people by what they do and/or what they produce. Uber has transformed the transportation industry, creating standards in the market and has inspired others to do the same. This is where art comes to play, you design the foreseeable future. When architecting a design or a concept, think about it if it can stand the test of time or it is just a fashion.&lt;/p&gt;

&lt;p&gt;In a nutshell, you become an expert when you are more of an artist in your field. Looking at Leonardo Da Vinci, the greatest artist the world has ever had, he employed artistry in all his areas of interest like invention, drawing, painting, sculpture, architecture, science, music, mathematics, engineering, literature, anatomy, geology, astronomy, botany, palaeontology and cartograph. So regardless of your area of specialization, incorporate art into your craft. It singles you out from the crowd.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I am more of an Artist than what you think I am.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Inspired from:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://illumisoft.com/software-development-art-science/" rel="noopener noreferrer"&gt;https://illumisoft.com/software-development-art-science/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.quora.com/Could-computer-programming-be-considered-an-art-form" rel="noopener noreferrer"&gt;https://www.quora.com/Could-computer-programming-be-considered-an-art-form&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hackernoon.com/dont-be-a-software-engineer-be-a-software-artist-204dbd47e8ca" rel="noopener noreferrer"&gt;https://hackernoon.com/dont-be-a-software-engineer-be-a-software-artist-204dbd47e8ca&lt;/a&gt;&lt;/p&gt;

</description>
      <category>art</category>
      <category>artist</category>
      <category>career</category>
      <category>profession</category>
    </item>
  </channel>
</rss>
