<?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: MusabShakil</title>
    <description>The latest articles on DEV Community by MusabShakil (@musabshakil).</description>
    <link>https://dev.to/musabshakil</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%2F783289%2Ff3651bd8-038a-4cbc-9974-9627300cb540.png</url>
      <title>DEV Community: MusabShakil</title>
      <link>https://dev.to/musabshakil</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/musabshakil"/>
    <language>en</language>
    <item>
      <title>What is agent in AI</title>
      <dc:creator>MusabShakil</dc:creator>
      <pubDate>Sat, 01 Jul 2023 22:33:12 +0000</pubDate>
      <link>https://dev.to/musabshakil/what-is-agent-in-ai-85j</link>
      <guid>https://dev.to/musabshakil/what-is-agent-in-ai-85j</guid>
      <description>&lt;p&gt;An AI agent, also known as an artificial intelligence agent, is a software program or system designed to perform specific tasks or make decisions autonomously, often using machine learning and other AI techniques.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does an AI agent do?
&lt;/h2&gt;

&lt;p&gt;The primary goal of an AI agent is to interact with its environment, gather information, analyze it, and take actions to achieve its objectives. An AI agent can performs tasks such as data analysis, decision-making, natural language processing, image recognition, playing games, and personalized recommendations.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the 4 agents in AI?
&lt;/h2&gt;

&lt;p&gt;There are several AI agents available that cater to different needs and objectives. Let's take a look at four notable AI agents:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://github.com/Significant-Gravitas/Auto-GPT" rel="noopener noreferrer"&gt;Auto-GPT&lt;/a&gt;, is an AI agent that offers autonomous operation and the ability to access the internet for information gathering. It utilizes GPT-4, a state-of-the-art text generation model. Auto-GPT is also extensible through the use of plugins and provides file storage capabilities. However, it's worth noting that Auto-GPT is an experimental application with potential cost concerns and may not align with real-world practices, with limited liability for any consequences.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/yoheinakajima/babyagi" rel="noopener noreferrer"&gt;BabyAGI&lt;/a&gt;, is a Python script-based AI agent that leverages OpenAI and vector databases like Chroma or Weaviate. It enables the creation, prioritization, and execution of tasks based on previous task results and a predefined objective. BabyAGI's pros include its task management capabilities and integration with powerful databases. However, running the script continuously can lead to high API usage, and it requires proper setup of the OpenAI API before use.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/muellerberndt/mini-agi" rel="noopener noreferrer"&gt;MiniAGI&lt;/a&gt;, is a minimal general-purpose autonomous agent designed for various tasks such as analyzing stock prices, conducting network security tests, creating art, and even ordering pizza. It combines a robust prompt with a minimal set of tools, chain-of-thoughts, short-term memory, and self-criticism. While MiniAGI offers flexibility and utility, caution should be exercised as the agent may inadvertently suggest harmful commands or code. Additionally, depending on settings and requirements, MiniAGI might share data with third-party API providers like OpenAI, which can raise privacy concerns.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/TransformerOptimus/SuperAGI" rel="noopener noreferrer"&gt;SuperAGI&lt;/a&gt;, is a dev-first open source autonomous AI agent framework that empowers developers to build, manage, and run useful autonomous agents. It provides features such as provisioning, spawning, and deploying agents, extending agent capabilities with tools, concurrent agent execution, and a graphical user interface. While SuperAGI offers a range of functionalities, being an actively developed project means that it may still have issues and bugs. Users should exercise patience, understanding, and report any encountered problems.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Which is the most powerful AI agent?
&lt;/h2&gt;

&lt;p&gt;Among the mentioned AI agents, Auto-GPT stands out as the most powerful one. With over 140,000 stars on GitHub, Auto-GPT offers a comprehensive set of features. These include internet access for searches and information gathering, long-term and short-term memory management, GPT-4 instances for text generation, access to popular websites and platforms, file storage, and summarization with GPT-3.5. Additionally, Auto-GPT provides extensibility through plugins, allowing users to customize and enhance its functionality.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the three types of agents in AI?
&lt;/h2&gt;

&lt;p&gt;There are three fundamental types of agents commonly found in AI:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Simple Reflex Agents: These agents make decisions based solely on the current percept, disregarding the percept history. They follow a condition-action rule, which maps a condition to an action. Simple reflex agents operate effectively in fully observable environments. However, in partially observable environments, they may encounter infinite loops unless they can randomize their actions. These agents have limited intelligence and lack knowledge of non-perceptual parts of the state.&lt;/li&gt;
&lt;li&gt;Goal-Based Agents: Goal-based agents decide their actions based on the distance between their current state and a predefined goal state. Each action they take aims to reduce this distance and bring them closer to the goal. These agents rely on explicit knowledge that supports their decision-making and allows for modifications. Goal-based agents often require search and planning algorithms to determine the best course of action.&lt;/li&gt;
&lt;li&gt;Learning Agents: Learning agents have the ability to learn from past experiences and improve their performance over time. They start with basic knowledge and adapt automatically through learning. Learning agents consist of four conceptual components: a learning element, a critic that provides feedback on performance, a performance element responsible for selecting actions, and a problem generator that suggests actions to generate new informative experiences. Learning agents can acquire knowledge and improve their decision-making capabilities through interactions with the environment.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Consequences of using AI agents
&lt;/h2&gt;

&lt;p&gt;When using AI agents, especially in scenarios where they have the ability to write/execute scripts and run shell commands, it is important to consider potential consequences and take necessary precautions. To mitigate risks and prevent harm to the main computer's system and data, it is recommended to use a virtual machine/container (docker) for tasks that require high security measures. Running AI agents within a virtualized/containerized environment provides an added layer of protection. This becomes even more crucial if the AI agents are granted the ability to interact with sensitive systems or data. Taking these precautions helps ensure a safer and more controlled environment for AI agent usage.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>chatgpt</category>
      <category>agents</category>
    </item>
    <item>
      <title>Don’t Target Your Target Audience</title>
      <dc:creator>MusabShakil</dc:creator>
      <pubDate>Mon, 12 Jun 2023 17:42:40 +0000</pubDate>
      <link>https://dev.to/musabshakil/dont-target-your-target-audience-46le</link>
      <guid>https://dev.to/musabshakil/dont-target-your-target-audience-46le</guid>
      <description>&lt;p&gt;After launching the Minimum Viable Product (MVP) of Quickfix AI, my main focus shifted to attracting customers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who were my Target Audiences? 🤔
&lt;/h2&gt;

&lt;p&gt;In today’s age, with the majority of work revolving around extracting relevant information from vast amounts of data, developers need to search the internet for bug-fixing information, and writers have to sift through numerous web pages to find inspiration, citations, and more. Additionally, Gen-Zs are now more inclined towards consuming short-form content, be it in the form of videos or text.&lt;/p&gt;

&lt;p&gt;With this knowledge, I initially defined "developers" and "writers" as the target audience for my product. The strategy was to build a niche product that would first serve a small audience in a specific vertical and then expand to other verticals and industries. This approach would allow me to instantly validate my product and create a feedback loop to ensure that it meets the needs and expectations of users. It's a similar strategy to what companies like Facebook used in their early days when they launched their product exclusively within Harvard University before expanding to other universities and eventually worldwide.&lt;/p&gt;

&lt;p&gt;Still, developers and writers were broad target audiences. I further divided them into early adopters and the early majority. To validate the product, I needed to build four key components: Machine Learning, backend, hosting, and frontend.&lt;/p&gt;

&lt;p&gt;However, I realized that I could validate the product without designing and developing the front end or deploying it onto a hosting service. This approach would allow me to go to market more quickly. To achieve this, I made the product open source, enabling developers to try it out as early adopters. Additionally, I added a Google Form waitlist in the GitHub repository for writers who aren't tech-savvy and struggle with setting up a GitHub repository.&lt;/p&gt;

&lt;p&gt;By doing so, when developers provide positive feedback on the product, I can complete the remaining key components and begin onboarding writers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Growth 🚀
&lt;/h2&gt;

&lt;p&gt;In my previous product development experiences, I utilized Product Led Growth (PLG) and Twitter, among others. This time, I wanted to explore new channels to reach my audience. Considering the high search volume for relevant keywords related to Artificial Intelligence, I planned to publish valuable content to maximize organic user acquisition. This included writing relevant blog posts, creating use case videos on YouTube, and sharing the product on relevant subreddits. Additionally, I aimed to generate growth by engaging with potential users on an individual level through personalized cold outreach and addressing their specific pain points based on their immediate feedback.&lt;/p&gt;

&lt;p&gt;Out of all the channels, two performed exceptionally well: blog posts and subreddits. In 2 months, the GitHub repository had crossed 50 stars.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ftd1Gxsg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qouw7qhnpeef3jhxkvcy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ftd1Gxsg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qouw7qhnpeef3jhxkvcy.png" alt="Quickfix AI star history" width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;25 unique visitors in the last month, from 05th May 2023 to 05th June 2023.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jY8ypdu7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zis85cam88adiezkgvq0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jY8ypdu7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zis85cam88adiezkgvq0.png" alt="Quickfix AI Github visitors from 05th May to 05th June" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3 unique visitors from Reddit and 10 unique visitors from DEV Community blog posts in the last month.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_0wjBx0H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4e5epwdjuijjeyl36ifs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_0wjBx0H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4e5epwdjuijjeyl36ifs.png" alt="Quickfix Github referring sites from 05th May to 05th June" width="800" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And 33 waitlisted users in Google Form since 8th February 2023 (last 4 months) when Quickfix AI was launched on GitHub.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--unx152P7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2rdsra0ekw4wc02ya1bt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--unx152P7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2rdsra0ekw4wc02ya1bt.png" alt="Quickfix AI Google Form waitlist signups" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem with Writers 🫠
&lt;/h2&gt;

&lt;p&gt;As developers automatically started using Quickfix AI through organic channels, it was the perfect time to onboard writers through cold email and showcase developers' testimonials as social proof, making it easier for writers to take their first step.&lt;/p&gt;

&lt;p&gt;However, I soon realized that writers weren't interested in using Quickfix AI. I sent over 70 personalized emails, following email strategies from &lt;a href="https://artofemails.com/"&gt;Art of Emails&lt;/a&gt;, &lt;a href="https://marketingexamples.com/sales"&gt;Marketing Examples&lt;/a&gt;, and &lt;a href="https://www.leadfeeder.com/blog/cold-email-templates-b2b/"&gt;Lead Feeder&lt;/a&gt;, which included PAS (Problem, Agitate, Explain) and AIDA (Attention, Interest, Desire, Action) frameworks, and offering genuine upfront value. Despite an 80% open rate, I received no responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why are writers behaving like this? 🧐
&lt;/h2&gt;

&lt;p&gt;After exploring writer communities on subreddits and other platforms, it became apparent that most writers aren't happy with the new AI revolution. It is taking over their jobs and gigs, from Hollywood to WordPress blogs. Clients are opting for algorithmic efficiency and replacing human talent. Writers now have a certain skepticism about using AI products. Current AI startups that allow users to generate articles, emails, and documents are mainly used by non-professional writers (you and me) looking to enhance their content.&lt;/p&gt;

&lt;p&gt;Now, it's time for me to go back to finding an Ideal Customer Profile (ICP), for whom Quickfix AI solves their real pain.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>startup</category>
      <category>analytics</category>
      <category>performance</category>
    </item>
    <item>
      <title>Get Instant Error Solutions with GPT</title>
      <dc:creator>MusabShakil</dc:creator>
      <pubDate>Tue, 21 Feb 2023 21:13:34 +0000</pubDate>
      <link>https://dev.to/musabshakil/get-instant-error-solutions-with-gpt-42cc</link>
      <guid>https://dev.to/musabshakil/get-instant-error-solutions-with-gpt-42cc</guid>
      <description>&lt;p&gt;Recently I found myself using ChatGPT a lot, I was at a point where I even left Google and Stackoverflow (my two best coding friends). But ChatGPT has two problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;If I don't provide my source code as context to ChatGPT, it behaves like a large language model and provides some random answers from its brain, which mostly aren't useful and meaningful. So I've to make it pretend like "ChatGPT, you are now a software engineer" by writing some prompts curated by awesome people at &lt;a href="https://github.com/f/awesome-chatgpt-prompts"&gt;awesome-chatgpt-prompts&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Even if I provide my source code to ChatGPT, then write my query or code error which I want ChatGPT to solve, most of the time my source code is too big it just exceeds the &lt;a href="https://the-decoder.com/chatgpt-guide-five-basic-prompt-strategies-for-better-results/#:~:text=ChatGPT%20processes%20up%20to%204%2C096,is%20ignored%20without%20a%20message."&gt;ChatGPT input limit&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Solution 💡
&lt;/h2&gt;

&lt;p&gt;After thinking about this problem I came up with a plan to build a VS Code extension which can directly extract source code from IDE, so I don't have to copy paste the code every time I've to ask ChatGPT for the answer of errors in my code, and I use vector database as an index to store embeddings for my source code, which basically do an approximately nearest neighbors similarity search to just pick those snippets from my code which are the causing the error, in this way I'm able to input only a small chunk of source code into the GPT model which performs well and provide accurate solution for the errors without exceeding the OpenAI GPT input limit.&lt;/p&gt;

&lt;p&gt;I made the VS Code extension publicly available for free on GitHub. It's currently in Alpha stage, and I would appreciate your Pull Requests/Contributions to this open source tool. Before diving into the extension, let's understand why we need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the existing solutions? 🤔
&lt;/h2&gt;

&lt;p&gt;Today's Gen AI dev tools, such as Copilot, are missing the mark. Yes, they help with code completion, but every developer knows that programming is really 20% coding and 80% debugging. I asked myself, how can LLMs help with the crucial, time-sensitive, frustrating, and just incredibly intense task of debugging?&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing 👋
&lt;/h2&gt;

&lt;p&gt;Quickfix AI, an extension for VS Code that provides you &lt;strong&gt;instant solutions for errors in your code&lt;/strong&gt; within the code editor using AI.&lt;/p&gt;

&lt;p&gt;With &lt;a href="https://github.com/MusabShakeel576/quickfix.ai"&gt;quickfix.ai&lt;/a&gt;, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 Get instant solution for error in real-time&lt;/li&gt;
&lt;li&gt;💡 Increase your coding understanding and efficiency&lt;/li&gt;
&lt;li&gt;⏳ Save time and minimize frustration with clear code solutions&lt;/li&gt;
&lt;li&gt;🔍 Improve your coding skills with in-depth code analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo 📽
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/qz2U6S5tWyQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation 📦
&lt;/h2&gt;

&lt;p&gt;Quickfix AI is in its Alpha phase, if you would like to use and explore it at this stage, you can follow the steps below to set it up. However, if you prefer to wait for a more reliable version with an easy installation process through VS Code Marketplace, you can &lt;a href="https://forms.gle/ZN4hmSuThpYAE8kZ7"&gt;Join the Waitlist&lt;/a&gt; for the Stable release.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisite:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python v3.10 + Poetry &lt;/li&gt;
&lt;li&gt;Node v16 + Yarn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Setup:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone Quickfix AI repo&lt;/li&gt;
&lt;li&gt;Build the vscode-extension &lt;code&gt;make install-vscode-extension&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Build the backend &lt;code&gt;make install-backend&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Update the environment variables in both folders, &lt;code&gt;/vscode-extension/src/env.ts&lt;/code&gt; (you probably don't need to update this file if your backend will be running in the localhost or 127.0.0.1) and &lt;code&gt;/backend/.env&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run the backend &lt;code&gt;make run-backend&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to Use Quickfix AI 🛠
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open a workspace/folder in VS Code&lt;/li&gt;
&lt;li&gt;Open the Command Palette (press &lt;code&gt;Ctrl + Shift + P&lt;/code&gt; or &lt;code&gt;Cmd + Shift + P&lt;/code&gt; on Mac)&lt;/li&gt;
&lt;li&gt;Type "Quickfix AI" and select the command from the list&lt;/li&gt;
&lt;li&gt;Paste/enter your error or question.&lt;/li&gt;
&lt;li&gt;Wait for the response and the solution will be displayed in a "solution-by-quickfix-ai markdown" file in your VS Code editor&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Enjoy the instant and comprehensive error solutions with Quickfix AI! 🎉&lt;/p&gt;

</description>
      <category>gpt3</category>
      <category>ai</category>
      <category>vscode</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Save Gas Fees on NFT using ERC721A Standard</title>
      <dc:creator>MusabShakil</dc:creator>
      <pubDate>Thu, 22 Dec 2022 13:54:07 +0000</pubDate>
      <link>https://dev.to/musabshakil/save-gas-fees-on-nft-using-erc721a-standard-559a</link>
      <guid>https://dev.to/musabshakil/save-gas-fees-on-nft-using-erc721a-standard-559a</guid>
      <description>&lt;p&gt;In the past two years if you are into the crypto space then you've probably experienced the boom of NFT (Non-Fungible Token). The biggest problem it brings along with itself is the high gas price and network congestion in the Ethereum blockchain. The easiest solution is to use a Layer-2 or EVM compatible blockchain which supports smart contract, but as more big players in the industry like Yuga Labs (Creators of Bored Ape Yacht Club and Otherside) and Moonbirds are opting for Ethereum blockchain the gas problem has become worse day by day.&lt;/p&gt;

&lt;p&gt;Smart Contract Developers at Sandbox, Cool Cats, and almost every other NFT startup have faced the same issue, many trying to optimize their smart contracts in their own way. Developers at Chiru Labs (Creators of Azuki) came up with the new ERC (Ethereum Request for Comment) standard for NFT called ERC721A to supersede the previous standard ERC721 which was proposed by the EIP (Ethereum Improvement Proposals).&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's understand the problem 🥀
&lt;/h2&gt;

&lt;p&gt;If you aren’t familiar with the term "gas fee", it's a payment made by users to execute transactions on the Ethereum blockchain. The fee is paid in "ether", the cryptocurrency used on Ethereum, and is calculated based on demand for block space on the network. The amount of the fee is expressed in "gwei", which is 10^(-9) ETH. Gas fees are typically set automatically by a user's wallet.&lt;/p&gt;

&lt;p&gt;During times of high demand for NFTs, such as when a popular NFT project releases new items, it can lead to a surge in the number of transactions being executed on the Ethereum blockchain. This can result in a phenomenon known as a "gas war", where the price of gas spikes significantly. This can have a negative impact on the user experience, as the high gas fees can make it more expensive to execute transactions on the network.&lt;/p&gt;

&lt;p&gt;For example, the popularity of the Loot project led to a rush of users trying to mint and list Loot derivatives, which caused several spikes in gas fees and raised the price of transactions across the Ethereum network. The plots illustrate how the gas fees rose significantly whenever Loot derivatives were minted.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fv3o7nae36plkzip4g7il.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fv3o7nae36plkzip4g7il.png" alt="Base Fee NFT Loot Derivated"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Ffml5fojhi230gwsrtbu2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ffml5fojhi230gwsrtbu2.png" alt="Loot Derivatives Mint"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the scale of the problem 📈
&lt;/h2&gt;

&lt;p&gt;The Ethereum blockchain has relatively high gas fees compared to other blockchain networks, with the cost of executing a transaction ranging from a few dollars to over $500, depending on the complexity of the transaction and the level of demand on the network. This means if an NFT costs you $200, with the inflated gas prices you have to pay $700 ($200 + $500).&lt;/p&gt;

&lt;h2&gt;
  
  
  What is ERC721A 🌹
&lt;/h2&gt;

&lt;p&gt;ERC721A is a version of the IERC721 (I in IERC721 means Interface) standard that allows for more efficient creation of multiple NFTs in a single transaction, resulting in cost savings in terms of gas fees, potentially as much as 80% compared to other methods. The timeline of ERCs are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ERC721 -&amp;gt; ERC721 OZ -&amp;gt; ERC721A
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Additionally, this solution can help mitigate the network congestion that is commonly experienced on the Ethereum blockchain when creating NFTs, as it minimizes the amount of data required to be stored in the token metadata and updates the ownership state only once per batch of minting.&lt;/p&gt;

&lt;h2&gt;
  
  
  A technical deep dive 🔬
&lt;/h2&gt;

&lt;p&gt;ERC721A has introduced three optimizations in the previously used smart contract implementation developed by OpenZeppelin (OZ).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Removing duplicate storage from OZ ERC721Enumerable&lt;/strong&gt;&lt;br&gt;
The OZ implementation of the IERC721Enumerable standard, which is widely used, includes redundant storage of metadata for each individual token. This approach is optimized for read functions but can be costly in terms of gas fees for write functions, which are less commonly used and often require a higher fee to be executed. Additionally, the fact that the tokens are numbered sequentially in the new implementation from 0 allows for the removal of some redundant storage from the base implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Updating the owner’s balance once per batch mint request, instead of per minted NFT&lt;/strong&gt;&lt;br&gt;
Suppose Alice currently owns 2 tokens and wants to purchase an additional 5 tokens. In the Solidity programming language, it costs gas to update stored values. Therefore, it would be more cost-effective to update Alice's token holdings from 2 to 7 in a single update, rather than performing 5 separate updates (from 2 to 3, 3 to 4, etc.) to track the addition of each individual token. This is because updating a stored value multiple times incurs additional gas costs, whereas updating the value in a single transaction only incurs the cost once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Updating the owner data once per batch mint request, instead of per minted NFT&lt;/strong&gt;&lt;br&gt;
This optimization is similar to the previous one in that it aims to reduce the number of updates made to stored values in order to save on gas costs. In this example, Alice wants to purchase 3 tokens numbered 100, 101, and 102. Instead of updating the ownership information for each individual token (which would incur 3 separate gas costs), it would be more efficient to update the ownership information just once in a way that semantically indicates that Alice owns all 3 of these tokens. This would result in a single update rather than 3, reducing the total gas cost.&lt;/p&gt;

&lt;p&gt;Suppose Alice and Bob are minting NFTs. Specifically, Alice is minting tokens numbered 100, 101, and 102, and Bob is minting tokens numbered 103 and 104. The internal owner tracker is a system for keeping track of the ownership of these NFTs, and in this case, it would look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Ft0gfr9wmkx98y8es5khb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ft0gfr9wmkx98y8es5khb.png" alt="Internal Tracker NFT Minting"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The key point being made in this statement is that it is possible to determine the owner of an NFT without having to explicitly store the ownership information for that specific NFT. This can be done by modifying the "ownerOf" function to use a different method for determining the owner of the 102 NFT.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function ownerOf(uint256 tokenId) public view virtual override returns (address) {
  require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

  uint256 lowestTokenToCheck;

  if(tokenId =&amp;gt; maxBatchSize) {
    lowestTokenToCheck = tokenId - maxBatchSize + 1;
  }

  for(uint256 curr = tokenId; curr &amp;gt;= lowestTokenToCheck; curr--) {
    address owner = _owners[curr];
    if(owner != address(0)) {
        return owner;
    }
  }

  revert("ERC721A: unable to determine the owner of token");
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An important thing to understand is that the function ownerOf will continue to operate correctly if we modify it to decrease the value until it locates a specifically designated owner.&lt;/p&gt;

&lt;p&gt;Now let's see with an example on how we can mint an NFT using ERC721A.&lt;/p&gt;

&lt;p&gt;First of all, initialize a Node project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install Hardhat (Ethereum Development Environment).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add hardhat &lt;span class="nt"&gt;-D&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setup a Solidity project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx hardhat

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Create a TypeScript project
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Hardhat project root: &lt;span class="k"&gt;if &lt;/span&gt;not provided &lt;span class="k"&gt;then &lt;/span&gt;enter your current working directory
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Do you want to add a .gitignore? y
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Help us improve Hardhat with anonymous crash reports &amp;amp; basic usage data? y
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Do you want to &lt;span class="nb"&gt;install &lt;/span&gt;this sample projects dependencies with yarn &lt;span class="o"&gt;(&lt;/span&gt;...&lt;span class="o"&gt;)&lt;/span&gt;? y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will initialize various elements in our project, including Hardhat's default settings with TypeScript support.&lt;/p&gt;

&lt;p&gt;We now have a functional development environment, which includes a simple example contract called &lt;code&gt;Lock.sol&lt;/code&gt; or &lt;code&gt;Greeter.sol&lt;/code&gt;. However, this contract will not be useful for our purposes. Let's create a new file in the &lt;code&gt;contracts&lt;/code&gt; folder called &lt;code&gt;BoredLion.sol&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To utilize ERC721A, we simply need to install it. This package depends on another package provided by OZ, so it's a good idea to include it as well.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add erc721a @openzeppelin/contracts &lt;span class="nt"&gt;-D&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, we can write the Solidity code inside the BoredLion.sol file, which allows us to &lt;code&gt;mint&lt;/code&gt; our very own NFT called &lt;code&gt;BoredLion&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//SPDX-License-Identifier: MIT  
pragma solidity ^0.8.11;  

import "erc721a/contracts/ERC721A.sol";  

contract BoredLion is ERC721A {  
  constructor() ERC721A("Our Bored Lion", "BoredLion") {}  

  function mint(uint256 quantity) external payable {
    _safeMint(msg.sender, quantity);  
  }  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Closing thoughts 🌺
&lt;/h2&gt;

&lt;p&gt;ERC721A has a wide range of potential use cases and can offer significant cost savings in terms of gas fees. The purpose of this article was to introduce ERC721A and highlight its potential benefits for developers looking to create NFT on the Ethereum blockchain. Check out all the features in the &lt;a href="https://chiru-labs.github.io/ERC721A" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;. In case you have some questions regarding the article just leave a comment or want to discuss something feel free to connect with me on &lt;a href="https://www.linkedin.com/in/musabshakil/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Special thanks to &lt;a href="https://tokenminds.co/" rel="noopener noreferrer"&gt;TokenMinds&lt;/a&gt;, &lt;a href="https://coinsbench.com/" rel="noopener noreferrer"&gt;CoinsBench&lt;/a&gt; and &lt;a href="https://nftnow.com/" rel="noopener noreferrer"&gt;nft now&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you work at a web3 startup and want me to write for your product please do connect with me 🍀&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>programming</category>
      <category>blockchain</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>A Guide to Branching and Online Schema Changes with PlanetScale 2023</title>
      <dc:creator>MusabShakil</dc:creator>
      <pubDate>Wed, 21 Dec 2022 10:50:25 +0000</pubDate>
      <link>https://dev.to/musabshakil/migrate-your-database-with-confidence-using-planetscale-1hhi</link>
      <guid>https://dev.to/musabshakil/migrate-your-database-with-confidence-using-planetscale-1hhi</guid>
      <description>&lt;p&gt;As a dev, you've most likely encountered the database migration issue, when you've a working production environment and you try to run the migration command from development or staging to production and it cause a conflict in your production database because you've altered the table in your development and now its not able to sync those changes properly.&lt;/p&gt;

&lt;p&gt;Database Administrators and Engineers at big tech companies and almost every other business have experienced this issue, many tried to build their own solutions and few of them published their solutions as an open source project, and the terms used for this solution are branching and online schema changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's examine the problem to see what's going on 🧤
&lt;/h2&gt;

&lt;p&gt;Merging the individual work of a big team of engineers into one database is difficult. Conflicts can become more difficult to resolve when simultaneous changes are made to multiple sections of code that are dependent on each other.&lt;/p&gt;

&lt;p&gt;For example, if one developer changes the schema of a table by adding a new column, and another developer attempts to insert data into the table using the old schema, a migration conflict will occur. In this case a queue needs to be implemented in the migration workflow and the common scenario is to use a branch to separate production databases from development.&lt;/p&gt;

&lt;p&gt;Online schema changes are a technique that allows database administrators to alter the structure of a database without taking it offline. These changes can include adding or modifying columns in a table, altering the data type of a column, or renaming a table.&lt;/p&gt;

&lt;p&gt;The main problem that online schema changes are trying to solve is the downtime that is typically required when making structural changes to a database. In traditional database management systems, making changes to the schema of a database often requires taking the database offline, which can cause disruption to applications and services that rely on the database. Online schema changes allow database administrators to make these changes without taking the database offline, which minimizes downtime and makes it easier to maintain and evolve the database over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  How severe is the problem? 🤔
&lt;/h2&gt;

&lt;p&gt;Tesla performs upto 130 deployments per day. Around a million electric vehicles are currently roaming around on the roads. A single conflict while merging databases to production can cause a hefty loss to the company. Similar could happen to other companies including Instagram which deploys 30-50 times a day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Process of Branching 🛣
&lt;/h2&gt;

&lt;p&gt;Branching can be accomplished in just a few steps.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a separate branch from your production branch to use for development purposes. This branch will be a copy of your production schema that you can modify without affecting the production environment.&lt;/li&gt;
&lt;li&gt;Modify the structure of this copy of your database by making changes such as removing a column or adding a new table.&lt;/li&gt;
&lt;li&gt;Test the changes you made to the database structure in a development environment to ensure that they are functioning correctly.&lt;/li&gt;
&lt;li&gt;Create a comparison between the production and development schemas. This will allow you to review and understand the changes that will be implemented, and the issues with the schema, such as missing unique keys, that need to be addressed before the deployment happens.&lt;/li&gt;
&lt;li&gt;Now to deploy development to production in zero downtime, you need to carry out the process of online schema changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Process of Online Schema Changes 🐣
&lt;/h2&gt;

&lt;p&gt;Online Schema Changes follows a pretty simple pattern.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make a new table that is identical to the development table, but without any data. We'll call this the "ghost" table.&lt;/li&gt;
&lt;li&gt;Modify the ghost table through an ALTER statement without any additional cost, as it is empty.&lt;/li&gt;
&lt;li&gt;Initiate a lengthy process of transferring rows from the production table to the ghost table, doing so in small increments.&lt;/li&gt;
&lt;li&gt;Once the copying of the existing data is finished, the migration is typically ready to switch over to the new system.&lt;/li&gt;
&lt;li&gt;The final step in the process is the cut-over, which involves renaming the production table and replacing it with the ghost table. This may cause a brief outage, but in general, users and applications will not be aware that the table has been swapped out from under them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Which products are tackling this issue? ⛑
&lt;/h2&gt;

&lt;p&gt;Several products are trying to solve this problem and in doing so they are making the process as simple as possible so you don't have to implement branching and online schema changes on your own.&lt;/p&gt;

&lt;p&gt;Cockroach Labs provides a free forever plan but has some &lt;a href="https://www.cockroachlabs.com/docs/v22.2/online-schema-changes#limitations"&gt;limitations&lt;/a&gt; related to online schema changes.&lt;/p&gt;

&lt;p&gt;YugabyteDB has a free tier &lt;strong&gt;only for educational and non-production use&lt;/strong&gt;. It has multiple &lt;a href="https://github.com/yugabyte/yugabyte-db/blob/master/architecture/design/online-schema-migrations.md#safe-and-unsafe-ddl-operations"&gt;unsafe DDL operations&lt;/a&gt; in both of its query languages, YSQL and YCQL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://planetscale.com/"&gt;PlanetScale&lt;/a&gt; also has a &lt;strong&gt;free-forever&lt;/strong&gt; tier, and it just have two limitations, FOREIGN KEY constraints and RENAME for columns and tables, which can be easily solved through their easy to follow tutorials, &lt;a href="https://planetscale.com/docs/learn/operating-without-foreign-key-constraints"&gt;FOREIGN KEY solved&lt;/a&gt; and &lt;a href="https://planetscale.com/docs/learn/handling-table-and-column-renames"&gt;RENAME solved&lt;/a&gt;, so with these solutions they completely eliminated all of their drawbacks.&lt;/p&gt;

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

&lt;p&gt;PlanetScale not only addresses issues with branching and online schema changes, but also offers a range of unique features that are not available in other products and services. Check out all the features in the &lt;a href="https://planetscale.com/docs"&gt;documentation&lt;/a&gt;. Don't wait too long, create your account and get started with &lt;a href="https://planetscale.com/"&gt;PlanetScale&lt;/a&gt;. In case you have some questions regarding the article or want to discuss something feel free to connect with me on &lt;a href="https://www.linkedin.com/in/musabshakil/"&gt;LinkedIn&lt;/a&gt; 💖&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you work at a startup and want me to write for your product please do connect with me 🥰&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>database</category>
      <category>javascript</category>
      <category>laravel</category>
      <category>postgres</category>
    </item>
    <item>
      <title>Simplify Image Labelling For ML Using Roboflow</title>
      <dc:creator>MusabShakil</dc:creator>
      <pubDate>Sat, 17 Dec 2022 20:16:41 +0000</pubDate>
      <link>https://dev.to/musabshakil/simplify-image-labelling-for-ml-using-roboflow-36cl</link>
      <guid>https://dev.to/musabshakil/simplify-image-labelling-for-ml-using-roboflow-36cl</guid>
      <description>&lt;p&gt;While building a machine learning project you probably came across a point in time where you need to decide which tool should I use to annotate my raw images for training and testing purposes. You may ask, why not just go with any one of the available data labelling tools?&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's understand the problem 🧐
&lt;/h2&gt;

&lt;p&gt;Labelling and annotating images can be a time-consuming process, especially for large datasets. Humans can make mistakes while labelling and annotating images, which can lead to errors in the final dataset. Different image labelling and annotation tools may use different standards and conventions, which can make it difficult to compare and integrate datasets from different sources. Many image labelling and annotation tools are not designed to handle large datasets, which can limit their usefulness for certain applications. Some image labelling and annotation tools can be expensive to use, which can be a barrier for smaller organizations or individuals.  Some may not be robust enough to handle complex or noisy images, which can lead to incorrect or incomplete annotations. And some may have a steep learning curve or may be difficult for users to understand and use effectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  How big is this problem? 🤔
&lt;/h2&gt;

&lt;p&gt;If we take the example of the world's biggest autonomous vehicle manufacturer, Tesla. Their head of AI and computer vision, Andrej Karpathy, revealed that Tesla only has a "few dozen engineers" working on neural networks, but they have a "huge" team working on labelling.&lt;/p&gt;

&lt;p&gt;According to Pinterest, they use Amazon Mechanical Turk, which is a distributed workforce who can perform image labelling and similar tasks virtually. At Pinterest, they have a growing dataset of billions of ideas, and they are tasked with showing the right idea to the right user at the right time. Taking advantage of Amazon Mechanical Turk’s powerful crowdsourcing platform, they built a high-quality human evaluation system that could scale with their needs.&lt;/p&gt;

&lt;p&gt;Overall big organizations are handling more than a million of images each year and spending a lot of their developer hours into the object annotation process. So this task is a big part of their Machine Learning workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Image Labelling? 🏞
&lt;/h2&gt;

&lt;p&gt;Image labelling is exactly what it sounds like — it's the process of assigning labels or tags to images based on their content. The labels can be used to categorize and organize images, as well as to describe their content in a machine-readable format.&lt;/p&gt;

&lt;p&gt;For example, image labelling might involve assigning labels such as "cat," "dog," "car," or "flower" to images of those objects. Image labelling can be done manually by humans, or it can be automated using machine learning algorithms.&lt;/p&gt;

&lt;p&gt;Image labelling is an important step in many applications of computer vision, such as object recognition, image classification, and image search.&lt;/p&gt;

&lt;h2&gt;
  
  
  Processes involved in Image Labelling 🛠
&lt;/h2&gt;

&lt;p&gt;Image labelling operates on a rather simple basis. Suppose we have 2 NFTs of different collections, one is Bored Ape Yacht Club and another one is Pancake Squad.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Our first step would be to select the images that need to be labelled. This may involve selecting a specific subset of images from a larger dataset, or it may involve selecting images from various sources if we are trying to take NFT derivatives in consideration.&lt;/li&gt;
&lt;li&gt;The next step is to define the labels or tags that will be used to classify the images. This may involve defining a set of predefined labels, or it may involve creating a custom set of labels for a specific application. We'll use &lt;strong&gt;ape&lt;/strong&gt; and &lt;strong&gt;pancake&lt;/strong&gt; as our labels.&lt;/li&gt;
&lt;li&gt;The third step is to label the images based on their content. This can be done manually by humans, or it can be automated using machine learning algorithms. We'll go the manual way.&lt;/li&gt;
&lt;li&gt;Once the images have been labelled, it is important to verify that the labels are accurate and complete. This may involve manually reviewing the labels, or it may involve using ML algorithms to check for errors or omissions. Again we'll choose the manual path.&lt;/li&gt;
&lt;li&gt;In some cases, it may be necessary to add additional metadata or context to the images. This process is known as image annotation, and it can involve adding additional labels, text, or other information to the images. We'll skip this one.&lt;/li&gt;
&lt;li&gt;The final step in the image labelling process is to store and manage the labelled images in a way that allows them to be easily accessed and used for further analysis or processing. This may involve storing the images in a database or file system, or it may involve using a specialized image management tool. We'll use an image management tool and file system, but why? Let's discuss it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Which products are solving this problem? 🤝
&lt;/h2&gt;

&lt;p&gt;Heartex LabelImg created by Tzutalin is one of the popular choices of labellers but is no longer actively being developed. But, but it's now a part of the Label Studio community. Their cloud platform has just &lt;strong&gt;14 days of free trial&lt;/strong&gt;, you can use their cloud or open source product. But if you want to use it in your side projects and prefer browser softwares instead of local installation then 14 days might not be enough for you.&lt;/p&gt;

&lt;p&gt;ImgLab is a free and a web based platform, but it lacks various computer vision annotation formats, which are essential if you need to train and experiment with distinct ML libraries and services.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://roboflow.com/" rel="noopener noreferrer"&gt;Roboflow&lt;/a&gt; provides an image labelling feature that is easy to use and configure to our needs. It's &lt;strong&gt;free-forever&lt;/strong&gt; for open-source projects and comes with a pay-as-you-go plan for private projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  A technical deep dive 🚀
&lt;/h2&gt;

&lt;p&gt;To understand the technical nuances in depth let's get our hands dirty and witness some of the features of Roboflow.&lt;/p&gt;

&lt;p&gt;In a big organization labelling images is not the only problem we have. We must assign each image to the right person, make sure it is reviewed before moving on to the next stage, set labels, structure projects and the list can go on and on. You can use Roboflow to solve all these problems. The amount of features Roboflow provides, it is hard to fit in this one blog, so let's try out some of them. In this hands-on we'll be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;assigning images to a team member&lt;/li&gt;
&lt;li&gt;annotating these images&lt;/li&gt;
&lt;li&gt;exporting images to a specific format for a machine learning model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's now start by creating an account in Roboflow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://app.roboflow.com/login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Connect with a third-party provider or use your email and password to sign up.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg2mue7kg5eyx05nu3ulc.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%2Fg2mue7kg5eyx05nu3ulc.png" alt="Roboflow Authentication" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The best part of Roboflow is that it provides an interactive user onboarding tour, you can follow that or continue along with me.&lt;/p&gt;

&lt;p&gt;I've created a project and named it as NFT Detection, you can choose a name according to your project.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fama2qkwbu4vvv4heum09.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%2Fama2qkwbu4vvv4heum09.png" alt="Roboflow Project Setup" width="800" height="694"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We landed on our project page. Roboflow has displayed numerous features on the left sidebar, we'll cover a few of them which are related to image labelling.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukviq5diipx8x86wh4v5.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%2Fukviq5diipx8x86wh4v5.png" alt="Roboflow Project" width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once we have our Roboflow project up and running, we can upload images, I've added 3 ape and 3 pancake images, I'll just click on &lt;code&gt;Save and Continue&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb52qe3uwyz5vg0zjf2my.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%2Fb52qe3uwyz5vg0zjf2my.png" alt="Roboflow Upload Image" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It shows a dialog to assign images to the teammates, as I'm the only person in this Roboflow project, I'll assign these images to myself.&lt;/p&gt;

&lt;p&gt;On the Annotate page click on one of the Unannotated images, it'll open a canvas to annotate your image.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F72mp0g7wn7zdy0vwvgfs.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%2F72mp0g7wn7zdy0vwvgfs.png" alt="Roboflow Canvas" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose the Bounding Box Tool from the right hand side panel (if it's not already selected), click and drag the mouse to create as perfect box as you can around your object, and name the label accordingly, I'll name mine one as &lt;code&gt;ape&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3s198wtldqh4v6mwm2fc.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%2F3s198wtldqh4v6mwm2fc.png" alt="Roboflow Annotate" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow the same procedure as of the above two paragraphs for the other Unannotated images and label them according to the image, I'll label remaining 2 of Bored Ape Yacht Club as ape and other 3 as pancake.&lt;/p&gt;

&lt;p&gt;Once we have all the images annotated, we'll click on the &lt;code&gt;Add 6 images to Dataset&lt;/code&gt; button (the number 6 might be different according to your data).&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm22y59r88qeoin6v3v8f.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%2Fm22y59r88qeoin6v3v8f.png" alt="Roboflow Annotated" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adjust Train-Valid-Test split or leave it as it is, and proceed to the Generate tab. You can edit preprocessing depending on your use case. I'll remove the Resize preprocessing.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fppih4kds86zn2201odef.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%2Fppih4kds86zn2201odef.png" alt="Roboflow Generate" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on Generate &amp;gt; Export &amp;gt; Format YOLO v7 Pytorch (choose according to your needs) &amp;gt; download zip to computer &amp;gt; Continue.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3yvfbykx96s5fvg0783l.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%2F3yvfbykx96s5fvg0783l.png" alt="Roboflow Export" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;There is no limit to Roboflow's features. This blog was created with the intention of piquing interest in this incredible tool that can help you save a ton of time and effort. Check the &lt;a href="https://docs.roboflow.com/" rel="noopener noreferrer"&gt;docs&lt;/a&gt; to see all the features. Create an account as soon as possible to begin using &lt;a href="https://roboflow.com/" rel="noopener noreferrer"&gt;Roboflow&lt;/a&gt;. In case you have some questions regarding the article  or would like to talk about anything feel free to connect with me on &lt;a href="https://www.linkedin.com/in/musabshakil/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; ✌️&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Special thanks to &lt;a href="https://www.neurala.com/" rel="noopener noreferrer"&gt;Neurala&lt;/a&gt;, &lt;a class="mentioned-user" href="https://dev.to/aniket762"&gt;@aniket762&lt;/a&gt; and &lt;a href="https://www.kaggle.com/owaiskhan9654" rel="noopener noreferrer"&gt;owaiskhan&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you run an organization, and want me to write for you or you are hiring for a software engineer position please do connect with me 🦄&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>blockchain</category>
      <category>discuss</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Track Your Job Search In Notion</title>
      <dc:creator>MusabShakil</dc:creator>
      <pubDate>Sat, 26 Nov 2022 17:48:12 +0000</pubDate>
      <link>https://dev.to/musabshakil/track-your-job-search-in-notion-1gdk</link>
      <guid>https://dev.to/musabshakil/track-your-job-search-in-notion-1gdk</guid>
      <description>&lt;p&gt;Recently I'm looking for a new job opportunity and I'm also using Notion a lot for various stuffs, so I thought why not just combine both of these things.&lt;/p&gt;

&lt;p&gt;Previously when I applied to open positions I didn't keep track of them, so I didn't know how many times I applied, whether or not I'm applying to the same company twice, and are the &lt;a href="https://www.entrepreneur.com/business-news/what-are-ghost-jobs-and-why-are-they-everywhere-now/435666"&gt;companies ghosting&lt;/a&gt; me.&lt;/p&gt;

&lt;p&gt;I looked around and found various &lt;a href="https://www.notion.so/templates/job-hunt-tracker"&gt;Notion Job Tracker Templates&lt;/a&gt;, but I just need a simple one, so I made my own template, &lt;a href="https://musabs.notion.site/1a50dc00c7c14a159353c418569613fe?v=0d5dcdc966ca4847bfabc995e15af130"&gt;Minimalist Notion Job Tracking Template&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;At this time I started applying to jobs, every time I submit an application I fill out my template with the details I need when I look back to this application for an interview or for following up with the recruiter.&lt;/p&gt;

&lt;p&gt;Now the problem I'm facing is every time when I apply to a job I need to fill in the notion template, and I'm seeing a &lt;a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;repetition&lt;/a&gt; here. As a software engineer I know the debt of doing things manually, so I started thinking how I can &lt;a href="https://twitter.com/zhuowei/status/1254266079532154880?lang=en"&gt;automate&lt;/a&gt; it.&lt;/p&gt;

&lt;p&gt;I saw Notion recently publicize their APIs and allow &lt;a href="https://developers.notion.com/docs/create-a-notion-integration"&gt;integration/bot&lt;/a&gt;, so I read through their docs.&lt;/p&gt;

&lt;p&gt;First of all, I need to make a &lt;a href="https://www.notion.so/my-integrations"&gt;new integration&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then I created a Node.js project, installed the SDK &lt;code&gt;@notionhq/client&lt;/code&gt; through npm package manager, and saved &lt;code&gt;NOTION_DATABASE_ID&lt;/code&gt; and &lt;code&gt;NOTION_KEY&lt;/code&gt; in a &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;With just a single method &lt;code&gt;notion.pages.create&lt;/code&gt; which takes an object with a few properties as arguments I was able to enter job details successfully.&lt;/p&gt;

&lt;p&gt;I ran this script in &lt;a href="https://replit.com"&gt;Replit&lt;/a&gt; which makes it really simple to iterate over new ideas and prototypes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Client&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@notionhq/client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;notion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NOTION_KEY&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;databaseId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NOTION_DATABASE_ID&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;addItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;company&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;website&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;application&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;notion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;database_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;databaseId&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;Company&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;title&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;content&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;company&lt;/span&gt;
              &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;Website&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;rich_text&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="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;website&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;website&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
              &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;multi_select&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;
          &lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;Role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;rich_text&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="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;role&lt;/span&gt;
              &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;rich_text&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="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;application&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;application&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
              &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Success! Entry added.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;addItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Walmart&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://www.walmart.com/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Software Engineer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://careers.walmart.com/us/jobs/WD944268-software-engineer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You might be thinking this code doesn't solve my problem of repetition, because in the &lt;code&gt;addItem&lt;/code&gt; function I'm entering data manually. For that I've created a Chrome Extension which extracts all these fields from a job when I hit the submit button, so this blog post is just a small part of a bigger picture, but it doesn't mean you can't start right away. You can use my notion template and above code to get off the ground and explore new ways to automate job applications on your own until I share my Chrome Extension.&lt;/p&gt;

&lt;p&gt;Btw I don't automate the portion where I've to fill up the job application, the portion where a company asks to upload a resume, cover letter and answer various other questions. I think I've better chance of getting hired by writing a personalized cover letter and answering all the other questions according to the company culture and their mission. I prefer quality over quantity. There is a &lt;a href="https://www.reddit.com/r/Resume"&gt;subreddit&lt;/a&gt; which provides really good feedback on resumes. I learned various key things from the resume experts available there.&lt;/p&gt;

</description>
      <category>notion</category>
      <category>job</category>
      <category>tracker</category>
      <category>productivity</category>
    </item>
    <item>
      <title>crypto is a scam</title>
      <dc:creator>MusabShakil</dc:creator>
      <pubDate>Wed, 02 Feb 2022 11:05:18 +0000</pubDate>
      <link>https://dev.to/musabshakil/crypto-is-a-scam-4e9a</link>
      <guid>https://dev.to/musabshakil/crypto-is-a-scam-4e9a</guid>
      <description>&lt;p&gt;are you skeptical about crypto, not sure about blockchain, thinking of it like an mlm scheme, price looks volatile to you, when you invest market goes down?&lt;/p&gt;

&lt;p&gt;there are lots of questions like these, maybe you have or maybe not, nevertheless will it not be awesome that you'll once again do your own research from scratch but with a step by step guide to clear up all your questions which will make you confident about the upcoming revolution of web3.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/MusabShakeel576/web3-for-beginners"&gt;web3 for you&lt;/a&gt; is an ongoing list of curated stuffs related to blockchain, crypto and its underlying technology, this list is powered by open source community which can make additions into this list and will try to teach you about future in a less complex language.&lt;/p&gt;

&lt;p&gt;blockchain and github users feel free to open pull requests to remove typos and include new technologies into this list.&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>blockchain</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Google and Facebook are combining forces (Here is the hint)</title>
      <dc:creator>MusabShakil</dc:creator>
      <pubDate>Mon, 10 Jan 2022 10:05:38 +0000</pubDate>
      <link>https://dev.to/musabshakil/google-and-facebook-are-combining-forces-here-is-the-hint-4cip</link>
      <guid>https://dev.to/musabshakil/google-and-facebook-are-combining-forces-here-is-the-hint-4cip</guid>
      <description>&lt;p&gt;In Jan 7, 2022 Stephen Hawking's 80th Birthday Doodle, YouTube show something incredible at 1:22 (01 min and 22 sec) of the video:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Isim0ysZ6X4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Hint is &lt;code&gt;ReactJS&lt;/code&gt; Logo which is created by Facebook.&lt;/p&gt;

&lt;p&gt;This is just my take on this Doodle video, maybe Google and Facebook aren't going to work together or this logo might be of something else not of ReactJS, what do you think, let me know about your thoughts in the comment section.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Error saving your changes: Description control characters are not allowed</title>
      <dc:creator>MusabShakil</dc:creator>
      <pubDate>Thu, 06 Jan 2022 18:58:18 +0000</pubDate>
      <link>https://dev.to/musabshakil/error-saving-your-changes-description-control-characters-are-not-allowed-69</link>
      <guid>https://dev.to/musabshakil/error-saving-your-changes-description-control-characters-are-not-allowed-69</guid>
      <description>&lt;p&gt;Did you ever come across this error while adding a lovely description after doing days of hard work on your project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SOLUTION&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J1hKcOGT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3lx70iopropy7vuh2lcy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J1hKcOGT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3lx70iopropy7vuh2lcy.png" alt="Solution of description control characters in GitHub" width="650" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just remove the new line and it'll save properly.&lt;/p&gt;

</description>
      <category>github</category>
    </item>
    <item>
      <title>1 package to solve all your frontend web3 problems</title>
      <dc:creator>MusabShakil</dc:creator>
      <pubDate>Thu, 30 Dec 2021 20:16:19 +0000</pubDate>
      <link>https://dev.to/musabshakil/1-package-to-solve-all-your-frontend-web3-problems-15jd</link>
      <guid>https://dev.to/musabshakil/1-package-to-solve-all-your-frontend-web3-problems-15jd</guid>
      <description>&lt;p&gt;When you think about Web3.0 what first comes into your mind?&lt;/p&gt;

&lt;p&gt;Bitcoin, metaverse, nft, insane amount of money and Elon Musk. These are the things a regular person can think of, but what about tech geeks and programmers. The obvious thing that come into their mind is the battle between thousands of lines of code, handling blockchain node, interacting with its data which is humongous and trying to connect user's wallet to his website.&lt;/p&gt;

&lt;p&gt;Solving few problems at a time, &lt;a href="https://www.npmjs.com/package/web3-react-wallet"&gt;web3-react-wallet&lt;/a&gt; is doing its best to let us win this weird battle by providing a single source of truth (SSOT) where all the frontend web3 problems went down to this blackhole and we get a purified library that provides &lt;code&gt;multiple wallet support&lt;/code&gt;, &lt;code&gt;switching user's wallet chain&lt;/code&gt;, &lt;code&gt;typescript&lt;/code&gt; and more.&lt;/p&gt;

&lt;p&gt;I know you already start installing the package from npm but don't forget to visit the source code on GitHub to learn more:&lt;br&gt;
&lt;a href="https://github.com/MusabShakeel576/web3-react-wallet"&gt;https://github.com/MusabShakeel576/web3-react-wallet&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>npm</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
