<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

 <title>f4him</title>
 <link href="https://www.withfahim.com/atom.xml" rel="self"/>
 <link href="https://www.withfahim.com/"/>
 <updated>2026-08-01T01:08:03+06:00</updated>
 <id>https://www.withfahim.com</id>
 <author>
   <name>Fahim Shahriar</name>
   <email>shahriarfahim23@gmail.com</email>
 </author>

 
 <entry>
   <title>Currency Converter Chrome Extension – A Deep Dive</title>
   <link href="https://www.withfahim.com/2026/07/29/currency-converter-chrome-extension-a-deep-dive"/>
   <updated>2026-07-29T00:00:00+06:00</updated>
   <id>https://www.withfahim.com/2026/07/29/Currency-Converter-Chrome-Extension-A-Deep-Dive</id>
   <content type="html">&lt;div&gt;            
    &lt;a class=&quot;extension-card card-link&quot; href=&quot;https://chromewebstore.google.com/detail/bppglhdfcfnjgcjjohneaidfkfaeomjm&quot; target=&quot;_blanc&quot;&gt;
    
    &lt;svg class=&quot;external-link-icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;
      &lt;path d=&quot;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&quot;&gt;&lt;/path&gt;
      &lt;polyline points=&quot;15 3 21 3 21 9&quot;&gt;&lt;/polyline&gt;
      &lt;line x1=&quot;10&quot; y1=&quot;14&quot; x2=&quot;21&quot; y2=&quot;3&quot;&gt;&lt;/line&gt;
    &lt;/svg&gt;

    &lt;img src=&quot;/assets/images/currency-converter-240px.png&quot; alt=&quot;Extension Icon&quot; class=&quot;extension-icon&quot; /&gt;

    &lt;div class=&quot;extension-info&quot;&gt;
        &lt;h2&gt;
            Currency Converter

        &lt;/h2&gt;
        &lt;p&gt;
            Instantly convert prices on any website into your preferred currency.
        &lt;/p&gt;
        &lt;span class=&quot;badge&quot;&gt;Chrome Extension&lt;/span&gt;
    &lt;/div&gt;
    &lt;/a&gt;

&lt;/div&gt;

&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;Shopping online has never been simpler, but one problem remains surprisingly common: prices are often displayed in currencies that do not match the shopper’s own expectations. A product listed in US dollars may feel completely different to someone browsing from Bangladesh, the UK, or Japan. For many users, the friction is not in finding the product, but in mentally converting the price into a currency they understand.&lt;/p&gt;

&lt;p&gt;That is the problem this extension solves.&lt;/p&gt;

&lt;p&gt;The Currency Converter Chrome Extension is a lightweight browser tool designed to make online shopping feel more intuitive. Instead of manually translating every price in your head, the extension detects prices on supported e-commerce pages and overlays a converted value in your preferred currency. The result is a smoother, more familiar browsing experience that helps users compare products without leaving the page.&lt;/p&gt;

&lt;p&gt;Because the source repository is private and only the Chrome Web Store listing is meant to be public, this post focuses on the product experience, the architecture behind it, and the technical choices that make it work reliably.&lt;/p&gt;

&lt;h2 id=&quot;what-the-extension-does&quot;&gt;What the Extension Does&lt;/h2&gt;

&lt;p&gt;At its core, the extension performs three tasks in a seamless loop:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;It detects prices visible on a webpage.&lt;/li&gt;
  &lt;li&gt;It identifies the currency associated with each price.&lt;/li&gt;
  &lt;li&gt;It displays a converted value in a target currency selected by the user.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is not a traditional currency calculator that only works when you manually paste in a value. Instead, it acts like a quiet layer over the web page itself. When a user visits an e-commerce site such as Amazon, AliExpress, Walmart, eBay, Temu, or a generic product page, the extension scans the page and recognizes price-related content automatically.&lt;/p&gt;

&lt;p&gt;Once a price is found, the extension attaches a small visual annotation—often a tooltip or inline label—showing the converted amount. The user can then quickly see what a product would cost in a currency they know well, such as Bangladeshi Taka (BDT), without interrupting their browsing flow.&lt;/p&gt;

&lt;!-- ![](http://localhost:4000/assets/images/currency-screenshot.png) --&gt;
&lt;p&gt;&lt;img style=&quot;width:100%; height:100%;border-radius:0&quot; src=&quot;/assets/images/currency-screenshot.png&quot; alt=&quot;Extension Icon&quot; class=&quot;extension-icon&quot; /&gt;
&lt;em&gt;Screenshot taken from &lt;a href=&quot;https://amazon.com&quot; target=&quot;_blanc&quot;&gt;Amazon&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This makes the extension especially useful for:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Shoppers comparing international products&lt;/li&gt;
  &lt;li&gt;Users who prefer local currencies for budgeting&lt;/li&gt;
  &lt;li&gt;People unfamiliar with the original currency format&lt;/li&gt;
  &lt;li&gt;Customers trying to interpret deals, discounts, and final totals quickly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;why-it-matters&quot;&gt;Why It Matters&lt;/h2&gt;

&lt;p&gt;The modern web is global, but the shopping experience is still often local in feel. A product page might list a price in USD, EUR, or AUD, but a customer in Bangladesh may prefer BDT. The mismatch is not just aesthetic; it affects decision-making.&lt;/p&gt;

&lt;p&gt;For instance, a price like “$29.99” may appear cheap at first glance, but when translated into BDT it could feel very different depending on the current exchange rate. The extension helps bridge that gap by making currency conversion visible and immediate.&lt;/p&gt;

&lt;p&gt;Instead of forcing users to open a separate calculator or search engine, it delivers the information directly where they need it: on the page they are already viewing.&lt;/p&gt;

&lt;h2 id=&quot;how-it-works&quot;&gt;How It Works&lt;/h2&gt;

&lt;p&gt;The extension is built around a simple but effective pipeline.&lt;/p&gt;

&lt;h3 id=&quot;1-detecting-price-content&quot;&gt;1. Detecting Price Content&lt;/h3&gt;

&lt;p&gt;The first step is recognizing prices in the Document Object Model (DOM). The extension scans the page for numeric values accompanied by currency symbols or currency codes. This includes examples such as:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;$19.99&lt;/li&gt;
  &lt;li&gt;€45&lt;/li&gt;
  &lt;li&gt;£12.50&lt;/li&gt;
  &lt;li&gt;৳3,200&lt;/li&gt;
  &lt;li&gt;BDT3200&lt;/li&gt;
  &lt;li&gt;NZD 80&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The detection logic is intentionally flexible. It looks not only for traditional currency symbols but also for shortcodes such as USD, EUR, BDT, and NZD. That makes the converter more robust across different websites and international pricing styles.&lt;/p&gt;

&lt;h3 id=&quot;2-identifying-the-currency&quot;&gt;2. Identifying the Currency&lt;/h3&gt;

&lt;p&gt;Once a price-like value is found, the extension maps it to an internal currency definition. This is handled through a currency dictionary that stores metadata about each supported currency, including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;the display symbol&lt;/li&gt;
  &lt;li&gt;the ISO code&lt;/li&gt;
  &lt;li&gt;the currency name&lt;/li&gt;
  &lt;li&gt;the number of decimal places used for formatting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, a currency entry may include both the symbol and the short code, allowing the extension to recognize either form. This is important because different websites use different conventions. Some show prices as “$50”, while others use “USD50” or “US$50”.&lt;/p&gt;

&lt;h3 id=&quot;3-fetching-exchange-rates&quot;&gt;3. Fetching Exchange Rates&lt;/h3&gt;

&lt;p&gt;After detecting a price and identifying the currency, the extension needs a current exchange rate. It does this by communicating with a background service worker, which fetches exchange-rate information from the Frankfurter API.&lt;/p&gt;

&lt;p&gt;The background layer acts as a central worker for network tasks. Instead of making requests directly from every page context, the extension routes rate-fetching through the background script. That keeps the logic centralized and makes it easier to cache results.&lt;/p&gt;

&lt;h3 id=&quot;4-formatting-the-converted-value&quot;&gt;4. Formatting the Converted Value&lt;/h3&gt;

&lt;p&gt;Once the exchange rate is retrieved, the extension calculates the converted amount and formats it for display. Formatting is important because a converted number should not just be mathematically correct, but also readable.&lt;/p&gt;

&lt;p&gt;The extension uses currency-specific formatting rules so that values appear in a natural style for the selected target currency. For example, the number of decimal places, thousands separators, and decimal separators are adjusted based on the currency definition.&lt;/p&gt;

&lt;h3 id=&quot;5-injecting-a-visual-overlay&quot;&gt;5. Injecting a Visual Overlay&lt;/h3&gt;

&lt;p&gt;The final step is presentation. The extension adds a lightweight annotation near the original price, usually in the form of a tooltip or inline label. This overlay shows the converted value so that the user can understand the price immediately.&lt;/p&gt;

&lt;p&gt;The experience is intentionally non-intrusive. The original price remains intact, and the added conversion is supplemental rather than disruptive.&lt;/p&gt;

&lt;h2 id=&quot;the-architecture-behind-the-extension&quot;&gt;The Architecture Behind the Extension&lt;/h2&gt;

&lt;p&gt;The extension is organized into a small but well-structured set of files.&lt;/p&gt;

&lt;h3 id=&quot;manifest-and-background-logic&quot;&gt;Manifest and Background Logic&lt;/h3&gt;

&lt;p&gt;The manifest file defines the extension’s permissions, content-script behavior, and service-worker configuration. The background script handles tasks such as:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;receiving requests from content scripts&lt;/li&gt;
  &lt;li&gt;fetching exchange rates&lt;/li&gt;
  &lt;li&gt;storing cached rates locally&lt;/li&gt;
  &lt;li&gt;responding with the latest values&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This background layer is crucial because it keeps the extension responsive and avoids repeatedly hitting the exchange-rate service for every price on the page.&lt;/p&gt;

&lt;h3 id=&quot;content-scripts&quot;&gt;Content Scripts&lt;/h3&gt;

&lt;p&gt;The content script is the brain of the user-facing experience. It is responsible for scanning the page, matching price patterns, identifying currencies, requesting conversion data, and injecting the visual overlay.&lt;/p&gt;

&lt;p&gt;In practice, this means the content script performs the page-level analysis while the background script handles the network-heavy work.&lt;/p&gt;

&lt;h3 id=&quot;currency-definitions&quot;&gt;Currency Definitions&lt;/h3&gt;

&lt;p&gt;The currency dictionary stores the metadata needed to recognize and format currencies. Instead of hard-coding each behavior in the main logic, the extension keeps currency information in a dedicated data file. That makes it easier to expand support for additional currencies later.&lt;/p&gt;

&lt;h3 id=&quot;site-specific-adapters&quot;&gt;Site-Specific Adapters&lt;/h3&gt;

&lt;p&gt;One of the most interesting parts of the extension is its support for site-specific behavior. E-commerce websites often structure their markup differently. A price on Amazon might be nested differently from a price on AliExpress, eBay, or Walmart. Because of that, the extension includes specialized adapters for different sites.&lt;/p&gt;

&lt;p&gt;These adapters help the script understand where prices are likely to appear and what DOM patterns should be considered. A generic fallback is also included for websites that do not match one of the known patterns.&lt;/p&gt;

&lt;p&gt;This approach makes the extension more reliable because it avoids assuming every page uses the same structure.&lt;/p&gt;

&lt;h2 id=&quot;why-the-service-worker-design-was-important&quot;&gt;Why the Service Worker Design Was Important&lt;/h2&gt;

&lt;p&gt;One of the key technical decisions in the project was the use of a classic service worker rather than a module-based worker.&lt;/p&gt;

&lt;p&gt;A module service worker would have caused issues with one of the extension’s core loading patterns because the background script relies on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;importScripts()&lt;/code&gt; to share the currency dictionary with the worker context. In a module-based worker, that mechanism is not supported, causing runtime errors.&lt;/p&gt;

&lt;p&gt;By using a classic service worker, the extension could:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;load shared scripts correctly&lt;/li&gt;
  &lt;li&gt;access the local currency data without complications&lt;/li&gt;
  &lt;li&gt;register the background worker cleanly&lt;/li&gt;
  &lt;li&gt;support the extension’s messaging architecture without breaking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This technical fix was not just a minor detail. It was essential to ensuring the extension could load and function reliably in Chrome.&lt;/p&gt;

&lt;h2 id=&quot;performance-and-user-experience&quot;&gt;Performance and User Experience&lt;/h2&gt;

&lt;p&gt;A successful browser extension must be both useful and unobtrusive. This project was designed with that balance in mind.&lt;/p&gt;

&lt;h3 id=&quot;caching-for-efficiency&quot;&gt;Caching for Efficiency&lt;/h3&gt;

&lt;p&gt;Exchange rates do not need to be fetched every single time a user views a page. To reduce unnecessary requests, the extension caches rates in local storage for a short period. That means repeated conversions can be served quickly without making a fresh API request every time.&lt;/p&gt;

&lt;p&gt;This improves both speed and reliability. Users get near-instant feedback, and the extension avoids unnecessary network traffic.&lt;/p&gt;

&lt;h3 id=&quot;lightweight-ui&quot;&gt;Lightweight UI&lt;/h3&gt;

&lt;p&gt;The popup interface allows the user to choose a target currency, toggle the extension on or off, and view the last update time. The interface is intentionally minimal so it does not distract from the browsing experience.&lt;/p&gt;

&lt;p&gt;The extension is designed to feel like a helpful utility rather than a heavy application. It works quietly in the background and only surfaces itself when needed.&lt;/p&gt;

&lt;h2 id=&quot;how-the-extension-handles-real-world-web-pages&quot;&gt;How the Extension Handles Real-World Web Pages&lt;/h2&gt;

&lt;p&gt;The biggest challenge in building a price-conversion extension is not the math. The hard part is dealing with the astonishing variety of web pages that exist.&lt;/p&gt;

&lt;p&gt;Some stores place prices inside compact product cards. Others display them inside hover panels. Some use special formatting, hidden text, or repeated price blocks. A single page can contain promotional prices, sale prices, original prices, partner offers, and shipping information, all within the same layout.&lt;/p&gt;

&lt;p&gt;That is why the extension includes logic for different site structures. It is not enough to detect a number followed by a currency sign; the script must also avoid misidentifying unrelated content. It needs to focus on the pricing context, not just any numeric value on a page.&lt;/p&gt;

&lt;p&gt;This is where the site-specific adapters and generic fallback come into play. They improve the probability that the extension will attach conversion annotations to the right elements without producing noisy or incorrect overlays.&lt;/p&gt;

&lt;h2 id=&quot;privacy-and-simplicity&quot;&gt;Privacy and Simplicity&lt;/h2&gt;

&lt;p&gt;The extension is intentionally lightweight and does not require a complex account system or external login.&lt;/p&gt;

&lt;p&gt;Its core behavior relies on:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;the browser’s local context&lt;/li&gt;
  &lt;li&gt;the user’s selected target currency&lt;/li&gt;
  &lt;li&gt;exchange-rate data fetched from an external API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The extension does not need to store sensitive user data in order to function. It mainly uses local storage for caching and browser messaging to coordinate between scripts.&lt;/p&gt;

&lt;p&gt;That makes it easier to trust and easier to maintain.&lt;/p&gt;

&lt;h2 id=&quot;installation-and-usage&quot;&gt;Installation and Usage&lt;/h2&gt;

&lt;p&gt;For development testing, the extension can be loaded directly in Chrome through the Extensions page by enabling Developer mode and selecting the unpacked project folder.&lt;/p&gt;

&lt;p&gt;Once installed, the user can:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Open an e-commerce page&lt;/li&gt;
  &lt;li&gt;Allow the extension to scan the page&lt;/li&gt;
  &lt;li&gt;View converted prices inline or via hover annotations&lt;/li&gt;
  &lt;li&gt;Change the desired target currency from the popup&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The behavior is immediate enough to feel native. The user does not need to manually enter values or switch context; the conversion appears as part of the browsing experience.&lt;/p&gt;

&lt;h2 id=&quot;what-makes-the-project-interesting&quot;&gt;What Makes the Project Interesting&lt;/h2&gt;

&lt;p&gt;What makes this extension compelling is not just that it converts currencies, but that it does so in a way that feels integrated into the browser experience.&lt;/p&gt;

&lt;p&gt;It combines several pieces of modern web development:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;browser extension architecture&lt;/li&gt;
  &lt;li&gt;content-script manipulation&lt;/li&gt;
  &lt;li&gt;background service workers&lt;/li&gt;
  &lt;li&gt;DOM analysis&lt;/li&gt;
  &lt;li&gt;asynchronous API calls&lt;/li&gt;
  &lt;li&gt;caching strategies&lt;/li&gt;
  &lt;li&gt;cross-site compatibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That combination makes the project more than a simple utility. It is a practical example of how browser extensions can enhance everyday online tasks in subtle but meaningful ways.&lt;/p&gt;

&lt;h2 id=&quot;future-possibilities&quot;&gt;Future Possibilities&lt;/h2&gt;

&lt;p&gt;The current version already provides a useful experience, but there is plenty of room for growth.&lt;/p&gt;

&lt;p&gt;Possible future improvements include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;supporting multiple target currencies at once&lt;/li&gt;
  &lt;li&gt;adding better localization and formatting rules&lt;/li&gt;
  &lt;li&gt;improving dark-mode compatibility for tooltips&lt;/li&gt;
  &lt;li&gt;expanding support for more storefronts and markup patterns&lt;/li&gt;
  &lt;li&gt;adding optional API-key support for higher-rate limits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These ideas would make the extension even more flexible and polished, especially for users who rely on it heavily while shopping internationally.&lt;/p&gt;

&lt;h2 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h2&gt;

&lt;p&gt;The Currency Converter Chrome Extension is a small project with a very practical purpose: making international online shopping easier to understand. It takes a simple idea—currency conversion—and embeds it directly into the browsing experience so the user does not have to leave the page or think about it consciously.&lt;/p&gt;

&lt;p&gt;What makes it stand out is the combination of simplicity and technical care. The project is easy to use, but behind the scenes it relies on a thoughtful architecture that handles price detection, currency recognition, exchange-rate fetching, and visual presentation in a coordinated way.&lt;/p&gt;

&lt;p&gt;For a browser extension, that balance is exactly what matters most. The goal is not just to add a feature, but to make that feature feel natural, fast, and useful in everyday life.&lt;/p&gt;

&lt;p&gt;If you enjoy using the extension, the best compliment is to keep it simple, reliable, and genuinely helpful for the people who need it most.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Explain That Code: From Copy-Pasting Code into ChatGPT to Building My Own Chrome Extension</title>
   <link href="https://www.withfahim.com/2026/02/13/explain-that-code"/>
   <updated>2026-02-13T00:00:00+06:00</updated>
   <id>https://www.withfahim.com/2026/02/13/Explain-that-code</id>
   <content type="html">&lt;div&gt;            
    &lt;a class=&quot; extension-card card-link&quot; href=&quot;https://chromewebstore.google.com/detail/gbohlhjjiebeckfaipdfpkcnmjbnhlca&quot; target=&quot;_blanc&quot;&gt;
    
    &lt;svg class=&quot;external-link-icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;
      &lt;path d=&quot;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&quot;&gt;&lt;/path&gt;
      &lt;polyline points=&quot;15 3 21 3 21 9&quot;&gt;&lt;/polyline&gt;
      &lt;line x1=&quot;10&quot; y1=&quot;14&quot; x2=&quot;21&quot; y2=&quot;3&quot;&gt;&lt;/line&gt;
    &lt;/svg&gt;

    &lt;img src=&quot;/assets/images/explain-that-code-ico.png&quot; alt=&quot;Extension Icon&quot; class=&quot;extension-icon&quot; /&gt;

    &lt;div class=&quot;extension-info&quot;&gt;
        &lt;h2&gt;
            Explain That Code

        &lt;/h2&gt;
        &lt;p&gt;
            Instant AI explanation for selected code. This extension is not yet published.
        &lt;/p&gt;
        &lt;span class=&quot;badge&quot;&gt;Chrome Extension&lt;/span&gt;
    &lt;/div&gt;
    &lt;/a&gt;

&lt;/div&gt;

&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;I got tired of copying code into ChatGPT just to understand it, so I built a Chrome extension that brings AI explanations directly into the current tab.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every developer has been there.&lt;/p&gt;

&lt;p&gt;You’re reading documentation, browsing GitHub, or scrolling through a Stack Overflow answer when you come across a piece of code that doesn’t quite make sense.&lt;/p&gt;

&lt;p&gt;My instinct was always the same.&lt;/p&gt;

&lt;p&gt;I would highlight the code, copy it, open ChatGPT, paste it, and ask for an explanation.&lt;/p&gt;

&lt;p&gt;It worked. But after doing it dozens of times a day (yes, I am so bad, i know…), I realized the process itself was slowing me down. Every explanation required leaving the page, switching tabs, and repeating the same sequence of actions.&lt;/p&gt;

&lt;p&gt;One day I caught myself doing it again and thought:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Why am I moving the code to AI? Why can’t AI come to the code?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That simple question became the idea behind &lt;strong&gt;Explain That Code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of interrupting my workflow every time I wanted to understand a snippet, I built a Chrome extension that lets me explain code without ever leaving the page.&lt;/p&gt;

&lt;p&gt;Now the process is simply:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Highlight the code.&lt;/li&gt;
  &lt;li&gt;Right-click.&lt;/li&gt;
  &lt;li&gt;Click &lt;strong&gt;Quick Explain This Code&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The extension handles everything else.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;why-i-built-it&quot;&gt;Why I Built It&lt;/h1&gt;

&lt;p&gt;The goal was not to create another AI chatbot.&lt;/p&gt;

&lt;p&gt;There are already many excellent ones.&lt;/p&gt;

&lt;p&gt;Instead, I wanted to reduce friction.&lt;/p&gt;

&lt;p&gt;Developers already spend most of their time inside the browser:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;GitHub&lt;/li&gt;
  &lt;li&gt;Stack Overflow&lt;/li&gt;
  &lt;li&gt;Documentation&lt;/li&gt;
  &lt;li&gt;Tutorials&lt;/li&gt;
  &lt;li&gt;Blogs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rather than switching tabs every few minutes, the extension lets developers stay focused while still benefiting from AI assistance.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;img style=&quot;width:100%; height:100%;border-radius:0&quot; src=&quot;/assets/images/explain-that-code.gif&quot; alt=&quot;Extension Icon&quot; class=&quot;extension-icon&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;features&quot;&gt;Features&lt;/h1&gt;

&lt;h2 id=&quot;right-click-context-menu&quot;&gt;Right-Click Context Menu&lt;/h2&gt;

&lt;p&gt;The extension adds a custom entry to Chrome’s context menu.&lt;/p&gt;

&lt;p&gt;Whenever text is selected, users can simply choose:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Quick Explain This Code
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;No copy-paste.&lt;/p&gt;

&lt;p&gt;No additional windows.&lt;/p&gt;

&lt;p&gt;No unnecessary clicks.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;multi-provider-ai-support&quot;&gt;Multi-Provider AI Support&lt;/h2&gt;

&lt;p&gt;Instead of locking users into a single AI provider, the extension supports multiple APIs.&lt;/p&gt;

&lt;p&gt;Currently supported:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;NVIDIA API (Free api available in some countries)&lt;/li&gt;
  &lt;li&gt;OpenAI (Paid)&lt;/li&gt;
  &lt;li&gt;DeepSeek (Paid)&lt;/li&gt;
  &lt;li&gt;OpenRouter (Free api available)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For now, I didn’t want to walk the path of payment and subscriptions. So, I let the users choose whichever provider they prefer.&lt;/p&gt;

&lt;p&gt;To be honest, this flexibility makes the extension useful for people with different budgets and preferences.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;choosing-models&quot;&gt;Choosing Models&lt;/h2&gt;

&lt;p&gt;Advanced users are not limited to default models. Each provider allows users to specify their own model of choice.&lt;/p&gt;

&lt;p&gt;Light-users who would not want to choose any model, can leave it empty and the extension automatically falls back to a sensible default.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;lets-be-technical&quot;&gt;Lets be technical&lt;/h1&gt;

&lt;h2 id=&quot;configuration&quot;&gt;Configuration&lt;/h2&gt;

&lt;p&gt;The extension stores settings using Chrome Storage Sync.&lt;/p&gt;

&lt;p&gt;This includes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Selected provider&lt;/li&gt;
  &lt;li&gt;API keys&lt;/li&gt;
  &lt;li&gt;Preferred model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because Chrome Sync is used, settings can travel across browsers when the user is signed into Chrome.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;provider-abstraction&quot;&gt;Provider Abstraction&lt;/h2&gt;

&lt;p&gt;One design goal was avoiding provider-specific code throughout the project.&lt;/p&gt;

&lt;p&gt;Instead, every provider is described using a configuration object.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;defaultModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;apiKeyStorageKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;modelStorageKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;defaults&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This approach made adding future providers significantly easier.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;how-chrome-handles-everything&quot;&gt;How Chrome Handles everything&lt;/h1&gt;

&lt;p&gt;The extension is built using Manifest V3. It’s been only a few days into building simple chrome extensions and as a javascript developer I am really enjoying it.&lt;/p&gt;

&lt;h2 id=&quot;service-worker&quot;&gt;Service Worker&lt;/h2&gt;

&lt;p&gt;The background service worker is like the conductor of an orchestra. It doesn’t play every instrument itself, but it ensures everything happens at the right time and in the right order. It is responsible for:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Creating context menu items&lt;/li&gt;
  &lt;li&gt;Receiving messages from the user&lt;/li&gt;
  &lt;li&gt;Reading saved settings&lt;/li&gt;
  &lt;li&gt;Sending API requests&lt;/li&gt;
  &lt;li&gt;Returning AI responses to the user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because Manifest V3 uses service workers, the extension remains lightweight and efficient.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;content-script&quot;&gt;Content Script&lt;/h2&gt;

&lt;p&gt;The content script is like the little performer working as the service worker tells it to do. It creates DOM elements, processes data and mostly acts as the bridge between webpages and the extension.&lt;/p&gt;

&lt;p&gt;Its responsibilities include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Receiving selected text&lt;/li&gt;
  &lt;li&gt;Sending requests to the service worker&lt;/li&gt;
  &lt;li&gt;Displaying explanations inside the page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The separation between the content script and the service worker keeps responsibilities clean and the code organized and maintainable.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;messaging-architecture&quot;&gt;Messaging Architecture&lt;/h2&gt;

&lt;p&gt;The extension relies heavily on Chrome’s messaging system.&lt;/p&gt;

&lt;p&gt;The workflow looks like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;User selects code
        │
        ▼
Context Menu
        │
        ▼
Background Service Worker
        │
        ▼
Content Script
        │
        ▼
AI Provider
        │
        ▼
Background Service Worker
        │
        ▼
Content Script
        │
        ▼
Explanation shown to user
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;error-handling&quot;&gt;Error Handling&lt;/h1&gt;

&lt;p&gt;One area I spent considerable time improving was error handling.&lt;/p&gt;

&lt;p&gt;The extension gracefully handles situations such as:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Missing API keys&lt;/li&gt;
  &lt;li&gt;Invalid providers&lt;/li&gt;
  &lt;li&gt;Empty selections&lt;/li&gt;
  &lt;li&gt;API failures&lt;/li&gt;
  &lt;li&gt;Unexpected provider responses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of failing silently, users receive meaningful feedback explaining what went wrong.&lt;/p&gt;

&lt;p&gt;Good software isn’t just about successful requests, it should also fail gracefully.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;code-quality&quot;&gt;Code Quality&lt;/h1&gt;

&lt;p&gt;As the project evolved, I began refactoring it to make it easier to maintain.&lt;/p&gt;

&lt;p&gt;Instead of scattering provider-specific logic throughout the codebase, almost everything is driven by configuration.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Provider URLs&lt;/li&gt;
  &lt;li&gt;Default models&lt;/li&gt;
  &lt;li&gt;Placeholder text&lt;/li&gt;
  &lt;li&gt;Custom headers&lt;/li&gt;
  &lt;li&gt;Request defaults&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This significantly reduces duplication and keeps the code in content script easy to understand and maintain.&lt;/p&gt;

&lt;p&gt;When adding another provider in the future, very little application logic needs to change.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;current-limitations&quot;&gt;Current Limitations&lt;/h1&gt;

&lt;p&gt;Like every project, this extension still has room to grow.&lt;/p&gt;

&lt;p&gt;Some planned improvements include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Streaming AI responses&lt;/li&gt;
  &lt;li&gt;Conversation history&lt;/li&gt;
  &lt;li&gt;Better syntax highlighting&lt;/li&gt;
  &lt;li&gt;Follow-up questions&lt;/li&gt;
  &lt;li&gt;Additional AI providers&lt;/li&gt;
  &lt;li&gt;More customizable prompts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Streaming is especially exciting because explanations would begin appearing immediately instead of waiting for the complete response. But I think, without the chatting functionality it’s not needed that much at the moment.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;who-can-benefit&quot;&gt;Who Can Benefit?&lt;/h1&gt;

&lt;p&gt;This extension is useful for many different groups.&lt;/p&gt;

&lt;h2 id=&quot;students&quot;&gt;Students&lt;/h2&gt;

&lt;p&gt;Learning a new programming language often means reading unfamiliar code.&lt;/p&gt;

&lt;p&gt;Instant explanations for simple snippets without leaving your current tab might reduce frustration and accelerate learning.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;self-taught-developers&quot;&gt;Self-Taught Developers&lt;/h2&gt;

&lt;p&gt;Self-learning is full of small moments where you think, “Wait… what does this line actually do?” Rather than breaking your concentration to ask an AI assistant in another tab, you can get an explanation exactly where you’re learning.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;professional-developers&quot;&gt;Professional Developers&lt;/h2&gt;

&lt;p&gt;Even experienced developers regularly encounter unfamiliar frameworks or libraries.&lt;/p&gt;

&lt;p&gt;Quick explanations save time and reduce context switching.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;technical-writers&quot;&gt;Technical Writers&lt;/h2&gt;

&lt;p&gt;Understanding code snippets becomes much easier when AI can explain their purpose and structure directly within the browser.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;lessons-learned&quot;&gt;Lessons Learned&lt;/h1&gt;

&lt;p&gt;Building this extension reinforced several important software engineering principles.&lt;/p&gt;

&lt;h2 id=&quot;configuration-beats-conditionals&quot;&gt;Configuration Beats Conditionals&lt;/h2&gt;

&lt;p&gt;Rather than writing:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;provider&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;openrouter&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;provider&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;nvidia&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;provider&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;openai&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;a configuration-driven design keeps the code cleaner and far easier to extend.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;separation-of-responsibilities&quot;&gt;Separation of Responsibilities&lt;/h2&gt;

&lt;p&gt;The project naturally divided into independent components:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Options page&lt;/li&gt;
  &lt;li&gt;Background service worker&lt;/li&gt;
  &lt;li&gt;Content script&lt;/li&gt;
  &lt;li&gt;Provider configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each part has a single responsibility.&lt;/p&gt;

&lt;p&gt;This makes debugging and future development significantly easier.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;good-error-messages-matter&quot;&gt;Good Error Messages Matter&lt;/h2&gt;

&lt;p&gt;Users don’t want mysterious failures.&lt;/p&gt;

&lt;p&gt;They want clear explanations.&lt;/p&gt;

&lt;p&gt;Investing time in descriptive error handling greatly improves the overall user experience.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;future-plans&quot;&gt;Future Plans&lt;/h1&gt;

&lt;p&gt;I loved working with this extension and considering how much I use it, it feels more like a super personal tool rather than a webstore-published publicly available extension. So, I will definitely maintain it and add more features to make my own development experience smooth.&lt;/p&gt;

&lt;p&gt;Some features I’d like to add include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Adding a theory mode for students and a technical mode for developers&lt;/li&gt;
  &lt;li&gt;Support for additional providers such as Anthropic and Groq&lt;/li&gt;
  &lt;li&gt;Option to pin the dom element that shows the explanation&lt;/li&gt;
  &lt;li&gt;Saving history as well as a temporary mode&lt;/li&gt;
  &lt;li&gt;Response streaming&lt;/li&gt;
  &lt;li&gt;Keyboard shortcuts&lt;/li&gt;
  &lt;li&gt;Dark mode improvements&lt;/li&gt;
  &lt;li&gt;Prompt customization&lt;/li&gt;
  &lt;li&gt;Better markdown rendering&lt;/li&gt;
  &lt;li&gt;AI conversation mode&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have designed the architecture with these future additions in mind.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h1&gt;

&lt;p&gt;Explain That Code was built to solve a small but frequent annoyance in a developer’s workflow.&lt;/p&gt;

&lt;p&gt;Instead of forcing developers to leave the page they’re reading, the extension brings AI assistance directly to where they’re already working.&lt;/p&gt;

&lt;p&gt;Hopefully, it makes learning, reading, and understanding code just a little bit easier for everyone.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>HackerNews discord bot</title>
   <link href="https://www.withfahim.com/2021/09/05/hacker-news-bot"/>
   <updated>2021-09-05T00:00:00+06:00</updated>
   <id>https://www.withfahim.com/2021/09/05/Hacker-news-bot</id>
   <content type="html">&lt;p&gt;I am too lazy to write about this bot.&lt;/p&gt;

&lt;p&gt;Visit &lt;a href=&quot;https://withfahim.com/hacker-news-discord-bot/&quot; title=&quot;this link&quot;&gt;this link&lt;/a&gt; to know more about it.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If the bot is offline its because I am poor.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>A roadmap for learning PHP</title>
   <link href="https://www.withfahim.com/2021/08/30/php-learning-roadmap"/>
   <updated>2021-08-30T00:00:00+06:00</updated>
   <id>https://www.withfahim.com/2021/08/30/php-learning-roadmap</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;If You are are new in programming and don’t know what php is, &lt;a href=&quot;https://www.php.net/docs.php&quot;&gt;this&lt;/a&gt; will be a quick help for you. 🥹&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, when I wanted to learn php, it was not because I want to learn php rather it was because I had to learn laravel as a job requirement. I knew It was crazy to think about learning a framework without any prior knowledge in the language it was based upon. But as I already worked with django framework, I was pretty much desperate. So, I went through a lot of things like google, reddit, stackoverflow and what not to have the best suggestion from people who are already proficient in php. And yes, I found a lot of paths and roadmaps. So, I wanted to list them all in a single place to find them easily when needed.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;After all my research and hours of internet surfing, what I learnt is if you don’t have at least some understanding of the basics, learning a framework as a first step is a bit of overkill. But if you are coming from another language or you are an experienced developer, it might not be that hard. It’s hard to appreciate what a good framework does for you if you don’t have a fair understanding of how things are often done without one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Whenever I am learning a new thing (except for a game of course XD), I like to go through the documentation first. So, as a starter to know what php is and how php works, &lt;a href=&quot;https://www.php.net/manual/en/&quot;&gt;documentation&lt;/a&gt; is all you need.&lt;/p&gt;

&lt;p&gt;If You are not a complete newbie in coding and you already know how things work in OOP &lt;a href=&quot;https://www.killerphp.com/tutorials/php-objects-page-1/&quot;&gt;this&lt;/a&gt; will be a quick help for you.&lt;/p&gt;

&lt;p&gt;But if you are quite new or you want to have an in-depth knowledge in php syntaxes, functions and other built in features of php, The following free tutorials from youtube will surely help:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://youtu.be/yXzWfZ4N4xU&quot;&gt;Tutorial 1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://youtube.com/playlist?list=PLr3d3QYzkw2xabQRUpcZ_IBk9W50M9pe-&quot;&gt;Tutorial 2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
After you have mastered raw php, you can try to do some beginners project in php.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://youtu.be/5fTFHAwWRV4&quot;&gt;Laravel Project - Create Simple Student Management System&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://youtu.be/ZBgTzx46B8s&quot;&gt;Food Order Website with PHP and MySQL&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://youtu.be/6R5hMKAW7n4&quot;&gt;Laravel basic project&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;Remember, you need basic knowledge in HTML, CSS and javascript to understand and build these projects. You will also need a basic understanding of databases. Learning MySQL will be enough to start.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After you are done with learning basic php you can move on to learning a framework like Laravel, Symfony, CodeIgniter, CakePHP etc.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
I am currently learning laravel. To learn laravel I can suggest 3 things of which 2 are free.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://laravel.com/docs/8.x&quot;&gt;Laravel documentation&lt;/a&gt; The official laravel documentation is a great tool in learning laravel. But following the documentation only might not feel straight and smooth. There’s a ton of things you might get confused about. So, I would suggest to follow one tutorial at least. The next two options are actually two tutorials of which one is free and another is paid.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://youtu.be/376vZ1wNYPA&quot;&gt;A free tutorial on Youtube&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.udemy.com/course/php-with-laravel-for-beginners-become-a-master-in-laravel/&quot;&gt;A tutorial on Udemy&lt;/a&gt;
    &lt;blockquote&gt;
      &lt;p&gt;It’s paid but it goes on sale often.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Regarding this tutorial, I think I should give a little review as it’s a paid one. In my opinion, the instructor, &lt;a href=&quot;https://www.udemy.com/user/edwin166/&quot;&gt;Edwin Diaz&lt;/a&gt; is one of the finest instructor on Udemy. He teaches in a way that you won’t be able to move your attention from him. You wont feel bored and overall, the tutorial is good.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Here, I have offered a pathway to learn laravel explicitely since I am learning laravel currently. May be in another post I will write about Why I chose laravel at the first place. Also, if I find more good resources which helped or might help me in my php journey I will append those in this post.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br /&gt;
Useful Resources:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://mojipo.com/&quot;&gt;Mojipo.com&lt;/a&gt; A beautiful guide for becoming a php professional. Felt a bit newbie unfriendly to me.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/thecodeholic/php-developer-roadmap&quot;&gt;Detailed roadmap on github&lt;/a&gt; For someone with zero knowledge in computers, coding and how things work on zeroes and ones as well as someone with any level of prior knowledge in coding. You can start from any section based on your current skill level.&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>SteamPy breakdown &amp;#58; Part 1</title>
   <link href="https://www.withfahim.com/2021/05/21/steampy-1"/>
   <updated>2021-05-21T00:00:00+06:00</updated>
   <id>https://www.withfahim.com/2021/05/21/steampy-1</id>
   <content type="html">&lt;p&gt;In this post I am going to write about SteamPy, an SCM investment profit tracker for CS:GO items. Well, for now it can track only CS:GO items. I might add support for other games later.&lt;/p&gt;

&lt;p&gt;If you want to know what does it do you should go through the &lt;a href=&quot;https://github.com/f4him/SteamPy#readme&quot; title=&quot;documentation&quot;&gt;documentation&lt;/a&gt;. Here I will be describing the ‘how does it do’ part only.&lt;/p&gt;

&lt;p&gt;So, there are four files that run the program: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main.py&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_price.py&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;operation.py&lt;/code&gt; and our beloved &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;investment.ini&lt;/code&gt; file which just act as a config file.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;This program is so small it could have been done within a single python file but I did use multiple files to better understand the concepts like importing, modulesm packages etc.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;mainpy-file-breakdown&quot;&gt;main.py file breakdown:&lt;/h4&gt;

&lt;p&gt;In the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main.py&lt;/code&gt; file we have the import section at the top which holds all the necessary modules and packages.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;operation&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;configparser&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argparse&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For the simplicity of understanding I will go to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main()&lt;/code&gt; function first and then we will go through the other functions as they are needed during the lifetime of our program.&lt;/p&gt;

&lt;p&gt;So, in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main()&lt;/code&gt; function we have:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;option&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get_arguments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;operations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;option&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here, we are calling &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_arguments()&lt;/code&gt; function to understand what arguments the user has given us. If we look into the function &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_arguments()&lt;/code&gt; we can see we have two flags &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-s&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--short &lt;/code&gt;and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-l&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--long&lt;/code&gt; for two different types of functionality. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ArgumentParser()&lt;/code&gt; can store command line input string as objects and this information can be used by calling &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;parse_args()&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get_arguments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argparse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;A python script to track your SCM investment profits easily.To make this programm give an efficient output, be as accurate as you can when filling up the investment.ini file. It is recommended that you put the name exactly as they are on SCM.&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;epilog&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;N.B. profit/loss is calculated after deducting the 15% steam tax.&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;add_argument&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;-s&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;--short&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;store_true&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;generate a short report: name and net profit/loss&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;add_argument&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;-l&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;--long&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;store_true&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;generate a full detailed report of your investments&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;parse_args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To get into more details about parsing arguments in python check out &lt;a href=&quot;#&quot; title=&quot;this&quot;&gt;this&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After the user choice is received we pass it to the function &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;operation()&lt;/code&gt; as a parameter. Now lets look at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;operation()&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;operations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;choice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;choice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;choice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;short&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Use either -s or -l to generate a report, not both.&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;choice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;long&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;choice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;short&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;shortlist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Please use -s or -l with the command to generate a report. For more help, use -h&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here, the code is a simple if else block which is checking the validity of the received argument. If it is not valid, the program shows some help texts, otherwise for option &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-l&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--long&lt;/code&gt;, it calls &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;details()&lt;/code&gt; and for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-s&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--short&lt;/code&gt;, it calls the function &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;shortlist()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;With this, breakdown of our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main.py&lt;/code&gt; ends here.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;#&quot; title=&quot;Click here&quot;&gt;Click here&lt;/a&gt; to continue to the next part.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>CS:GO key binding and scripting on linux</title>
   <link href="https://www.withfahim.com/2020/07/12/csgo-keybinding"/>
   <updated>2020-07-12T00:00:00+06:00</updated>
   <id>https://www.withfahim.com/2020/07/12/csgo-keybinding</id>
   <content type="html">&lt;p&gt;Buying weapons takes time in CS:GO and every second counts.&lt;/p&gt;

&lt;p&gt;Before a round start we usually get a few seconds to buy things. Here, ‘things’ includes arms, different types of explosives and kits. Imagine you hit a keyboard key and items are bought instantly. No need to open the buy menu to buy items and waste time before every round starts.&lt;/p&gt;

&lt;p&gt;I know that you already know about key binding in CS:GO.&lt;/p&gt;

&lt;p&gt;For those who didn’t know, binding means to set a keyboard key to do some events like purchasing weapons, sending in-game messages or may be decrease your mouse sensitivity. Normally, you have to manually do these events in the particular interfaces. But if you bind keys to these events, they can be done only by a single key stroke.&lt;/p&gt;

&lt;p&gt;I play CS:GO on my manjaro linux. So, when I searched the internet over tutorials and howtos on key binding, I found a lot. But all of them were for windows platform. I was at a loss what to do or which file to edit for linux. So, after doing a lot of file searching, some guessing I found the way to permanently bind CS:GO commands to keyboard keys.&lt;/p&gt;

&lt;p&gt;Here is how you can do it too.&lt;/p&gt;

&lt;h5 id=&quot;finding-the-configcfg-file&quot;&gt;Finding the config.cfg file:&lt;/h5&gt;

&lt;p&gt;Basically to bind the commands you have to go to the following location on your file system:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/home/your_user_name/.local/share/Steam/userdata/1025583974/730/local/cfg/config.cfg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you have multiple accounts registered in your steam cleint, you will find multiple directories inside the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;userdata&lt;/code&gt; directory. Inside the user directory you will look for a directory named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;730&lt;/code&gt; as it is the game code of CS:GO.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Before you start playing with the config file, I will highly recommend you to keep a backup of the file. To back up fire up the terminal in the directory containg the config file and give the following command&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cp config.cfg config_backup.cfg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h5 id=&quot;binding-a-single-command&quot;&gt;Binding a single command:&lt;/h5&gt;

&lt;p&gt;Now to bind commands to a key, you have to follow the following format:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bind “key_code” “command [arg]”
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;‘bind‘ is a keyword here, ‘key_code‘, ‘command‘ and ‘arg‘ (if there is) must be exchanged with actual key codes, command and the command’s argument respectively.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bind “p” “buy defuser”
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here, ‘p’ is the key code, ‘buy‘ is the command and ‘defuser‘ is the argument.
Binding multiple commands:&lt;/p&gt;

&lt;p&gt;You can also bind multiple commands to a single key, you have to follow the following format:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bind “key_code” “command1 [arg1]; command2 [arg2]”
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For example:
bind “l” “use weapon_c4;drop;say_team dropping bomb”
Now, pressing ‘L’ will immediatly drop the c4 no matter which slot you are equipped with and a team message “dropping bomb” will be sent.&lt;/p&gt;

&lt;p&gt;You have to append these commands in the config file each on a newline.&lt;/p&gt;

&lt;p&gt;There is also another method to bind keys on the developer console. After binding, there you have to export the binds to a file. Then the contents of the files have to be pasted in the config file. That method is effective for newbies who has to check the functionality of the scripts by playing at the same time. But if you know what you are doing then I suggest you to directly append the bindings to the config file.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;As I have experienced, on linux, this &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config.cfg&lt;/code&gt; file is executed automatically everytime your game launches. So, unlike windows, you won’t have to put any launch options to auto execute your config file everytime the game launches.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here’s an example of some standard bindings.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;// buy binds
bind “kp_home” “buy ak47; buy m4a1;”
bind “kp_uparrow” “buy awp;”
bind “kp_pgup” “buy negev;”
bind “kp_leftarrow” “buy flashbang;”
bind “kp_5” “buy smokegrenade;”
bind “kp_rightarrow” “buy molotov; buy incgrenade;”
bind “kp_end” “buy vesthelm;”bind “kp_downarrow” “buy defuser;”
bind “kp_pgdn” “buy p250;”
bind “kp_del” “buy vest;”
bind “kp_slash” “buy ump45;”
bind “kp_multiply” “buy p90;”
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once you’ve set your binds, your next step is to practice them and become adjusted to their functionality. This will inevitably take time to get used to, but the more you practice, the better you become. Eventually, the buy menu will be a breeze, giving you time to focus on strategy and get your head in the game.&lt;/p&gt;

&lt;p&gt;You should also check the functionality of the ‘alias‘ command in CS:GO scripts to make your scripts simpler and more manageable.&lt;/p&gt;

&lt;p&gt;Here is a &lt;a href=&quot;http://csgobindsgenerator.com/&quot; title=&quot;tool&quot;&gt;tool&lt;/a&gt; to help you with generating buy binds.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Fix poor download speed in terminal when updating or installing new packages on manjaro</title>
   <link href="https://www.withfahim.com/2020/07/03/pacman-mirrors"/>
   <updated>2020-07-03T00:00:00+06:00</updated>
   <id>https://www.withfahim.com/2020/07/03/pacman-mirrors</id>
   <content type="html">&lt;p&gt;I remember, like every other day I fired up my potato and may be an hour later when i finally logged in, I opened up terminal and wrote the divine mantra to make my device new.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo pacman -Syu
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then I saw the download speed was around a few kbps even though my internet speed was a decent one.&lt;/p&gt;

&lt;p&gt;So, I surfed the internet and found out about &lt;strong&gt;pacman-mirrors&lt;/strong&gt;.
Pacman-mirrors is a Manjaro specific utility for generating and maintaining the system mirror-list.&lt;/p&gt;

&lt;p&gt;Manjaro uses pacman as package manager for maintainence, updates, installations and removal of packages.&lt;/p&gt;

&lt;p&gt;For pacman to function, a list of servers, or more commonly known as mirrors, with Manjaro software packages is required. As Manjaro has many mirrors all over the world it is feasible to use the mirrors closest to our location and preferably also up-to-date.&lt;/p&gt;

&lt;p&gt;Here is how you can use pacman-mirrors to select the closest server so you get the best possible download speed.&lt;/p&gt;

&lt;h5 id=&quot;to-list-available-countries-in-the-default-mirror-pool-execute-this-command-on-your-terminal&quot;&gt;To list available countries in the default mirror pool execute this command on your terminal:&lt;/h5&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pacman-mirrors --country-list
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h5 id=&quot;to-list-available-countries-in-custom-mirror-pool-execute-this&quot;&gt;To list available countries in custom mirror pool execute this:&lt;/h5&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pacman-mirrors --country-config
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h5 id=&quot;to-check-what-branch-you-are-on&quot;&gt;To check what branch you are on:&lt;/h5&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pacman-mirrors --get-branch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;Here was the main problem I was facing. I didn’t know that Bangladesh has an official manjaro mirror. It is hosted in Xeonbd’s Bangladesh Data Center since 2018. So, I configured my pacman-mirrors for a custom mirror pool (In this case it was Bangladesh, obviously) and my problem was solved.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h5 id=&quot;to-update-mirror-list-with-the-fastest-mirrors-you-can-invoke-this-command&quot;&gt;To Update mirror-list with the fastest mirrors you can invoke this command:&lt;/h5&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo pacman-mirrors --fasttrack
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Remember, after changing the mirror-list you have to synchronize pacman with the newly configured mirror-list.&lt;/p&gt;

&lt;h5 id=&quot;you-can-synchronize-pacman-by-this-command&quot;&gt;You can synchronize pacman by this command:&lt;/h5&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo pacman -Syyu
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So it’s better to execute the command like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo pacman-mirrors --fasttrack &amp;amp;&amp;amp; sudo pacman -syyu
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h5 id=&quot;to-use-your-current-location-as-a-mirror-you-can-invoke-this-command&quot;&gt;To use your current location as a mirror, you can invoke this command:&lt;/h5&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo pacman-mirrors --geoip &amp;amp;&amp;amp; sudo pacman -Syyu
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;Note: Not all countries have mirrors, if geoip returns a country not in the pool all mirrors will be used.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h5 id=&quot;customize-mirror-pool-by-specific-countries&quot;&gt;Customize mirror pool by specific countries:&lt;/h5&gt;

&lt;p&gt;If you have checked the mirror-list and you are certain about using a custom mirror pool by some specific countries, you can use this command to do so:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo pacman-mirrors --country Germany,France,Austria &amp;amp;&amp;amp; sudo pacman -Syyu
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h5 id=&quot;customize-mirror-pool-by-interactive-selection&quot;&gt;Customize mirror pool by interactive selection:&lt;/h5&gt;

&lt;p&gt;If you are not so comfortable supplying all arguments in commands, you can do this by an interactive selection too. This command will do it:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo pacman-mirrors --interactive --default &amp;amp;&amp;amp; sudo pacman -Syyu
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here, using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--default&lt;/code&gt; flag will list all available mirrors and procotols in a gui windows allowing to sort the columns and interactively select according to your preferences. If you don’t use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--default&lt;/code&gt; flag all the mirrors from current list (wheather default or not) will be listed.&lt;/p&gt;

&lt;p&gt;When you save your selection, a custom mirror pool is created and will serve as your current mirror pool.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Don’t limit the mirror list in a custom pool too much. pacman will always use the up-to-date mirrors and ignore the other mirrors. So, keep in mind what you are doing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The customized pool is saved as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/lib/pacman-mirrors/custom-mirrors.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you think you have gone too far and dont know where you are and what to do, you can always reset everything. To apply pacman-mirrors defaults:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo pacman-mirrors --country all --api --protocol all -set-branch stable &amp;amp;&amp;amp; sudo pacman -Syyu
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The system will now throw messages about newer packages on the system. These messages can safely be ignored and they dissappear when the installed package(s) equals the system branch.&lt;/p&gt;

&lt;p&gt;Hope this helped you solving your terminal download speed issue.&lt;/p&gt;

&lt;p&gt;For more info on pacman-mirrors you can always head to our friend &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;man&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;man pacman-mirrors
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To get help on usage:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ pacman-mirrors --help
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To check Version:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ pacman-mirrors --version
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I am glad if this piece of writing did help you in any way. 
All the informations here was taken from &lt;a href=&quot;http://https://wiki.manjaro.org/index.php/Pacman-mirrors&quot; title=&quot;manjaro-wiki&quot;&gt;manjaro-wiki&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Installing Avro and fixing up Bangla font problem on Debian based Linux</title>
   <link href="https://www.withfahim.com/2020/06/23/avro-installation-in-debian-based-linux"/>
   <updated>2020-06-23T00:00:00+06:00</updated>
   <id>https://www.withfahim.com/2020/06/23/avro-installation-in-debian-based-linux</id>
   <content type="html">&lt;p&gt;If you have installed a fresh debian based linux distro (Kali, Ubuntu, Deepin etc) and you need to work with Bangla font, you will need to install Avro and also some Bangla fonts.&lt;/p&gt;

&lt;p&gt;Installing avro will let you type in Bangla where installing the fonts will fix the preview of joint letters (Jukta borno).&lt;/p&gt;

&lt;p&gt;If you do not know what is avro, it’s a system which supports most modern English to Bangla phonetic typing method. For example, write anywhere “ami banglay gan gai” and it will be automatically typed as “আমি বাংলায় গান গাই”.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you cant see the above bangla text or it appears as broken boxes in your bowser, installing the fonts will fix this issue.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In linux, you can install avro through ibus-avro. This software works as an Engine (plugin) of IBus and let users type in English and on-the-fly transliterate them phonetically to Bangla.&lt;/p&gt;

&lt;p&gt;Features of ibus-avro:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;100% compatible with the current Avro Phonetic scheme.&lt;/li&gt;
  &lt;li&gt;A preview window lets you see the originally typed text right under the cursor.&lt;/li&gt;
  &lt;li&gt;Enabling dictionary can predict and suggest phonetically similar words with correct spelling on the fly.&lt;/li&gt;
  &lt;li&gt;Commonly used English words are transliterated to Bangla (like, Facebook, download etc.) even with their original English spelling.&lt;/li&gt;
  &lt;li&gt;All the preferences are customizable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;installing-ibus-avro&quot;&gt;Installing ibus-avro:&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Step 1 – Installing dependencies:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need to install the following packages. Use the command as shown below for debian based distros:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;apt-get install git ibus libibus-1.0-dev automake autoconf gjs gir1.2-ibus-1.0 ibus-1.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Step 2 – Installing ibus-avro:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once the dependencies are installed, copy the git repository for ibus-avro through the following command:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git clone git://github.com/sarim/ibus-avro.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After the completion of cloning, go inside the git directory, compile, configure and install ibus-avro by giving the following commands step by step:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cd ibus-avro
aclocal &amp;amp;&amp;amp; autoconf &amp;amp;&amp;amp; automake --add-missing 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;If for some reasons, this command doesn’t work for you, just give the commands one by one, without using the &amp;amp;&amp;amp; like shown below:
    aclocal
    autoconf
    automake –add-missing&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;after the successful completion of these 3 commands add the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--prefix=/usr&lt;/code&gt; flag to configuration.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;./configure --prefix=/usr 
sudo make install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Done.&lt;/p&gt;

&lt;h5 id=&quot;setting-up-bangla-as-an-input-method&quot;&gt;Setting up Bangla as an input method:&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;Run IBus (Applications-&amp;gt;System Tools-&amp;gt;IBus)&lt;/li&gt;
  &lt;li&gt;Open IBus Preferences right-clicking the panel icon&lt;/li&gt;
  &lt;li&gt;Go to Input method&lt;/li&gt;
  &lt;li&gt;Select an input method -&amp;gt; Bengali -&amp;gt; Avro&lt;/li&gt;
  &lt;li&gt;Now Click Add button to add Avro to the list&lt;/li&gt;
  &lt;li&gt;Now restart IBus from the top panel icon (Right Click -&amp;gt; Restart)&lt;/li&gt;
  &lt;li&gt;Now Press Ctrl+Space to toggle between English and Avro (Bengali)&lt;/li&gt;
  &lt;li&gt;Enjoy Avro Phonetic!&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;installing-bangla-fonts&quot;&gt;Installing Bangla fonts:&lt;/h4&gt;

&lt;p&gt;Now that avro is installed, you can type in Bangla without any problem. There might be one more issue though. You are most likely to see certain joint letters not showing up properly (like: স্থান, শাস্ত্র, পঞ্চাশ etc).&lt;/p&gt;

&lt;p&gt;If this is the case then you have to install some bangla fonts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To install Bangla fonts:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Download some Bangla fonts from &lt;a href=&quot;https://github.com/f4him/bangla-fonts&quot; title=&quot;here&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Go to your home directory.&lt;/li&gt;
  &lt;li&gt;Turn show hidden files on, Create a directory named .fonts (if it’s not already there)&lt;/li&gt;
  &lt;li&gt;In that directory create a folder bangla_fonts and paste all the downloaded fonts there.&lt;/li&gt;
  &lt;li&gt;Open terminal, type this command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fc-cache -fv&lt;/code&gt; and hit Return.&lt;/li&gt;
  &lt;li&gt;All the fonts should be loaded now.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Restart applications you were using in the running session and you will see everything is showing up correctly and no letters are broken or anything.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Reference for all texts</title>
   <link href="https://www.withfahim.com/2019/08/31/reference-for-all-texts"/>
   <updated>2019-08-31T00:00:00+06:00</updated>
   <id>https://www.withfahim.com/2019/08/31/reference-for-all-texts</id>
   <content type="html">&lt;h1 id=&quot;h1&quot;&gt;h1&lt;/h1&gt;

&lt;h2 id=&quot;h2&quot;&gt;h2&lt;/h2&gt;

&lt;h3 id=&quot;h3&quot;&gt;h3&lt;/h3&gt;

&lt;h4 id=&quot;h4&quot;&gt;h4&lt;/h4&gt;

&lt;h5 id=&quot;h5&quot;&gt;h5&lt;/h5&gt;

&lt;hr /&gt;

&lt;p&gt;Lorem ipsum dolor amet tousled viral art party blue bottle single-origin coffee cardigan, selvage man braid helvetica. &lt;a href=&quot;//#&quot;&gt;Banh&lt;/a&gt; mi taxidermy meditation microdosing. Selvage cornhole YOLO, small batch vexillologist raclette VHS prism sustainable 8-bit ugh semiotics letterpress disrupt pop-up. Celiac shabby chic ugh, jianbing whatever kitsch tattooed edison bulb kogi irony etsy.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;a&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;b&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;c&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;Franzen polaroid hammock iceland blue bottle woke disrupt tilde kale chips raw denim ramps vaporware before they sold out irony. Narwhal vaporware offal shaman celiac kinfolk activated charcoal salvia lomo irony readymade normcore. Yr activated charcoal kombucha, man braid whatever biodiesel hella crucifix adaptogen bicycle rights small batch skateboard mixtape. Hot chicken sustainable green juice 90’s. Ennui kickstarter hella pug, meggings man bun shaman messenger bag. Chambray adaptogen kombucha pug affogato, kogi green juice distillery ugh banh mi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;VHS roof party waistcoat cold-pressed, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;snippet.CodeExample();&lt;/code&gt; master cleanse affogato franzen. Shaman iceland pour-over intelligentsia typewriter tilde, pitchfork copper mug. Wayfarers kickstarter adaptogen vinyl beard kombucha. Organic pinterest master cleanse, mixtape fam gentrify lo-fi kogi.&lt;/p&gt;

&lt;p&gt;js&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;function &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;java&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;fun&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;args:&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Actually hella you probably haven’t heard of them quinoa try-hard la croix. Street art schlitz actually hell of pour-over air plant. Post-ironic franzen brunch mumblecore readymade. Food truck photo booth polaroid, gochujang vegan street art yr before they sold out man bun. Tilde selfies chia pitchfork everyday carry post-ironic mumblecore sartorial VHS master cleanse activated charcoal biodiesel williamsburg cronut jean shorts. Poutine helvetica keffiyeh butcher pop-up.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://images.unsplash.com/photo-1573481193569-c00872fb99fb?ixlib=rb-1.2.1&amp;amp;q=80&amp;amp;fm=jpg&amp;amp;crop=entropy&amp;amp;cs=tinysrgb&amp;amp;dl=k-mitch-hodge-yTVqCMI2yPY-unsplash.jpg&amp;amp;w=2400&quot; alt=&quot;&quot; /&gt;
&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/@kmitchhodge?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;K. Mitch Hodge&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/collections/8725460/sky?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 

</feed>
