<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Rohan Kumar Thakur Blog</title>
        <link>https://rohankumarthakur.co.in/blog</link>
        <description>Rohan Kumar Thakur Blog</description>
        <lastBuildDate>Sun, 24 Aug 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Introduction to CMS: Building a Simple Blog with Strapi]]></title>
            <link>https://rohankumarthakur.co.in/blog/cms-tutorial</link>
            <guid>https://rohankumarthakur.co.in/blog/cms-tutorial</guid>
            <pubDate>Sun, 24 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to build a simple blog using Strapi, a popular headless CMS. This tutorial covers installation, setup, and creating content types.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p><strong>TL;DR</strong>: Learn how to set up a basic blog using Strapi, a headless CMS. We'll go through installing Strapi, creating content types, adding posts, and fetching them via API.</p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a href="https://rohankumarthakur.co.in/blog/cms-tutorial#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</a></h3>
<p>Content Management Systems (CMS) help you manage digital content without diving into code every time. Strapi is a <strong>headless CMS</strong>, meaning it provides an API to manage and deliver content, making it flexible for modern web apps.</p>
<p>In this tutorial, we'll build a simple blog with Strapi: set it up, create content types, add posts, and fetch them via API.</p>
<p><img decoding="async" loading="lazy" alt="CMS Hero Image" src="https://rohankumarthakur.co.in/assets/images/hero-image-505086b26b225e5139b89a8660db3130.jpg" width="5472" height="3648" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="setup">Setup<a href="https://rohankumarthakur.co.in/blog/cms-tutorial#setup" class="hash-link" aria-label="Direct link to Setup" title="Direct link to Setup">​</a></h3>
<p>First, install <strong>Node.js</strong> and <strong>npm</strong> from the official <a href="https://nodejs.org/" target="_blank" rel="noopener noreferrer">Node.js website</a>.</p>
<p>Then, create a new Strapi project by running:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npx create-strapi-app@latest</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Strapi Installation" src="https://rohankumarthakur.co.in/assets/images/install-strapi-ee73776f352eea304f7c470c066afe2a.png" width="1920" height="1080" class="img_ev3q"></p>
<p>This will install Strapi and start a development server.</p>
<p>Now we can start the server by below command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm  run develop</span><br></span></code></pre></div></div>
<p>Next, open <strong><a href="http://localhost:1337/admin" target="_blank" rel="noopener noreferrer">http://localhost:1337/admin</a></strong> in your browser to create an admin user for the Strapi dashboard.</p>
<p><img decoding="async" loading="lazy" alt="Strapi Admin Setup" src="https://rohankumarthakur.co.in/assets/images/setup-user-6034e77979d9c73d25e9ccfe7a29ea31.png" width="1920" height="1080" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="creating-content-types">Creating Content Types<a href="https://rohankumarthakur.co.in/blog/cms-tutorial#creating-content-types" class="hash-link" aria-label="Direct link to Creating Content Types" title="Direct link to Creating Content Types">​</a></h3>
<p>Inside the dashboard, go to <strong>Content-Types Builder → Create new collection type.</strong></p>
<p>For our blog, let's create a collection called Post with these fields:</p>
<ul>
<li>Title (Text)</li>
<li>Content (Rich Text)</li>
<li>Author (Text)</li>
</ul>
<p>Save the collection type, and you're ready to add posts.</p>
<video width="600" controls=""><source src="/img/cms-tutorial/creating-schema.webm" type="video/webm"><p>Your browser does not support the video tag.</p></video>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="adding-content">Adding Content<a href="https://rohankumarthakur.co.in/blog/cms-tutorial#adding-content" class="hash-link" aria-label="Direct link to Adding Content" title="Direct link to Adding Content">​</a></h3>
<p>Go to <strong>Content Manager → Post → Create new entry.</strong></p>
<p>Fill in your blog post details (title, content, author) and save it.</p>
<video width="600" controls=""><source src="/img/cms-tutorial/creating-entries.webm" type="video/webm"><p>Your browser does not support the video tag.</p></video>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="fetching-content">Fetching Content<a href="https://rohankumarthakur.co.in/blog/cms-tutorial#fetching-content" class="hash-link" aria-label="Direct link to Fetching Content" title="Direct link to Fetching Content">​</a></h3>
<p>Strapi automatically generates a REST API for each content type. For our blog posts, the endpoint is:</p>
<div class="language-http codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-http codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">http://localhost:1337/api/posts</span><br></span></code></pre></div></div>
<p>To access it securely, you'll need an <strong>API token</strong>:</p>
<ul>
<li>Go to <strong>Settings → API Tokens</strong> in the dashboard.</li>
<li>Create a new token with read access to Posts.</li>
</ul>
<video width="600" controls=""><source src="/img/cms-tutorial/creating-api-token.webm" type="video/webm"><p>Your browser does not support the video tag.</p></video>
<p>Now you can fetch posts from your frontend using this endpoint.</p>
<p><img decoding="async" loading="lazy" alt="API Request Example" src="https://rohankumarthakur.co.in/assets/images/http-requests-5a350be29e269c0aea00d55eef76e37e.png" width="1920" height="1080" class="img_ev3q"></p>
<p>Now you can use this endpoint to fetch and display the blog posts in your frontend application.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://rohankumarthakur.co.in/blog/cms-tutorial#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h3>
<p>You've just built a basic blog with Strapi! 🎉</p>
<ul>
<li>Installed Strapi</li>
<li>Created a Post content type</li>
<li>Added blog entries</li>
<li>Fetched them through the REST API</li>
</ul>
<p>This setup gives you a foundation to expand further — add categories, images, authentication, or even switch to Strapi's GraphQL plugin.</p>]]></content:encoded>
            <category>cms</category>
            <category>strapi</category>
            <category>web development</category>
        </item>
        <item>
            <title><![CDATA[Build a Simple AI Agent with Python and CrewAI]]></title>
            <link>https://rohankumarthakur.co.in/blog/basic-ai-agent</link>
            <guid>https://rohankumarthakur.co.in/blog/basic-ai-agent</guid>
            <pubDate>Sun, 06 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn to build a simple AI agent using Python and CrewAI that searches the internet and generates blog summaries.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p><strong>TL;DR</strong>: Build a Python AI agent using CrewAI, Serper, and Google 2.0 Flash APIs. The agent researches a topic and writes a blog post.<br>
<!-- -->📦 <a href="https://github.com/Xebec19/congenial-garbanzo" target="_blank" rel="noopener noreferrer">GitHub Repo</a></p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a href="https://rohankumarthakur.co.in/blog/basic-ai-agent#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</a></h3>
<p>In this guide, you'll learn how to build a basic AI agent using Python and CrewAI. The agent will search the internet and generate a blog summary using the free Google 2.0 Flash and Serper APIs. This beginner-friendly tutorial walks you through each step.</p>
<p><img decoding="async" loading="lazy" alt="Photo by Gerard Siderius on Unsplash" src="https://rohankumarthakur.co.in/assets/images/gerard-siderius-YeoSV_3Up-k-unsplash-c1aae376603edb2a6fc94a4a5f92e36c.webp" width="5996" height="4096" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="getting-started">Getting Started<a href="https://rohankumarthakur.co.in/blog/basic-ai-agent#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started">​</a></h3>
<p>Ensure Python is installed on your system. You can download it from the <a href="https://www.python.org/downloads/" target="_blank" rel="noopener noreferrer">official website</a>.</p>
<p>Create a new project directory:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">mkdir simple-ai-agent</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd simple-ai-agent</span><br></span></code></pre></div></div>
<p>Create a requirements.txt file and add the necessary packages:</p>
<p><img decoding="async" loading="lazy" alt="requirements.txt" src="data:image/webp;base64,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" width="642" height="492" class="img_ev3q"></p>
<p>Install the dependencies:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip install -r requirements.txt</span><br></span></code></pre></div></div>
<p>Create the main Python file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">touch agent.py</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="set-up">Set Up<a href="https://rohankumarthakur.co.in/blog/basic-ai-agent#set-up" class="hash-link" aria-label="Direct link to Set Up" title="Direct link to Set Up">​</a></h2>
<p>Open <strong><em>agent.py</em></strong> and add the initial setup code:</p>
<p><img decoding="async" loading="lazy" alt="agent.py" src="https://rohankumarthakur.co.in/assets/images/install-dependencies-8275e05b9f0eb5b47ab187bee981e363.webp" width="1164" height="582" class="img_ev3q"></p>
<p>This code uses:</p>
<ul>
<li><a href="https://docs.crewai.com/introduction" target="_blank" rel="noopener noreferrer"><strong><em>CrewAI</em></strong></a> : A library for creating AI agents.</li>
<li><a href="https://serper.dev/" target="_blank" rel="noopener noreferrer"><strong><em>Serper</em></strong></a> : An API for searching the internet.</li>
<li><a href="https://aistudio.google.com/" target="_blank" rel="noopener noreferrer"><strong><em>Google 2.0 Flash</em></strong></a> : A free LLM API for generating text.</li>
</ul>
<p>Create a <strong><em>.env</em></strong> file and add your API keys:</p>
<p><img decoding="async" loading="lazy" alt=".env" src="data:image/webp;base64,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" width="878" height="438" class="img_ev3q"></p>
<p>Load the environment variables in <strong><em>agent.py</em></strong>:</p>
<p><img decoding="async" loading="lazy" alt="load-env" src="https://rohankumarthakur.co.in/assets/images/load-env-05541a8ac729222da597a4a72f5e3ef6.webp" width="1232" height="752" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="define-tools-and-llm">Define Tools and LLM<a href="https://rohankumarthakur.co.in/blog/basic-ai-agent#define-tools-and-llm" class="hash-link" aria-label="Direct link to Define Tools and LLM" title="Direct link to Define Tools and LLM">​</a></h2>
<p>Define the tools and LLM for the agent:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> crewai_tools </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> SerperDevTool</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> langchain_google_genai </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> GoogleGenerativeAI</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">search_tool </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> SerperDevTool</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">llm </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> GoogleGenerativeAI</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">model</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gemini-2.0-flash"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">google_api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">GOOGLE_AI_API_KEY</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="tools" src="https://rohankumarthakur.co.in/assets/images/tools-and-llm-d9853002b1e594d5beaacfb54707016d.webp" width="1670" height="900" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="user-input">User Input<a href="https://rohankumarthakur.co.in/blog/basic-ai-agent#user-input" class="hash-link" aria-label="Direct link to User Input" title="Direct link to User Input">​</a></h2>
<p>Prompt the user to enter a topic:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Welcome to AI Researcher and Writer!"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">topic </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">input</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Enter the topic: "</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Prompt user to enter a topic</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="creating-the-agents">Creating the Agents<a href="https://rohankumarthakur.co.in/blog/basic-ai-agent#creating-the-agents" class="hash-link" aria-label="Direct link to Creating the Agents" title="Direct link to Creating the Agents">​</a></h2>
<p>Create two agents: a researcher and a writer.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">researcher </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Agent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    role</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Researcher"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    goal</span><span class="token operator" style="color:#393A34">=</span><span class="token string-interpolation string" style="color:#e3116c">f"Uncover interesting findings about </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">topic</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    verbose</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    memory</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    backstory</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:#e3116c">"""</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    As a researcher, you are committed to uncovering the</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    latest and most interesting findings in your field. You</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    have a knack for finding hidden gems of information and</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    presenting them in an engaging way. Your goal is to</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    illuminate the topic at hand, providing insights that are</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    both informative and thought-provoking.</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    """</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    tools</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">search_tool</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    llm</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">llm</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    allow_delegation</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">writer </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Agent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    role</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Writer"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    goal</span><span class="token operator" style="color:#393A34">=</span><span class="token string-interpolation string" style="color:#e3116c">f"Write intuitive article about </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">topic</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    verbose</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    memory</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    backstory</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:#e3116c">"""</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    As a writer, you are dedicated to crafting engaging</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    and informative articles. You have a talent for</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    transforming complex ideas into accessible language,</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    making them relatable to a wide audience.</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    """</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    tools</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">search_tool</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    llm</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">llm</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    allow_delegation</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">False</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="creating-the-tasks">Creating the Tasks<a href="https://rohankumarthakur.co.in/blog/basic-ai-agent#creating-the-tasks" class="hash-link" aria-label="Direct link to Creating the Tasks" title="Direct link to Creating the Tasks">​</a></h2>
<p>Define tasks for each agent:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">research_task </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Task</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    description</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-interpolation string" style="color:#e3116c">f"Drive key insights about </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">topic</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"What are the latest trends, technologies, and innovations?"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"Have a balanced view, considering both the positive and negative aspects."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"Your report should be well-structured and easy to follow."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    expected_output</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"A comprehensive 3 paragraphs long report on the topic"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    tools</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">search_tool</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    agent</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">researcher</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">write_task </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Task</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    description</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-interpolation string" style="color:#e3116c">f"Compose an detailed and easy to understand article on </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">topic</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"The article should be engaging and informative, suitable for a general audience."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"It should be well-structured, with a clear introduction, body, and conclusion."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"Use markdown formatting for headings, lists, and code snippets where appropriate."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"The article should be at least 4 paragraphs long and cover the key points from the research report."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    expected_output</span><span class="token operator" style="color:#393A34">=</span><span class="token string-interpolation string" style="color:#e3116c">f"A 4 paragraph article on </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">topic</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c"> fomatted as markdown"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    tools</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">search_tool</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    agent</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">writer</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    async_execution</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">False</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    output_file</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"blog-post.md"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="running-the-tasks">Running the Tasks<a href="https://rohankumarthakur.co.in/blog/basic-ai-agent#running-the-tasks" class="hash-link" aria-label="Direct link to Running the Tasks" title="Direct link to Running the Tasks">​</a></h2>
<p>Run the agent crew sequentially:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">crew </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Crew</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    agents</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">researcher</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> writer</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    tasks</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">research_task</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> write_task</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    process</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">Process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sequential</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> crew</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">kickoff</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>Your <strong><em>agent.py</em></strong> should now resemble:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> os</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> dotenv </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> load_dotenv</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> crewai </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Agent</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Task</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Crew</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Process</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> crewai_tools </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> SerperDevTool</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> langchain_google_genai </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> GoogleGenerativeAI</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">load_dotenv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Load environment variables from .env file</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SERPER_API_KEY </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> os</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">getenv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"SERPER_API_KEY"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">GOOGLE_AI_API_KEY </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> os</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">getenv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"GOOGLE_AI_API"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">search_tool </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> SerperDevTool</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">llm </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> GoogleGenerativeAI</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">model</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"gemini-2.0-flash"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">google_api_key</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">GOOGLE_AI_API_KEY</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Welcome to AI Researcher and Writer!"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">topic </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">input</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Enter the topic: "</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Prompt user to enter a topic</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">researcher </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Agent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    role</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Researcher"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    goal</span><span class="token operator" style="color:#393A34">=</span><span class="token string-interpolation string" style="color:#e3116c">f"Uncover interesting findings about </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">topic</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    verbose</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    memory</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    backstory</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:#e3116c">"""</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    As a researcher, you are committed to uncovering the</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    latest and most interesting findings in your field. You</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    have a knack for finding hidden gems of information and</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    presenting them in an engaging way. Your goal is to</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    illuminate the topic at hand, providing insights that are</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    both informative and thought-provoking.</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    """</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    tools</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">search_tool</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    llm</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">llm</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    allow_delegation</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">writer </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Agent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    role</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Writer"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    goal</span><span class="token operator" style="color:#393A34">=</span><span class="token string-interpolation string" style="color:#e3116c">f"Write intuitive article about </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">topic</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    verbose</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    memory</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    backstory</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:#e3116c">"""</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    As a writer, you are dedicated to crafting engaging</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    and informative articles. You have a talent for</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    transforming complex ideas into accessible language,</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    making them relatable to a wide audience.</span><br></span><span class="token-line" style="color:#393A34"><span class="token triple-quoted-string string" style="color:#e3116c">    """</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    tools</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">search_tool</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    llm</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">llm</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    allow_delegation</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">False</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">research_task </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Task</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    description</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-interpolation string" style="color:#e3116c">f"Drive key insights about </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">topic</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"What are the latest trends, technologies, and innovations?"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"Have a balanced view, considering both the positive and negative aspects."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"Your report should be well-structured and easy to follow."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    expected_output</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"A comprehensive 3 paragraphs long report on the topic"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    tools</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">search_tool</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    agent</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">researcher</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">write_task </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Task</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    description</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-interpolation string" style="color:#e3116c">f"Compose an detailed and easy to understand article on </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">topic</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"The article should be engaging and informative, suitable for a general audience."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"It should be well-structured, with a clear introduction, body, and conclusion."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"Use markdown formatting for headings, lists, and code snippets where appropriate."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"The article should be at least 4 paragraphs long and cover the key points from the research report."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    expected_output</span><span class="token operator" style="color:#393A34">=</span><span class="token string-interpolation string" style="color:#e3116c">f"A 4 paragraph article on </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">topic</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c"> fomatted as markdown"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    tools</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">search_tool</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    agent</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">writer</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    async_execution</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">False</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    output_file</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"blog-post.md"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">crew </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Crew</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    agents</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">researcher</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> writer</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    tasks</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">research_task</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> write_task</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    process</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">Process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sequential</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> crew</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">kickoff</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>Execute the code:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">python agent.py</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="run" src="https://rohankumarthakur.co.in/assets/images/run-befdc1113586a57bfe24adb2dfef7b18.webp" width="1079" height="480" class="img_ev3q"></p>
<p>The generated blog post will be saved as <strong><em>blog-post.md</em></strong> in the project directory. Open it in any text editor.</p>
<p><img decoding="async" loading="lazy" alt="blog-post" src="https://rohankumarthakur.co.in/assets/images/blog-post-3774a72549a886253db3f8ed82f94eb0.webp" width="1920" height="1080" class="img_ev3q"></p>
<p>You can find the demo code on <a href="https://github.com/Xebec19/congenial-garbanzo" target="_blank" rel="noopener noreferrer">Github Repo</a></p>]]></content:encoded>
            <category>Python</category>
            <category>AI</category>
        </item>
        <item>
            <title><![CDATA[gRPC for Go Developers: A Practical Guide]]></title>
            <link>https://rohankumarthakur.co.in/blog/go-grpc-guide</link>
            <guid>https://rohankumarthakur.co.in/blog/go-grpc-guide</guid>
            <pubDate>Thu, 20 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[What is gRPC ?]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-grpc-">What is gRPC ?<a href="https://rohankumarthakur.co.in/blog/go-grpc-guide#what-is-grpc-" class="hash-link" aria-label="Direct link to What is gRPC ?" title="Direct link to What is gRPC ?">​</a></h3>
<p>gRPC stands for Google Remote Procedure Calls and it is a framework for building APIs. It uses HTTP/2 which allows developers to build high performance APIs. Though it has limited browser support, it is better suited for internal systems that require real-time streaming and has large data loads. In this tutorial we would code some simple gRPC APIs. Checkout this video if you wish to know more about <a href="https://youtu.be/E3ez34fdC0k?si=EHW15Eq7QiboCr9P" target="_blank" rel="noopener noreferrer">gRPC</a></p>
<p><img decoding="async" loading="lazy" alt="Photo by Lucian Alexe on Unsplash" src="https://rohankumarthakur.co.in/assets/images/lucian-alexe-yh0UtueiZ-I-unsplash-559ad656fcd225704f88032d950915b4.jpg" width="4592" height="3448" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="setup">Setup<a href="https://rohankumarthakur.co.in/blog/go-grpc-guide#setup" class="hash-link" aria-label="Direct link to Setup" title="Direct link to Setup">​</a></h3>
<p>First we need to install protocol buffer compiler. For installation instructions, see <a href="https://grpc.io/docs/protoc-installation/" target="_blank" rel="noopener noreferrer">Protocol Buffer Compiler Installation</a></p>
<p>We would also need to install protocol compiler plugins for Go using the following commands:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">go install google.golang.org/protobuf/cmd/protoc-gen-go@latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest</span><br></span></code></pre></div></div>
<p>Update your <strong>PATH</strong> so that the <strong>protoc</strong> compiler can find the plugins</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">export PATH="$PATH:$(go env GOPATH)/bin"</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="generate-grpc-code">Generate gRPC code<a href="https://rohankumarthakur.co.in/blog/go-grpc-guide#generate-grpc-code" class="hash-link" aria-label="Direct link to Generate gRPC code" title="Direct link to Generate gRPC code">​</a></h3>
<p>Now, after initializing a project, we would create a folder that would contain our proto files. In our case lets name it <strong>greeting</strong>.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">mkdir greeting &amp;&amp; cd greeting &amp;&amp; touch greeting.proto</span><br></span></code></pre></div></div>
<p>Inside <strong>greeting.proto</strong> we would define the structure of required request, response and the functions.</p>
<div class="language-proto codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-proto codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">syntax = "proto3";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">option go_package = "github.com/Xebec19/probable-lamp/greeting";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">package greeting;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">service greetingService {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    rpc SayGreeting(GreetingRequest) returns (GreetingResponse) {}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">message GreetingRequest{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    string name = 1;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">message GreetingResponse {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    string message = 1;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>In <strong>greeting.proto</strong> we have defined a service <strong>greetingService</strong> that would return a simple rpc method that takes a request and sends back a response.</p>
<p>Before we use the new service method, we need to compile the <strong>.proto</strong> file. Inside the root directory of the project, we would run the following command:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">protoc --go_out=. --go_opt=paths=source_relative \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --go-grpc_out=. --go-grpc_opt=paths=source_relative \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    greeting/greeting.proto</span><br></span></code></pre></div></div>
<p>This will generate <strong>greeting_grpc.pb.go</strong> and <strong>greeting.pb.go</strong> files, which contain:</p>
<ol>
<li>Code for populating, serializing and retrieving <strong>GreetingRequest</strong> and <strong>GreetingResponse</strong> message types.</li>
<li>Generated client and server code.</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="creating-the-server">Creating the server<a href="https://rohankumarthakur.co.in/blog/go-grpc-guide#creating-the-server" class="hash-link" aria-label="Direct link to Creating the server" title="Direct link to Creating the server">​</a></h3>
<p>Now we would create a <strong>server</strong> folder, which would contain code for the server. Open <strong>server/main.go</strong> and create a server and add methods to it.</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> server </span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">s </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">server</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">SayGreeting</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GreetingRequest</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GreetingResponse</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Lets create a simple rpc method <strong>SayGreeting</strong> that takes a name and returns a string.</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">s </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">server</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">SayGreeting</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GreetingRequest</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GreetingResponse</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GreetingResponse</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">Message</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Hello "</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Once, we have implemented all our methods, we would start our gRPC server on a given port.</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">lis</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> net</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Listen</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"tcp"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">":50051"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Fatalf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"failed to listen on port 50051: %v"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">s </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewServer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RegisterGreetingServiceServer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">s</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">server</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">s</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Serve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lis</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>Finally, our server would look like below.</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token string" style="color:#e3116c">"context"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token string" style="color:#e3116c">"log"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token string" style="color:#e3116c">"net"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	pb </span><span class="token string" style="color:#e3116c">"github.com/Xebec19/probable-lamp/greeting"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token string" style="color:#e3116c">"google.golang.org/grpc"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> server </span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">UnimplementedGreetingServiceServer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">s </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">server</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">SayGreeting</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> in </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GreetingRequest</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GreetingResponse</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GreetingResponse</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">Message</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Hello "</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> in</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	lis</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> net</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Listen</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"tcp"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">":50051"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Fatalf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"failed to listen on port 50051: %v"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	s </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewServer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RegisterGreetingServiceServer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">s</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">server</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Printf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"gRPC server listening at %v"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> lis</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Addr</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> s</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Serve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lis</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Fatalf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"failed to serve: %v"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>In above code, we build a <strong>server</strong> that listens to port <strong>:50051</strong> and added a <strong>SayGreeting</strong> method to it, which accepts a name parameter and returns a string.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="creating-the-client">Creating the client<a href="https://rohankumarthakur.co.in/blog/go-grpc-guide#creating-the-client" class="hash-link" aria-label="Direct link to Creating the client" title="Direct link to Creating the client">​</a></h3>
<p>In Go, we also call a client as stub. This client interacts with the server and invokes the RPC methods defined in the .proto file. Let's create a client/main.go file to implement the client.</p>
<p>The client first needs to establish a connection with the gRPC server.</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"localhost:50051"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithTransportCredentials</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">insecure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewCredentials</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Fatalf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"failed to connect to gRPC server at localhost:50051: %v"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">defer</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Close</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>Using the connection, we initialize a client for the GreetingService:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">c </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewHelloWorldServiceClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">conn</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>To allow the client to accept the --name flag, we use Go's flag package. Here's how you can implement it:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">name </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> flag</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">String</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"World"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Name to greet"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">flag</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Parse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>We then call the SayGreeting method, passing a GreetingRequest message:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cancel </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithTimeout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Background</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Second</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">defer</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">cancel</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">r</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> c</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SayGreeting</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GreetingRequest</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">Name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Fatalf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"error calling function SayGreeting: %v"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Printf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Response from gRPC server's SayGreeting function: %s"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>Here's the complete code for the client:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token string" style="color:#e3116c">"context"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token string" style="color:#e3116c">"flag"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token string" style="color:#e3116c">"log"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token string" style="color:#e3116c">"time"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	pb </span><span class="token string" style="color:#e3116c">"github.com/Xebec19/probable-lamp/greeting"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token string" style="color:#e3116c">"google.golang.org/grpc"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token string" style="color:#e3116c">"google.golang.org/grpc/credentials/insecure"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> flag</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">String</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Default Name"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Name to greet"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	flag</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Parse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	conn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"localhost:50051"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithTransportCredentials</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">insecure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewCredentials</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Fatalf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"failed to connect to gRPC server at localhost:50051: %v"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token keyword" style="color:#00009f">defer</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Close</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	c </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewGreetingServiceClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">conn</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cancel </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithTimeout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Background</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Second</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token keyword" style="color:#00009f">defer</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">cancel</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	r</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> c</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SayGreeting</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GreetingRequest</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">Name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Fatalf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"error calling function SayGreeting: %v"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Printf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Response from gRPC server's SayGreeting function: %s"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="running-the-client-and-server">Running the Client and Server<a href="https://rohankumarthakur.co.in/blog/go-grpc-guide#running-the-client-and-server" class="hash-link" aria-label="Direct link to Running the Client and Server" title="Direct link to Running the Client and Server">​</a></h3>
<p>To test the setup:</p>
<ol>
<li>Start the server using below command:</li>
</ol>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">go run server/main.go</span><br></span></code></pre></div></div>
<ol start="2">
<li>Start the client with the --name flag:</li>
</ol>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">go run client/main.go --name=Rohan</span><br></span></code></pre></div></div>
<ol start="3">
<li>The client will display the custom greeting message</li>
</ol>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">2024/12/01 22:44:41 Response from gRPC server's SayGreeting function: Hello Rohan</span><br></span></code></pre></div></div>
<p>This concludes our introduction to gRPC with Go. You've successfully built a client-server application using gRPC!</p>
<p><a href="https://github.com/Xebec19/probable-lamp" target="_blank" rel="noopener noreferrer">Source Code</a></p>]]></content:encoded>
            <category>Golang</category>
            <category>gRPC</category>
        </item>
        <item>
            <title><![CDATA[Building a HTML5 game with KaplayJS]]></title>
            <link>https://rohankumarthakur.co.in/blog/build-a-html5-game</link>
            <guid>https://rohankumarthakur.co.in/blog/build-a-html5-game</guid>
            <pubDate>Sat, 14 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Introduction]]></description>
            <content:encoded><![CDATA[
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a href="https://rohankumarthakur.co.in/blog/build-a-html5-game#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</a></h2>
<p>Building 2D games is both fun and a great way to improve your coding skills. In this tutorial, we'll create a simple game using KaplayJS, a JavaScript game development library. The game is about controlling a character, "the bean," and helping it jump over pipes to avoid collisions. Let's break down the steps!</p>
<p><img decoding="async" loading="lazy" alt="https://unsplash.com/photos/red-blue-and-yellow-lego-minifig-pRS6itEjhyI" src="https://rohankumarthakur.co.in/assets/images/boukaih-pRS6itEjhyI-unsplash-a61c0d459d36185d6273ee2d10495e56.webp" width="3432" height="1931" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="setting-up-the-game">Setting Up the Game<a href="https://rohankumarthakur.co.in/blog/build-a-html5-game#setting-up-the-game" class="hash-link" aria-label="Direct link to Setting Up the Game" title="Direct link to Setting Up the Game">​</a></h2>
<p>First, let's set up the game project using the Kaplay CLI tool:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ npx create-kaplay easy-leap</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ cd easy-leap</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ npm run dev</span><br></span></code></pre></div></div>
<p>You'll see a basic layout like this in your browser:</p>
<p><img decoding="async" loading="lazy" alt="default layout" src="https://rohankumarthakur.co.in/assets/images/firstmap-491c04c3e024db7f0df98fcb4c0c02a6.png" width="1920" height="971" class="img_ev3q"></p>
<p>Now, let's load our character sprite, "the bean," using the following code:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">kaplay</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"kaplay"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"kaplay/global"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> k </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">kaplay</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">loadSprite</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"bean"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sprites/bean.png"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<ul>
<li><code>loadSprite()</code> function loads the character image we'll use for our player.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="setting-gravity">Setting Gravity<a href="https://rohankumarthakur.co.in/blog/build-a-html5-game#setting-gravity" class="hash-link" aria-label="Direct link to Setting Gravity" title="Direct link to Setting Gravity">​</a></h2>
<p>Next, we set up the gravity for the game:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">setGravity</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>This ensures the bean falls unless it jumps. We can also set the background color to sky blue:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">setBackground</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">141</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">183</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="creating-the-game-scene">Creating the Game Scene<a href="https://rohankumarthakur.co.in/blog/build-a-html5-game#creating-the-game-scene" class="hash-link" aria-label="Direct link to Creating the Game Scene" title="Direct link to Creating the Game Scene">​</a></h2>
<p>In KaplayJS, game logic is organized in <strong>scenes</strong>, Here's how we define the main game scene:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">scene</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"game"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Game logic goes here</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Now, let's initialize the bean and pipes inside this scene.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-bean-character">The Bean Character<a href="https://rohankumarthakur.co.in/blog/build-a-html5-game#the-bean-character" class="hash-link" aria-label="Direct link to The Bean Character" title="Direct link to The Bean Character">​</a></h2>
<p>We create our bean character using:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> bean </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token function" style="color:#d73a49">sprite</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"bean"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">pos</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">width</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">area</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">body</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Here's what each part does:</p>
<ul>
<li><code>sprite("bean")</code>: Draws the bean sprite.</li>
<li><code>pos(width() / 4, 0)</code>: Places the bean at a quarter of the screen's width and the top of the screen.</li>
<li><code>area()</code>: Adds a collider for detecting collisions.</li>
<li><code>body()</code>: Makes the bean affected by gravity and allows it to jump.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="jumping-mechanism">Jumping Mechanism<a href="https://rohankumarthakur.co.in/blog/build-a-html5-game#jumping-mechanism" class="hash-link" aria-label="Direct link to Jumping Mechanism" title="Direct link to Jumping Mechanism">​</a></h2>
<p>To make the bean jump, we add the following input controls:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">JUMP_FORCE</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">800</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">onKeyPress</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"space"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">jump</span><span class="token punctuation" style="color:#393A34">(</span><span class="token constant" style="color:#36acaa">JUMP_FORCE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">onGamepadButtonPress</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"south"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">jump</span><span class="token punctuation" style="color:#393A34">(</span><span class="token constant" style="color:#36acaa">JUMP_FORCE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">onClick</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">jump</span><span class="token punctuation" style="color:#393A34">(</span><span class="token constant" style="color:#36acaa">JUMP_FORCE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<ul>
<li><strong>Spacebar</strong> for keyboard control.</li>
<li><strong>Gamepad</strong> button for controller users.</li>
<li><strong>Clicking</strong> for mobile or desktop users.</li>
</ul>
<p>We also check for when the player falls, triggering a game-over state:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">CEILING</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">60</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// check for fall death</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">onUpdate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">pos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">height</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">pos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">CEILING</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// switch to "lose" scene</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">go</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"lose"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> score</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="adding-pipes">Adding Pipes<a href="https://rohankumarthakur.co.in/blog/build-a-html5-game#adding-pipes" class="hash-link" aria-label="Direct link to Adding Pipes" title="Direct link to Adding Pipes">​</a></h2>
<p>The challenge of the game is avoiding pipes. Here's how we generate them:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">PIPE_OPEN</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">240</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">PIPE_MIN</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">60</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">SPEED</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">320</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">spawnPipe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> h1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">rand</span><span class="token punctuation" style="color:#393A34">(</span><span class="token constant" style="color:#36acaa">PIPE_MIN</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">height</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">PIPE_MIN</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">PIPE_OPEN</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> h2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">height</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> h1 </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">PIPE_OPEN</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token function" style="color:#d73a49">pos</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">width</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">rect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">64</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> h1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">area</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">move</span><span class="token punctuation" style="color:#393A34">(</span><span class="token constant" style="color:#36acaa">LEFT</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">SPEED</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"pipe"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">pos</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">width</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> h1 </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">PIPE_OPEN</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">rect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">64</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> h2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">area</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">move</span><span class="token punctuation" style="color:#393A34">(</span><span class="token constant" style="color:#36acaa">LEFT</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">SPEED</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"pipe"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">passed</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<ul>
<li><code>rand()</code> generates random heights for the pipes.</li>
<li><code>add()</code> creates the pipes as rectangles that move from right to left at a set speed.</li>
<li><code>move(LEFT, SPEED)</code> keeps the pipes moving across the screen.</li>
</ul>
<p>This function creates pipes that move from right to left. We generate a new pipe every second:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">loop</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">spawnPipe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="scoring-and-collisions">Scoring and Collisions<a href="https://rohankumarthakur.co.in/blog/build-a-html5-game#scoring-and-collisions" class="hash-link" aria-label="Direct link to Scoring and Collisions" title="Direct link to Scoring and Collisions">​</a></h2>
<p>To track the score, we add the following code:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> score </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// display score</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> scoreLabel </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">score</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">anchor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"center"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">pos</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">width</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">fixed</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">z</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">addScore</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  score</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  scoreLabel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">text</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> score</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Points are added every time the bean successfully passes a pipe:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">onUpdate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"pipe"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">p</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">p</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">pos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> p</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">width</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">pos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> p</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">passed</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">addScore</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    p</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">passed</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>If the bean collides with a pipe, it's game over:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">onCollide</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"pipe"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">go</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"lose"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> score</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">addKaboom</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">pos</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Here's the final game scene:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">scene</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"game"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> bean </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token function" style="color:#d73a49">sprite</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"bean"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">pos</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">width</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">area</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">body</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// check for fall death</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">onUpdate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">pos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">height</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">pos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">CEILING</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// switch to "lose" scene</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">go</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"lose"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> score</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">CEILING</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">60</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// check for fall death</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">onUpdate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">pos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">height</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">pos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">CEILING</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// switch to "lose" scene</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">go</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"lose"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> score</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">JUMP_FORCE</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">800</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">onKeyPress</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"space"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">jump</span><span class="token punctuation" style="color:#393A34">(</span><span class="token constant" style="color:#36acaa">JUMP_FORCE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">onGamepadButtonPress</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"south"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">jump</span><span class="token punctuation" style="color:#393A34">(</span><span class="token constant" style="color:#36acaa">JUMP_FORCE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">onClick</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">jump</span><span class="token punctuation" style="color:#393A34">(</span><span class="token constant" style="color:#36acaa">JUMP_FORCE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">PIPE_OPEN</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">240</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">PIPE_MIN</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">60</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">SPEED</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">320</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">spawnPipe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> h1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">rand</span><span class="token punctuation" style="color:#393A34">(</span><span class="token constant" style="color:#36acaa">PIPE_MIN</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">height</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">PIPE_MIN</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">PIPE_OPEN</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> h2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">height</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> h1 </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">PIPE_OPEN</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token function" style="color:#d73a49">pos</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">width</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">rect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">64</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> h1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">area</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">move</span><span class="token punctuation" style="color:#393A34">(</span><span class="token constant" style="color:#36acaa">LEFT</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">SPEED</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"pipe"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">pos</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">width</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> h1 </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">PIPE_OPEN</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">rect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">64</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> h2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">area</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">move</span><span class="token punctuation" style="color:#393A34">(</span><span class="token constant" style="color:#36acaa">LEFT</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">SPEED</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"pipe"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">passed</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">loop</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">spawnPipe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> score </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// display score</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> scoreLabel </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">score</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">anchor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"center"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">pos</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">width</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">fixed</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">z</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">addScore</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    score</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    scoreLabel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">text</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> score</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">onUpdate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"pipe"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">p</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">p</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">pos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> p</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">width</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">pos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> p</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">passed</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">addScore</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      p</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">passed</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">onCollide</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"pipe"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">go</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"lose"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> score</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">addKaboom</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">pos</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">destroy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bean</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-lose-scene">The Lose Scene<a href="https://rohankumarthakur.co.in/blog/build-a-html5-game#the-lose-scene" class="hash-link" aria-label="Direct link to The Lose Scene" title="Direct link to The Lose Scene">​</a></h2>
<p>When the player loses, we switch to a <strong>lose</strong> scene to display the final score:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">scene</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"lose"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">score</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">sprite</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"bean"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">pos</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">width</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">height</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">108</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">scale</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">anchor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"center"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  k</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">score</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">pos</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">width</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">height</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">108</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">scale</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">anchor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"center"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">onKeyPress</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"space"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">go</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"game"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">onClick</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">go</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"game"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Here, the player can restart the game by pressing space or clicking anywhere.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="game-initialization">Game Initialization<a href="https://rohankumarthakur.co.in/blog/build-a-html5-game#game-initialization" class="hash-link" aria-label="Direct link to Game Initialization" title="Direct link to Game Initialization">​</a></h2>
<p>The game starts with:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">go</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"game"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>This loads the "game" scene and kicks off the gameplay.</p>
<p><a href="https://www.youtube.com/watch?v=XI2j5SZCfoo" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://img.youtube.com/vi/XI2j5SZCfoo/0.jpg" alt="GAME PLAY" class="img_ev3q"></a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="publishing-on-itchio">Publishing on itch.io<a href="https://rohankumarthakur.co.in/blog/build-a-html5-game#publishing-on-itchio" class="hash-link" aria-label="Direct link to Publishing on itch.io" title="Direct link to Publishing on itch.io">​</a></h2>
<p>To publish your game on itch.io:</p>
<ol>
<li>
<p>Build the game:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ npm run bundle</span><br></span></code></pre></div></div>
<p>This creates a ZIP file in the dist folder.</p>
</li>
<li>
<p>Upload the ZIP to itch.io:</p>
<ul>
<li>Sign in to itch.io.</li>
<li>Create a new project and select HTML as the project type.</li>
<li>Upload the ZIP and enable "This file will be played in the browser."</li>
</ul>
</li>
<li>
<p>Publish: Click "Save and View Page," and once everything looks good, click "Publish."</p>
</li>
</ol>
<p><a href="https://xebec19.itch.io/easy-leap" target="_blank" rel="noopener noreferrer">GAME LINK</a></p>
<p><a href="https://github.com/Xebec19/easy-leap" target="_blank" rel="noopener noreferrer">CODE</a></p>
<p>Happy coding!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Upload a File to S3: A Step-by-Step Guide]]></title>
            <link>https://rohankumarthakur.co.in/blog/upload-to-s3-in-go</link>
            <guid>https://rohankumarthakur.co.in/blog/upload-to-s3-in-go</guid>
            <pubDate>Mon, 10 Jun 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Introduction]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a href="https://rohankumarthakur.co.in/blog/upload-to-s3-in-go#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</a></h2>
<p>Amazon S3 (Simple Storage Service) is a scalable object storage service used widely for various data storage needs. This guide will walk you through the process of uploading a file to an S3 bucket, from creating the bucket and setting up the necessary permissions, to writing and testing the code that performs the upload. Let's get started!</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="create-an-s3-bucket">Create an S3 Bucket<a href="https://rohankumarthakur.co.in/blog/upload-to-s3-in-go#create-an-s3-bucket" class="hash-link" aria-label="Direct link to Create an S3 Bucket" title="Direct link to Create an S3 Bucket">​</a></h2>
<p>First we need to create a bucket in S3.</p>
<p><img decoding="async" loading="lazy" alt="create a bucket" src="https://rohankumarthakur.co.in/assets/images/utsig-create-bucket-8e011f09d54e14b321f99680333e7fa6.png" width="1296" height="626" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="create-a-policy">Create a Policy<a href="https://rohankumarthakur.co.in/blog/upload-to-s3-in-go#create-a-policy" class="hash-link" aria-label="Direct link to Create a Policy" title="Direct link to Create a Policy">​</a></h2>
<p>Next, we need to create a policy that grants access to this bucket.</p>
<ol>
<li>Navigate to the IAM section of AWS.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="iam dashboard" src="https://rohankumarthakur.co.in/assets/images/utsig-iam-dashboard-916cca842faee09cc66a35b9b1d5b1f6.png" width="1296" height="625" class="img_ev3q"></p>
<ol start="2">
<li>Go to the policy section in the left sidebar.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="policy dashboard" src="https://rohankumarthakur.co.in/assets/images/utsig-policy-dashboard-eefb5a277abe31ee43b919aa5d90de74.png" width="1296" height="625" class="img_ev3q"></p>
<ol start="3">
<li>Create a new policy.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="create policy" src="https://rohankumarthakur.co.in/assets/images/utsig-create-policy-dc5e16e6e32fbcbcce50762e725511be.png" width="1296" height="625" class="img_ev3q"></p>
<ol start="4">
<li>Set the resource to S3 and check "All S3 actions" in the "actions allowed" section.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="set resource and actions" src="https://rohankumarthakur.co.in/assets/images/utsig-set-resource-and-permissions-9e8a68add8c7399440b80f30a45187da.png" width="1296" height="621" class="img_ev3q"></p>
<ol start="5">
<li>In the Resources section, input the ARN (Amazon Resource Name) of your S3 bucket opposite the bucket label. You can find the ARN in the properties section of the bucket.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="arn" src="https://rohankumarthakur.co.in/assets/images/utsig-arn-dcbbf2283373d7464c4469378535c95e.png" width="1296" height="624" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="resource section" src="https://rohankumarthakur.co.in/assets/images/utsig-resources-section-4e6449ab8dcbf6fddc28641ee854ec78.png" width="1296" height="624" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="add bucket arn" src="https://rohankumarthakur.co.in/assets/images/utsig-add-bucket-arn-e2f8fab3b2047bf233a6d775868ecd98.png" width="1296" height="621" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="added bucket arn" src="https://rohankumarthakur.co.in/assets/images/utsig-added-bucket-arn-730f1bd3dd8f393bf933fbe7d58288fd.png" width="1296" height="622" class="img_ev3q"></p>
<ol start="6">
<li>Scroll down and select "Any" for the object label, which grants permission on any object inside the bucket.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="set object label to any" src="https://rohankumarthakur.co.in/assets/images/utsig-set-object-6403ef9a1071659e31dc1cdcc03beeab.png" width="1296" height="622" class="img_ev3q"></p>
<ol start="7">
<li>Provide a name and description for your policy.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="add details in policy" src="https://rohankumarthakur.co.in/assets/images/utsig-add-details-in-policy-46746264ddacaae91390dd8f940103ec.png" width="1296" height="622" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="create-an-iam-user">Create an IAM User<a href="https://rohankumarthakur.co.in/blog/upload-to-s3-in-go#create-an-iam-user" class="hash-link" aria-label="Direct link to Create an IAM User" title="Direct link to Create an IAM User">​</a></h2>
<p>After creating the policy, we need to create an IAM user and assign this policy to the user.</p>
<ol>
<li>Go to the user section in the IAM Dashboard.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="create iam user" src="https://rohankumarthakur.co.in/assets/images/utsig-iam-create-user-f54e0f3075d3285d4d7bb2c3526771e0.png" width="1296" height="624" class="img_ev3q"></p>
<ol start="2">
<li>Enter a name for the IAM user.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="enter name for iam user" src="https://rohankumarthakur.co.in/assets/images/utsig-iam-create-user-2-3bf204130b8d173596bfed275a705dda.png" width="1296" height="624" class="img_ev3q"></p>
<ol start="3">
<li>Skip the AWS Management console access since we only need programmatic access for this user. Attach the policy created earlier to this user.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="attach policy" src="https://rohankumarthakur.co.in/assets/images/utsig-attach-policy-1-2faee688d939fa4e7ca4dbf9f9a6e408.png" width="1296" height="620" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="attach policy" src="https://rohankumarthakur.co.in/assets/images/utsig-attach-policy-2-033d0a772adf0da6dbaa1d67d0bc9484.png" width="1295" height="625" class="img_ev3q"></p>
<ol start="4">
<li>Review the details and create the user.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="review iam user" src="https://rohankumarthakur.co.in/assets/images/utsig-review-iam-user-72570bb1613ca94b974fd06e5ac7f26a.png" width="1296" height="625" class="img_ev3q"></p>
<ol start="5">
<li>Create access keys for the user so that our API can access the bucket on behalf of the created user. Go to the "Security Credentials" section.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="move to security credentials section" src="https://rohankumarthakur.co.in/assets/images/utsig-visit-security-credentials-6b1eaca6986072e069b4407bb8d1a9e1.png" width="1296" height="622" class="img_ev3q"></p>
<ol start="6">
<li>Scroll down to "Access Keys" and create a new access key.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="scroll down to access key" src="https://rohankumarthakur.co.in/assets/images/utsig-move-to-access-keys-ddcdd2680e3d26a44a8e40835624bde6.png" width="1296" height="625" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="create access key" src="https://rohankumarthakur.co.in/assets/images/utsig-create-access-key-0121ddc0f015f4178b5622d63b76f140.png" width="1296" height="626" class="img_ev3q"></p>
<ol start="7">
<li>Optionally, add a description to the access key. Make sure to save the secret access key as it will not be retrievable later.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="add description to access key" src="https://rohankumarthakur.co.in/assets/images/utsig-set-description-access-key-ecde1202218c9cce9e90695bbd18de05.png" width="1296" height="624" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="access key creds" src="https://rohankumarthakur.co.in/assets/images/utsig-access-key-creds-9b3643e35f4b5235fe2cbbfb764a3ea5.png" width="1296" height="626" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="create-a-web-server">Create a web server<a href="https://rohankumarthakur.co.in/blog/upload-to-s3-in-go#create-a-web-server" class="hash-link" aria-label="Direct link to Create a web server" title="Direct link to Create a web server">​</a></h2>
<p>To handle file uploads, we will create a web server using the Go programming language and the go-fiber package.</p>
<ol>
<li>Download the required packages:</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">go get github.com/gofiber/fiber/v2</span><br></span></code></pre></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">go get github.com/aws/aws-sdk-go/aws github.com/aws/aws-sdk-go/aws/credentials github.com/aws/aws-sdk-go/aws/session github.com/aws/aws-sdk-go/service/s3/s3manager</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="download packages" src="https://rohankumarthakur.co.in/assets/images/utsig-download-packages-0c1f0e3b4c53475b215a98ff78abc5b1.png" width="1296" height="602" class="img_ev3q"></p>
<ol start="2">
<li>Create a web server listening on port 3000:</li>
</ol>
<p><img decoding="async" loading="lazy" alt="create web server" src="https://rohankumarthakur.co.in/assets/images/utsig-web-server-0c69af79573943212a5037779f35d5ca.png" width="1042" height="894" class="img_ev3q"></p>
<ol start="3">
<li>Initialize the AWS SDK:</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import (</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	"github.com/aws/aws-sdk-go/aws"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	"github.com/aws/aws-sdk-go/aws/credentials"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	"github.com/aws/aws-sdk-go/aws/session"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	"github.com/aws/aws-sdk-go/service/s3/s3manager"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">var Uploader *s3manager.Uploader</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">func NewAWS() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	var region string = ""    // AWS Region</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	var accessKey string = "" // access key</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	var secretKey string = "" // secret access key</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	awsSession, err := session.NewSessionWithOptions(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		session.Options{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">			Config: aws.Config{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">				Region: aws.String(region),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">				Credentials: credentials.NewStaticCredentials(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">					accessKey,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">					secretKey,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">					"",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">				),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">			},</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		})</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	if err != nil {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		panic(err)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	Uploader = s3manager.NewUploader(awsSession)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>Initialize this function in main.go:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">package main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import (</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	"github.com/Xebec19/psychic-enigma/internal"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	"github.com/gofiber/fiber/v2"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">func main() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	internal.NewAWS() // initialize AWS SDK</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	app := fiber.New()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	app.Get("/", func(c *fiber.Ctx) error {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		return c.SendString("Hello, World!")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	})</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	app.Listen(":3000")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<ol start="4">
<li>Create a function to upload a file to S3:</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">type Result struct {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	Value string</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	Err   error</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">func UploadImage(file *multipart.FileHeader) &lt;-chan Result {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	ch := make(chan Result)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	go func() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		defer close(ch)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		src, err := file.Open()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		if err != nil {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">			return</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		defer src.Close()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		var bucketName string = "" // bucket name</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		_, err = Uploader.Upload(&amp;s3manager.UploadInput{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">			Bucket: aws.String(bucketName),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">			Key:    aws.String(file.Filename),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">			Body:   src, // add file body here</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		})</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		if err != nil {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">			ch &lt;- Result{Value: "", Err: err}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">			return</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		url := fmt.Sprintf("https://%s.s3.amazonaws.com/%s", bucketName, file.Filename)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		ch &lt;- Result{Value: url, Err: nil}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	}()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	return ch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<ol start="5">
<li>Create an API endpoint to handle file uploads:</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">app.Post("/upload", func(c *fiber.Ctx) error {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		form, err := c.MultipartForm()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		if err != nil {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            return err</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		ch := internal.UploadImage(form.File["image"][0])</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		response := &lt;-ch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		if response.Err != nil {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">			return response.Err</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		c.SendString(response.Value)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		return nil</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">})</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="testing-the-code">Testing the Code<a href="https://rohankumarthakur.co.in/blog/upload-to-s3-in-go#testing-the-code" class="hash-link" aria-label="Direct link to Testing the Code" title="Direct link to Testing the Code">​</a></h2>
<ol>
<li>Use Postman to test the file upload endpoint:</li>
</ol>
<p><img decoding="async" loading="lazy" alt="postman request" src="https://rohankumarthakur.co.in/assets/images/utsig-s3-object-c4e88026197d70e181f3682f7de3dbd8.png" width="1296" height="625" class="img_ev3q"></p>
<ol start="2">
<li>Verify the file has been uploaded to the S3 bucket:</li>
</ol>
<p><img decoding="async" loading="lazy" alt="s3 files" src="https://rohankumarthakur.co.in/assets/images/utsig-s3-object-c4e88026197d70e181f3682f7de3dbd8.png" width="1296" height="625" class="img_ev3q"></p>
<p>Congratulations! You have successfully uploaded a file to S3. You can find the source code <a href="https://github.com/Xebec19/psychic-enigma" target="_blank" rel="noopener noreferrer">https://github.com/Xebec19/psychic-enigma</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://rohankumarthakur.co.in/blog/upload-to-s3-in-go#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>Uploading files to S3 involves creating a bucket, setting up the appropriate IAM policies and user, and writing code to handle the file upload. By following this guide, you should now be able to upload files to S3 using Go and the AWS SDK. Happy coding!</p>]]></content:encoded>
            <category>web development</category>
            <category>Golang</category>
            <category>aws</category>
            <category>s3</category>
        </item>
        <item>
            <title><![CDATA[Web development basics]]></title>
            <link>https://rohankumarthakur.co.in/blog/overview</link>
            <guid>https://rohankumarthakur.co.in/blog/overview</guid>
            <pubDate>Tue, 14 Nov 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Overview]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="overview">Overview<a href="https://rohankumarthakur.co.in/blog/overview#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview">​</a></h2>
<p>Web development is an exciting field that empowers us to create and maintain websites and web applications. It involves leveraging various technologies such as HTML, CSS, and JavaScript to construct the visual and interactive elements of a website.</p>
<p>When it comes to the front-end, we're focused on refining the user interface, ensuring both an aesthetically pleasing design and user-friendly experience. This is where HTML (Hypertext Markup Language) takes the stage, defining the structure of our web content. Meanwhile, CSS (Cascading Style Sheets) steps in to stylize and arrange our content, providing the desired appearance and feel.</p>
<p>On the flip side, the back-end encompasses server-side logic that grants dynamism and functionality to our website. This is where programming languages like Python, Ruby, PHP, or JavaScript (Node.js) come into play. It's also where we manage databases, handling user data and other essential information our website requires.</p>
<p>Now, let's delve into the fundamentals of web browsing and how the internet works.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="browsing-the-web">Browsing the web<a href="https://rohankumarthakur.co.in/blog/overview#browsing-the-web" class="hash-link" aria-label="Direct link to Browsing the web" title="Direct link to Browsing the web">​</a></h2>
<p>As we enter "<a href="http://www.google.com/" target="_blank" rel="noopener noreferrer">www.google.com</a>"<!-- --> in our browser's address bar, the query journeys to the ISP (Internet Service Provider), which looks up the query in the DNS (Domain Name Service). ISPs are substantial entities providing internet services to users like us, and DNS acts as a registry mapping domain names to unique IP addresses. These IP addresses serve as distinctive identifiers for each computer connected to the internet.</p>
<p>Upon locating the requested resource in the DNS, the ISP returns the IP address of the server hosting that resource. Subsequently, the server transmits HTML, CSS, and JavaScript files back to us. Once received, these files are executed in our browser, culminating in the display of a complete web page.</p>
<p><img decoding="async" loading="lazy" alt="searching the web" src="https://rohankumarthakur.co.in/assets/images/Web-search-b8c7eb5f3e79480cf467abea1a69efce.png" width="1659" height="872" class="img_ev3q"></p>
<p>For further insight into ISPs, you can refer to this informative article on <a href="https://www.geeksforgeeks.org/internet-service-provider-isp-hierarchy/" target="_blank" rel="noopener noreferrer">Internet Service Provider Hierarchy</a>.</p>
<p>When we have the IP address, we're able to establish a direct connection with the server. Wondering how we achieve this connection? Refer to the illustrative diagram below:</p>
<p><img decoding="async" loading="lazy" src="https://user-images.githubusercontent.com/65282610/246672467-fb025138-7249-47d9-941e-838065ad8d87.png" alt="internet-backbone drawio" class="img_ev3q"></p>
<p>Our connection to the ISP initiates a connection to the Internet Backbone, which in turn links us to the server. The Internet Backbone is essentially the core of the internet, comprising high-speed networks interlinked by fiber-optic connections and efficient routers. You can explore the intricate network of the Internet Backbone through this <a href="https://www.submarinecablemap.com/" target="_blank" rel="noopener noreferrer">submarine cable map</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction-to-html-css-and-javascript">Introduction to html, css and javascript<a href="https://rohankumarthakur.co.in/blog/overview#introduction-to-html-css-and-javascript" class="hash-link" aria-label="Direct link to Introduction to html, css and javascript" title="Direct link to Introduction to html, css and javascript">​</a></h2>
<p>Let's now explore a basic example of HTML, CSS, and JavaScript integration.</p>
<p>To create an HTML file, we begin by saving a file with a ".html" extension. This file should open with a:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">&lt;!DOCTYPE html&gt;</span><br></span></code></pre></div></div>
<p>tag, indicating adherence to the HTML5 standard. Within the file, the root element is the <code>&lt;html&gt;</code> tag, housing two crucial tags: <code>&lt;head&gt;</code> and <code>&lt;body&gt;</code>. The <code>&lt;head&gt;</code> section contains metadata about the webpage (e.g., title, keywords, description), while the <code>&lt;body&gt;</code> section houses the webpage's content.</p>
<p>Here's a simplified example using an <code>&lt;h1&gt;</code> tag to display a heading:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">&lt;!doctype html&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;html&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;head&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;title&gt;Web page&lt;/title&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/head&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;body&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;h1&gt;Hello world&lt;/h1&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/body&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/html&gt;</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="https://user-images.githubusercontent.com/65282610/246673283-7d56be7c-115d-4cdd-9a77-468e7719290c.png" alt="Screenshot from 2023-06-18 20-37-14" class="img_ev3q"></p>
<p>However, a plain webpage lacks visual appeal. This is where CSS steps in, offering the means to introduce colors and other stylistic elements that enhance interactivity. Don't worry about the syntax just yet; we'll delve into that in upcoming articles. Here's a simple demonstration of how we'd create basic styling:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">.root {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    background-color: blue;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>This styling can then be applied to our document:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">&lt;!doctype html&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;html&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;head&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;title&gt;Web page&lt;/title&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;style&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">.root {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    background-color: blue;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/style&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/head&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;body&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;h1 class="root"&gt;Hello world&lt;/h1&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/body&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/html&gt;</span><br></span></code></pre></div></div>
<p>As you'll notice, we've assigned a class property to the <code>&lt;h1&gt;</code> tag. We'll explore this concept further in our CSS discussions.</p>
<p>For interactivity, let's add a button that displays a message box when clicked:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">&lt;button onclick="handleClick()"&gt;Click me&lt;/button&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;script&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">function handleClick() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    prompt("hello world");</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/script&gt;</span><br></span></code></pre></div></div>
<p>Incorporating the above code into our webpage:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">&lt;!doctype html&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;html&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;head&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;title&gt;Web page&lt;/title&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;style&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">.root {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    background-color: blue;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/style&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/head&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;body&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;h1 class="root"&gt;Hello world&lt;/h1&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;button onclick="handleClick()"&gt;Click me&lt;/button&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;script&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">function handleClick() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    prompt("hello world");</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/script&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/body&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/html&gt;</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="https://user-images.githubusercontent.com/65282610/246674033-33ae54fc-8282-424f-abc5-986372fa8d56.png" alt="Screenshot from 2023-06-18 20-50-44" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://rohankumarthakur.co.in/blog/overview#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>In the vast landscape of web development, we've uncovered the core mechanics of crafting captivating websites and applications. Armed with HTML, CSS, and JavaScript, we've navigated the blend of structure, style, and interactivity that defines modern web experiences.</p>
<p>As you embark on your web development journey, remember that every line of code is a step toward mastery. Embrace the evolving nature of the field, stay curious, and let your passion drive your progress. The world of web development holds endless opportunities for innovation and growth.</p>
<p>May your coding be crisp, your designs engaging, and your journey fulfilling. Happy coding.</p>]]></content:encoded>
            <category>web development</category>
            <category>html</category>
            <category>Javascript</category>
            <category>css</category>
            <category>web</category>
        </item>
        <item>
            <title><![CDATA[HTML Server Sent Events]]></title>
            <link>https://rohankumarthakur.co.in/blog/html-sse</link>
            <guid>https://rohankumarthakur.co.in/blog/html-sse</guid>
            <pubDate>Sun, 13 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Why HTML SSE ?]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-html-sse-">Why HTML SSE ?<a href="https://rohankumarthakur.co.in/blog/html-sse#why-html-sse-" class="hash-link" aria-label="Direct link to Why HTML SSE ?" title="Direct link to Why HTML SSE ?">​</a></h3>
<p>It always make me curious that how codeforces provide real time notifications to users during contests. Does it use any tool like firebase to set pub/sub ? Does it use long polling ? Sending repeat requests to server to fetch notifications does not sound like a bright idea. Though I am still not very clear about how codeforces handles all those timely prompts but I have came across a way which might serve the purpose and that is HTML Server Sent Events.</p>
<p><img decoding="async" loading="lazy" src="https://rohankumarthakur.co.in/assets/images/volodymyr-hryshchenko-V5vqWC9gyEU-unsplash-3ff1831cb3f10e8585d2bcc588ffb347.jpg" width="5472" height="3648" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-html-sse-">What is HTML SSE ?<a href="https://rohankumarthakur.co.in/blog/html-sse#what-is-html-sse-" class="hash-link" aria-label="Direct link to What is HTML SSE ?" title="Direct link to What is HTML SSE ?">​</a></h3>
<p>As mentioned by w3schools "Server-Sent Events (SSE) allow a web page to get updates from a server". Allright! we do not need to send repeated request to the server for fetching update. We can use Server-Sent Events through which our server will send update to the website. Before we dig further, let's have a look on the list of browsers which supports Server-Sent Events.</p>
<p><img decoding="async" loading="lazy" src="https://rohankumarthakur.co.in/assets/images/can-i-use-html-sse-dddfd73a9452e7fdc801d5b89f4b9ce8.png" width="1366" height="768" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="implementation">Implementation<a href="https://rohankumarthakur.co.in/blog/html-sse#implementation" class="hash-link" aria-label="Direct link to Implementation" title="Direct link to Implementation">​</a></h3>
<p>Let's move to the fun part and learn how to implement SSE. First we will create a nodeJs application and create a route as follows:</p>
<p><img decoding="async" loading="lazy" alt="index.js" src="https://rohankumarthakur.co.in/assets/images/route-516eda1a310d5558486e3b4ea205e270.png" width="1294" height="1042" class="img_ev3q"></p>
<p>As we can see we only need to set "Content-Type" header as "text/event-stream" and send our data. In our case we will be sending a timestamp. Now lets create a simple html page which will receive updates from our server.</p>
<p><img decoding="async" loading="lazy" alt="index.html" src="https://rohankumarthakur.co.in/assets/images/sse-1-a355e543609d33542d896a48c61438ea.png" width="1294" height="1564" class="img_ev3q"></p>
<p>In the above code, we have created an EventSource which is connected to "<a href="http://localhost:3000/sse" target="_blank" rel="noopener noreferrer">http://localhost:3000/sse</a>" route. We have used onmessage event to get messages. Some other events are as follows:</p>
<ol>
<li>onopen: When a connection to the server is opened</li>
<li>onmessage: When a message is received</li>
<li>onerror: When an error occurs</li>
</ol>
<p>Let's start our server with below command.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">node index.js</span><br></span></code></pre></div></div>
<p>Now, we will checkout our web page.</p>
<p><img decoding="async" loading="lazy" alt="page.html" src="https://rohankumarthakur.co.in/assets/images/sse-final-38d40d95fc35a263bcd154d020d739cc.gif" width="1200" height="675" class="img_ev3q"></p>
<p>Awesome! We are automatically receiving those timestamps from our server. Hope you find this article helpful. You can find the source code on <a href="https://github.com/Xebec19/html-sse" target="_blank" rel="noopener noreferrer">github</a>. Happy coding!</p>]]></content:encoded>
            <category>web development</category>
            <category>html</category>
            <category>Javascript</category>
            <category>nodejs</category>
        </item>
    </channel>
</rss>